diff options
author | Judah Schvimer <judah@mongodb.com> | 2017-04-21 10:27:59 -0400 |
---|---|---|
committer | Benety Goh <benety@mongodb.com> | 2017-04-28 19:52:01 -0400 |
commit | 7358c66cbf77203fa0803417a4442e35f11bf3f7 (patch) | |
tree | 947ec510b25c7643e3eb8c9e948fdaa75c163888 /src/mongo/db/repl/replication_coordinator_impl.cpp | |
parent | 60636b4d3ae60a24c080c7250459814eef5e7c87 (diff) | |
download | mongo-7358c66cbf77203fa0803417a4442e35f11bf3f7.tar.gz |
SERVER-27659 Persist Rollback Id
Diffstat (limited to 'src/mongo/db/repl/replication_coordinator_impl.cpp')
-rw-r--r-- | src/mongo/db/repl/replication_coordinator_impl.cpp | 44 |
1 files changed, 22 insertions, 22 deletions
diff --git a/src/mongo/db/repl/replication_coordinator_impl.cpp b/src/mongo/db/repl/replication_coordinator_impl.cpp index 72c45415344..e538718650c 100644 --- a/src/mongo/db/repl/replication_coordinator_impl.cpp +++ b/src/mongo/db/repl/replication_coordinator_impl.cpp @@ -329,13 +329,6 @@ ReplicationCoordinatorImpl::ReplicationCoordinatorImpl( return; } - std::unique_ptr<SecureRandom> rbidGenerator(SecureRandom::create()); - _rbid = static_cast<int>(rbidGenerator->nextInt64()); - if (_rbid < 0) { - // Ensure _rbid is always positive - _rbid = -_rbid; - } - // Make sure there is always an entry in _slaveInfo for ourself. SlaveInfo selfInfo; selfInfo.self = true; @@ -430,6 +423,19 @@ bool ReplicationCoordinatorImpl::_startLoadLocalConfig(OperationContext* opCtx) _topCoord->loadLastVote(lastVote.getValue()); } + // Check that we have a local Rollback ID. If we do not have one, create one. + auto rbid = _storage->getRollbackID(opCtx); + if (!rbid.isOK()) { + if (rbid.getStatus() == ErrorCodes::NamespaceNotFound) { + log() << "Did not find local Rollback ID document at startup. Creating one."; + auto initializingStatus = _storage->initializeRollbackID(opCtx); + fassertStatusOK(40424, initializingStatus); + } else { + severe() << "Error loading local Rollback ID document at startup; " << rbid.getStatus(); + fassertFailedNoTrace(40428); + } + } + StatusWith<BSONObj> cfg = _externalState->loadLocalConfigDocument(opCtx); if (!cfg.isOK()) { log() << "Did not find local replica set configuration document at startup; " @@ -2867,17 +2873,6 @@ void ReplicationCoordinatorImpl::_enterDrainMode_inlock() { _externalState->stopProducer(); } -Status ReplicationCoordinatorImpl::processReplSetGetRBID(BSONObjBuilder* resultObj) { - stdx::lock_guard<stdx::mutex> lk(_mutex); - resultObj->append("rbid", _rbid); - return Status::OK(); -} - -void ReplicationCoordinatorImpl::incrementRollbackID() { - stdx::lock_guard<stdx::mutex> lk(_mutex); - ++_rbid; -} - Status ReplicationCoordinatorImpl::processReplSetFresh(const ReplSetFreshArgs& args, BSONObjBuilder* resultObj) { stdx::lock_guard<stdx::mutex> lk(_mutex); @@ -3329,7 +3324,8 @@ Status ReplicationCoordinatorImpl::processReplSetRequestVotes( return Status::OK(); } -void ReplicationCoordinatorImpl::prepareReplMetadata(const BSONObj& metadataRequestObj, +void ReplicationCoordinatorImpl::prepareReplMetadata(OperationContext* opCtx, + const BSONObj& metadataRequestObj, const OpTime& lastOpTimeFromClient, BSONObjBuilder* builder) const { @@ -3340,6 +3336,9 @@ void ReplicationCoordinatorImpl::prepareReplMetadata(const BSONObj& metadataRequ return; } + auto rbid = _storage->getRollbackID(opCtx); + fassertStatusOK(40427, rbid.getStatus()); + stdx::lock_guard<stdx::mutex> lk(_mutex); if (hasReplSetMetadata) { @@ -3347,7 +3346,7 @@ void ReplicationCoordinatorImpl::prepareReplMetadata(const BSONObj& metadataRequ } if (hasOplogQueryMetadata) { - _prepareOplogQueryMetadata_inlock(builder); + _prepareOplogQueryMetadata_inlock(rbid.getValue(), builder); } } @@ -3359,10 +3358,11 @@ void ReplicationCoordinatorImpl::_prepareReplSetMetadata_inlock(const OpTime& la metadata.writeToMetadata(builder); } -void ReplicationCoordinatorImpl::_prepareOplogQueryMetadata_inlock(BSONObjBuilder* builder) const { +void ReplicationCoordinatorImpl::_prepareOplogQueryMetadata_inlock(int rbid, + BSONObjBuilder* builder) const { OpTime lastAppliedOpTime = _getMyLastAppliedOpTime_inlock(); auto metadata = - _topCoord->prepareOplogQueryMetadata(_lastCommittedOpTime, lastAppliedOpTime, _rbid); + _topCoord->prepareOplogQueryMetadata(_lastCommittedOpTime, lastAppliedOpTime, rbid); metadata.writeToMetadata(builder); } |