源码 ServerParameter
总结
1、
服务器参数类型和设置时刻
https://github.com/mongodb/mongo/blob/master/src/mongo/db/server_parameters.h
// server_parameters.h /**
* Copyright (C) 2018-present MongoDB, Inc.
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the Server Side Public License, version 1,
* as published by MongoDB, Inc.
*
* 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
* Server Side Public License for more details.
*
* You should have received a copy of the Server Side Public License
* along with this program. If not, see
* <http://www.mongodb.com/licensing/server-side-public-license>.
*
* 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 Server Side 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 <map>
#include <string>
#include <vector> #include "mongo/base/static_assert.h"
#include "mongo/base/status.h"
#include "mongo/db/jsobj.h"
#include "mongo/platform/atomic_proxy.h"
#include "mongo/platform/atomic_word.h"
#include "mongo/platform/compiler.h"
#include "mongo/stdx/functional.h"
#include "mongo/stdx/mutex.h"
#include "mongo/util/stringutils.h" namespace mongo { class ServerParameterSet;
class OperationContext; /**
* Lets you make server level settings easily configurable.
* Hooks into (set|get)Parameter, as well as command line processing
*
* NOTE: ServerParameters set at runtime can be read or written to at anytime, and are not
* thread-safe without atomic types or other concurrency techniques.
*/
class ServerParameter {
public:
typedef std::map<std::string, ServerParameter*> Map; ServerParameter(ServerParameterSet* sps,
StringData name,
bool allowedToChangeAtStartup,
bool allowedToChangeAtRuntime);
ServerParameter(ServerParameterSet* sps, StringData name);
virtual ~ServerParameter(); std::string name() const {
return _name;
} /**
* @return if you can set on command line or config file
*/
bool allowedToChangeAtStartup() const {
return _allowedToChangeAtStartup;
} /**
* @param if you can use (get|set)Parameter
*/
bool allowedToChangeAtRuntime() const {
return _allowedToChangeAtRuntime;
} virtual void append(OperationContext* opCtx, BSONObjBuilder& b, const std::string& name) = 0; virtual Status set(const BSONElement& newValueElement) = 0; virtual Status setFromString(const std::string& str) = 0; bool isTestOnly() const {
return _testOnly;
} void setTestOnly() {
_testOnly = true;
} private:
std::string _name;
bool _allowedToChangeAtStartup;
bool _allowedToChangeAtRuntime;
bool _testOnly = false;
}; class ServerParameterSet {
public:
typedef std::map<std::string, ServerParameter*> Map; void add(ServerParameter* sp); const Map& getMap() const {
return _map;
} static ServerParameterSet* getGlobal(); void disableTestParameters(); private:
Map _map;
}; /**
* Server Parameters can be set startup up and/or runtime.
*
* At startup, --setParameter ... or config file is used.
* At runtime, { setParameter : 1, ...} is used.
*/
enum class ServerParameterType { /**
* Parameter can only be set via runCommand.
*/
kRuntimeOnly, /**
* Parameter can only be set via --setParameter, and is only read at startup after command-line
* parameters, and the config file are processed.
*/
kStartupOnly, /**
* Parameter can be set at both startup and runtime.
*/
kStartupAndRuntime,
}; /**
* Lets you make server level settings easily configurable.
* Hooks into (set|get)Parameter, as well as command line processing
*/
template <typename T>
class BoundServerParameter : public ServerParameter {
private:
using setter = stdx::function<Status(const T&)>;
using getter = stdx::function<T()>;
using SPT = ServerParameterType; public:
BoundServerParameter(const std::string& name,
const setter set,
const getter get,
SPT paramType = SPT::kStartupOnly)
: BoundServerParameter(ServerParameterSet::getGlobal(), name, set, get, paramType) {} BoundServerParameter(ServerParameterSet* sps,
const std::string& name,
const setter set,
const getter get,
SPT paramType = SPT::kStartupOnly)
: ServerParameter(sps,
name,
paramType == SPT::kStartupOnly || paramType == SPT::kStartupAndRuntime,
paramType == SPT::kRuntimeOnly || paramType == SPT::kStartupAndRuntime),
_setter(set),
_getter(get) {}
~BoundServerParameter() override = default; void append(OperationContext* opCtx, BSONObjBuilder& b, const std::string& name) override {
b.append(name, _getter());
} Status set(const BSONElement& newValueElement) override {
T newValue; if (!newValueElement.coerce(&newValue)) {
return Status(ErrorCodes::BadValue, "Can't coerce value");
} return _setter(newValue);
} Status setFromString(const std::string& str) override; private:
const setter _setter;
const getter _getter;
}; template <>
inline Status BoundServerParameter<bool>::setFromString(const std::string& str) {
if ((str == "1") || (str == "true")) {
return _setter(true);
}
if ((str == "0") || (str == "false")) {
return _setter(false);
}
return Status(ErrorCodes::BadValue, "Value is not a valid boolean");
} template <>
inline Status BoundServerParameter<std::string>::setFromString(const std::string& str) {
return _setter(str);
} template <>
inline Status BoundServerParameter<std::vector<std::string>>::setFromString(
const std::string& str) {
std::vector<std::string> v;
splitStringDelim(str, &v, ',');
return _setter(v);
} template <typename T>
inline Status BoundServerParameter<T>::setFromString(const std::string& str) {
T value;
Status status = parseNumberFromString(str, &value);
if (!status.isOK()) {
return status;
}
return _setter(value);
} template <typename T>
class LockedServerParameter : public BoundServerParameter<T> {
private:
using SPT = ServerParameterType; public:
LockedServerParameter(const std::string& name,
const T& initval,
SPT paramType = SPT::kStartupAndRuntime)
: LockedServerParameter(ServerParameterSet::getGlobal(), name, initval, paramType) {} LockedServerParameter(ServerParameterSet* sps,
const std::string& name,
const T& initval,
SPT paramType = SPT::kStartupAndRuntime)
: BoundServerParameter<T>(sps,
name,
[this](const T& v) { return setLocked(v); },
[this]() { return getLocked(); },
paramType),
_value(initval) {}
~LockedServerParameter() override = default; Status setLocked(const T& value) {
stdx::unique_lock<stdx::mutex> lk(_mutex);
_value = value;
return Status::OK();
} T getLocked() const {
stdx::unique_lock<stdx::mutex> lk(_mutex);
return _value;
} private:
mutable stdx::mutex _mutex;
T _value;
}; namespace server_parameter_detail { template <typename T, typename...>
struct IsOneOf : std::false_type {}; template <typename T, typename U0, typename... Us>
struct IsOneOf<T, U0, Us...>
: std::conditional_t<std::is_same<T, U0>::value, std::true_type, IsOneOf<T, Us...>> {}; /**
* Type trait for ServerParameterType to identify which types are safe to use at runtime because
* they have std::atomic or equivalent types.
*/
template <typename T>
struct IsSafeRuntimeType : IsOneOf<T, bool, int, long long, double> {}; /**
* Get the type of storage to use for a given tuple of <type, ServerParameterType>.
*
* By default, we want std::atomic or equivalent types because they are thread-safe.
* If the parameter is a startup only type, then there are no concurrency concerns since
* server parameters are processed on the main thread while it is single-threaded during startup.
*/
template <typename T, ServerParameterType paramType>
struct StorageTraits {
/**
* For kStartupOnly parameters, we can use the type T as storage directly.
* Otherwise if T is double, use AtomicDouble. Otherwise use AtomicWord<T>.
*/
using value_type = std::conditional_t<
paramType == ServerParameterType::kStartupOnly,
T,
std::conditional_t<std::is_same<T, double>::value, AtomicDouble, AtomicWord<T>>>; static T get(value_type* v) {
return _get(v);
} static void set(value_type* v, const T& newValue) {
_set(v, newValue);
} private:
static T _get(AtomicDouble* v) {
return v->load();
}
template <typename U>
static T _get(AtomicWord<U>* v) {
return v->load();
}
template <typename U>
static T _get(U* v) {
return *v;
} static void _set(AtomicDouble* v, const T& newValue) {
v->store(newValue);
}
template <typename U>
static void _set(AtomicWord<U>* v, const T& newValue) {
v->store(newValue);
}
template <typename U>
static void _set(U* v, const T& newValue) {
*v = newValue;
}
}; } // namespace server_parameter_detail /**
* Implementation of BoundServerParameter for reading and writing a server parameter with a given
* name and type into a specific C++ variable.
*
* NOTE: ServerParameters set at runtime can be read or written to at anytime, and are not
* thread-safe without atomic types or other concurrency techniques.
*/
template <typename T, ServerParameterType paramType>
class ExportedServerParameter : public BoundServerParameter<T> {
public:
MONGO_STATIC_ASSERT_MSG(paramType == ServerParameterType::kStartupOnly ||
server_parameter_detail::IsSafeRuntimeType<T>::value,
"This type is not supported as a runtime server parameter."); using storage_traits = server_parameter_detail::StorageTraits<T, paramType>;
using storage_type = typename storage_traits::value_type;
using validator_function = stdx::function<Status(const T&)>; /**
* Construct an ExportedServerParameter in parameter set "sps", named "name", whose storage
* is at "value".
*
* If allowedToChangeAtStartup is true, the parameter may be set at the command line,
* e.g. via the --setParameter switch. If allowedToChangeAtRuntime is true, the parameter
* may be set at runtime, e.g. via the setParameter command.
*/
ExportedServerParameter(ServerParameterSet* sps, const std::string& name, storage_type* value)
: BoundServerParameter<T>(sps,
name,
[this](const T& v) { return set(v); },
[this] { return storage_traits::get(_value); },
paramType),
_value(value) {} // Don't let the template method hide our inherited method
using BoundServerParameter<T>::set; virtual Status set(const T& newValue) {
auto const status = validate(newValue);
if (!status.isOK()) {
return status;
}
storage_traits::set(_value, newValue);
return Status::OK();
} ExportedServerParameter* withValidator(validator_function validator) {
invariant(!_validator);
_validator = std::move(validator);
return this;
} protected:
/**
* Note that if a subclass overrides the validate member function, the validator provided via
* withValidate will not be used.
**/
virtual Status validate(const T& potentialNewValue) {
if (_validator) {
return _validator(potentialNewValue);
}
return Status::OK();
} storage_type* const _value; // owned elsewhere
validator_function _validator;
}; } // namespace mongo #define MONGO_EXPORT_SERVER_PARAMETER_IMPL_(NAME, TYPE, INITIAL_VALUE, PARAM_TYPE) \
ExportedServerParameter<TYPE, PARAM_TYPE>::storage_type NAME(INITIAL_VALUE); \
MONGO_COMPILER_VARIABLE_UNUSED auto _exportedParameter_##NAME = \
(new ExportedServerParameter<TYPE, PARAM_TYPE>( \
ServerParameterSet::getGlobal(), #NAME, &NAME)) /**
* Create a global variable of type "TYPE" named "NAME" with the given INITIAL_VALUE. The
* value may be set at startup or at runtime.
*/
#define MONGO_EXPORT_SERVER_PARAMETER(NAME, TYPE, INITIAL_VALUE) \
MONGO_EXPORT_SERVER_PARAMETER_IMPL_( \
NAME, TYPE, INITIAL_VALUE, ServerParameterType::kStartupAndRuntime) /**
* Like MONGO_EXPORT_SERVER_PARAMETER, but the value may only be set at startup.
*/
#define MONGO_EXPORT_STARTUP_SERVER_PARAMETER(NAME, TYPE, INITIAL_VALUE) \
MONGO_EXPORT_SERVER_PARAMETER_IMPL_( \
NAME, TYPE, INITIAL_VALUE, ServerParameterType::kStartupOnly) /**
* Like MONGO_EXPORT_SERVER_PARAMETER, but the value may only be set at runtime.
*/
#define MONGO_EXPORT_RUNTIME_SERVER_PARAMETER(NAME, TYPE, INITIAL_VALUE) \
MONGO_EXPORT_SERVER_PARAMETER_IMPL_( \
NAME, TYPE, INITIAL_VALUE, ServerParameterType::kRuntimeOnly)
源码 ServerParameter的更多相关文章
- 【原】Android热更新开源项目Tinker源码解析系列之三:so热更新
本系列将从以下三个方面对Tinker进行源码解析: Android热更新开源项目Tinker源码解析系列之一:Dex热更新 Android热更新开源项目Tinker源码解析系列之二:资源文件热更新 A ...
- C# ini文件操作【源码下载】
介绍C#如何对ini文件进行读写操作,C#可以通过调用[kernel32.dll]文件中的 WritePrivateProfileString()和GetPrivateProfileString()函 ...
- 【原】FMDB源码阅读(三)
[原]FMDB源码阅读(三) 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 FMDB比较优秀的地方就在于对多线程的处理.所以这一篇主要是研究FMDB的多线程处理的实现.而 ...
- 从源码看Azkaban作业流下发过程
上一篇零散地罗列了看源码时记录的一些类的信息,这篇完整介绍一个作业流在Azkaban中的执行过程,希望可以帮助刚刚接手Azkaban相关工作的开发.测试. 一.Azkaban简介 Azkaban作为开 ...
- 【原】Android热更新开源项目Tinker源码解析系列之一:Dex热更新
[原]Android热更新开源项目Tinker源码解析系列之一:Dex热更新 Tinker是微信的第一个开源项目,主要用于安卓应用bug的热修复和功能的迭代. Tinker github地址:http ...
- 【原】Android热更新开源项目Tinker源码解析系列之二:资源文件热更新
上一篇文章介绍了Dex文件的热更新流程,本文将会分析Tinker中对资源文件的热更新流程. 同Dex,资源文件的热更新同样包括三个部分:资源补丁生成,资源补丁合成及资源补丁加载. 本系列将从以下三个方 ...
- 多线程爬坑之路-Thread和Runable源码解析之基本方法的运用实例
前面的文章:多线程爬坑之路-学习多线程需要来了解哪些东西?(concurrent并发包的数据结构和线程池,Locks锁,Atomic原子类) 多线程爬坑之路-Thread和Runable源码解析 前面 ...
- SDWebImage源码解读之SDWebImageDownloaderOperation
第七篇 前言 本篇文章主要讲解下载操作的相关知识,SDWebImageDownloaderOperation的主要任务是把一张图片从服务器下载到内存中.下载数据并不难,如何对下载这一系列的任务进行设计 ...
- 【深入浅出jQuery】源码浅析--整体架构
最近一直在研读 jQuery 源码,初看源码一头雾水毫无头绪,真正静下心来细看写的真是精妙,让你感叹代码之美. 其结构明晰,高内聚.低耦合,兼具优秀的性能与便利的扩展性,在浏览器的兼容性(功能缺陷.渐 ...
随机推荐
- java.lang.Class<T> -- 反射机制及动态代理
Interface : Person package java_.lang_.component.bean; public interface Person { String area = " ...
- PHPDragon设计结构
PHPDragon的设计思路来源至YII框架,可以吐槽作者本人完全copy,但希望在后面,会慢慢的走出一条不同的分支. 1.Dragon.php(DragonBase.php)入口文件,负责程序的自动 ...
- Python中的and/or
在Python中,可以通过and,or和not进行逻辑运算,下面就来看看and和or的简单介绍. 逻辑与-and 对于包含and运算的表达式,Python解释器将从左到右扫描,返回第一个为假的表达式值 ...
- WPF送走控件的focus方法
我们可以调用Focus()方法,让WPF控件获得焦点, 那我现在不想要焦点了, 如何把这个包袱抛出去? 可以, 恩, 没有Unfocus(), 但下面的方法也许可行(把焦点抛给另一个不知道的控件): ...
- 页面倒计时跳转页面效果,js倒计时效果
页面倒计时跳转页面效果,js倒计时效果 >>>>>>>>>>>>>>>>>>>> ...
- linux系统抓包命令
IP地址抓包:tcpdump -i any host 1.1.1.2 -n 端口抓包: tcpdump -i any port 6789 -n wireshak工具抓包:tcp.port == 678 ...
- 执行Batch批处理遇到的问题
1.务必关掉自动提交 增强执行效率 conn.setAutoCommit(false); 2.executeBatch失效问题 <1>务必将语句pstmt = conn.prepareSt ...
- window下遍历并修改文件
今天需要写一个遍历文件夹下的所有文件,试了试以前的方法竟然报错了.重新改了一下. #include <iostream> #include <stdlib.h> #includ ...
- 嵌入式系统C编程之堆栈回溯(二)
前言 本文作为<嵌入式系统C编程之堆栈回溯>的补充版.文中涉及的代码运行环境如下: 一 异常信号 信号就是软件中断,用于向正在运行的程序(进程)发送有关异步事件发生的信息.Linux应用 ...
- 【大数据系列】hadoop单节点安装官方文档翻译
Hadoop: Setting up a Single Node Cluster. HADOOP:建立单节点集群 Purpose Prerequisites Supported Platforms R ...