summaryrefslogtreecommitdiff
path: root/src/mongo/bson
diff options
context:
space:
mode:
authormatt dannenberg <matt.dannenberg@10gen.com>2015-06-22 12:25:18 -0400
committermatt dannenberg <matt.dannenberg@10gen.com>2015-06-26 05:59:45 -0400
commitadd109f525a09d7898a9f00fc083fe5367a939a7 (patch)
tree0860414dabcee68ce04661953c517d0ac3bcdcca /src/mongo/bson
parent0f59479a8dfdb310c2ccdc99ce6438ce3cbe41a6 (diff)
downloadmongo-add109f525a09d7898a9f00fc083fe5367a939a7.tar.gz
SERVER-18717 compose electionId in OID format from term
Diffstat (limited to 'src/mongo/bson')
-rw-r--r--src/mongo/bson/oid.cpp6
-rw-r--r--src/mongo/bson/oid.h10
2 files changed, 16 insertions, 0 deletions
diff --git a/src/mongo/bson/oid.cpp b/src/mongo/bson/oid.cpp
index a78bcbde682..a8ef6bb56ef 100644
--- a/src/mongo/bson/oid.cpp
+++ b/src/mongo/bson/oid.cpp
@@ -138,6 +138,12 @@ void OID::init() {
setIncrement(Increment::next());
}
+void OID::init(int64_t term) {
+ // each set* method handles endianness
+ setTimestamp(time(0));
+ _view().write<BigEndian<int64_t>>(term, kInstanceUniqueOffset);
+}
+
void OID::init(const std::string& s) {
verify(s.size() == 24);
const char* p = s.c_str();
diff --git a/src/mongo/bson/oid.h b/src/mongo/bson/oid.h
index 476e15d1048..ed7086159c6 100644
--- a/src/mongo/bson/oid.h
+++ b/src/mongo/bson/oid.h
@@ -93,6 +93,13 @@ public:
std::memcpy(_data, arr, sizeof(arr));
}
+ static_assert(sizeof(int64_t) == kInstanceUniqueSize + kIncrementSize,
+ "size of term must be size of instance unique + increment");
+ /** init with a 8 byte term id. used for ElectionID */
+ explicit OID(int64_t term) {
+ init(term);
+ }
+
/** initialize to 'null' */
void clear() {
std::memset(_data, 0, kOIDSize);
@@ -137,6 +144,9 @@ public:
/** Set to the min/max OID that could be generated at given timestamp. */
void init(Date_t date, bool max = false);
+ /** Sets the contents to contain the time followed by an big endian 8 byte term id */
+ void init(int64_t term);
+
time_t asTimeT() const;
Date_t asDateT() const {
return Date_t::fromMillisSinceEpoch(asTimeT() * 1000LL);