我们使用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(我们首次测试的那个)和我们不再得到这个例外。关于可能导致此异常的更改的任何想法?
答案 0 :(得分:0)
为什么你不能使用带帽数组的常规“更新” 限制查询数组的大小,而不是使用一些自定义 逻辑)。
如果你有多个线程做同样的事情,你的代码 看起来不是线程安全的 - 让我们说两个线程试图更新 与_id XYZ相同的对象但具有不同的更改。两者都取 对象,都向数组添加新的属性/值,现在两者都添加 呼叫保存 - 第一个保存,但第二个保存覆盖 第一个。
但与
RUNNER_DEAD
的错误不太相关 错误 - 这种情况更可能发生在任何事情中 操作或删除你写的集合(或者 正在使用的索引)。