总结

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的更多相关文章

  1. 【原】Android热更新开源项目Tinker源码解析系列之三:so热更新

    本系列将从以下三个方面对Tinker进行源码解析: Android热更新开源项目Tinker源码解析系列之一:Dex热更新 Android热更新开源项目Tinker源码解析系列之二:资源文件热更新 A ...

  2. C# ini文件操作【源码下载】

    介绍C#如何对ini文件进行读写操作,C#可以通过调用[kernel32.dll]文件中的 WritePrivateProfileString()和GetPrivateProfileString()函 ...

  3. 【原】FMDB源码阅读(三)

    [原]FMDB源码阅读(三) 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 FMDB比较优秀的地方就在于对多线程的处理.所以这一篇主要是研究FMDB的多线程处理的实现.而 ...

  4. 从源码看Azkaban作业流下发过程

    上一篇零散地罗列了看源码时记录的一些类的信息,这篇完整介绍一个作业流在Azkaban中的执行过程,希望可以帮助刚刚接手Azkaban相关工作的开发.测试. 一.Azkaban简介 Azkaban作为开 ...

  5. 【原】Android热更新开源项目Tinker源码解析系列之一:Dex热更新

    [原]Android热更新开源项目Tinker源码解析系列之一:Dex热更新 Tinker是微信的第一个开源项目,主要用于安卓应用bug的热修复和功能的迭代. Tinker github地址:http ...

  6. 【原】Android热更新开源项目Tinker源码解析系列之二:资源文件热更新

    上一篇文章介绍了Dex文件的热更新流程,本文将会分析Tinker中对资源文件的热更新流程. 同Dex,资源文件的热更新同样包括三个部分:资源补丁生成,资源补丁合成及资源补丁加载. 本系列将从以下三个方 ...

  7. 多线程爬坑之路-Thread和Runable源码解析之基本方法的运用实例

    前面的文章:多线程爬坑之路-学习多线程需要来了解哪些东西?(concurrent并发包的数据结构和线程池,Locks锁,Atomic原子类) 多线程爬坑之路-Thread和Runable源码解析 前面 ...

  8. SDWebImage源码解读之SDWebImageDownloaderOperation

    第七篇 前言 本篇文章主要讲解下载操作的相关知识,SDWebImageDownloaderOperation的主要任务是把一张图片从服务器下载到内存中.下载数据并不难,如何对下载这一系列的任务进行设计 ...

  9. 【深入浅出jQuery】源码浅析--整体架构

    最近一直在研读 jQuery 源码,初看源码一头雾水毫无头绪,真正静下心来细看写的真是精妙,让你感叹代码之美. 其结构明晰,高内聚.低耦合,兼具优秀的性能与便利的扩展性,在浏览器的兼容性(功能缺陷.渐 ...

随机推荐

  1. CM和CDH的安装-准备工作

    估计要分开来两篇博客说明,因为截图较多. 1.三个节点cdh1(主节点),cdh2,cdh3 配置就用一张图来说明,因为资源有限 2.版本依赖说明: CDH-5.9.0-1.cdh5.9.0.p0.2 ...

  2. Redis存读取数据

    这一节演示下载.NET中怎样使用Redis存储数据.在.net中比较常用的客户端类库是ServiceStack,看下通过servicestack怎样存储数据. DLL下载:https://github ...

  3. metasploit 中的DB

    渗透测试任务中,主机/服务/漏洞等信息如果手动维护,会带来巨大的工作量. 在metasploit中,这部分工作已经被封装的非常好,每次调用内部模块执行的任务结果都会自动存入DB.通过简单的指令即可以方 ...

  4. MongoDB 数据管理

    MongoDB 相关操作: > db.version() // 查看 MongoDB 版本 > db.serverStatus() // 查看 MongoDB 服务器的状态 MongoDB ...

  5. 使用 requests 发送 POST 请求

    POST请求也就是向服务器提交数据,通常我们用来提交表单数据: import requests postdata = { //定义表单数据 "username": "ab ...

  6. 手把手让你实现开源企业级web高并发解决方案(lvs+heartbeat+varnish+nginx+eAccelerator+memcached)

    原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://freeze.blog.51cto.com/1846439/677348 此文凝聚 ...

  7. 【Java知识点专项练习】之 Java鲁棒性的特点

    Java鲁棒性的特点如下: Java在编译和运行程序时都要对可能出现的问题进行检查,以防止错误的产生. Java编译器可以查出许多其他语言运行时才能发现的错误. Java不支持指针操作,大大减少了错误 ...

  8. 【分享】IT产业中的三大定理(三) —— 反摩尔定理 (Reverse Moore's Law)

    Google(谷歌)的 CEO 埃里克·施密特在一次采访中指出,如果你反过来看摩尔定理,一个 IT 公司如果今天和十八个月前卖掉同样多的.同样的产品,它的营业额就要降一半.IT 界把它称为反摩尔定理. ...

  9. 0R的电阻以及NC的意义

    0欧电阻的作用: 0欧的电阻大概有以下几个功能:①做为跳线使用.这样既美观,安装也方便.②在数字和模拟等混合电路中,往往要求两个地分开,并且单点连接.我们可以用一个0欧的电阻来连接这两个地,而不是直接 ...

  10. 原生js--表单

    阅读了<javascript权威指南>P396-P409. 一.表单和表单元素的选取 1.选取表单(包含name=“address”属性的form表单) document.querySel ...