总结

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. jackson 转换 enum 类型

    REST API 接口要求 requster json 的 lifeCycle 域只能填 YOUNG, OLD,对于其他的 lifeCycle,都要给 requester 返回 bad request ...

  2. PostgreSQL的表空间

    1. 表空间的概念 PostgreSQL中的表空间允许在文件系统中定义用来存放表示数据库对象的文件的位置.在PostgreSQL中表空间实际上就是给表指定一个存储目录. 2. 表空间的作用 官方解释 ...

  3. 【代码审计】MIPCMS 远程写入配置文件Getshell

    0x00 环境准备 MIPCMS官网:https://www.mipcms.cn 网站源码版本:MIPCMS内容管理系统 V3.1.0(发布时间:2018-01-01) 程序源码下载:http://w ...

  4. 在SELECT DISTINCT 状况下使用 Order BY Newid() 随机数选出记录

    在日常作业中,有时候可能是一些活动要抽出得奖人或选出抽查的一些名单, 就常常会使用到 Order BY Newid() 的方式来做随机数选出, 但有可能的状况需是要搭配到 DISTINCT 来选出,这 ...

  5. proxy chains 试用

    我的机子是通过一台windows机器上的CCProxy代理上网.可是在设置了系统代理以后,发现在终端下若要进行ftp或者ssh等操作,并不能使用代理(但是wget是可以的). 期间试过一些方法,比如在 ...

  6. lua总则

    lua官方英文文档:http://www.lua.org/manual/5.2/ lua中国开发者网址:http://bbs.luaer.cn/ <lua程序设计(第二版)>(闭合函数和闭 ...

  7. nodeJs学习过程之认识nodejs

    nodeJs只是听说过,没见过,没玩过.从新手开始,我想慢慢掌握它. 一.首先,我想知道nodeJs是什么? 摘自百度百科: Node.js是一套用来编写高性能网络服务器的JavaScript工具包, ...

  8. iOS开发——iOS7(及以后版本) SDK自带二维码(含条形码)扫码、二维码生成

    本文转载至 http://www.cnblogs.com/leotangcn/p/4357907.html 现在很多APP都涉及了二维码扫码功能,这个功能简单实用,很多情况下用户乐于使用,现在本文带来 ...

  9. linux下复制文件报cp: omitting directory `XXX'

    错误操作:这个错误是因为在linux下我使用cp复制一个文件夹A到另一个目录下时报错cp: omitting directory `XXX' 原因:文件夹A中还有子目录文件,所以linux不允许直接复 ...

  10. Hibernate系列之核心开发接口

    一.概述 所有的hibernate应用中都会访问5个核心接口,它们分别是: Configuration:配置hibernate,创建SessionFactory对象 SessionFactory:初始 ...