/* Copyright 2013 10gen 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 "mongo/db/jsobj.h"
#include "mongo/platform/process_id.h"
#include "mongo/s/catalog/sharding_catalog_client.h"
#include "mongo/util/net/listen.h" // For DEFAULT_MAX_CONN
namespace mongo {
const int DEFAULT_UNIX_PERMS = 0700;
enum class ClusterRole { None, ShardServer, ConfigServer };
struct ServerGlobalParams {
std::string binaryName; // mongod or mongos
std::string cwd; // cwd of when process started
int port = DefaultDBPort; // --port
enum { DefaultDBPort = 27017, ConfigServerPort = 27019, ShardServerPort = 27018 };
bool isDefaultPort() const {
return port == DefaultDBPort;
}
std::string bind_ip; // --bind_ip
bool rest = false; // --rest
bool jsonp = false; // --jsonp
bool indexBuildRetry = true; // --noIndexBuildRetry
std::atomic quiet{false}; // --quiet NOLINT
ClusterRole clusterRole = ClusterRole::None; // --configsvr/--shardsvr
bool cpu = false; // --cpu show cpu time periodically
bool objcheck = true; // --objcheck
int defaultProfile = 0; // --profile
int slowMS = 100; // --time in ms that is "slow"
int defaultLocalThresholdMillis = 15; // --localThreshold in ms to consider a node local
bool moveParanoia = false; // for move chunk paranoia
bool noUnixSocket = false; // --nounixsocket
bool doFork = false; // --fork
std::string socket = "/tmp"; // UNIX domain socket directory
int maxConns = DEFAULT_MAX_CONN; // Maximum number of simultaneous open connections.
int unixSocketPermissions = DEFAULT_UNIX_PERMS; // permissions for the UNIX domain socket
std::string keyFile; // Path to keyfile, or empty if none.
std::string pidFile; // Path to pid file, or empty if none.
std::string logpath; // Path to log file, if logging to a file; otherwise, empty.
bool logAppend = false; // True if logging to a file in append mode.
bool logRenameOnRotate = true; // True if logging should rename log files on rotate
bool logWithSyslog = false; // True if logging to syslog; must not be set if logpath is set.
int syslogFacility; // Facility used when appending messages to the syslog.
bool isHttpInterfaceEnabled = false; // True if the dbwebserver should be enabled.
#ifndef _WIN32
ProcessId parentProc; // --fork pid of initial process
ProcessId leaderProc; // --fork pid of leader process
#endif
/**
* Switches to enable experimental (unsupported) features.
*/
struct ExperimentalFeatures {
ExperimentalFeatures() : storageDetailsCmdEnabled(false) {}
bool storageDetailsCmdEnabled; // -- enableExperimentalStorageDetailsCmd
} experimental;
time_t started = ::time(0);
BSONArray argvArray;
BSONObj parsedOpts;
enum AuthState { kEnabled, kDisabled, kUndefined };
AuthState authState = AuthState::kUndefined;
bool transitionToAuth = false; // --transitionToAuth, mixed mode for rolling auth upgrade
AtomicInt32 clusterAuthMode; // --clusterAuthMode, the internal cluster auth mode
enum ClusterAuthModes {
ClusterAuthMode_undefined,
/**
* Authenticate using keyfile, accept only keyfiles
*/
ClusterAuthMode_keyFile,
/**
* Authenticate using keyfile, accept both keyfiles and X.509
*/
ClusterAuthMode_sendKeyFile,
/**
* Authenticate using X.509, accept both keyfiles and X.509
*/
ClusterAuthMode_sendX509,
/**
* Authenticate using X.509, accept only X.509
*/
ClusterAuthMode_x509
};
// for the YAML config, sharding._overrideShardIdentity. Can only be used when in
// queryableBackupMode.
BSONObj overrideShardIdentity;
struct FeatureCompatibility {
enum class Version {
/**
* In this mode, the cluster will expose a 3.2-like API. Attempts by a client to use new
* features in 3.4, such as read-only views, collation, or the decimal128 BSON type,
* will be rejected.
*/
k32,
/**
* In this mode, new features in 3.4 are allowed. The system should guarantee that no
* 3.2 node can participate in a cluster whose feature compatibility version is 3.4.
*/
k34,
};
// Read-only parameter featureCompatibilityVersion.
AtomicWord version{Version::k32};
// Feature validation differs depending on the role of a mongod in a replica set or
// master/slave configuration. Masters/primaries can accept user-initiated writes and
// validate based on the feature compatibility version. A secondary/slave (which is not also
// a master) always validates in "3.4" mode so that it can sync 3.4 features, even when in
// "3.2" feature compatibility mode.
AtomicWord validateFeaturesAsMaster{true};
} featureCompatibility;
};
extern ServerGlobalParams serverGlobalParams;
}