ReplSetTag ReplSetTagConfig::findTag(StringData key, StringData value) const { int32_t keyIndex = _findKeyIndex(key); if (size_t(keyIndex) == _tagData.size()) return ReplSetTag(-1, -1); const ValueVector& values = _tagData[keyIndex].second; for (size_t valueIndex = 0; valueIndex < values.size(); ++valueIndex) { if (values[valueIndex] == value) { return ReplSetTag(keyIndex, int32_t(valueIndex)); } } return ReplSetTag(-1, -1); }
ReplSetTag ReplSetTagConfig::makeTag(StringData key, StringData value) { int32_t keyIndex = _findKeyIndex(key); if (size_t(keyIndex) == _tagData.size()) { _tagData.push_back(make_pair(key.toString(), ValueVector())); } ValueVector& values = _tagData[keyIndex].second; for (size_t valueIndex = 0; valueIndex < values.size(); ++valueIndex) { if (values[valueIndex] != value) continue; return ReplSetTag(keyIndex, int32_t(valueIndex)); } values.push_back(value.toString()); return ReplSetTag(keyIndex, int32_t(values.size()) - 1); }
BSONObj ReplSetConfig::toBSON() const { BSONObjBuilder configBuilder; configBuilder.append(kIdFieldName, _replSetName); configBuilder.appendIntOrLL(kVersionFieldName, _version); if (_configServer) { // Only include "configsvr" field if true configBuilder.append(kConfigServerFieldName, _configServer); } // Only include writeConcernMajorityJournalDefault if it is not the default version for this // ProtocolVersion to prevent breaking cross version-3.2.1 compatibilty of ReplSetConfigs. if (_protocolVersion > 0) { configBuilder.append(kProtocolVersionFieldName, _protocolVersion); // Only include writeConcernMajorityJournalDefault if it is not the default version for this // ProtocolVersion to prevent breaking cross version-3.2.1 compatibilty of // ReplSetConfigs. if (!_writeConcernMajorityJournalDefault) { configBuilder.append(kWriteConcernMajorityJournalDefaultFieldName, _writeConcernMajorityJournalDefault); } } else if (_writeConcernMajorityJournalDefault) { configBuilder.append(kWriteConcernMajorityJournalDefaultFieldName, _writeConcernMajorityJournalDefault); } BSONArrayBuilder members(configBuilder.subarrayStart(kMembersFieldName)); for (MemberIterator mem = membersBegin(); mem != membersEnd(); mem++) { members.append(mem->toBSON(getTagConfig())); } members.done(); BSONObjBuilder settingsBuilder(configBuilder.subobjStart(kSettingsFieldName)); settingsBuilder.append(kChainingAllowedFieldName, _chainingAllowed); settingsBuilder.appendIntOrLL(kHeartbeatIntervalFieldName, durationCount<Milliseconds>(_heartbeatInterval)); settingsBuilder.appendIntOrLL(kHeartbeatTimeoutFieldName, durationCount<Seconds>(_heartbeatTimeoutPeriod)); settingsBuilder.appendIntOrLL(kElectionTimeoutFieldName, durationCount<Milliseconds>(_electionTimeoutPeriod)); settingsBuilder.appendIntOrLL(kCatchUpTimeoutFieldName, durationCount<Milliseconds>(_catchUpTimeoutPeriod)); settingsBuilder.appendIntOrLL(kCatchUpTakeoverDelayFieldName, durationCount<Milliseconds>(_catchUpTakeoverDelay)); BSONObjBuilder gleModes(settingsBuilder.subobjStart(kGetLastErrorModesFieldName)); for (StringMap<ReplSetTagPattern>::const_iterator mode = _customWriteConcernModes.begin(); mode != _customWriteConcernModes.end(); ++mode) { if (mode->first[0] == '$') { // Filter out internal modes continue; } BSONObjBuilder modeBuilder(gleModes.subobjStart(mode->first)); for (ReplSetTagPattern::ConstraintIterator itr = mode->second.constraintsBegin(); itr != mode->second.constraintsEnd(); itr++) { modeBuilder.append(_tagConfig.getTagKey(ReplSetTag(itr->getKeyIndex(), 0)), itr->getMinCount()); } modeBuilder.done(); } gleModes.done(); settingsBuilder.append(kGetLastErrorDefaultsFieldName, _defaultWriteConcern.toBSON()); if (_replicaSetId.isSet()) { settingsBuilder.append(kReplicaSetIdFieldName, _replicaSetId); } settingsBuilder.done(); return configBuilder.obj(); }