/** * Copyright (C) 2014 MongoDB Inc. * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License, version 3, * as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see . * * As a special exception, the copyright holders give permission to link the * code of portions of this program with the OpenSSL library under certain * conditions as described in each individual source file and distribute * linked combinations including the program with the OpenSSL library. You * must comply with the GNU Affero General Public License in all respects for * all of the code used other than as permitted herein. If you modify file(s) * with this exception, you may extend this exception to your version of the * file(s), but you are not obligated to do so. If you do not wish to do so, * delete this exception statement from your version. If you delete this * exception statement from all source files in the program, then also delete * it in the license file. */ #pragma once #include #include #include "mongo/platform/unordered_map.h" #include "mongo/util/net/hostandport.h" #include "mongo/util/time_support.h" namespace mongo { class BSONObj; class BSONObjBuilder; class Status; namespace repl { /** * Response structure for the ismaster command. Only handles responses from nodes * that are in replset mode. */ class IsMasterResponse { public: IsMasterResponse(); /** * Initializes this IsMasterResponse from the contents of "doc". */ Status initialize(const BSONObj& doc); /** * Appends all non-default values to "builder". * There are two values that are handled specially: if _inShutdown is true or _configSet * is false, we will add a standard response to "builder" indicating either that we are * in the middle of shutting down or we do not have a valid replica set config, ignoring * the values of all other member variables. */ void addToBSON(BSONObjBuilder* builder) const; /** * Returns a BSONObj consisting the results of calling addToBSON on an otherwise empty * BSONObjBuilder. */ BSONObj toBSON() const; // ===================== Accessors for member variables ================================= // bool isMaster() const { return _isMaster; } bool isSecondary() const { return _secondary; } const std::string& getReplSetName() const { return _setName; } long long getReplSetVersion() const { return _setVersion; } const std::vector& getHosts() const { return _hosts; } const std::vector& getPassives() const { return _passives; } const std::vector& getArbiters() const { return _arbiters; } const HostAndPort& getPrimary() const { return _primary; } bool hasPrimary() const { return _primarySet; } bool isArbiterOnly() const { return _arbiterOnly; } bool isPassive() const { return _passive; } bool isHidden() const { return _hidden; } bool shouldBuildIndexes() const { return _buildIndexes; } Seconds getSlaveDelay() const { return _slaveDelay; } const unordered_map getTags() const { return _tags; } const HostAndPort& getMe() const { return _me; } /** * If false, calls to toBSON/addToBSON will ignore all other fields and add a specific * message to indicate that we have no replica set config. */ bool isConfigSet() const { return _configSet; } /** * If false, calls to toBSON/addToBSON will ignore all other fields and add a specific * message to indicate that we are in the middle of shutting down. */ bool isShutdownInProgress() const { return _shutdownInProgress; } // ===================== Mutators for member variables ================================= // void setIsMaster(bool isMaster); void setIsSecondary(bool secondary); void setReplSetName(const std::string& setName); void setReplSetVersion(long long version); void addHost(const HostAndPort& host); void addPassive(const HostAndPort& passive); void addArbiter(const HostAndPort& arbiter); void setPrimary(const HostAndPort& primary); void setIsArbiterOnly(bool arbiterOnly); void setIsPassive(bool passive); void setIsHidden(bool hidden); void setShouldBuildIndexes(bool buildIndexes); void setSlaveDelay(Seconds slaveDelay); void addTag(const std::string& tagKey, const std::string& tagValue); void setMe(const HostAndPort& me); /** * Marks _configSet as false, which will cause future calls to toBSON/addToBSON to ignore * all other member variables and output a hardcoded response indicating that we have no * valid replica set config. */ void markAsNoConfig(); /** * Marks _shutdownInProgress as true, which will cause future calls to toBSON/addToBSON to * ignore all other member variables and output a hardcoded response indicating that we are * in the middle of shutting down. */ void markAsShutdownInProgress(); private: bool _isMaster; bool _isMasterSet; bool _secondary; bool _isSecondarySet; std::string _setName; bool _setNameSet; long long _setVersion; bool _setVersionSet; std::vector _hosts; bool _hostsSet; std::vector _passives; bool _passivesSet; std::vector _arbiters; bool _arbitersSet; HostAndPort _primary; bool _primarySet; bool _arbiterOnly; bool _arbiterOnlySet; bool _passive; bool _passiveSet; bool _hidden; bool _hiddenSet; bool _buildIndexes; bool _buildIndexesSet; Seconds _slaveDelay; bool _slaveDelaySet; unordered_map _tags; bool _tagsSet; HostAndPort _me; bool _meSet; // If _configSet is false this means we don't have a valid repl set config, so toBSON // will return a set of hardcoded values that indicate this. bool _configSet; // If _shutdownInProgress is true toBSON will return a set of hardcoded values to indicate // that we are mid shutdown bool _shutdownInProgress; }; } // namespace repl } // namespace mongo