From e87716a9286b6aa6f63a513012e55f6e42f634a2 Mon Sep 17 00:00:00 2001 From: Eric Milkie Date: Tue, 7 Apr 2015 16:42:23 -0400 Subject: SERVER-15047 Remove undefined behavior from Timestamp --- src/mongo/bson/bsonelement.h | 5 +- src/mongo/bson/bsonobjbuilder.h | 33 +- src/mongo/bson/timestamp.cpp | 28 +- src/mongo/bson/timestamp.h | 128 ++++--- src/mongo/db/ops/modifier_object_replace.cpp | 19 +- src/mongo/db/pipeline/value.h | 4 +- src/mongo/db/repl/master_slave.cpp | 5 +- src/mongo/db/repl/oplog.cpp | 2 +- .../db/repl/repl_set_heartbeat_response_test.cpp | 84 ++--- .../db/repl/topology_coordinator_impl_test.cpp | 392 ++++++++++++--------- .../s/write_ops/batched_command_response_test.cpp | 3 +- 11 files changed, 383 insertions(+), 320 deletions(-) (limited to 'src') diff --git a/src/mongo/bson/bsonelement.h b/src/mongo/bson/bsonelement.h index cc5c687f8d7..a5919d7f6d7 100644 --- a/src/mongo/bson/bsonelement.h +++ b/src/mongo/bson/bsonelement.h @@ -454,9 +454,10 @@ namespace mongo { } Timestamp timestamp() const { + Timestamp result; if( type() == mongo::Date || type() == bsonTimestamp ) - return Timestamp(ConstDataView(value()).readLE()); - return Timestamp(); + result.readFrom(value()); + return result; } Date_t timestampTime() const { diff --git a/src/mongo/bson/bsonobjbuilder.h b/src/mongo/bson/bsonobjbuilder.h index 2910e7da58a..2e4bd5ccb10 100644 --- a/src/mongo/bson/bsonobjbuilder.h +++ b/src/mongo/bson/bsonobjbuilder.h @@ -458,16 +458,23 @@ namespace mongo { return *this; } - // Append a Timestamp field -- will be updated to next server Timestamp - BSONObjBuilder& appendTimestamp( StringData fieldName ); - - BSONObjBuilder& appendTimestamp( StringData fieldName , unsigned long long val ); - /** * To store a Timestamp in BSON, use this function. * This captures both the secs and inc fields. */ - BSONObjBuilder& append(StringData fieldName, Timestamp timestamp); + inline BSONObjBuilder& append(StringData fieldName, Timestamp ts) { + ts.append(_b, fieldName); + return *this; + } + + // Append a Timestamp field -- will be updated to next server Timestamp + inline BSONObjBuilder& appendTimestamp(StringData fieldName) { + return append(fieldName, Timestamp()); + } + + inline BSONObjBuilder& appendTimestamp(StringData fieldName, unsigned long long val) { + return append(fieldName, Timestamp(val)); + } /* Append an element of the deprecated DBRef type. @@ -949,18 +956,4 @@ namespace mongo { return *s_->_builder; } - inline BSONObjBuilder& BSONObjBuilder::append(StringData fieldName, Timestamp optime) { - optime.append(_b, fieldName); - return *this; - } - - inline BSONObjBuilder& BSONObjBuilder::appendTimestamp( StringData fieldName ) { - return append(fieldName, Timestamp()); - } - - inline BSONObjBuilder& BSONObjBuilder::appendTimestamp( StringData fieldName, - unsigned long long val ) { - return append(fieldName, Timestamp(val)); - } - } diff --git a/src/mongo/bson/timestamp.cpp b/src/mongo/bson/timestamp.cpp index cfd43fe8fe2..2aea7306e37 100644 --- a/src/mongo/bson/timestamp.cpp +++ b/src/mongo/bson/timestamp.cpp @@ -25,14 +25,15 @@ * then also delete it in the license file. */ -#include "mongo/bson/bsontypes.h" #include "mongo/bson/timestamp.h" +#include #include #include #include #include +#include "mongo/bson/bsontypes.h" #include "mongo/platform/cstdint.h" #include "mongo/util/time_support.h" @@ -45,29 +46,36 @@ namespace mongo { } void Timestamp::append(BufBuilder& builder, const StringData& fieldName) const { - // No endian conversions needed, since we store in-memory representation - // in little endian format, regardless of target endian. - builder.appendNum( static_cast(bsonTimestamp) ); - builder.appendStr( fieldName ); - builder.appendNum( asULL() ); + // No endian conversions needed, since we store in-memory representation + // in little endian format, regardless of target endian. + builder.appendNum( static_cast(bsonTimestamp) ); + builder.appendStr( fieldName ); + builder.appendBuf(&_data, sizeof(_data)); + } + + const void* Timestamp::readFrom(const void* bytes) { + // No endian conversions needed, since we store in-memory representation + // in little endian format, regardless of target endian. + std::memcpy(&_data, bytes, sizeof(_data)); + return reinterpret_cast(bytes) + sizeof(_data); } std::string Timestamp::toStringLong() const { std::stringstream ss; - ss << time_t_to_String_short(secs) << ' '; - ss << std::hex << secs << ':' << i; + ss << time_t_to_String_short(getSecs()) << ' '; + ss << std::hex << getSecs() << ':' << getInc(); return ss.str(); } std::string Timestamp::toStringPretty() const { std::stringstream ss; - ss << time_t_to_String_short(secs) << ':' << std::hex << i; + ss << time_t_to_String_short(getSecs()) << ':' << std::hex << getInc(); return ss.str(); } std::string Timestamp::toString() const { std::stringstream ss; - ss << std::hex << secs << ':' << i; + ss << std::hex << getSecs() << ':' << getInc(); return ss.str(); } diff --git a/src/mongo/bson/timestamp.h b/src/mongo/bson/timestamp.h index b223b5deb50..c18fb85bb07 100644 --- a/src/mongo/bson/timestamp.h +++ b/src/mongo/bson/timestamp.h @@ -27,57 +27,74 @@ #pragma once +#include + +#include "mongo/base/data_cursor.h" #include "mongo/base/data_view.h" +#include "mongo/platform/cstdint.h" #include "mongo/bson/util/builder.h" +#include "mongo/platform/endian.h" #include "mongo/util/assert_util.h" namespace mongo { + class StringData; - /* Timestamp: A combination of current second plus an ordinal value. + /** + * Timestamp: A combination of current second plus an ordinal value, held together in a + * single 64-bit integer, stored in memory as little endian, regardless of local endianness. */ -#pragma pack(4) class Timestamp { - unsigned i; // ordinal comes first so we can do a single 64 bit compare on little endian - unsigned secs; - public: - unsigned getSecs() const { - return secs; - } - unsigned getInc() const { - return i; - } + public: - Timestamp(Date_t date) { - reinterpret_cast(*this) = date.millis; - dassert( (int)secs >= 0 ); - } + Timestamp() = default; - Timestamp(unsigned a, unsigned b) { - secs = a; - i = b; - dassert( (int)secs >= 0 ); - } - Timestamp( const Timestamp& other ) { - secs = other.secs; - i = other.i; - dassert( (int)secs >= 0 ); + explicit Timestamp(Date_t date) { + _data = endian::nativeToLittle(date.millis); + dassert(static_cast(getSecs()) >= 0); } - Timestamp() { - secs = 0; - i = 0; + + Timestamp(unsigned secs, unsigned inc) { + DataCursor(reinterpret_cast(&_data)) + .writeLEAndAdvance(inc) + .writeLE(secs); } // Maximum Timestamp value. static Timestamp max(); + unsigned getSecs() const { + static_assert(sizeof(unsigned) == sizeof(uint32_t), "unsigned must be uint32"); + return ConstDataCursor(reinterpret_cast(&_data)) + .skip() + .readLE(); + } + + unsigned getInc() const { + static_assert(sizeof(unsigned) == sizeof(uint32_t), "unsigned must be uint32"); + return ConstDataCursor(reinterpret_cast(&_data)) + .readLE(); + } + unsigned long long asULL() const { - return reinterpret_cast(&i)[0]; + return endian::littleToNative(_data); } + long long asLL() const { - return reinterpret_cast(&i)[0]; + const unsigned long long val = endian::littleToNative(_data); + return static_cast(val); } - bool isNull() const { return secs == 0; } + bool isNull() const { + return getSecs() == 0; + } + + // Append the BSON representation of this Timestamp to the given BufBuilder with the given + // name. This lives here because Timestamp manages its own serialization format. + void append(BufBuilder& builder, const StringData& fieldName) const; + + // Set the value of this Timestamp to match that of the pointed to bytes. The + // return value points to the first byte not consumed by the read operation. + const void* readFrom(const void* bytes); std::string toStringLong() const; @@ -85,32 +102,35 @@ namespace mongo { std::string toString() const; - bool operator==(const Timestamp& r) const { - return i == r.i && secs == r.secs; - } - bool operator!=(const Timestamp& r) const { - return !(*this == r); - } - bool operator<(const Timestamp& r) const { - if ( secs != r.secs ) - return secs < r.secs; - return i < r.i; - } - bool operator<=(const Timestamp& r) const { - return *this < r || *this == r; - } - bool operator>(const Timestamp& r) const { - return !(*this <= r); - } - bool operator>=(const Timestamp& r) const { - return !(*this < r); + private: + uint64_t _data = 0; + }; + + inline bool operator==(const Timestamp& lhs, const Timestamp& rhs) { + return (lhs.getInc() == rhs.getInc()) && (lhs.getSecs() == rhs.getSecs()); + } + + inline bool operator!=(const Timestamp& lhs, const Timestamp& rhs) { + return !(lhs == rhs); + } + + inline bool operator<(const Timestamp& lhs, const Timestamp& rhs) { + if ( lhs.getSecs() != rhs.getSecs() ) { + return lhs.getSecs() < rhs.getSecs(); } + return lhs.getInc() < rhs.getInc(); + } - // Append the BSON representation of this Timestamp to the given BufBuilder with the given - // name. This lives here because Timestamp manages its own serialization format. - void append(BufBuilder& builder, const StringData& fieldName) const; + inline bool operator<=(const Timestamp& lhs, const Timestamp& rhs) { + return (lhs < rhs) || (lhs == rhs); + } - }; -#pragma pack() + inline bool operator>(const Timestamp& lhs, const Timestamp& rhs) { + return !(lhs <= rhs); + } + + inline bool operator>=(const Timestamp& lhs, const Timestamp& rhs) { + return !(lhs < rhs); + } } // namespace mongo diff --git a/src/mongo/db/ops/modifier_object_replace.cpp b/src/mongo/db/ops/modifier_object_replace.cpp index 5ebbb4bd342..292a1534498 100644 --- a/src/mongo/db/ops/modifier_object_replace.cpp +++ b/src/mongo/db/ops/modifier_object_replace.cpp @@ -28,6 +28,7 @@ #include "mongo/db/ops/modifier_object_replace.h" +#include "mongo/base/data_cursor.h" #include "mongo/base/error_codes.h" #include "mongo/bson/mutable/document.h" #include "mongo/db/global_timestamp.h" @@ -47,16 +48,14 @@ namespace mongo { BSONElement e = i.next(); // Skip _id field -- we do not replace it - if (e.type() == bsonTimestamp && e.fieldNameStringData() != idFieldName) { - // TODO(emilkie): This is not endian-safe. - unsigned long long ×tamp = - *(reinterpret_cast( - const_cast(e.value()))); - if (timestamp == 0) { - // performance note, this locks a mutex: - Timestamp ts(getNextGlobalTimestamp()); - timestamp = ts.asULL(); - } + if (e.type() == bsonTimestamp && + e.fieldNameStringData() != idFieldName && + e.timestamp().getSecs() == 0 && + e.timestamp().getInc() == 0) { + Timestamp ts(getNextGlobalTimestamp()); + DataCursor(const_cast(e.value())) + .writeLEAndAdvance(ts.getInc()) + .writeLE(ts.getSecs()); } } diff --git a/src/mongo/db/pipeline/value.h b/src/mongo/db/pipeline/value.h index 4e30c30564d..88856c76df6 100644 --- a/src/mongo/db/pipeline/value.h +++ b/src/mongo/db/pipeline/value.h @@ -328,7 +328,9 @@ namespace mongo { inline Timestamp Value::getTimestamp() const { verify(getType() == bsonTimestamp); - return Date_t(_storage.timestampValue); + Timestamp ts; + ts.readFrom(&_storage.timestampValue); + return ts; } inline const char* Value::getRegex() const { diff --git a/src/mongo/db/repl/master_slave.cpp b/src/mongo/db/repl/master_slave.cpp index 2165b91da3d..89a00e6d2f8 100644 --- a/src/mongo/db/repl/master_slave.cpp +++ b/src/mongo/db/repl/master_slave.cpp @@ -325,7 +325,7 @@ namespace repl { DBDirectClient c(txn); BSONObj op = c.findOne( "local.oplog.$main", QUERY( "op" << NE << "n" ).sort( BSON( "$natural" << -1 ) ) ); if ( !op.isEmpty() ) { - tmp.syncedTo = op[ "ts" ].date(); + tmp.syncedTo = op[ "ts" ].timestamp(); } } addSourceToList(txn, v, tmp, old); @@ -542,7 +542,8 @@ namespace repl { return true; } BSONElement ts = op.getField( "ts" ); - if ( ( ts.type() == Date || ts.type() == bsonTimestamp ) && ___databaseIgnorer.ignoreAt( db, ts.date() ) ) { + if ( ( ts.type() == Date || ts.type() == bsonTimestamp ) + && ___databaseIgnorer.ignoreAt( db, ts.timestamp() ) ) { // Database is ignored due to a previous indication that it is // missing from master after optime "ts". return false; diff --git a/src/mongo/db/repl/oplog.cpp b/src/mongo/db/repl/oplog.cpp index 7c90e58c8a5..5332790eaea 100644 --- a/src/mongo/db/repl/oplog.cpp +++ b/src/mongo/db/repl/oplog.cpp @@ -694,7 +694,7 @@ namespace { if (!lastOp.isEmpty()) { LOG(1) << "replSet setting last OpTime"; - setNewOptime(lastOp[ "ts" ].date()); + setNewOptime(lastOp[ "ts" ].timestamp()); } } 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 05e634fbc03..94ccb30f97c 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(Timestamp(10,0)); + hbResponse.setElectionTime(Timestamp(10, 0)); ++fieldsSet; ASSERT_EQUALS(false, hbResponse.hasState()); ASSERT_EQUALS(true, hbResponse.hasElectionTime()); @@ -139,21 +139,21 @@ namespace { ASSERT_EQUALS("", hbResponse.getHbMsg()); ASSERT_EQUALS("", hbResponse.getSyncingTo()); ASSERT_EQUALS(1, hbResponse.getVersion()); - ASSERT_EQUALS(Timestamp(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(Timestamp(10,0), hbResponseObj["electionTime"].timestamp()); + ASSERT_EQUALS(Timestamp(10, 0), hbResponseObj["electionTime"].timestamp()); initializeResult = hbResponseObjRoundTripChecker.initialize(hbResponseObj); ASSERT_EQUALS(Status::OK(), initializeResult); ASSERT_EQUALS(hbResponseObj.toString(), hbResponseObjRoundTripChecker.toBSON().toString()); // set opTime - hbResponse.setOpTime(Date_t(10)); + hbResponse.setOpTime(Timestamp(0, 10)); ++fieldsSet; ASSERT_EQUALS(false, hbResponse.hasState()); ASSERT_EQUALS(true, hbResponse.hasElectionTime()); @@ -168,16 +168,16 @@ namespace { ASSERT_EQUALS("", hbResponse.getHbMsg()); ASSERT_EQUALS("", hbResponse.getSyncingTo()); ASSERT_EQUALS(1, hbResponse.getVersion()); - ASSERT_EQUALS(Timestamp(10,0), hbResponse.getElectionTime()); - ASSERT_EQUALS(Timestamp(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(Timestamp(10,0), hbResponseObj["electionTime"].timestamp()); - ASSERT_EQUALS(Timestamp(0,10), hbResponseObj["opTime"].timestamp()); + 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(Timestamp(10,0), hbResponse.getElectionTime()); - ASSERT_EQUALS(Timestamp(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(Timestamp(10,0), hbResponseObj["electionTime"].timestamp()); - ASSERT_EQUALS(Timestamp(0,10), hbResponseObj["opTime"].timestamp()); + 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(Timestamp(10,0), hbResponse.getElectionTime()); - ASSERT_EQUALS(Timestamp(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(Timestamp(10,0), hbResponseObj["electionTime"].timestamp()); - ASSERT_EQUALS(Timestamp(0,10), hbResponseObj["opTime"].timestamp()); + 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(Timestamp(10,0), hbResponse.getElectionTime()); - ASSERT_EQUALS(Timestamp(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(Timestamp(10,0), hbResponseObj["electionTime"].timestamp()); - ASSERT_EQUALS(Timestamp(0,10), hbResponseObj["opTime"].timestamp()); + 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(Timestamp(10,0), hbResponse.getElectionTime()); - ASSERT_EQUALS(Timestamp(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(Timestamp(10,0), hbResponseObj["electionTime"].timestamp()); - ASSERT_EQUALS(Timestamp(0,10), hbResponseObj["opTime"].timestamp()); + 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(Timestamp(10,0), hbResponse.getElectionTime()); - ASSERT_EQUALS(Timestamp(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(Timestamp(10,0), hbResponseObj["electionTime"].timestamp()); - ASSERT_EQUALS(Timestamp(0,10), hbResponseObj["opTime"].timestamp()); + 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(Timestamp(10,0), hbResponse.getElectionTime()); - ASSERT_EQUALS(Timestamp(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(Timestamp(10,0), hbResponseObj["electionTime"].timestamp()); - ASSERT_EQUALS(Timestamp(0,10), hbResponseObj["opTime"].timestamp()); + 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(Timestamp(10,0), hbResponse.getElectionTime()); - ASSERT_EQUALS(Timestamp(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(Timestamp(10,0), hbResponseObj["electionTime"].timestamp()); - ASSERT_EQUALS(Timestamp(0,10), hbResponseObj["opTime"].timestamp()); + 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(Timestamp(10,0), hbResponse.getElectionTime()); - ASSERT_EQUALS(Timestamp(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(Timestamp(10,0), hbResponseObj["electionTime"].timestamp()); - ASSERT_EQUALS(Timestamp(0,10), hbResponseObj["opTime"].timestamp()); + 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(Timestamp(10,0), hbResponse.getElectionTime()); - ASSERT_EQUALS(Timestamp(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()); diff --git a/src/mongo/db/repl/topology_coordinator_impl_test.cpp b/src/mongo/db/repl/topology_coordinator_impl_test.cpp index ce99ca62ee9..1283fc5f3f1 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 Timestamp& electionOpTime = Timestamp(0,0)) { + void makeSelfPrimary(const Timestamp& electionOpTime = Timestamp(0, 0)) { getTopoCoord().changeMemberState_forTest(MemberState::RS_PRIMARY, electionOpTime); getTopoCoord()._setCurrentPrimaryForTest(_selfIndex); } @@ -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()++, Timestamp(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, Timestamp(1,0)); - heartbeatFromMember(HostAndPort("h3"), "rs0", MemberState::RS_SECONDARY, Timestamp(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()++, Timestamp(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, Timestamp(1,0)); - heartbeatFromMember(HostAndPort("h3"), "rs0", MemberState::RS_SECONDARY, Timestamp(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()++, Timestamp(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, Timestamp(2,0)); - getTopoCoord().chooseNewSyncSource(now()++, Timestamp(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, Timestamp(2,0)); - getTopoCoord().chooseNewSyncSource(now()++, Timestamp(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, Timestamp(2,0)); - getTopoCoord().chooseNewSyncSource(now()++, Timestamp(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", Timestamp()); - getTopoCoord().chooseNewSyncSource(now()++, Timestamp(0,0)); + getTopoCoord().chooseNewSyncSource(now()++, Timestamp(0, 0)); ASSERT_EQUALS(HostAndPort("h2"), getTopoCoord().getSyncSourceAddress()); // h3 back up and ahead - heartbeatFromMember(HostAndPort("h3"), "rs0", MemberState::RS_SECONDARY, Timestamp(2,0)); - getTopoCoord().chooseNewSyncSource(now()++, Timestamp(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,7 +282,7 @@ namespace { 0); setSelfMemberState(MemberState::RS_SECONDARY); - Timestamp lastOpTimeWeApplied = Timestamp(100,0); + Timestamp lastOpTimeWeApplied = Timestamp(100, 0); heartbeatFromMember(HostAndPort("h1"), "rs0", MemberState::RS_SECONDARY, Timestamp(501, 0), Milliseconds(700)); @@ -384,7 +384,7 @@ namespace { Timestamp(0, 0), Milliseconds(300)); // No primary situation: should choose no sync source. - getTopoCoord().chooseNewSyncSource(now()++, Timestamp(0,0)); + getTopoCoord().chooseNewSyncSource(now()++, Timestamp(0, 0)); ASSERT(getTopoCoord().getSyncSourceAddress().empty()); // Add primary @@ -395,7 +395,7 @@ namespace { // 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()++, Timestamp(10,0)); + getTopoCoord().chooseNewSyncSource(now()++, Timestamp(10, 0)); ASSERT_EQUALS(HostAndPort("h3"), getTopoCoord().getSyncSourceAddress()); } @@ -421,7 +421,7 @@ namespace { Timestamp(0, 0), Milliseconds(300)); // No primary situation: should choose h2 sync source. - getTopoCoord().chooseNewSyncSource(now()++, Timestamp(0,0)); + getTopoCoord().chooseNewSyncSource(now()++, Timestamp(0, 0)); ASSERT_EQUALS(HostAndPort("h2"), getTopoCoord().getSyncSourceAddress()); // Become primary @@ -454,18 +454,18 @@ namespace { Timestamp(2, 0), Milliseconds(100)); // force should overrule other defaults - getTopoCoord().chooseNewSyncSource(now()++, Timestamp(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()++, Timestamp(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()++, Timestamp(0,0)); + getTopoCoord().chooseNewSyncSource(now()++, Timestamp(0, 0)); ASSERT_EQUALS(HostAndPort("h3"), getTopoCoord().getSyncSourceAddress()); } @@ -489,17 +489,17 @@ namespace { heartbeatFromMember(HostAndPort("h3"), "rs0", MemberState::RS_SECONDARY, Timestamp(2, 0), Milliseconds(100)); - getTopoCoord().chooseNewSyncSource(now()++, Timestamp(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()++, Timestamp(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, Timestamp(0,0)); + getTopoCoord().chooseNewSyncSource(expireTime, Timestamp(0, 0)); ASSERT_EQUALS(HostAndPort("h3"), getTopoCoord().getSyncSourceAddress()); } @@ -526,17 +526,17 @@ namespace { heartbeatFromMember(HostAndPort("h3"), "rs0", MemberState::RS_SECONDARY, Timestamp(2, 0), Milliseconds(100)); - getTopoCoord().chooseNewSyncSource(now()++, Timestamp(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()++, Timestamp(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, Timestamp(0,0)); + getTopoCoord().chooseNewSyncSource(expireTime, Timestamp(0, 0)); ASSERT_EQUALS(HostAndPort("h2"), getTopoCoord().getSyncSourceAddress()); } @@ -562,20 +562,20 @@ namespace { Timestamp(2, 0), Milliseconds(100)); ASSERT_EQUALS(HostAndPort("h3"), - getTopoCoord().chooseNewSyncSource(now()++, Timestamp(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", Timestamp(), ErrorCodes::NetworkTimeout); receiveDownHeartbeat(HostAndPort("h3"), "rs0", Timestamp(), ErrorCodes::NetworkTimeout); - ASSERT_TRUE(getTopoCoord().chooseNewSyncSource(now()++, Timestamp(0,0)).empty()); + 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", Timestamp(), ErrorCodes::NetworkTimeout); receiveDownHeartbeat(HostAndPort("h3"), "rs0", Timestamp(), ErrorCodes::Unauthorized); - ASSERT_TRUE(getTopoCoord().chooseNewSyncSource(now()++, Timestamp(0,0)).empty()); + 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 @@ -732,7 +732,7 @@ namespace { ASSERT_FALSE(response10Obj.hasField("warning")); ASSERT_EQUALS(HostAndPort("h6").toString(), response10Obj["prevSyncTarget"].String()); receiveDownHeartbeat(HostAndPort("h6"), "rs0", Timestamp()); - HostAndPort syncSource = getTopoCoord().chooseNewSyncSource(now()++, Timestamp(0,0)); + HostAndPort syncSource = getTopoCoord().chooseNewSyncSource(now()++, Timestamp(0, 0)); ASSERT_EQUALS(HostAndPort("h6"), syncSource); // Try to sync from a member that is unauth'd @@ -753,7 +753,7 @@ namespace { getTopoCoord().prepareSyncFromResponse( cbData(), HostAndPort("h6"), ourOpTime, &response12, &result); ASSERT_OK(result); - syncSource = getTopoCoord().chooseNewSyncSource(now()++, Timestamp(0,0)); + syncSource = getTopoCoord().chooseNewSyncSource(now()++, Timestamp(0, 0)); ASSERT_EQUALS(HostAndPort("h6"), syncSource); } @@ -793,7 +793,7 @@ namespace { Milliseconds(0), member, hbResponse, - Timestamp(0,0)); + Timestamp(0, 0)); member = HostAndPort("test1:1234"); ReplSetHeartbeatResponse hb; @@ -810,7 +810,7 @@ namespace { Milliseconds(4000), member, hbResponse, - Timestamp(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. @@ -1135,7 +1135,11 @@ namespace { BSONObjBuilder responseBuilder10; Status status10 = internalErrorStatus; - getTopoCoord().prepareFreshResponse(args, Date_t(), ourOpTime, &responseBuilder10, &status10); + getTopoCoord().prepareFreshResponse(args, + Date_t(), + ourOpTime, + &responseBuilder10, + &status10); ASSERT_OK(status10); BSONObj response10 = responseBuilder10.obj(); ASSERT_FALSE(response10.hasField("info")); @@ -1295,7 +1299,7 @@ namespace { }; TEST_F(HeartbeatResponseHighVerbosityTest, UpdateHeartbeatDataNodeBelivesWeAreDown) { - Timestamp lastOpTimeApplied = Timestamp(3,0); + Timestamp lastOpTimeApplied = Timestamp(3, 0); // request heartbeat std::pair request = @@ -1321,7 +1325,7 @@ namespace { } TEST_F(HeartbeatResponseHighVerbosityTest, UpdateHeartbeatDataMemberNotInConfig) { - Timestamp lastOpTimeApplied = Timestamp(3,0); + Timestamp lastOpTimeApplied = Timestamp(3, 0); // request heartbeat std::pair request = @@ -1346,7 +1350,7 @@ namespace { } TEST_F(HeartbeatResponseHighVerbosityTest, UpdateHeartbeatDataSameConfig) { - Timestamp lastOpTimeApplied = Timestamp(3,0); + Timestamp lastOpTimeApplied = Timestamp(3, 0); // request heartbeat std::pair request = @@ -1385,7 +1389,7 @@ namespace { } TEST_F(HeartbeatResponseHighVerbosityTest, UpdateHeartbeatDataOldConfig) { - Timestamp lastOpTimeApplied = Timestamp(3,0); + Timestamp lastOpTimeApplied = Timestamp(3, 0); // request heartbeat std::pair request = @@ -1458,7 +1462,7 @@ namespace { electedMoreRecentlyResponse.setSetName("rs0"); electedMoreRecentlyResponse.setState(MemberState::RS_PRIMARY); electedMoreRecentlyResponse.setElectable(true); - electedMoreRecentlyResponse.setElectionTime(Timestamp(3,0)); + electedMoreRecentlyResponse.setElectionTime(Timestamp(3, 0)); electedMoreRecentlyResponse.setVersion(5); HeartbeatResponseAction action = getTopoCoord().processHeartbeatResponse( @@ -1466,7 +1470,7 @@ namespace { Milliseconds(400), // Spent 0.4 of the 0.5 second in the network. target(), StatusWith(electedMoreRecentlyResponse), - Timestamp(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()); @@ -1490,7 +1494,7 @@ namespace { electedMoreRecentlyResponse.setSetName("rs0"); electedMoreRecentlyResponse.setState(MemberState::RS_PRIMARY); electedMoreRecentlyResponse.setElectable(false); - electedMoreRecentlyResponse.setElectionTime(Timestamp(10,0)); + electedMoreRecentlyResponse.setElectionTime(Timestamp(10, 0)); electedMoreRecentlyResponse.setVersion(5); action = getTopoCoord().processHeartbeatResponse( @@ -1516,8 +1520,8 @@ namespace { // action. // acknowledge the other member so that we see a majority - Timestamp election = Timestamp(400,0); - Timestamp lastOpTimeApplied = Timestamp(300,0); + Timestamp election = Timestamp(400, 0); + Timestamp lastOpTimeApplied = Timestamp(300, 0); HeartbeatResponseAction action = receiveUpHeartbeat(HostAndPort("host3"), "rs0", MemberState::RS_SECONDARY, @@ -1586,7 +1590,7 @@ namespace { electedMoreRecentlyResponse.setSetName("rs0"); electedMoreRecentlyResponse.setState(MemberState::RS_PRIMARY); electedMoreRecentlyResponse.setElectable(true); - electedMoreRecentlyResponse.setElectionTime(Timestamp(3,0)); + electedMoreRecentlyResponse.setElectionTime(Timestamp(3, 0)); electedMoreRecentlyResponse.setVersion(5); HeartbeatResponseAction action = getTopoCoord().processHeartbeatResponse( @@ -1594,7 +1598,7 @@ namespace { Milliseconds(400), // Spent 0.4 of the 0.5 second in the network. target(), StatusWith(electedMoreRecentlyResponse), - Timestamp(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()); @@ -1618,7 +1622,7 @@ namespace { electedMoreRecentlyResponse.setSetName("rs0"); electedMoreRecentlyResponse.setState(MemberState::RS_PRIMARY); electedMoreRecentlyResponse.setElectable(false); - electedMoreRecentlyResponse.setElectionTime(Timestamp(10,0)); + electedMoreRecentlyResponse.setElectionTime(Timestamp(10, 0)); electedMoreRecentlyResponse.setVersion(5); action = getTopoCoord().processHeartbeatResponse( @@ -1644,8 +1648,8 @@ namespace { // action. // acknowledge the other member so that we see a majority - Timestamp election = Timestamp(400,0); - Timestamp lastOpTimeApplied = Timestamp(300,0); + Timestamp election = Timestamp(400, 0); + Timestamp lastOpTimeApplied = Timestamp(300, 0); HeartbeatResponseAction action = receiveUpHeartbeat(HostAndPort("host3"), "rs0", MemberState::RS_SECONDARY, @@ -1726,7 +1730,7 @@ namespace { TEST_F(HeartbeatResponseTest, UpdateHeartbeatDataNewPrimary) { Timestamp election = Timestamp(5,0); - Timestamp lastOpTimeApplied = Timestamp(3,0); + Timestamp lastOpTimeApplied = Timestamp(3, 0); ASSERT_EQUALS(-1, getCurrentPrimaryIndex()); HeartbeatResponseAction nextAction = receiveUpHeartbeat(HostAndPort("host2"), @@ -1742,8 +1746,8 @@ namespace { TEST_F(HeartbeatResponseTest, UpdateHeartbeatDataTwoPrimariesNewOneOlder) { Timestamp election = Timestamp(5,0); - Timestamp election2 = Timestamp(4,0); - Timestamp lastOpTimeApplied = Timestamp(3,0); + Timestamp election2 = Timestamp(4, 0); + Timestamp lastOpTimeApplied = Timestamp(3, 0); ASSERT_EQUALS(-1, getCurrentPrimaryIndex()); HeartbeatResponseAction nextAction = receiveUpHeartbeat(HostAndPort("host2"), @@ -1768,9 +1772,9 @@ namespace { } TEST_F(HeartbeatResponseTest, UpdateHeartbeatDataTwoPrimariesNewOneNewer) { - Timestamp election = Timestamp(4,0); + Timestamp election = Timestamp(4, 0); Timestamp election2 = Timestamp(5,0); - Timestamp lastOpTimeApplied = Timestamp(3,0); + Timestamp lastOpTimeApplied = Timestamp(3, 0); ASSERT_EQUALS(-1, getCurrentPrimaryIndex()); HeartbeatResponseAction nextAction = receiveUpHeartbeat(HostAndPort("host2"), @@ -1798,8 +1802,8 @@ namespace { ASSERT_EQUALS(-1, getCurrentPrimaryIndex()); makeSelfPrimary(Timestamp(5,0)); - Timestamp election = Timestamp(4,0); - Timestamp lastOpTimeApplied = Timestamp(3,0); + Timestamp election = Timestamp(4, 0); + Timestamp lastOpTimeApplied = Timestamp(3, 0); ASSERT_EQUALS(0, getCurrentPrimaryIndex()); HeartbeatResponseAction nextAction = receiveUpHeartbeat(HostAndPort("host2"), @@ -1828,9 +1832,9 @@ namespace { 0); setSelfMemberState(MemberState::RS_SECONDARY); - Timestamp election = Timestamp(0,0); - Timestamp lastOpTimeApplied = Timestamp(13,0); - Timestamp slightlyLessFreshLastOpTimeApplied = Timestamp(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 +1868,7 @@ namespace { BSON("_id" << 2 << "host" << "host3:27017" << "priority" << 3)) << "settings" << BSON("heartbeatTimeoutSecs" << 5)), 0); - Timestamp election = Timestamp(1000,0); + Timestamp election = Timestamp(1000, 0); getTopoCoord().setFollowerMode(MemberState::RS_SECONDARY); ASSERT_EQUALS(-1, getCurrentPrimaryIndex()); @@ -1909,8 +1913,8 @@ namespace { BSON("_id" << 2 << "host" << "host3:27017" << "priority" << 3)) << "settings" << BSON("heartbeatTimeoutSecs" << 5)), 0); - Timestamp election = Timestamp(1000,0); - Timestamp staleTime = Timestamp(0,0); + Timestamp election = Timestamp(1000, 0); + Timestamp staleTime = Timestamp(0, 0); ASSERT_EQUALS(-1, getCurrentPrimaryIndex()); makeSelfPrimary(election); @@ -1938,8 +1942,8 @@ namespace { 0); setSelfMemberState(MemberState::RS_SECONDARY); - Timestamp election = Timestamp(1000,0); - Timestamp stale = Timestamp(0,0); + Timestamp election = Timestamp(1000, 0); + Timestamp stale = Timestamp(0, 0); ASSERT_EQUALS(-1, getCurrentPrimaryIndex()); HeartbeatResponseAction nextAction = receiveUpHeartbeat(HostAndPort("host2"), @@ -1961,10 +1965,10 @@ namespace { TEST_F(HeartbeatResponseTest, UpdateHeartbeatDataTwoPrimariesIncludingMeNewOneNewer) { ASSERT_EQUALS(-1, getCurrentPrimaryIndex()); - makeSelfPrimary(Timestamp(2,0)); + makeSelfPrimary(Timestamp(2, 0)); - Timestamp election = Timestamp(4,0); - Timestamp lastOpTimeApplied = Timestamp(3,0); + Timestamp election = Timestamp(4, 0); + Timestamp lastOpTimeApplied = Timestamp(3, 0); ASSERT_EQUALS(0, getCurrentPrimaryIndex()); HeartbeatResponseAction nextAction = receiveUpHeartbeat(HostAndPort("host2"), @@ -1987,8 +1991,8 @@ namespace { TEST_F(HeartbeatResponseTest, UpdateHeartbeatDataPrimaryDownNoMajority) { setSelfMemberState(MemberState::RS_SECONDARY); - Timestamp election = Timestamp(400,0); - Timestamp lastOpTimeApplied = Timestamp(300,0); + Timestamp election = Timestamp(400, 0); + Timestamp lastOpTimeApplied = Timestamp(300, 0); ASSERT_EQUALS(-1, getCurrentPrimaryIndex()); HeartbeatResponseAction nextAction = receiveUpHeartbeat(HostAndPort("host2"), @@ -2017,8 +2021,8 @@ namespace { BSON("_id" << 2 << "host" << "host3:27017"))), 0); - Timestamp election = Timestamp(400,0); - Timestamp lastOpTimeApplied = Timestamp(300,0); + Timestamp election = Timestamp(400, 0); + Timestamp lastOpTimeApplied = Timestamp(300, 0); ASSERT_EQUALS(-1, getCurrentPrimaryIndex()); HeartbeatResponseAction nextAction = receiveUpHeartbeat(HostAndPort("host2"), @@ -2048,8 +2052,8 @@ namespace { TEST_F(HeartbeatResponseTest, UpdateHeartbeatDataPrimaryDownMajorityButIAmStarting) { setSelfMemberState(MemberState::RS_STARTUP); - Timestamp election = Timestamp(400,0); - Timestamp lastOpTimeApplied = Timestamp(300,0); + Timestamp election = Timestamp(400, 0); + Timestamp lastOpTimeApplied = Timestamp(300, 0); ASSERT_EQUALS(-1, getCurrentPrimaryIndex()); HeartbeatResponseAction nextAction = receiveUpHeartbeat(HostAndPort("host2"), @@ -2078,8 +2082,8 @@ namespace { TEST_F(HeartbeatResponseTest, UpdateHeartbeatDataPrimaryDownMajorityButIAmRecovering) { setSelfMemberState(MemberState::RS_RECOVERING); - Timestamp election = Timestamp(400,0); - Timestamp lastOpTimeApplied = Timestamp(300,0); + Timestamp election = Timestamp(400, 0); + Timestamp lastOpTimeApplied = Timestamp(300, 0); ASSERT_EQUALS(-1, getCurrentPrimaryIndex()); HeartbeatResponseAction nextAction = receiveUpHeartbeat(HostAndPort("host2"), @@ -2100,8 +2104,8 @@ namespace { TEST_F(HeartbeatResponseTest, UpdateHeartbeatDataPrimaryDownMajorityButIHaveStepdownWait) { setSelfMemberState(MemberState::RS_SECONDARY); - Timestamp election = Timestamp(400,0); - Timestamp lastOpTimeApplied = Timestamp(300,0); + Timestamp election = Timestamp(400, 0); + Timestamp lastOpTimeApplied = Timestamp(300, 0); ASSERT_EQUALS(-1, getCurrentPrimaryIndex()); HeartbeatResponseAction nextAction = receiveUpHeartbeat(HostAndPort("host2"), @@ -2141,8 +2145,8 @@ namespace { BSON("_id" << 2 << "host" << "host3:27017"))), 0); - Timestamp election = Timestamp(400,0); - Timestamp lastOpTimeApplied = Timestamp(300,0); + Timestamp election = Timestamp(400, 0); + Timestamp lastOpTimeApplied = Timestamp(300, 0); HeartbeatResponseAction nextAction = receiveUpHeartbeat(HostAndPort("host3"), "rs0", @@ -2171,7 +2175,7 @@ namespace { TEST_F(HeartbeatResponseTest, UpdateHeartbeatDataPrimaryDownMajority) { setSelfMemberState(MemberState::RS_SECONDARY); - Timestamp election = Timestamp(400,0); + Timestamp election = Timestamp(400, 0); Timestamp lastOpTimeApplied = Timestamp(399,0); ASSERT_EQUALS(-1, getCurrentPrimaryIndex()); @@ -2215,8 +2219,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 - Timestamp election = Timestamp(0,0); - Timestamp lastOpTimeApplied = Timestamp(130,0); + Timestamp election = Timestamp(0, 0); + Timestamp lastOpTimeApplied = Timestamp(130, 0); OID round = OID::gen(); ASSERT_EQUALS(-1, getCurrentPrimaryIndex()); @@ -2285,9 +2289,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 - Timestamp election = Timestamp(0,0); - Timestamp lastOpTimeApplied = Timestamp(100,0); - Timestamp fresherOpApplied = Timestamp(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"), @@ -2380,7 +2384,7 @@ namespace { // now lose election and ensure _electionTime and _electionId are 0'd out getTopoCoord().processLoseElection(); ASSERT_EQUALS(OID(), getTopoCoord().getElectionId()); - ASSERT_EQUALS(Timestamp(0,0), getTopoCoord().getElectionTime()); + ASSERT_EQUALS(Timestamp(0, 0), getTopoCoord().getElectionTime()); ASSERT_TRUE(TopologyCoordinator::Role::follower == getTopoCoord().getRole()); ASSERT_EQUALS(2, getCurrentPrimaryIndex()); } @@ -2403,9 +2407,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 - Timestamp election = Timestamp(0,0); - Timestamp lastOpTimeApplied = Timestamp(100,0); - Timestamp fresherLastOpTimeApplied = Timestamp(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(); @@ -2500,9 +2504,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 - Timestamp election = Timestamp(0,0); - Timestamp lastOpTimeApplied = Timestamp(100,0); - Timestamp fresherLastOpTimeApplied = Timestamp(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(); @@ -2594,8 +2598,8 @@ namespace { setSelfMemberState(MemberState::RS_SECONDARY); - Timestamp election = Timestamp(400,0); - Timestamp lastOpTimeApplied = Timestamp(300,0); + Timestamp election = Timestamp(400, 0); + Timestamp lastOpTimeApplied = Timestamp(300, 0); ASSERT_EQUALS(-1, getCurrentPrimaryIndex()); HeartbeatResponseAction nextAction = receiveUpHeartbeat(HostAndPort("host2"), @@ -2634,14 +2638,14 @@ namespace { TEST_F(HeartbeatResponseTest, UpdateHeartbeatDataRelinquishPrimaryDueToNodeDisappearing) { // become PRIMARY ASSERT_EQUALS(-1, getCurrentPrimaryIndex()); - makeSelfPrimary(Timestamp(2,0)); + makeSelfPrimary(Timestamp(2, 0)); ASSERT_EQUALS(0, getCurrentPrimaryIndex()); // become aware of other nodes - 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)); + 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"), @@ -2662,7 +2666,7 @@ namespace { TEST_F(HeartbeatResponseTest, UpdateHeartbeatDataRemoteDoesNotExist) { Timestamp election = Timestamp(5,0); - Timestamp lastOpTimeApplied = Timestamp(3,0); + Timestamp lastOpTimeApplied = Timestamp(3, 0); ASSERT_EQUALS(-1, getCurrentPrimaryIndex()); HeartbeatResponseAction nextAction = receiveUpHeartbeat(HostAndPort("host9"), @@ -2747,7 +2751,11 @@ namespace { BSONObjBuilder responseBuilder; Status result = Status(ErrorCodes::InternalError, "status not set by prepareElectResponse"); startCapturingLogMessages(); - getTopoCoord().prepareElectResponse(args, now += 60000, Timestamp(), &responseBuilder, &result); + getTopoCoord().prepareElectResponse(args, + now += 60000, + Timestamp(), + &responseBuilder, + &result); stopCapturingLogMessages(); BSONObj response = responseBuilder.obj(); ASSERT_OK(result); @@ -2776,7 +2784,11 @@ namespace { BSONObjBuilder responseBuilder; Status result = Status(ErrorCodes::InternalError, "status not set by prepareElectResponse"); startCapturingLogMessages(); - getTopoCoord().prepareElectResponse(args, now += 60000, Timestamp(), &responseBuilder, &result); + getTopoCoord().prepareElectResponse(args, + now += 60000, + Timestamp(), + &responseBuilder, + &result); stopCapturingLogMessages(); BSONObj response = responseBuilder.obj(); ASSERT_OK(result); @@ -2805,7 +2817,11 @@ namespace { BSONObjBuilder responseBuilder; Status result = Status(ErrorCodes::InternalError, "status not set by prepareElectResponse"); startCapturingLogMessages(); - getTopoCoord().prepareElectResponse(args, now += 60000, Timestamp(), &responseBuilder, &result); + getTopoCoord().prepareElectResponse(args, + now += 60000, + Timestamp(), + &responseBuilder, + &result); stopCapturingLogMessages(); BSONObj response = responseBuilder.obj(); ASSERT_OK(result); @@ -2835,7 +2851,11 @@ namespace { BSONObjBuilder responseBuilder; Status result = Status(ErrorCodes::InternalError, "status not set by prepareElectResponse"); startCapturingLogMessages(); - getTopoCoord().prepareElectResponse(args, now += 60000, Timestamp(), &responseBuilder, &result); + getTopoCoord().prepareElectResponse(args, + now += 60000, + Timestamp(), + &responseBuilder, + &result); stopCapturingLogMessages(); BSONObj response = responseBuilder.obj(); ASSERT_OK(result); @@ -2864,7 +2884,11 @@ namespace { BSONObjBuilder responseBuilder; Status result = Status(ErrorCodes::InternalError, "status not set by prepareElectResponse"); startCapturingLogMessages(); - getTopoCoord().prepareElectResponse(args, now += 60000, Timestamp(), &responseBuilder, &result); + getTopoCoord().prepareElectResponse(args, + now += 60000, + Timestamp(), + &responseBuilder, + &result); stopCapturingLogMessages(); BSONObj response = responseBuilder.obj(); ASSERT_OK(result); @@ -2889,12 +2913,16 @@ namespace { args.cfgver = 10; args.whoid = 1; - heartbeatFromMember(HostAndPort("h3"), "rs0", MemberState::RS_SECONDARY, jsTime()); + heartbeatFromMember(HostAndPort("h3"), "rs0", MemberState::RS_SECONDARY, Timestamp(1, 0)); BSONObjBuilder responseBuilder; Status result = Status(ErrorCodes::InternalError, "status not set by prepareElectResponse"); startCapturingLogMessages(); - getTopoCoord().prepareElectResponse(args, now += 60000, Timestamp(), &responseBuilder, &result); + getTopoCoord().prepareElectResponse(args, + now += 60000, + Timestamp(), + &responseBuilder, + &result); stopCapturingLogMessages(); BSONObj response = responseBuilder.obj(); ASSERT_OK(result); @@ -2926,7 +2954,11 @@ namespace { BSONObjBuilder responseBuilder; Status result = Status::OK(); startCapturingLogMessages(); - getTopoCoord().prepareElectResponse(args, now += 60000, Timestamp(), &responseBuilder, &result); + getTopoCoord().prepareElectResponse(args, + now += 60000, + Timestamp(), + &responseBuilder, + &result); stopCapturingLogMessages(); BSONObj response = responseBuilder.obj(); ASSERT_EQUALS(1, response["vote"].Int()); @@ -2945,7 +2977,11 @@ namespace { BSONObjBuilder responseBuilder1; Status result = Status(ErrorCodes::InternalError, "status not set by prepareElectResponse"); startCapturingLogMessages(); - getTopoCoord().prepareElectResponse(args, now += 60000, Timestamp(), &responseBuilder1, &result); + getTopoCoord().prepareElectResponse(args, + now += 60000, + Timestamp(), + &responseBuilder1, + &result); stopCapturingLogMessages(); BSONObj response1 = responseBuilder1.obj(); ASSERT_OK(result); @@ -3102,7 +3138,7 @@ namespace { BSONObjBuilder response; getTopoCoord().prepareSyncFromResponse(cbData(), HostAndPort("host2:27017"), - Timestamp(0,0), + Timestamp(0, 0), &response, &result); ASSERT_EQUALS(ErrorCodes::ShutdownInProgress, result); @@ -3116,7 +3152,7 @@ namespace { getTopoCoord().prepareStatusResponse(cbData(), Date_t(0), 0, - Timestamp(0,0), + Timestamp(0, 0), &response, &result); ASSERT_EQUALS(ErrorCodes::ShutdownInProgress, result); @@ -3159,7 +3195,7 @@ namespace { Status result(ErrorCodes::InternalError, "prepareHeartbeatResponse didn't set result"); // prepare response and check the results - prepareHeartbeatResponse(args, Timestamp(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 +3209,7 @@ namespace { args.setSenderId(10); ReplSetHeartbeatResponse response; Status result(ErrorCodes::InternalError, "prepareHeartbeatResponse didn't set result"); - prepareHeartbeatResponse(args, Timestamp(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 +3225,7 @@ namespace { Status result(ErrorCodes::InternalError, "prepareHeartbeatResponse didn't set result"); startCapturingLogMessages(); - prepareHeartbeatResponse(args, Timestamp(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 +3247,12 @@ namespace { Status result(ErrorCodes::InternalError, "prepareHeartbeatResponse didn't set result"); // prepare response and check the results - prepareHeartbeatResponse(args, Timestamp(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(Timestamp(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 +3270,12 @@ namespace { Status result(ErrorCodes::InternalError, "prepareHeartbeatResponse didn't set result"); // prepare response and check the results - prepareHeartbeatResponse(args, Timestamp(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(Timestamp(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 +3293,13 @@ namespace { Status result(ErrorCodes::InternalError, "prepareHeartbeatResponse didn't set result"); // prepare response and check the results - prepareHeartbeatResponse(args, Timestamp(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(Timestamp(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 +3317,13 @@ namespace { Status result(ErrorCodes::InternalError, "prepareHeartbeatResponse didn't set result"); // prepare response and check the results - prepareHeartbeatResponse(args, Timestamp(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(Timestamp(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 +3341,12 @@ namespace { Status result(ErrorCodes::InternalError, "prepareHeartbeatResponse didn't set result"); // prepare response and check the results - prepareHeartbeatResponse(args, Timestamp(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(Timestamp(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 +3356,7 @@ namespace { TEST_F(PrepareHeartbeatResponseTest, PrepareHeartbeatResponseSenderUp) { // set up args and acknowledge sender - heartbeatFromMember(HostAndPort("h2"), "rs0", MemberState::RS_SECONDARY, Timestamp(0,0)); + heartbeatFromMember(HostAndPort("h2"), "rs0", MemberState::RS_SECONDARY, Timestamp(0, 0)); ReplSetHeartbeatArgs args; args.setProtocolVersion(1); args.setConfigVersion(1); @@ -3330,13 +3366,13 @@ namespace { Status result(ErrorCodes::InternalError, "prepareHeartbeatResponse didn't set result"); // prepare response and check the results - prepareHeartbeatResponse(args, Timestamp(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(Timestamp(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 +3391,14 @@ namespace { Status result = getTopoCoord().prepareHeartbeatResponse(now()++, args, "rs0", - Timestamp(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(Timestamp(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 +3406,8 @@ namespace { } TEST_F(PrepareHeartbeatResponseTest, PrepareHeartbeatResponseAsPrimary) { - makeSelfPrimary(Timestamp(10,0)); - heartbeatFromMember(HostAndPort("h2"), "rs0", MemberState::RS_SECONDARY, Timestamp(0,0)); + makeSelfPrimary(Timestamp(10, 0)); + heartbeatFromMember(HostAndPort("h2"), "rs0", MemberState::RS_SECONDARY, Timestamp(0, 0)); ReplSetHeartbeatArgs args; args.setProtocolVersion(1); @@ -3382,14 +3418,14 @@ namespace { Status result(ErrorCodes::InternalError, "prepareHeartbeatResponse didn't set result"); // prepare response and check the results - prepareHeartbeatResponse(args, Timestamp(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(Timestamp(11,0), response.getOpTime()); - ASSERT_EQUALS(Timestamp(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 +3434,11 @@ namespace { TEST_F(PrepareHeartbeatResponseTest, PrepareHeartbeatResponseWithSyncSource) { // get a sync source - 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)); + 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 +3450,12 @@ namespace { Status result(ErrorCodes::InternalError, "prepareHeartbeatResponse didn't set result"); // prepare response and check the results - prepareHeartbeatResponse(args, Timestamp(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(Timestamp(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()); @@ -3556,7 +3592,7 @@ namespace { ASSERT_TRUE(TopologyCoordinator::Role::candidate == getTopoCoord().getRole()); // win election and primary - getTopoCoord().processWinElection(OID::gen(), Timestamp(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 +3622,7 @@ namespace { ASSERT_TRUE(TopologyCoordinator::Role::candidate == getTopoCoord().getRole()); // win election and primary - getTopoCoord().processWinElection(OID::gen(), Timestamp(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 +3653,7 @@ namespace { ASSERT_TRUE(TopologyCoordinator::Role::candidate == getTopoCoord().getRole()); // win election and primary - getTopoCoord().processWinElection(OID::gen(), Timestamp(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 +3667,7 @@ namespace { BSON("_id" << 2 << "host" << "host3:27017"))), 0, Date_t(-1), - Timestamp(10,0)); + Timestamp(10, 0)); ASSERT_TRUE(TopologyCoordinator::Role::leader == getTopoCoord().getRole()); ASSERT_EQUALS(MemberState::RS_PRIMARY, getTopoCoord().getMemberState().s); @@ -3646,7 +3682,7 @@ namespace { "tags" << BSON("dc" << "NA" << "rack" << "rack1")))), 0, Date_t(-1), - Timestamp(10,0)); + Timestamp(10, 0)); ASSERT_TRUE(TopologyCoordinator::Role::leader == getTopoCoord().getRole()); ASSERT_EQUALS(MemberState::RS_PRIMARY, getTopoCoord().getMemberState().s); } @@ -3676,8 +3712,8 @@ namespace { } TEST_F(HeartbeatResponseTest, ReconfigBetweenHeartbeatRequestAndRepsonse) { - Timestamp election = Timestamp(14,0); - Timestamp lastOpTimeApplied = Timestamp(13,0); + Timestamp election = Timestamp(14, 0); + Timestamp lastOpTimeApplied = Timestamp(13, 0); // all three members up and secondaries setSelfMemberState(MemberState::RS_SECONDARY); @@ -3727,8 +3763,8 @@ namespace { } TEST_F(HeartbeatResponseTest, ReconfigNodeRemovedBetweenHeartbeatRequestAndRepsonse) { - Timestamp election = Timestamp(14,0); - Timestamp lastOpTimeApplied = Timestamp(13,0); + Timestamp election = Timestamp(14, 0); + Timestamp lastOpTimeApplied = Timestamp(13, 0); // all three members up and secondaries setSelfMemberState(MemberState::RS_SECONDARY); @@ -3793,8 +3829,8 @@ 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" - Timestamp election = Timestamp(0,0); - Timestamp lastOpTimeApplied = Timestamp(4,0); + Timestamp election = Timestamp(0, 0); + Timestamp lastOpTimeApplied = Timestamp(4, 0); // ahead by more than maxSyncSourceLagSecs (30) Timestamp fresherLastOpTimeApplied = Timestamp(3005,0); @@ -3826,8 +3862,8 @@ 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. - Timestamp election = Timestamp(0,0); - Timestamp lastOpTimeApplied = Timestamp(400,0); + Timestamp election = Timestamp(0, 0); + Timestamp lastOpTimeApplied = Timestamp(400, 0); // ahead by more than maxSyncSourceLagSecs (30) Timestamp fresherLastOpTimeApplied = Timestamp(3005,0); @@ -3864,11 +3900,11 @@ namespace { } TEST_F(HeartbeatResponseTest, ShouldChangeSyncSourceFresherMemberIsDown) { - // In this test, the TopologyCoordinator should not tell us to change sync sources away from + // 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 - Timestamp election = Timestamp(0,0); - Timestamp lastOpTimeApplied = Timestamp(400,0); + Timestamp election = Timestamp(0, 0); + Timestamp lastOpTimeApplied = Timestamp(400, 0); // ahead by more than maxSyncSourceLagSecs (30) Timestamp fresherLastOpTimeApplied = Timestamp(3005,0); @@ -3895,11 +3931,11 @@ namespace { } TEST_F(HeartbeatResponseTest, ShouldChangeSyncSourceFresherMemberIsNotReadable) { - // In this test, the TopologyCoordinator should not tell us to change sync sources away from + // 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) - Timestamp election = Timestamp(0,0); - Timestamp lastOpTimeApplied = Timestamp(4,0); + Timestamp election = Timestamp(0, 0); + Timestamp lastOpTimeApplied = Timestamp(4, 0); // ahead by more than maxSyncSourceLagSecs (30) Timestamp fresherLastOpTimeApplied = Timestamp(3005,0); @@ -3924,11 +3960,11 @@ namespace { } TEST_F(HeartbeatResponseTest, ShouldChangeSyncSourceFresherMemberDoesNotBuildIndexes) { - // In this test, the TopologyCoordinator should not tell us to change sync sources away from + // 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 - Timestamp election = Timestamp(0,0); - Timestamp lastOpTimeApplied = Timestamp(4,0); + Timestamp election = Timestamp(0, 0); + Timestamp lastOpTimeApplied = Timestamp(4, 0); // ahead by more than maxSyncSourceLagSecs (30) Timestamp fresherLastOpTimeApplied = Timestamp(3005,0); @@ -3963,8 +3999,8 @@ 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" - Timestamp election = Timestamp(0,0); - Timestamp lastOpTimeApplied = Timestamp(4,0); + Timestamp election = Timestamp(0, 0); + Timestamp lastOpTimeApplied = Timestamp(4, 0); // ahead by more than maxSyncSourceLagSecs (30) Timestamp fresherLastOpTimeApplied = Timestamp(3005,0); @@ -4009,8 +4045,8 @@ namespace { 0); setSelfMemberState(MemberState::RS_SECONDARY); - heartbeatFromMember(HostAndPort("h2"), "rs0", MemberState::RS_PRIMARY, Timestamp(1,0)); - ASSERT_FALSE(getTopoCoord().checkShouldStandForElection(now()++, Timestamp(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 +4059,12 @@ namespace { 0); setSelfMemberState(MemberState::RS_SECONDARY); - heartbeatFromMember(HostAndPort("h2"), "rs0", MemberState::RS_SECONDARY, Timestamp(10000,0)); - ASSERT_FALSE(getTopoCoord().checkShouldStandForElection(now()++, Timestamp(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 +4093,7 @@ namespace { TEST_F(TopoCoordTest, UnelectableIfAbsentFromConfig) { logger::globalLogDomain()->setMinimumLoggedSeverity(logger::LogSeverity::Debug(3)); startCapturingLogMessages(); - ASSERT_FALSE(getTopoCoord().checkShouldStandForElection(now()++, Timestamp(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 +4108,7 @@ namespace { BSON("_id" << 30 << "host" << "h3"))), 0); setSelfMemberState(MemberState::RS_SECONDARY); - heartbeatFromMember(HostAndPort("h2"), "rs0", MemberState::RS_SECONDARY, Timestamp(100,0)); + heartbeatFromMember(HostAndPort("h2"), "rs0", MemberState::RS_SECONDARY, Timestamp(100, 0)); // vote for another node OID remoteRound = OID::gen(); @@ -4083,7 +4123,7 @@ namespace { BSONObjBuilder electResponseBuilder; Status result = Status(ErrorCodes::InternalError, "status not set by prepareElectResponse"); getTopoCoord().prepareElectResponse( - electArgs, now()++, Timestamp(100,0), &electResponseBuilder, &result); + electArgs, now()++, Timestamp(100, 0), &electResponseBuilder, &result); BSONObj response = electResponseBuilder.obj(); ASSERT_OK(result); std::cout << response; @@ -4092,7 +4132,7 @@ namespace { logger::globalLogDomain()->setMinimumLoggedSeverity(logger::LogSeverity::Debug(3)); startCapturingLogMessages(); - ASSERT_FALSE(getTopoCoord().checkShouldStandForElection(now()++, Timestamp(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/s/write_ops/batched_command_response_test.cpp b/src/mongo/s/write_ops/batched_command_response_test.cpp index 3a7a2374770..0ad85042554 100644 --- a/src/mongo/s/write_ops/batched_command_response_test.cpp +++ b/src/mongo/s/write_ops/batched_command_response_test.cpp @@ -42,7 +42,6 @@ namespace { using mongo::BatchedCommandResponse; using mongo::WriteErrorDetail; using mongo::WCErrorDetail; - using mongo::Date_t; using std::string; TEST(RoundTrip, Normal) { @@ -71,7 +70,7 @@ namespace { BatchedCommandResponse::errCode(-1) << BatchedCommandResponse::errMessage("this batch didn't work") << BatchedCommandResponse::n(0) << - BatchedCommandResponse::lastOp(Date_t(1)) << + BatchedCommandResponse::lastOp(mongo::Timestamp(0, 1)) << BatchedCommandResponse::writeErrors() << writeErrorsArray << BatchedCommandResponse::writeConcernError() << writeConcernError); -- cgit v1.2.1