/*
* Copyright (C) 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.
*/
#include "mongo/s/mongos_options.h"
#include
#include
#include "mongo/base/status.h"
#include "mongo/bson/util/builder.h"
#include "mongo/db/server_options.h"
#include "mongo/db/server_options_helpers.h"
#include "mongo/s/chunk.h"
#include "mongo/s/version_mongos.h"
#include "mongo/util/net/ssl_options.h"
#include "mongo/util/options_parser/startup_options.h"
#include "mongo/util/startup_test.h"
#include "mongo/util/stringutils.h"
namespace mongo {
MongosGlobalParams mongosGlobalParams;
Status addMongosOptions(moe::OptionSection* options) {
moe::OptionSection general_options("General options");
Status ret = addGeneralServerOptions(&general_options);
if (!ret.isOK()) {
return ret;
}
#if defined(_WIN32)
moe::OptionSection windows_scm_options("Windows Service Control Manager options");
ret = addWindowsServerOptions(&windows_scm_options);
if (!ret.isOK()) {
return ret;
}
#endif
#ifdef MONGO_SSL
moe::OptionSection ssl_options("SSL options");
ret = addSSLServerOptions(&ssl_options);
if (!ret.isOK()) {
return ret;
}
#endif
moe::OptionSection sharding_options("Sharding options");
sharding_options.addOptionChaining("sharding.configDB", "configdb", moe::String,
"1 or 3 comma separated config servers");
sharding_options.addOptionChaining("replication.localPingThresholdMs", "localThreshold",
moe::Int, "ping time (in ms) for a node to be considered local (default 15ms)");
sharding_options.addOptionChaining("test", "test", moe::Switch, "just run unit tests")
.setSources(moe::SourceAllLegacy);
sharding_options.addOptionChaining("upgrade", "upgrade", moe::Switch,
"upgrade meta data version")
.setSources(moe::SourceAllLegacy);
sharding_options.addOptionChaining("sharding.chunkSize", "chunkSize", moe::Int,
"maximum amount of data per chunk");
sharding_options.addOptionChaining("net.ipv6", "ipv6", moe::Switch,
"enable IPv6 support (disabled by default)");
sharding_options.addOptionChaining("net.http.JSONPEnabled", "jsonp", moe::Switch,
"allow JSONP access via http (has security implications)")
.setSources(moe::SourceAllLegacy);
sharding_options.addOptionChaining("noscripting", "noscripting", moe::Switch,
"disable scripting engine")
.setSources(moe::SourceAllLegacy);
options->addSection(general_options);
#if defined(_WIN32)
options->addSection(windows_scm_options);
#endif
options->addSection(sharding_options);
#ifdef MONGO_SSL
options->addSection(ssl_options);
#endif
options->addOptionChaining("noAutoSplit", "noAutoSplit", moe::Switch,
"do not send split commands with writes")
.hidden()
.setSources(moe::SourceAllLegacy);
options->addOptionChaining("sharding.autoSplit", "", moe::Bool,
"send split commands with writes")
.setSources(moe::SourceYAMLConfig);
return Status::OK();
}
void printMongosHelp(const moe::OptionSection& options) {
std::cout << options.helpString() << std::endl;
};
bool handlePreValidationMongosOptions(const moe::Environment& params,
const std::vector& args) {
if (params.count("help")) {
printMongosHelp(moe::startupOptions);
return false;
}
if (params.count("version")) {
printShardingVersionInfo(true);
return false;
}
if ( params.count( "test" ) ) {
::mongo::logger::globalLogDomain()->setMinimumLoggedSeverity(
::mongo::logger::LogSeverity::Debug(5));
StartupTest::runTests();
return false;
}
return true;
}
Status validateMongosOptions(const moe::Environment& params) {
Status ret = validateServerOptions(params);
if (!ret.isOK()) {
return ret;
}
return Status::OK();
}
Status canonicalizeMongosOptions(moe::Environment* params) {
Status ret = canonicalizeServerOptions(params);
if (!ret.isOK()) {
return ret;
}
#ifdef MONGO_SSL
ret = canonicalizeSSLServerOptions(params);
if (!ret.isOK()) {
return ret;
}
#endif
// "sharding.autoSplit" comes from the config file, so override it if "noAutoSplit" is set
// since that comes from the command line.
if (params->count("noAutoSplit")) {
Status ret = params->set("sharding.autoSplit", moe::Value(false));
if (!ret.isOK()) {
return ret;
}
ret = params->remove("noAutoSplit");
if (!ret.isOK()) {
return ret;
}
}
return Status::OK();
}
Status storeMongosOptions(const moe::Environment& params,
const std::vector& args) {
Status ret = storeServerOptions(params, args);
if (!ret.isOK()) {
return ret;
}
if ( params.count( "sharding.chunkSize" ) ) {
int csize = params["sharding.chunkSize"].as();
// validate chunksize before proceeding
if ( csize == 0 ) {
return Status(ErrorCodes::BadValue, "error: need a non-zero chunksize");
}
if ( !Chunk::setMaxChunkSizeSizeMB( csize ) ) {
return Status(ErrorCodes::BadValue, "MaxChunkSize invalid");
}
}
if (params.count( "net.port" ) ) {
int port = params["net.port"].as();
if ( port <= 0 || port > 65535 ) {
return Status(ErrorCodes::BadValue,
"error: port number must be between 1 and 65535");
}
}
if ( params.count( "replication.localPingThresholdMs" ) ) {
serverGlobalParams.defaultLocalThresholdMillis =
params["replication.localPingThresholdMs"].as();
}
if ( params.count( "net.ipv6" ) ) {
enableIPv6();
}
if (params.count("net.http.JSONPEnabled")) {
serverGlobalParams.jsonp = true;
}
if (params.count("noscripting")) {
// This option currently has no effect for mongos
}
if (params.count("sharding.autoSplit")) {
Chunk::ShouldAutoSplit = params["sharding.autoSplit"].as();
if (Chunk::ShouldAutoSplit == false) {
warning() << "running with auto-splitting disabled" << endl;
}
}
if ( ! params.count( "sharding.configDB" ) ) {
return Status(ErrorCodes::BadValue, "error: no args for --configdb");
}
splitStringDelim(params["sharding.configDB"].as(),
&mongosGlobalParams.configdbs, ',');
if (mongosGlobalParams.configdbs.size() != 1 && mongosGlobalParams.configdbs.size() != 3) {
return Status(ErrorCodes::BadValue, "need either 1 or 3 configdbs");
}
if (mongosGlobalParams.configdbs.size() == 1) {
warning() << "running with 1 config server should be done only for testing purposes "
<< "and is not recommended for production" << endl;
}
mongosGlobalParams.upgrade = params.count("upgrade");
return Status::OK();
}
} // namespace mongo