summaryrefslogtreecommitdiff
path: root/src/mongo/db/repl/is_master_response.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/mongo/db/repl/is_master_response.cpp')
-rw-r--r--src/mongo/db/repl/is_master_response.cpp714
1 files changed, 358 insertions, 356 deletions
diff --git a/src/mongo/db/repl/is_master_response.cpp b/src/mongo/db/repl/is_master_response.cpp
index ab38c295d14..4a4b1394670 100644
--- a/src/mongo/db/repl/is_master_response.cpp
+++ b/src/mongo/db/repl/is_master_response.cpp
@@ -42,415 +42,417 @@ namespace mongo {
namespace repl {
namespace {
- const std::string kIsMasterFieldName = "ismaster";
- const std::string kSecondaryFieldName = "secondary";
- const std::string kSetNameFieldName = "setName";
- const std::string kSetVersionFieldName = "setVersion";
- const std::string kHostsFieldName = "hosts";
- const std::string kPassivesFieldName = "passives";
- const std::string kArbitersFieldName = "arbiters";
- const std::string kPrimaryFieldName = "primary";
- const std::string kArbiterOnlyFieldName = "arbiterOnly";
- const std::string kPassiveFieldName = "passive";
- const std::string kHiddenFieldName = "hidden";
- const std::string kBuildIndexesFieldName = "buildIndexes";
- const std::string kSlaveDelayFieldName = "slaveDelay";
- const std::string kTagsFieldName = "tags";
- const std::string kMeFieldName = "me";
- const std::string kElectionIdFieldName = "electionId";
-
- // field name constants that don't directly correspond to member variables
- const std::string kInfoFieldName = "info";
- const std::string kIsReplicaSetFieldName = "isreplicaset";
- const std::string kErrmsgFieldName = "errmsg";
- const std::string kCodeFieldName = "code";
+const std::string kIsMasterFieldName = "ismaster";
+const std::string kSecondaryFieldName = "secondary";
+const std::string kSetNameFieldName = "setName";
+const std::string kSetVersionFieldName = "setVersion";
+const std::string kHostsFieldName = "hosts";
+const std::string kPassivesFieldName = "passives";
+const std::string kArbitersFieldName = "arbiters";
+const std::string kPrimaryFieldName = "primary";
+const std::string kArbiterOnlyFieldName = "arbiterOnly";
+const std::string kPassiveFieldName = "passive";
+const std::string kHiddenFieldName = "hidden";
+const std::string kBuildIndexesFieldName = "buildIndexes";
+const std::string kSlaveDelayFieldName = "slaveDelay";
+const std::string kTagsFieldName = "tags";
+const std::string kMeFieldName = "me";
+const std::string kElectionIdFieldName = "electionId";
+
+// field name constants that don't directly correspond to member variables
+const std::string kInfoFieldName = "info";
+const std::string kIsReplicaSetFieldName = "isreplicaset";
+const std::string kErrmsgFieldName = "errmsg";
+const std::string kCodeFieldName = "code";
} // namespace
- IsMasterResponse::IsMasterResponse() :
- _isMaster(false),
- _isMasterSet(false),
- _secondary(false),
- _isSecondarySet(false),
- _setNameSet(false),
- _setVersion(0),
- _setVersionSet(false),
- _hostsSet(false),
- _passivesSet(false),
- _arbitersSet(false),
- _primarySet(false),
- _arbiterOnly(false),
- _arbiterOnlySet(false),
- _passive(false),
- _passiveSet(false),
- _hidden(false),
- _hiddenSet(false),
- _buildIndexes(true),
- _buildIndexesSet(false),
- _slaveDelay(0),
- _slaveDelaySet(false),
- _tagsSet(false),
- _meSet(false),
- _electionId(OID()),
- _configSet(true),
- _shutdownInProgress(false)
- {}
-
- void IsMasterResponse::addToBSON(BSONObjBuilder* builder) const {
- if (_shutdownInProgress) {
- builder->append(kCodeFieldName, ErrorCodes::ShutdownInProgress);
- builder->append(kErrmsgFieldName, "replication shutdown in progress");
- return;
- }
+IsMasterResponse::IsMasterResponse()
+ : _isMaster(false),
+ _isMasterSet(false),
+ _secondary(false),
+ _isSecondarySet(false),
+ _setNameSet(false),
+ _setVersion(0),
+ _setVersionSet(false),
+ _hostsSet(false),
+ _passivesSet(false),
+ _arbitersSet(false),
+ _primarySet(false),
+ _arbiterOnly(false),
+ _arbiterOnlySet(false),
+ _passive(false),
+ _passiveSet(false),
+ _hidden(false),
+ _hiddenSet(false),
+ _buildIndexes(true),
+ _buildIndexesSet(false),
+ _slaveDelay(0),
+ _slaveDelaySet(false),
+ _tagsSet(false),
+ _meSet(false),
+ _electionId(OID()),
+ _configSet(true),
+ _shutdownInProgress(false) {}
+
+void IsMasterResponse::addToBSON(BSONObjBuilder* builder) const {
+ if (_shutdownInProgress) {
+ builder->append(kCodeFieldName, ErrorCodes::ShutdownInProgress);
+ builder->append(kErrmsgFieldName, "replication shutdown in progress");
+ return;
+ }
- if (!_configSet) {
- builder->append(kIsMasterFieldName, false);
- builder->append(kSecondaryFieldName, false);
- builder->append(kInfoFieldName, "Does not have a valid replica set config");
- builder->append(kIsReplicaSetFieldName , true);
- return;
- }
+ if (!_configSet) {
+ builder->append(kIsMasterFieldName, false);
+ builder->append(kSecondaryFieldName, false);
+ builder->append(kInfoFieldName, "Does not have a valid replica set config");
+ builder->append(kIsReplicaSetFieldName, true);
+ return;
+ }
- invariant(_setNameSet);
- builder->append(kSetNameFieldName, _setName);
- invariant(_setVersionSet);
- builder->append(kSetVersionFieldName, static_cast<int>(_setVersion));
- invariant(_isMasterSet);
- builder->append(kIsMasterFieldName, _isMaster);
- invariant(_isSecondarySet);
- builder->append(kSecondaryFieldName, _secondary);
-
- if (_hostsSet) {
- std::vector<std::string> hosts;
- for (size_t i = 0; i < _hosts.size(); ++i) {
- hosts.push_back(_hosts[i].toString());
- }
- builder->append(kHostsFieldName, hosts);
+ invariant(_setNameSet);
+ builder->append(kSetNameFieldName, _setName);
+ invariant(_setVersionSet);
+ builder->append(kSetVersionFieldName, static_cast<int>(_setVersion));
+ invariant(_isMasterSet);
+ builder->append(kIsMasterFieldName, _isMaster);
+ invariant(_isSecondarySet);
+ builder->append(kSecondaryFieldName, _secondary);
+
+ if (_hostsSet) {
+ std::vector<std::string> hosts;
+ for (size_t i = 0; i < _hosts.size(); ++i) {
+ hosts.push_back(_hosts[i].toString());
}
- if (_passivesSet) {
- std::vector<std::string> passives;
- for (size_t i = 0; i < _passives.size(); ++i) {
- passives.push_back(_passives[i].toString());
- }
- builder->append(kPassivesFieldName, passives);
+ builder->append(kHostsFieldName, hosts);
+ }
+ if (_passivesSet) {
+ std::vector<std::string> passives;
+ for (size_t i = 0; i < _passives.size(); ++i) {
+ passives.push_back(_passives[i].toString());
}
- if (_arbitersSet) {
- std::vector<std::string> arbiters;
- for (size_t i = 0; i < _arbiters.size(); ++i) {
- arbiters.push_back(_arbiters[i].toString());
- }
- builder->append(kArbitersFieldName, arbiters);
+ builder->append(kPassivesFieldName, passives);
+ }
+ if (_arbitersSet) {
+ std::vector<std::string> arbiters;
+ for (size_t i = 0; i < _arbiters.size(); ++i) {
+ arbiters.push_back(_arbiters[i].toString());
}
- if (_primarySet)
- builder->append(kPrimaryFieldName, _primary.toString());
- if (_arbiterOnlySet)
- builder->append(kArbiterOnlyFieldName, _arbiterOnly);
- if (_passiveSet)
- builder->append(kPassiveFieldName, _passive);
- if (_hiddenSet)
- builder->append(kHiddenFieldName, _hidden);
- if (_buildIndexesSet)
- builder->append(kBuildIndexesFieldName, _buildIndexes);
- if (_slaveDelaySet)
- builder->appendIntOrLL(kSlaveDelayFieldName, durationCount<Seconds>(_slaveDelay));
- if (_tagsSet) {
- BSONObjBuilder tags(builder->subobjStart(kTagsFieldName));
- for (unordered_map<std::string, std::string>::const_iterator it = _tags.begin();
- it != _tags.end(); ++it) {
- tags.append(it->first, it->second);
- }
+ builder->append(kArbitersFieldName, arbiters);
+ }
+ if (_primarySet)
+ builder->append(kPrimaryFieldName, _primary.toString());
+ if (_arbiterOnlySet)
+ builder->append(kArbiterOnlyFieldName, _arbiterOnly);
+ if (_passiveSet)
+ builder->append(kPassiveFieldName, _passive);
+ if (_hiddenSet)
+ builder->append(kHiddenFieldName, _hidden);
+ if (_buildIndexesSet)
+ builder->append(kBuildIndexesFieldName, _buildIndexes);
+ if (_slaveDelaySet)
+ builder->appendIntOrLL(kSlaveDelayFieldName, durationCount<Seconds>(_slaveDelay));
+ if (_tagsSet) {
+ BSONObjBuilder tags(builder->subobjStart(kTagsFieldName));
+ for (unordered_map<std::string, std::string>::const_iterator it = _tags.begin();
+ it != _tags.end();
+ ++it) {
+ tags.append(it->first, it->second);
+ }
+ }
+ invariant(_meSet);
+ builder->append(kMeFieldName, _me.toString());
+ if (_electionId.isSet())
+ builder->append(kElectionIdFieldName, _electionId);
+}
+
+BSONObj IsMasterResponse::toBSON() const {
+ BSONObjBuilder builder;
+ addToBSON(&builder);
+ return builder.obj();
+}
+
+Status IsMasterResponse::initialize(const BSONObj& doc) {
+ Status status = bsonExtractBooleanField(doc, kIsMasterFieldName, &_isMaster);
+ if (!status.isOK()) {
+ return status;
+ }
+ _isMasterSet = true;
+ status = bsonExtractBooleanField(doc, kSecondaryFieldName, &_secondary);
+ if (!status.isOK()) {
+ return status;
+ }
+ _isSecondarySet = true;
+ if (doc.hasField(kInfoFieldName)) {
+ if (_isMaster || _secondary || !doc.hasField(kIsReplicaSetFieldName) ||
+ !doc[kIsReplicaSetFieldName].booleanSafe()) {
+ return Status(ErrorCodes::FailedToParse,
+ str::stream() << "Expected presence of \"" << kInfoFieldName
+ << "\" field to indicate no valid config loaded, but other "
+ "fields weren't as we expected");
+ }
+ _configSet = false;
+ return Status::OK();
+ } else {
+ if (doc.hasField(kIsReplicaSetFieldName)) {
+ return Status(ErrorCodes::FailedToParse,
+ str::stream() << "Found \"" << kIsReplicaSetFieldName
+ << "\" field which should indicate that no valid config "
+ "is loaded, but we didn't also have an \""
+ << kInfoFieldName << "\" field as we expected");
}
- invariant(_meSet);
- builder->append(kMeFieldName, _me.toString());
- if (_electionId.isSet())
- builder->append(kElectionIdFieldName, _electionId);
}
- BSONObj IsMasterResponse::toBSON() const {
- BSONObjBuilder builder;
- addToBSON(&builder);
- return builder.obj();
+ status = bsonExtractStringField(doc, kSetNameFieldName, &_setName);
+ if (!status.isOK()) {
+ return status;
+ }
+ _setNameSet = true;
+ status = bsonExtractIntegerField(doc, kSetVersionFieldName, &_setVersion);
+ if (!status.isOK()) {
+ return status;
}
+ _setVersionSet = true;
- Status IsMasterResponse::initialize(const BSONObj& doc) {
- Status status = bsonExtractBooleanField(doc, kIsMasterFieldName, &_isMaster);
- if (!status.isOK()) {
- return status;
- }
- _isMasterSet = true;
- status = bsonExtractBooleanField(doc, kSecondaryFieldName, &_secondary);
+ if (doc.hasField(kHostsFieldName)) {
+ BSONElement hostsElement;
+ status = bsonExtractTypedField(doc, kHostsFieldName, Array, &hostsElement);
if (!status.isOK()) {
return status;
}
- _isSecondarySet = true;
- if (doc.hasField(kInfoFieldName)) {
- if (_isMaster ||
- _secondary ||
- !doc.hasField(kIsReplicaSetFieldName) ||
- !doc[kIsReplicaSetFieldName].booleanSafe()) {
- return Status(ErrorCodes::FailedToParse,
- str::stream() << "Expected presence of \"" << kInfoFieldName <<
- "\" field to indicate no valid config loaded, but other "
- "fields weren't as we expected");
- }
- _configSet = false;
- return Status::OK();
- }
- else {
- if (doc.hasField(kIsReplicaSetFieldName)) {
- return Status(ErrorCodes::FailedToParse,
- str::stream() << "Found \"" << kIsReplicaSetFieldName <<
- "\" field which should indicate that no valid config "
- "is loaded, but we didn't also have an \"" <<
- kInfoFieldName << "\" field as we expected");
+ for (BSONObjIterator it(hostsElement.Obj()); it.more();) {
+ BSONElement hostElement = it.next();
+ if (hostElement.type() != String) {
+ return Status(ErrorCodes::TypeMismatch,
+ str::stream() << "Elements in \"" << kHostsFieldName
+ << "\" array of isMaster response must be of type "
+ << typeName(String) << " but found type "
+ << typeName(hostElement.type()));
}
+ _hosts.push_back(HostAndPort(hostElement.String()));
}
+ _hostsSet = true;
+ }
- status = bsonExtractStringField(doc, kSetNameFieldName, &_setName);
- if (!status.isOK()) {
- return status;
- }
- _setNameSet = true;
- status = bsonExtractIntegerField(doc, kSetVersionFieldName, &_setVersion);
+ if (doc.hasField(kPassivesFieldName)) {
+ BSONElement passivesElement;
+ status = bsonExtractTypedField(doc, kPassivesFieldName, Array, &passivesElement);
if (!status.isOK()) {
return status;
}
- _setVersionSet = true;
-
- if (doc.hasField(kHostsFieldName)) {
- BSONElement hostsElement;
- status = bsonExtractTypedField(doc, kHostsFieldName, Array, &hostsElement);
- if (!status.isOK()) {
- return status;
- }
- for (BSONObjIterator it(hostsElement.Obj()); it.more();) {
- BSONElement hostElement = it.next();
- if (hostElement.type() != String) {
- return Status(ErrorCodes::TypeMismatch,
- str::stream() << "Elements in \"" << kHostsFieldName <<
- "\" array of isMaster response must be of type " <<
- typeName(String) << " but found type " <<
- typeName(hostElement.type()));
- }
- _hosts.push_back(HostAndPort(hostElement.String()));
- }
- _hostsSet = true;
- }
-
- if (doc.hasField(kPassivesFieldName)) {
- BSONElement passivesElement;
- status = bsonExtractTypedField(doc, kPassivesFieldName, Array, &passivesElement);
- if (!status.isOK()) {
- return status;
- }
- for (BSONObjIterator it(passivesElement.Obj()); it.more();) {
- BSONElement passiveElement = it.next();
- if (passiveElement.type() != String) {
- return Status(ErrorCodes::TypeMismatch,
- str::stream() << "Elements in \"" << kPassivesFieldName <<
- "\" array of isMaster response must be of type " <<
- typeName(String) << " but found type " <<
- typeName(passiveElement.type()));
- }
- _passives.push_back(HostAndPort(passiveElement.String()));
- }
- _passivesSet = true;
- }
-
- if (doc.hasField(kArbitersFieldName)) {
- BSONElement arbitersElement;
- status = bsonExtractTypedField(doc, kArbitersFieldName, Array, &arbitersElement);
- if (!status.isOK()) {
- return status;
- }
- for (BSONObjIterator it(arbitersElement.Obj()); it.more();) {
- BSONElement arbiterElement = it.next();
- if (arbiterElement.type() != String) {
- return Status(ErrorCodes::TypeMismatch,
- str::stream() << "Elements in \"" << kArbitersFieldName <<
- "\" array of isMaster response must be of type " <<
- typeName(String) << " but found type " <<
- typeName(arbiterElement.type()));
- }
- _arbiters.push_back(HostAndPort(arbiterElement.String()));
- }
- _arbitersSet = true;
- }
-
- if (doc.hasField(kPrimaryFieldName)) {
- std::string primaryString;
- status = bsonExtractStringField(doc, kPrimaryFieldName, &primaryString);
- if (!status.isOK()) {
- return status;
- }
- _primary = HostAndPort(primaryString);
- _primarySet = true;
- }
-
- if (doc.hasField(kArbiterOnlyFieldName)) {
- status = bsonExtractBooleanField(doc, kArbiterOnlyFieldName, &_arbiterOnly);
- if (!status.isOK()) {
- return status;
- }
- _arbiterOnlySet = true;
- }
-
- if (doc.hasField(kPassiveFieldName)) {
- status = bsonExtractBooleanField(doc, kPassiveFieldName, &_passive);
- if (!status.isOK()) {
- return status;
- }
- _passiveSet = true;
- }
-
- if (doc.hasField(kHiddenFieldName)) {
- status = bsonExtractBooleanField(doc, kHiddenFieldName, &_hidden);
- if (!status.isOK()) {
- return status;
- }
- _hiddenSet = true;
- }
-
- if (doc.hasField(kBuildIndexesFieldName)) {
- status = bsonExtractBooleanField(doc, kBuildIndexesFieldName, &_buildIndexes);
- if (!status.isOK()) {
- return status;
- }
- _buildIndexesSet = true;
- }
-
- if (doc.hasField(kSlaveDelayFieldName)) {
- long long slaveDelaySecs;
- status = bsonExtractIntegerField(doc, kSlaveDelayFieldName, &slaveDelaySecs);
- if (!status.isOK()) {
- return status;
+ for (BSONObjIterator it(passivesElement.Obj()); it.more();) {
+ BSONElement passiveElement = it.next();
+ if (passiveElement.type() != String) {
+ return Status(ErrorCodes::TypeMismatch,
+ str::stream() << "Elements in \"" << kPassivesFieldName
+ << "\" array of isMaster response must be of type "
+ << typeName(String) << " but found type "
+ << typeName(passiveElement.type()));
}
- _slaveDelaySet = true;
- _slaveDelay = Seconds(slaveDelaySecs);
+ _passives.push_back(HostAndPort(passiveElement.String()));
}
+ _passivesSet = true;
+ }
- if (doc.hasField(kTagsFieldName)) {
- BSONElement tagsElement;
- status = bsonExtractTypedField(doc, kTagsFieldName, Object, &tagsElement);
- if (!status.isOK()) {
- return status;
- }
- for (BSONObjIterator it(tagsElement.Obj()); it.more();) {
- BSONElement tagElement = it.next();
- if (tagElement.type() != String) {
- return Status(ErrorCodes::TypeMismatch,
- str::stream() << "Elements in \"" << kTagsFieldName << "\" obj "
- "of isMaster response must be of type " <<
- typeName(String) << " but found type " <<
- typeName(tagsElement.type()));
- }
- _tags[tagElement.fieldNameStringData().toString()] = tagElement.String();
- }
- _tagsSet = true;
+ if (doc.hasField(kArbitersFieldName)) {
+ BSONElement arbitersElement;
+ status = bsonExtractTypedField(doc, kArbitersFieldName, Array, &arbitersElement);
+ if (!status.isOK()) {
+ return status;
}
-
- if (doc.hasField(kElectionIdFieldName)) {
- BSONElement electionIdElem;
- status = bsonExtractTypedField(doc, kElectionIdFieldName, jstOID, &electionIdElem);
- if (!status.isOK()) {
- return status;
+ for (BSONObjIterator it(arbitersElement.Obj()); it.more();) {
+ BSONElement arbiterElement = it.next();
+ if (arbiterElement.type() != String) {
+ return Status(ErrorCodes::TypeMismatch,
+ str::stream() << "Elements in \"" << kArbitersFieldName
+ << "\" array of isMaster response must be of type "
+ << typeName(String) << " but found type "
+ << typeName(arbiterElement.type()));
}
- _electionId = electionIdElem.OID();
+ _arbiters.push_back(HostAndPort(arbiterElement.String()));
}
+ _arbitersSet = true;
+ }
- std::string meString;
- status = bsonExtractStringField(doc, kMeFieldName, &meString);
+ if (doc.hasField(kPrimaryFieldName)) {
+ std::string primaryString;
+ status = bsonExtractStringField(doc, kPrimaryFieldName, &primaryString);
if (!status.isOK()) {
return status;
}
- _me = HostAndPort(meString);
- _meSet = true;
-
- return Status::OK();
- }
-
- void IsMasterResponse::setIsMaster(bool isMaster) {
- _isMasterSet = true;
- _isMaster = isMaster;
- }
-
- void IsMasterResponse::setIsSecondary(bool secondary) {
- _isSecondarySet = true;
- _secondary = secondary;
- }
-
- void IsMasterResponse::setReplSetName(const std::string& setName) {
- _setNameSet = true;
- _setName = setName;
- }
-
- void IsMasterResponse::setReplSetVersion(long long version) {
- _setVersionSet = true;
- _setVersion = version;
- }
-
- void IsMasterResponse::addHost(const HostAndPort& host) {
- _hostsSet = true;
- _hosts.push_back(host);
- }
-
- void IsMasterResponse::addPassive(const HostAndPort& passive) {
- _passivesSet = true;
- _passives.push_back(passive);
- }
-
- void IsMasterResponse::addArbiter(const HostAndPort& arbiter) {
- _arbitersSet = true;
- _arbiters.push_back(arbiter);
- }
-
- void IsMasterResponse::setPrimary(const HostAndPort& primary) {
+ _primary = HostAndPort(primaryString);
_primarySet = true;
- _primary = primary;
}
- void IsMasterResponse::setIsArbiterOnly(bool arbiterOnly) {
+ if (doc.hasField(kArbiterOnlyFieldName)) {
+ status = bsonExtractBooleanField(doc, kArbiterOnlyFieldName, &_arbiterOnly);
+ if (!status.isOK()) {
+ return status;
+ }
_arbiterOnlySet = true;
- _arbiterOnly = arbiterOnly;
}
- void IsMasterResponse::setIsPassive(bool passive) {
+ if (doc.hasField(kPassiveFieldName)) {
+ status = bsonExtractBooleanField(doc, kPassiveFieldName, &_passive);
+ if (!status.isOK()) {
+ return status;
+ }
_passiveSet = true;
- _passive = passive;
}
- void IsMasterResponse::setIsHidden(bool hidden) {
+ if (doc.hasField(kHiddenFieldName)) {
+ status = bsonExtractBooleanField(doc, kHiddenFieldName, &_hidden);
+ if (!status.isOK()) {
+ return status;
+ }
_hiddenSet = true;
- _hidden = hidden;
}
- void IsMasterResponse::setShouldBuildIndexes(bool buildIndexes) {
+ if (doc.hasField(kBuildIndexesFieldName)) {
+ status = bsonExtractBooleanField(doc, kBuildIndexesFieldName, &_buildIndexes);
+ if (!status.isOK()) {
+ return status;
+ }
_buildIndexesSet = true;
- _buildIndexes = buildIndexes;
}
- void IsMasterResponse::setSlaveDelay(Seconds slaveDelay) {
+ if (doc.hasField(kSlaveDelayFieldName)) {
+ long long slaveDelaySecs;
+ status = bsonExtractIntegerField(doc, kSlaveDelayFieldName, &slaveDelaySecs);
+ if (!status.isOK()) {
+ return status;
+ }
_slaveDelaySet = true;
- _slaveDelay = slaveDelay;
+ _slaveDelay = Seconds(slaveDelaySecs);
}
- void IsMasterResponse::addTag(const std::string& tagKey, const std::string& tagValue) {
+ if (doc.hasField(kTagsFieldName)) {
+ BSONElement tagsElement;
+ status = bsonExtractTypedField(doc, kTagsFieldName, Object, &tagsElement);
+ if (!status.isOK()) {
+ return status;
+ }
+ for (BSONObjIterator it(tagsElement.Obj()); it.more();) {
+ BSONElement tagElement = it.next();
+ if (tagElement.type() != String) {
+ return Status(ErrorCodes::TypeMismatch,
+ str::stream() << "Elements in \"" << kTagsFieldName
+ << "\" obj "
+ "of isMaster response must be of type "
+ << typeName(String) << " but found type "
+ << typeName(tagsElement.type()));
+ }
+ _tags[tagElement.fieldNameStringData().toString()] = tagElement.String();
+ }
_tagsSet = true;
- _tags[tagKey] = tagValue;
}
- void IsMasterResponse::setMe(const HostAndPort& me) {
- _meSet = true;
- _me = me;
+ if (doc.hasField(kElectionIdFieldName)) {
+ BSONElement electionIdElem;
+ status = bsonExtractTypedField(doc, kElectionIdFieldName, jstOID, &electionIdElem);
+ if (!status.isOK()) {
+ return status;
+ }
+ _electionId = electionIdElem.OID();
}
- void IsMasterResponse::setElectionId(const OID& electionId) {
- _electionId = electionId;
+ std::string meString;
+ status = bsonExtractStringField(doc, kMeFieldName, &meString);
+ if (!status.isOK()) {
+ return status;
}
-
- void IsMasterResponse::markAsNoConfig() { _configSet = false; }
-
- void IsMasterResponse::markAsShutdownInProgress() { _shutdownInProgress = true; }
-
-} // namespace repl
-} // namespace mongo
+ _me = HostAndPort(meString);
+ _meSet = true;
+
+ return Status::OK();
+}
+
+void IsMasterResponse::setIsMaster(bool isMaster) {
+ _isMasterSet = true;
+ _isMaster = isMaster;
+}
+
+void IsMasterResponse::setIsSecondary(bool secondary) {
+ _isSecondarySet = true;
+ _secondary = secondary;
+}
+
+void IsMasterResponse::setReplSetName(const std::string& setName) {
+ _setNameSet = true;
+ _setName = setName;
+}
+
+void IsMasterResponse::setReplSetVersion(long long version) {
+ _setVersionSet = true;
+ _setVersion = version;
+}
+
+void IsMasterResponse::addHost(const HostAndPort& host) {
+ _hostsSet = true;
+ _hosts.push_back(host);
+}
+
+void IsMasterResponse::addPassive(const HostAndPort& passive) {
+ _passivesSet = true;
+ _passives.push_back(passive);
+}
+
+void IsMasterResponse::addArbiter(const HostAndPort& arbiter) {
+ _arbitersSet = true;
+ _arbiters.push_back(arbiter);
+}
+
+void IsMasterResponse::setPrimary(const HostAndPort& primary) {
+ _primarySet = true;
+ _primary = primary;
+}
+
+void IsMasterResponse::setIsArbiterOnly(bool arbiterOnly) {
+ _arbiterOnlySet = true;
+ _arbiterOnly = arbiterOnly;
+}
+
+void IsMasterResponse::setIsPassive(bool passive) {
+ _passiveSet = true;
+ _passive = passive;
+}
+
+void IsMasterResponse::setIsHidden(bool hidden) {
+ _hiddenSet = true;
+ _hidden = hidden;
+}
+
+void IsMasterResponse::setShouldBuildIndexes(bool buildIndexes) {
+ _buildIndexesSet = true;
+ _buildIndexes = buildIndexes;
+}
+
+void IsMasterResponse::setSlaveDelay(Seconds slaveDelay) {
+ _slaveDelaySet = true;
+ _slaveDelay = slaveDelay;
+}
+
+void IsMasterResponse::addTag(const std::string& tagKey, const std::string& tagValue) {
+ _tagsSet = true;
+ _tags[tagKey] = tagValue;
+}
+
+void IsMasterResponse::setMe(const HostAndPort& me) {
+ _meSet = true;
+ _me = me;
+}
+
+void IsMasterResponse::setElectionId(const OID& electionId) {
+ _electionId = electionId;
+}
+
+void IsMasterResponse::markAsNoConfig() {
+ _configSet = false;
+}
+
+void IsMasterResponse::markAsShutdownInProgress() {
+ _shutdownInProgress = true;
+}
+
+} // namespace repl
+} // namespace mongo