ReplicationCoordinator::StatusAndDuration ReplicationCoordinatorMock::awaitReplication( const OperationContext* txn, const OpTime& ts, const WriteConcernOptions& writeConcern) { // TODO return StatusAndDuration(Status::OK(), Milliseconds(0)); }
ReplicationCoordinator::StatusAndDuration ReplicationCoordinatorImpl::awaitReplication( const OperationContext* txn, const OpTime& opId, const WriteConcernOptions& writeConcern) { // TODO(spencer): handle killop if (writeConcern.wNumNodes <= 1 && writeConcern.wMode.empty()) { // no desired replication check return StatusAndDuration(Status::OK(), Milliseconds(0)); } Timer timer; boost::unique_lock<boost::mutex> lk(_mutex); const Mode replMode = _getReplicationMode_inlock(); if (replMode == modeNone || serverGlobalParams.configsvr) { // no replication check needed (validated above) return StatusAndDuration(Status::OK(), Milliseconds(0)); } if (writeConcern.wMode == "majority" && replMode == modeMasterSlave) { // with master/slave, majority is equivalent to w=1 return StatusAndDuration(Status::OK(), Milliseconds(0)); } boost::condition_variable condVar; // Must hold _mutex before constructing waitInfo as it will modify _replicationWaiterList WaiterInfo waitInfo(&_replicationWaiterList, &opId, &writeConcern, &condVar); while (!_opReplicatedEnough_inlock(opId, writeConcern)) { const int elapsed = timer.millis(); if (writeConcern.wTimeout != WriteConcernOptions::kNoTimeout && elapsed > writeConcern.wTimeout) { return StatusAndDuration(Status(ErrorCodes::ExceededTimeLimit, "waiting for replication timed out"), Milliseconds(elapsed)); } if (_inShutdown) { return StatusAndDuration(Status(ErrorCodes::ShutdownInProgress, "Replication is being shut down"), Milliseconds(elapsed)); } try { if (writeConcern.wTimeout == WriteConcernOptions::kNoTimeout) { condVar.wait(lk); } else { condVar.timed_wait(lk, Milliseconds(writeConcern.wTimeout - elapsed)); } } catch (const boost::thread_interrupted&) {} } return StatusAndDuration(Status::OK(), Milliseconds(timer.millis())); }
ReplicationCoordinator::StatusAndDuration ReplicationCoordinatorMock::awaitReplicationOfLastOpApplied( const OperationContext* txn, const WriteConcernOptions& writeConcern) { return StatusAndDuration(Status::OK(), Milliseconds(0)); }