小编And*_*Dog的帖子

三阶段提交协议(3PC)如何保证原子性?

我目前正在探索像2PC和3PC这样的原子提交协议的最坏情况,并且我无法找到3PC可以保证原子性的原因.也就是说,它如何保证如果群组A提交,群组B也会提交?

这是维基百科文章中简化的3PC:

英语维基百科上描述的3PC提交协议

现在让我们假设以下情况:

  1. 两个队列参与交易(A和B)
  2. 两人都做他们的工作,然后投票支持
  3. 协调员现在发送预先提交的消息......
    • A接收预先提交消息,确认,然后长时间离线
    • B没有收到预先提交的消息(无论原因是什么),因此仍处于"不确定"状态

结果:

  • 协调器中止事务,因为并非所有预先提交的消息都已成功发送和确认
  • 处于预先通知状态的A仍然处于脱机状态,因此超时并提交
  • B在任何情况下都会中止:他要么保持离线状态,要么超时(导致中止)或者上线并从协调员那里接收中止命令

而且你有它:一个队列承诺,另一个队列流产.交易搞砸了.

那我在这里错过了什么?根据我的理解,如果超时(在预先提交状态下)的自动提交被无限等待协调器命令所取代,那么该情况应该可以正常工作.

transactions commit

7
推荐指数
1
解决办法
2289
查看次数

由于排序,GtkTreeView插入/更新性能损失

将很多行插入到GTK树视图中时(使用PyGTK)或修改多行时,我遇到了性能问题.问题是模型似乎在每次更改(插入/修改)后都会使用.这会导致GUI挂起多秒钟.通过注释将模型保留为未排序可model.set_sort_column_id(SOME_ROW_INDEX, gtk.SORT_ASCENDING)消除这些问题.

因此,我想在插入或修改模型时禁用排序,然后重新启用它.不幸的是,无法禁用排序model.set_sort_column_id(-1, gtk.SORT_ASCENDING).使用冻结/解冻功能也不起作用:

treeview.freeze_child_notify()

try:
    for row in model:
        # ... change something in row ...
finally:
    treeview.thaw_child_notify()
Run Code Online (Sandbox Code Playgroud)

那么,我怎样才能禁用排序?或者有更好的批量插入/修改方法吗?


感谢他在答案中提供的信息和链接,我检查了一些替代方案:

1)虚拟分拣

 tv.freeze_child_notify()
 sortSettings = model.get_sort_column_id()
 model.set_default_sort_func(lambda *unused: 0) # <-- can also use None but that is slower!
 # model.set_default_sort_func(lambda *unused: 1) <-- slow
 # model.set_default_sort_func(lambda *unused: -1) <-- crash (access violation in gtk_tree_store_move_after?!)
 model.set_sort_column_id(-1, gtk.SORT_ASCENDING)
 # change rows
 model.set_sort_column_id(*sortSettings)
 tv.thaw_child_notify()
Run Code Online (Sandbox Code Playgroud)

这使得时间从大约11秒减少到2秒.哇!但可能会更好,这只是1000行.

2)更新时删除模型

tv.set_model(None)
# change rows
tv.set_model(model)
Run Code Online (Sandbox Code Playgroud)

没有明显的区别,11秒.

3)Dummy排序和PyGTK常见问题解答中的酷发生器技巧

 def gen(): …
Run Code Online (Sandbox Code Playgroud)

gtk pygtk bulkinsert gtktreeview

6
推荐指数
1
解决办法
2432
查看次数

具有/不具有捕获变量的lambda之间的签名差异?

我现在正在使用C++ 11,并发现使用lambda作为sqlite回调的以下问题.在lambda中捕获向量变量时,我收到一条错误,指出签名不匹配.不在lambda中使用该变量([]而不是在内部[&ret]使用ret),它可以正常工作.

vector<SomeClass> ret;
char *err = nullptr;
int res = sqlite3_exec(db,
                       "some sql query, doesn't matter",
                       [&ret](void *unused, int argc, char **argv, char **columnName) -> int
                       {
                           ret.push_back(SomeClass());
                           return 0;
                       },
                       nullptr,
                       &err);
Run Code Online (Sandbox Code Playgroud)

这是我得到的错误:

cannot convert 'TestClass::testMethod()::<lambda(void*, int, char**, char**)>' to 'int (*)(void*, int, char**, char**)' for argument '3' to 'int sqlite3_exec(sqlite3*, const char*, int (*)(void*, int, char**, char**), void*, char**)'
Run Code Online (Sandbox Code Playgroud)

GCC版本是Windows上的"gcc(XvidVideo.RU - GCC 4.6.1 i686-pc-mingw32)4.6.1 20110625(预发行版)".

为什么这会有所不同?

lambda c++11

6
推荐指数
1
解决办法
1281
查看次数

WCF证书链信任身份验证:"调用方未经过服务验证."

我想在与WCF服务通信时使用基于证书的加密和验证.因此,我创建了测试证书,"TempCA"作为我的根CA,"SignedByCA"作为由CA签署的客户端证书.

当我将客户端证书放入"本地计算机\受信任的人"并使用时certificateValidationMode="PeerTrust",该服务识别客户端,一切都按预期工作.但是使用信任链验证(certificateValidationMode="ChainTrust"),我遇到了错误"调用者未被服务验证".

相关的服务器端配置:

<behaviors>
      <serviceBehaviors>
        <behavior name="customServiceBehavior">
            [...]
            <serviceCredentials>
                <clientCertificate>
                    <authentication certificateValidationMode="ChainTrust" trustedStoreLocation="LocalMachine" mapClientCertificateToWindowsAccount="false"  />
                </clientCertificate>
                <serviceCertificate findValue="TempCA"
                                    storeLocation="LocalMachine"
                                    storeName="My"
                                    x509FindType="FindBySubjectName" />
            </serviceCredentials>
        </behavior>
      </serviceBehaviors>
    </behaviors>
    <bindings>
        <wsHttpBinding>
            <binding name="soapBindingConfiguration">
                <security mode="Message">
                    <message clientCredentialType="Certificate" />
                </security>
            </binding>
        </wsHttpBinding>
    </bindings>
Run Code Online (Sandbox Code Playgroud)

相关客户端配置(其余由"添加服务引用"自动创建):

<endpointBehaviors>
    <behavior name="customClientBehavior">
        <clientCredentials>
            <clientCertificate findValue="SignedByCA" storeLocation="LocalMachine" storeName="My" x509FindType="FindBySubjectName" />
        </clientCredentials>
    </behavior>
</endpointBehaviors>
Run Code Online (Sandbox Code Playgroud)

客户端和服务器证书都与其私钥一起存储在"本地计算机\个人"中(因为我在台计算机上进行测试),"TempCA"(我的根证书)也在"本地计算机\受信任的根证书颁发机构"中".

我在这里错过了什么?任何工作的例子?

wcf ws-security certificate wcf-security

6
推荐指数
1
解决办法
6860
查看次数

如何记录在db上运行的每个查询的查询及其执行时间?

我有一个包含250多个表的庞大数据库.在数据库上运行不同类型的查询.由于数据库已经发展多年,现在我需要优化数据库和查询.我已经遵循了索引等优化概念.

我的问题是,如何记录查询及其在数据库上运行的每个查询的执行时间?所以我可以分析哪个查询需要多少秒并优化它们.

鉴于我知道MYSQL Trigger是理想的,但我不知道如何为整个数据库编写触发器,因此它将每个查询记录到具有查询执行时间的表中.我希望触发器记录数据库中发生的所有CRUD操作.

我怎么能完成它?

mysql sql logging triggers crud

6
推荐指数
2
解决办法
1万
查看次数

多行文字没有被椭圆化

我试图在矩形内的多行上绘制椭圆化文本.

因为NSLineBreakByTruncatingTail,文件说明

显示该行,以便开头适合容器,行末尾的缺失文本由省略号字符表示.虽然此模式适用于多行文本,但它更常用于单行文本.

但是使用那种模式我只得到一行:

使用NSLineBreakByTruncatingTail

但是NSLineBreakByWordWrapping,我没有获得超长文本的省略号:

使用NSLineBreakByWordWrapping

两张图片使用相同的代码(红色背景是文本绘制矩形),当然是相同的矩形大小,所以2行应该绝对适合.

NSMutableParagraphStyle* paragraphStyle = [[NSParagraphStyle defaultParagraphStyle] mutableCopy];
paragraphStyle.lineBreakMode = <<see above>>;
paragraphStyle.alignment = NSTextAlignmentNatural;
NSDictionary* drawingAttributes = [NSDictionary dictionaryWithObjectsAndKeys:
                                   [UIFont fontWithName:@"HelveticaNeue" size:36],
                                   NSFontAttributeName,
                                   paragraphStyle,
                                   NSParagraphStyleAttributeName,
                                   nil];

const CGRect rect = CGRectMake(...);
[@"I do not get ellipsized in any way" drawInRect:rect withAttributes:drawingAttributes];
Run Code Online (Sandbox Code Playgroud)

有没有办法将椭圆化和多线渲染结合起来,正如文档所说的那样?使用UILabel,我只需要将行数设置为1以外的值,但是通过代码进行文本渲染呢?

multiline text-rendering nsattributedstring ios

6
推荐指数
1
解决办法
987
查看次数

防止fork()复制套接字

我有以下情况(伪代码):

function f:
    pid = fork()
    if pid == 0:
        exec to another long-running executable (no communication needed to that process)
    else:
        return "something"
Run Code Online (Sandbox Code Playgroud)

f暴露在XmlRpc ++服务器上.当通过XML-RPC调用该函数时,父进程在函数返回"something"后打印"done closing socket".但只要子进程仍在运行,XML-RPC客户端就会挂起.当我终止子进程时,XML-RPC客户端正确完成RPC调用.

在我看来,我遇到了fork()将套接字描述符复制到子进程的问题(父进程被调用,closesocket但是孩子仍然拥有引用 - >连接仍然建立).我怎么能绕过这个呢?

编辑:FD_CLOEXEC已经读过了,但是我不能强制关闭所有描述符exec吗?

sockets linux fork

5
推荐指数
1
解决办法
3824
查看次数

使用Git commit中的电子邮件地址发送Jenkins通知

我已经使用Git插件设置了Jenkins作业,现在想使用email-ext插件将失败通知发送到破解提交中指定的电子邮件地址.但后来我总是得到

"An attempt to send an e-mail to empty list of recipients, ignored"

所以似乎没有提取电子邮件地址.如果可能的话,我不想为每个人创建单独的用户帐户,即使我这样做,如何将它们与Git提交相关联?(选项"基于作者/提交者的电子邮件创建新帐户"选项可能会扫描所有以前的提交,这些提交可能会创建错误的用户,因为有些人没有正确设置电子邮件地址 - 因此我只希望它用于新提交)

有没有人有电子邮件插件的工作设置?

git email notifications jenkins

5
推荐指数
1
解决办法
6710
查看次数

xcconfig:用于调试/发布的不同预处理器宏

我创建并应用了一个简单的 .xcconfig 文件,其中包含

GCC_PREPROCESSOR_DEFINITIONS[config=Debug] = FOODEBUG
GCC_PREPROCESSOR_DEFINITIONS[config=Release] = FOORELEASE
Run Code Online (Sandbox Code Playgroud)

和 main.cpp 包含

#include <iostream>

// This warning IS shown
#if DEBUG
#warning DEBUG is set to 1
#endif

// This warning IS NOT shown
#ifdef FOODEBUG
#warning FOODEBUG is set
#endif

// This warning IS NOT shown
#ifdef FOORELEASE
#warning FOORELEASE is set
#endif

int main(int argc, const char * argv[])
{
    // insert code here...
    std::cout << "Hello, World!\n";
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

现在我想知道为什么在 main.cpp 中,既没有定义 FOODEBUG 也没有定义 FOORELEASE ??! …

xcode preprocessor xcconfig

5
推荐指数
1
解决办法
5381
查看次数

如何在 Visual Studio Code 中使用多根工作区的调试启动配置?

多根工作空间进行调试似乎不起作用 - 这些是一个新功能,也许这是一个错误,但没有实际的示例,只有网站上的伪代码。

Attribute 'program' is not absolute ('${workspaceFolder}/node_modules/mocha/bin/_mocha'); consider adding '${workspaceFolder}/' as a prefix to make it absolute.
Run Code Online (Sandbox Code Playgroud)

尽管显然它已经有了绝对路径。

这是我正在使用的确切启动配置:

VS CODE PROJECTS.code-workspace文件中:

{
    "folders": [
        {
            "path": "workspace-one"
        },
        {
            "path": "workspace-two"
        },
    ],
    "settings": {},
    "launch": {
        "configurations": [
            {
                "type": "node",
                "request": "launch",
                "name": "WS Mocha 1 File",
                "program": "${workspaceFolder}/node_modules/mocha/bin/_mocha",
                "args": [
                    "--timeout",
                    "999999",
                    "--colors",
                    "${relativeFile}"
                ],
                "stopOnEntry": false,
                "cwd": "${workspaceFolder}",
                "skipFiles": [
                    "${workspaceFolder}/node_modules/**/*.js",
                ]
            }
        ]
    }
}
Run Code Online (Sandbox Code Playgroud)

基本上,我想在特定工作区中打开特定测试进行调试,而不必在每个根工作区中复制启动配置(我有很多根工作区)。.vscode\launch此启动配置在子工作区的文件中运行良好。

debugging visual-studio-code

5
推荐指数
1
解决办法
3005
查看次数