From 8117ecc138e9f87ade5a475a2695d1e39f474d8c Mon Sep 17 00:00:00 2001 From: Randolph Tan Date: Fri, 7 Aug 2015 15:12:15 -0400 Subject: SERVER-19390 Make read concern args accept optional parameters --- src/mongo/db/repl/read_concern_args.cpp | 60 +++++++++++++++++---------------- 1 file changed, 31 insertions(+), 29 deletions(-) (limited to 'src/mongo/db/repl/read_concern_args.cpp') diff --git a/src/mongo/db/repl/read_concern_args.cpp b/src/mongo/db/repl/read_concern_args.cpp index 0b301d0fd8b..54cac6b3bc4 100644 --- a/src/mongo/db/repl/read_concern_args.cpp +++ b/src/mongo/db/repl/read_concern_args.cpp @@ -55,18 +55,18 @@ const string ReadConcernArgs::kOpTimestampFieldName("ts"); const string ReadConcernArgs::kOpTermFieldName("term"); const string ReadConcernArgs::kLevelFieldName("level"); -ReadConcernArgs::ReadConcernArgs() - : ReadConcernArgs(OpTime(), ReadConcernLevel::kLocalReadConcern) {} +ReadConcernArgs::ReadConcernArgs() = default; -ReadConcernArgs::ReadConcernArgs(OpTime opTime, ReadConcernLevel level) - : _opTime(std::move(opTime)), _level(level) {} +ReadConcernArgs::ReadConcernArgs(boost::optional opTime, + boost::optional level) + : _opTime(std::move(opTime)), _level(std::move(level)) {} ReadConcernLevel ReadConcernArgs::getLevel() const { - return _level; + return _level.value_or(ReadConcernLevel::kLocalReadConcern); } -const OpTime& ReadConcernArgs::getOpTime() const { - return _opTime; +OpTime ReadConcernArgs::getOpTime() const { + return _opTime.value_or(OpTime()); } Status ReadConcernArgs::initialize(const BSONObj& cmdObj) { @@ -123,9 +123,7 @@ Status ReadConcernArgs::initialize(const BSONObj& cmdObj) { str::stream() << kReadConcernFieldName << '.' << kLevelFieldName << " must be either \"local\" or \"majority\""); } - } else if (readCommittedStatus == ErrorCodes::NoSuchKey) { - _level = ReadConcernLevel::kLocalReadConcern; - } else { + } else if (readCommittedStatus != ErrorCodes::NoSuchKey) { return readCommittedStatus; } @@ -135,30 +133,34 @@ Status ReadConcernArgs::initialize(const BSONObj& cmdObj) { void ReadConcernArgs::appendInfo(BSONObjBuilder* builder) { BSONObjBuilder rcBuilder(builder->subobjStart(kReadConcernFieldName)); - string levelName; - switch (_level) { - case ReadConcernLevel::kLocalReadConcern: - levelName = kLocalReadConcernStr; - break; + if (_level) { + string levelName; + switch (_level.get()) { + case ReadConcernLevel::kLocalReadConcern: + levelName = kLocalReadConcernStr; + break; - case ReadConcernLevel::kMajorityReadConcern: - levelName = kMajorityReadConcernStr; - break; + case ReadConcernLevel::kMajorityReadConcern: + levelName = kMajorityReadConcernStr; + break; - case ReadConcernLevel::kLinearizableReadConcern: - levelName = kLinearizableReadConcernStr; - break; + case ReadConcernLevel::kLinearizableReadConcern: + levelName = kLinearizableReadConcernStr; + break; - default: - fassert(28754, false); - } + default: + fassert(28754, false); + } - rcBuilder.append(kLevelFieldName, levelName); + rcBuilder.append(kLevelFieldName, levelName); + } - BSONObjBuilder afterBuilder(rcBuilder.subobjStart(kOpTimeFieldName)); - afterBuilder.append(kOpTimestampFieldName, _opTime.getTimestamp()); - afterBuilder.append(kOpTermFieldName, _opTime.getTerm()); - afterBuilder.done(); + if (_opTime) { + BSONObjBuilder afterBuilder(rcBuilder.subobjStart(kOpTimeFieldName)); + afterBuilder.append(kOpTimestampFieldName, _opTime->getTimestamp()); + afterBuilder.append(kOpTermFieldName, _opTime->getTerm()); + afterBuilder.done(); + } rcBuilder.done(); } -- cgit v1.2.1