summaryrefslogtreecommitdiff
path: root/src/mongo/db/repl/replication_coordinator_impl.cpp
diff options
context:
space:
mode:
authorJudah Schvimer <judah@mongodb.com>2017-04-21 10:27:59 -0400
committerBenety Goh <benety@mongodb.com>2017-04-28 19:52:01 -0400
commit7358c66cbf77203fa0803417a4442e35f11bf3f7 (patch)
tree947ec510b25c7643e3eb8c9e948fdaa75c163888 /src/mongo/db/repl/replication_coordinator_impl.cpp
parent60636b4d3ae60a24c080c7250459814eef5e7c87 (diff)
downloadmongo-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.cpp44
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);
}