diff options
-rw-r--r-- | src/mongo/db/vector_clock_mongod.cpp | 24 |
1 files changed, 24 insertions, 0 deletions
diff --git a/src/mongo/db/vector_clock_mongod.cpp b/src/mongo/db/vector_clock_mongod.cpp index 5afbb1946d9..f5d7513a543 100644 --- a/src/mongo/db/vector_clock_mongod.cpp +++ b/src/mongo/db/vector_clock_mongod.cpp @@ -184,6 +184,30 @@ VectorClockMongoD::~VectorClockMongoD() = default; void VectorClockMongoD::onStepUpBegin(OperationContext* opCtx, long long term) { stdx::lock_guard lg(_mutex); _durableTime.reset(); + + // Initialize the config server's topology time to the maximum topology time from + // `config.shards` collection instead of using `Timestamp(0 ,0)`. + if (serverGlobalParams.clusterRole == ClusterRole::ConfigServer) { + const auto maxTopologyTime{[&opCtx]() -> boost::optional<Timestamp> { + DBDirectClient client{opCtx}; + FindCommandRequest findRequest{ShardType::ConfigNS}; + findRequest.setSort(BSON(ShardType::topologyTime << -1)); + findRequest.setLimit(1); + auto cursor{client.find(std::move(findRequest))}; + invariant(cursor); + if (!cursor->more()) { + // No shards are available yet. + return boost::none; + } + + const auto shardEntry{uassertStatusOK(ShardType::fromBSON(cursor->nextSafe()))}; + return shardEntry.getTopologyTime(); + }()}; + + if (maxTopologyTime) { + _advanceComponentTimeTo(Component::TopologyTime, LogicalTime(*maxTopologyTime)); + } + } } void VectorClockMongoD::onStepDown() { |