diff options
Diffstat (limited to 'src/mongo/db/repl')
53 files changed, 893 insertions, 805 deletions
diff --git a/src/mongo/db/repl/SConscript b/src/mongo/db/repl/SConscript index e8d797785de..725740ec022 100644 --- a/src/mongo/db/repl/SConscript +++ b/src/mongo/db/repl/SConscript @@ -90,7 +90,7 @@ env.Library('repl_coordinator_impl', '$BUILD_DIR/mongo/db/common', '$BUILD_DIR/mongo/db/index/index_descriptor', '$BUILD_DIR/mongo/fail_point', - '$BUILD_DIR/mongo/global_optime', + '$BUILD_DIR/mongo/global_timestamp', '$BUILD_DIR/mongo/server_options_core', '$BUILD_DIR/mongo/service_context', '$BUILD_DIR/mongo/util/net/command_status', diff --git a/src/mongo/db/repl/bgsync.cpp b/src/mongo/db/repl/bgsync.cpp index ad2833df368..7cdd1d42a2a 100644 --- a/src/mongo/db/repl/bgsync.cpp +++ b/src/mongo/db/repl/bgsync.cpp @@ -228,7 +228,7 @@ namespace { // find a target to sync from the last optime fetched - OpTime lastOpTimeFetched; + Timestamp lastOpTimeFetched; { boost::unique_lock<boost::mutex> lock(_mutex); lastOpTimeFetched = _lastOpTimeFetched; @@ -354,7 +354,7 @@ namespace { { boost::unique_lock<boost::mutex> lock(_mutex); _lastFetchedHash = o["h"].numberLong(); - _lastOpTimeFetched = o["ts"]._opTime(); + _lastOpTimeFetched = o["ts"].timestamp(); LOG(3) << "lastOpTimeFetched: " << _lastOpTimeFetched.toStringPretty(); } } @@ -402,7 +402,7 @@ namespace { sleepsecs(2); return true; } - OpTime theirTS = theirLastOp["ts"]._opTime(); + Timestamp theirTS = theirLastOp["ts"].timestamp(); if (theirTS < _lastOpTimeFetched) { log() << "we are ahead of the sync source, will try to roll back"; syncRollback(txn, _replCoord->getMyLastOptime(), &r, _replCoord); @@ -420,7 +420,7 @@ namespace { } BSONObj o = r.nextSafe(); - OpTime ts = o["ts"]._opTime(); + Timestamp ts = o["ts"].timestamp(); long long hash = o["h"].numberLong(); if( ts != _lastOpTimeFetched || hash != _lastFetchedHash ) { log() << "our last op time fetched: " << _lastOpTimeFetched.toStringPretty(); @@ -447,7 +447,7 @@ namespace { _pause = true; _syncSourceHost = HostAndPort(); - _lastOpTimeFetched = OpTime(0,0); + _lastOpTimeFetched = Timestamp(0,0); _lastFetchedHash = 0; _appliedBufferCondition.notify_all(); _pausedCondition.notify_all(); diff --git a/src/mongo/db/repl/bgsync.h b/src/mongo/db/repl/bgsync.h index 8a36e572abe..7537e0e8606 100644 --- a/src/mongo/db/repl/bgsync.h +++ b/src/mongo/db/repl/bgsync.h @@ -131,7 +131,7 @@ namespace repl { // _mutex protects all of the class variables except _syncSourceReader and _buffer mutable boost::mutex _mutex; - OpTime _lastOpTimeFetched; + Timestamp _lastOpTimeFetched; // lastAppliedHash is used to generate a new hash for the following op, when primary. long long _lastAppliedHash; diff --git a/src/mongo/db/repl/freshness_checker.cpp b/src/mongo/db/repl/freshness_checker.cpp index 3f533e28f6e..ebe3d59b67b 100644 --- a/src/mongo/db/repl/freshness_checker.cpp +++ b/src/mongo/db/repl/freshness_checker.cpp @@ -33,7 +33,7 @@ #include "mongo/db/repl/freshness_checker.h" #include "mongo/base/status.h" -#include "mongo/bson/optime.h" +#include "mongo/bson/timestamp.h" #include "mongo/db/repl/member_heartbeat_data.h" #include "mongo/db/repl/replica_set_config.h" #include "mongo/db/repl/replication_executor.h" @@ -47,7 +47,7 @@ namespace mongo { namespace repl { FreshnessChecker::Algorithm::Algorithm( - OpTime lastOpTimeApplied, + Timestamp lastOpTimeApplied, const ReplicaSetConfig& rsConfig, int selfIndex, const std::vector<HostAndPort>& targets) : @@ -88,7 +88,7 @@ namespace repl { BSONObjBuilder freshCmdBuilder; freshCmdBuilder.append("replSetFresh", 1); freshCmdBuilder.append("set", _rsConfig.getReplSetName()); - freshCmdBuilder.append("opTime", Date_t(_lastOpTimeApplied.asDate())); + freshCmdBuilder.append("opTime", Date_t(_lastOpTimeApplied.asULL())); freshCmdBuilder.append("who", selfConfig.getHostAndPort().toString()); freshCmdBuilder.appendIntOrLL("cfgver", _rsConfig.getConfigVersion()); freshCmdBuilder.append("id", selfConfig.getId()); @@ -169,7 +169,7 @@ namespace repl { _abortReason = FresherNodeFound; return; } - OpTime remoteTime(res["opTime"].date()); + Timestamp remoteTime(res["opTime"].date()); if (remoteTime == _lastOpTimeApplied) { _abortReason = FreshnessTie; } @@ -216,7 +216,7 @@ namespace repl { StatusWith<ReplicationExecutor::EventHandle> FreshnessChecker::start( ReplicationExecutor* executor, - const OpTime& lastOpTimeApplied, + const Timestamp& lastOpTimeApplied, const ReplicaSetConfig& currentConfig, int selfIndex, const std::vector<HostAndPort>& targets, diff --git a/src/mongo/db/repl/freshness_checker.h b/src/mongo/db/repl/freshness_checker.h index 71f82cb86d3..3570ee8b051 100644 --- a/src/mongo/db/repl/freshness_checker.h +++ b/src/mongo/db/repl/freshness_checker.h @@ -32,7 +32,7 @@ #include <vector> #include "mongo/base/disallow_copying.h" -#include "mongo/bson/optime.h" +#include "mongo/bson/timestamp.h" #include "mongo/db/repl/replica_set_config.h" #include "mongo/db/repl/replication_executor.h" #include "mongo/db/repl/scatter_gather_algorithm.h" @@ -59,7 +59,7 @@ namespace repl { class Algorithm : public ScatterGatherAlgorithm { public: - Algorithm(OpTime lastOpTimeApplied, + Algorithm(Timestamp lastOpTimeApplied, const ReplicaSetConfig& rsConfig, int selfIndex, const std::vector<HostAndPort>& targets); @@ -84,8 +84,8 @@ namespace repl { // Number of failed voter responses so far. int _failedVoterResponses; - // Last OpTime applied by the caller; used in the Fresh command - const OpTime _lastOpTimeApplied; + // Last Timestamp applied by the caller; used in the Fresh command + const Timestamp _lastOpTimeApplied; // Config to use for this check const ReplicaSetConfig _rsConfig; @@ -124,7 +124,7 @@ namespace repl { **/ StatusWith<ReplicationExecutor::EventHandle> start( ReplicationExecutor* executor, - const OpTime& lastOpTimeApplied, + const Timestamp& lastOpTimeApplied, const ReplicaSetConfig& currentConfig, int selfIndex, const std::vector<HostAndPort>& targets, diff --git a/src/mongo/db/repl/freshness_checker_test.cpp b/src/mongo/db/repl/freshness_checker_test.cpp index 362b4746606..2a7480e8d56 100644 --- a/src/mongo/db/repl/freshness_checker_test.cpp +++ b/src/mongo/db/repl/freshness_checker_test.cpp @@ -59,7 +59,7 @@ namespace { class FreshnessCheckerTest : public mongo::unittest::Test { protected: - void startTest(const OpTime& lastOpTimeApplied, + void startTest(const Timestamp& lastOpTimeApplied, const ReplicaSetConfig& currentConfig, int selfIndex, const std::vector<HostAndPort>& hosts); @@ -80,7 +80,7 @@ namespace { private: void freshnessCheckerRunner(const ReplicationExecutor::CallbackData& data, - const OpTime& lastOpTimeApplied, + const Timestamp& lastOpTimeApplied, const ReplicaSetConfig& currentConfig, int selfIndex, const std::vector<HostAndPort>& hosts); @@ -120,12 +120,12 @@ namespace { } const BSONObj makeFreshRequest(const ReplicaSetConfig& rsConfig, - OpTime lastOpTimeApplied, + Timestamp lastOpTimeApplied, int selfIndex) { const MemberConfig& myConfig = rsConfig.getMemberAt(selfIndex); return BSON("replSetFresh" << 1 << "set" << rsConfig.getReplSetName() << - "opTime" << Date_t(lastOpTimeApplied.asDate()) << + "opTime" << Date_t(lastOpTimeApplied.asULL()) << "who" << myConfig.getHostAndPort().toString() << "cfgver" << rsConfig.getConfigVersion() << "id" << myConfig.getId()); @@ -135,7 +135,7 @@ namespace { // for correct concurrency operation. void FreshnessCheckerTest::freshnessCheckerRunner( const ReplicationExecutor::CallbackData& data, - const OpTime& lastOpTimeApplied, + const Timestamp& lastOpTimeApplied, const ReplicaSetConfig& currentConfig, int selfIndex, const std::vector<HostAndPort>& hosts) { @@ -149,7 +149,7 @@ namespace { _checkerDoneEvent = assertGet(evh); } - void FreshnessCheckerTest::startTest(const OpTime& lastOpTimeApplied, + void FreshnessCheckerTest::startTest(const Timestamp& lastOpTimeApplied, const ReplicaSetConfig& currentConfig, int selfIndex, const std::vector<HostAndPort>& hosts) { @@ -176,9 +176,9 @@ namespace { std::vector<HostAndPort> hosts; hosts.push_back(config.getMemberAt(1).getHostAndPort()); - const BSONObj freshRequest = makeFreshRequest(config, OpTime(0,0), 0); + const BSONObj freshRequest = makeFreshRequest(config, Timestamp(0,0), 0); - startTest(OpTime(0, 0), config, 0, hosts); + startTest(Timestamp(0, 0), config, 0, hosts); const Date_t startDate = _net->now(); _net->enterNetwork(); for (size_t i = 0; i < hosts.size(); ++i) { @@ -195,7 +195,7 @@ namespace { "set" << "rs0" << "who" << "h1" << "cfgver" << 1 << - "opTime" << Date_t(OpTime(0,0).asDate())), + "opTime" << Date_t(Timestamp(0,0).asULL())), Milliseconds(8)))); } _net->runUntil(startDate + 10); @@ -218,7 +218,7 @@ namespace { hosts.push_back(config.getMemberAt(1).getHostAndPort()); startTest( - OpTime(0, 0), + Timestamp(0, 0), config, 0, hosts); @@ -244,9 +244,9 @@ namespace { std::vector<HostAndPort> hosts; hosts.push_back(config.getMemberAt(1).getHostAndPort()); - const BSONObj freshRequest = makeFreshRequest(config, OpTime(10,0), 0); + const BSONObj freshRequest = makeFreshRequest(config, Timestamp(10,0), 0); - startTest(OpTime(10, 0), config, 0, hosts); + startTest(Timestamp(10, 0), config, 0, hosts); const Date_t startDate = _net->now(); _net->enterNetwork(); for (size_t i = 0; i < hosts.size(); ++i) { @@ -264,7 +264,7 @@ namespace { "who" << "h1" << "cfgver" << 1 << "fresher" << true << - "opTime" << Date_t(OpTime(0,0).asDate())), + "opTime" << Date_t(Timestamp(0,0).asULL())), Milliseconds(8)))); } _net->runUntil(startDate + 10); @@ -290,9 +290,9 @@ namespace { std::vector<HostAndPort> hosts; hosts.push_back(config.getMemberAt(1).getHostAndPort()); - const BSONObj freshRequest = makeFreshRequest(config, OpTime(0,0), 0); + const BSONObj freshRequest = makeFreshRequest(config, Timestamp(0,0), 0); - startTest(OpTime(0, 0), config, 0, hosts); + startTest(Timestamp(0, 0), config, 0, hosts); const Date_t startDate = _net->now(); _net->enterNetwork(); for (size_t i = 0; i < hosts.size(); ++i) { @@ -309,7 +309,7 @@ namespace { "set" << "rs0" << "who" << "h1" << "cfgver" << 1 << - "opTime" << Date_t(OpTime(10,0).asDate())), + "opTime" << Date_t(Timestamp(10,0).asULL())), Milliseconds(8)))); } _net->runUntil(startDate + 10); @@ -334,9 +334,9 @@ namespace { std::vector<HostAndPort> hosts; hosts.push_back(config.getMemberAt(1).getHostAndPort()); - const BSONObj freshRequest = makeFreshRequest(config, OpTime(10,0), 0); + const BSONObj freshRequest = makeFreshRequest(config, Timestamp(10,0), 0); - startTest(OpTime(10, 0), config, 0, hosts); + startTest(Timestamp(10, 0), config, 0, hosts); const Date_t startDate = _net->now(); _net->enterNetwork(); for (size_t i = 0; i < hosts.size(); ++i) { @@ -381,9 +381,9 @@ namespace { std::vector<HostAndPort> hosts; hosts.push_back(config.getMemberAt(1).getHostAndPort()); - const BSONObj freshRequest = makeFreshRequest(config, OpTime(10,0), 0); + const BSONObj freshRequest = makeFreshRequest(config, Timestamp(10,0), 0); - startTest(OpTime(10, 0), config, 0, hosts); + startTest(Timestamp(10, 0), config, 0, hosts); const Date_t startDate = _net->now(); _net->enterNetwork(); for (size_t i = 0; i < hosts.size(); ++i) { @@ -402,7 +402,7 @@ namespace { "cfgver" << 1 << "veto" << true << "errmsg" << "I'd rather you didn't" << - "opTime" << Date_t(OpTime(0,0).asDate())), + "opTime" << Date_t(Timestamp(0,0).asULL())), Milliseconds(8)))); } _net->runUntil(startDate + 10); @@ -443,9 +443,9 @@ namespace { hosts.push_back(mem->getHostAndPort()); } - const BSONObj freshRequest = makeFreshRequest(config, OpTime(10,0), 0); + const BSONObj freshRequest = makeFreshRequest(config, Timestamp(10,0), 0); - startTest(OpTime(10, 0), config, 0, hosts); + startTest(Timestamp(10, 0), config, 0, hosts); const Date_t startDate = _net->now(); unordered_set<HostAndPort> seen; _net->enterNetwork(); @@ -462,7 +462,7 @@ namespace { "set" << "rs0" << "who" << target.toString() << "cfgver" << 1 << - "opTime" << Date_t(OpTime(0,0).asDate()); + "opTime" << Date_t(Timestamp(0,0).asULL()); if (target.host() == "h1") { responseBuilder << "fresher" << true; } @@ -505,9 +505,9 @@ namespace { hosts.push_back(mem->getHostAndPort()); } - const BSONObj freshRequest = makeFreshRequest(config, OpTime(10,0), 0); + const BSONObj freshRequest = makeFreshRequest(config, Timestamp(10,0), 0); - startTest(OpTime(10, 0), config, 0, hosts); + startTest(Timestamp(10, 0), config, 0, hosts); const Date_t startDate = _net->now(); unordered_set<HostAndPort> seen; _net->enterNetwork(); @@ -526,7 +526,7 @@ namespace { "set" << "rs0" << "who" << target.toString() << "cfgver" << 1 << - "opTime" << Date_t(OpTime(20,0).asDate()); + "opTime" << Date_t(Timestamp(20,0).asULL()); _net->scheduleResponse( noi, startDate + 20, @@ -541,7 +541,7 @@ namespace { "set" << "rs0" << "who" << target.toString() << "cfgver" << 1 << - "opTime" << Date_t(OpTime(10,0).asDate()); + "opTime" << Date_t(Timestamp(10,0).asULL()); _net->scheduleResponse( noi, startDate + 10, @@ -581,9 +581,9 @@ namespace { hosts.push_back(mem->getHostAndPort()); } - const BSONObj freshRequest = makeFreshRequest(config, OpTime(10,0), 0); + const BSONObj freshRequest = makeFreshRequest(config, Timestamp(10,0), 0); - startTest(OpTime(10, 0), config, 0, hosts); + startTest(Timestamp(10, 0), config, 0, hosts); const Date_t startDate = _net->now(); unordered_set<HostAndPort> seen; _net->enterNetwork(); @@ -604,7 +604,7 @@ namespace { responseBuilder << "opTime" << 3; } else { - responseBuilder << "opTime" << Date_t(OpTime(0,0).asDate()); + responseBuilder << "opTime" << Date_t(Timestamp(0,0).asULL()); } _net->scheduleResponse( noi, @@ -643,9 +643,9 @@ namespace { hosts.push_back(mem->getHostAndPort()); } - const BSONObj freshRequest = makeFreshRequest(config, OpTime(10,0), 0); + const BSONObj freshRequest = makeFreshRequest(config, Timestamp(10,0), 0); - startTest(OpTime(10, 0), config, 0, hosts); + startTest(Timestamp(10, 0), config, 0, hosts); const Date_t startDate = _net->now(); unordered_set<HostAndPort> seen; _net->enterNetwork(); @@ -662,7 +662,7 @@ namespace { "set" << "rs0" << "who" << target.toString() << "cfgver" << 1 << - "opTime" << Date_t(OpTime(0,0).asDate()); + "opTime" << Date_t(Timestamp(0,0).asULL()); if (target.host() == "h1") { responseBuilder << "veto" << true << "errmsg" << "I'd rather you didn't"; } @@ -706,9 +706,9 @@ namespace { hosts.push_back(mem->getHostAndPort()); } - const BSONObj freshRequest = makeFreshRequest(config, OpTime(10,0), 0); + const BSONObj freshRequest = makeFreshRequest(config, Timestamp(10,0), 0); - startTest(OpTime(10, 0), config, 0, hosts); + startTest(Timestamp(10, 0), config, 0, hosts); const Date_t startDate = _net->now(); unordered_set<HostAndPort> seen; _net->enterNetwork(); @@ -729,7 +729,7 @@ namespace { "cfgver" << 1 << "veto" << true << "errmsg" << "I'd rather you didn't" << - "opTime" << Date_t(OpTime(10,0).asDate()); + "opTime" << Date_t(Timestamp(10,0).asULL()); _net->scheduleResponse( noi, startDate + 20, @@ -744,7 +744,7 @@ namespace { "set" << "rs0" << "who" << target.toString() << "cfgver" << 1 << - "opTime" << Date_t(OpTime(10,0).asDate()); + "opTime" << Date_t(Timestamp(10,0).asULL()); _net->scheduleResponse( noi, startDate + 10, @@ -785,10 +785,10 @@ namespace { hosts.push_back(mem->getHostAndPort()); } - const OpTime lastOpTimeApplied(10,0); + const Timestamp lastOpTimeApplied(10,0); const BSONObj freshRequest = makeFreshRequest(config, lastOpTimeApplied, 0); - startTest(OpTime(10, 0), config, 0, hosts); + startTest(Timestamp(10, 0), config, 0, hosts); const Date_t startDate = _net->now(); unordered_set<HostAndPort> seen; _net->enterNetwork(); @@ -812,7 +812,7 @@ namespace { "set" << "rs0" << "who" << target.toString() << "cfgver" << 1 << - "opTime" << Date_t(OpTime(0,0).asDate()); + "opTime" << Date_t(Timestamp(0,0).asULL()); _net->scheduleResponse( noi, startDate + 10, @@ -832,7 +832,7 @@ namespace { public: virtual void setUp() { int selfConfigIndex = 0; - OpTime lastOpTimeApplied(100, 0); + Timestamp lastOpTimeApplied(100, 0); ReplicaSetConfig config; config.initialize(BSON("_id" << "rs0" << @@ -876,14 +876,14 @@ namespace { ResponseStatus lessFresh() { BSONObjBuilder bb; bb.append("ok", 1.0); - bb.appendDate("opTime", OpTime(10, 0).asDate()); + bb.appendDate("opTime", Timestamp(10, 0).asULL()); return ResponseStatus(NetworkInterfaceMock::Response(bb.obj(), Milliseconds(10))); } ResponseStatus moreFreshViaOpTime() { BSONObjBuilder bb; bb.append("ok", 1.0); - bb.appendDate("opTime", OpTime(110, 0).asDate()); + bb.appendDate("opTime", Timestamp(110, 0).asULL()); return ResponseStatus(NetworkInterfaceMock::Response(bb.obj(), Milliseconds(10))); } @@ -905,7 +905,7 @@ namespace { ResponseStatus tiedForFreshness() { BSONObjBuilder bb; bb.append("ok", 1.0); - bb.appendDate("opTime", OpTime(100, 0).asDate()); + bb.appendDate("opTime", Timestamp(100, 0).asULL()); return ResponseStatus(NetworkInterfaceMock::Response(bb.obj(), Milliseconds(10))); } diff --git a/src/mongo/db/repl/initial_sync.cpp b/src/mongo/db/repl/initial_sync.cpp index 494094862ba..2af2810db29 100644 --- a/src/mongo/db/repl/initial_sync.cpp +++ b/src/mongo/db/repl/initial_sync.cpp @@ -48,7 +48,7 @@ namespace repl { /* initial oplog application, during initial sync, after cloning. */ - void InitialSync::oplogApplication(OperationContext* txn, const OpTime& endOpTime) { + void InitialSync::oplogApplication(OperationContext* txn, const Timestamp& endOpTime) { if (replSetForceInitialSyncFailure > 0) { log() << "test code invoked, forced InitialSync failure: " << replSetForceInitialSyncFailure; diff --git a/src/mongo/db/repl/initial_sync.h b/src/mongo/db/repl/initial_sync.h index 69e99524b3e..593cefa3acf 100644 --- a/src/mongo/db/repl/initial_sync.h +++ b/src/mongo/db/repl/initial_sync.h @@ -46,7 +46,7 @@ namespace repl { /** * applies up to endOpTime, fetching missing documents as needed. */ - void oplogApplication(OperationContext* txn, const OpTime& endOpTime); + void oplogApplication(OperationContext* txn, const Timestamp& endOpTime); }; // Used for ReplSetTest testing. diff --git a/src/mongo/db/repl/master_slave.cpp b/src/mongo/db/repl/master_slave.cpp index b0ab3cb5037..2165b91da3d 100644 --- a/src/mongo/db/repl/master_slave.cpp +++ b/src/mongo/db/repl/master_slave.cpp @@ -119,8 +119,9 @@ namespace repl { uassert( 10119 , "only source='main' allowed for now with replication", sourceName() == "main" ); BSONElement e = o.getField("syncedTo"); if ( !e.eoo() ) { - uassert( 10120 , "bad sources 'syncedTo' field value", e.type() == Date || e.type() == Timestamp ); - OpTime tmp( e.date() ); + uassert(10120, "bad sources 'syncedTo' field value", + e.type() == Date || e.type() == bsonTimestamp); + Timestamp tmp( e.date() ); syncedTo = tmp; } @@ -156,7 +157,7 @@ namespace repl { if ( !only.empty() ) b.append("only", only); if ( !syncedTo.isNull() ) - b.appendTimestamp("syncedTo", syncedTo.asDate()); + b.append("syncedTo", syncedTo); BSONObjBuilder dbsNextPassBuilder; int n = 0; @@ -453,7 +454,7 @@ namespace repl { } } } - syncedTo = OpTime(); + syncedTo = Timestamp(); addDbNextPass.clear(); save(txn); } @@ -512,13 +513,13 @@ namespace repl { static DatabaseIgnorer ___databaseIgnorer; - void DatabaseIgnorer::doIgnoreUntilAfter( const string &db, const OpTime &futureOplogTime ) { + void DatabaseIgnorer::doIgnoreUntilAfter( const string &db, const Timestamp &futureOplogTime ) { if ( futureOplogTime > _ignores[ db ] ) { _ignores[ db ] = futureOplogTime; } } - bool DatabaseIgnorer::ignoreAt( const string &db, const OpTime ¤tOplogTime ) { + bool DatabaseIgnorer::ignoreAt( const string &db, const Timestamp ¤tOplogTime ) { if ( _ignores[ db ].isNull() ) { return false; } @@ -541,7 +542,7 @@ namespace repl { return true; } BSONElement ts = op.getField( "ts" ); - if ( ( ts.type() == Date || ts.type() == Timestamp ) && ___databaseIgnorer.ignoreAt( db, ts.date() ) ) { + if ( ( ts.type() == Date || ts.type() == bsonTimestamp ) && ___databaseIgnorer.ignoreAt( db, ts.date() ) ) { // Database is ignored due to a previous indication that it is // missing from master after optime "ts". return false; @@ -551,7 +552,7 @@ namespace repl { return true; } - OpTime lastTime; + Timestamp lastTime; bool dbOk = false; { // This is always a GlobalWrite lock (so no ns/db used from the context) @@ -564,9 +565,10 @@ namespace repl { BSONObj last = oplogReader.findOne( this->ns().c_str(), Query().sort( BSON( "$natural" << -1 ) ) ); if ( !last.isEmpty() ) { - BSONElement ts = last.getField( "ts" ); - massert( 14032, "Invalid 'ts' in remote log", ts.type() == Date || ts.type() == Timestamp ); - lastTime = OpTime( ts.date() ); + BSONElement ts = last.getField( "ts" ); + massert(14032, "Invalid 'ts' in remote log", + ts.type() == Date || ts.type() == bsonTimestamp); + lastTime = Timestamp( ts.date() ); } BSONObj info; @@ -782,8 +784,9 @@ namespace repl { BSONObj last = oplogReader.findOne( _ns.c_str(), Query( b.done() ).sort( BSON( "$natural" << -1 ) ) ); if ( !last.isEmpty() ) { BSONElement ts = last.getField( "ts" ); - massert( 10386 , "non Date ts found: " + last.toString(), ts.type() == Date || ts.type() == Timestamp ); - syncedTo = OpTime( ts.date() ); + massert(10386, "non Date ts found: " + last.toString(), + ts.type() == Date || ts.type() == bsonTimestamp); + syncedTo = Timestamp( ts.date() ); } } @@ -878,7 +881,7 @@ namespace repl { } BSONObjBuilder gte; - gte.appendTimestamp("$gte", syncedTo.asDate()); + gte.append("$gte", syncedTo); BSONObjBuilder query; query.append("ts", gte.done()); if ( !only.empty() ) { @@ -931,11 +934,11 @@ namespace repl { return okResultCode; } - OpTime nextOpTime; + Timestamp nextOpTime; { BSONObj op = oplogReader.next(); BSONElement ts = op.getField("ts"); - if ( ts.type() != Date && ts.type() != Timestamp ) { + if ( ts.type() != Date && ts.type() != bsonTimestamp ) { string err = op.getStringField("$err"); if ( !err.empty() ) { // 13051 is "tailable cursor requested on non capped collection" @@ -954,7 +957,7 @@ namespace repl { } } - nextOpTime = OpTime( ts.date() ); + nextOpTime = Timestamp( ts.date() ); LOG(2) << "first op time received: " << nextOpTime.toString() << '\n'; if ( initial ) { LOG(1) << "initial run\n"; @@ -967,7 +970,7 @@ namespace repl { verify(false); } oplogReader.putBack( op ); // op will be processed in the loop below - nextOpTime = OpTime(); // will reread the op below + nextOpTime = Timestamp(); // will reread the op below } else if ( nextOpTime != syncedTo ) { // didn't get what we queried for - error log() @@ -1033,15 +1036,15 @@ namespace repl { while( 1 ) { BSONElement ts = op.getField("ts"); - if( !( ts.type() == Date || ts.type() == Timestamp ) ) { + if( !( ts.type() == Date || ts.type() == bsonTimestamp ) ) { log() << "sync error: problem querying remote oplog record" << endl; log() << "op: " << op.toString() << endl; log() << "halting replication" << endl; replInfo = replAllDead = "sync error: no ts found querying remote oplog record"; throw SyncException(); } - OpTime last = nextOpTime; - nextOpTime = OpTime( ts.date() ); + Timestamp last = nextOpTime; + nextOpTime = Timestamp( ts.date() ); if ( !( last < nextOpTime ) ) { log() << "sync error: last applied optime at slave >= nextOpTime from master" << endl; log() << " last: " << last.toStringLong() << endl; diff --git a/src/mongo/db/repl/master_slave.h b/src/mongo/db/repl/master_slave.h index 117e26d08a1..4a05efd48b9 100644 --- a/src/mongo/db/repl/master_slave.h +++ b/src/mongo/db/repl/master_slave.h @@ -135,7 +135,7 @@ namespace repl { std::string only; // only a certain db. note that in the sources collection, this may not be changed once you start replicating. /* the last time point we have already synced up to (in the remote/master's oplog). */ - OpTime syncedTo; + Timestamp syncedTo; int nClonedThisPass; @@ -176,19 +176,19 @@ namespace repl { /** * Helper class used to set and query an ignore state for a named database. - * The ignore state will expire after a specified OpTime. + * The ignore state will expire after a specified Timestamp. */ class DatabaseIgnorer { public: /** Indicate that operations for 'db' should be ignored until after 'futureOplogTime' */ - void doIgnoreUntilAfter( const std::string &db, const OpTime &futureOplogTime ); + void doIgnoreUntilAfter( const std::string &db, const Timestamp &futureOplogTime ); /** * Query ignore state of 'db'; if 'currentOplogTime' is after the ignore * limit, the ignore state will be cleared. */ - bool ignoreAt( const std::string &db, const OpTime ¤tOplogTime ); + bool ignoreAt( const std::string &db, const Timestamp ¤tOplogTime ); private: - std::map< std::string, OpTime > _ignores; + std::map< std::string, Timestamp > _ignores; }; } // namespace repl diff --git a/src/mongo/db/repl/member_heartbeat_data.cpp b/src/mongo/db/repl/member_heartbeat_data.cpp index 8ca22c40649..5ae8f1fbffc 100644 --- a/src/mongo/db/repl/member_heartbeat_data.cpp +++ b/src/mongo/db/repl/member_heartbeat_data.cpp @@ -47,8 +47,8 @@ namespace repl { _authIssue(false) { _lastResponse.setState(MemberState::RS_UNKNOWN); - _lastResponse.setElectionTime(OpTime()); - _lastResponse.setOpTime(OpTime()); + _lastResponse.setElectionTime(Timestamp()); + _lastResponse.setOpTime(Timestamp()); } void MemberHeartbeatData::setUpValues(Date_t now, @@ -88,8 +88,8 @@ namespace repl { _lastResponse = ReplSetHeartbeatResponse(); _lastResponse.setState(MemberState::RS_DOWN); - _lastResponse.setElectionTime(OpTime()); - _lastResponse.setOpTime(OpTime()); + _lastResponse.setElectionTime(Timestamp()); + _lastResponse.setOpTime(Timestamp()); _lastResponse.setHbMsg(heartbeatMessage); _lastResponse.setSyncingTo(""); } @@ -102,8 +102,8 @@ namespace repl { _lastResponse = ReplSetHeartbeatResponse(); _lastResponse.setState(MemberState::RS_UNKNOWN); - _lastResponse.setElectionTime(OpTime()); - _lastResponse.setOpTime(OpTime()); + _lastResponse.setElectionTime(Timestamp()); + _lastResponse.setOpTime(Timestamp()); _lastResponse.setHbMsg(""); _lastResponse.setSyncingTo(""); } diff --git a/src/mongo/db/repl/member_heartbeat_data.h b/src/mongo/db/repl/member_heartbeat_data.h index 624c572d33f..b54c3e539d8 100644 --- a/src/mongo/db/repl/member_heartbeat_data.h +++ b/src/mongo/db/repl/member_heartbeat_data.h @@ -28,7 +28,7 @@ #pragma once -#include "mongo/bson/optime.h" +#include "mongo/bson/timestamp.h" #include "mongo/db/repl/member_state.h" #include "mongo/db/repl/repl_set_heartbeat_response.h" #include "mongo/util/time_support.h" @@ -54,11 +54,11 @@ namespace repl { } const std::string& getLastHeartbeatMsg() const { return _lastResponse.getHbMsg(); } const std::string& getSyncSource() const { return _lastResponse.getSyncingTo(); } - OpTime getOpTime() const { return _lastResponse.getOpTime(); } + Timestamp getOpTime() const { return _lastResponse.getOpTime(); } int getConfigVersion() const { return _lastResponse.getVersion(); } bool hasAuthIssue() const { return _authIssue; } - OpTime getElectionTime() const { return _lastResponse.getElectionTime(); } + Timestamp getElectionTime() const { return _lastResponse.getElectionTime(); } // Returns true if the last heartbeat data explicilty stated that the node // is not electable. diff --git a/src/mongo/db/repl/minvalid.cpp b/src/mongo/db/repl/minvalid.cpp index 5553747147a..c648dcd5fa7 100644 --- a/src/mongo/db/repl/minvalid.cpp +++ b/src/mongo/db/repl/minvalid.cpp @@ -32,7 +32,7 @@ #include "mongo/db/repl/minvalid.h" -#include "mongo/bson/optime.h" +#include "mongo/bson/timestamp.h" #include "mongo/db/concurrency/d_concurrency.h" #include "mongo/db/dbhelpers.h" #include "mongo/db/jsobj.h" @@ -63,7 +63,7 @@ namespace { Helpers::putSingleton(txn, minvalidNS, BSON("$set" << initialSyncFlag)); } - void setMinValid(OperationContext* ctx, OpTime ts) { + void setMinValid(OperationContext* ctx, Timestamp ts) { ScopedTransaction transaction(ctx, MODE_IX); Lock::DBLock dblk(ctx->lockState(), "local", MODE_X); Helpers::putSingleton(ctx, minvalidNS, BSON("$set" << BSON("ts" << ts))); @@ -84,16 +84,16 @@ namespace { return false; } - OpTime getMinValid(OperationContext* txn) { + Timestamp getMinValid(OperationContext* txn) { ScopedTransaction transaction(txn, MODE_IS); Lock::DBLock dblk(txn->lockState(), "local", MODE_IS); Lock::CollectionLock lk(txn->lockState(), minvalidNS, MODE_IS); BSONObj mv; bool found = Helpers::getSingleton(txn, minvalidNS, mv); if (found) { - return mv["ts"]._opTime(); + return mv["ts"].timestamp(); } - return OpTime(); + return Timestamp(); } } diff --git a/src/mongo/db/repl/minvalid.h b/src/mongo/db/repl/minvalid.h index 7bbe7c39c69..853c96b6c27 100644 --- a/src/mongo/db/repl/minvalid.h +++ b/src/mongo/db/repl/minvalid.h @@ -31,7 +31,7 @@ namespace mongo { class BSONObj; class OperationContext; - class OpTime; + class Timestamp; namespace repl { @@ -57,11 +57,11 @@ namespace repl { bool getInitialSyncFlag(); /** - * The minValid optime value is the earliest (minimum) OpTime that must be applied in order to + * The minValid value is the earliest (minimum) Timestamp that must be applied in order to * consider the dataset consistent. Do not allow client reads if our last applied operation is * before the minValid time. */ - void setMinValid(OperationContext* ctx, OpTime ts); - OpTime getMinValid(OperationContext* txn); + void setMinValid(OperationContext* ctx, Timestamp ts); + Timestamp getMinValid(OperationContext* txn); } } diff --git a/src/mongo/db/repl/oplog.cpp b/src/mongo/db/repl/oplog.cpp index ae387139c9a..7c90e58c8a5 100644 --- a/src/mongo/db/repl/oplog.cpp +++ b/src/mongo/db/repl/oplog.cpp @@ -52,7 +52,7 @@ #include "mongo/db/dbdirectclient.h" #include "mongo/db/dbhelpers.h" #include "mongo/db/service_context.h" -#include "mongo/db/global_optime.h" +#include "mongo/db/global_timestamp.h" #include "mongo/db/index_builder.h" #include "mongo/db/namespace_string.h" #include "mongo/db/op_observer.h" @@ -91,7 +91,7 @@ namespace { Database* _localDB = nullptr; Collection* _localOplogCollection = nullptr; - // Synchronizes the section where a new OpTime is generated and when it actually + // Synchronizes the section where a new Timestamp is generated and when it actually // appears in the oplog. mongo::mutex newOpMutex; boost::condition newOptimeNotifier; @@ -115,13 +115,13 @@ namespace { * function registers the new optime with the storage system and the replication coordinator, * and provides no facility to revert those registrations on rollback. */ - std::pair<OpTime, long long> getNextOpTime(OperationContext* txn, + std::pair<Timestamp, long long> getNextOpTime(OperationContext* txn, Collection* oplog, const char* ns, ReplicationCoordinator* replCoord, const char* opstr) { boost::lock_guard<boost::mutex> lk(newOpMutex); - OpTime ts = getNextGlobalOptime(); + Timestamp ts = getNextGlobalTimestamp(); newOptimeNotifier.notify_all(); fassert(28560, oplog->getRecordStore()->oplogDiskLocRegister(txn, ts)); @@ -151,7 +151,7 @@ namespace { } replCoord->setMyLastOptime(ts); - return std::pair<OpTime,long long>(ts, hashNew); + return std::pair<Timestamp,long long>(ts, hashNew); } /** @@ -259,7 +259,7 @@ namespace { _localOplogCollection); } - std::pair<OpTime, long long> slot = getNextOpTime(txn, + std::pair<Timestamp, long long> slot = getNextOpTime(txn, _localOplogCollection, ns, replCoord, @@ -270,7 +270,7 @@ namespace { */ BSONObjBuilder b(256); - b.appendTimestamp("ts", slot.first.asDate()); + b.append("ts", slot.first); b.append("h", slot.second); b.append("v", OPLOG_VERSION); b.append("op", opstr); @@ -296,9 +296,9 @@ namespace { ReplClientInfo::forClient(txn->getClient()).setLastOp( slot.first ); } - OpTime writeOpsToOplog(OperationContext* txn, const std::deque<BSONObj>& ops) { + Timestamp writeOpsToOplog(OperationContext* txn, const std::deque<BSONObj>& ops) { ReplicationCoordinator* replCoord = getGlobalReplicationCoordinator(); - OpTime lastOptime = replCoord->getMyLastOptime(); + Timestamp lastOptime = replCoord->getMyLastOptime(); invariant(!ops.empty()); MONGO_WRITE_CONFLICT_RETRY_LOOP_BEGIN { @@ -323,7 +323,7 @@ namespace { it != ops.end(); ++it) { const BSONObj& op = *it; - const OpTime ts = op["ts"]._opTime(); + const Timestamp ts = op["ts"].timestamp(); checkOplogInsert(_localOplogCollection->insertDocument(txn, op, false)); @@ -669,19 +669,19 @@ namespace { return Status::OK(); } - void waitUpToOneSecondForOptimeChange(const OpTime& referenceTime) { + void waitUpToOneSecondForTimestampChange(const Timestamp& referenceTime) { boost::unique_lock<boost::mutex> lk(newOpMutex); - while (referenceTime == getLastSetOptime()) { + while (referenceTime == getLastSetTimestamp()) { if (!newOptimeNotifier.timed_wait(lk, boost::posix_time::seconds(1))) return; } } - void setNewOptime(const OpTime& newTime) { + void setNewOptime(const Timestamp& newTime) { boost::lock_guard<boost::mutex> lk(newOpMutex); - setGlobalOptime(newTime); + setGlobalTimestamp(newTime); newOptimeNotifier.notify_all(); } diff --git a/src/mongo/db/repl/oplog.h b/src/mongo/db/repl/oplog.h index 49e9175f0d9..f587ae074df 100644 --- a/src/mongo/db/repl/oplog.h +++ b/src/mongo/db/repl/oplog.h @@ -43,7 +43,7 @@ namespace mongo { class Database; class NamespaceString; class OperationContext; - class OpTime; + class Timestamp; class RecordId; namespace repl { @@ -58,7 +58,7 @@ namespace repl { // used internally by replication secondaries after they have applied ops. Updates the global // optime. // Returns the optime for the last op inserted. - OpTime writeOpsToOplog(OperationContext* txn, + Timestamp writeOpsToOplog(OperationContext* txn, const std::deque<BSONObj>& ops); extern std::string rsOplogName; @@ -104,9 +104,9 @@ namespace repl { bool convertUpdateToUpsert = false); /** - * Waits one second for the OpTime from the oplog to change. + * Waits one second for the Timestamp from the oplog to change. */ - void waitUpToOneSecondForOptimeChange(const OpTime& referenceTime); + void waitUpToOneSecondForTimestampChange(const Timestamp& referenceTime); /** * Initializes the global OpTime with the value from the timestamp of the last oplog entry. @@ -116,7 +116,7 @@ namespace repl { /** * Sets the global OpTime to be 'newTime'. */ - void setNewOptime(const OpTime& newTime); + void setNewOptime(const Timestamp& newTime); /** * Detects the current replication mode and sets the "_oplogCollectionName" accordingly. diff --git a/src/mongo/db/repl/oplogreader.cpp b/src/mongo/db/repl/oplogreader.cpp index 9746d975fda..0301cbb0311 100644 --- a/src/mongo/db/repl/oplogreader.cpp +++ b/src/mongo/db/repl/oplogreader.cpp @@ -130,9 +130,9 @@ namespace repl { cursor.reset( _conn->query( ns, query, 0, 0, fields, _tailingQueryOptions ).release() ); } - void OplogReader::tailingQueryGTE(const char *ns, OpTime optime, const BSONObj* fields ) { + void OplogReader::tailingQueryGTE(const char *ns, Timestamp optime, const BSONObj* fields ) { BSONObjBuilder gte; - gte.appendTimestamp("$gte", optime.asDate()); + gte.append("$gte", optime); BSONObjBuilder query; query.append("ts", gte.done()); tailingQuery(ns, query.done(), fields); @@ -143,10 +143,10 @@ namespace repl { } void OplogReader::connectToSyncSource(OperationContext* txn, - OpTime lastOpTimeFetched, + Timestamp lastOpTimeFetched, ReplicationCoordinator* replCoord) { - const OpTime sentinel(Milliseconds(curTimeMillis64()).total_seconds(), 0); - OpTime oldestOpTimeSeen = sentinel; + const Timestamp sentinel(Milliseconds(curTimeMillis64()).total_seconds(), 0); + Timestamp oldestOpTimeSeen = sentinel; invariant(conn() == NULL); @@ -190,7 +190,7 @@ namespace repl { // fetched op. Otherwise, we have fallen off the back of that source's oplog. BSONObj remoteOldestOp(findOne(rsOplogName.c_str(), Query())); BSONElement tsElem(remoteOldestOp["ts"]); - if (tsElem.type() != Timestamp) { + if (tsElem.type() != bsonTimestamp) { // This member's got a bad op in its oplog. warning() << "oplog invalid format on node " << candidate.toString(); resetConnection(); @@ -198,7 +198,7 @@ namespace repl { Date_t(curTimeMillis64() + 600*1000)); continue; } - OpTime remoteOldOpTime = tsElem._opTime(); + Timestamp remoteOldOpTime = tsElem.timestamp(); if (lastOpTimeFetched < remoteOldOpTime) { // We're too stale to use this sync source. diff --git a/src/mongo/db/repl/oplogreader.h b/src/mongo/db/repl/oplogreader.h index d8639ee8530..bf089450535 100644 --- a/src/mongo/db/repl/oplogreader.h +++ b/src/mongo/db/repl/oplogreader.h @@ -99,10 +99,10 @@ namespace repl { void tailingQuery(const char *ns, const BSONObj& query, const BSONObj* fields=0); - void tailingQueryGTE(const char *ns, OpTime t, const BSONObj* fields=0); + void tailingQueryGTE(const char *ns, Timestamp t, const BSONObj* fields=0); /* Do a tailing query, but only send the ts field back. */ - void ghostQueryGTE(const char *ns, OpTime t) { + void ghostQueryGTE(const char *ns, Timestamp t) { const BSONObj fields = BSON("ts" << 1 << "_id" << 0); return tailingQueryGTE(ns, t, &fields); } @@ -146,7 +146,7 @@ namespace repl { * This function may throw DB exceptions. */ void connectToSyncSource(OperationContext* txn, - OpTime lastOpTimeFetched, + Timestamp lastOpTimeFetched, ReplicationCoordinator* replCoord); }; diff --git a/src/mongo/db/repl/optime.h b/src/mongo/db/repl/optime.h new file mode 100644 index 00000000000..4ceee222475 --- /dev/null +++ b/src/mongo/db/repl/optime.h @@ -0,0 +1,83 @@ +/** +* Copyright (C) 2015 MongoDB Inc. +* +* This program is free software: you can redistribute it and/or modify +* it under the terms of the GNU Affero General Public License, version 3, +* as published by the Free Software Foundation. +* +* This program is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU Affero General Public License for more details. +* +* You should have received a copy of the GNU Affero General Public License +* along with this program. If not, see <http://www.gnu.org/licenses/>. +* +* As a special exception, the copyright holders give permission to link the +* code of portions of this program with the OpenSSL library under certain +* conditions as described in each individual source file and distribute +* linked combinations including the program with the OpenSSL library. You +* must comply with the GNU Affero General Public License in all respects for +* all of the code used other than as permitted herein. If you modify file(s) +* with this exception, you may extend this exception to your version of the +* file(s), but you are not obligated to do so. If you do not wish to do so, +* delete this exception statement from your version. If you delete this +* exception statement from all source files in the program, then also delete +* it in the license file. +*/ + +#pragma once + +#include <tuple> +#include <utility> + +#include "mongo/bson/timestamp.h" + +namespace mongo { +namespace repl { + + class OpTime { + public: + OpTime() = default; + OpTime(Timestamp ts, long long term) : _timestamp(std::move(ts)), _term(term) {} + + Timestamp getTimestamp() const { + return _timestamp; + } + + long long getTerm() const { + return _term; + } + + private: + Timestamp _timestamp; + long long _term = -1; + }; + + inline bool operator==(const OpTime& lhs, const OpTime& rhs) { + return std::tie(lhs.opTime, lhs.term) == std::tie(rhs.opTime, rhs.term); + } + + inline bool operator<(const OpTime& lhs, const OpTime& rhs) { + // Compare term first, then the opTimes. + return std::tie(lhs.term, lhs.opTime) < std::tie(rhs.term, rhs.opTime); + } + + inline bool operator!=(const OpTime& lhs, const OpTime& rhs) { + return !(lhs == rhs); + } + + inline bool operator<=(const OpTime& lhs, const OpTime& rhs) { + return lhs < rhs || lhs == rhs; + } + + inline bool operator>(const OpTime& lhs, const OpTime& rhs) { + return !(lhs <= rhs); + } + + inline bool operator>=(const OpTime& lhs, const OpTime& rhs) { + return !(lhs < rhs); + } + +} // namespace repl +} // namespace mongo diff --git a/src/mongo/db/repl/repl_client_info.h b/src/mongo/db/repl/repl_client_info.h index 3aa0c73b66f..d7a748f8641 100644 --- a/src/mongo/db/repl/repl_client_info.h +++ b/src/mongo/db/repl/repl_client_info.h @@ -29,7 +29,7 @@ #pragma once #include "mongo/bson/oid.h" -#include "mongo/bson/optime.h" +#include "mongo/bson/timestamp.h" #include "mongo/db/client.h" namespace mongo { @@ -43,15 +43,15 @@ namespace repl { public: static const Client::Decoration<ReplClientInfo> forClient; - void setLastOp(OpTime op) { _lastOp = op; } - OpTime getLastOp() const { return _lastOp; } + void setLastOp(Timestamp op) { _lastOp = op; } + Timestamp getLastOp() const { return _lastOp; } // Only used for master/slave void setRemoteID(OID rid) { _remoteId = rid; } OID getRemoteID() const { return _remoteId; } private: - OpTime _lastOp = OpTime(); + Timestamp _lastOp = Timestamp(); OID _remoteId = OID(); }; diff --git a/src/mongo/db/repl/repl_set_heartbeat_response.cpp b/src/mongo/db/repl/repl_set_heartbeat_response.cpp index 4e968ef0175..8dac175ddf9 100644 --- a/src/mongo/db/repl/repl_set_heartbeat_response.cpp +++ b/src/mongo/db/repl/repl_set_heartbeat_response.cpp @@ -90,13 +90,13 @@ namespace { builder->append(kOkFieldName, 1.0); if (_opTimeSet) { - builder->appendDate(kOpTimeFieldName, _opTime.asDate()); + builder->appendDate(kOpTimeFieldName, _opTime.asULL()); } if (_timeSet) { *builder << kTimeFieldName << _time.total_seconds(); } if (_electionTimeSet) { - builder->appendDate(kElectionTimeFieldName, _electionTime.asDate()); + builder->appendDate(kElectionTimeFieldName, _electionTime.asULL()); } if (_configSet) { *builder << kConfigFieldName << _config.toBSON(); @@ -178,13 +178,13 @@ namespace { if (electionTimeElement.eoo()) { _electionTimeSet = false; } - else if (electionTimeElement.type() == Timestamp) { + else if (electionTimeElement.type() == bsonTimestamp) { _electionTimeSet = true; - _electionTime = electionTimeElement._opTime(); + _electionTime = electionTimeElement.timestamp(); } else if (electionTimeElement.type() == Date) { _electionTimeSet = true; - _electionTime = OpTime(electionTimeElement.date()); + _electionTime = Timestamp(electionTimeElement.date()); } else { return Status(ErrorCodes::TypeMismatch, str::stream() << "Expected \"" << @@ -212,13 +212,13 @@ namespace { if (opTimeElement.eoo()) { _opTimeSet = false; } - else if (opTimeElement.type() == Timestamp) { + else if (opTimeElement.type() == bsonTimestamp) { _opTimeSet = true; - _opTime = opTimeElement._opTime(); + _opTime = opTimeElement.timestamp(); } else if (opTimeElement.type() == Date) { _opTimeSet = true; - _opTime = OpTime(opTimeElement.date()); + _opTime = Timestamp(opTimeElement.date()); } else { return Status(ErrorCodes::TypeMismatch, str::stream() << "Expected \"" << @@ -329,7 +329,7 @@ namespace { return _state; } - OpTime ReplSetHeartbeatResponse::getElectionTime() const { + Timestamp ReplSetHeartbeatResponse::getElectionTime() const { invariant(_electionTimeSet); return _electionTime; } @@ -344,7 +344,7 @@ namespace { return _time; } - OpTime ReplSetHeartbeatResponse::getOpTime() const { + Timestamp ReplSetHeartbeatResponse::getOpTime() const { invariant(_opTimeSet); return _opTime; } diff --git a/src/mongo/db/repl/repl_set_heartbeat_response.h b/src/mongo/db/repl/repl_set_heartbeat_response.h index a5629fbc3bf..94692d7f27c 100644 --- a/src/mongo/db/repl/repl_set_heartbeat_response.h +++ b/src/mongo/db/repl/repl_set_heartbeat_response.h @@ -78,14 +78,14 @@ namespace repl { bool hasState() const { return _stateSet; } MemberState getState() const; bool hasElectionTime() const { return _electionTimeSet; } - OpTime getElectionTime() const; + Timestamp getElectionTime() const; bool hasIsElectable() const { return _electableSet; } bool isElectable() const; const std::string& getHbMsg() const { return _hbmsg; } bool hasTime() const { return _timeSet; } Seconds getTime() const; bool hasOpTime() const { return _opTimeSet; } - OpTime getOpTime() const; + Timestamp getOpTime() const; const std::string& getSyncingTo() const { return _syncingTo; } int getVersion() const { return _version; } bool hasConfig() const { return _configSet; } @@ -122,9 +122,9 @@ namespace repl { void setState(MemberState state) { _stateSet = true; _state = state; } /** - * Sets the optional "electionTime" field to the given OpTime. + * Sets the optional "electionTime" field to the given Timestamp. */ - void setElectionTime(OpTime time) { _electionTimeSet = true; _electionTime = time; } + void setElectionTime(Timestamp time) { _electionTimeSet = true; _electionTime = time; } /** * Sets _electable to "electable" and sets _electableSet to true to indicate @@ -147,7 +147,7 @@ namespace repl { * Sets _opTime to "time" and sets _opTimeSet to true to indicate that the value * of _opTime has been modified. */ - void setOpTime(OpTime time) { _opTimeSet = true; _opTime = time; } + void setOpTime(Timestamp time) { _opTimeSet = true; _opTime = time; } /** * Sets _syncingTo to "syncingTo". @@ -166,13 +166,13 @@ namespace repl { private: bool _electionTimeSet; - OpTime _electionTime; + Timestamp _electionTime; bool _timeSet; Seconds _time; // Seconds since UNIX epoch. bool _opTimeSet; - OpTime _opTime; + Timestamp _opTime; bool _electableSet; bool _electable; diff --git a/src/mongo/db/repl/repl_set_heartbeat_response_test.cpp b/src/mongo/db/repl/repl_set_heartbeat_response_test.cpp index 71003ab4fec..05e634fbc03 100644 --- a/src/mongo/db/repl/repl_set_heartbeat_response_test.cpp +++ b/src/mongo/db/repl/repl_set_heartbeat_response_test.cpp @@ -124,7 +124,7 @@ namespace { ASSERT_EQUALS(hbResponseObj.toString(), hbResponseObjRoundTripChecker.toBSON().toString()); // set electionTime - hbResponse.setElectionTime(OpTime(10,0)); + hbResponse.setElectionTime(Timestamp(10,0)); ++fieldsSet; ASSERT_EQUALS(false, hbResponse.hasState()); ASSERT_EQUALS(true, hbResponse.hasElectionTime()); @@ -139,14 +139,14 @@ namespace { ASSERT_EQUALS("", hbResponse.getHbMsg()); ASSERT_EQUALS("", hbResponse.getSyncingTo()); ASSERT_EQUALS(1, hbResponse.getVersion()); - ASSERT_EQUALS(OpTime(10,0), hbResponse.getElectionTime()); + ASSERT_EQUALS(Timestamp(10,0), hbResponse.getElectionTime()); hbResponseObj = hbResponse.toBSON(); ASSERT_EQUALS(fieldsSet, hbResponseObj.nFields()); ASSERT_EQUALS("rs0", hbResponseObj["set"].String()); ASSERT_EQUALS("", hbResponseObj["hbmsg"].String()); ASSERT_EQUALS(1, hbResponseObj["v"].Number()); - ASSERT_EQUALS(OpTime(10,0), hbResponseObj["electionTime"]._opTime()); + ASSERT_EQUALS(Timestamp(10,0), hbResponseObj["electionTime"].timestamp()); initializeResult = hbResponseObjRoundTripChecker.initialize(hbResponseObj); ASSERT_EQUALS(Status::OK(), initializeResult); @@ -168,16 +168,16 @@ namespace { ASSERT_EQUALS("", hbResponse.getHbMsg()); ASSERT_EQUALS("", hbResponse.getSyncingTo()); ASSERT_EQUALS(1, hbResponse.getVersion()); - ASSERT_EQUALS(OpTime(10,0), hbResponse.getElectionTime()); - ASSERT_EQUALS(OpTime(0,10), hbResponse.getOpTime()); + ASSERT_EQUALS(Timestamp(10,0), hbResponse.getElectionTime()); + ASSERT_EQUALS(Timestamp(0,10), hbResponse.getOpTime()); hbResponseObj = hbResponse.toBSON(); ASSERT_EQUALS(fieldsSet, hbResponseObj.nFields()); ASSERT_EQUALS("rs0", hbResponseObj["set"].String()); ASSERT_EQUALS("", hbResponseObj["hbmsg"].String()); ASSERT_EQUALS(1, hbResponseObj["v"].Number()); - ASSERT_EQUALS(OpTime(10,0), hbResponseObj["electionTime"]._opTime()); - ASSERT_EQUALS(OpTime(0,10), hbResponseObj["opTime"]._opTime()); + ASSERT_EQUALS(Timestamp(10,0), hbResponseObj["electionTime"].timestamp()); + ASSERT_EQUALS(Timestamp(0,10), hbResponseObj["opTime"].timestamp()); initializeResult = hbResponseObjRoundTripChecker.initialize(hbResponseObj); ASSERT_EQUALS(Status::OK(), initializeResult); @@ -199,8 +199,8 @@ namespace { ASSERT_EQUALS("", hbResponse.getHbMsg()); ASSERT_EQUALS("", hbResponse.getSyncingTo()); ASSERT_EQUALS(1, hbResponse.getVersion()); - ASSERT_EQUALS(OpTime(10,0), hbResponse.getElectionTime()); - ASSERT_EQUALS(OpTime(0,10), hbResponse.getOpTime()); + ASSERT_EQUALS(Timestamp(10,0), hbResponse.getElectionTime()); + ASSERT_EQUALS(Timestamp(0,10), hbResponse.getOpTime()); ASSERT_EQUALS(10, hbResponse.getTime().total_seconds()); hbResponseObj = hbResponse.toBSON(); @@ -208,8 +208,8 @@ namespace { ASSERT_EQUALS("rs0", hbResponseObj["set"].String()); ASSERT_EQUALS("", hbResponseObj["hbmsg"].String()); ASSERT_EQUALS(1, hbResponseObj["v"].Number()); - ASSERT_EQUALS(OpTime(10,0), hbResponseObj["electionTime"]._opTime()); - ASSERT_EQUALS(OpTime(0,10), hbResponseObj["opTime"]._opTime()); + ASSERT_EQUALS(Timestamp(10,0), hbResponseObj["electionTime"].timestamp()); + ASSERT_EQUALS(Timestamp(0,10), hbResponseObj["opTime"].timestamp()); ASSERT_EQUALS(10, hbResponseObj["time"].numberLong()); initializeResult = hbResponseObjRoundTripChecker.initialize(hbResponseObj); @@ -232,8 +232,8 @@ namespace { ASSERT_EQUALS("", hbResponse.getHbMsg()); ASSERT_EQUALS("", hbResponse.getSyncingTo()); ASSERT_EQUALS(1, hbResponse.getVersion()); - ASSERT_EQUALS(OpTime(10,0), hbResponse.getElectionTime()); - ASSERT_EQUALS(OpTime(0,10), hbResponse.getOpTime()); + ASSERT_EQUALS(Timestamp(10,0), hbResponse.getElectionTime()); + ASSERT_EQUALS(Timestamp(0,10), hbResponse.getOpTime()); ASSERT_EQUALS(10, hbResponse.getTime().total_seconds()); ASSERT_EQUALS(true, hbResponse.isElectable()); @@ -242,8 +242,8 @@ namespace { ASSERT_EQUALS("rs0", hbResponseObj["set"].String()); ASSERT_EQUALS("", hbResponseObj["hbmsg"].String()); ASSERT_EQUALS(1, hbResponseObj["v"].Number()); - ASSERT_EQUALS(OpTime(10,0), hbResponseObj["electionTime"]._opTime()); - ASSERT_EQUALS(OpTime(0,10), hbResponseObj["opTime"]._opTime()); + ASSERT_EQUALS(Timestamp(10,0), hbResponseObj["electionTime"].timestamp()); + ASSERT_EQUALS(Timestamp(0,10), hbResponseObj["opTime"].timestamp()); ASSERT_EQUALS(10, hbResponseObj["time"].numberLong()); ASSERT_EQUALS(true, hbResponseObj["e"].trueValue()); @@ -268,8 +268,8 @@ namespace { ASSERT_EQUALS("", hbResponse.getHbMsg()); ASSERT_EQUALS("", hbResponse.getSyncingTo()); ASSERT_EQUALS(1, hbResponse.getVersion()); - ASSERT_EQUALS(OpTime(10,0), hbResponse.getElectionTime()); - ASSERT_EQUALS(OpTime(0,10), hbResponse.getOpTime()); + ASSERT_EQUALS(Timestamp(10,0), hbResponse.getElectionTime()); + ASSERT_EQUALS(Timestamp(0,10), hbResponse.getOpTime()); ASSERT_EQUALS(10, hbResponse.getTime().total_seconds()); ASSERT_EQUALS(true, hbResponse.isElectable()); ASSERT_EQUALS(config.toBSON().toString(), hbResponse.getConfig().toBSON().toString()); @@ -279,8 +279,8 @@ namespace { ASSERT_EQUALS("rs0", hbResponseObj["set"].String()); ASSERT_EQUALS("", hbResponseObj["hbmsg"].String()); ASSERT_EQUALS(1, hbResponseObj["v"].Number()); - ASSERT_EQUALS(OpTime(10,0), hbResponseObj["electionTime"]._opTime()); - ASSERT_EQUALS(OpTime(0,10), hbResponseObj["opTime"]._opTime()); + ASSERT_EQUALS(Timestamp(10,0), hbResponseObj["electionTime"].timestamp()); + ASSERT_EQUALS(Timestamp(0,10), hbResponseObj["opTime"].timestamp()); ASSERT_EQUALS(10, hbResponseObj["time"].numberLong()); ASSERT_EQUALS(true, hbResponseObj["e"].trueValue()); ASSERT_EQUALS(config.toBSON().toString(), hbResponseObj["config"].Obj().toString()); @@ -307,8 +307,8 @@ namespace { ASSERT_EQUALS("", hbResponse.getHbMsg()); ASSERT_EQUALS("", hbResponse.getSyncingTo()); ASSERT_EQUALS(1, hbResponse.getVersion()); - ASSERT_EQUALS(OpTime(10,0), hbResponse.getElectionTime()); - ASSERT_EQUALS(OpTime(0,10), hbResponse.getOpTime()); + ASSERT_EQUALS(Timestamp(10,0), hbResponse.getElectionTime()); + ASSERT_EQUALS(Timestamp(0,10), hbResponse.getOpTime()); ASSERT_EQUALS(10, hbResponse.getTime().total_seconds()); ASSERT_EQUALS(true, hbResponse.isElectable()); ASSERT_EQUALS(config.toBSON().toString(), hbResponse.getConfig().toBSON().toString()); @@ -318,8 +318,8 @@ namespace { ASSERT_EQUALS("rs0", hbResponseObj["set"].String()); ASSERT_EQUALS("", hbResponseObj["hbmsg"].String()); ASSERT_EQUALS(1, hbResponseObj["v"].Number()); - ASSERT_EQUALS(OpTime(10,0), hbResponseObj["electionTime"]._opTime()); - ASSERT_EQUALS(OpTime(0,10), hbResponseObj["opTime"]._opTime()); + ASSERT_EQUALS(Timestamp(10,0), hbResponseObj["electionTime"].timestamp()); + ASSERT_EQUALS(Timestamp(0,10), hbResponseObj["opTime"].timestamp()); ASSERT_EQUALS(10, hbResponseObj["time"].numberLong()); ASSERT_EQUALS(true, hbResponseObj["e"].trueValue()); ASSERT_EQUALS(config.toBSON().toString(), hbResponseObj["config"].Obj().toString()); @@ -347,8 +347,8 @@ namespace { ASSERT_EQUALS("", hbResponse.getHbMsg()); ASSERT_EQUALS("", hbResponse.getSyncingTo()); ASSERT_EQUALS(1, hbResponse.getVersion()); - ASSERT_EQUALS(OpTime(10,0), hbResponse.getElectionTime()); - ASSERT_EQUALS(OpTime(0,10), hbResponse.getOpTime()); + ASSERT_EQUALS(Timestamp(10,0), hbResponse.getElectionTime()); + ASSERT_EQUALS(Timestamp(0,10), hbResponse.getOpTime()); ASSERT_EQUALS(10, hbResponse.getTime().total_seconds()); ASSERT_EQUALS(true, hbResponse.isElectable()); ASSERT_EQUALS(config.toBSON().toString(), hbResponse.getConfig().toBSON().toString()); @@ -358,8 +358,8 @@ namespace { ASSERT_EQUALS("rs0", hbResponseObj["set"].String()); ASSERT_EQUALS("", hbResponseObj["hbmsg"].String()); ASSERT_EQUALS(1, hbResponseObj["v"].Number()); - ASSERT_EQUALS(OpTime(10,0), hbResponseObj["electionTime"]._opTime()); - ASSERT_EQUALS(OpTime(0,10), hbResponseObj["opTime"]._opTime()); + ASSERT_EQUALS(Timestamp(10,0), hbResponseObj["electionTime"].timestamp()); + ASSERT_EQUALS(Timestamp(0,10), hbResponseObj["opTime"].timestamp()); ASSERT_EQUALS(10, hbResponseObj["time"].numberLong()); ASSERT_EQUALS(true, hbResponseObj["e"].trueValue()); ASSERT_EQUALS(config.toBSON().toString(), hbResponseObj["config"].Obj().toString()); @@ -389,8 +389,8 @@ namespace { ASSERT_EQUALS("", hbResponse.getHbMsg()); ASSERT_EQUALS("", hbResponse.getSyncingTo()); ASSERT_EQUALS(1, hbResponse.getVersion()); - ASSERT_EQUALS(OpTime(10,0), hbResponse.getElectionTime()); - ASSERT_EQUALS(OpTime(0,10), hbResponse.getOpTime()); + ASSERT_EQUALS(Timestamp(10,0), hbResponse.getElectionTime()); + ASSERT_EQUALS(Timestamp(0,10), hbResponse.getOpTime()); ASSERT_EQUALS(10, hbResponse.getTime().total_seconds()); ASSERT_EQUALS(true, hbResponse.isElectable()); ASSERT_EQUALS(config.toBSON().toString(), hbResponse.getConfig().toBSON().toString()); @@ -400,8 +400,8 @@ namespace { ASSERT_EQUALS("rs0", hbResponseObj["set"].String()); ASSERT_EQUALS("", hbResponseObj["hbmsg"].String()); ASSERT_EQUALS(1, hbResponseObj["v"].Number()); - ASSERT_EQUALS(OpTime(10,0), hbResponseObj["electionTime"]._opTime()); - ASSERT_EQUALS(OpTime(0,10), hbResponseObj["opTime"]._opTime()); + ASSERT_EQUALS(Timestamp(10,0), hbResponseObj["electionTime"].timestamp()); + ASSERT_EQUALS(Timestamp(0,10), hbResponseObj["opTime"].timestamp()); ASSERT_EQUALS(10, hbResponseObj["time"].numberLong()); ASSERT_EQUALS(true, hbResponseObj["e"].trueValue()); ASSERT_EQUALS(config.toBSON().toString(), hbResponseObj["config"].Obj().toString()); @@ -432,8 +432,8 @@ namespace { ASSERT_EQUALS("", hbResponse.getHbMsg()); ASSERT_EQUALS("syncTarget", hbResponse.getSyncingTo()); ASSERT_EQUALS(1, hbResponse.getVersion()); - ASSERT_EQUALS(OpTime(10,0), hbResponse.getElectionTime()); - ASSERT_EQUALS(OpTime(0,10), hbResponse.getOpTime()); + ASSERT_EQUALS(Timestamp(10,0), hbResponse.getElectionTime()); + ASSERT_EQUALS(Timestamp(0,10), hbResponse.getOpTime()); ASSERT_EQUALS(10, hbResponse.getTime().total_seconds()); ASSERT_EQUALS(true, hbResponse.isElectable()); ASSERT_EQUALS(config.toBSON().toString(), hbResponse.getConfig().toBSON().toString()); @@ -443,8 +443,8 @@ namespace { ASSERT_EQUALS("rs0", hbResponseObj["set"].String()); ASSERT_EQUALS("", hbResponseObj["hbmsg"].String()); ASSERT_EQUALS(1, hbResponseObj["v"].Number()); - ASSERT_EQUALS(OpTime(10,0), hbResponseObj["electionTime"]._opTime()); - ASSERT_EQUALS(OpTime(0,10), hbResponseObj["opTime"]._opTime()); + ASSERT_EQUALS(Timestamp(10,0), hbResponseObj["electionTime"].timestamp()); + ASSERT_EQUALS(Timestamp(0,10), hbResponseObj["opTime"].timestamp()); ASSERT_EQUALS(10, hbResponseObj["time"].numberLong()); ASSERT_EQUALS(true, hbResponseObj["e"].trueValue()); ASSERT_EQUALS(config.toBSON().toString(), hbResponseObj["config"].Obj().toString()); @@ -475,8 +475,8 @@ namespace { ASSERT_EQUALS("lub dub", hbResponse.getHbMsg()); ASSERT_EQUALS("syncTarget", hbResponse.getSyncingTo()); ASSERT_EQUALS(1, hbResponse.getVersion()); - ASSERT_EQUALS(OpTime(10,0), hbResponse.getElectionTime()); - ASSERT_EQUALS(OpTime(0,10), hbResponse.getOpTime()); + ASSERT_EQUALS(Timestamp(10,0), hbResponse.getElectionTime()); + ASSERT_EQUALS(Timestamp(0,10), hbResponse.getOpTime()); ASSERT_EQUALS(10, hbResponse.getTime().total_seconds()); ASSERT_EQUALS(true, hbResponse.isElectable()); ASSERT_EQUALS(config.toBSON().toString(), hbResponse.getConfig().toBSON().toString()); @@ -486,8 +486,8 @@ namespace { ASSERT_EQUALS("rs0", hbResponseObj["set"].String()); ASSERT_EQUALS("lub dub", hbResponseObj["hbmsg"].String()); ASSERT_EQUALS(1, hbResponseObj["v"].Number()); - ASSERT_EQUALS(OpTime(10,0), hbResponseObj["electionTime"]._opTime()); - ASSERT_EQUALS(OpTime(0,10), hbResponseObj["opTime"]._opTime()); + ASSERT_EQUALS(Timestamp(10,0), hbResponseObj["electionTime"].timestamp()); + ASSERT_EQUALS(Timestamp(0,10), hbResponseObj["opTime"].timestamp()); ASSERT_EQUALS(10, hbResponseObj["time"].numberLong()); ASSERT_EQUALS(true, hbResponseObj["e"].trueValue()); ASSERT_EQUALS(config.toBSON().toString(), hbResponseObj["config"].Obj().toString()); @@ -518,8 +518,8 @@ namespace { ASSERT_EQUALS("lub dub", hbResponse.getHbMsg()); ASSERT_EQUALS("syncTarget", hbResponse.getSyncingTo()); ASSERT_EQUALS(1, hbResponse.getVersion()); - ASSERT_EQUALS(OpTime(10,0), hbResponse.getElectionTime()); - ASSERT_EQUALS(OpTime(0,10), hbResponse.getOpTime()); + ASSERT_EQUALS(Timestamp(10,0), hbResponse.getElectionTime()); + ASSERT_EQUALS(Timestamp(0,10), hbResponse.getOpTime()); ASSERT_EQUALS(10, hbResponse.getTime().total_seconds()); ASSERT_EQUALS(true, hbResponse.isElectable()); ASSERT_EQUALS(config.toBSON().toString(), hbResponse.getConfig().toBSON().toString()); @@ -724,7 +724,7 @@ namespace { ReplSetHeartbeatResponse hbResp; std::string msg = "still initializing"; Status result = hbResp.initialize(BSON("ok" << 1.0 << - "opTime" << OpTime())); + "opTime" << Timestamp())); ASSERT_EQUALS(ErrorCodes::NoSuchKey, result.code()); ASSERT_TRUE(stringContains(result.reason(), "\"v\"")) << result.reason() << " doesn't contain 'v' field required error msg"; diff --git a/src/mongo/db/repl/replication_coordinator.h b/src/mongo/db/repl/replication_coordinator.h index 06e541ac06e..934ccedb531 100644 --- a/src/mongo/db/repl/replication_coordinator.h +++ b/src/mongo/db/repl/replication_coordinator.h @@ -44,7 +44,7 @@ namespace mongo { class IndexDescriptor; class NamespaceString; class OperationContext; - class OpTime; + class Timestamp; struct WriteConcernOptions; namespace repl { @@ -172,7 +172,7 @@ namespace repl { * ErrorCodes::Interrupted if the operation was killed with killop() */ virtual StatusAndDuration awaitReplication(const OperationContext* txn, - const OpTime& ts, + const Timestamp& ts, const WriteConcernOptions& writeConcern) = 0; /** @@ -246,7 +246,7 @@ namespace repl { * Updates our internal tracking of the last OpTime applied for the given slave * identified by "rid". Only valid to call in master/slave mode */ - virtual Status setLastOptimeForSlave(const OID& rid, const OpTime& ts) = 0; + virtual Status setLastOptimeForSlave(const OID& rid, const Timestamp& ts) = 0; /** * Updates our internal tracking of the last OpTime applied to this node. @@ -256,7 +256,7 @@ namespace repl { * that after calls to resetLastOpTimeFromOplog(), the minimum acceptable value for "ts" is * reset based on the contents of the oplog, and may go backwards due to rollback. */ - virtual void setMyLastOptime(const OpTime& ts) = 0; + virtual void setMyLastOptime(const Timestamp& ts) = 0; /** * Same as above, but used during places we need to zero our last optime. @@ -271,7 +271,7 @@ namespace repl { /** * Returns the last optime recorded by setMyLastOptime. */ - virtual OpTime getMyLastOptime() const = 0; + virtual Timestamp getMyLastOptime() const = 0; /** * Retrieves and returns the current election id, which is a unique id that is local to @@ -443,7 +443,7 @@ namespace repl { HostAndPort who; // host and port of the member that sent the replSetFresh command unsigned id; // replSet id of the member that sent the replSetFresh command int cfgver; // replSet config version that the member who sent the command thinks it has - OpTime opTime; // last optime seen by the member who sent the replSetFresh command + Timestamp opTime; // last optime seen by the member who sent the replSetFresh command }; /* @@ -503,7 +503,7 @@ namespace repl { /** * Returns a vector of members that have applied the operation with OpTime 'op'. */ - virtual std::vector<HostAndPort> getHostsWrittenTo(const OpTime& op) = 0; + virtual std::vector<HostAndPort> getHostsWrittenTo(const Timestamp& op) = 0; /** * Returns a vector of the members other than ourself in the replica set, as specified in @@ -554,7 +554,7 @@ namespace repl { * Committed means a majority of the voting nodes of the config are known to have the * operation in their oplogs. This implies such ops will never be rolled back. */ - virtual OpTime getLastCommittedOpTime() const = 0; + virtual Timestamp getLastCommittedOpTime() const = 0; protected: diff --git a/src/mongo/db/repl/replication_coordinator_external_state.h b/src/mongo/db/repl/replication_coordinator_external_state.h index 7734d119040..07fa9ed921a 100644 --- a/src/mongo/db/repl/replication_coordinator_external_state.h +++ b/src/mongo/db/repl/replication_coordinator_external_state.h @@ -31,7 +31,7 @@ #include <boost/scoped_ptr.hpp> #include "mongo/base/disallow_copying.h" -#include "mongo/bson/optime.h" +#include "mongo/bson/timestamp.h" #include "mongo/util/time_support.h" namespace mongo { @@ -114,13 +114,13 @@ namespace repl { /** * Sets the global opTime to be 'newTime'. */ - virtual void setGlobalOpTime(const OpTime& newTime) = 0; + virtual void setGlobalTimestamp(const Timestamp& newTime) = 0; /** * Gets the last optime of an operation performed on this host, from stable * storage. */ - virtual StatusWith<OpTime> loadLastOpTime(OperationContext* txn) = 0; + virtual StatusWith<Timestamp> loadLastOpTime(OperationContext* txn) = 0; /** * Returns the HostAndPort of the remote client connected to us that initiated the operation diff --git a/src/mongo/db/repl/replication_coordinator_external_state_impl.cpp b/src/mongo/db/repl/replication_coordinator_external_state_impl.cpp index 824aac77634..6a83bba6d50 100644 --- a/src/mongo/db/repl/replication_coordinator_external_state_impl.cpp +++ b/src/mongo/db/repl/replication_coordinator_external_state_impl.cpp @@ -186,38 +186,38 @@ namespace { } } - void ReplicationCoordinatorExternalStateImpl::setGlobalOpTime(const OpTime& newTime) { + void ReplicationCoordinatorExternalStateImpl::setGlobalTimestamp(const Timestamp& newTime) { setNewOptime(newTime); } - StatusWith<OpTime> ReplicationCoordinatorExternalStateImpl::loadLastOpTime( + StatusWith<Timestamp> ReplicationCoordinatorExternalStateImpl::loadLastOpTime( OperationContext* txn) { try { BSONObj oplogEntry; if (!Helpers::getLast(txn, rsOplogName.c_str(), oplogEntry)) { - return StatusWith<OpTime>( + return StatusWith<Timestamp>( ErrorCodes::NoMatchingDocument, str::stream() << "Did not find any entries in " << rsOplogName); } BSONElement tsElement = oplogEntry[tsFieldName]; if (tsElement.eoo()) { - return StatusWith<OpTime>( + return StatusWith<Timestamp>( ErrorCodes::NoSuchKey, str::stream() << "Most recent entry in " << rsOplogName << " missing \"" << tsFieldName << "\" field"); } - if (tsElement.type() != Timestamp) { - return StatusWith<OpTime>( + if (tsElement.type() != bsonTimestamp) { + return StatusWith<Timestamp>( ErrorCodes::TypeMismatch, str::stream() << "Expected type of \"" << tsFieldName << "\" in most recent " << rsOplogName << " entry to have type Timestamp, but found " << typeName(tsElement.type())); } - return StatusWith<OpTime>(tsElement._opTime()); + return StatusWith<Timestamp>(tsElement.timestamp()); } catch (const DBException& ex) { - return StatusWith<OpTime>(ex.toStatus()); + return StatusWith<Timestamp>(ex.toStatus()); } } diff --git a/src/mongo/db/repl/replication_coordinator_external_state_impl.h b/src/mongo/db/repl/replication_coordinator_external_state_impl.h index 3d1c7bef733..482b143f629 100644 --- a/src/mongo/db/repl/replication_coordinator_external_state_impl.h +++ b/src/mongo/db/repl/replication_coordinator_external_state_impl.h @@ -54,8 +54,8 @@ namespace repl { virtual bool isSelf(const HostAndPort& host); virtual StatusWith<BSONObj> loadLocalConfigDocument(OperationContext* txn); virtual Status storeLocalConfigDocument(OperationContext* txn, const BSONObj& config); - virtual void setGlobalOpTime(const OpTime& newTime); - virtual StatusWith<OpTime> loadLastOpTime(OperationContext* txn); + virtual void setGlobalTimestamp(const Timestamp& newTime); + virtual StatusWith<Timestamp> loadLastOpTime(OperationContext* txn); virtual HostAndPort getClientHostAndPort(const OperationContext* txn); virtual void closeConnections(); virtual void killAllUserOperations(OperationContext* txn); diff --git a/src/mongo/db/repl/replication_coordinator_external_state_mock.cpp b/src/mongo/db/repl/replication_coordinator_external_state_mock.cpp index e308bc2588e..bd4e194c5fc 100644 --- a/src/mongo/db/repl/replication_coordinator_external_state_mock.cpp +++ b/src/mongo/db/repl/replication_coordinator_external_state_mock.cpp @@ -108,16 +108,16 @@ namespace repl { _localRsConfigDocument = localConfigDocument; } - void ReplicationCoordinatorExternalStateMock::setGlobalOpTime(const OpTime& newTime) { + void ReplicationCoordinatorExternalStateMock::setGlobalTimestamp(const Timestamp& newTime) { } - StatusWith<OpTime> ReplicationCoordinatorExternalStateMock::loadLastOpTime( + StatusWith<Timestamp> ReplicationCoordinatorExternalStateMock::loadLastOpTime( OperationContext* txn) { return _lastOpTime; } void ReplicationCoordinatorExternalStateMock::setLastOpTime( - const StatusWith<OpTime>& lastApplied) { + const StatusWith<Timestamp>& lastApplied) { _lastOpTime = lastApplied; } diff --git a/src/mongo/db/repl/replication_coordinator_external_state_mock.h b/src/mongo/db/repl/replication_coordinator_external_state_mock.h index 2f86ebc4d77..8f4366b7e17 100644 --- a/src/mongo/db/repl/replication_coordinator_external_state_mock.h +++ b/src/mongo/db/repl/replication_coordinator_external_state_mock.h @@ -28,12 +28,14 @@ #pragma once +#include <boost/thread.hpp> +#include <boost/thread/condition.hpp> #include <vector> #include "mongo/base/disallow_copying.h" #include "mongo/base/status_with.h" #include "mongo/bson/oid.h" -#include "mongo/bson/optime.h" +#include "mongo/bson/timestamp.h" #include "mongo/db/jsobj.h" #include "mongo/db/repl/replication_coordinator_external_state.h" #include "mongo/util/net/hostandport.h" @@ -58,8 +60,8 @@ namespace repl { virtual HostAndPort getClientHostAndPort(const OperationContext* txn); virtual StatusWith<BSONObj> loadLocalConfigDocument(OperationContext* txn); virtual Status storeLocalConfigDocument(OperationContext* txn, const BSONObj& config); - virtual void setGlobalOpTime(const OpTime& newTime); - virtual StatusWith<OpTime> loadLastOpTime(OperationContext* txn); + virtual void setGlobalTimestamp(const Timestamp& newTime); + virtual StatusWith<Timestamp> loadLastOpTime(OperationContext* txn); virtual void closeConnections(); virtual void killAllUserOperations(OperationContext* txn); virtual void clearShardingState(); @@ -86,7 +88,7 @@ namespace repl { /** * Sets the return value for subsequent calls to loadLastOpTimeApplied. */ - void setLastOpTime(const StatusWith<OpTime>& lastApplied); + void setLastOpTime(const StatusWith<Timestamp>& lastApplied); /** * Sets the return value for subsequent calls to storeLocalConfigDocument(). @@ -102,7 +104,7 @@ namespace repl { private: StatusWith<BSONObj> _localRsConfigDocument; - StatusWith<OpTime> _lastOpTime; + StatusWith<Timestamp> _lastOpTime; std::vector<HostAndPort> _selfHosts; bool _canAcquireGlobalSharedLock; Status _storeLocalConfigDocumentStatus; diff --git a/src/mongo/db/repl/replication_coordinator_impl.cpp b/src/mongo/db/repl/replication_coordinator_impl.cpp index 3ee5b1227ea..4f9e9514509 100644 --- a/src/mongo/db/repl/replication_coordinator_impl.cpp +++ b/src/mongo/db/repl/replication_coordinator_impl.cpp @@ -37,7 +37,7 @@ #include "mongo/base/status.h" #include "mongo/db/concurrency/d_concurrency.h" -#include "mongo/db/global_optime.h" +#include "mongo/db/global_timestamp.h" #include "mongo/db/index/index_descriptor.h" #include "mongo/db/operation_context_noop.h" #include "mongo/db/repl/check_quorum_for_config_change.h" @@ -109,7 +109,7 @@ namespace { */ WaiterInfo(std::vector<WaiterInfo*>* _list, unsigned int _opID, - const OpTime* _opTime, + const Timestamp* _opTime, const WriteConcernOptions* _writeConcern, boost::condition_variable* _condVar) : list(_list), master(true), @@ -127,7 +127,7 @@ namespace { std::vector<WaiterInfo*>* list; bool master; // Set to false to indicate that stepDown was called while waiting const unsigned int opID; - const OpTime* opTime; + const Timestamp* opTime; const WriteConcernOptions* writeConcern; boost::condition_variable* condVar; }; @@ -213,7 +213,7 @@ namespace { fassertFailedNoTrace(28545); } - StatusWith<OpTime> lastOpTimeStatus = _externalState->loadLastOpTime(txn); + StatusWith<Timestamp> lastOpTimeStatus = _externalState->loadLastOpTime(txn); // Use a callback here, because _finishLoadLocalConfig calls isself() which requires // that the server's networking layer be up and running and accepting connections, which @@ -230,7 +230,7 @@ namespace { void ReplicationCoordinatorImpl::_finishLoadLocalConfig( const ReplicationExecutor::CallbackData& cbData, const ReplicaSetConfig& localConfig, - const StatusWith<OpTime>& lastOpTimeStatus) { + const StatusWith<Timestamp>& lastOpTimeStatus) { if (!cbData.status.isOK()) { LOG(1) << "Loading local replica set configuration failed due to " << cbData.status; return; @@ -266,7 +266,7 @@ namespace { // Do not check optime, if this node is an arbiter. bool isArbiter = myIndex.getValue() != -1 && localConfig.getMemberAt(myIndex.getValue()).isArbiter(); - OpTime lastOpTime(0, 0); + Timestamp lastOpTime(0, 0); if (!isArbiter) { if (!lastOpTimeStatus.isOK()) { warning() << "Failed to load timestamp of most recently applied operation; " << @@ -282,7 +282,7 @@ namespace { const PostMemberStateUpdateAction action = _setCurrentRSConfig_inlock(localConfig, myIndex.getValue()); _setMyLastOptime_inlock(&lk, lastOpTime, false); - _externalState->setGlobalOpTime(lastOpTime); + _externalState->setGlobalTimestamp(lastOpTime); if (lk.owns_lock()) { lk.unlock(); } @@ -575,7 +575,7 @@ namespace { } void ReplicationCoordinatorImpl::_updateSlaveInfoOptime_inlock(SlaveInfo* slaveInfo, - OpTime ts) { + Timestamp ts) { slaveInfo->opTime = ts; @@ -646,7 +646,7 @@ namespace { } Status ReplicationCoordinatorImpl::setLastOptimeForSlave(const OID& rid, - const OpTime& ts) { + const Timestamp& ts) { boost::unique_lock<boost::mutex> lock(_mutex); massert(28576, "Received an old style replication progress update, which is only used for Master/" @@ -682,18 +682,18 @@ namespace { _replExecutor.wait(cbh.getValue()); } - void ReplicationCoordinatorImpl::setMyLastOptime(const OpTime& ts) { + void ReplicationCoordinatorImpl::setMyLastOptime(const Timestamp& ts) { boost::unique_lock<boost::mutex> lock(_mutex); _setMyLastOptime_inlock(&lock, ts, false); } void ReplicationCoordinatorImpl::resetMyLastOptime() { boost::unique_lock<boost::mutex> lock(_mutex); - _setMyLastOptime_inlock(&lock, OpTime(), true); + _setMyLastOptime_inlock(&lock, Timestamp(), true); } void ReplicationCoordinatorImpl::_setMyLastOptime_inlock( - boost::unique_lock<boost::mutex>* lock, const OpTime& ts, bool isRollbackAllowed) { + boost::unique_lock<boost::mutex>* lock, const Timestamp& ts, bool isRollbackAllowed) { invariant(lock->owns_lock()); SlaveInfo* mySlaveInfo = &_slaveInfo[_getMyIndexInSlaveInfo_inlock()]; invariant(isRollbackAllowed || mySlaveInfo->opTime <= ts); @@ -709,18 +709,18 @@ namespace { _externalState->forwardSlaveProgress(); // Must do this outside _mutex } - OpTime ReplicationCoordinatorImpl::getMyLastOptime() const { + Timestamp ReplicationCoordinatorImpl::getMyLastOptime() const { boost::lock_guard<boost::mutex> lock(_mutex); return _getMyLastOptime_inlock(); } - OpTime ReplicationCoordinatorImpl::_getMyLastOptime_inlock() const { + Timestamp ReplicationCoordinatorImpl::_getMyLastOptime_inlock() const { return _slaveInfo[_getMyIndexInSlaveInfo_inlock()].opTime; } Status ReplicationCoordinatorImpl::setLastOptime_forTest(long long cfgVer, long long memberId, - const OpTime& ts) { + const Timestamp& ts) { boost::lock_guard<boost::mutex> lock(_mutex); invariant(_getReplicationMode_inlock() == modeReplSet); @@ -824,7 +824,7 @@ namespace { } bool ReplicationCoordinatorImpl::_doneWaitingForReplication_inlock( - const OpTime& opTime, const WriteConcernOptions& writeConcern) { + const Timestamp& opTime, const WriteConcernOptions& writeConcern) { Status status = _checkIfWriteConcernCanBeSatisfied_inlock(writeConcern); if (!status.isOK()) { return true; @@ -850,7 +850,7 @@ namespace { } } - bool ReplicationCoordinatorImpl::_haveNumNodesReachedOpTime_inlock(const OpTime& opTime, + bool ReplicationCoordinatorImpl::_haveNumNodesReachedOpTime_inlock(const Timestamp& opTime, int numNodes) { if (_getMyLastOptime_inlock() < opTime) { // Secondaries that are for some reason ahead of us should not allow us to @@ -861,7 +861,7 @@ namespace { for (SlaveInfoVector::iterator it = _slaveInfo.begin(); it != _slaveInfo.end(); ++it) { - const OpTime& slaveTime = it->opTime; + const Timestamp& slaveTime = it->opTime; if (slaveTime >= opTime) { --numNodes; } @@ -874,13 +874,13 @@ namespace { } bool ReplicationCoordinatorImpl::_haveTaggedNodesReachedOpTime_inlock( - const OpTime& opTime, const ReplicaSetTagPattern& tagPattern) { + const Timestamp& opTime, const ReplicaSetTagPattern& tagPattern) { ReplicaSetTagMatch matcher(tagPattern); for (SlaveInfoVector::iterator it = _slaveInfo.begin(); it != _slaveInfo.end(); ++it) { - const OpTime& slaveTime = it->opTime; + const Timestamp& slaveTime = it->opTime; if (slaveTime >= opTime) { // This node has reached the desired optime, now we need to check if it is a part // of the tagPattern. @@ -899,7 +899,7 @@ namespace { ReplicationCoordinator::StatusAndDuration ReplicationCoordinatorImpl::awaitReplication( const OperationContext* txn, - const OpTime& opTime, + const Timestamp& opTime, const WriteConcernOptions& writeConcern) { Timer timer; boost::unique_lock<boost::mutex> lock(_mutex); @@ -924,7 +924,7 @@ namespace { const Timer* timer, boost::unique_lock<boost::mutex>* lock, const OperationContext* txn, - const OpTime& opTime, + const Timestamp& opTime, const WriteConcernOptions& writeConcern) { const Mode replMode = _getReplicationMode_inlock(); @@ -1951,7 +1951,7 @@ namespace { case kActionWinElection: { boost::unique_lock<boost::mutex> lk(_mutex); _electionId = OID::gen(); - _topCoord->processWinElection(_electionId, getNextGlobalOptime()); + _topCoord->processWinElection(_electionId, getNextGlobalTimestamp()); _isWaitingForDrainToComplete = true; const PostMemberStateUpdateAction nextAction = _updateMemberStateFromTopologyCoordinator_inlock(); @@ -2049,7 +2049,7 @@ namespace { invariant(_settings.usingReplSets()); _cancelHeartbeats(); _setConfigState_inlock(kConfigSteady); - OpTime myOptime = _getMyLastOptime_inlock(); // Must get this before changing our config. + Timestamp myOptime = _getMyLastOptime_inlock(); // Must get this before changing our config. _topCoord->updateConfig( newConfig, myIndex, @@ -2146,7 +2146,7 @@ namespace { return self.shouldBuildIndexes(); } - std::vector<HostAndPort> ReplicationCoordinatorImpl::getHostsWrittenTo(const OpTime& op) { + std::vector<HostAndPort> ReplicationCoordinatorImpl::getHostsWrittenTo(const Timestamp& op) { std::vector<HostAndPort> hosts; boost::lock_guard<boost::mutex> lk(_mutex); for (size_t i = 0; i < _slaveInfo.size(); ++i) { @@ -2305,8 +2305,8 @@ namespace { } void ReplicationCoordinatorImpl::resetLastOpTimeFromOplog(OperationContext* txn) { - StatusWith<OpTime> lastOpTimeStatus = _externalState->loadLastOpTime(txn); - OpTime lastOpTime(0, 0); + StatusWith<Timestamp> lastOpTimeStatus = _externalState->loadLastOpTime(txn); + Timestamp lastOpTime(0, 0); if (!lastOpTimeStatus.isOK()) { warning() << "Failed to load timestamp of most recently applied operation; " << lastOpTimeStatus.getStatus(); @@ -2316,7 +2316,7 @@ namespace { } boost::unique_lock<boost::mutex> lk(_mutex); _setMyLastOptime_inlock(&lk, lastOpTime, true); - _externalState->setGlobalOpTime(lastOpTime); + _externalState->setGlobalTimestamp(lastOpTime); } void ReplicationCoordinatorImpl::_shouldChangeSyncSource( @@ -2355,7 +2355,7 @@ namespace { invariant(tagPattern.isOK()); ReplicaSetTagMatch matcher{tagPattern.getValue()}; - std::vector<OpTime> votingNodesOpTimes; + std::vector<Timestamp> votingNodesOpTimes; for (const auto& sI : _slaveInfo) { auto memberConfig = _rsConfig.findMemberByID(sI.memberId); @@ -2375,7 +2375,7 @@ namespace { _lastCommittedOpTime = votingNodesOpTimes[(votingNodesOpTimes.size() - 1) / 2]; } - OpTime ReplicationCoordinatorImpl::getLastCommittedOpTime() const { + Timestamp ReplicationCoordinatorImpl::getLastCommittedOpTime() const { boost::unique_lock<boost::mutex> lk(_mutex); return _lastCommittedOpTime; } diff --git a/src/mongo/db/repl/replication_coordinator_impl.h b/src/mongo/db/repl/replication_coordinator_impl.h index a66043ac23e..970d6c877f1 100644 --- a/src/mongo/db/repl/replication_coordinator_impl.h +++ b/src/mongo/db/repl/replication_coordinator_impl.h @@ -35,7 +35,7 @@ #include <vector> #include "mongo/base/status.h" -#include "mongo/bson/optime.h" +#include "mongo/bson/timestamp.h" #include "mongo/db/service_context.h" #include "mongo/db/repl/member_state.h" #include "mongo/db/repl/replica_set_config.h" @@ -110,7 +110,7 @@ namespace repl { virtual ReplicationCoordinator::StatusAndDuration awaitReplication( const OperationContext* txn, - const OpTime& ts, + const Timestamp& ts, const WriteConcernOptions& writeConcern); virtual ReplicationCoordinator::StatusAndDuration awaitReplicationOfLastOpForClient( @@ -135,15 +135,15 @@ namespace repl { virtual bool shouldIgnoreUniqueIndex(const IndexDescriptor* idx); - virtual Status setLastOptimeForSlave(const OID& rid, const OpTime& ts); + virtual Status setLastOptimeForSlave(const OID& rid, const Timestamp& ts); - virtual void setMyLastOptime(const OpTime& ts); + virtual void setMyLastOptime(const Timestamp& ts); virtual void resetMyLastOptime(); virtual void setMyHeartbeatMessage(const std::string& msg); - virtual OpTime getMyLastOptime() const; + virtual Timestamp getMyLastOptime() const; virtual OID getElectionId(); @@ -208,7 +208,7 @@ namespace repl { virtual bool buildsIndexes(); - virtual std::vector<HostAndPort> getHostsWrittenTo(const OpTime& op); + virtual std::vector<HostAndPort> getHostsWrittenTo(const Timestamp& op); virtual std::vector<HostAndPort> getOtherNodesInReplSet() const; @@ -226,7 +226,7 @@ namespace repl { virtual bool shouldChangeSyncSource(const HostAndPort& currentSource); - virtual OpTime getLastCommittedOpTime() const; + virtual Timestamp getLastCommittedOpTime() const; // ================== Test support API =================== @@ -245,7 +245,7 @@ namespace repl { /** * Simple wrapper around _setLastOptime_inlock to make it easier to test. */ - Status setLastOptime_forTest(long long cfgVer, long long memberId, const OpTime& ts); + Status setLastOptime_forTest(long long cfgVer, long long memberId, const Timestamp& ts); private: @@ -296,7 +296,7 @@ namespace repl { // Struct that holds information about nodes in this replication group, mainly used for // tracking replication progress for write concern satisfaction. struct SlaveInfo { - OpTime opTime; // Our last known OpTime that this slave has replicated to. + Timestamp opTime; // Our last known OpTime that this slave has replicated to. HostAndPort hostAndPort; // Client address of the slave. int memberId; // Id of the node in the replica set config, or -1 if we're not a replSet. OID rid; // RID of the node. @@ -331,7 +331,7 @@ namespace repl { * and wakes up any threads waiting for replication that now have their write concern * satisfied. */ - void _updateSlaveInfoOptime_inlock(SlaveInfo* slaveInfo, OpTime ts); + void _updateSlaveInfoOptime_inlock(SlaveInfo* slaveInfo, Timestamp ts); /** * Returns the index into _slaveInfo where data corresponding to ourself is stored. @@ -430,25 +430,25 @@ namespace repl { const Timer* timer, boost::unique_lock<boost::mutex>* lock, const OperationContext* txn, - const OpTime& ts, + const Timestamp& ts, const WriteConcernOptions& writeConcern); /* * Returns true if the given writeConcern is satisfied up to "optime" or is unsatisfiable. */ - bool _doneWaitingForReplication_inlock(const OpTime& opTime, + bool _doneWaitingForReplication_inlock(const Timestamp& opTime, const WriteConcernOptions& writeConcern); /** * Helper for _doneWaitingForReplication_inlock that takes an integer write concern. */ - bool _haveNumNodesReachedOpTime_inlock(const OpTime& opTime, int numNodes); + bool _haveNumNodesReachedOpTime_inlock(const Timestamp& opTime, int numNodes); /** * Helper for _doneWaitingForReplication_inlock that takes a tag pattern representing a * named write concern mode. */ - bool _haveTaggedNodesReachedOpTime_inlock(const OpTime& opTime, + bool _haveTaggedNodesReachedOpTime_inlock(const Timestamp& opTime, const ReplicaSetTagPattern& tagPattern); Status _checkIfWriteConcernCanBeSatisfied_inlock( @@ -479,7 +479,7 @@ namespace repl { int _getMyId_inlock() const; - OpTime _getMyLastOptime_inlock() const; + Timestamp _getMyLastOptime_inlock() const; /** @@ -514,7 +514,7 @@ namespace repl { * "isRollbackAllowed" is true. */ void _setMyLastOptime_inlock(boost::unique_lock<boost::mutex>* lock, - const OpTime& ts, + const Timestamp& ts, bool isRollbackAllowed); /** @@ -541,7 +541,7 @@ namespace repl { * * Updates the optime associated with the member at "memberIndex" in our config. */ - void _updateOpTimeFromHeartbeat_inlock(int memberIndex, OpTime optime); + void _updateOpTimeFromHeartbeat_inlock(int memberIndex, Timestamp optime); /** * Starts a heartbeat for each member in the current config. Called within the executor @@ -591,7 +591,7 @@ namespace repl { */ void _finishLoadLocalConfig(const ReplicationExecutor::CallbackData& cbData, const ReplicaSetConfig& localConfig, - const StatusWith<OpTime>& lastOpTimeStatus); + const StatusWith<Timestamp>& lastOpTimeStatus); /** * Callback that finishes the work of processReplSetInitiate() inside the replication @@ -888,7 +888,7 @@ namespace repl { AtomicUInt32 _canServeNonLocalReads; // (S) // OpTime of the latest committed operation. Matches the concurrency level of _slaveInfo. - OpTime _lastCommittedOpTime; // (M) + Timestamp _lastCommittedOpTime; // (M) }; } // namespace repl diff --git a/src/mongo/db/repl/replication_coordinator_impl_elect.cpp b/src/mongo/db/repl/replication_coordinator_impl_elect.cpp index 57d150b8e48..dffe1e3793f 100644 --- a/src/mongo/db/repl/replication_coordinator_impl_elect.cpp +++ b/src/mongo/db/repl/replication_coordinator_impl_elect.cpp @@ -120,9 +120,9 @@ namespace { invariant(_rsConfig.getMemberAt(_selfIndex).isElectable()); - OpTime lastOpTimeApplied(_getMyLastOptime_inlock()); + Timestamp lastOpTimeApplied(_getMyLastOptime_inlock()); - if (lastOpTimeApplied == OpTime()) { + if (lastOpTimeApplied == Timestamp()) { log() << "not trying to elect self, " "do not yet have a complete set of data from any point in time"; return; diff --git a/src/mongo/db/repl/replication_coordinator_impl_elect_test.cpp b/src/mongo/db/repl/replication_coordinator_impl_elect_test.cpp index b7674970363..5ea30666316 100644 --- a/src/mongo/db/repl/replication_coordinator_impl_elect_test.cpp +++ b/src/mongo/db/repl/replication_coordinator_impl_elect_test.cpp @@ -99,7 +99,7 @@ namespace { net->scheduleResponse(noi, net->now(), makeResponseStatus( BSON("ok" << 1 << "fresher" << false << - "opTime" << Date_t(OpTime(0, 0).asDate()) << + "opTime" << Date_t(Timestamp(0, 0).asULL()) << "veto" << false))); } else { @@ -149,7 +149,7 @@ namespace { ASSERT(getReplCoord()->getMemberState().secondary()) << getReplCoord()->getMemberState().toString(); - getReplCoord()->setMyLastOptime(OpTime(10,0)); + getReplCoord()->setMyLastOptime(Timestamp(10,0)); NetworkInterfaceMock* net = getNet(); net->enterNetwork(); @@ -210,7 +210,7 @@ namespace { )); assertStartSuccess(configObj, HostAndPort("node1", 12345)); OperationContextNoop txn; - getReplCoord()->setMyLastOptime(OpTime (100, 1)); + getReplCoord()->setMyLastOptime(Timestamp (100, 1)); ASSERT(getReplCoord()->setFollowerMode(MemberState::RS_SECONDARY)); startCapturingLogMessages(); simulateSuccessfulElection(); @@ -231,7 +231,7 @@ namespace { ReplicaSetConfig config = assertMakeRSConfig(configObj); OperationContextNoop txn; - OpTime time1(100, 1); + Timestamp time1(100, 1); getReplCoord()->setMyLastOptime(time1); ASSERT(getReplCoord()->setFollowerMode(MemberState::RS_SECONDARY)); @@ -278,7 +278,7 @@ namespace { ReplicaSetConfig config = assertMakeRSConfig(configObj); OperationContextNoop txn; - OpTime time1(100, 1); + Timestamp time1(100, 1); getReplCoord()->setMyLastOptime(time1); ASSERT(getReplCoord()->setFollowerMode(MemberState::RS_SECONDARY)); @@ -326,7 +326,7 @@ namespace { BSON("_id" << 5 << "host" << "node5:12345") )), HostAndPort("node1", 12345)); ASSERT(getReplCoord()->setFollowerMode(MemberState::RS_SECONDARY)); - getReplCoord()->setMyLastOptime(OpTime(100,0)); + getReplCoord()->setMyLastOptime(Timestamp(100,0)); // set hbreconfig to hang while in progress getExternalState()->setStoreLocalConfigDocumentToHang(true); diff --git a/src/mongo/db/repl/replication_coordinator_impl_heartbeat.cpp b/src/mongo/db/repl/replication_coordinator_impl_heartbeat.cpp index 9ec647d8dee..ab278b5c7b7 100644 --- a/src/mongo/db/repl/replication_coordinator_impl_heartbeat.cpp +++ b/src/mongo/db/repl/replication_coordinator_impl_heartbeat.cpp @@ -126,7 +126,7 @@ namespace { const bool isUnauthorized = (responseStatus.code() == ErrorCodes::Unauthorized) || (responseStatus.code() == ErrorCodes::AuthenticationFailed); const Date_t now = _replExecutor.now(); - const OpTime lastApplied = getMyLastOptime(); // Locks and unlocks _mutex. + const Timestamp lastApplied = getMyLastOptime(); // Locks and unlocks _mutex. Milliseconds networkTime(0); StatusWith<ReplSetHeartbeatResponse> hbStatusResponse(hbResponse); @@ -177,7 +177,7 @@ namespace { } void ReplicationCoordinatorImpl::_updateOpTimeFromHeartbeat_inlock(int targetIndex, - OpTime optime) { + Timestamp optime) { invariant(_selfIndex >= 0); invariant(targetIndex >= 0); diff --git a/src/mongo/db/repl/replication_coordinator_impl_reconfig_test.cpp b/src/mongo/db/repl/replication_coordinator_impl_reconfig_test.cpp index 7b1b8f8ff20..f29a830bb6f 100644 --- a/src/mongo/db/repl/replication_coordinator_impl_reconfig_test.cpp +++ b/src/mongo/db/repl/replication_coordinator_impl_reconfig_test.cpp @@ -92,7 +92,7 @@ namespace { BSON("_id" << 2 << "host" << "node2:12345") )), HostAndPort("node1", 12345)); ASSERT(getReplCoord()->setFollowerMode(MemberState::RS_SECONDARY)); - getReplCoord()->setMyLastOptime(OpTime(100, 0)); + getReplCoord()->setMyLastOptime(Timestamp(100, 0)); simulateSuccessfulElection(); BSONObjBuilder result; @@ -123,7 +123,7 @@ namespace { BSON("_id" << 2 << "host" << "node2:12345") )), HostAndPort("node1", 12345)); ASSERT(getReplCoord()->setFollowerMode(MemberState::RS_SECONDARY)); - getReplCoord()->setMyLastOptime(OpTime(100, 0)); + getReplCoord()->setMyLastOptime(Timestamp(100, 0)); simulateSuccessfulElection(); BSONObjBuilder result; @@ -151,7 +151,7 @@ namespace { BSON("_id" << 2 << "host" << "node2:12345") )), HostAndPort("node1", 12345)); ASSERT(getReplCoord()->setFollowerMode(MemberState::RS_SECONDARY)); - getReplCoord()->setMyLastOptime(OpTime(100, 0)); + getReplCoord()->setMyLastOptime(Timestamp(100, 0)); simulateSuccessfulElection(); BSONObjBuilder result; @@ -207,7 +207,7 @@ namespace { BSON("_id" << 2 << "host" << "node2:12345") )), HostAndPort("node1", 12345)); ASSERT(getReplCoord()->setFollowerMode(MemberState::RS_SECONDARY)); - getReplCoord()->setMyLastOptime(OpTime(100, 0)); + getReplCoord()->setMyLastOptime(Timestamp(100, 0)); simulateSuccessfulElection(); Status status(ErrorCodes::InternalError, "Not Set"); @@ -243,7 +243,7 @@ namespace { BSON("_id" << 2 << "host" << "node2:12345") )), HostAndPort("node1", 12345)); ASSERT(getReplCoord()->setFollowerMode(MemberState::RS_SECONDARY)); - getReplCoord()->setMyLastOptime(OpTime(100, 0)); + getReplCoord()->setMyLastOptime(Timestamp(100, 0)); simulateSuccessfulElection(); Status status(ErrorCodes::InternalError, "Not Set"); @@ -281,7 +281,7 @@ namespace { BSON("_id" << 2 << "host" << "node2:12345") )), HostAndPort("node1", 12345)); ASSERT(getReplCoord()->setFollowerMode(MemberState::RS_SECONDARY)); - getReplCoord()->setMyLastOptime(OpTime(100, 0)); + getReplCoord()->setMyLastOptime(Timestamp(100, 0)); simulateSuccessfulElection(); Status status(ErrorCodes::InternalError, "Not Set"); @@ -316,7 +316,7 @@ namespace { init(); start(HostAndPort("node1", 12345)); ASSERT(getReplCoord()->setFollowerMode(MemberState::RS_SECONDARY)); - getReplCoord()->setMyLastOptime(OpTime(100, 0)); + getReplCoord()->setMyLastOptime(Timestamp(100, 0)); // initiate Status status(ErrorCodes::InternalError, "Not Set"); @@ -354,7 +354,7 @@ namespace { BSON("_id" << 2 << "host" << "node2:12345"))), HostAndPort("node1", 12345)); ASSERT(getReplCoord()->setFollowerMode(MemberState::RS_SECONDARY)); - getReplCoord()->setMyLastOptime(OpTime(100, 0)); + getReplCoord()->setMyLastOptime(Timestamp(100, 0)); simulateSuccessfulElection(); Status status(ErrorCodes::InternalError, "Not Set"); @@ -391,7 +391,7 @@ namespace { BSON("_id" << 2 << "host" << "node2:12345") )), HostAndPort("node1", 12345)); ASSERT(getReplCoord()->setFollowerMode(MemberState::RS_SECONDARY)); - getReplCoord()->setMyLastOptime(OpTime(100,0)); + getReplCoord()->setMyLastOptime(Timestamp(100,0)); simulateSuccessfulElection(); ASSERT_TRUE(getReplCoord()->getMemberState().primary()); @@ -443,7 +443,7 @@ namespace { BSON("_id" << 2 << "host" << "node2:12345") )), HostAndPort("node1", 12345)); ASSERT(getReplCoord()->setFollowerMode(MemberState::RS_SECONDARY)); - getReplCoord()->setMyLastOptime(OpTime(100,0)); + getReplCoord()->setMyLastOptime(Timestamp(100,0)); simulateSuccessfulElection(); ASSERT_TRUE(getReplCoord()->getMemberState().primary()); @@ -502,7 +502,7 @@ namespace { BSON("_id" << 2 << "host" << "node2:12345") )), HostAndPort("node1", 12345)); ASSERT(getReplCoord()->setFollowerMode(MemberState::RS_SECONDARY)); - getReplCoord()->setMyLastOptime(OpTime(100, 0)); + getReplCoord()->setMyLastOptime(Timestamp(100, 0)); // fail before forced BSONObjBuilder result; diff --git a/src/mongo/db/repl/replication_coordinator_impl_test.cpp b/src/mongo/db/repl/replication_coordinator_impl_test.cpp index 550ef262f62..d7fcffc6ed6 100644 --- a/src/mongo/db/repl/replication_coordinator_impl_test.cpp +++ b/src/mongo/db/repl/replication_coordinator_impl_test.cpp @@ -406,7 +406,7 @@ namespace { TEST_F(ReplCoordTest, AwaitReplicationNoReplEnabled) { init(""); OperationContextNoop txn; - OpTime time(100, 1); + Timestamp time(100, 1); WriteConcernOptions writeConcern; writeConcern.wTimeout = WriteConcernOptions::kNoWaiting; @@ -424,7 +424,7 @@ namespace { settings.master = true; init(settings); OperationContextNoop txn; - OpTime time(100, 1); + Timestamp time(100, 1); WriteConcernOptions writeConcern; writeConcern.wTimeout = WriteConcernOptions::kNoWaiting; @@ -449,7 +449,7 @@ namespace { HostAndPort("node1", 12345)); OperationContextNoop txn; - OpTime time(100, 1); + Timestamp time(100, 1); WriteConcernOptions writeConcern; writeConcern.wTimeout = WriteConcernOptions::kNoWaiting; @@ -462,7 +462,7 @@ namespace { ASSERT_EQUALS(ErrorCodes::NotMaster, statusAndDur.status); ASSERT(getReplCoord()->setFollowerMode(MemberState::RS_SECONDARY)); - getReplCoord()->setMyLastOptime(OpTime(100, 0)); + getReplCoord()->setMyLastOptime(Timestamp(100, 0)); simulateSuccessfulElection(); statusAndDur = getReplCoord()->awaitReplication(&txn, time, writeConcern); @@ -480,11 +480,11 @@ namespace { BSON("host" << "node4:12345" << "_id" << 3))), HostAndPort("node1", 12345)); ASSERT(getReplCoord()->setFollowerMode(MemberState::RS_SECONDARY)); - getReplCoord()->setMyLastOptime(OpTime(100, 0)); + getReplCoord()->setMyLastOptime(Timestamp(100, 0)); simulateSuccessfulElection(); - OpTime time1(100, 1); - OpTime time2(100, 2); + Timestamp time1(100, 1); + Timestamp time2(100, 2); WriteConcernOptions writeConcern; writeConcern.wTimeout = WriteConcernOptions::kNoWaiting; @@ -555,11 +555,11 @@ namespace { "multiDCAndRack" << BSON("dc" << 2 << "rack" << 3)))), HostAndPort("node0")); ASSERT(getReplCoord()->setFollowerMode(MemberState::RS_SECONDARY)); - getReplCoord()->setMyLastOptime(OpTime(100, 0)); + getReplCoord()->setMyLastOptime(Timestamp(100, 0)); simulateSuccessfulElection(); - OpTime time1(100, 1); - OpTime time2(100, 2); + Timestamp time1(100, 1); + Timestamp time2(100, 2); // Test invalid write concern WriteConcernOptions invalidWriteConcern; @@ -643,7 +643,7 @@ namespace { _result(ReplicationCoordinator::StatusAndDuration( Status::OK(), ReplicationCoordinator::Milliseconds(0))) {} - void setOpTime(const OpTime& ot) { + void setOpTime(const Timestamp& ot) { _optime = ot; } @@ -681,7 +681,7 @@ namespace { ReplicationCoordinatorImpl* _replCoord; bool _finished; - OpTime _optime; + Timestamp _optime; WriteConcernOptions _writeConcern; ReplicationCoordinator::StatusAndDuration _result; boost::scoped_ptr<boost::thread> _thread; @@ -697,13 +697,13 @@ namespace { BSON("host" << "node3:12345" << "_id" << 2))), HostAndPort("node1", 12345)); ASSERT(getReplCoord()->setFollowerMode(MemberState::RS_SECONDARY)); - getReplCoord()->setMyLastOptime(OpTime(100, 0)); + getReplCoord()->setMyLastOptime(Timestamp(100, 0)); simulateSuccessfulElection(); ReplicationAwaiter awaiter(getReplCoord(), &txn); - OpTime time1(100, 1); - OpTime time2(100, 2); + Timestamp time1(100, 1); + Timestamp time2(100, 2); WriteConcernOptions writeConcern; writeConcern.wTimeout = WriteConcernOptions::kNoTimeout; @@ -748,13 +748,13 @@ namespace { BSON("host" << "node3:12345" << "_id" << 2))), HostAndPort("node1", 12345)); ASSERT(getReplCoord()->setFollowerMode(MemberState::RS_SECONDARY)); - getReplCoord()->setMyLastOptime(OpTime(100, 0)); + getReplCoord()->setMyLastOptime(Timestamp(100, 0)); simulateSuccessfulElection(); ReplicationAwaiter awaiter(getReplCoord(), &txn); - OpTime time1(100, 1); - OpTime time2(100, 2); + Timestamp time1(100, 1); + Timestamp time2(100, 2); WriteConcernOptions writeConcern; writeConcern.wTimeout = 50; @@ -781,13 +781,13 @@ namespace { BSON("host" << "node3:12345" << "_id" << 2))), HostAndPort("node1", 12345)); ASSERT(getReplCoord()->setFollowerMode(MemberState::RS_SECONDARY)); - getReplCoord()->setMyLastOptime(OpTime(100, 0)); + getReplCoord()->setMyLastOptime(Timestamp(100, 0)); simulateSuccessfulElection(); ReplicationAwaiter awaiter(getReplCoord(), &txn); - OpTime time1(100, 1); - OpTime time2(100, 2); + Timestamp time1(100, 1); + Timestamp time2(100, 2); WriteConcernOptions writeConcern; writeConcern.wTimeout = WriteConcernOptions::kNoTimeout; @@ -817,13 +817,13 @@ namespace { BSON("host" << "node3:12345" << "_id" << 2))), HostAndPort("node1", 12345)); ASSERT(getReplCoord()->setFollowerMode(MemberState::RS_SECONDARY)); - getReplCoord()->setMyLastOptime(OpTime(100, 0)); + getReplCoord()->setMyLastOptime(Timestamp(100, 0)); simulateSuccessfulElection(); ReplicationAwaiter awaiter(getReplCoord(), &txn); - OpTime time1(100, 1); - OpTime time2(100, 2); + Timestamp time1(100, 1); + Timestamp time2(100, 2); WriteConcernOptions writeConcern; writeConcern.wTimeout = WriteConcernOptions::kNoTimeout; @@ -893,13 +893,13 @@ namespace { BSON("_id" << 2 << "host" << "node3"))), HostAndPort("node1")); ASSERT(getReplCoord()->setFollowerMode(MemberState::RS_SECONDARY)); - getReplCoord()->setMyLastOptime(OpTime(100, 0)); + getReplCoord()->setMyLastOptime(Timestamp(100, 0)); simulateSuccessfulElection(); ReplicationAwaiter awaiter(getReplCoord(), &txn); - OpTime time1(100, 1); - OpTime time2(100, 2); + Timestamp time1(100, 1); + Timestamp time2(100, 2); WriteConcernOptions writeConcern; writeConcern.wTimeout = WriteConcernOptions::kNoTimeout; @@ -947,7 +947,7 @@ namespace { TEST_F(StepDownTest, StepDownNotPrimary) { OperationContextReplMock txn; - OpTime optime1(100, 1); + Timestamp optime1(100, 1); // All nodes are caught up getReplCoord()->setMyLastOptime(optime1); ASSERT_OK(getReplCoord()->setLastOptime_forTest(1, 1, optime1)); @@ -960,7 +960,7 @@ namespace { TEST_F(StepDownTest, StepDownTimeoutAcquiringGlobalLock) { OperationContextReplMock txn; - OpTime optime1(100, 1); + Timestamp optime1(100, 1); // All nodes are caught up getReplCoord()->setMyLastOptime(optime1); ASSERT_OK(getReplCoord()->setLastOptime_forTest(1, 1, optime1)); @@ -978,7 +978,7 @@ namespace { TEST_F(StepDownTest, StepDownNoWaiting) { OperationContextReplMock txn; - OpTime optime1(100, 1); + Timestamp optime1(100, 1); // All nodes are caught up getReplCoord()->setMyLastOptime(optime1); ASSERT_OK(getReplCoord()->setLastOptime_forTest(1, 1, optime1)); @@ -1114,8 +1114,8 @@ namespace { TEST_F(StepDownTest, StepDownNotCaughtUp) { OperationContextReplMock txn; - OpTime optime1(100, 1); - OpTime optime2(100, 2); + Timestamp optime1(100, 1); + Timestamp optime2(100, 2); // No secondary is caught up getReplCoord()->setMyLastOptime(optime2); ASSERT_OK(getReplCoord()->setLastOptime_forTest(1, 1, optime1)); @@ -1156,8 +1156,8 @@ namespace { TEST_F(StepDownTest, StepDownCatchUp) { OperationContextReplMock txn; - OpTime optime1(100, 1); - OpTime optime2(100, 2); + Timestamp optime1(100, 1); + Timestamp optime2(100, 2); // No secondary is caught up getReplCoord()->setMyLastOptime(optime2); ASSERT_OK(getReplCoord()->setLastOptime_forTest(1, 1, optime1)); @@ -1204,8 +1204,8 @@ namespace { TEST_F(StepDownTest, InterruptStepDown) { OperationContextNoopWithInterrupt txn; - OpTime optime1(100, 1); - OpTime optime2(100, 2); + Timestamp optime1(100, 1); + Timestamp optime2(100, 2); // No secondary is caught up getReplCoord()->setMyLastOptime(optime2); ASSERT_OK(getReplCoord()->setLastOptime_forTest(1, 1, optime1)); @@ -1278,9 +1278,9 @@ namespace { BSON("_id" << 1 << "host" << "test2:1234") << BSON("_id" << 2 << "host" << "test3:1234"))), HostAndPort("test1", 1234)); - OpTime optime1(100, 1); - OpTime optime2(100, 2); - OpTime optime3(2, 1); + Timestamp optime1(100, 1); + Timestamp optime2(100, 2); + Timestamp optime3(2, 1); getReplCoord()->setMyLastOptime(optime1); ASSERT_OK(getReplCoord()->setLastOptime_forTest(1, 1, optime2)); ASSERT_OK(getReplCoord()->setLastOptime_forTest(1, 2, optime3)); @@ -1299,12 +1299,12 @@ namespace { long long memberId = entry["memberId"].Number(); memberIds.insert(memberId); if (memberId == 0) { - ASSERT_EQUALS(optime1, entry["optime"]._opTime()); + ASSERT_EQUALS(optime1, entry["optime"].timestamp()); } else if (memberId == 1) { - ASSERT_EQUALS(optime2, entry["optime"]._opTime()); + ASSERT_EQUALS(optime2, entry["optime"].timestamp()); } else { ASSERT_EQUALS(2, memberId); - ASSERT_EQUALS(optime3, entry["optime"]._opTime()); + ASSERT_EQUALS(optime3, entry["optime"].timestamp()); } } ASSERT_EQUALS(3U, memberIds.size()); // Make sure we saw all 3 nodes @@ -1321,7 +1321,7 @@ namespace { HostAndPort("test2", 1234)); OperationContextNoop txn; getReplCoord()->setFollowerMode(MemberState::RS_SECONDARY); - getReplCoord()->setMyLastOptime(OpTime(100, 0)); + getReplCoord()->setMyLastOptime(Timestamp(100, 0)); // Can't unset maintenance mode if it was never set to begin with. Status status = getReplCoord()->setMaintenanceMode(false); @@ -1404,8 +1404,8 @@ namespace { HostAndPort("node1", 12345)); OperationContextNoop txn; - OpTime time1(100, 1); - OpTime time2(100, 2); + Timestamp time1(100, 1); + Timestamp time2(100, 2); getReplCoord()->setMyLastOptime(time2); ASSERT_OK(getReplCoord()->setLastOptime_forTest(2, 1, time1)); @@ -1434,8 +1434,8 @@ namespace { OperationContextNoop txn; OID client = OID::gen(); - OpTime time1(100, 1); - OpTime time2(100, 2); + Timestamp time1(100, 1); + Timestamp time2(100, 2); getExternalState()->setClientHostAndPort(clientHost); HandshakeArgs handshake; @@ -1579,12 +1579,12 @@ namespace { BSON("host" << "node3:12345" << "_id" << 2))), HostAndPort("node1", 12345)); ASSERT(getReplCoord()->setFollowerMode(MemberState::RS_SECONDARY)); - getReplCoord()->setMyLastOptime(OpTime(100, 0)); + getReplCoord()->setMyLastOptime(Timestamp(100, 0)); simulateSuccessfulElection(); - OpTime time1(100, 1); - OpTime time2(100, 2); - OpTime staleTime(10, 0); + Timestamp time1(100, 1); + Timestamp time2(100, 2); + Timestamp staleTime(10, 0); getReplCoord()->setMyLastOptime(time1); WriteConcernOptions writeConcern; @@ -1678,10 +1678,10 @@ namespace { BSON("host" << "node3:12345" << "_id" << 2))), HostAndPort("node1", 12345)); ASSERT(getReplCoord()->setFollowerMode(MemberState::RS_SECONDARY)); - getReplCoord()->setMyLastOptime(OpTime(100, 2)); + getReplCoord()->setMyLastOptime(Timestamp(100, 2)); simulateSuccessfulElection(); - OpTime time(100, 2); + Timestamp time(100, 2); // 3 nodes waiting for time WriteConcernOptions writeConcern; @@ -1748,10 +1748,10 @@ namespace { BSON("host" << "node3:12345" << "_id" << 2))), HostAndPort("node1", 12345)); ASSERT(getReplCoord()->setFollowerMode(MemberState::RS_SECONDARY)); - getReplCoord()->setMyLastOptime(OpTime(100, 2)); + getReplCoord()->setMyLastOptime(Timestamp(100, 2)); simulateSuccessfulElection(); - OpTime time(100, 2); + Timestamp time(100, 2); // 3 nodes waiting for time WriteConcernOptions writeConcern; @@ -1805,10 +1805,10 @@ namespace { BSON("host" << "node5:12345" << "_id" << 4))), HostAndPort("node1", 12345)); ASSERT(getReplCoord()->setFollowerMode(MemberState::RS_SECONDARY)); - getReplCoord()->setMyLastOptime(OpTime(100, 1)); + getReplCoord()->setMyLastOptime(Timestamp(100, 1)); simulateSuccessfulElection(); - OpTime time(100, 2); + Timestamp time(100, 2); ASSERT_OK(getReplCoord()->setLastOptime_forTest(2, 1, time)); ASSERT_OK(getReplCoord()->setLastOptime_forTest(2, 2, time)); @@ -1878,7 +1878,7 @@ namespace { "arbiterOnly" << true))), HostAndPort("node1", 12345)); ASSERT(getReplCoord()->setFollowerMode(MemberState::RS_SECONDARY)); - OpTime time(100, 0); + Timestamp time(100, 0); getReplCoord()->setMyLastOptime(time); simulateSuccessfulElection(); @@ -1919,8 +1919,8 @@ namespace { "arbiterOnly" << true))), HostAndPort("node1", 12345)); ASSERT(getReplCoord()->setFollowerMode(MemberState::RS_SECONDARY)); - OpTime zero(0, 0); - OpTime time(100, 0); + Timestamp zero(0, 0); + Timestamp time(100, 0); getReplCoord()->setMyLastOptime(time); simulateSuccessfulElection(); @@ -1935,7 +1935,7 @@ namespace { // Set a new, later OpTime. - OpTime newTime = OpTime(100, 1); + Timestamp newTime = Timestamp(100, 1); getReplCoord()->setMyLastOptime(newTime); ASSERT_OK(getReplCoord()->setLastOptime_forTest(2, 3, newTime)); ASSERT_EQUALS(time, getReplCoord()->getLastCommittedOpTime()); diff --git a/src/mongo/db/repl/replication_coordinator_mock.cpp b/src/mongo/db/repl/replication_coordinator_mock.cpp index e0efd70392e..99bda38afc0 100644 --- a/src/mongo/db/repl/replication_coordinator_mock.cpp +++ b/src/mongo/db/repl/replication_coordinator_mock.cpp @@ -81,7 +81,7 @@ namespace repl { ReplicationCoordinator::StatusAndDuration ReplicationCoordinatorMock::awaitReplication( const OperationContext* txn, - const OpTime& ts, + const Timestamp& ts, const WriteConcernOptions& writeConcern) { // TODO return StatusAndDuration(Status::OK(), Milliseconds(0)); @@ -123,7 +123,7 @@ namespace repl { return false; } - Status ReplicationCoordinatorMock::setLastOptimeForSlave(const OID& rid, const OpTime& ts) { + Status ReplicationCoordinatorMock::setLastOptimeForSlave(const OID& rid, const Timestamp& ts) { return Status::OK(); } @@ -131,13 +131,13 @@ namespace repl { // TODO } - void ReplicationCoordinatorMock::setMyLastOptime(const OpTime& ts) {} + void ReplicationCoordinatorMock::setMyLastOptime(const Timestamp& ts) {} void ReplicationCoordinatorMock::resetMyLastOptime() {} - OpTime ReplicationCoordinatorMock::getMyLastOptime() const { + Timestamp ReplicationCoordinatorMock::getMyLastOptime() const { // TODO - return OpTime(); + return Timestamp(); } @@ -256,7 +256,7 @@ namespace repl { return true; } - std::vector<HostAndPort> ReplicationCoordinatorMock::getHostsWrittenTo(const OpTime& op) { + std::vector<HostAndPort> ReplicationCoordinatorMock::getHostsWrittenTo(const Timestamp& op) { return std::vector<HostAndPort>(); } @@ -295,8 +295,8 @@ namespace repl { invariant(false); } - OpTime ReplicationCoordinatorMock::getLastCommittedOpTime() const { - return OpTime(); + Timestamp ReplicationCoordinatorMock::getLastCommittedOpTime() const { + return Timestamp(); } } // namespace repl diff --git a/src/mongo/db/repl/replication_coordinator_mock.h b/src/mongo/db/repl/replication_coordinator_mock.h index d0a40f1414c..2ec2b344c34 100644 --- a/src/mongo/db/repl/replication_coordinator_mock.h +++ b/src/mongo/db/repl/replication_coordinator_mock.h @@ -66,7 +66,7 @@ namespace repl { virtual ReplicationCoordinator::StatusAndDuration awaitReplication( const OperationContext* txn, - const OpTime& ts, + const Timestamp& ts, const WriteConcernOptions& writeConcern); virtual ReplicationCoordinator::StatusAndDuration awaitReplicationOfLastOpForClient( @@ -91,15 +91,15 @@ namespace repl { virtual bool shouldIgnoreUniqueIndex(const IndexDescriptor* idx); - virtual Status setLastOptimeForSlave(const OID& rid, const OpTime& ts); + virtual Status setLastOptimeForSlave(const OID& rid, const Timestamp& ts); - virtual void setMyLastOptime(const OpTime& ts); + virtual void setMyLastOptime(const Timestamp& ts); virtual void resetMyLastOptime(); virtual void setMyHeartbeatMessage(const std::string& msg); - virtual OpTime getMyLastOptime() const; + virtual Timestamp getMyLastOptime() const; virtual OID getElectionId(); @@ -164,7 +164,7 @@ namespace repl { virtual bool buildsIndexes(); - virtual std::vector<HostAndPort> getHostsWrittenTo(const OpTime& op); + virtual std::vector<HostAndPort> getHostsWrittenTo(const Timestamp& op); virtual std::vector<HostAndPort> getOtherNodesInReplSet() const; @@ -180,7 +180,7 @@ namespace repl { virtual bool shouldChangeSyncSource(const HostAndPort& currentSource); - virtual OpTime getLastCommittedOpTime() const; + virtual Timestamp getLastCommittedOpTime() const; private: const ReplSettings _settings; diff --git a/src/mongo/db/repl/replication_coordinator_test_fixture.cpp b/src/mongo/db/repl/replication_coordinator_test_fixture.cpp index 2479c5d4724..808bffe819c 100644 --- a/src/mongo/db/repl/replication_coordinator_test_fixture.cpp +++ b/src/mongo/db/repl/replication_coordinator_test_fixture.cpp @@ -191,7 +191,7 @@ namespace { net->scheduleResponse(noi, net->now(), makeResponseStatus( BSON("ok" << 1 << "fresher" << false << - "opTime" << Date_t(OpTime(0, 0).asDate()) << + "opTime" << Date_t(Timestamp(0, 0).asULL()) << "veto" << false))); } else if (request.cmdObj.firstElement().fieldNameStringData() == "replSetElect") { diff --git a/src/mongo/db/repl/replication_info.cpp b/src/mongo/db/repl/replication_info.cpp index 8d064089244..dfba98f56aa 100644 --- a/src/mongo/db/repl/replication_info.cpp +++ b/src/mongo/db/repl/replication_info.cpp @@ -186,7 +186,7 @@ namespace repl { uassert(17347, "Problem reading earliest entry from oplog", Helpers::getSingleton(txn, oplogNS.c_str(), o)); - result.append("earliestOptime", o["ts"]._opTime()); + result.append("earliestOptime", o["ts"].timestamp()); return result.obj(); } } oplogInfoServerStatus; diff --git a/src/mongo/db/repl/replset_commands.cpp b/src/mongo/db/repl/replset_commands.cpp index a86ee0e1379..8f090862013 100644 --- a/src/mongo/db/repl/replset_commands.cpp +++ b/src/mongo/db/repl/replset_commands.cpp @@ -729,7 +729,7 @@ namespace { "numeric type, but found " << typeName(cfgverElement.type()), cfgverElement.isNumber()); parsedArgs.cfgver = cfgverElement.safeNumberLong(); - parsedArgs.opTime = OpTime(cmdObj["opTime"].Date()); + parsedArgs.opTime = Timestamp(cmdObj["opTime"].Date()); status = getGlobalReplicationCoordinator()->processReplSetFresh(parsedArgs, &result); return appendCommandStatus(result, status); diff --git a/src/mongo/db/repl/rs_initialsync.cpp b/src/mongo/db/repl/rs_initialsync.cpp index 6fdf3e72190..1380ae190c9 100644 --- a/src/mongo/db/repl/rs_initialsync.cpp +++ b/src/mongo/db/repl/rs_initialsync.cpp @@ -32,7 +32,7 @@ #include "mongo/db/repl/rs_initialsync.h" -#include "mongo/bson/optime.h" +#include "mongo/bson/timestamp.h" #include "mongo/bson/util/bson_extract.h" #include "mongo/db/auth/authorization_manager.h" #include "mongo/db/auth/authorization_manager_global.h" @@ -207,7 +207,7 @@ namespace { bool _initialSyncApplyOplog( OperationContext* ctx, repl::SyncTail& syncer, OplogReader* r) { - const OpTime startOpTime = getGlobalReplicationCoordinator()->getMyLastOptime(); + const Timestamp startOpTime = getGlobalReplicationCoordinator()->getMyLastOptime(); BSONObj lastOp; try { // It may have been a long time since we last used this connection to @@ -234,7 +234,7 @@ namespace { return false; } - OpTime stopOpTime = lastOp["ts"]._opTime(); + Timestamp stopOpTime = lastOp["ts"].timestamp(); // If we already have what we need then return. if (stopOpTime == startOpTime) @@ -333,7 +333,7 @@ namespace { truncateAndResetOplog(&txn, replCoord, bgsync); OplogReader r; - OpTime now(Milliseconds(curTimeMillis64()).total_seconds(), 0); + Timestamp now(Milliseconds(curTimeMillis64()).total_seconds(), 0); while (r.getHost().empty()) { // We must prime the sync source selector so that it considers all candidates regardless @@ -391,7 +391,7 @@ namespace { std::deque<BSONObj> ops; ops.push_back(lastOp); - OpTime lastOptime = writeOpsToOplog(&txn, ops); + Timestamp lastOptime = writeOpsToOplog(&txn, ops); ReplClientInfo::forClient(txn.getClient()).setLastOp(lastOptime); replCoord->setMyLastOptime(lastOptime); setNewOptime(lastOptime); @@ -443,7 +443,7 @@ namespace { { ScopedTransaction scopedXact(&txn, MODE_IX); AutoGetDb autodb(&txn, "local", MODE_X); - OpTime lastOpTimeWritten(getGlobalReplicationCoordinator()->getMyLastOptime()); + Timestamp lastOpTimeWritten(getGlobalReplicationCoordinator()->getMyLastOptime()); log() << "set minValid=" << lastOpTimeWritten; // Initial sync is now complete. Flag this by setting minValid to the last thing diff --git a/src/mongo/db/repl/rs_rollback.cpp b/src/mongo/db/repl/rs_rollback.cpp index 22870e6de7e..0d1f4f79929 100644 --- a/src/mongo/db/repl/rs_rollback.cpp +++ b/src/mongo/db/repl/rs_rollback.cpp @@ -146,7 +146,7 @@ namespace { set<string> collectionsToResync; - OpTime commonPoint; + Timestamp commonPoint; RecordId commonPointOurDiskloc; int rbid; // remote server's current rollback sequence # @@ -286,9 +286,9 @@ namespace { if (oplogCursor.get() == NULL || !oplogCursor->more()) throw RSFatalException("remote oplog empty or unreadable"); - OpTime ourTime = ourObj["ts"]._opTime(); + Timestamp ourTime = ourObj["ts"].timestamp(); BSONObj theirObj = oplogCursor->nextSafe(); - OpTime theirTime = theirObj["ts"]._opTime(); + Timestamp theirTime = theirObj["ts"].timestamp(); long long diff = static_cast<long long>(ourTime.getSecs()) - static_cast<long long>(theirTime.getSecs()); @@ -328,7 +328,7 @@ namespace { throw RSFatalException("RS100 reached beginning of remote oplog [2]"); } theirObj = oplogCursor->nextSafe(); - theirTime = theirObj["ts"]._opTime(); + theirTime = theirObj["ts"].timestamp(); if (PlanExecutor::ADVANCED != exec->getNext(&ourObj, &ourLoc)) { severe() << "rollback error RS101 reached beginning of local oplog"; @@ -337,7 +337,7 @@ namespace { log() << " ourTime: " << ourTime.toStringLong(); throw RSFatalException("RS101 reached beginning of local oplog [1]"); } - ourTime = ourObj["ts"]._opTime(); + ourTime = ourObj["ts"].timestamp(); } else if (theirTime > ourTime) { if (!oplogCursor->more()) { @@ -349,7 +349,7 @@ namespace { throw RSFatalException("RS100 reached beginning of remote oplog [1]"); } theirObj = oplogCursor->nextSafe(); - theirTime = theirObj["ts"]._opTime(); + theirTime = theirObj["ts"].timestamp(); } else { // theirTime < ourTime @@ -361,7 +361,7 @@ namespace { log() << " ourTime: " << ourTime.toStringLong(); throw RSFatalException("RS101 reached beginning of local oplog [2]"); } - ourTime = ourObj["ts"]._opTime(); + ourTime = ourObj["ts"].timestamp(); } } } @@ -449,7 +449,7 @@ namespace { // we have items we are writing that aren't from a point-in-time. thus best not to come // online until we get to that point in freshness. - OpTime minValid = newMinValid["ts"]._opTime(); + Timestamp minValid = newMinValid["ts"].timestamp(); log() << "minvalid=" << minValid.toStringLong(); setMinValid(txn, minValid); @@ -499,7 +499,7 @@ namespace { err = "can't get minvalid from sync source"; } else { - OpTime minValid = newMinValid["ts"]._opTime(); + Timestamp minValid = newMinValid["ts"].timestamp(); log() << "minvalid=" << minValid.toStringLong(); setMinValid(txn, minValid); } @@ -807,13 +807,13 @@ namespace { } // namespace void syncRollback(OperationContext* txn, - OpTime lastOpTimeApplied, + Timestamp lastOpTimeApplied, OplogReader* oplogreader, ReplicationCoordinator* replCoord) { // check that we are at minvalid, otherwise we cannot rollback as we may be in an // inconsistent state { - OpTime minvalid = getMinValid(txn); + Timestamp minvalid = getMinValid(txn); if( minvalid > lastOpTimeApplied ) { severe() << "need to rollback, but in inconsistent state" << endl; log() << "minvalid: " << minvalid.toString() << " our last optime: " diff --git a/src/mongo/db/repl/rs_rollback.h b/src/mongo/db/repl/rs_rollback.h index 8c5644f816a..55f1b887d92 100644 --- a/src/mongo/db/repl/rs_rollback.h +++ b/src/mongo/db/repl/rs_rollback.h @@ -30,7 +30,7 @@ namespace mongo { class OperationContext; - class OpTime; + class Timestamp; namespace repl { class OplogReader; @@ -59,7 +59,7 @@ namespace repl { */ void syncRollback(OperationContext* txn, - OpTime lastOpTimeWritten, + Timestamp lastOpTimeWritten, OplogReader* oplogreader, ReplicationCoordinator* replCoord); diff --git a/src/mongo/db/repl/sync_source_feedback.h b/src/mongo/db/repl/sync_source_feedback.h index 0e3fccccfac..054f6d6b183 100644 --- a/src/mongo/db/repl/sync_source_feedback.h +++ b/src/mongo/db/repl/sync_source_feedback.h @@ -31,7 +31,7 @@ #include <boost/scoped_ptr.hpp> #include <boost/thread/mutex.hpp> -#include <boost/thread/condition_variable.hpp> +#include <boost/thread/condition.hpp> #include "mongo/client/constants.h" #include "mongo/client/dbclientcursor.h" diff --git a/src/mongo/db/repl/sync_tail.cpp b/src/mongo/db/repl/sync_tail.cpp index 7b6349a1738..40f70579704 100644 --- a/src/mongo/db/repl/sync_tail.cpp +++ b/src/mongo/db/repl/sync_tail.cpp @@ -266,7 +266,7 @@ namespace repl { } // Doles out all the work to the writer pool threads and waits for them to complete - OpTime SyncTail::multiApply(OperationContext* txn, std::deque<BSONObj>& ops) { + Timestamp SyncTail::multiApply(OperationContext* txn, std::deque<BSONObj>& ops) { if (getGlobalServiceContext()->getGlobalStorageEngine()->isMmapV1()) { // Use a ThreadPool to prefetch all the operations in a batch. @@ -297,13 +297,13 @@ namespace repl { applyOps(writerVectors); if (inShutdown()) { - return OpTime(); + return Timestamp(); } if (mustAwaitCommit) { txn->recoveryUnit()->goingToAwaitCommit(); } - OpTime lastOpTime = writeOpsToOplog(txn, ops); + Timestamp lastOpTime = writeOpsToOplog(txn, ops); // Wait for journal before setting last op time if any op in batch had j:true if (mustAwaitCommit) { txn->recoveryUnit()->awaitCommit(); @@ -359,12 +359,12 @@ namespace repl { (*writerVectors)[hash % writerVectors->size()].push_back(*it); } } - void SyncTail::oplogApplication(OperationContext* txn, const OpTime& endOpTime) { + void SyncTail::oplogApplication(OperationContext* txn, const Timestamp& endOpTime) { _applyOplogUntil(txn, endOpTime); } /* applies oplog from "now" until endOpTime using the applier threads for initial sync*/ - void SyncTail::_applyOplogUntil(OperationContext* txn, const OpTime& endOpTime) { + void SyncTail::_applyOplogUntil(OperationContext* txn, const Timestamp& endOpTime) { unsigned long long bytesApplied = 0; unsigned long long entriesApplied = 0; while (true) { @@ -376,7 +376,7 @@ namespace repl { // Check if we reached the end const BSONObj currentOp = ops.back(); - const OpTime currentOpTime = currentOp["ts"]._opTime(); + const Timestamp currentOpTime = currentOp["ts"].timestamp(); // When we reach the end return this batch if (currentOpTime == endOpTime) { @@ -406,7 +406,7 @@ namespace repl { bytesApplied += ops.getSize(); entriesApplied += ops.getDeque().size(); - const OpTime lastOpTime = multiApply(txn, ops.getDeque()); + const Timestamp lastOpTime = multiApply(txn, ops.getDeque()); if (inShutdown()) { return; @@ -442,7 +442,7 @@ namespace { return; } - OpTime minvalid = getMinValid(txn); + Timestamp minvalid = getMinValid(txn); if (minvalid > replCoord->getMyLastOptime()) { return; } @@ -495,7 +495,7 @@ namespace { const int slaveDelaySecs = replCoord->getSlaveDelaySecs().total_seconds(); if (!ops.empty() && slaveDelaySecs > 0) { const BSONObj& lastOp = ops.getDeque().back(); - const unsigned int opTimestampSecs = lastOp["ts"]._opTime().getSecs(); + const unsigned int opTimestampSecs = lastOp["ts"].timestamp().getSecs(); // Stop the batch as the lastOp is too new to be applied. If we continue // on, we can get ops that are way ahead of the delay and this will @@ -527,7 +527,7 @@ namespace { // Set minValid to the last op to be applied in this next batch. // This will cause this node to go into RECOVERING state // if we should crash and restart before updating the oplog - OpTime minValid = lastOp["ts"]._opTime(); + Timestamp minValid = lastOp["ts"].timestamp(); setMinValid(&txn, minValid); multiApply(&txn, ops.getDeque()); } @@ -617,7 +617,7 @@ namespace { // ignore slaveDelay if the box is still initializing. once // it becomes secondary we can worry about it. if( slaveDelaySecs > 0 && replCoord->getMemberState().secondary() ) { - const OpTime ts = lastOp["ts"]._opTime(); + const Timestamp ts = lastOp["ts"].timestamp(); long long a = ts.getSecs(); long long b = time(0); long long lag = b - a; diff --git a/src/mongo/db/repl/sync_tail.h b/src/mongo/db/repl/sync_tail.h index 5932634362e..68e5f546845 100644 --- a/src/mongo/db/repl/sync_tail.h +++ b/src/mongo/db/repl/sync_tail.h @@ -57,7 +57,7 @@ namespace repl { /** * Runs _applyOplogUntil(stopOpTime) */ - virtual void oplogApplication(OperationContext* txn, const OpTime& stopOpTime); + virtual void oplogApplication(OperationContext* txn, const Timestamp& stopOpTime); void oplogApplication(); bool peek(BSONObj* obj); @@ -101,14 +101,14 @@ namespace repl { // Prefetch and write a deque of operations, using the supplied function. // Initial Sync and Sync Tail each use a different function. // Returns the last OpTime applied. - OpTime multiApply(OperationContext* txn, std::deque<BSONObj>& ops); + Timestamp multiApply(OperationContext* txn, std::deque<BSONObj>& ops); /** * Applies oplog entries until reaching "endOpTime". * * NOTE:Will not transition or check states */ - void _applyOplogUntil(OperationContext* txn, const OpTime& endOpTime); + void _applyOplogUntil(OperationContext* txn, const Timestamp& endOpTime); private: BackgroundSyncInterface* _networkQueue; diff --git a/src/mongo/db/repl/topology_coordinator.h b/src/mongo/db/repl/topology_coordinator.h index 1da4aa09642..fe8edd37333 100644 --- a/src/mongo/db/repl/topology_coordinator.h +++ b/src/mongo/db/repl/topology_coordinator.h @@ -41,7 +41,7 @@ namespace mongo { class OperationContext; - class OpTime; + class Timestamp; namespace repl { @@ -117,7 +117,7 @@ namespace repl { /** * Chooses and sets a new sync source, based on our current knowledge of the world. */ - virtual HostAndPort chooseNewSyncSource(Date_t now, const OpTime& lastOpApplied) = 0; + virtual HostAndPort chooseNewSyncSource(Date_t now, const Timestamp& lastOpApplied) = 0; /** * Suppresses selecting "host" as sync source until "until". @@ -185,21 +185,21 @@ namespace repl { // produces a reply to a replSetSyncFrom command virtual void prepareSyncFromResponse(const ReplicationExecutor::CallbackData& data, const HostAndPort& target, - const OpTime& lastOpApplied, + const Timestamp& lastOpApplied, BSONObjBuilder* response, Status* result) = 0; // produce a reply to a replSetFresh command virtual void prepareFreshResponse(const ReplicationCoordinator::ReplSetFreshArgs& args, Date_t now, - OpTime lastOpApplied, + Timestamp lastOpApplied, BSONObjBuilder* response, Status* result) = 0; // produce a reply to a received electCmd virtual void prepareElectResponse(const ReplicationCoordinator::ReplSetElectArgs& args, Date_t now, - OpTime lastOpApplied, + Timestamp lastOpApplied, BSONObjBuilder* response, Status* result) = 0; @@ -207,14 +207,14 @@ namespace repl { virtual Status prepareHeartbeatResponse(Date_t now, const ReplSetHeartbeatArgs& args, const std::string& ourSetName, - const OpTime& lastOpApplied, + const Timestamp& lastOpApplied, ReplSetHeartbeatResponse* response) = 0; // produce a reply to a status request virtual void prepareStatusResponse(const ReplicationExecutor::CallbackData& data, Date_t now, unsigned uptime, - const OpTime& lastOpApplied, + const Timestamp& lastOpApplied, BSONObjBuilder* response, Status* result) = 0; @@ -246,7 +246,7 @@ namespace repl { virtual void updateConfig(const ReplicaSetConfig& newConfig, int selfIndex, Date_t now, - OpTime lastOpApplied) = 0; + Timestamp lastOpApplied) = 0; /** * Prepares a heartbeat request appropriate for sending to "target", assuming the @@ -296,7 +296,7 @@ namespace repl { Milliseconds networkRoundTripTime, const HostAndPort& target, const StatusWith<ReplSetHeartbeatResponse>& hbResponse, - OpTime myLastOpApplied) = 0; + Timestamp myLastOpApplied) = 0; /** * If getRole() == Role::candidate and this node has not voted too recently, updates the @@ -312,7 +312,7 @@ namespace repl { * Exactly one of either processWinElection or processLoseElection must be called if * processHeartbeatResponse returns StartElection, to exit candidate mode. */ - virtual void processWinElection(OID electionId, OpTime electionOpTime) = 0; + virtual void processWinElection(OID electionId, Timestamp electionOpTime) = 0; /** * Performs state updates associated with losing an election. @@ -332,7 +332,7 @@ namespace repl { * * Returns whether or not the step down succeeded. */ - virtual bool stepDown(Date_t until, bool force, OpTime lastOpApplied) = 0; + virtual bool stepDown(Date_t until, bool force, Timestamp lastOpApplied) = 0; /** * Sometimes a request to step down comes in (like via a heartbeat), but we don't have the @@ -348,7 +348,7 @@ namespace repl { * Considers whether or not this node should stand for election, and returns true * if the node has transitioned to candidate role as a result of the call. */ - virtual bool checkShouldStandForElection(Date_t now, const OpTime& lastOpApplied) = 0; + virtual bool checkShouldStandForElection(Date_t now, const Timestamp& lastOpApplied) = 0; /** * Set the outgoing heartbeat message from self diff --git a/src/mongo/db/repl/topology_coordinator_impl.cpp b/src/mongo/db/repl/topology_coordinator_impl.cpp index 7e964ef0d8b..1d019eec216 100644 --- a/src/mongo/db/repl/topology_coordinator_impl.cpp +++ b/src/mongo/db/repl/topology_coordinator_impl.cpp @@ -149,7 +149,7 @@ namespace { } HostAndPort TopologyCoordinatorImpl::chooseNewSyncSource(Date_t now, - const OpTime& lastOpApplied) { + const Timestamp& lastOpApplied) { // If we are primary, then we aren't syncing from anyone (else). if (_iAmPrimary()) { return HostAndPort(); @@ -211,23 +211,23 @@ namespace { // Find primary's oplog time. Reject sync candidates that are more than // maxSyncSourceLagSecs seconds behind. - OpTime primaryOpTime; + Timestamp primaryOpTime; if (_currentPrimaryIndex != -1) { primaryOpTime = _hbdata[_currentPrimaryIndex].getOpTime(); } else { // choose a time that will exclude no candidates, since we don't see a primary - primaryOpTime = OpTime(_maxSyncSourceLagSecs.total_seconds(), 0); + primaryOpTime = Timestamp(_maxSyncSourceLagSecs.total_seconds(), 0); } if (primaryOpTime.getSecs() < static_cast<unsigned int>(_maxSyncSourceLagSecs.total_seconds())) { // erh - I think this means there was just a new election // and we don't yet know the new primary's optime - primaryOpTime = OpTime(_maxSyncSourceLagSecs.total_seconds(), 0); + primaryOpTime = Timestamp(_maxSyncSourceLagSecs.total_seconds(), 0); } - OpTime oldestSyncOpTime(primaryOpTime.getSecs() - _maxSyncSourceLagSecs.total_seconds(), 0); + Timestamp oldestSyncOpTime(primaryOpTime.getSecs() - _maxSyncSourceLagSecs.total_seconds(), 0); int closestIndex = -1; @@ -348,7 +348,7 @@ namespace { void TopologyCoordinatorImpl::prepareSyncFromResponse( const ReplicationExecutor::CallbackData& data, const HostAndPort& target, - const OpTime& lastOpApplied, + const Timestamp& lastOpApplied, BSONObjBuilder* response, Status* result) { if (data.status == ErrorCodes::CallbackCanceled) { @@ -442,7 +442,7 @@ namespace { void TopologyCoordinatorImpl::prepareFreshResponse( const ReplicationCoordinator::ReplSetFreshArgs& args, const Date_t now, - const OpTime lastOpApplied, + const Timestamp lastOpApplied, BSONObjBuilder* response, Status* result) { @@ -478,7 +478,7 @@ namespace { else if (args.opTime < _latestKnownOpTime(lastOpApplied)) { weAreFresher = true; } - response->appendDate("opTime", lastOpApplied.asDate()); + response->appendDate("opTime", lastOpApplied.asULL()); response->append("fresher", weAreFresher); std::string errmsg; @@ -493,7 +493,7 @@ namespace { bool TopologyCoordinatorImpl::_shouldVetoMember( const ReplicationCoordinator::ReplSetFreshArgs& args, const Date_t& now, - const OpTime& lastOpApplied, + const Timestamp& lastOpApplied, std::string* errmsg) const { if (_rsConfig.getConfigVersion() < args.cfgver) { @@ -564,7 +564,7 @@ namespace { void TopologyCoordinatorImpl::prepareElectResponse( const ReplicationCoordinator::ReplSetElectArgs& args, const Date_t now, - const OpTime lastOpApplied, + const Timestamp lastOpApplied, BSONObjBuilder* response, Status* result) { @@ -648,7 +648,7 @@ namespace { Date_t now, const ReplSetHeartbeatArgs& args, const std::string& ourSetName, - const OpTime& lastOpApplied, + const Timestamp& lastOpApplied, ReplSetHeartbeatResponse* response) { if (args.getProtocolVersion() != 1) { @@ -802,7 +802,7 @@ namespace { Milliseconds networkRoundTripTime, const HostAndPort& target, const StatusWith<ReplSetHeartbeatResponse>& hbResponse, - OpTime myLastOpApplied) { + Timestamp myLastOpApplied) { const MemberState originalState = getMemberState(); PingStats& hbStats = _pings[target]; @@ -928,7 +928,7 @@ namespace { int updatedConfigIndex, const MemberState& originalState, Date_t now, - const OpTime& lastOpApplied) { + const Timestamp& lastOpApplied) { // This method has two interrelated responsibilities, performed in two phases. // @@ -970,13 +970,13 @@ namespace { _rsConfig.getMemberAt(_currentPrimaryIndex); const MemberConfig& highestPriorityMember = _rsConfig.getMemberAt(highestPriorityIndex); - const OpTime highestPriorityMemberOptime = highestPriorityIndex == _selfIndex ? + const Timestamp highestPriorityMemberOptime = highestPriorityIndex == _selfIndex ? lastOpApplied : _hbdata[highestPriorityIndex].getOpTime(); if ((highestPriorityMember.getPriority() > currentPrimaryMember.getPriority()) && _isOpTimeCloseEnoughToLatestToElect(highestPriorityMemberOptime, lastOpApplied)) { - const OpTime latestOpTime = _latestKnownOpTime(lastOpApplied); + const Timestamp latestOpTime = _latestKnownOpTime(lastOpApplied); if (_iAmPrimary()) { if (_stepDownPending) { @@ -1050,7 +1050,7 @@ namespace { // If we are also primary, this is a problem. Determine who should step down. if (_iAmPrimary()) { - OpTime remoteElectionTime = _hbdata[remotePrimaryIndex].getElectionTime(); + Timestamp remoteElectionTime = _hbdata[remotePrimaryIndex].getElectionTime(); log() << "another primary seen with election time " << remoteElectionTime << " my election time is " << _electionTime; @@ -1122,7 +1122,7 @@ namespace { } bool TopologyCoordinatorImpl::checkShouldStandForElection( - Date_t now, const OpTime& lastOpApplied) { + Date_t now, const Timestamp& lastOpApplied) { if (_currentPrimaryIndex != -1) { return false; } @@ -1170,8 +1170,8 @@ namespace { } bool TopologyCoordinatorImpl::_isOpTimeCloseEnoughToLatestToElect( - const OpTime& otherOpTime, const OpTime& ourLastOpApplied) const { - const OpTime latestKnownOpTime = _latestKnownOpTime(ourLastOpApplied); + const Timestamp& otherOpTime, const Timestamp& ourLastOpApplied) const { + const Timestamp latestKnownOpTime = _latestKnownOpTime(ourLastOpApplied); // Use addition instead of subtraction to avoid overflow. return otherOpTime.getSecs() + 10 >= (latestKnownOpTime.getSecs()); } @@ -1184,8 +1184,8 @@ namespace { return false; } - OpTime TopologyCoordinatorImpl::_latestKnownOpTime(OpTime ourLastOpApplied) const { - OpTime latest = ourLastOpApplied; + Timestamp TopologyCoordinatorImpl::_latestKnownOpTime(Timestamp ourLastOpApplied) const { + Timestamp latest = ourLastOpApplied; for (std::vector<MemberHeartbeatData>::const_iterator it = _hbdata.begin(); it != _hbdata.end(); @@ -1198,7 +1198,7 @@ namespace { continue; } - OpTime optime = it->getOpTime(); + Timestamp optime = it->getOpTime(); if (optime > latest) { latest = optime; @@ -1221,7 +1221,7 @@ namespace { } int TopologyCoordinatorImpl::_getHighestPriorityElectableIndex( - Date_t now, OpTime lastOpApplied) const { + Date_t now, Timestamp lastOpApplied) const { int maxIndex = -1; for (int currentIndex = 0; currentIndex < _rsConfig.getNumMembers(); currentIndex++) { UnelectableReasonMask reason = currentIndex == _selfIndex ? @@ -1236,7 +1236,7 @@ namespace { } void TopologyCoordinatorImpl::changeMemberState_forTest(const MemberState& newMemberState, - OpTime electionTime) { + Timestamp electionTime) { invariant(_selfIndex != -1); if (newMemberState == getMemberState()) return; @@ -1262,7 +1262,7 @@ namespace { ReplicaSetConfig(), -1, Date_t(), - OpTime()); + Timestamp()); break; default: severe() << "Cannot switch to state " << newMemberState; @@ -1287,7 +1287,7 @@ namespace { if (primaryIndex != -1) { ReplSetHeartbeatResponse hbResponse; hbResponse.setState(MemberState::RS_PRIMARY); - hbResponse.setElectionTime(OpTime()); + hbResponse.setElectionTime(Timestamp()); hbResponse.setOpTime(_hbdata[primaryIndex].getOpTime()); hbResponse.setSyncingTo(""); hbResponse.setHbMsg(""); @@ -1311,7 +1311,7 @@ namespace { const ReplicationExecutor::CallbackData& data, Date_t now, unsigned selfUptime, - const OpTime& lastOpApplied, + const Timestamp& lastOpApplied, BSONObjBuilder* response, Status* result) { if (data.status == ErrorCodes::CallbackCanceled) { @@ -1577,7 +1577,7 @@ namespace { } } - OpTime TopologyCoordinatorImpl::getElectionTime() const { + Timestamp TopologyCoordinatorImpl::getElectionTime() const { return _electionTime; } @@ -1631,7 +1631,7 @@ namespace { void TopologyCoordinatorImpl::updateConfig(const ReplicaSetConfig& newConfig, int selfIndex, Date_t now, - OpTime lastOpApplied) { + Timestamp lastOpApplied) { invariant(_role != Role::candidate); invariant(selfIndex < newConfig.getNumMembers()); @@ -1689,7 +1689,7 @@ namespace { TopologyCoordinatorImpl::UnelectableReasonMask TopologyCoordinatorImpl::_getUnelectableReason( int index, - const OpTime& lastOpApplied) const { + const Timestamp& lastOpApplied) const { invariant(index != _selfIndex); const MemberConfig& memberConfig = _rsConfig.getMemberAt(index); const MemberHeartbeatData& hbData = _hbdata[index]; @@ -1715,7 +1715,7 @@ namespace { TopologyCoordinatorImpl::UnelectableReasonMask TopologyCoordinatorImpl::_getMyUnelectableReason( const Date_t now, - const OpTime lastApplied) const { + const Timestamp lastApplied) const { UnelectableReasonMask result = None; if (lastApplied.isNull()) { @@ -1838,7 +1838,7 @@ namespace { return _pings[host].getMillis(); } - void TopologyCoordinatorImpl::_setElectionTime(const OpTime& newElectionTime) { + void TopologyCoordinatorImpl::_setElectionTime(const Timestamp& newElectionTime) { _electionTime = newElectionTime; } @@ -1913,7 +1913,7 @@ namespace { void TopologyCoordinatorImpl::processWinElection( OID electionId, - OpTime electionOpTime) { + Timestamp electionOpTime) { invariant(_role == Role::candidate); _electionTime = electionOpTime; _electionId = electionId; @@ -1926,7 +1926,7 @@ namespace { void TopologyCoordinatorImpl::processLoseElection() { invariant(_role == Role::candidate); const HostAndPort syncSourceAddress = getSyncSourceAddress(); - _electionTime = OpTime(0, 0); + _electionTime = Timestamp(0, 0); _electionId = OID(); _role = Role::follower; @@ -1937,7 +1937,7 @@ namespace { } } - bool TopologyCoordinatorImpl::stepDown(Date_t until, bool force, OpTime lastOpApplied) { + bool TopologyCoordinatorImpl::stepDown(Date_t until, bool force, Timestamp lastOpApplied) { bool canStepDown = force; for (int i = 0; !canStepDown && i < _rsConfig.getNumMembers(); ++i) { if (i == _selfIndex) { @@ -2051,7 +2051,7 @@ namespace { } invariant(currentMemberIndex != _selfIndex); - OpTime currentOpTime = _hbdata[currentMemberIndex].getOpTime(); + Timestamp currentOpTime = _hbdata[currentMemberIndex].getOpTime(); if (currentOpTime.isNull()) { // Haven't received a heartbeat from the sync source yet, so can't tell if we should // change. diff --git a/src/mongo/db/repl/topology_coordinator_impl.h b/src/mongo/db/repl/topology_coordinator_impl.h index 3e9c9a48c18..e8d0d42a46a 100644 --- a/src/mongo/db/repl/topology_coordinator_impl.h +++ b/src/mongo/db/repl/topology_coordinator_impl.h @@ -31,7 +31,7 @@ #include <string> #include <vector> -#include "mongo/bson/optime.h" +#include "mongo/bson/timestamp.h" #include "mongo/db/repl/member_heartbeat_data.h" #include "mongo/db/repl/member_state.h" #include "mongo/db/repl/replica_set_config.h" @@ -127,7 +127,7 @@ namespace repl { virtual int getMaintenanceCount() const; virtual void setForceSyncSourceIndex(int index); virtual HostAndPort chooseNewSyncSource(Date_t now, - const OpTime& lastOpApplied); + const Timestamp& lastOpApplied); virtual void blacklistSyncSource(const HostAndPort& host, Date_t until); virtual void unblacklistSyncSource(const HostAndPort& host, Date_t now); virtual void clearSyncSourceBlacklist(); @@ -138,28 +138,28 @@ namespace repl { virtual void adjustMaintenanceCountBy(int inc); virtual void prepareSyncFromResponse(const ReplicationExecutor::CallbackData& data, const HostAndPort& target, - const OpTime& lastOpApplied, + const Timestamp& lastOpApplied, BSONObjBuilder* response, Status* result); virtual void prepareFreshResponse(const ReplicationCoordinator::ReplSetFreshArgs& args, Date_t now, - OpTime lastOpApplied, + Timestamp lastOpApplied, BSONObjBuilder* response, Status* result); virtual void prepareElectResponse(const ReplicationCoordinator::ReplSetElectArgs& args, Date_t now, - OpTime lastOpApplied, + Timestamp lastOpApplied, BSONObjBuilder* response, Status* result); virtual Status prepareHeartbeatResponse(Date_t now, const ReplSetHeartbeatArgs& args, const std::string& ourSetName, - const OpTime& lastOpApplied, + const Timestamp& lastOpApplied, ReplSetHeartbeatResponse* response); virtual void prepareStatusResponse(const ReplicationExecutor::CallbackData& data, Date_t now, unsigned uptime, - const OpTime& lastOpApplied, + const Timestamp& lastOpApplied, BSONObjBuilder* response, Status* result); virtual void fillIsMasterForReplSet(IsMasterResponse* response); @@ -167,7 +167,7 @@ namespace repl { virtual void updateConfig(const ReplicaSetConfig& newConfig, int selfIndex, Date_t now, - OpTime lastOpApplied); + Timestamp lastOpApplied); virtual std::pair<ReplSetHeartbeatArgs, Milliseconds> prepareHeartbeatRequest( Date_t now, const std::string& ourSetName, @@ -177,13 +177,13 @@ namespace repl { Milliseconds networkRoundTripTime, const HostAndPort& target, const StatusWith<ReplSetHeartbeatResponse>& hbResponse, - OpTime myLastOpApplied); + Timestamp myLastOpApplied); virtual bool voteForMyself(Date_t now); - virtual void processWinElection(OID electionId, OpTime electionOpTime); + virtual void processWinElection(OID electionId, Timestamp electionOpTime); virtual void processLoseElection(); - virtual bool checkShouldStandForElection(Date_t now, const OpTime& lastOpApplied); + virtual bool checkShouldStandForElection(Date_t now, const Timestamp& lastOpApplied); virtual void setMyHeartbeatMessage(const Date_t now, const std::string& message); - virtual bool stepDown(Date_t until, bool force, OpTime lastOpApplied); + virtual bool stepDown(Date_t until, bool force, Timestamp lastOpApplied); virtual bool stepDownIfPending(); virtual Date_t getStepDownTime() const; @@ -195,10 +195,10 @@ namespace repl { // Changes _memberState to newMemberState. Only for testing. void changeMemberState_forTest(const MemberState& newMemberState, - OpTime electionTime = OpTime(0,0)); + Timestamp electionTime = Timestamp(0,0)); // Sets "_electionTime" to "newElectionTime". Only for testing. - void _setElectionTime(const OpTime& newElectionTime); + void _setElectionTime(const Timestamp& newElectionTime); // Sets _currentPrimaryIndex to the given index. Should only be used in unit tests! // TODO(spencer): Remove this once we can easily call for an election in unit tests to @@ -206,7 +206,7 @@ namespace repl { void _setCurrentPrimaryForTest(int primaryIndex); // Returns _electionTime. Only used in unittests. - OpTime getElectionTime() const; + Timestamp getElectionTime() const; // Returns _electionId. Only used in unittests. OID getElectionId() const; @@ -242,7 +242,7 @@ namespace repl { // If we veto, the errmsg will be filled in with a reason bool _shouldVetoMember(const ReplicationCoordinator::ReplSetFreshArgs& args, const Date_t& now, - const OpTime& lastOpApplied, + const Timestamp& lastOpApplied, std::string* errmsg) const; // Returns the index of the member with the matching id, or -1 if none match. @@ -253,18 +253,18 @@ namespace repl { // Is otherOpTime close enough (within 10 seconds) to the latest known optime to qualify // for an election - bool _isOpTimeCloseEnoughToLatestToElect(const OpTime& otherOpTime, - const OpTime& ourLastOpApplied) const; + bool _isOpTimeCloseEnoughToLatestToElect(const Timestamp& otherOpTime, + const Timestamp& ourLastOpApplied) const; // Returns reason why "self" member is unelectable UnelectableReasonMask _getMyUnelectableReason( const Date_t now, - const OpTime lastOpApplied) const; + const Timestamp lastOpApplied) const; // Returns reason why memberIndex is unelectable UnelectableReasonMask _getUnelectableReason( int memberIndex, - const OpTime& lastOpApplied) const; + const Timestamp& lastOpApplied) const; // Returns the nice text of why the node is unelectable std::string _getUnelectableReasonString(UnelectableReasonMask ur) const; @@ -273,10 +273,10 @@ namespace repl { bool _iAmPrimary() const; // Scans through all members that are 'up' and return the latest known optime. - OpTime _latestKnownOpTime(OpTime ourLastOpApplied) const; + Timestamp _latestKnownOpTime(Timestamp ourLastOpApplied) const; // Scans the electable set and returns the highest priority member index - int _getHighestPriorityElectableIndex(Date_t now, OpTime lastOpApplied) const; + int _getHighestPriorityElectableIndex(Date_t now, Timestamp lastOpApplied) const; // Returns true if "one" member is higher priority than "two" member bool _isMemberHigherPriority(int memberOneIndex, int memberTwoIndex) const; @@ -294,7 +294,7 @@ namespace repl { int updatedConfigIndex, const MemberState& originalState, Date_t now, - const OpTime& lastOpApplied); + const Timestamp& lastOpApplied); /** * Updates _hbdata based on the newConfig, ensuring that every member in the newConfig @@ -325,7 +325,7 @@ namespace repl { // result of an election. OID _electionId; // The time at which the current PRIMARY was elected. - OpTime _electionTime; + Timestamp _electionTime; // the index of the member we currently believe is primary, if one exists, otherwise -1 int _currentPrimaryIndex; diff --git a/src/mongo/db/repl/topology_coordinator_impl_test.cpp b/src/mongo/db/repl/topology_coordinator_impl_test.cpp index 2ec2cd2b89c..ce99ca62ee9 100644 --- a/src/mongo/db/repl/topology_coordinator_impl_test.cpp +++ b/src/mongo/db/repl/topology_coordinator_impl_test.cpp @@ -83,7 +83,7 @@ namespace { needle)); } - void makeSelfPrimary(const OpTime& electionOpTime = OpTime(0,0)) { + void makeSelfPrimary(const Timestamp& electionOpTime = Timestamp(0,0)) { getTopoCoord().changeMemberState_forTest(MemberState::RS_PRIMARY, electionOpTime); getTopoCoord()._setCurrentPrimaryForTest(_selfIndex); } @@ -100,7 +100,7 @@ namespace { void updateConfig(BSONObj cfg, int selfIndex, Date_t now = Date_t(-1), - OpTime lastOp = OpTime()) { + Timestamp lastOp = Timestamp()) { ReplicaSetConfig config; ASSERT_OK(config.initialize(cfg)); ASSERT_OK(config.validate()); @@ -121,9 +121,9 @@ namespace { const HostAndPort& member, const std::string& setName, MemberState memberState, - OpTime electionTime, - OpTime lastOpTimeSender, - OpTime lastOpTimeReceiver) { + Timestamp electionTime, + Timestamp lastOpTimeSender, + Timestamp lastOpTimeReceiver) { return _receiveHeartbeatHelper(Status::OK(), member, setName, @@ -137,14 +137,14 @@ namespace { HeartbeatResponseAction receiveDownHeartbeat( const HostAndPort& member, const std::string& setName, - OpTime lastOpTimeReceiver, + Timestamp lastOpTimeReceiver, ErrorCodes::Error errcode = ErrorCodes::HostUnreachable) { return _receiveHeartbeatHelper(Status(errcode, ""), member, setName, MemberState::RS_UNKNOWN, - OpTime(), - OpTime(), + Timestamp(), + Timestamp(), lastOpTimeReceiver, Milliseconds(0)); } @@ -152,15 +152,15 @@ namespace { HeartbeatResponseAction heartbeatFromMember(const HostAndPort& member, const std::string& setName, MemberState memberState, - OpTime lastOpTimeSender, + Timestamp lastOpTimeSender, Milliseconds roundTripTime = Milliseconds(0)) { return _receiveHeartbeatHelper(Status::OK(), member, setName, memberState, - OpTime(), + Timestamp(), lastOpTimeSender, - OpTime(), + Timestamp(), roundTripTime); } @@ -170,9 +170,9 @@ namespace { const HostAndPort& member, const std::string& setName, MemberState memberState, - OpTime electionTime, - OpTime lastOpTimeSender, - OpTime lastOpTimeReceiver, + Timestamp electionTime, + Timestamp lastOpTimeSender, + Timestamp lastOpTimeReceiver, Milliseconds roundTripTime) { StatusWith<ReplSetHeartbeatResponse> hbResponse = StatusWith<ReplSetHeartbeatResponse>(responseStatus); @@ -204,7 +204,7 @@ namespace { TEST_F(TopoCoordTest, ChooseSyncSourceBasic) { // if we do not have an index in the config, we should get an empty syncsource - HostAndPort newSyncSource = getTopoCoord().chooseNewSyncSource(now()++, OpTime(0,0)); + HostAndPort newSyncSource = getTopoCoord().chooseNewSyncSource(now()++, Timestamp(0,0)); ASSERT_TRUE(newSyncSource.empty()); updateConfig(BSON("_id" << "rs0" << @@ -217,49 +217,49 @@ namespace { setSelfMemberState(MemberState::RS_SECONDARY); // member h2 is the furthest ahead - heartbeatFromMember(HostAndPort("h2"), "rs0", MemberState::RS_SECONDARY, OpTime(1,0)); - heartbeatFromMember(HostAndPort("h3"), "rs0", MemberState::RS_SECONDARY, OpTime(0,0)); + heartbeatFromMember(HostAndPort("h2"), "rs0", MemberState::RS_SECONDARY, Timestamp(1,0)); + heartbeatFromMember(HostAndPort("h3"), "rs0", MemberState::RS_SECONDARY, Timestamp(0,0)); // We start with no sync source ASSERT(getTopoCoord().getSyncSourceAddress().empty()); // Fail due to insufficient number of pings - newSyncSource = getTopoCoord().chooseNewSyncSource(now()++, OpTime(0,0)); + newSyncSource = getTopoCoord().chooseNewSyncSource(now()++, Timestamp(0,0)); ASSERT_EQUALS(getTopoCoord().getSyncSourceAddress(), newSyncSource); ASSERT(getTopoCoord().getSyncSourceAddress().empty()); // Record 2nd round of pings to allow choosing a new sync source; all members equidistant - heartbeatFromMember(HostAndPort("h2"), "rs0", MemberState::RS_SECONDARY, OpTime(1,0)); - heartbeatFromMember(HostAndPort("h3"), "rs0", MemberState::RS_SECONDARY, OpTime(0,0)); + heartbeatFromMember(HostAndPort("h2"), "rs0", MemberState::RS_SECONDARY, Timestamp(1,0)); + heartbeatFromMember(HostAndPort("h3"), "rs0", MemberState::RS_SECONDARY, Timestamp(0,0)); // Should choose h2, since it is furthest ahead - newSyncSource = getTopoCoord().chooseNewSyncSource(now()++, OpTime(0,0)); + newSyncSource = getTopoCoord().chooseNewSyncSource(now()++, Timestamp(0,0)); ASSERT_EQUALS(getTopoCoord().getSyncSourceAddress(), newSyncSource); ASSERT_EQUALS(HostAndPort("h2"), getTopoCoord().getSyncSourceAddress()); // h3 becomes further ahead, so it should be chosen - heartbeatFromMember(HostAndPort("h3"), "rs0", MemberState::RS_SECONDARY, OpTime(2,0)); - getTopoCoord().chooseNewSyncSource(now()++, OpTime(0,0)); + heartbeatFromMember(HostAndPort("h3"), "rs0", MemberState::RS_SECONDARY, Timestamp(2,0)); + getTopoCoord().chooseNewSyncSource(now()++, Timestamp(0,0)); ASSERT_EQUALS(HostAndPort("h3"), getTopoCoord().getSyncSourceAddress()); // h3 becomes an invalid candidate for sync source; should choose h2 again - heartbeatFromMember(HostAndPort("h3"), "rs0", MemberState::RS_RECOVERING, OpTime(2,0)); - getTopoCoord().chooseNewSyncSource(now()++, OpTime(0,0)); + heartbeatFromMember(HostAndPort("h3"), "rs0", MemberState::RS_RECOVERING, Timestamp(2,0)); + getTopoCoord().chooseNewSyncSource(now()++, Timestamp(0,0)); ASSERT_EQUALS(HostAndPort("h2"), getTopoCoord().getSyncSourceAddress()); // h3 back in SECONDARY and ahead - heartbeatFromMember(HostAndPort("h3"), "rs0", MemberState::RS_SECONDARY, OpTime(2,0)); - getTopoCoord().chooseNewSyncSource(now()++, OpTime(0,0)); + heartbeatFromMember(HostAndPort("h3"), "rs0", MemberState::RS_SECONDARY, Timestamp(2,0)); + getTopoCoord().chooseNewSyncSource(now()++, Timestamp(0,0)); ASSERT_EQUALS(HostAndPort("h3"), getTopoCoord().getSyncSourceAddress()); // h3 goes down - receiveDownHeartbeat(HostAndPort("h3"), "rs0", OpTime()); - getTopoCoord().chooseNewSyncSource(now()++, OpTime(0,0)); + receiveDownHeartbeat(HostAndPort("h3"), "rs0", Timestamp()); + getTopoCoord().chooseNewSyncSource(now()++, Timestamp(0,0)); ASSERT_EQUALS(HostAndPort("h2"), getTopoCoord().getSyncSourceAddress()); // h3 back up and ahead - heartbeatFromMember(HostAndPort("h3"), "rs0", MemberState::RS_SECONDARY, OpTime(2,0)); - getTopoCoord().chooseNewSyncSource(now()++, OpTime(0,0)); + heartbeatFromMember(HostAndPort("h3"), "rs0", MemberState::RS_SECONDARY, Timestamp(2,0)); + getTopoCoord().chooseNewSyncSource(now()++, Timestamp(0,0)); ASSERT_EQUALS(HostAndPort("h3"), getTopoCoord().getSyncSourceAddress()); } @@ -282,43 +282,43 @@ namespace { 0); setSelfMemberState(MemberState::RS_SECONDARY); - OpTime lastOpTimeWeApplied = OpTime(100,0); + Timestamp lastOpTimeWeApplied = Timestamp(100,0); heartbeatFromMember(HostAndPort("h1"), "rs0", MemberState::RS_SECONDARY, - OpTime(501, 0), Milliseconds(700)); + Timestamp(501, 0), Milliseconds(700)); heartbeatFromMember(HostAndPort("h2"), "rs0", MemberState::RS_SECONDARY, - OpTime(501, 0), Milliseconds(600)); + Timestamp(501, 0), Milliseconds(600)); heartbeatFromMember(HostAndPort("h3"), "rs0", MemberState::RS_SECONDARY, - OpTime(501, 0), Milliseconds(500)); + Timestamp(501, 0), Milliseconds(500)); heartbeatFromMember(HostAndPort("h4"), "rs0", MemberState::RS_SECONDARY, - OpTime(501, 0), Milliseconds(400)); + Timestamp(501, 0), Milliseconds(400)); heartbeatFromMember(HostAndPort("h5"), "rs0", MemberState::RS_SECONDARY, - OpTime(501, 0), Milliseconds(300)); + Timestamp(501, 0), Milliseconds(300)); // This node is lagged further than maxSyncSourceLagSeconds. heartbeatFromMember(HostAndPort("h6"), "rs0", MemberState::RS_SECONDARY, - OpTime(499, 0), Milliseconds(200)); + Timestamp(499, 0), Milliseconds(200)); ASSERT_EQUALS(-1, getCurrentPrimaryIndex()); heartbeatFromMember(HostAndPort("hprimary"), "rs0", MemberState::RS_PRIMARY, - OpTime(600, 0), Milliseconds(100)); + Timestamp(600, 0), Milliseconds(100)); ASSERT_EQUALS(7, getCurrentPrimaryIndex()); // Record 2nd round of pings to allow choosing a new sync source heartbeatFromMember(HostAndPort("h1"), "rs0", MemberState::RS_SECONDARY, - OpTime(501, 0), Milliseconds(700)); + Timestamp(501, 0), Milliseconds(700)); heartbeatFromMember(HostAndPort("h2"), "rs0", MemberState::RS_SECONDARY, - OpTime(501, 0), Milliseconds(600)); + Timestamp(501, 0), Milliseconds(600)); heartbeatFromMember(HostAndPort("h3"), "rs0", MemberState::RS_SECONDARY, - OpTime(501, 0), Milliseconds(500)); + Timestamp(501, 0), Milliseconds(500)); heartbeatFromMember(HostAndPort("h4"), "rs0", MemberState::RS_SECONDARY, - OpTime(501, 0), Milliseconds(400)); + Timestamp(501, 0), Milliseconds(400)); heartbeatFromMember(HostAndPort("h5"), "rs0", MemberState::RS_SECONDARY, - OpTime(501, 0), Milliseconds(300)); + Timestamp(501, 0), Milliseconds(300)); heartbeatFromMember(HostAndPort("h6"), "rs0", MemberState::RS_SECONDARY, - OpTime(499, 0), Milliseconds(200)); + Timestamp(499, 0), Milliseconds(200)); heartbeatFromMember(HostAndPort("hprimary"), "rs0", MemberState::RS_PRIMARY, - OpTime(600, 0), Milliseconds(100)); + Timestamp(600, 0), Milliseconds(100)); // Should choose primary first; it's closest getTopoCoord().chooseNewSyncSource(now()++, lastOpTimeWeApplied); @@ -326,7 +326,7 @@ namespace { // Primary goes far far away heartbeatFromMember(HostAndPort("hprimary"), "rs0", MemberState::RS_PRIMARY, - OpTime(600, 0), Milliseconds(100000000)); + Timestamp(600, 0), Milliseconds(100000000)); // Should choose h4. (if an arbiter has an oplog, it's a valid sync source) // h6 is not considered because it is outside the maxSyncLagSeconds window, @@ -334,29 +334,29 @@ namespace { ASSERT_EQUALS(HostAndPort("h4"), getTopoCoord().getSyncSourceAddress()); // h4 goes down; should choose h1 - receiveDownHeartbeat(HostAndPort("h4"), "rs0", OpTime()); + receiveDownHeartbeat(HostAndPort("h4"), "rs0", Timestamp()); getTopoCoord().chooseNewSyncSource(now()++, lastOpTimeWeApplied); ASSERT_EQUALS(HostAndPort("h1"), getTopoCoord().getSyncSourceAddress()); // Primary and h1 go down; should choose h6 - receiveDownHeartbeat(HostAndPort("h1"), "rs0", OpTime()); - receiveDownHeartbeat(HostAndPort("hprimary"), "rs0", OpTime()); + receiveDownHeartbeat(HostAndPort("h1"), "rs0", Timestamp()); + receiveDownHeartbeat(HostAndPort("hprimary"), "rs0", Timestamp()); ASSERT_EQUALS(-1, getCurrentPrimaryIndex()); getTopoCoord().chooseNewSyncSource(now()++, lastOpTimeWeApplied); ASSERT_EQUALS(HostAndPort("h6"), getTopoCoord().getSyncSourceAddress()); // h6 goes down; should choose h5 - receiveDownHeartbeat(HostAndPort("h6"), "rs0", OpTime()); + receiveDownHeartbeat(HostAndPort("h6"), "rs0", Timestamp()); getTopoCoord().chooseNewSyncSource(now()++, lastOpTimeWeApplied); ASSERT_EQUALS(HostAndPort("h5"), getTopoCoord().getSyncSourceAddress()); // h5 goes down; should choose h3 - receiveDownHeartbeat(HostAndPort("h5"), "rs0", OpTime()); + receiveDownHeartbeat(HostAndPort("h5"), "rs0", Timestamp()); getTopoCoord().chooseNewSyncSource(now()++, lastOpTimeWeApplied); ASSERT_EQUALS(HostAndPort("h3"), getTopoCoord().getSyncSourceAddress()); // h3 goes down; no sync source candidates remain - receiveDownHeartbeat(HostAndPort("h3"), "rs0", OpTime()); + receiveDownHeartbeat(HostAndPort("h3"), "rs0", Timestamp()); getTopoCoord().chooseNewSyncSource(now()++, lastOpTimeWeApplied); ASSERT(getTopoCoord().getSyncSourceAddress().empty()); } @@ -375,27 +375,27 @@ namespace { setSelfMemberState(MemberState::RS_SECONDARY); heartbeatFromMember(HostAndPort("h2"), "rs0", MemberState::RS_SECONDARY, - OpTime(1, 0), Milliseconds(100)); + Timestamp(1, 0), Milliseconds(100)); heartbeatFromMember(HostAndPort("h2"), "rs0", MemberState::RS_SECONDARY, - OpTime(1, 0), Milliseconds(100)); + Timestamp(1, 0), Milliseconds(100)); heartbeatFromMember(HostAndPort("h3"), "rs0", MemberState::RS_SECONDARY, - OpTime(0, 0), Milliseconds(300)); + Timestamp(0, 0), Milliseconds(300)); heartbeatFromMember(HostAndPort("h3"), "rs0", MemberState::RS_SECONDARY, - OpTime(0, 0), Milliseconds(300)); + Timestamp(0, 0), Milliseconds(300)); // No primary situation: should choose no sync source. - getTopoCoord().chooseNewSyncSource(now()++, OpTime(0,0)); + getTopoCoord().chooseNewSyncSource(now()++, Timestamp(0,0)); ASSERT(getTopoCoord().getSyncSourceAddress().empty()); // Add primary ASSERT_EQUALS(-1, getCurrentPrimaryIndex()); heartbeatFromMember(HostAndPort("h3"), "rs0", MemberState::RS_PRIMARY, - OpTime(0, 0), Milliseconds(300)); + Timestamp(0, 0), Milliseconds(300)); ASSERT_EQUALS(2, getCurrentPrimaryIndex()); // h3 is primary and should be chosen as sync source, despite being further away than h2 // and the primary (h3) being behind our most recently applied optime - getTopoCoord().chooseNewSyncSource(now()++, OpTime(10,0)); + getTopoCoord().chooseNewSyncSource(now()++, Timestamp(10,0)); ASSERT_EQUALS(HostAndPort("h3"), getTopoCoord().getSyncSourceAddress()); } @@ -412,20 +412,20 @@ namespace { setSelfMemberState(MemberState::RS_SECONDARY); heartbeatFromMember(HostAndPort("h2"), "rs0", MemberState::RS_SECONDARY, - OpTime(1, 0), Milliseconds(100)); + Timestamp(1, 0), Milliseconds(100)); heartbeatFromMember(HostAndPort("h2"), "rs0", MemberState::RS_SECONDARY, - OpTime(1, 0), Milliseconds(100)); + Timestamp(1, 0), Milliseconds(100)); heartbeatFromMember(HostAndPort("h3"), "rs0", MemberState::RS_SECONDARY, - OpTime(0, 0), Milliseconds(300)); + Timestamp(0, 0), Milliseconds(300)); heartbeatFromMember(HostAndPort("h3"), "rs0", MemberState::RS_SECONDARY, - OpTime(0, 0), Milliseconds(300)); + Timestamp(0, 0), Milliseconds(300)); // No primary situation: should choose h2 sync source. - getTopoCoord().chooseNewSyncSource(now()++, OpTime(0,0)); + getTopoCoord().chooseNewSyncSource(now()++, Timestamp(0,0)); ASSERT_EQUALS(HostAndPort("h2"), getTopoCoord().getSyncSourceAddress()); // Become primary - makeSelfPrimary(OpTime(3.0)); + makeSelfPrimary(Timestamp(3.0)); ASSERT_EQUALS(0, getCurrentPrimaryIndex()); // Check sync source @@ -445,27 +445,27 @@ namespace { // two rounds of heartbeat pings from each member heartbeatFromMember(HostAndPort("h2"), "rs0", MemberState::RS_SECONDARY, - OpTime(1, 0), Milliseconds(300)); + Timestamp(1, 0), Milliseconds(300)); heartbeatFromMember(HostAndPort("h2"), "rs0", MemberState::RS_SECONDARY, - OpTime(1, 0), Milliseconds(300)); + Timestamp(1, 0), Milliseconds(300)); heartbeatFromMember(HostAndPort("h3"), "rs0", MemberState::RS_SECONDARY, - OpTime(2, 0), Milliseconds(100)); + Timestamp(2, 0), Milliseconds(100)); heartbeatFromMember(HostAndPort("h3"), "rs0", MemberState::RS_SECONDARY, - OpTime(2, 0), Milliseconds(100)); + Timestamp(2, 0), Milliseconds(100)); // force should overrule other defaults - getTopoCoord().chooseNewSyncSource(now()++, OpTime(0,0)); + getTopoCoord().chooseNewSyncSource(now()++, Timestamp(0,0)); ASSERT_EQUALS(HostAndPort("h3"), getTopoCoord().getSyncSourceAddress()); getTopoCoord().setForceSyncSourceIndex(1); // force should cause shouldChangeSyncSource() to return true // even if the currentSource is the force target ASSERT_TRUE(getTopoCoord().shouldChangeSyncSource(HostAndPort("h2"), now())); ASSERT_TRUE(getTopoCoord().shouldChangeSyncSource(HostAndPort("h3"), now())); - getTopoCoord().chooseNewSyncSource(now()++, OpTime(0,0)); + getTopoCoord().chooseNewSyncSource(now()++, Timestamp(0,0)); ASSERT_EQUALS(HostAndPort("h2"), getTopoCoord().getSyncSourceAddress()); // force should only work for one call to chooseNewSyncSource - getTopoCoord().chooseNewSyncSource(now()++, OpTime(0,0)); + getTopoCoord().chooseNewSyncSource(now()++, Timestamp(0,0)); ASSERT_EQUALS(HostAndPort("h3"), getTopoCoord().getSyncSourceAddress()); } @@ -481,25 +481,25 @@ namespace { setSelfMemberState(MemberState::RS_SECONDARY); heartbeatFromMember(HostAndPort("h2"), "rs0", MemberState::RS_SECONDARY, - OpTime(1, 0), Milliseconds(300)); + Timestamp(1, 0), Milliseconds(300)); heartbeatFromMember(HostAndPort("h2"), "rs0", MemberState::RS_SECONDARY, - OpTime(1, 0), Milliseconds(300)); + Timestamp(1, 0), Milliseconds(300)); heartbeatFromMember(HostAndPort("h3"), "rs0", MemberState::RS_SECONDARY, - OpTime(2, 0), Milliseconds(100)); + Timestamp(2, 0), Milliseconds(100)); heartbeatFromMember(HostAndPort("h3"), "rs0", MemberState::RS_SECONDARY, - OpTime(2, 0), Milliseconds(100)); + Timestamp(2, 0), Milliseconds(100)); - getTopoCoord().chooseNewSyncSource(now()++, OpTime(0,0)); + getTopoCoord().chooseNewSyncSource(now()++, Timestamp(0,0)); ASSERT_EQUALS(HostAndPort("h3"), getTopoCoord().getSyncSourceAddress()); Date_t expireTime = 100; getTopoCoord().blacklistSyncSource(HostAndPort("h3"), expireTime); - getTopoCoord().chooseNewSyncSource(now()++, OpTime(0,0)); + getTopoCoord().chooseNewSyncSource(now()++, Timestamp(0,0)); // Should choose second best choice now that h3 is blacklisted. ASSERT_EQUALS(HostAndPort("h2"), getTopoCoord().getSyncSourceAddress()); // After time has passed, should go back to original sync source - getTopoCoord().chooseNewSyncSource(expireTime, OpTime(0,0)); + getTopoCoord().chooseNewSyncSource(expireTime, Timestamp(0,0)); ASSERT_EQUALS(HostAndPort("h3"), getTopoCoord().getSyncSourceAddress()); } @@ -516,27 +516,27 @@ namespace { setSelfMemberState(MemberState::RS_SECONDARY); heartbeatFromMember(HostAndPort("h2"), "rs0", MemberState::RS_PRIMARY, - OpTime(2, 0), Milliseconds(100)); + Timestamp(2, 0), Milliseconds(100)); heartbeatFromMember(HostAndPort("h2"), "rs0", MemberState::RS_PRIMARY, - OpTime(2, 0), Milliseconds(100)); + Timestamp(2, 0), Milliseconds(100)); ASSERT_EQUALS(1, getCurrentPrimaryIndex()); heartbeatFromMember(HostAndPort("h3"), "rs0", MemberState::RS_SECONDARY, - OpTime(2, 0), Milliseconds(100)); + Timestamp(2, 0), Milliseconds(100)); heartbeatFromMember(HostAndPort("h3"), "rs0", MemberState::RS_SECONDARY, - OpTime(2, 0), Milliseconds(100)); + Timestamp(2, 0), Milliseconds(100)); - getTopoCoord().chooseNewSyncSource(now()++, OpTime(0,0)); + getTopoCoord().chooseNewSyncSource(now()++, Timestamp(0,0)); ASSERT_EQUALS(HostAndPort("h2"), getTopoCoord().getSyncSourceAddress()); Date_t expireTime = 100; getTopoCoord().blacklistSyncSource(HostAndPort("h2"), expireTime); - getTopoCoord().chooseNewSyncSource(now()++, OpTime(0,0)); + getTopoCoord().chooseNewSyncSource(now()++, Timestamp(0,0)); // Can't choose any sync source now. ASSERT(getTopoCoord().getSyncSourceAddress().empty()); // After time has passed, should go back to the primary - getTopoCoord().chooseNewSyncSource(expireTime, OpTime(0,0)); + getTopoCoord().chooseNewSyncSource(expireTime, Timestamp(0,0)); ASSERT_EQUALS(HostAndPort("h2"), getTopoCoord().getSyncSourceAddress()); } @@ -553,38 +553,38 @@ namespace { // Generate enough heartbeats to select a sync source below heartbeatFromMember(HostAndPort("h2"), "rs0", MemberState::RS_SECONDARY, - OpTime(1, 0), Milliseconds(300)); + Timestamp(1, 0), Milliseconds(300)); heartbeatFromMember(HostAndPort("h2"), "rs0", MemberState::RS_SECONDARY, - OpTime(1, 0), Milliseconds(300)); + Timestamp(1, 0), Milliseconds(300)); heartbeatFromMember(HostAndPort("h3"), "rs0", MemberState::RS_SECONDARY, - OpTime(2, 0), Milliseconds(100)); + Timestamp(2, 0), Milliseconds(100)); heartbeatFromMember(HostAndPort("h3"), "rs0", MemberState::RS_SECONDARY, - OpTime(2, 0), Milliseconds(100)); + Timestamp(2, 0), Milliseconds(100)); ASSERT_EQUALS(HostAndPort("h3"), - getTopoCoord().chooseNewSyncSource(now()++, OpTime(0,0))); + getTopoCoord().chooseNewSyncSource(now()++, Timestamp(0,0))); ASSERT_EQUALS(MemberState::RS_SECONDARY, getTopoCoord().getMemberState().s); // Good state setup done // Mark nodes down, ensure that we have no source and are secondary - receiveDownHeartbeat(HostAndPort("h2"), "rs0", OpTime(), ErrorCodes::NetworkTimeout); - receiveDownHeartbeat(HostAndPort("h3"), "rs0", OpTime(), ErrorCodes::NetworkTimeout); - ASSERT_TRUE(getTopoCoord().chooseNewSyncSource(now()++, OpTime(0,0)).empty()); + receiveDownHeartbeat(HostAndPort("h2"), "rs0", Timestamp(), ErrorCodes::NetworkTimeout); + receiveDownHeartbeat(HostAndPort("h3"), "rs0", Timestamp(), ErrorCodes::NetworkTimeout); + ASSERT_TRUE(getTopoCoord().chooseNewSyncSource(now()++, Timestamp(0,0)).empty()); ASSERT_EQUALS(MemberState::RS_SECONDARY, getTopoCoord().getMemberState().s); // Mark nodes down + unauth, ensure that we have no source and are secondary - receiveDownHeartbeat(HostAndPort("h2"), "rs0", OpTime(), ErrorCodes::NetworkTimeout); - receiveDownHeartbeat(HostAndPort("h3"), "rs0", OpTime(), ErrorCodes::Unauthorized); - ASSERT_TRUE(getTopoCoord().chooseNewSyncSource(now()++, OpTime(0,0)).empty()); + receiveDownHeartbeat(HostAndPort("h2"), "rs0", Timestamp(), ErrorCodes::NetworkTimeout); + receiveDownHeartbeat(HostAndPort("h3"), "rs0", Timestamp(), ErrorCodes::Unauthorized); + ASSERT_TRUE(getTopoCoord().chooseNewSyncSource(now()++, Timestamp(0,0)).empty()); ASSERT_EQUALS(MemberState::RS_RECOVERING, getTopoCoord().getMemberState().s); // Having an auth error but with another node up should bring us out of RECOVERING HeartbeatResponseAction action = receiveUpHeartbeat(HostAndPort("h2"), "rs0", MemberState::RS_SECONDARY, - OpTime(0, 0), - OpTime(2, 0), - OpTime(2, 0)); + Timestamp(0, 0), + Timestamp(2, 0), + Timestamp(2, 0)); ASSERT_EQUALS(MemberState::RS_SECONDARY, getTopoCoord().getMemberState().s); // Test that the heartbeat that brings us from RECOVERING to SECONDARY doesn't initiate // an election (SERVER-17164) @@ -600,12 +600,12 @@ namespace { BSON("_id" << 30 << "host" << "h3"))), -1); ASSERT_NO_ACTION(heartbeatFromMember(HostAndPort("h2"), "rs0", MemberState::RS_SECONDARY, - OpTime(1, 0), Milliseconds(300)).getAction()); + Timestamp(1, 0), Milliseconds(300)).getAction()); } TEST_F(TopoCoordTest, PrepareSyncFromResponse) { - OpTime staleOpTime(1, 1); - OpTime ourOpTime(staleOpTime.getSecs() + 11, 1); + Timestamp staleOpTime(1, 1); + Timestamp ourOpTime(staleOpTime.getSecs() + 11, 1); Status result = Status::OK(); BSONObjBuilder response; @@ -689,7 +689,7 @@ namespace { result.reason()); // Try to sync from a member that is down - receiveDownHeartbeat(HostAndPort("h4"), "rs0", OpTime()); + receiveDownHeartbeat(HostAndPort("h4"), "rs0", Timestamp()); BSONObjBuilder response7; getTopoCoord().prepareSyncFromResponse( @@ -731,12 +731,12 @@ namespace { BSONObj response10Obj = response10.obj(); ASSERT_FALSE(response10Obj.hasField("warning")); ASSERT_EQUALS(HostAndPort("h6").toString(), response10Obj["prevSyncTarget"].String()); - receiveDownHeartbeat(HostAndPort("h6"), "rs0", OpTime()); - HostAndPort syncSource = getTopoCoord().chooseNewSyncSource(now()++, OpTime(0,0)); + receiveDownHeartbeat(HostAndPort("h6"), "rs0", Timestamp()); + HostAndPort syncSource = getTopoCoord().chooseNewSyncSource(now()++, Timestamp(0,0)); ASSERT_EQUALS(HostAndPort("h6"), syncSource); // Try to sync from a member that is unauth'd - receiveDownHeartbeat(HostAndPort("h5"), "rs0", OpTime(), ErrorCodes::Unauthorized); + receiveDownHeartbeat(HostAndPort("h5"), "rs0", Timestamp(), ErrorCodes::Unauthorized); BSONObjBuilder response11; getTopoCoord().prepareSyncFromResponse( @@ -753,7 +753,7 @@ namespace { getTopoCoord().prepareSyncFromResponse( cbData(), HostAndPort("h6"), ourOpTime, &response12, &result); ASSERT_OK(result); - syncSource = getTopoCoord().chooseNewSyncSource(now()++, OpTime(0,0)); + syncSource = getTopoCoord().chooseNewSyncSource(now()++, Timestamp(0,0)); ASSERT_EQUALS(HostAndPort("h6"), syncSource); } @@ -771,8 +771,8 @@ namespace { Date_t heartbeatTime = 5000; Seconds uptimeSecs(10); Date_t curTime = heartbeatTime + uptimeSecs.total_milliseconds(); - OpTime electionTime(1, 2); - OpTime oplogProgress(3, 4); + Timestamp electionTime(1, 2); + Timestamp oplogProgress(3, 4); std::string setName = "mySet"; updateConfig(BSON("_id" << setName << @@ -793,7 +793,7 @@ namespace { Milliseconds(0), member, hbResponse, - OpTime(0,0)); + Timestamp(0,0)); member = HostAndPort("test1:1234"); ReplSetHeartbeatResponse hb; @@ -810,7 +810,7 @@ namespace { Milliseconds(4000), member, hbResponse, - OpTime(0,0)); + Timestamp(0,0)); makeSelfPrimary(); // Now node 0 is down, node 1 is up, and for node 2 we have no heartbeat data yet. @@ -841,9 +841,9 @@ namespace { ASSERT_EQUALS(MemberState::RS_DOWN, member0Status["state"].numberInt()); ASSERT_EQUALS("(not reachable/healthy)", member0Status["stateStr"].str()); ASSERT_EQUALS(0, member0Status["uptime"].numberInt()); - ASSERT_EQUALS(OpTime(), OpTime(member0Status["optime"].timestampValue())); + ASSERT_EQUALS(Timestamp(), Timestamp(member0Status["optime"].timestampValue())); ASSERT_TRUE(member0Status.hasField("optimeDate")); - ASSERT_EQUALS(Date_t(OpTime().getSecs() * 1000ULL), + ASSERT_EQUALS(Date_t(Timestamp().getSecs() * 1000ULL), member0Status["optimeDate"].Date().millis); ASSERT_EQUALS(heartbeatTime, member0Status["lastHeartbeat"].date()); ASSERT_EQUALS(Date_t(), member0Status["lastHeartbeatRecv"].date()); @@ -856,7 +856,7 @@ namespace { ASSERT_EQUALS(MemberState(MemberState::RS_SECONDARY).toString(), member1Status["stateStr"].String()); ASSERT_EQUALS(uptimeSecs.total_seconds(), member1Status["uptime"].numberInt()); - ASSERT_EQUALS(oplogProgress, OpTime(member1Status["optime"].timestampValue())); + ASSERT_EQUALS(oplogProgress, Timestamp(member1Status["optime"].timestampValue())); ASSERT_TRUE(member1Status.hasField("optimeDate")); ASSERT_EQUALS(Date_t(oplogProgress.getSecs() * 1000ULL), member1Status["optimeDate"].Date().millis); @@ -888,7 +888,7 @@ namespace { ASSERT_EQUALS(MemberState(MemberState::RS_PRIMARY).toString(), selfStatus["stateStr"].str()); ASSERT_EQUALS(uptimeSecs.total_seconds(), selfStatus["uptime"].numberInt()); - ASSERT_EQUALS(oplogProgress, OpTime(selfStatus["optime"].timestampValue())); + ASSERT_EQUALS(oplogProgress, Timestamp(selfStatus["optime"].timestampValue())); ASSERT_TRUE(selfStatus.hasField("optimeDate")); ASSERT_EQUALS(Date_t(oplogProgress.getSecs() * 1000ULL), selfStatus["optimeDate"].Date().millis); @@ -903,7 +903,7 @@ namespace { Date_t heartbeatTime = 5000; Seconds uptimeSecs(10); Date_t curTime = heartbeatTime + uptimeSecs.total_milliseconds(); - OpTime oplogProgress(3, 4); + Timestamp oplogProgress(3, 4); std::string setName = "mySet"; updateConfig(BSON("_id" << setName << @@ -928,9 +928,9 @@ namespace { TEST_F(TopoCoordTest, PrepareFreshResponse) { ReplicationCoordinator::ReplSetFreshArgs args; - OpTime freshestOpTime(15, 10); - OpTime ourOpTime(10, 10); - OpTime staleOpTime(1, 1); + Timestamp freshestOpTime(15, 10); + Timestamp ourOpTime(10, 10); + Timestamp staleOpTime(1, 1); Status internalErrorStatus(ErrorCodes::InternalError, "didn't set status"); // if we do not have an index in the config, we should get ErrorCodes::ReplicaSetNotFound @@ -978,7 +978,7 @@ namespace { ASSERT_OK(status1); BSONObj response1 = responseBuilder1.obj(); ASSERT_EQUALS("config version stale", response1["info"].String()); - ASSERT_EQUALS(ourOpTime, OpTime(response1["opTime"].timestampValue())); + ASSERT_EQUALS(ourOpTime, Timestamp(response1["opTime"].timestampValue())); ASSERT_TRUE(response1["fresher"].Bool()); ASSERT_FALSE(response1["veto"].Bool()); ASSERT_FALSE(response1.hasField("errmsg")); @@ -993,7 +993,7 @@ namespace { getTopoCoord().prepareFreshResponse(args, Date_t(), ourOpTime, &responseBuilder2, &status2); ASSERT_OK(status2); BSONObj response2 = responseBuilder2.obj(); - ASSERT_EQUALS(ourOpTime, OpTime(response2["opTime"].timestampValue())); + ASSERT_EQUALS(ourOpTime, Timestamp(response2["opTime"].timestampValue())); ASSERT_FALSE(response2["fresher"].Bool()); ASSERT_TRUE(response2["veto"].Bool()); ASSERT_EQUALS("replSet couldn't find member with id 0", response2["errmsg"].String()); @@ -1011,7 +1011,7 @@ namespace { ASSERT_OK(status3); BSONObj response3 = responseBuilder3.obj(); ASSERT_FALSE(response3.hasField("info")); - ASSERT_EQUALS(ourOpTime, OpTime(response3["opTime"].timestampValue())); + ASSERT_EQUALS(ourOpTime, Timestamp(response3["opTime"].timestampValue())); ASSERT_FALSE(response3["fresher"].Bool()); ASSERT_TRUE(response3["veto"].Bool()); ASSERT_EQUALS("I am already primary, h1:27017 can try again once I've stepped down", @@ -1029,7 +1029,7 @@ namespace { ASSERT_OK(status4); BSONObj response4 = responseBuilder4.obj(); ASSERT_FALSE(response4.hasField("info")); - ASSERT_EQUALS(ourOpTime, OpTime(response4["opTime"].timestampValue())); + ASSERT_EQUALS(ourOpTime, Timestamp(response4["opTime"].timestampValue())); ASSERT_FALSE(response4["fresher"].Bool()); ASSERT_TRUE(response4["veto"].Bool()); ASSERT_EQUALS( @@ -1049,7 +1049,7 @@ namespace { ASSERT_OK(status5); BSONObj response5 = responseBuilder5.obj(); ASSERT_FALSE(response5.hasField("info")); - ASSERT_EQUALS(ourOpTime, OpTime(response5["opTime"].timestampValue())); + ASSERT_EQUALS(ourOpTime, Timestamp(response5["opTime"].timestampValue())); ASSERT_FALSE(response5["fresher"].Bool()); ASSERT_TRUE(response5["veto"].Bool()); ASSERT(response5["errmsg"].String().find("h1:27017 has lower priority of 1 than") != @@ -1059,7 +1059,7 @@ namespace { args.id = 40; args.who = HostAndPort("h3"); - receiveDownHeartbeat(HostAndPort("h3"), "rs0", OpTime()); + receiveDownHeartbeat(HostAndPort("h3"), "rs0", Timestamp()); BSONObjBuilder responseBuilder6; Status status6 = internalErrorStatus; @@ -1067,7 +1067,7 @@ namespace { ASSERT_OK(status6); BSONObj response6 = responseBuilder6.obj(); ASSERT_FALSE(response6.hasField("info")); - ASSERT_EQUALS(ourOpTime, OpTime(response6["opTime"].timestampValue())); + ASSERT_EQUALS(ourOpTime, Timestamp(response6["opTime"].timestampValue())); ASSERT_FALSE(response6["fresher"].Bool()); ASSERT_TRUE(response6["veto"].Bool()); ASSERT_NE(std::string::npos, response6["errmsg"].String().find( @@ -1085,7 +1085,7 @@ namespace { ASSERT_OK(status7); BSONObj response7 = responseBuilder7.obj(); ASSERT_FALSE(response7.hasField("info")); - ASSERT_EQUALS(ourOpTime, OpTime(response7["opTime"].timestampValue())); + ASSERT_EQUALS(ourOpTime, Timestamp(response7["opTime"].timestampValue())); ASSERT_FALSE(response7["fresher"].Bool()); ASSERT_TRUE(response7["veto"].Bool()); ASSERT_NE(std::string::npos, response7["errmsg"].String().find( @@ -1101,7 +1101,7 @@ namespace { ASSERT_OK(status8); BSONObj response8 = responseBuilder8.obj(); ASSERT_FALSE(response8.hasField("info")); - ASSERT_EQUALS(ourOpTime, OpTime(response8["opTime"].timestampValue())); + ASSERT_EQUALS(ourOpTime, Timestamp(response8["opTime"].timestampValue())); ASSERT_FALSE(response8["fresher"].Bool()); ASSERT_TRUE(response8["veto"].Bool()); ASSERT_NE(std::string::npos, response8["errmsg"].String().find( @@ -1117,7 +1117,7 @@ namespace { ASSERT_OK(status9); BSONObj response9 = responseBuilder9.obj(); ASSERT_FALSE(response9.hasField("info")); - ASSERT_EQUALS(ourOpTime, OpTime(response9["opTime"].timestampValue())); + ASSERT_EQUALS(ourOpTime, Timestamp(response9["opTime"].timestampValue())); ASSERT_FALSE(response9["fresher"].Bool()); ASSERT_TRUE(response9["veto"].Bool()); ASSERT_NE(std::string::npos, response9["errmsg"].String().find( @@ -1139,7 +1139,7 @@ namespace { ASSERT_OK(status10); BSONObj response10 = responseBuilder10.obj(); ASSERT_FALSE(response10.hasField("info")); - ASSERT_EQUALS(ourOpTime, OpTime(response10["opTime"].timestampValue())); + ASSERT_EQUALS(ourOpTime, Timestamp(response10["opTime"].timestampValue())); ASSERT_TRUE(response10["fresher"].Bool()); ASSERT_TRUE(response10["veto"].Bool()); ASSERT_TRUE(response10.hasField("errmsg")); @@ -1149,7 +1149,7 @@ namespace { args.id = 40; args.who = HostAndPort("h3"); - receiveDownHeartbeat(HostAndPort("h2"), "rs0", OpTime()); + receiveDownHeartbeat(HostAndPort("h2"), "rs0", Timestamp()); heartbeatFromMember(HostAndPort("h3"), "rs0", MemberState::RS_SECONDARY, ourOpTime); BSONObjBuilder responseBuilder11; @@ -1159,7 +1159,7 @@ namespace { ASSERT_OK(status11); BSONObj response11 = responseBuilder11.obj(); ASSERT_FALSE(response11.hasField("info")) << response11.toString(); - ASSERT_EQUALS(ourOpTime, OpTime(response11["opTime"].timestampValue())); + ASSERT_EQUALS(ourOpTime, Timestamp(response11["opTime"].timestampValue())); ASSERT_FALSE(response11["fresher"].Bool()) << response11.toString(); ASSERT_FALSE(response11["veto"].Bool()) << response11.toString(); ASSERT_FALSE(response11.hasField("errmsg")) << response11.toString(); @@ -1219,7 +1219,7 @@ namespace { _target, StatusWith<ReplSetHeartbeatResponse>(ErrorCodes::ExceededTimeLimit, "Took too long"), - OpTime(0, 0)); // We've never applied anything. + Timestamp(0, 0)); // We've never applied anything. ASSERT_EQUALS(HeartbeatResponseAction::NoAction, action.getAction()); ASSERT_TRUE(TopologyCoordinator::Role::follower == getTopoCoord().getRole()); @@ -1261,7 +1261,7 @@ namespace { Milliseconds(400), // Spent 0.4 of the 0.5 seconds in the network. target(), StatusWith<ReplSetHeartbeatResponse>(ErrorCodes::NodeNotFound, "Bad DNS?"), - OpTime(0, 0)); // We've never applied anything. + Timestamp(0, 0)); // We've never applied anything. ASSERT_EQUALS(HeartbeatResponseAction::NoAction, action.getAction()); ASSERT_TRUE(TopologyCoordinator::Role::follower == getTopoCoord().getRole()); // Because the first retry failed without timing out, we expect to retry immediately. @@ -1295,7 +1295,7 @@ namespace { }; TEST_F(HeartbeatResponseHighVerbosityTest, UpdateHeartbeatDataNodeBelivesWeAreDown) { - OpTime lastOpTimeApplied = OpTime(3,0); + Timestamp lastOpTimeApplied = Timestamp(3,0); // request heartbeat std::pair<ReplSetHeartbeatArgs, Milliseconds> request = @@ -1321,7 +1321,7 @@ namespace { } TEST_F(HeartbeatResponseHighVerbosityTest, UpdateHeartbeatDataMemberNotInConfig) { - OpTime lastOpTimeApplied = OpTime(3,0); + Timestamp lastOpTimeApplied = Timestamp(3,0); // request heartbeat std::pair<ReplSetHeartbeatArgs, Milliseconds> request = @@ -1346,7 +1346,7 @@ namespace { } TEST_F(HeartbeatResponseHighVerbosityTest, UpdateHeartbeatDataSameConfig) { - OpTime lastOpTimeApplied = OpTime(3,0); + Timestamp lastOpTimeApplied = Timestamp(3,0); // request heartbeat std::pair<ReplSetHeartbeatArgs, Milliseconds> request = @@ -1385,7 +1385,7 @@ namespace { } TEST_F(HeartbeatResponseHighVerbosityTest, UpdateHeartbeatDataOldConfig) { - OpTime lastOpTimeApplied = OpTime(3,0); + Timestamp lastOpTimeApplied = Timestamp(3,0); // request heartbeat std::pair<ReplSetHeartbeatArgs, Milliseconds> request = @@ -1438,7 +1438,7 @@ namespace { Milliseconds(400), // Spent 0.4 of the 0.5 second in the network. target(), StatusWith<ReplSetHeartbeatResponse>(reconfigResponse), - OpTime(0, 0)); // We've never applied anything. + Timestamp(0, 0)); // We've never applied anything. ASSERT_EQUALS(HeartbeatResponseAction::Reconfig, action.getAction()); ASSERT_TRUE(TopologyCoordinator::Role::follower == getTopoCoord().getRole()); ASSERT_EQUALS(Date_t(firstRequestDate() + 6500), action.getNextHeartbeatStartDate()); @@ -1450,7 +1450,7 @@ namespace { // make self primary ASSERT_EQUALS(-1, getCurrentPrimaryIndex()); - makeSelfPrimary(OpTime(5,0)); + makeSelfPrimary(Timestamp(5,0)); ASSERT_EQUALS(0, getCurrentPrimaryIndex()); ReplSetHeartbeatResponse electedMoreRecentlyResponse; @@ -1458,7 +1458,7 @@ namespace { electedMoreRecentlyResponse.setSetName("rs0"); electedMoreRecentlyResponse.setState(MemberState::RS_PRIMARY); electedMoreRecentlyResponse.setElectable(true); - electedMoreRecentlyResponse.setElectionTime(OpTime(3,0)); + electedMoreRecentlyResponse.setElectionTime(Timestamp(3,0)); electedMoreRecentlyResponse.setVersion(5); HeartbeatResponseAction action = getTopoCoord().processHeartbeatResponse( @@ -1466,7 +1466,7 @@ namespace { Milliseconds(400), // Spent 0.4 of the 0.5 second in the network. target(), StatusWith<ReplSetHeartbeatResponse>(electedMoreRecentlyResponse), - OpTime(0,0)); // We've never applied anything. + Timestamp(0,0)); // We've never applied anything. ASSERT_EQUALS(HeartbeatResponseAction::StepDownRemotePrimary, action.getAction()); ASSERT_EQUALS(1, action.getPrimaryConfigIndex()); ASSERT_EQUALS(Date_t(firstRequestDate() + 6500), action.getNextHeartbeatStartDate()); @@ -1479,7 +1479,7 @@ namespace { // acknowledge the other member so that we see a majority HeartbeatResponseAction action = receiveDownHeartbeat(HostAndPort("host3"), "rs0", - OpTime(100, 0)); + Timestamp(100, 0)); ASSERT_NO_ACTION(action.getAction()); // make us PRIMARY @@ -1490,7 +1490,7 @@ namespace { electedMoreRecentlyResponse.setSetName("rs0"); electedMoreRecentlyResponse.setState(MemberState::RS_PRIMARY); electedMoreRecentlyResponse.setElectable(false); - electedMoreRecentlyResponse.setElectionTime(OpTime(10,0)); + electedMoreRecentlyResponse.setElectionTime(Timestamp(10,0)); electedMoreRecentlyResponse.setVersion(5); action = getTopoCoord().processHeartbeatResponse( @@ -1498,7 +1498,7 @@ namespace { Milliseconds(400), // Spent 0.4 of the 0.5 second in the network. target(), StatusWith<ReplSetHeartbeatResponse>(electedMoreRecentlyResponse), - OpTime(0, 0)); // We've never applied anything. + Timestamp(0, 0)); // We've never applied anything. ASSERT_EQUALS(HeartbeatResponseAction::StepDownSelf, action.getAction()); ASSERT_EQUALS(0, action.getPrimaryConfigIndex()); ASSERT_EQUALS(Date_t(firstRequestDate() + 6500), action.getNextHeartbeatStartDate()); @@ -1516,8 +1516,8 @@ namespace { // action. // acknowledge the other member so that we see a majority - OpTime election = OpTime(400,0); - OpTime lastOpTimeApplied = OpTime(300,0); + Timestamp election = Timestamp(400,0); + Timestamp lastOpTimeApplied = Timestamp(300,0); HeartbeatResponseAction action = receiveUpHeartbeat(HostAndPort("host3"), "rs0", MemberState::RS_SECONDARY, @@ -1564,7 +1564,7 @@ namespace { Milliseconds(100), // Spent 0.1 of the 0.3 seconds in the network. target(), StatusWith<ReplSetHeartbeatResponse>(ErrorCodes::NodeNotFound, "Bad DNS?"), - OpTime(0, 0)); // We've never applied anything. + Timestamp(0, 0)); // We've never applied anything. ASSERT_EQUALS(HeartbeatResponseAction::NoAction, action.getAction()); ASSERT_TRUE(TopologyCoordinator::Role::follower == getTopoCoord().getRole()); // Because this is the second retry, rather than retry again, we expect to wait for the @@ -1578,7 +1578,7 @@ namespace { // make self primary ASSERT_EQUALS(-1, getCurrentPrimaryIndex()); - makeSelfPrimary(OpTime(5,0)); + makeSelfPrimary(Timestamp(5,0)); ASSERT_EQUALS(0, getCurrentPrimaryIndex()); ReplSetHeartbeatResponse electedMoreRecentlyResponse; @@ -1586,7 +1586,7 @@ namespace { electedMoreRecentlyResponse.setSetName("rs0"); electedMoreRecentlyResponse.setState(MemberState::RS_PRIMARY); electedMoreRecentlyResponse.setElectable(true); - electedMoreRecentlyResponse.setElectionTime(OpTime(3,0)); + electedMoreRecentlyResponse.setElectionTime(Timestamp(3,0)); electedMoreRecentlyResponse.setVersion(5); HeartbeatResponseAction action = getTopoCoord().processHeartbeatResponse( @@ -1594,7 +1594,7 @@ namespace { Milliseconds(400), // Spent 0.4 of the 0.5 second in the network. target(), StatusWith<ReplSetHeartbeatResponse>(electedMoreRecentlyResponse), - OpTime(0,0)); // We've never applied anything. + Timestamp(0,0)); // We've never applied anything. ASSERT_EQUALS(HeartbeatResponseAction::StepDownRemotePrimary, action.getAction()); ASSERT_EQUALS(1, action.getPrimaryConfigIndex()); ASSERT_EQUALS(Date_t(firstRequestDate() + 7000), action.getNextHeartbeatStartDate()); @@ -1607,7 +1607,7 @@ namespace { // acknowledge the other member so that we see a majority HeartbeatResponseAction action = receiveDownHeartbeat(HostAndPort("host3"), "rs0", - OpTime(100, 0)); + Timestamp(100, 0)); ASSERT_NO_ACTION(action.getAction()); // make us PRIMARY @@ -1618,7 +1618,7 @@ namespace { electedMoreRecentlyResponse.setSetName("rs0"); electedMoreRecentlyResponse.setState(MemberState::RS_PRIMARY); electedMoreRecentlyResponse.setElectable(false); - electedMoreRecentlyResponse.setElectionTime(OpTime(10,0)); + electedMoreRecentlyResponse.setElectionTime(Timestamp(10,0)); electedMoreRecentlyResponse.setVersion(5); action = getTopoCoord().processHeartbeatResponse( @@ -1626,7 +1626,7 @@ namespace { Milliseconds(400), // Spent 0.4 of the 0.5 second in the network. target(), StatusWith<ReplSetHeartbeatResponse>(electedMoreRecentlyResponse), - OpTime(0, 0)); // We've never applied anything. + Timestamp(0, 0)); // We've never applied anything. ASSERT_EQUALS(HeartbeatResponseAction::StepDownSelf, action.getAction()); ASSERT_EQUALS(0, action.getPrimaryConfigIndex()); ASSERT_EQUALS(Date_t(firstRequestDate() + 7000), action.getNextHeartbeatStartDate()); @@ -1644,8 +1644,8 @@ namespace { // action. // acknowledge the other member so that we see a majority - OpTime election = OpTime(400,0); - OpTime lastOpTimeApplied = OpTime(300,0); + Timestamp election = Timestamp(400,0); + Timestamp lastOpTimeApplied = Timestamp(300,0); HeartbeatResponseAction action = receiveUpHeartbeat(HostAndPort("host3"), "rs0", MemberState::RS_SECONDARY, @@ -1698,7 +1698,7 @@ namespace { target, StatusWith<ReplSetHeartbeatResponse>(ErrorCodes::ExceededTimeLimit, "Took too long"), - OpTime(0, 0)); // We've never applied anything. + Timestamp(0, 0)); // We've never applied anything. ASSERT_EQUALS(HeartbeatResponseAction::NoAction, action.getAction()); ASSERT_TRUE(TopologyCoordinator::Role::follower == getTopoCoord().getRole()); @@ -1716,7 +1716,7 @@ namespace { target(), StatusWith<ReplSetHeartbeatResponse>(ErrorCodes::ExceededTimeLimit, "Took too long"), - OpTime(0, 0)); // We've never applied anything. + Timestamp(0, 0)); // We've never applied anything. ASSERT_EQUALS(HeartbeatResponseAction::NoAction, action.getAction()); ASSERT_TRUE(TopologyCoordinator::Role::follower == getTopoCoord().getRole()); @@ -1725,8 +1725,8 @@ namespace { } TEST_F(HeartbeatResponseTest, UpdateHeartbeatDataNewPrimary) { - OpTime election = OpTime(5,0); - OpTime lastOpTimeApplied = OpTime(3,0); + Timestamp election = Timestamp(5,0); + Timestamp lastOpTimeApplied = Timestamp(3,0); ASSERT_EQUALS(-1, getCurrentPrimaryIndex()); HeartbeatResponseAction nextAction = receiveUpHeartbeat(HostAndPort("host2"), @@ -1741,9 +1741,9 @@ namespace { } TEST_F(HeartbeatResponseTest, UpdateHeartbeatDataTwoPrimariesNewOneOlder) { - OpTime election = OpTime(5,0); - OpTime election2 = OpTime(4,0); - OpTime lastOpTimeApplied = OpTime(3,0); + Timestamp election = Timestamp(5,0); + Timestamp election2 = Timestamp(4,0); + Timestamp lastOpTimeApplied = Timestamp(3,0); ASSERT_EQUALS(-1, getCurrentPrimaryIndex()); HeartbeatResponseAction nextAction = receiveUpHeartbeat(HostAndPort("host2"), @@ -1768,9 +1768,9 @@ namespace { } TEST_F(HeartbeatResponseTest, UpdateHeartbeatDataTwoPrimariesNewOneNewer) { - OpTime election = OpTime(4,0); - OpTime election2 = OpTime(5,0); - OpTime lastOpTimeApplied = OpTime(3,0); + Timestamp election = Timestamp(4,0); + Timestamp election2 = Timestamp(5,0); + Timestamp lastOpTimeApplied = Timestamp(3,0); ASSERT_EQUALS(-1, getCurrentPrimaryIndex()); HeartbeatResponseAction nextAction = receiveUpHeartbeat(HostAndPort("host2"), @@ -1796,10 +1796,10 @@ namespace { TEST_F(HeartbeatResponseTest, UpdateHeartbeatDataTwoPrimariesIncludingMeNewOneOlder) { ASSERT_EQUALS(-1, getCurrentPrimaryIndex()); - makeSelfPrimary(OpTime(5,0)); + makeSelfPrimary(Timestamp(5,0)); - OpTime election = OpTime(4,0); - OpTime lastOpTimeApplied = OpTime(3,0); + Timestamp election = Timestamp(4,0); + Timestamp lastOpTimeApplied = Timestamp(3,0); ASSERT_EQUALS(0, getCurrentPrimaryIndex()); HeartbeatResponseAction nextAction = receiveUpHeartbeat(HostAndPort("host2"), @@ -1828,9 +1828,9 @@ namespace { 0); setSelfMemberState(MemberState::RS_SECONDARY); - OpTime election = OpTime(0,0); - OpTime lastOpTimeApplied = OpTime(13,0); - OpTime slightlyLessFreshLastOpTimeApplied = OpTime(3,0); + Timestamp election = Timestamp(0,0); + Timestamp lastOpTimeApplied = Timestamp(13,0); + Timestamp slightlyLessFreshLastOpTimeApplied = Timestamp(3,0); ASSERT_EQUALS(-1, getCurrentPrimaryIndex()); HeartbeatResponseAction nextAction = receiveUpHeartbeat(HostAndPort("host2"), @@ -1864,7 +1864,7 @@ namespace { BSON("_id" << 2 << "host" << "host3:27017" << "priority" << 3)) << "settings" << BSON("heartbeatTimeoutSecs" << 5)), 0); - OpTime election = OpTime(1000,0); + Timestamp election = Timestamp(1000,0); getTopoCoord().setFollowerMode(MemberState::RS_SECONDARY); ASSERT_EQUALS(-1, getCurrentPrimaryIndex()); @@ -1909,8 +1909,8 @@ namespace { BSON("_id" << 2 << "host" << "host3:27017" << "priority" << 3)) << "settings" << BSON("heartbeatTimeoutSecs" << 5)), 0); - OpTime election = OpTime(1000,0); - OpTime staleTime = OpTime(0,0); + Timestamp election = Timestamp(1000,0); + Timestamp staleTime = Timestamp(0,0); ASSERT_EQUALS(-1, getCurrentPrimaryIndex()); makeSelfPrimary(election); @@ -1938,8 +1938,8 @@ namespace { 0); setSelfMemberState(MemberState::RS_SECONDARY); - OpTime election = OpTime(1000,0); - OpTime stale = OpTime(0,0); + Timestamp election = Timestamp(1000,0); + Timestamp stale = Timestamp(0,0); ASSERT_EQUALS(-1, getCurrentPrimaryIndex()); HeartbeatResponseAction nextAction = receiveUpHeartbeat(HostAndPort("host2"), @@ -1961,10 +1961,10 @@ namespace { TEST_F(HeartbeatResponseTest, UpdateHeartbeatDataTwoPrimariesIncludingMeNewOneNewer) { ASSERT_EQUALS(-1, getCurrentPrimaryIndex()); - makeSelfPrimary(OpTime(2,0)); + makeSelfPrimary(Timestamp(2,0)); - OpTime election = OpTime(4,0); - OpTime lastOpTimeApplied = OpTime(3,0); + Timestamp election = Timestamp(4,0); + Timestamp lastOpTimeApplied = Timestamp(3,0); ASSERT_EQUALS(0, getCurrentPrimaryIndex()); HeartbeatResponseAction nextAction = receiveUpHeartbeat(HostAndPort("host2"), @@ -1987,8 +1987,8 @@ namespace { TEST_F(HeartbeatResponseTest, UpdateHeartbeatDataPrimaryDownNoMajority) { setSelfMemberState(MemberState::RS_SECONDARY); - OpTime election = OpTime(400,0); - OpTime lastOpTimeApplied = OpTime(300,0); + Timestamp election = Timestamp(400,0); + Timestamp lastOpTimeApplied = Timestamp(300,0); ASSERT_EQUALS(-1, getCurrentPrimaryIndex()); HeartbeatResponseAction nextAction = receiveUpHeartbeat(HostAndPort("host2"), @@ -2017,8 +2017,8 @@ namespace { BSON("_id" << 2 << "host" << "host3:27017"))), 0); - OpTime election = OpTime(400,0); - OpTime lastOpTimeApplied = OpTime(300,0); + Timestamp election = Timestamp(400,0); + Timestamp lastOpTimeApplied = Timestamp(300,0); ASSERT_EQUALS(-1, getCurrentPrimaryIndex()); HeartbeatResponseAction nextAction = receiveUpHeartbeat(HostAndPort("host2"), @@ -2048,8 +2048,8 @@ namespace { TEST_F(HeartbeatResponseTest, UpdateHeartbeatDataPrimaryDownMajorityButIAmStarting) { setSelfMemberState(MemberState::RS_STARTUP); - OpTime election = OpTime(400,0); - OpTime lastOpTimeApplied = OpTime(300,0); + Timestamp election = Timestamp(400,0); + Timestamp lastOpTimeApplied = Timestamp(300,0); ASSERT_EQUALS(-1, getCurrentPrimaryIndex()); HeartbeatResponseAction nextAction = receiveUpHeartbeat(HostAndPort("host2"), @@ -2078,8 +2078,8 @@ namespace { TEST_F(HeartbeatResponseTest, UpdateHeartbeatDataPrimaryDownMajorityButIAmRecovering) { setSelfMemberState(MemberState::RS_RECOVERING); - OpTime election = OpTime(400,0); - OpTime lastOpTimeApplied = OpTime(300,0); + Timestamp election = Timestamp(400,0); + Timestamp lastOpTimeApplied = Timestamp(300,0); ASSERT_EQUALS(-1, getCurrentPrimaryIndex()); HeartbeatResponseAction nextAction = receiveUpHeartbeat(HostAndPort("host2"), @@ -2100,8 +2100,8 @@ namespace { TEST_F(HeartbeatResponseTest, UpdateHeartbeatDataPrimaryDownMajorityButIHaveStepdownWait) { setSelfMemberState(MemberState::RS_SECONDARY); - OpTime election = OpTime(400,0); - OpTime lastOpTimeApplied = OpTime(300,0); + Timestamp election = Timestamp(400,0); + Timestamp lastOpTimeApplied = Timestamp(300,0); ASSERT_EQUALS(-1, getCurrentPrimaryIndex()); HeartbeatResponseAction nextAction = receiveUpHeartbeat(HostAndPort("host2"), @@ -2141,8 +2141,8 @@ namespace { BSON("_id" << 2 << "host" << "host3:27017"))), 0); - OpTime election = OpTime(400,0); - OpTime lastOpTimeApplied = OpTime(300,0); + Timestamp election = Timestamp(400,0); + Timestamp lastOpTimeApplied = Timestamp(300,0); HeartbeatResponseAction nextAction = receiveUpHeartbeat(HostAndPort("host3"), "rs0", @@ -2171,8 +2171,8 @@ namespace { TEST_F(HeartbeatResponseTest, UpdateHeartbeatDataPrimaryDownMajority) { setSelfMemberState(MemberState::RS_SECONDARY); - OpTime election = OpTime(400,0); - OpTime lastOpTimeApplied = OpTime(399,0); + Timestamp election = Timestamp(400,0); + Timestamp lastOpTimeApplied = Timestamp(399,0); ASSERT_EQUALS(-1, getCurrentPrimaryIndex()); HeartbeatResponseAction nextAction = receiveUpHeartbeat(HostAndPort("host2"), @@ -2215,8 +2215,8 @@ namespace { now() += 30000; // we need to be more than LastVote::leaseTime from the start of time or // else some Date_t math goes horribly awry - OpTime election = OpTime(0,0); - OpTime lastOpTimeApplied = OpTime(130,0); + Timestamp election = Timestamp(0,0); + Timestamp lastOpTimeApplied = Timestamp(130,0); OID round = OID::gen(); ASSERT_EQUALS(-1, getCurrentPrimaryIndex()); @@ -2285,9 +2285,9 @@ namespace { now() += 30000; // we need to be more than LastVote::leaseTime from the start of time or // else some Date_t math goes horribly awry - OpTime election = OpTime(0,0); - OpTime lastOpTimeApplied = OpTime(100,0); - OpTime fresherOpApplied = OpTime(200,0); + Timestamp election = Timestamp(0,0); + Timestamp lastOpTimeApplied = Timestamp(100,0); + Timestamp fresherOpApplied = Timestamp(200,0); ASSERT_EQUALS(-1, getCurrentPrimaryIndex()); HeartbeatResponseAction nextAction = receiveUpHeartbeat(HostAndPort("host2"), @@ -2313,7 +2313,7 @@ namespace { ASSERT_EQUALS(HeartbeatResponseAction::StartElection, nextAction.getAction()); ASSERT_TRUE(TopologyCoordinator::Role::candidate == getTopoCoord().getRole()); - OpTime originalElectionTime = getTopoCoord().getElectionTime(); + Timestamp originalElectionTime = getTopoCoord().getElectionTime(); OID originalElectionId = getTopoCoord().getElectionId(); // prepare an incoming fresh command ReplicationCoordinator::ReplSetFreshArgs freshArgs; @@ -2329,7 +2329,7 @@ namespace { freshArgs, now()++, lastOpTimeApplied, &freshResponseBuilder, &result); BSONObj response = freshResponseBuilder.obj(); ASSERT_OK(result); - ASSERT_EQUALS(lastOpTimeApplied, OpTime(response["opTime"].timestampValue())); + ASSERT_EQUALS(lastOpTimeApplied, Timestamp(response["opTime"].timestampValue())); ASSERT_FALSE(response["fresher"].trueValue()); ASSERT_FALSE(response["veto"].trueValue()); ASSERT_TRUE(TopologyCoordinator::Role::candidate == getTopoCoord().getRole()); @@ -2349,7 +2349,7 @@ namespace { result = Status(ErrorCodes::InternalError, "status not set by prepareElectResponse"); startCapturingLogMessages(); getTopoCoord().prepareElectResponse( - electArgs, now()++, OpTime(), &electResponseBuilder, &result); + electArgs, now()++, Timestamp(), &electResponseBuilder, &result); stopCapturingLogMessages(); response = electResponseBuilder.obj(); ASSERT_OK(result); @@ -2380,7 +2380,7 @@ namespace { // now lose election and ensure _electionTime and _electionId are 0'd out getTopoCoord().processLoseElection(); ASSERT_EQUALS(OID(), getTopoCoord().getElectionId()); - ASSERT_EQUALS(OpTime(0,0), getTopoCoord().getElectionTime()); + ASSERT_EQUALS(Timestamp(0,0), getTopoCoord().getElectionTime()); ASSERT_TRUE(TopologyCoordinator::Role::follower == getTopoCoord().getRole()); ASSERT_EQUALS(2, getCurrentPrimaryIndex()); } @@ -2403,9 +2403,9 @@ namespace { now() += 30000; // we need to be more than LastVote::leaseTime from the start of time or // else some Date_t math goes horribly awry - OpTime election = OpTime(0,0); - OpTime lastOpTimeApplied = OpTime(100,0); - OpTime fresherLastOpTimeApplied = OpTime(200,0); + Timestamp election = Timestamp(0,0); + Timestamp lastOpTimeApplied = Timestamp(100,0); + Timestamp fresherLastOpTimeApplied = Timestamp(200,0); OID round = OID::gen(); OID remoteRound = OID::gen(); @@ -2447,7 +2447,7 @@ namespace { freshArgs, now()++, lastOpTimeApplied, &freshResponseBuilder, &result); BSONObj response = freshResponseBuilder.obj(); ASSERT_OK(result); - ASSERT_EQUALS(lastOpTimeApplied, OpTime(response["opTime"].timestampValue())); + ASSERT_EQUALS(lastOpTimeApplied, Timestamp(response["opTime"].timestampValue())); ASSERT_FALSE(response["fresher"].trueValue()); ASSERT_FALSE(response["veto"].trueValue()); ASSERT_TRUE(TopologyCoordinator::Role::candidate == getTopoCoord().getRole()); @@ -2472,7 +2472,7 @@ namespace { result = Status(ErrorCodes::InternalError, "status not set by prepareElectResponse"); startCapturingLogMessages(); getTopoCoord().prepareElectResponse( - electArgs, now()++, OpTime(), &electResponseBuilder, &result); + electArgs, now()++, Timestamp(), &electResponseBuilder, &result); stopCapturingLogMessages(); response = electResponseBuilder.obj(); ASSERT_OK(result); @@ -2500,9 +2500,9 @@ namespace { now() += 30000; // we need to be more than LastVote::leaseTime from the start of time or // else some Date_t math goes horribly awry - OpTime election = OpTime(0,0); - OpTime lastOpTimeApplied = OpTime(100,0); - OpTime fresherLastOpTimeApplied = OpTime(200,0); + Timestamp election = Timestamp(0,0); + Timestamp lastOpTimeApplied = Timestamp(100,0); + Timestamp fresherLastOpTimeApplied = Timestamp(200,0); OID round = OID::gen(); OID remoteRound = OID::gen(); @@ -2551,7 +2551,7 @@ namespace { freshArgs, now()++, lastOpTimeApplied, &freshResponseBuilder, &result); BSONObj response = freshResponseBuilder.obj(); ASSERT_OK(result); - ASSERT_EQUALS(lastOpTimeApplied, OpTime(response["opTime"].timestampValue())); + ASSERT_EQUALS(lastOpTimeApplied, Timestamp(response["opTime"].timestampValue())); ASSERT_FALSE(response["fresher"].trueValue()); ASSERT_TRUE(response["veto"].trueValue()) << response["errmsg"]; ASSERT_TRUE(TopologyCoordinator::Role::leader == getTopoCoord().getRole()); @@ -2568,7 +2568,7 @@ namespace { result = Status(ErrorCodes::InternalError, "status not set by prepareElectResponse"); startCapturingLogMessages(); getTopoCoord().prepareElectResponse( - electArgs, now()++, OpTime(), &electResponseBuilder, &result); + electArgs, now()++, Timestamp(), &electResponseBuilder, &result); stopCapturingLogMessages(); response = electResponseBuilder.obj(); ASSERT_OK(result); @@ -2594,8 +2594,8 @@ namespace { setSelfMemberState(MemberState::RS_SECONDARY); - OpTime election = OpTime(400,0); - OpTime lastOpTimeApplied = OpTime(300,0); + Timestamp election = Timestamp(400,0); + Timestamp lastOpTimeApplied = Timestamp(300,0); ASSERT_EQUALS(-1, getCurrentPrimaryIndex()); HeartbeatResponseAction nextAction = receiveUpHeartbeat(HostAndPort("host2"), @@ -2634,21 +2634,21 @@ namespace { TEST_F(HeartbeatResponseTest, UpdateHeartbeatDataRelinquishPrimaryDueToNodeDisappearing) { // become PRIMARY ASSERT_EQUALS(-1, getCurrentPrimaryIndex()); - makeSelfPrimary(OpTime(2,0)); + makeSelfPrimary(Timestamp(2,0)); ASSERT_EQUALS(0, getCurrentPrimaryIndex()); // become aware of other nodes - heartbeatFromMember(HostAndPort("host2"), "rs0", MemberState::RS_SECONDARY, OpTime(1,0)); - heartbeatFromMember(HostAndPort("host2"), "rs0", MemberState::RS_SECONDARY, OpTime(1,0)); - heartbeatFromMember(HostAndPort("host3"), "rs0", MemberState::RS_SECONDARY, OpTime(0,0)); - heartbeatFromMember(HostAndPort("host3"), "rs0", MemberState::RS_SECONDARY, OpTime(0,0)); + heartbeatFromMember(HostAndPort("host2"), "rs0", MemberState::RS_SECONDARY, Timestamp(1,0)); + heartbeatFromMember(HostAndPort("host2"), "rs0", MemberState::RS_SECONDARY, Timestamp(1,0)); + heartbeatFromMember(HostAndPort("host3"), "rs0", MemberState::RS_SECONDARY, Timestamp(0,0)); + heartbeatFromMember(HostAndPort("host3"), "rs0", MemberState::RS_SECONDARY, Timestamp(0,0)); // lose that awareness and be sure we are going to stepdown HeartbeatResponseAction nextAction = receiveDownHeartbeat(HostAndPort("host2"), "rs0", - OpTime(100, 0)); + Timestamp(100, 0)); ASSERT_NO_ACTION(nextAction.getAction()); - nextAction = receiveDownHeartbeat(HostAndPort("host3"), "rs0", OpTime(100, 0)); + nextAction = receiveDownHeartbeat(HostAndPort("host3"), "rs0", Timestamp(100, 0)); ASSERT_EQUALS(HeartbeatResponseAction::StepDownSelf, nextAction.getAction()); ASSERT_EQUALS(0, nextAction.getPrimaryConfigIndex()); // Doesn't actually do the stepdown until stepDownIfPending is called @@ -2661,8 +2661,8 @@ namespace { } TEST_F(HeartbeatResponseTest, UpdateHeartbeatDataRemoteDoesNotExist) { - OpTime election = OpTime(5,0); - OpTime lastOpTimeApplied = OpTime(3,0); + Timestamp election = Timestamp(5,0); + Timestamp lastOpTimeApplied = Timestamp(3,0); ASSERT_EQUALS(-1, getCurrentPrimaryIndex()); HeartbeatResponseAction nextAction = receiveUpHeartbeat(HostAndPort("host9"), @@ -2717,7 +2717,7 @@ namespace { BSONObjBuilder responseBuilder; Status result = Status(ErrorCodes::InternalError, "status not set by prepareElectResponse"); startCapturingLogMessages(); - getTopoCoord().prepareElectResponse(args, now += 60000, OpTime(), &responseBuilder, &result); + getTopoCoord().prepareElectResponse(args, now += 60000, Timestamp(), &responseBuilder, &result); stopCapturingLogMessages(); BSONObj response = responseBuilder.obj(); ASSERT_OK(result); @@ -2730,7 +2730,7 @@ namespace { // Make sure nay votes, do not prevent subsequent yeas (the way a yea vote would) args.set = "rs0"; BSONObjBuilder responseBuilder2; - getTopoCoord().prepareElectResponse(args, now++, OpTime(), &responseBuilder2, &result); + getTopoCoord().prepareElectResponse(args, now++, Timestamp(), &responseBuilder2, &result); BSONObj response2 = responseBuilder2.obj(); ASSERT_EQUALS(1, response2["vote"].Int()); ASSERT_EQUALS(round, response2["round"].OID()); @@ -2747,7 +2747,7 @@ namespace { BSONObjBuilder responseBuilder; Status result = Status(ErrorCodes::InternalError, "status not set by prepareElectResponse"); startCapturingLogMessages(); - getTopoCoord().prepareElectResponse(args, now += 60000, OpTime(), &responseBuilder, &result); + getTopoCoord().prepareElectResponse(args, now += 60000, Timestamp(), &responseBuilder, &result); stopCapturingLogMessages(); BSONObj response = responseBuilder.obj(); ASSERT_OK(result); @@ -2759,7 +2759,7 @@ namespace { // Make sure nay votes, do not prevent subsequent yeas (the way a yea vote would) args.cfgver = 10; BSONObjBuilder responseBuilder2; - getTopoCoord().prepareElectResponse(args, now++, OpTime(), &responseBuilder2, &result); + getTopoCoord().prepareElectResponse(args, now++, Timestamp(), &responseBuilder2, &result); BSONObj response2 = responseBuilder2.obj(); ASSERT_EQUALS(1, response2["vote"].Int()); ASSERT_EQUALS(round, response2["round"].OID()); @@ -2776,7 +2776,7 @@ namespace { BSONObjBuilder responseBuilder; Status result = Status(ErrorCodes::InternalError, "status not set by prepareElectResponse"); startCapturingLogMessages(); - getTopoCoord().prepareElectResponse(args, now += 60000, OpTime(), &responseBuilder, &result); + getTopoCoord().prepareElectResponse(args, now += 60000, Timestamp(), &responseBuilder, &result); stopCapturingLogMessages(); BSONObj response = responseBuilder.obj(); ASSERT_OK(result); @@ -2788,7 +2788,7 @@ namespace { // Make sure nay votes, do not prevent subsequent yeas (the way a yea vote would) args.cfgver = 10; BSONObjBuilder responseBuilder2; - getTopoCoord().prepareElectResponse(args, now++, OpTime(), &responseBuilder2, &result); + getTopoCoord().prepareElectResponse(args, now++, Timestamp(), &responseBuilder2, &result); BSONObj response2 = responseBuilder2.obj(); ASSERT_EQUALS(1, response2["vote"].Int()); ASSERT_EQUALS(round, response2["round"].OID()); @@ -2805,7 +2805,7 @@ namespace { BSONObjBuilder responseBuilder; Status result = Status(ErrorCodes::InternalError, "status not set by prepareElectResponse"); startCapturingLogMessages(); - getTopoCoord().prepareElectResponse(args, now += 60000, OpTime(), &responseBuilder, &result); + getTopoCoord().prepareElectResponse(args, now += 60000, Timestamp(), &responseBuilder, &result); stopCapturingLogMessages(); BSONObj response = responseBuilder.obj(); ASSERT_OK(result); @@ -2816,7 +2816,7 @@ namespace { // Make sure nay votes, do not prevent subsequent yeas (the way a yea vote would) args.whoid = 1; BSONObjBuilder responseBuilder2; - getTopoCoord().prepareElectResponse(args, now++, OpTime(), &responseBuilder2, &result); + getTopoCoord().prepareElectResponse(args, now++, Timestamp(), &responseBuilder2, &result); BSONObj response2 = responseBuilder2.obj(); ASSERT_EQUALS(1, response2["vote"].Int()); ASSERT_EQUALS(round, response2["round"].OID()); @@ -2835,7 +2835,7 @@ namespace { BSONObjBuilder responseBuilder; Status result = Status(ErrorCodes::InternalError, "status not set by prepareElectResponse"); startCapturingLogMessages(); - getTopoCoord().prepareElectResponse(args, now += 60000, OpTime(), &responseBuilder, &result); + getTopoCoord().prepareElectResponse(args, now += 60000, Timestamp(), &responseBuilder, &result); stopCapturingLogMessages(); BSONObj response = responseBuilder.obj(); ASSERT_OK(result); @@ -2846,7 +2846,7 @@ namespace { // Make sure nay votes, do not prevent subsequent yeas (the way a yea vote would) getTopoCoord()._setCurrentPrimaryForTest(-1); BSONObjBuilder responseBuilder2; - getTopoCoord().prepareElectResponse(args, now++, OpTime(), &responseBuilder2, &result); + getTopoCoord().prepareElectResponse(args, now++, Timestamp(), &responseBuilder2, &result); BSONObj response2 = responseBuilder2.obj(); ASSERT_EQUALS(1, response2["vote"].Int()); ASSERT_EQUALS(round, response2["round"].OID()); @@ -2864,7 +2864,7 @@ namespace { BSONObjBuilder responseBuilder; Status result = Status(ErrorCodes::InternalError, "status not set by prepareElectResponse"); startCapturingLogMessages(); - getTopoCoord().prepareElectResponse(args, now += 60000, OpTime(), &responseBuilder, &result); + getTopoCoord().prepareElectResponse(args, now += 60000, Timestamp(), &responseBuilder, &result); stopCapturingLogMessages(); BSONObj response = responseBuilder.obj(); ASSERT_OK(result); @@ -2875,7 +2875,7 @@ namespace { // Make sure nay votes, do not prevent subsequent yeas (the way a yea vote would) getTopoCoord()._setCurrentPrimaryForTest(-1); BSONObjBuilder responseBuilder2; - getTopoCoord().prepareElectResponse(args, now++, OpTime(), &responseBuilder2, &result); + getTopoCoord().prepareElectResponse(args, now++, Timestamp(), &responseBuilder2, &result); BSONObj response2 = responseBuilder2.obj(); ASSERT_EQUALS(1, response2["vote"].Int()); ASSERT_EQUALS(round, response2["round"].OID()); @@ -2894,7 +2894,7 @@ namespace { BSONObjBuilder responseBuilder; Status result = Status(ErrorCodes::InternalError, "status not set by prepareElectResponse"); startCapturingLogMessages(); - getTopoCoord().prepareElectResponse(args, now += 60000, OpTime(), &responseBuilder, &result); + getTopoCoord().prepareElectResponse(args, now += 60000, Timestamp(), &responseBuilder, &result); stopCapturingLogMessages(); BSONObj response = responseBuilder.obj(); ASSERT_OK(result); @@ -2905,7 +2905,7 @@ namespace { // Make sure nay votes, do not prevent subsequent yeas (the way a yea vote would) args.whoid = 3; BSONObjBuilder responseBuilder2; - getTopoCoord().prepareElectResponse(args, now++, OpTime(), &responseBuilder2, &result); + getTopoCoord().prepareElectResponse(args, now++, Timestamp(), &responseBuilder2, &result); BSONObj response2 = responseBuilder2.obj(); ASSERT_EQUALS(1, response2["vote"].Int()); ASSERT_EQUALS(round, response2["round"].OID()); @@ -2920,13 +2920,13 @@ namespace { args.cfgver = 10; args.whoid = 1; - receiveDownHeartbeat(HostAndPort("h3"), "rs0", OpTime()); - receiveDownHeartbeat(HostAndPort("h2"), "rs0", OpTime()); + receiveDownHeartbeat(HostAndPort("h3"), "rs0", Timestamp()); + receiveDownHeartbeat(HostAndPort("h2"), "rs0", Timestamp()); BSONObjBuilder responseBuilder; Status result = Status::OK(); startCapturingLogMessages(); - getTopoCoord().prepareElectResponse(args, now += 60000, OpTime(), &responseBuilder, &result); + getTopoCoord().prepareElectResponse(args, now += 60000, Timestamp(), &responseBuilder, &result); stopCapturingLogMessages(); BSONObj response = responseBuilder.obj(); ASSERT_EQUALS(1, response["vote"].Int()); @@ -2945,7 +2945,7 @@ namespace { BSONObjBuilder responseBuilder1; Status result = Status(ErrorCodes::InternalError, "status not set by prepareElectResponse"); startCapturingLogMessages(); - getTopoCoord().prepareElectResponse(args, now += 60000, OpTime(), &responseBuilder1, &result); + getTopoCoord().prepareElectResponse(args, now += 60000, Timestamp(), &responseBuilder1, &result); stopCapturingLogMessages(); BSONObj response1 = responseBuilder1.obj(); ASSERT_OK(result); @@ -2958,7 +2958,7 @@ namespace { BSONObjBuilder responseBuilder2; startCapturingLogMessages(); - getTopoCoord().prepareElectResponse(args, now, OpTime(), &responseBuilder2, &result); + getTopoCoord().prepareElectResponse(args, now, Timestamp(), &responseBuilder2, &result); stopCapturingLogMessages(); BSONObj response2 = responseBuilder2.obj(); ASSERT_OK(result); @@ -2972,7 +2972,7 @@ namespace { BSONObjBuilder responseBuilder3; startCapturingLogMessages(); - getTopoCoord().prepareElectResponse(args, now++, OpTime(), &responseBuilder3, &result); + getTopoCoord().prepareElectResponse(args, now++, Timestamp(), &responseBuilder3, &result); stopCapturingLogMessages(); BSONObj response3 = responseBuilder3.obj(); ASSERT_OK(result); @@ -2985,7 +2985,7 @@ namespace { ReplicationCoordinator::ReplSetElectArgs args; BSONObjBuilder response; Status status = Status(ErrorCodes::InternalError, "status not set by prepareElectResponse"); - getTopoCoord().prepareElectResponse(args, now(), OpTime(), &response, &status); + getTopoCoord().prepareElectResponse(args, now(), Timestamp(), &response, &status); ASSERT_EQUALS(ErrorCodes::ReplicaSetNotFound, status); ASSERT_EQUALS("Cannot participate in election because not initialized", status.reason()); } @@ -3102,7 +3102,7 @@ namespace { BSONObjBuilder response; getTopoCoord().prepareSyncFromResponse(cbData(), HostAndPort("host2:27017"), - OpTime(0,0), + Timestamp(0,0), &response, &result); ASSERT_EQUALS(ErrorCodes::ShutdownInProgress, result); @@ -3116,7 +3116,7 @@ namespace { getTopoCoord().prepareStatusResponse(cbData(), Date_t(0), 0, - OpTime(0,0), + Timestamp(0,0), &response, &result); ASSERT_EQUALS(ErrorCodes::ShutdownInProgress, result); @@ -3139,7 +3139,7 @@ namespace { } void prepareHeartbeatResponse(const ReplSetHeartbeatArgs& args, - OpTime lastOpApplied, + Timestamp lastOpApplied, ReplSetHeartbeatResponse* response, Status* result) { *result = getTopoCoord().prepareHeartbeatResponse(now()++, @@ -3159,7 +3159,7 @@ namespace { Status result(ErrorCodes::InternalError, "prepareHeartbeatResponse didn't set result"); // prepare response and check the results - prepareHeartbeatResponse(args, OpTime(0,0), &response, &result); + prepareHeartbeatResponse(args, Timestamp(0,0), &response, &result); ASSERT_EQUALS(ErrorCodes::BadValue, result); ASSERT_EQUALS("replset: incompatible replset protocol version: 3", result.reason()); ASSERT_EQUALS("", response.getHbMsg()); @@ -3173,7 +3173,7 @@ namespace { args.setSenderId(10); ReplSetHeartbeatResponse response; Status result(ErrorCodes::InternalError, "prepareHeartbeatResponse didn't set result"); - prepareHeartbeatResponse(args, OpTime(0,0), &response, &result); + prepareHeartbeatResponse(args, Timestamp(0,0), &response, &result); ASSERT_EQUALS(ErrorCodes::BadValue, result); ASSERT(result.reason().find("from member with the same member ID as our self")) << "Actual string was \"" << result.reason() << '"'; @@ -3189,7 +3189,7 @@ namespace { Status result(ErrorCodes::InternalError, "prepareHeartbeatResponse didn't set result"); startCapturingLogMessages(); - prepareHeartbeatResponse(args, OpTime(0,0), &response, &result); + prepareHeartbeatResponse(args, Timestamp(0,0), &response, &result); stopCapturingLogMessages(); ASSERT_EQUALS(ErrorCodes::InconsistentReplicaSetNames, result); ASSERT(result.reason().find("repl set names do not match")) << "Actual string was \"" << @@ -3211,12 +3211,12 @@ namespace { Status result(ErrorCodes::InternalError, "prepareHeartbeatResponse didn't set result"); // prepare response and check the results - prepareHeartbeatResponse(args, OpTime(0,0), &response, &result); + prepareHeartbeatResponse(args, Timestamp(0,0), &response, &result); ASSERT_OK(result); ASSERT_FALSE(response.isElectable()); ASSERT_TRUE(response.isReplSet()); ASSERT_EQUALS(MemberState::RS_SECONDARY, response.getState().s); - ASSERT_EQUALS(OpTime(0,0), response.getOpTime()); + ASSERT_EQUALS(Timestamp(0,0), response.getOpTime()); ASSERT_EQUALS(Seconds(0).total_milliseconds(), response.getTime().total_milliseconds()); ASSERT_EQUALS("", response.getHbMsg()); ASSERT_EQUALS("rs0", response.getReplicaSetName()); @@ -3234,12 +3234,12 @@ namespace { Status result(ErrorCodes::InternalError, "prepareHeartbeatResponse didn't set result"); // prepare response and check the results - prepareHeartbeatResponse(args, OpTime(0,0), &response, &result); + prepareHeartbeatResponse(args, Timestamp(0,0), &response, &result); ASSERT_OK(result); ASSERT_FALSE(response.isElectable()); ASSERT_TRUE(response.isReplSet()); ASSERT_EQUALS(MemberState::RS_SECONDARY, response.getState().s); - ASSERT_EQUALS(OpTime(0,0), response.getOpTime()); + ASSERT_EQUALS(Timestamp(0,0), response.getOpTime()); ASSERT_EQUALS(Seconds(0).total_milliseconds(), response.getTime().total_milliseconds()); ASSERT_EQUALS("", response.getHbMsg()); ASSERT_EQUALS("rs0", response.getReplicaSetName()); @@ -3257,13 +3257,13 @@ namespace { Status result(ErrorCodes::InternalError, "prepareHeartbeatResponse didn't set result"); // prepare response and check the results - prepareHeartbeatResponse(args, OpTime(0,0), &response, &result); + prepareHeartbeatResponse(args, Timestamp(0,0), &response, &result); ASSERT_OK(result); ASSERT_TRUE(response.hasConfig()); ASSERT_FALSE(response.isElectable()); ASSERT_TRUE(response.isReplSet()); ASSERT_EQUALS(MemberState::RS_SECONDARY, response.getState().s); - ASSERT_EQUALS(OpTime(0,0), response.getOpTime()); + ASSERT_EQUALS(Timestamp(0,0), response.getOpTime()); ASSERT_EQUALS(Seconds(0).total_milliseconds(), response.getTime().total_milliseconds()); ASSERT_EQUALS("", response.getHbMsg()); ASSERT_EQUALS("rs0", response.getReplicaSetName()); @@ -3281,13 +3281,13 @@ namespace { Status result(ErrorCodes::InternalError, "prepareHeartbeatResponse didn't set result"); // prepare response and check the results - prepareHeartbeatResponse(args, OpTime(0,0), &response, &result); + prepareHeartbeatResponse(args, Timestamp(0,0), &response, &result); ASSERT_OK(result); ASSERT_FALSE(response.hasConfig()); ASSERT_FALSE(response.isElectable()); ASSERT_TRUE(response.isReplSet()); ASSERT_EQUALS(MemberState::RS_SECONDARY, response.getState().s); - ASSERT_EQUALS(OpTime(0,0), response.getOpTime()); + ASSERT_EQUALS(Timestamp(0,0), response.getOpTime()); ASSERT_EQUALS(Seconds(0).total_milliseconds(), response.getTime().total_milliseconds()); ASSERT_EQUALS("", response.getHbMsg()); ASSERT_EQUALS("rs0", response.getReplicaSetName()); @@ -3305,12 +3305,12 @@ namespace { Status result(ErrorCodes::InternalError, "prepareHeartbeatResponse didn't set result"); // prepare response and check the results - prepareHeartbeatResponse(args, OpTime(0,0), &response, &result); + prepareHeartbeatResponse(args, Timestamp(0,0), &response, &result); ASSERT_OK(result); ASSERT_FALSE(response.isElectable()); ASSERT_TRUE(response.isReplSet()); ASSERT_EQUALS(MemberState::RS_SECONDARY, response.getState().s); - ASSERT_EQUALS(OpTime(0,0), response.getOpTime()); + ASSERT_EQUALS(Timestamp(0,0), response.getOpTime()); ASSERT_EQUALS(Seconds(0).total_milliseconds(), response.getTime().total_milliseconds()); ASSERT_EQUALS("", response.getHbMsg()); ASSERT_EQUALS("rs0", response.getReplicaSetName()); @@ -3320,7 +3320,7 @@ namespace { TEST_F(PrepareHeartbeatResponseTest, PrepareHeartbeatResponseSenderUp) { // set up args and acknowledge sender - heartbeatFromMember(HostAndPort("h2"), "rs0", MemberState::RS_SECONDARY, OpTime(0,0)); + heartbeatFromMember(HostAndPort("h2"), "rs0", MemberState::RS_SECONDARY, Timestamp(0,0)); ReplSetHeartbeatArgs args; args.setProtocolVersion(1); args.setConfigVersion(1); @@ -3330,13 +3330,13 @@ namespace { Status result(ErrorCodes::InternalError, "prepareHeartbeatResponse didn't set result"); // prepare response and check the results - prepareHeartbeatResponse(args, OpTime(100,0), &response, &result); + prepareHeartbeatResponse(args, Timestamp(100,0), &response, &result); ASSERT_OK(result); // this change to true because we can now see a majority, unlike in the previous cases ASSERT_TRUE(response.isElectable()); ASSERT_TRUE(response.isReplSet()); ASSERT_EQUALS(MemberState::RS_SECONDARY, response.getState().s); - ASSERT_EQUALS(OpTime(100,0), response.getOpTime()); + ASSERT_EQUALS(Timestamp(100,0), response.getOpTime()); ASSERT_EQUALS(Seconds(0).total_milliseconds(), response.getTime().total_milliseconds()); ASSERT_EQUALS("", response.getHbMsg()); ASSERT_EQUALS("rs0", response.getReplicaSetName()); @@ -3355,14 +3355,14 @@ namespace { Status result = getTopoCoord().prepareHeartbeatResponse(now()++, args, "rs0", - OpTime(0,0), + Timestamp(0,0), &response); ASSERT_OK(result); // this change to true because we can now see a majority, unlike in the previous cases ASSERT_FALSE(response.isElectable()); ASSERT_TRUE(response.isReplSet()); ASSERT_EQUALS(MemberState::RS_STARTUP, response.getState().s); - ASSERT_EQUALS(OpTime(0,0), response.getOpTime()); + ASSERT_EQUALS(Timestamp(0,0), response.getOpTime()); ASSERT_EQUALS(Seconds(0).total_milliseconds(), response.getTime().total_milliseconds()); ASSERT_EQUALS("", response.getHbMsg()); ASSERT_EQUALS("", response.getReplicaSetName()); @@ -3370,8 +3370,8 @@ namespace { } TEST_F(PrepareHeartbeatResponseTest, PrepareHeartbeatResponseAsPrimary) { - makeSelfPrimary(OpTime(10,0)); - heartbeatFromMember(HostAndPort("h2"), "rs0", MemberState::RS_SECONDARY, OpTime(0,0)); + makeSelfPrimary(Timestamp(10,0)); + heartbeatFromMember(HostAndPort("h2"), "rs0", MemberState::RS_SECONDARY, Timestamp(0,0)); ReplSetHeartbeatArgs args; args.setProtocolVersion(1); @@ -3382,14 +3382,14 @@ namespace { Status result(ErrorCodes::InternalError, "prepareHeartbeatResponse didn't set result"); // prepare response and check the results - prepareHeartbeatResponse(args, OpTime(11,0), &response, &result); + prepareHeartbeatResponse(args, Timestamp(11,0), &response, &result); ASSERT_OK(result); // electable because we are already primary ASSERT_TRUE(response.isElectable()); ASSERT_TRUE(response.isReplSet()); ASSERT_EQUALS(MemberState::RS_PRIMARY, response.getState().s); - ASSERT_EQUALS(OpTime(11,0), response.getOpTime()); - ASSERT_EQUALS(OpTime(10,0), response.getElectionTime()); + ASSERT_EQUALS(Timestamp(11,0), response.getOpTime()); + ASSERT_EQUALS(Timestamp(10,0), response.getElectionTime()); ASSERT_EQUALS(Seconds(0).total_milliseconds(), response.getTime().total_milliseconds()); ASSERT_EQUALS("", response.getHbMsg()); ASSERT_EQUALS("rs0", response.getReplicaSetName()); @@ -3398,11 +3398,11 @@ namespace { TEST_F(PrepareHeartbeatResponseTest, PrepareHeartbeatResponseWithSyncSource) { // get a sync source - heartbeatFromMember(HostAndPort("h3"), "rs0", MemberState::RS_SECONDARY, OpTime(0,0)); - heartbeatFromMember(HostAndPort("h3"), "rs0", MemberState::RS_SECONDARY, OpTime(0,0)); - heartbeatFromMember(HostAndPort("h2"), "rs0", MemberState::RS_SECONDARY, OpTime(1,0)); - heartbeatFromMember(HostAndPort("h2"), "rs0", MemberState::RS_SECONDARY, OpTime(1,0)); - getTopoCoord().chooseNewSyncSource(now()++, OpTime(0,0)); + heartbeatFromMember(HostAndPort("h3"), "rs0", MemberState::RS_SECONDARY, Timestamp(0,0)); + heartbeatFromMember(HostAndPort("h3"), "rs0", MemberState::RS_SECONDARY, Timestamp(0,0)); + heartbeatFromMember(HostAndPort("h2"), "rs0", MemberState::RS_SECONDARY, Timestamp(1,0)); + heartbeatFromMember(HostAndPort("h2"), "rs0", MemberState::RS_SECONDARY, Timestamp(1,0)); + getTopoCoord().chooseNewSyncSource(now()++, Timestamp(0,0)); // set up args ReplSetHeartbeatArgs args; @@ -3414,12 +3414,12 @@ namespace { Status result(ErrorCodes::InternalError, "prepareHeartbeatResponse didn't set result"); // prepare response and check the results - prepareHeartbeatResponse(args, OpTime(100,0), &response, &result); + prepareHeartbeatResponse(args, Timestamp(100,0), &response, &result); ASSERT_OK(result); ASSERT_TRUE(response.isElectable()); ASSERT_TRUE(response.isReplSet()); ASSERT_EQUALS(MemberState::RS_SECONDARY, response.getState().s); - ASSERT_EQUALS(OpTime(100,0), response.getOpTime()); + ASSERT_EQUALS(Timestamp(100,0), response.getOpTime()); ASSERT_EQUALS(Seconds(0).total_milliseconds(), response.getTime().total_milliseconds()); // changed to a syncing message because our sync source changed recently ASSERT_EQUALS("syncing from: h2:27017", response.getHbMsg()); @@ -3453,7 +3453,7 @@ namespace { "version" << 1 << "members" << BSON_ARRAY( BSON("_id" << 1 << "host" << "hself" << "priority" << 0)))); - getTopoCoord().updateConfig(cfg, 0, now()++, OpTime()); + getTopoCoord().updateConfig(cfg, 0, now()++, Timestamp()); ASSERT_EQUALS(MemberState::RS_STARTUP2, getTopoCoord().getMemberState().s); ASSERT_FALSE(TopologyCoordinator::Role::candidate == getTopoCoord().getRole()); @@ -3480,7 +3480,7 @@ namespace { "members" << BSON_ARRAY( BSON("_id" << 1 << "host" << "hself" << "priority" << 0)))); - getTopoCoord().updateConfig(cfg, 0, now()++, OpTime()); + getTopoCoord().updateConfig(cfg, 0, now()++, Timestamp()); ASSERT_EQUALS(MemberState::RS_STARTUP2, getTopoCoord().getMemberState().s); // despite being the only node, we are unelectable, so we should not become a candidate @@ -3556,7 +3556,7 @@ namespace { ASSERT_TRUE(TopologyCoordinator::Role::candidate == getTopoCoord().getRole()); // win election and primary - getTopoCoord().processWinElection(OID::gen(), OpTime(0,0)); + getTopoCoord().processWinElection(OID::gen(), Timestamp(0,0)); ASSERT_TRUE(TopologyCoordinator::Role::leader == getTopoCoord().getRole()); ASSERT_EQUALS(MemberState::RS_PRIMARY, getTopoCoord().getMemberState().s); @@ -3586,7 +3586,7 @@ namespace { ASSERT_TRUE(TopologyCoordinator::Role::candidate == getTopoCoord().getRole()); // win election and primary - getTopoCoord().processWinElection(OID::gen(), OpTime(0,0)); + getTopoCoord().processWinElection(OID::gen(), Timestamp(0,0)); ASSERT_TRUE(TopologyCoordinator::Role::leader == getTopoCoord().getRole()); ASSERT_EQUALS(MemberState::RS_PRIMARY, getTopoCoord().getMemberState().s); @@ -3617,7 +3617,7 @@ namespace { ASSERT_TRUE(TopologyCoordinator::Role::candidate == getTopoCoord().getRole()); // win election and primary - getTopoCoord().processWinElection(OID::gen(), OpTime(0,0)); + getTopoCoord().processWinElection(OID::gen(), Timestamp(0,0)); ASSERT_TRUE(TopologyCoordinator::Role::leader == getTopoCoord().getRole()); ASSERT_EQUALS(MemberState::RS_PRIMARY, getTopoCoord().getMemberState().s); @@ -3631,7 +3631,7 @@ namespace { BSON("_id" << 2 << "host" << "host3:27017"))), 0, Date_t(-1), - OpTime(10,0)); + Timestamp(10,0)); ASSERT_TRUE(TopologyCoordinator::Role::leader == getTopoCoord().getRole()); ASSERT_EQUALS(MemberState::RS_PRIMARY, getTopoCoord().getMemberState().s); @@ -3646,7 +3646,7 @@ namespace { "tags" << BSON("dc" << "NA" << "rack" << "rack1")))), 0, Date_t(-1), - OpTime(10,0)); + Timestamp(10,0)); ASSERT_TRUE(TopologyCoordinator::Role::leader == getTopoCoord().getRole()); ASSERT_EQUALS(MemberState::RS_PRIMARY, getTopoCoord().getMemberState().s); } @@ -3676,8 +3676,8 @@ namespace { } TEST_F(HeartbeatResponseTest, ReconfigBetweenHeartbeatRequestAndRepsonse) { - OpTime election = OpTime(14,0); - OpTime lastOpTimeApplied = OpTime(13,0); + Timestamp election = Timestamp(14,0); + Timestamp lastOpTimeApplied = Timestamp(13,0); // all three members up and secondaries setSelfMemberState(MemberState::RS_SECONDARY); @@ -3727,8 +3727,8 @@ namespace { } TEST_F(HeartbeatResponseTest, ReconfigNodeRemovedBetweenHeartbeatRequestAndRepsonse) { - OpTime election = OpTime(14,0); - OpTime lastOpTimeApplied = OpTime(13,0); + Timestamp election = Timestamp(14,0); + Timestamp lastOpTimeApplied = Timestamp(13,0); // all three members up and secondaries setSelfMemberState(MemberState::RS_SECONDARY); @@ -3793,10 +3793,10 @@ namespace { TEST_F(HeartbeatResponseTest, ShouldChangeSyncSourceFresherHappierMemberExists) { // In this test, the TopologyCoordinator should tell us to change sync sources away from // "host2" and to "host3" since "host2" is more than maxSyncSourceLagSecs(30) behind "host3" - OpTime election = OpTime(0,0); - OpTime lastOpTimeApplied = OpTime(4,0); + Timestamp election = Timestamp(0,0); + Timestamp lastOpTimeApplied = Timestamp(4,0); // ahead by more than maxSyncSourceLagSecs (30) - OpTime fresherLastOpTimeApplied = OpTime(3005,0); + Timestamp fresherLastOpTimeApplied = Timestamp(3005,0); HeartbeatResponseAction nextAction = receiveUpHeartbeat(HostAndPort("host2"), "rs0", @@ -3826,10 +3826,10 @@ namespace { // "host2" and to "host3" despite "host2" being more than maxSyncSourceLagSecs(30) behind // "host3", since "host3" is blacklisted // Then, confirm that unblacklisting only works if time has passed the blacklist time. - OpTime election = OpTime(0,0); - OpTime lastOpTimeApplied = OpTime(400,0); + Timestamp election = Timestamp(0,0); + Timestamp lastOpTimeApplied = Timestamp(400,0); // ahead by more than maxSyncSourceLagSecs (30) - OpTime fresherLastOpTimeApplied = OpTime(3005,0); + Timestamp fresherLastOpTimeApplied = Timestamp(3005,0); HeartbeatResponseAction nextAction = receiveUpHeartbeat(HostAndPort("host2"), "rs0", @@ -3867,10 +3867,10 @@ namespace { // In this test, the TopologyCoordinator should not tell us to change sync sources away from // "host2" and to "host3" despite "host2" being more than maxSyncSourceLagSecs(30) behind // "host3", since "host3" is down - OpTime election = OpTime(0,0); - OpTime lastOpTimeApplied = OpTime(400,0); + Timestamp election = Timestamp(0,0); + Timestamp lastOpTimeApplied = Timestamp(400,0); // ahead by more than maxSyncSourceLagSecs (30) - OpTime fresherLastOpTimeApplied = OpTime(3005,0); + Timestamp fresherLastOpTimeApplied = Timestamp(3005,0); HeartbeatResponseAction nextAction = receiveUpHeartbeat(HostAndPort("host2"), "rs0", @@ -3898,10 +3898,10 @@ namespace { // In this test, the TopologyCoordinator should not tell us to change sync sources away from // "host2" and to "host3" despite "host2" being more than maxSyncSourceLagSecs(30) behind // "host3", since "host3" is in a non-readable mode (RS_ROLLBACK) - OpTime election = OpTime(0,0); - OpTime lastOpTimeApplied = OpTime(4,0); + Timestamp election = Timestamp(0,0); + Timestamp lastOpTimeApplied = Timestamp(4,0); // ahead by more than maxSyncSourceLagSecs (30) - OpTime fresherLastOpTimeApplied = OpTime(3005,0); + Timestamp fresherLastOpTimeApplied = Timestamp(3005,0); HeartbeatResponseAction nextAction = receiveUpHeartbeat(HostAndPort("host2"), "rs0", @@ -3927,10 +3927,10 @@ namespace { // In this test, the TopologyCoordinator should not tell us to change sync sources away from // "host2" and to "host3" despite "host2" being more than maxSyncSourceLagSecs(30) behind // "host3", since "host3" does not build indexes - OpTime election = OpTime(0,0); - OpTime lastOpTimeApplied = OpTime(4,0); + Timestamp election = Timestamp(0,0); + Timestamp lastOpTimeApplied = Timestamp(4,0); // ahead by more than maxSyncSourceLagSecs (30) - OpTime fresherLastOpTimeApplied = OpTime(3005,0); + Timestamp fresherLastOpTimeApplied = Timestamp(3005,0); updateConfig(BSON("_id" << "rs0" << "version" << 6 << @@ -3963,10 +3963,10 @@ namespace { // In this test, the TopologyCoordinator should tell us to change sync sources away from // "host2" and to "host3" despite "host3" not building indexes because we do not build // indexes either and "host2" is more than maxSyncSourceLagSecs(30) behind "host3" - OpTime election = OpTime(0,0); - OpTime lastOpTimeApplied = OpTime(4,0); + Timestamp election = Timestamp(0,0); + Timestamp lastOpTimeApplied = Timestamp(4,0); // ahead by more than maxSyncSourceLagSecs (30) - OpTime fresherLastOpTimeApplied = OpTime(3005,0); + Timestamp fresherLastOpTimeApplied = Timestamp(3005,0); updateConfig(BSON("_id" << "rs0" << "version" << 7 << @@ -4009,8 +4009,8 @@ namespace { 0); setSelfMemberState(MemberState::RS_SECONDARY); - heartbeatFromMember(HostAndPort("h2"), "rs0", MemberState::RS_PRIMARY, OpTime(1,0)); - ASSERT_FALSE(getTopoCoord().checkShouldStandForElection(now()++, OpTime(0,0))); + heartbeatFromMember(HostAndPort("h2"), "rs0", MemberState::RS_PRIMARY, Timestamp(1,0)); + ASSERT_FALSE(getTopoCoord().checkShouldStandForElection(now()++, Timestamp(0,0))); } TEST_F(TopoCoordTest, CheckShouldStandForElectionNotCloseEnoughToLastOptime) { @@ -4023,8 +4023,8 @@ namespace { 0); setSelfMemberState(MemberState::RS_SECONDARY); - heartbeatFromMember(HostAndPort("h2"), "rs0", MemberState::RS_SECONDARY, OpTime(10000,0)); - ASSERT_FALSE(getTopoCoord().checkShouldStandForElection(now()++, OpTime(100,0))); + heartbeatFromMember(HostAndPort("h2"), "rs0", MemberState::RS_SECONDARY, Timestamp(10000,0)); + ASSERT_FALSE(getTopoCoord().checkShouldStandForElection(now()++, Timestamp(100,0))); } TEST_F(TopoCoordTest, VoteForMyselfFailsWhileNotCandidate) { @@ -4053,7 +4053,7 @@ namespace { TEST_F(TopoCoordTest, UnelectableIfAbsentFromConfig) { logger::globalLogDomain()->setMinimumLoggedSeverity(logger::LogSeverity::Debug(3)); startCapturingLogMessages(); - ASSERT_FALSE(getTopoCoord().checkShouldStandForElection(now()++, OpTime(10,0))); + ASSERT_FALSE(getTopoCoord().checkShouldStandForElection(now()++, Timestamp(10,0))); stopCapturingLogMessages(); ASSERT_EQUALS(1, countLogLinesContaining("not a member of a valid replica set config")); logger::globalLogDomain()->setMinimumLoggedSeverity(logger::LogSeverity::Log()); @@ -4068,7 +4068,7 @@ namespace { BSON("_id" << 30 << "host" << "h3"))), 0); setSelfMemberState(MemberState::RS_SECONDARY); - heartbeatFromMember(HostAndPort("h2"), "rs0", MemberState::RS_SECONDARY, OpTime(100,0)); + heartbeatFromMember(HostAndPort("h2"), "rs0", MemberState::RS_SECONDARY, Timestamp(100,0)); // vote for another node OID remoteRound = OID::gen(); @@ -4083,7 +4083,7 @@ namespace { BSONObjBuilder electResponseBuilder; Status result = Status(ErrorCodes::InternalError, "status not set by prepareElectResponse"); getTopoCoord().prepareElectResponse( - electArgs, now()++, OpTime(100,0), &electResponseBuilder, &result); + electArgs, now()++, Timestamp(100,0), &electResponseBuilder, &result); BSONObj response = electResponseBuilder.obj(); ASSERT_OK(result); std::cout << response; @@ -4092,7 +4092,7 @@ namespace { logger::globalLogDomain()->setMinimumLoggedSeverity(logger::LogSeverity::Debug(3)); startCapturingLogMessages(); - ASSERT_FALSE(getTopoCoord().checkShouldStandForElection(now()++, OpTime(10,0))); + ASSERT_FALSE(getTopoCoord().checkShouldStandForElection(now()++, Timestamp(10,0))); stopCapturingLogMessages(); ASSERT_EQUALS(1, countLogLinesContaining("I recently voted for ")); logger::globalLogDomain()->setMinimumLoggedSeverity(logger::LogSeverity::Log()); diff --git a/src/mongo/db/repl/update_position_args.cpp b/src/mongo/db/repl/update_position_args.cpp index 78b08bfc483..39b0aa762f9 100644 --- a/src/mongo/db/repl/update_position_args.cpp +++ b/src/mongo/db/repl/update_position_args.cpp @@ -40,7 +40,7 @@ namespace repl { UpdatePositionArgs::UpdateInfo::UpdateInfo( - const OID& anRid, const OpTime& aTs, long long aCfgver, long long aMemberId) + const OID& anRid, const Timestamp& aTs, long long aCfgver, long long aMemberId) : rid(anRid), ts(aTs), cfgver(aCfgver), memberId(aMemberId) {} namespace { @@ -93,8 +93,8 @@ namespace { if (!status.isOK()) return status; - OpTime ts; - status = bsonExtractOpTimeField(entry, kOpTimeFieldName, &ts); + Timestamp ts; + status = bsonExtractTimestampField(entry, kOpTimeFieldName, &ts); if (!status.isOK()) return status; diff --git a/src/mongo/db/repl/update_position_args.h b/src/mongo/db/repl/update_position_args.h index 9d9afebced2..e0fb6ebf805 100644 --- a/src/mongo/db/repl/update_position_args.h +++ b/src/mongo/db/repl/update_position_args.h @@ -44,10 +44,10 @@ namespace repl { class UpdatePositionArgs { public: struct UpdateInfo { - UpdateInfo(const OID& anRid, const OpTime& aTs, long long aCfgver, long long aMemberId); + UpdateInfo(const OID& anRid, const Timestamp& aTs, long long aCfgver, long long aMemberId); OID rid; - OpTime ts; + Timestamp ts; long long cfgver; long long memberId; }; |