diff options
author | Mathias Stearn <mathias@10gen.com> | 2017-04-26 09:36:41 -0400 |
---|---|---|
committer | Mathias Stearn <mathias@10gen.com> | 2017-05-12 12:08:30 -0400 |
commit | f2902d59175c0724944ca98d13f784e2de944053 (patch) | |
tree | 44788ee704540d420f649279053019e3b6a332b2 /src/mongo/client/read_preference.cpp | |
parent | 1a955fc356627b8cc74eb15506608dd987184608 (diff) | |
download | mongo-f2902d59175c0724944ca98d13f784e2de944053.tar.gz |
SERVER-28814 Replace ServerSelectionMetadata with just ReadPreferenceSetting
Diffstat (limited to 'src/mongo/client/read_preference.cpp')
-rw-r--r-- | src/mongo/client/read_preference.cpp | 39 |
1 files changed, 30 insertions, 9 deletions
diff --git a/src/mongo/client/read_preference.cpp b/src/mongo/client/read_preference.cpp index acdd83c1771..a8790ae9f3c 100644 --- a/src/mongo/client/read_preference.cpp +++ b/src/mongo/client/read_preference.cpp @@ -119,10 +119,14 @@ TagSet defaultTagSetForMode(ReadPreference mode) { */ const Seconds ReadPreferenceSetting::kMinimalMaxStalenessValue(90); +const OperationContext::Decoration<ReadPreferenceSetting> ReadPreferenceSetting::get = + OperationContext::declareDecoration<ReadPreferenceSetting>(); + const BSONObj& ReadPreferenceSetting::secondaryPreferredMetadata() { // This is a static method rather than a static member only because it is used by another TU // during dynamic init. - static const auto bson = BSON("$ssm" << BSON("$secondaryOk" << true)); + static const auto bson = + ReadPreferenceSetting(ReadPreference::SecondaryPreferred).toContainingBSON(); return bson; } @@ -148,7 +152,7 @@ ReadPreferenceSetting::ReadPreferenceSetting(ReadPreference pref, TagSet tags) ReadPreferenceSetting::ReadPreferenceSetting(ReadPreference pref) : ReadPreferenceSetting(pref, defaultTagSetForMode(pref)) {} -StatusWith<ReadPreferenceSetting> ReadPreferenceSetting::fromBSON(const BSONObj& readPrefObj) { +StatusWith<ReadPreferenceSetting> ReadPreferenceSetting::fromInnerBSON(const BSONObj& readPrefObj) { std::string modeStr; auto modeExtractStatus = bsonExtractStringField(readPrefObj, kModeFieldName, &modeStr); if (!modeExtractStatus.isOK()) { @@ -227,20 +231,37 @@ StatusWith<ReadPreferenceSetting> ReadPreferenceSetting::fromBSON(const BSONObj& return ReadPreferenceSetting(mode, tags, Seconds(maxStalenessSecondsValue)); } -BSONObj ReadPreferenceSetting::toBSON() const { - BSONObjBuilder bob; - bob.append(kModeFieldName, readPreferenceName(pref)); +StatusWith<ReadPreferenceSetting> ReadPreferenceSetting::fromInnerBSON(const BSONElement& elem) { + if (elem.type() != mongo::Object) { + return Status(ErrorCodes::TypeMismatch, + str::stream() << "$readPreference has incorrect type: expected " + << mongo::Object + << " but got " + << elem.type()); + } + return fromInnerBSON(elem.Obj()); +} + +StatusWith<ReadPreferenceSetting> ReadPreferenceSetting::fromContainingBSON( + const BSONObj& obj, ReadPreference defaultReadPref) { + if (auto elem = obj["$readPreference"]) { + return fromInnerBSON(elem); + } + return ReadPreferenceSetting(defaultReadPref); +} + +void ReadPreferenceSetting::toInnerBSON(BSONObjBuilder* bob) const { + bob->append(kModeFieldName, readPreferenceName(pref)); if (tags != defaultTagSetForMode(pref)) { - bob.append(kTagsFieldName, tags.getTagBSON()); + bob->append(kTagsFieldName, tags.getTagBSON()); } if (maxStalenessSeconds.count() > 0) { - bob.append(kMaxStalenessSecondsFieldName, maxStalenessSeconds.count()); + bob->append(kMaxStalenessSecondsFieldName, maxStalenessSeconds.count()); } - return bob.obj(); } std::string ReadPreferenceSetting::toString() const { - return toBSON().toString(); + return toInnerBSON().toString(); } } // namespace mongo |