summaryrefslogtreecommitdiff
path: root/src/mongo/client/read_preference.cpp
diff options
context:
space:
mode:
authorMathias Stearn <mathias@10gen.com>2017-04-26 09:36:41 -0400
committerMathias Stearn <mathias@10gen.com>2017-05-12 12:08:30 -0400
commitf2902d59175c0724944ca98d13f784e2de944053 (patch)
tree44788ee704540d420f649279053019e3b6a332b2 /src/mongo/client/read_preference.cpp
parent1a955fc356627b8cc74eb15506608dd987184608 (diff)
downloadmongo-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.cpp39
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