用户断言:1:更新查询失败 - RUNNER_DEAD

时间:2014-10-23 20:40:32

标签: mongodb mongodb-query mongodb-.net-driver

我们使用MongoDB(v2.6.4)来处理一些数据,一切都很好,除了偶尔,我们得到一个奇怪的RUNNER_DEAD异常......

MongoDB.Driver.WriteConcernException: WriteConcern detected an error ' Update query failed -- RUNNER_DEAD'. (Response was { "lastOp" : { "$timestamp" : NumberLong("6073471510486450182") }, "connectionId" : 49, "err" : " Update query failed -- RUNNER_DEAD", "code" : 1, "n" : 0, "ok" : 1.0 }).

这是导致异常的方法:

private void UpdateEntityClassName(EntityClassName myEntity) {
    var dateTimeNow = DateTime.UtcNow;

    var update = Update<EntityClassName>.Set(p => p.Data, myEntity.Data)
                 ...some more Sets...
                 .Set(p => p.MetaData.LastModifiedDateTime, dateTimeNow);

    var result = _myCollection.Update(Query.EQ("_id", myEntity.Identifier), update, UpdateFlags.Upsert);
}

MongoDB日志中的异常:

2014-10-23T13:51:29.989-0500 [conn45] update Database.Table query: { _id: "SameID" } update: { $set: { Data: BinData(0, SomeData...), ...more fields... MetaData.LastModifiedDateTime: new Date(1414090294910) } } nmoved:1 nMatched:1 nModified:1 keyUpdates:0 numYields:0 locks(micros) w:2344 2ms
2014-10-23T13:51:29.989-0500 [conn49] User Assertion: 1: Update query failed -- RUNNER_DEAD
2014-10-23T13:51:29.989-0500 [conn46] update Database.Table query: { _id: "SameID" } update: { $set: { Data: BinData(0, SomeData...), ...more fields... MetaData.LastModifiedDateTime: new Date(1414090294926) } } nMatched:1 nModified:1 fastmod:1 keyUpdates:0 numYields:0 locks(micros) w:249 0ms
2014-10-23T13:51:29.989-0500 [conn49] update Database.Table query: { _id: "SameID" } update: { $set: { Data: BinData(0, SomeData...), ...more fields... MetaData.LastModifiedDateTime: new Date(1414090294864) } } nModified:0 keyUpdates:0 exception:  Update query failed -- RUNNER_DEAD code:1 numYields:1 locks(micros) w:285 8ms

我发现很少有关于此异常的文档,所以任何帮助都会受到赞赏。


我们在3机器副本集中运行它,如果它改变了什么。

我们已经运行了这段代码一段时间了,之前我们没有遇到过这个问题(在我们的原始测试中)所以我们回到了MongoDB 2.4.9(我们首次测试的那个)和我们不再得到这个例外。关于可能导致此异常的更改的任何想法?

1 个答案:

答案 0 :(得分:0)

  

为什么你不能使用带帽数组的常规“更新”   限制查询数组的大小,而不是使用一些自定义   逻辑)。

     

如果你有多个线程做同样的事情,你的代码   看起来不是线程安全的 - 让我们说两个线程试图更新   与_id XYZ相同的对象但具有不同的更改。两者都取   对象,都向数组添加新的属性/值,现在两者都添加   呼叫保存 - 第一个保存,但第二个保存覆盖   第一个。

     

但与RUNNER_DEAD的错误不太相关   错误 - 这种情况更可能发生在任何事情中   操作或删除你写的集合(或者   正在使用的索引)。

来源:@Asya Kamsky's post