MongoDB3.2 readConcernの挙動について
実装
mongosの場合はもうちょっと複雑になるが、レプリカセットの場合はこの辺に実装があるようだ
=== /db/repl/replication_coordinator_impl.cpp ===
auto loopCondition = [this, isMajorityReadConcern, targetOpTime] {
return isMajorityReadConcern
? !_currentCommittedSnapshot || targetOpTime > _currentCommittedSnapshot->opTime
: targetOpTime > _getMyLastOptime_inlock();
};
while (loopCondition()) {
Status interruptedStatus = txn->checkForInterruptNoAssert();
if (!interruptedStatus.isOK()) {
return ReadConcernResponse(interruptedStatus, Milliseconds(timer.millis()));
}
if (_inShutdown) {
return ReadConcernResponse(Status(ErrorCodes::ShutdownInProgress, "shutting down"),
Milliseconds(timer.millis()));
}
stdx::condition_variable condVar;
WriteConcernOptions writeConcern;
writeConcern.wMode = WriteConcernOptions::kMajority;
WaiterInfo waitInfo(isMajorityReadConcern ? &_replicationWaiterList : &_opTimeWaiterList,
txn->getOpID(),
&targetOpTime,
isMajorityReadConcern ? &writeConcern : nullptr,
&condVar);
if (CurOp::get(txn)->isMaxTimeSet()) {
condVar.wait_for(lock, Microseconds(txn->getRemainingMaxTimeMicros()));
} else {
condVar.wait(lock);
}
}どうもmajorityになるまで単純にwhile ループで待ってるようだが
こんな乱暴な事をすると、簡単にDOSになりそうだが、どうなんだろう?
仮に 1秒位遅延が起きた時に、5000 queryも readConcern: majority でクエリーすると何が起きるか?
余裕でリクエストを処理するスレッドを潰されてしまいそうな気がする。
だれか一緒に検証してくれる人いませんかね??