mirror of
https://github.com/ceph/ceph
synced 2026-08-02 07:03:18 +00:00
common: extract options into yaml
extract the options in common/options.cc into separate .yaml.in files, and preprocess them using CMake before translating them into .cc files using a python script. this change paves the road to render the options using sphinx, and will allow us to further annotate the options to include more metadata. also, a this YAML file can be consumed by applications like dashboard and Sphinx to consume these metadata in a simpler way. * use @variable-name@ for substituting the variables in .yaml.in file * use cmake variable of `mgr_disabled_modules` instead of C macro to define `mgr_disabled_modules` in global.yaml.in * debian/control, ceph.spec.in, win32_deps_build.sh: add python3-yaml as build dep * add y2c.py (short for YAML to C++) to translate .yaml to .cc file * common/options/*.yaml.in: extract and split options into .yaml.in files, the subvars in it is then replaced with CMake variables, and copied to the corresponding .yaml files * include/config-h.in.cmake: remove MGR_DISABLED_MODULES, as it is not a CMake variable. Signed-off-by: Kefu Chai <kchai@redhat.com>
This commit is contained in:
parent
3bee4b0261
commit
5ddda38da4
@ -487,11 +487,6 @@ if(WITH_MGR)
|
||||
set(MGR_PYTHON_LIBRARIES ${Python3_LIBRARIES})
|
||||
set(MGR_PYTHON_VERSION_MAJOR ${Python3_VERSION_MAJOR})
|
||||
set(MGR_PYTHON_VERSION_MINOR ${Python3_VERSION_MINOR})
|
||||
# https://tracker.ceph.com/issues/45147
|
||||
if(Python3_VERSION VERSION_GREATER_EQUAL 3.8)
|
||||
set(MGR_DISABLED_MODULES "diskprediction_local")
|
||||
message(STATUS "mgr module disabled for ${Python3_VERSION}: ${MGR_DISABLED_MODULES}")
|
||||
endif()
|
||||
# Boost dependency check deferred to Boost section
|
||||
endif(WITH_MGR)
|
||||
endif(NOT WIN32)
|
||||
|
||||
@ -327,6 +327,7 @@ BuildRequires: cunit-devel
|
||||
BuildRequires: python%{python3_pkgversion}-setuptools
|
||||
BuildRequires: python%{python3_pkgversion}-Cython
|
||||
BuildRequires: python%{python3_pkgversion}-PrettyTable
|
||||
BuildRequires: python%{python3_pkgversion}-PyYAML
|
||||
BuildRequires: python%{python3_pkgversion}-Sphinx
|
||||
BuildRequires: rdma-core-devel
|
||||
BuildRequires: liblz4-devel >= 1.7
|
||||
@ -349,6 +350,7 @@ BuildRequires: python%{python3_pkgversion}-devel
|
||||
BuildRequires: python%{python3_pkgversion}-setuptools
|
||||
BuildRequires: python%{python3_pkgversion}-Cython
|
||||
BuildRequires: python%{python3_pkgversion}-prettytable
|
||||
BuildRequires: python%{python3_pkgversion}-pyyaml
|
||||
BuildRequires: python%{python3_pkgversion}-sphinx
|
||||
BuildRequires: lz4-devel >= 1.7
|
||||
%endif
|
||||
|
||||
2
debian/control
vendored
2
debian/control
vendored
@ -98,7 +98,7 @@ Build-Depends: automake,
|
||||
python3-setuptools,
|
||||
python3-sphinx,
|
||||
# Make-Check python3-werkzeug,
|
||||
python3-setuptools,
|
||||
python3-yaml,
|
||||
# Crimson ragel,
|
||||
# Make-Check socat,
|
||||
# Crimson systemtap-sdt-dev,
|
||||
|
||||
@ -447,6 +447,7 @@ add_subdirectory(arch)
|
||||
set(ceph_common_objs
|
||||
$<TARGET_OBJECTS:common-auth-objs>
|
||||
$<TARGET_OBJECTS:common-common-objs>
|
||||
$<TARGET_OBJECTS:common-options-objs>
|
||||
$<TARGET_OBJECTS:common-msg-objs>
|
||||
$<TARGET_OBJECTS:common_buffer_obj>
|
||||
$<TARGET_OBJECTS:common_texttable_obj>
|
||||
|
||||
@ -11,6 +11,8 @@ if(WIN32)
|
||||
add_library(dlfcn_win32 STATIC win32/dlfcn.cc win32/errno.cc)
|
||||
endif()
|
||||
|
||||
add_subdirectory(options)
|
||||
|
||||
set(common_srcs
|
||||
AsyncOpTracker.cc
|
||||
BackTrace.cc
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@ -399,5 +399,26 @@ struct Option {
|
||||
}
|
||||
};
|
||||
|
||||
extern const std::vector<Option> ceph_options;
|
||||
constexpr unsigned long long operator"" _min (unsigned long long min) {
|
||||
return min * 60;
|
||||
}
|
||||
constexpr unsigned long long operator"" _hr (unsigned long long hr) {
|
||||
return hr * 60 * 60;
|
||||
}
|
||||
constexpr unsigned long long operator"" _day (unsigned long long day) {
|
||||
return day * 24 * 60 * 60;
|
||||
}
|
||||
constexpr unsigned long long operator"" _K (unsigned long long n) {
|
||||
return n << 10;
|
||||
}
|
||||
constexpr unsigned long long operator"" _M (unsigned long long n) {
|
||||
return n << 20;
|
||||
}
|
||||
constexpr unsigned long long operator"" _G (unsigned long long n) {
|
||||
return n << 30;
|
||||
}
|
||||
constexpr unsigned long long operator"" _T (unsigned long long n) {
|
||||
return n << 40;
|
||||
}
|
||||
|
||||
extern const std::vector<Option> ceph_options;
|
||||
|
||||
94
src/common/options/CMakeLists.txt
Normal file
94
src/common/options/CMakeLists.txt
Normal file
@ -0,0 +1,94 @@
|
||||
set(common_options_srcs build_options.cc)
|
||||
|
||||
# to mimic the behavior of file(CONFIGURE ...)
|
||||
file(GENERATE OUTPUT configure_file.cmake
|
||||
CONTENT "configure_file(\${input_file} \${output_file} @ONLY)")
|
||||
function(file_configure input_file output_file)
|
||||
set(cmake_defs
|
||||
-D input_file=${input_file}
|
||||
-D output_file=${output_file})
|
||||
file(STRINGS ${input_file} subvars REGEX "@[^@]+@")
|
||||
foreach(line ${subvars})
|
||||
string(REGEX REPLACE ".*@([^@]+)@.*" "\\1"
|
||||
var "${line}")
|
||||
set(value ${${var}})
|
||||
list(APPEND cmake_defs -D ${var}=${value})
|
||||
endforeach()
|
||||
add_custom_command(OUTPUT ${output_file}
|
||||
COMMAND ${CMAKE_COMMAND} ${cmake_defs} -P configure_file.cmake
|
||||
DEPENDS ${input_file}
|
||||
VERBATIM)
|
||||
endfunction()
|
||||
|
||||
function(add_options name)
|
||||
set(yaml_in_file ${CMAKE_CURRENT_SOURCE_DIR}/${name}.yaml.in)
|
||||
set(yaml_file ${CMAKE_CURRENT_BINARY_DIR}/${name}.yaml)
|
||||
file_configure("${yaml_in_file}"
|
||||
"${yaml_file}" @ONLY)
|
||||
set(src_file "${name}_options.cc")
|
||||
add_custom_command(
|
||||
OUTPUT ${src_file}
|
||||
COMMAND ${Python_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/y2c.py
|
||||
--input ${yaml_file}
|
||||
--output ${src_file}
|
||||
--name ${name}
|
||||
DEPENDS ${yaml_file})
|
||||
list(APPEND common_options_srcs
|
||||
${src_file})
|
||||
set(common_options_srcs ${common_options_srcs} PARENT_SCOPE)
|
||||
endfunction()
|
||||
|
||||
set(osd_erasure_code_plugins "jerasure" "lrc")
|
||||
if(WITH_EC_ISA_PLUGIN)
|
||||
list(APPEND osd_erasure_code_plugins "isa")
|
||||
endif()
|
||||
string(REPLACE ";" " " osd_erasure_code_plugins "${osd_erasure_code_plugins}")
|
||||
|
||||
set(keyring_paths
|
||||
"/etc/ceph/$cluster.$name.keyring"
|
||||
"/etc/ceph/$cluster.keyring"
|
||||
"/etc/ceph/keyring"
|
||||
"/etc/ceph/keyring.bin")
|
||||
if(FREEBSD)
|
||||
list(APPEND keyring_paths
|
||||
"/usr/local/etc/ceph/$cluster.$name.keyring"
|
||||
"/usr/local/etc/ceph/$cluster.keyring"
|
||||
"/usr/local/etc/ceph/keyring"
|
||||
"/usr/local/etc/ceph/keyring.bin")
|
||||
endif()
|
||||
string(REPLACE ";" "," keyring_paths "${keyring_paths}")
|
||||
|
||||
set(ms_bind_retry_count 3)
|
||||
set(ms_bind_retry_delay 5)
|
||||
if(FREEBSD)
|
||||
# FreeBSD does not use SO_REAUSEADDR so allow for a bit more time per default
|
||||
set(ms_bind_retry_count 6)
|
||||
set(ms_bind_retry_delay 6)
|
||||
endif()
|
||||
|
||||
set(mgr_disabled_modules "")
|
||||
if(WITH_MGR)
|
||||
# https://tracker.ceph.com/issues/45147
|
||||
if(Python3_VERSION VERSION_GREATER_EQUAL 3.8)
|
||||
set(mgr_disabled_modules "diskprediction_local")
|
||||
message(STATUS "mgr module disabled for ${Python3_VERSION}: ${mgr_disabled_modules}")
|
||||
endif()
|
||||
endif()
|
||||
|
||||
add_options(global)
|
||||
add_options(cephfs-mirror)
|
||||
add_options(mds)
|
||||
add_options(mds-client)
|
||||
add_options(rbd)
|
||||
add_options(rbd-mirror)
|
||||
add_options(immutable-object-cache)
|
||||
|
||||
# if set to empty string, system default luarocks package location (if exist) will be used
|
||||
set(rgw_luarocks_location "")
|
||||
if(WITH_RADOSGW_LUA_PACKAGES)
|
||||
set(rgw_luarocks_location "/tmp/luarocks")
|
||||
endif()
|
||||
add_options(rgw)
|
||||
|
||||
add_library(common-options-objs OBJECT
|
||||
${common_options_srcs})
|
||||
35
src/common/options/build_options.cc
Normal file
35
src/common/options/build_options.cc
Normal file
@ -0,0 +1,35 @@
|
||||
// -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*-
|
||||
// vim: ts=8 sw=2 smarttab
|
||||
|
||||
#include "build_options.h"
|
||||
|
||||
std::vector<Option> get_global_options();
|
||||
std::vector<Option> get_rgw_options();
|
||||
std::vector<Option> get_rbd_options();
|
||||
std::vector<Option> get_rbd_mirror_options();
|
||||
std::vector<Option> get_immutable_object_cache_options();
|
||||
std::vector<Option> get_mds_options();
|
||||
std::vector<Option> get_mds_client_options();
|
||||
std::vector<Option> get_cephfs_mirror_options();
|
||||
|
||||
std::vector<Option> build_options()
|
||||
{
|
||||
std::vector<Option> result = get_global_options();
|
||||
|
||||
auto ingest = [&result](std::vector<Option>&& options, const char* svc) {
|
||||
for (auto &o : options) {
|
||||
o.add_service(svc);
|
||||
result.push_back(std::move(o));
|
||||
}
|
||||
};
|
||||
|
||||
ingest(get_rgw_options(), "rgw");
|
||||
ingest(get_rbd_options(), "rbd");
|
||||
ingest(get_rbd_mirror_options(), "rbd-mirror");
|
||||
ingest(get_immutable_object_cache_options(), "immutable-objet-cache");
|
||||
ingest(get_mds_options(), "mds");
|
||||
ingest(get_mds_client_options(), "mds_client");
|
||||
ingest(get_cephfs_mirror_options(), "cephfs-mirror");
|
||||
|
||||
return result;
|
||||
}
|
||||
8
src/common/options/build_options.h
Normal file
8
src/common/options/build_options.h
Normal file
@ -0,0 +1,8 @@
|
||||
// -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*-
|
||||
// vim: ts=8 sw=2 smarttab
|
||||
|
||||
#pragma once
|
||||
#include <vector>
|
||||
#include "common/options.h"
|
||||
|
||||
std::vector<Option> build_options();
|
||||
82
src/common/options/cephfs-mirror.yaml.in
Normal file
82
src/common/options/cephfs-mirror.yaml.in
Normal file
@ -0,0 +1,82 @@
|
||||
# -*- mode: YAML -*-
|
||||
---
|
||||
|
||||
options:
|
||||
- name: cephfs_mirror_max_concurrent_directory_syncs
|
||||
type: uint
|
||||
level: advanced
|
||||
desc: maximum number of concurrent snapshot synchronization threads
|
||||
long_desc: maximum number of directory snapshots that can be synchronized concurrently
|
||||
by cephfs-mirror daemon. Controls the number of synchronization threads.
|
||||
default: 3
|
||||
services:
|
||||
- cephfs-mirror
|
||||
min: 1
|
||||
- name: cephfs_mirror_action_update_interval
|
||||
type: secs
|
||||
level: advanced
|
||||
desc: interval for driving asynchornous mirror actions
|
||||
long_desc: Interval in seconds to process pending mirror update actions.
|
||||
default: 2
|
||||
services:
|
||||
- cephfs-mirror
|
||||
min: 1
|
||||
- name: cephfs_mirror_restart_mirror_on_blocklist_interval
|
||||
type: secs
|
||||
level: advanced
|
||||
desc: interval to restart blocklisted instances
|
||||
long_desc: Interval in seconds to restart blocklisted mirror instances. Setting
|
||||
to zero (0) disables restarting blocklisted instances.
|
||||
default: 30
|
||||
services:
|
||||
- cephfs-mirror
|
||||
min: 0
|
||||
- name: cephfs_mirror_max_snapshot_sync_per_cycle
|
||||
type: uint
|
||||
level: advanced
|
||||
desc: number of snapshots to mirror in one cycle
|
||||
long_desc: maximum number of snapshots to mirror when a directory is picked up for
|
||||
mirroring by worker threads.
|
||||
default: 3
|
||||
services:
|
||||
- cephfs-mirror
|
||||
min: 1
|
||||
- name: cephfs_mirror_directory_scan_interval
|
||||
type: uint
|
||||
level: advanced
|
||||
desc: interval to scan directories to mirror snapshots
|
||||
long_desc: interval in seconds to scan configured directories for snapshot mirroring.
|
||||
default: 10
|
||||
services:
|
||||
- cephfs-mirror
|
||||
min: 1
|
||||
- name: cephfs_mirror_max_consecutive_failures_per_directory
|
||||
type: uint
|
||||
level: advanced
|
||||
desc: consecutive failed directory synchronization attempts before marking a directory
|
||||
as "failed"
|
||||
long_desc: number of consecutive snapshot synchronization failues to mark a directory
|
||||
as "failed". failed directories are retried for synchronization less frequently.
|
||||
default: 10
|
||||
services:
|
||||
- cephfs-mirror
|
||||
min: 0
|
||||
- name: cephfs_mirror_retry_failed_directories_interval
|
||||
type: uint
|
||||
level: advanced
|
||||
desc: failed directory retry interval for synchronization
|
||||
long_desc: interval in seconds to retry synchronization for failed directories.
|
||||
default: 60
|
||||
services:
|
||||
- cephfs-mirror
|
||||
min: 1
|
||||
- name: cephfs_mirror_restart_mirror_on_failure_interval
|
||||
type: secs
|
||||
level: advanced
|
||||
desc: interval to restart failed mirror instances
|
||||
long_desc: Interval in seconds to restart failed mirror instances. Setting to zero
|
||||
(0) disables restarting failed mirror instances.
|
||||
default: 20
|
||||
services:
|
||||
- cephfs-mirror
|
||||
min: 0
|
||||
6979
src/common/options/global.yaml.in
Normal file
6979
src/common/options/global.yaml.in
Normal file
File diff suppressed because it is too large
Load Diff
98
src/common/options/immutable-object-cache.yaml.in
Normal file
98
src/common/options/immutable-object-cache.yaml.in
Normal file
@ -0,0 +1,98 @@
|
||||
# -*- mode: YAML -*-
|
||||
---
|
||||
|
||||
options:
|
||||
- name: immutable_object_cache_path
|
||||
type: str
|
||||
level: advanced
|
||||
desc: immutable object cache data dir
|
||||
default: /tmp/ceph_immutable_object_cache
|
||||
services:
|
||||
- immutable-objet-cache
|
||||
- name: immutable_object_cache_sock
|
||||
type: str
|
||||
level: advanced
|
||||
desc: immutable object cache domain socket
|
||||
default: /var/run/ceph/immutable_object_cache_sock
|
||||
services:
|
||||
- immutable-objet-cache
|
||||
- name: immutable_object_cache_max_size
|
||||
type: size
|
||||
level: advanced
|
||||
desc: max immutable object cache data size
|
||||
default: 1_G
|
||||
services:
|
||||
- immutable-objet-cache
|
||||
- name: immutable_object_cache_max_inflight_ops
|
||||
type: uint
|
||||
level: advanced
|
||||
desc: max inflight promoting requests for immutable object cache daemon
|
||||
default: 128
|
||||
services:
|
||||
- immutable-objet-cache
|
||||
- name: immutable_object_cache_client_dedicated_thread_num
|
||||
type: uint
|
||||
level: advanced
|
||||
desc: immutable object cache client dedicated thread number
|
||||
default: 2
|
||||
services:
|
||||
- immutable-objet-cache
|
||||
- name: immutable_object_cache_watermark
|
||||
type: float
|
||||
level: advanced
|
||||
desc: immutable object cache water mark
|
||||
default: 0.1
|
||||
services:
|
||||
- immutable-objet-cache
|
||||
- name: immutable_object_cache_qos_schedule_tick_min
|
||||
type: millisecs
|
||||
level: advanced
|
||||
desc: minimum schedule tick for immutable object cache
|
||||
default: 50
|
||||
services:
|
||||
- immutable-objet-cache
|
||||
min: 1
|
||||
- name: immutable_object_cache_qos_iops_limit
|
||||
type: uint
|
||||
level: advanced
|
||||
desc: the desired immutable object cache IO operations limit per second
|
||||
default: 0
|
||||
services:
|
||||
- immutable-objet-cache
|
||||
- name: immutable_object_cache_qos_iops_burst
|
||||
type: uint
|
||||
level: advanced
|
||||
desc: the desired burst limit of immutable object cache IO operations
|
||||
default: 0
|
||||
services:
|
||||
- immutable-objet-cache
|
||||
- name: immutable_object_cache_qos_iops_burst_seconds
|
||||
type: secs
|
||||
level: advanced
|
||||
desc: the desired burst duration in seconds of immutable object cache IO operations
|
||||
default: 1
|
||||
services:
|
||||
- immutable-objet-cache
|
||||
min: 1
|
||||
- name: immutable_object_cache_qos_bps_limit
|
||||
type: uint
|
||||
level: advanced
|
||||
desc: the desired immutable object cache IO bytes limit per second
|
||||
default: 0
|
||||
services:
|
||||
- immutable-objet-cache
|
||||
- name: immutable_object_cache_qos_bps_burst
|
||||
type: uint
|
||||
level: advanced
|
||||
desc: the desired burst limit of immutable object cache IO bytes
|
||||
default: 0
|
||||
services:
|
||||
- immutable-objet-cache
|
||||
- name: immutable_object_cache_qos_bps_burst_seconds
|
||||
type: secs
|
||||
level: advanced
|
||||
desc: the desired burst duration in seconds of immutable object cache IO bytes
|
||||
default: 1
|
||||
services:
|
||||
- immutable-objet-cache
|
||||
min: 1
|
||||
454
src/common/options/mds-client.yaml.in
Normal file
454
src/common/options/mds-client.yaml.in
Normal file
@ -0,0 +1,454 @@
|
||||
# -*- mode: YAML -*-
|
||||
---
|
||||
|
||||
options:
|
||||
- name: client_cache_size
|
||||
type: size
|
||||
level: basic
|
||||
desc: soft maximum number of directory entries in client cache
|
||||
default: 16_K
|
||||
services:
|
||||
- mds_client
|
||||
- name: client_cache_mid
|
||||
type: float
|
||||
level: advanced
|
||||
desc: mid-point of client cache LRU
|
||||
default: 0.75
|
||||
services:
|
||||
- mds_client
|
||||
- name: client_use_random_mds
|
||||
type: bool
|
||||
level: dev
|
||||
desc: issue new requests to a random active MDS
|
||||
default: false
|
||||
services:
|
||||
- mds_client
|
||||
- name: client_mount_timeout
|
||||
type: float
|
||||
level: advanced
|
||||
desc: timeout for mounting CephFS (seconds)
|
||||
default: 5_min
|
||||
services:
|
||||
- mds_client
|
||||
- name: client_tick_interval
|
||||
type: secs
|
||||
level: dev
|
||||
desc: seconds between client upkeep ticks
|
||||
default: 1
|
||||
services:
|
||||
- mds_client
|
||||
- name: client_trace
|
||||
type: str
|
||||
level: dev
|
||||
desc: file containing trace of client operations
|
||||
services:
|
||||
- mds_client
|
||||
- name: client_readahead_min
|
||||
type: size
|
||||
level: advanced
|
||||
desc: minimum bytes to readahead in a file
|
||||
default: 128_K
|
||||
services:
|
||||
- mds_client
|
||||
- name: client_readahead_max_bytes
|
||||
type: size
|
||||
level: advanced
|
||||
desc: maximum bytes to readahead in a file (zero is unlimited)
|
||||
default: 0
|
||||
services:
|
||||
- mds_client
|
||||
- name: client_readahead_max_periods
|
||||
type: int
|
||||
level: advanced
|
||||
desc: maximum stripe periods to readahead in a file
|
||||
default: 4
|
||||
services:
|
||||
- mds_client
|
||||
- name: client_reconnect_stale
|
||||
type: bool
|
||||
level: advanced
|
||||
desc: reconnect when the session becomes stale
|
||||
default: false
|
||||
services:
|
||||
- mds_client
|
||||
- name: client_snapdir
|
||||
type: str
|
||||
level: advanced
|
||||
desc: pseudo directory for snapshot access to a directory
|
||||
default: .snap
|
||||
services:
|
||||
- mds_client
|
||||
- name: client_mountpoint
|
||||
type: str
|
||||
level: advanced
|
||||
desc: default mount-point
|
||||
default: /
|
||||
services:
|
||||
- mds_client
|
||||
- name: client_mount_uid
|
||||
type: int
|
||||
level: advanced
|
||||
desc: uid to mount as
|
||||
default: -1
|
||||
services:
|
||||
- mds_client
|
||||
- name: client_mount_gid
|
||||
type: int
|
||||
level: advanced
|
||||
desc: gid to mount as
|
||||
default: -1
|
||||
services:
|
||||
- mds_client
|
||||
- name: client_notify_timeout
|
||||
type: int
|
||||
level: dev
|
||||
default: 10
|
||||
services:
|
||||
- mds_client
|
||||
- name: osd_client_watch_timeout
|
||||
type: int
|
||||
level: dev
|
||||
default: 30
|
||||
services:
|
||||
- mds_client
|
||||
- name: client_caps_release_delay
|
||||
type: int
|
||||
level: dev
|
||||
default: 5
|
||||
services:
|
||||
- mds_client
|
||||
- name: client_quota_df
|
||||
type: bool
|
||||
level: advanced
|
||||
desc: show quota usage for statfs (df)
|
||||
default: true
|
||||
services:
|
||||
- mds_client
|
||||
- name: client_oc
|
||||
type: bool
|
||||
level: advanced
|
||||
desc: enable object caching
|
||||
default: true
|
||||
services:
|
||||
- mds_client
|
||||
- name: client_oc_size
|
||||
type: size
|
||||
level: advanced
|
||||
desc: maximum size of object cache
|
||||
default: 200_M
|
||||
services:
|
||||
- mds_client
|
||||
flags:
|
||||
- runtime
|
||||
- name: client_oc_max_dirty
|
||||
type: size
|
||||
level: advanced
|
||||
desc: maximum size of dirty pages in object cache
|
||||
default: 100_M
|
||||
services:
|
||||
- mds_client
|
||||
flags:
|
||||
- runtime
|
||||
- name: client_oc_target_dirty
|
||||
type: size
|
||||
level: advanced
|
||||
desc: target size of dirty pages object cache
|
||||
default: 8_M
|
||||
services:
|
||||
- mds_client
|
||||
flags:
|
||||
- runtime
|
||||
- name: client_oc_max_dirty_age
|
||||
type: float
|
||||
level: advanced
|
||||
desc: maximum age of dirty pages in object cache (seconds)
|
||||
default: 5
|
||||
services:
|
||||
- mds_client
|
||||
flags:
|
||||
- runtime
|
||||
- name: client_oc_max_objects
|
||||
type: int
|
||||
level: advanced
|
||||
desc: maximum number of objects in cache
|
||||
default: 1000
|
||||
services:
|
||||
- mds_client
|
||||
flags:
|
||||
- runtime
|
||||
- name: client_debug_getattr_caps
|
||||
type: bool
|
||||
level: dev
|
||||
default: false
|
||||
services:
|
||||
- mds_client
|
||||
- name: client_debug_force_sync_read
|
||||
type: bool
|
||||
level: dev
|
||||
default: false
|
||||
services:
|
||||
- mds_client
|
||||
- name: client_debug_inject_tick_delay
|
||||
type: secs
|
||||
level: dev
|
||||
default: 0
|
||||
services:
|
||||
- mds_client
|
||||
- name: client_max_inline_size
|
||||
type: size
|
||||
level: dev
|
||||
default: 4_K
|
||||
services:
|
||||
- mds_client
|
||||
- name: client_inject_release_failure
|
||||
type: bool
|
||||
level: dev
|
||||
default: false
|
||||
services:
|
||||
- mds_client
|
||||
- name: client_inject_fixed_oldest_tid
|
||||
type: bool
|
||||
level: dev
|
||||
default: false
|
||||
services:
|
||||
- mds_client
|
||||
- name: client_metadata
|
||||
type: str
|
||||
level: advanced
|
||||
desc: metadata key=value comma-delimited pairs appended to session metadata
|
||||
services:
|
||||
- mds_client
|
||||
- name: client_acl_type
|
||||
type: str
|
||||
level: advanced
|
||||
desc: ACL type to enforce (none or "posix_acl")
|
||||
services:
|
||||
- mds_client
|
||||
- name: client_permissions
|
||||
type: bool
|
||||
level: advanced
|
||||
desc: client-enforced permission checking
|
||||
default: true
|
||||
services:
|
||||
- mds_client
|
||||
- name: client_dirsize_rbytes
|
||||
type: bool
|
||||
level: advanced
|
||||
desc: set the directory size as the number of file bytes recursively used
|
||||
long_desc: This option enables a CephFS feature that stores the recursive directory
|
||||
size (the bytes used by files in the directory and its descendents) in the st_size
|
||||
field of the stat structure.
|
||||
default: true
|
||||
services:
|
||||
- mds_client
|
||||
- name: client_force_lazyio
|
||||
type: bool
|
||||
level: advanced
|
||||
default: false
|
||||
services:
|
||||
- mds_client
|
||||
- name: fuse_use_invalidate_cb
|
||||
type: bool
|
||||
level: advanced
|
||||
desc: use fuse 2.8+ invalidate callback to keep page cache consistent
|
||||
default: true
|
||||
services:
|
||||
- mds_client
|
||||
- name: fuse_disable_pagecache
|
||||
type: bool
|
||||
level: advanced
|
||||
desc: disable page caching in the kernel for this FUSE mount
|
||||
default: false
|
||||
services:
|
||||
- mds_client
|
||||
- name: fuse_allow_other
|
||||
type: bool
|
||||
level: advanced
|
||||
desc: pass allow_other to FUSE on mount
|
||||
default: true
|
||||
services:
|
||||
- mds_client
|
||||
- name: fuse_default_permissions
|
||||
type: bool
|
||||
level: advanced
|
||||
desc: pass default_permisions to FUSE on mount
|
||||
default: false
|
||||
services:
|
||||
- mds_client
|
||||
flags:
|
||||
- startup
|
||||
- name: fuse_splice_read
|
||||
type: bool
|
||||
level: advanced
|
||||
desc: enable splice read to reduce the memory copies
|
||||
default: true
|
||||
services:
|
||||
- mds_client
|
||||
- name: fuse_splice_write
|
||||
type: bool
|
||||
level: advanced
|
||||
desc: enable splice write to reduce the memory copies
|
||||
default: true
|
||||
services:
|
||||
- mds_client
|
||||
- name: fuse_splice_move
|
||||
type: bool
|
||||
level: advanced
|
||||
desc: enable splice move to reduce the memory copies
|
||||
default: true
|
||||
services:
|
||||
- mds_client
|
||||
- name: fuse_big_writes
|
||||
type: bool
|
||||
level: advanced
|
||||
desc: big_writes is deprecated in libfuse 3.0.0
|
||||
default: true
|
||||
services:
|
||||
- mds_client
|
||||
- name: fuse_max_write
|
||||
type: size
|
||||
level: advanced
|
||||
desc: set the maximum number of bytes in a single write operation
|
||||
long_desc: Set the maximum number of bytes in a single write operation that may
|
||||
pass atomically through FUSE. The FUSE default is 128kB and may be indicated by
|
||||
setting this option to 0.
|
||||
default: 0
|
||||
services:
|
||||
- mds_client
|
||||
- name: fuse_atomic_o_trunc
|
||||
type: bool
|
||||
level: advanced
|
||||
desc: pass atomic_o_trunc flag to FUSE on mount
|
||||
default: true
|
||||
services:
|
||||
- mds_client
|
||||
- name: fuse_debug
|
||||
type: bool
|
||||
level: advanced
|
||||
desc: enable debugging for the libfuse
|
||||
default: false
|
||||
services:
|
||||
- mds_client
|
||||
flags:
|
||||
- no_mon_update
|
||||
- startup
|
||||
- name: fuse_multithreaded
|
||||
type: bool
|
||||
level: advanced
|
||||
desc: allow parallel processing through FUSE library
|
||||
default: true
|
||||
services:
|
||||
- mds_client
|
||||
- name: fuse_require_active_mds
|
||||
type: bool
|
||||
level: advanced
|
||||
desc: require active MDSs in the file system when mounting
|
||||
default: true
|
||||
services:
|
||||
- mds_client
|
||||
- name: fuse_syncfs_on_mksnap
|
||||
type: bool
|
||||
level: advanced
|
||||
desc: synchronize all local metadata/file changes after snapshot
|
||||
default: true
|
||||
services:
|
||||
- mds_client
|
||||
- name: fuse_set_user_groups
|
||||
type: bool
|
||||
level: advanced
|
||||
desc: check for ceph-fuse to consider supplementary groups for permissions
|
||||
default: true
|
||||
services:
|
||||
- mds_client
|
||||
- name: client_try_dentry_invalidate
|
||||
type: bool
|
||||
level: dev
|
||||
default: false
|
||||
services:
|
||||
- mds_client
|
||||
- name: client_die_on_failed_remount
|
||||
type: bool
|
||||
level: dev
|
||||
default: false
|
||||
services:
|
||||
- mds_client
|
||||
- name: client_die_on_failed_dentry_invalidate
|
||||
type: bool
|
||||
level: advanced
|
||||
desc: kill the client when no dentry invalidation options are available
|
||||
long_desc: The CephFS client requires a mechanism to invalidate dentries in the
|
||||
caller (e.g. the kernel for ceph-fuse) when capabilities must be recalled. If
|
||||
the client cannot do this then the MDS cache cannot shrink which can cause the
|
||||
MDS to fail.
|
||||
default: true
|
||||
services:
|
||||
- mds_client
|
||||
- name: client_check_pool_perm
|
||||
type: bool
|
||||
level: advanced
|
||||
desc: confirm access to inode's data pool/namespace described in file layout
|
||||
default: true
|
||||
services:
|
||||
- mds_client
|
||||
- name: client_use_faked_inos
|
||||
type: bool
|
||||
level: dev
|
||||
default: false
|
||||
services:
|
||||
- mds_client
|
||||
- name: client_fs
|
||||
type: str
|
||||
level: advanced
|
||||
desc: CephFS file system name to mount
|
||||
long_desc: Use this with ceph-fuse, or with any process that uses libcephfs. Programs
|
||||
using libcephfs may also pass the filesystem name into mount(), which will override
|
||||
this setting. If no filesystem name is given in mount() or this setting, the default
|
||||
filesystem will be mounted (usually the first created).
|
||||
services:
|
||||
- mds_client
|
||||
flags:
|
||||
- startup
|
||||
- name: client_mds_namespace
|
||||
type: str
|
||||
level: dev
|
||||
services:
|
||||
- mds_client
|
||||
flags:
|
||||
- startup
|
||||
- name: fake_statfs_for_testing
|
||||
type: int
|
||||
level: dev
|
||||
desc: Set a value for kb and compute kb_used from total of num_bytes
|
||||
default: 0
|
||||
services:
|
||||
- mds_client
|
||||
- name: debug_allow_any_pool_priority
|
||||
type: bool
|
||||
level: dev
|
||||
desc: Allow any pool priority to be set to test conversion to new range
|
||||
default: false
|
||||
services:
|
||||
- mds_client
|
||||
- name: client_asio_thread_count
|
||||
type: uint
|
||||
level: advanced
|
||||
desc: Size of thread pool for ASIO completions
|
||||
default: 2
|
||||
tags:
|
||||
- client
|
||||
services:
|
||||
- mds_client
|
||||
min: 1
|
||||
- name: client_shutdown_timeout
|
||||
type: secs
|
||||
level: advanced
|
||||
desc: timeout for shutting down CephFS
|
||||
long_desc: Timeout for shutting down CephFS via unmount or shutdown.
|
||||
default: 30
|
||||
tags:
|
||||
- client
|
||||
services:
|
||||
- mds_client
|
||||
min: 0
|
||||
flags:
|
||||
- runtime
|
||||
1168
src/common/options/mds.yaml.in
Normal file
1168
src/common/options/mds.yaml.in
Normal file
File diff suppressed because it is too large
Load Diff
210
src/common/options/rbd-mirror.yaml.in
Normal file
210
src/common/options/rbd-mirror.yaml.in
Normal file
@ -0,0 +1,210 @@
|
||||
# -*- mode: YAML -*-
|
||||
---
|
||||
|
||||
options:
|
||||
- name: rbd_mirror_journal_commit_age
|
||||
type: float
|
||||
level: advanced
|
||||
desc: commit time interval, seconds
|
||||
default: 5
|
||||
services:
|
||||
- rbd-mirror
|
||||
- name: rbd_mirror_journal_poll_age
|
||||
type: float
|
||||
level: advanced
|
||||
desc: maximum age (in seconds) between successive journal polls
|
||||
default: 5
|
||||
services:
|
||||
- rbd-mirror
|
||||
- name: rbd_mirror_sync_point_update_age
|
||||
type: float
|
||||
level: advanced
|
||||
desc: number of seconds between each update of the image sync point object number
|
||||
default: 30
|
||||
services:
|
||||
- rbd-mirror
|
||||
- name: rbd_mirror_concurrent_image_syncs
|
||||
type: uint
|
||||
level: advanced
|
||||
desc: maximum number of image syncs in parallel
|
||||
default: 5
|
||||
services:
|
||||
- rbd-mirror
|
||||
- name: rbd_mirror_pool_replayers_refresh_interval
|
||||
type: uint
|
||||
level: advanced
|
||||
desc: interval to refresh peers in rbd-mirror daemon
|
||||
default: 30
|
||||
services:
|
||||
- rbd-mirror
|
||||
- name: rbd_mirror_concurrent_image_deletions
|
||||
type: uint
|
||||
level: advanced
|
||||
desc: maximum number of image deletions in parallel
|
||||
default: 1
|
||||
services:
|
||||
- rbd-mirror
|
||||
min: 1
|
||||
- name: rbd_mirror_delete_retry_interval
|
||||
type: float
|
||||
level: advanced
|
||||
desc: interval to check and retry the failed deletion requests
|
||||
default: 30
|
||||
services:
|
||||
- rbd-mirror
|
||||
- name: rbd_mirror_image_state_check_interval
|
||||
type: uint
|
||||
level: advanced
|
||||
desc: interval to get images from pool watcher and set sources in replayer
|
||||
default: 30
|
||||
services:
|
||||
- rbd-mirror
|
||||
min: 1
|
||||
- name: rbd_mirror_leader_heartbeat_interval
|
||||
type: uint
|
||||
level: advanced
|
||||
desc: interval (in seconds) between mirror leader heartbeats
|
||||
default: 5
|
||||
services:
|
||||
- rbd-mirror
|
||||
min: 1
|
||||
- name: rbd_mirror_leader_max_missed_heartbeats
|
||||
type: uint
|
||||
level: advanced
|
||||
desc: number of missed heartbeats for non-lock owner to attempt to acquire lock
|
||||
default: 2
|
||||
services:
|
||||
- rbd-mirror
|
||||
- name: rbd_mirror_leader_max_acquire_attempts_before_break
|
||||
type: uint
|
||||
level: advanced
|
||||
desc: number of failed attempts to acquire lock after missing heartbeats before
|
||||
breaking lock
|
||||
default: 3
|
||||
services:
|
||||
- rbd-mirror
|
||||
- name: rbd_mirror_image_policy_type
|
||||
type: str
|
||||
level: advanced
|
||||
desc: active/active policy type for mapping images to instances
|
||||
default: simple
|
||||
services:
|
||||
- rbd-mirror
|
||||
enum_values:
|
||||
- none
|
||||
- simple
|
||||
- name: rbd_mirror_image_policy_migration_throttle
|
||||
type: uint
|
||||
level: advanced
|
||||
desc: number of seconds after which an image can be reshuffled (migrated) again
|
||||
default: 300
|
||||
services:
|
||||
- rbd-mirror
|
||||
- name: rbd_mirror_image_policy_update_throttle_interval
|
||||
type: float
|
||||
level: advanced
|
||||
desc: interval (in seconds) to throttle images for mirror daemon peer updates
|
||||
default: 1
|
||||
services:
|
||||
- rbd-mirror
|
||||
min: 1
|
||||
- name: rbd_mirror_image_policy_rebalance_timeout
|
||||
type: float
|
||||
level: advanced
|
||||
desc: number of seconds policy should be idle before trigerring reshuffle (rebalance)
|
||||
of images
|
||||
default: 0
|
||||
services:
|
||||
- rbd-mirror
|
||||
- name: rbd_mirror_perf_stats_prio
|
||||
type: int
|
||||
level: advanced
|
||||
desc: Priority level for mirror daemon replication perf counters
|
||||
long_desc: The daemon will send perf counter data to the manager daemon if the priority
|
||||
is not lower than mgr_stats_threshold.
|
||||
default: 5
|
||||
services:
|
||||
- rbd-mirror
|
||||
min: 0
|
||||
max: 11
|
||||
- name: rbd_mirror_image_perf_stats_prio
|
||||
type: int
|
||||
level: advanced
|
||||
desc: Priority level for mirror daemon per-image replication perf counters
|
||||
long_desc: The daemon will send per-image perf counter data to the manager daemon
|
||||
if the priority is not lower than mgr_stats_threshold.
|
||||
default: 5
|
||||
services:
|
||||
- rbd-mirror
|
||||
min: 0
|
||||
max: 11
|
||||
- name: rbd_mirror_memory_autotune
|
||||
type: bool
|
||||
level: dev
|
||||
desc: Automatically tune the ratio of caches while respecting min values.
|
||||
default: true
|
||||
services:
|
||||
- rbd-mirror
|
||||
see_also:
|
||||
- rbd_mirror_memory_target
|
||||
- name: rbd_mirror_memory_target
|
||||
type: size
|
||||
level: basic
|
||||
desc: When tcmalloc and cache autotuning is enabled, try to keep this many bytes
|
||||
mapped in memory.
|
||||
default: 4_G
|
||||
services:
|
||||
- rbd-mirror
|
||||
see_also:
|
||||
- rbd_mirror_memory_autotune
|
||||
- name: rbd_mirror_memory_base
|
||||
type: size
|
||||
level: dev
|
||||
desc: When tcmalloc and cache autotuning is enabled, estimate the minimum amount
|
||||
of memory in bytes the rbd-mirror daemon will need.
|
||||
default: 768_M
|
||||
services:
|
||||
- rbd-mirror
|
||||
see_also:
|
||||
- rbd_mirror_memory_autotune
|
||||
- name: rbd_mirror_memory_expected_fragmentation
|
||||
type: float
|
||||
level: dev
|
||||
desc: When tcmalloc and cache autotuning is enabled, estimate the percent of memory
|
||||
fragmentation.
|
||||
default: 0.15
|
||||
services:
|
||||
- rbd-mirror
|
||||
see_also:
|
||||
- rbd_mirror_memory_autotune
|
||||
min: 0
|
||||
max: 1
|
||||
- name: rbd_mirror_memory_cache_min
|
||||
type: size
|
||||
level: dev
|
||||
desc: When tcmalloc and cache autotuning is enabled, set the minimum amount of memory
|
||||
used for cache.
|
||||
default: 128_M
|
||||
services:
|
||||
- rbd-mirror
|
||||
see_also:
|
||||
- rbd_mirror_memory_autotune
|
||||
- name: rbd_mirror_memory_cache_resize_interval
|
||||
type: float
|
||||
level: dev
|
||||
desc: When tcmalloc and cache autotuning is enabled, wait this many seconds between
|
||||
resizing caches.
|
||||
default: 5
|
||||
services:
|
||||
- rbd-mirror
|
||||
see_also:
|
||||
- rbd_mirror_memory_autotune
|
||||
- name: rbd_mirror_memory_cache_autotune_interval
|
||||
type: float
|
||||
level: dev
|
||||
desc: The number of seconds to wait between rebalances when cache autotune is enabled.
|
||||
default: 30
|
||||
services:
|
||||
- rbd-mirror
|
||||
see_also:
|
||||
- rbd_mirror_memory_autotune
|
||||
832
src/common/options/rbd.yaml.in
Normal file
832
src/common/options/rbd.yaml.in
Normal file
@ -0,0 +1,832 @@
|
||||
# -*- mode: YAML -*-
|
||||
---
|
||||
|
||||
headers: |
|
||||
#include <regex>
|
||||
// rbd feature and io operation validation
|
||||
#include "include/stringify.h"
|
||||
#include "common/strtol.h"
|
||||
#include "librbd/Features.h"
|
||||
#include "librbd/io/IoOperations.h"
|
||||
options:
|
||||
- name: rbd_default_pool
|
||||
type: str
|
||||
level: advanced
|
||||
desc: default pool for storing new images
|
||||
default: rbd
|
||||
services:
|
||||
- rbd
|
||||
validator: |
|
||||
[](std::string *value, std::string *error_message) {
|
||||
std::regex pattern("^[^@/]+$");
|
||||
if (!std::regex_match (*value, pattern)) {
|
||||
*value = "rbd";
|
||||
*error_message = "invalid RBD default pool, resetting to 'rbd'";
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
- name: rbd_default_data_pool
|
||||
type: str
|
||||
level: advanced
|
||||
desc: default pool for storing data blocks for new images
|
||||
services:
|
||||
- rbd
|
||||
validator: |
|
||||
[](std::string *value, std::string *error_message) {
|
||||
std::regex pattern("^[^@/]*$");
|
||||
if (!std::regex_match (*value, pattern)) {
|
||||
*value = "";
|
||||
*error_message = "ignoring invalid RBD data pool";
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
- name: rbd_default_features
|
||||
type: str
|
||||
level: advanced
|
||||
desc: default v2 image features for new images
|
||||
long_desc: 'RBD features are only applicable for v2 images. This setting accepts
|
||||
either an integer bitmask value or comma-delimited string of RBD feature names.
|
||||
This setting is always internally stored as an integer bitmask value. The mapping
|
||||
between feature bitmask value and feature name is as follows: +1 -> layering,
|
||||
+2 -> striping, +4 -> exclusive-lock, +8 -> object-map, +16 -> fast-diff, +32
|
||||
-> deep-flatten, +64 -> journaling, +128 -> data-pool'
|
||||
default: layering,exclusive-lock,object-map,fast-diff,deep-flatten
|
||||
services:
|
||||
- rbd
|
||||
flags:
|
||||
- runtime
|
||||
validator: |
|
||||
[](std::string *value, std::string *error_message) {
|
||||
stringstream ss;
|
||||
uint64_t features = librbd::rbd_features_from_string(*value, &ss);
|
||||
// Leave this in integer form to avoid breaking Cinder. Someday
|
||||
// we would like to present this in string form instead...
|
||||
*value = stringify(features);
|
||||
if (ss.str().size()) {
|
||||
return -EINVAL;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
- name: rbd_op_threads
|
||||
type: uint
|
||||
level: advanced
|
||||
desc: number of threads to utilize for internal processing
|
||||
default: 1
|
||||
services:
|
||||
- rbd
|
||||
- name: rbd_op_thread_timeout
|
||||
type: uint
|
||||
level: advanced
|
||||
desc: time in seconds for detecting a hung thread
|
||||
default: 60
|
||||
services:
|
||||
- rbd
|
||||
- name: rbd_disable_zero_copy_writes
|
||||
type: bool
|
||||
level: advanced
|
||||
desc: Disable the use of zero-copy writes to ensure unstable writes from clients
|
||||
cannot cause a CRC mismatch
|
||||
default: true
|
||||
services:
|
||||
- rbd
|
||||
- name: rbd_non_blocking_aio
|
||||
type: bool
|
||||
level: advanced
|
||||
desc: process AIO ops from a dispatch thread to prevent blocking
|
||||
default: true
|
||||
services:
|
||||
- rbd
|
||||
- name: rbd_cache
|
||||
type: bool
|
||||
level: advanced
|
||||
desc: whether to enable caching (writeback unless rbd_cache_max_dirty is 0)
|
||||
default: true
|
||||
services:
|
||||
- rbd
|
||||
- name: rbd_cache_policy
|
||||
type: str
|
||||
level: advanced
|
||||
desc: cache policy for handling writes.
|
||||
default: writearound
|
||||
services:
|
||||
- rbd
|
||||
enum_values:
|
||||
- writethrough
|
||||
- writeback
|
||||
- writearound
|
||||
- name: rbd_cache_writethrough_until_flush
|
||||
type: bool
|
||||
level: advanced
|
||||
desc: whether to make writeback caching writethrough until flush is called, to be
|
||||
sure the user of librbd will send flushes so that writeback is safe
|
||||
default: true
|
||||
services:
|
||||
- rbd
|
||||
- name: rbd_cache_size
|
||||
type: size
|
||||
level: advanced
|
||||
desc: cache size in bytes
|
||||
default: 32_M
|
||||
services:
|
||||
- rbd
|
||||
- name: rbd_cache_max_dirty
|
||||
type: size
|
||||
level: advanced
|
||||
desc: dirty limit in bytes - set to 0 for write-through caching
|
||||
default: 24_M
|
||||
services:
|
||||
- rbd
|
||||
- name: rbd_cache_target_dirty
|
||||
type: size
|
||||
level: advanced
|
||||
desc: target dirty limit in bytes
|
||||
default: 16_M
|
||||
services:
|
||||
- rbd
|
||||
- name: rbd_cache_max_dirty_age
|
||||
type: float
|
||||
level: advanced
|
||||
desc: seconds in cache before writeback starts
|
||||
default: 1
|
||||
services:
|
||||
- rbd
|
||||
- name: rbd_cache_max_dirty_object
|
||||
type: uint
|
||||
level: advanced
|
||||
desc: dirty limit for objects - set to 0 for auto calculate from rbd_cache_size
|
||||
default: 0
|
||||
services:
|
||||
- rbd
|
||||
- name: rbd_cache_block_writes_upfront
|
||||
type: bool
|
||||
level: advanced
|
||||
desc: whether to block writes to the cache before the aio_write call completes
|
||||
default: false
|
||||
services:
|
||||
- rbd
|
||||
- name: rbd_parent_cache_enabled
|
||||
type: bool
|
||||
level: advanced
|
||||
desc: whether to enable rbd shared ro cache
|
||||
default: false
|
||||
services:
|
||||
- rbd
|
||||
- name: rbd_concurrent_management_ops
|
||||
type: uint
|
||||
level: advanced
|
||||
desc: how many operations can be in flight for a management operation like deleting
|
||||
or resizing an image
|
||||
default: 10
|
||||
services:
|
||||
- rbd
|
||||
min: 1
|
||||
- name: rbd_balance_snap_reads
|
||||
type: bool
|
||||
level: advanced
|
||||
desc: distribute snap read requests to random OSD
|
||||
default: false
|
||||
services:
|
||||
- rbd
|
||||
- name: rbd_localize_snap_reads
|
||||
type: bool
|
||||
level: advanced
|
||||
desc: localize snap read requests to closest OSD
|
||||
default: false
|
||||
services:
|
||||
- rbd
|
||||
- name: rbd_balance_parent_reads
|
||||
type: bool
|
||||
level: advanced
|
||||
desc: distribute parent read requests to random OSD
|
||||
default: false
|
||||
services:
|
||||
- rbd
|
||||
- name: rbd_localize_parent_reads
|
||||
type: bool
|
||||
level: advanced
|
||||
desc: localize parent requests to closest OSD
|
||||
default: false
|
||||
services:
|
||||
- rbd
|
||||
- name: rbd_sparse_read_threshold_bytes
|
||||
type: size
|
||||
level: advanced
|
||||
desc: threshold for issuing a sparse-read
|
||||
long_desc: minimum number of sequential bytes to read against an object before issuing
|
||||
a sparse-read request to the cluster. 0 implies it must be a full object read
|
||||
to issue a sparse-read, 1 implies always use sparse-read, and any value larger
|
||||
than the maximum object size will disable sparse-read for all requests
|
||||
default: 64_K
|
||||
services:
|
||||
- rbd
|
||||
- name: rbd_readahead_trigger_requests
|
||||
type: uint
|
||||
level: advanced
|
||||
desc: number of sequential requests necessary to trigger readahead
|
||||
default: 10
|
||||
services:
|
||||
- rbd
|
||||
- name: rbd_readahead_max_bytes
|
||||
type: size
|
||||
level: advanced
|
||||
desc: set to 0 to disable readahead
|
||||
default: 512_K
|
||||
services:
|
||||
- rbd
|
||||
- name: rbd_readahead_disable_after_bytes
|
||||
type: size
|
||||
level: advanced
|
||||
desc: how many bytes are read in total before readahead is disabled
|
||||
default: 50_M
|
||||
services:
|
||||
- rbd
|
||||
- name: rbd_clone_copy_on_read
|
||||
type: bool
|
||||
level: advanced
|
||||
desc: copy-up parent image blocks to clone upon read request
|
||||
default: false
|
||||
services:
|
||||
- rbd
|
||||
- name: rbd_blocklist_on_break_lock
|
||||
type: bool
|
||||
level: advanced
|
||||
desc: whether to blocklist clients whose lock was broken
|
||||
default: true
|
||||
services:
|
||||
- rbd
|
||||
- name: rbd_blocklist_expire_seconds
|
||||
type: uint
|
||||
level: advanced
|
||||
desc: number of seconds to blocklist - set to 0 for OSD default
|
||||
default: 0
|
||||
services:
|
||||
- rbd
|
||||
- name: rbd_request_timed_out_seconds
|
||||
type: uint
|
||||
level: advanced
|
||||
desc: number of seconds before maintenance request times out
|
||||
default: 30
|
||||
services:
|
||||
- rbd
|
||||
- name: rbd_skip_partial_discard
|
||||
type: bool
|
||||
level: advanced
|
||||
desc: skip discard (zero) of unaligned extents within an object
|
||||
default: true
|
||||
services:
|
||||
- rbd
|
||||
- name: rbd_discard_granularity_bytes
|
||||
type: uint
|
||||
level: advanced
|
||||
desc: minimum aligned size of discard operations
|
||||
default: 64_K
|
||||
services:
|
||||
- rbd
|
||||
min: 4_K
|
||||
max: 32_M
|
||||
validator: |
|
||||
[](std::string *value, std::string *error_message) {
|
||||
uint64_t f = strict_si_cast<uint64_t>(value->c_str(), error_message);
|
||||
if (!error_message->empty()) {
|
||||
return -EINVAL;
|
||||
} else if (!isp2(f)) {
|
||||
*error_message = "value must be a power of two";
|
||||
return -EINVAL;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
- name: rbd_enable_alloc_hint
|
||||
type: bool
|
||||
level: advanced
|
||||
desc: when writing a object, it will issue a hint to osd backend to indicate the
|
||||
expected size object need
|
||||
default: true
|
||||
services:
|
||||
- rbd
|
||||
- name: rbd_compression_hint
|
||||
type: str
|
||||
level: basic
|
||||
desc: Compression hint to send to the OSDs during writes
|
||||
default: none
|
||||
services:
|
||||
- rbd
|
||||
enum_values:
|
||||
- none
|
||||
- compressible
|
||||
- incompressible
|
||||
flags:
|
||||
- runtime
|
||||
- name: rbd_read_from_replica_policy
|
||||
type: str
|
||||
level: basic
|
||||
desc: Read replica policy send to the OSDS during reads
|
||||
default: default
|
||||
services:
|
||||
- rbd
|
||||
enum_values:
|
||||
- default
|
||||
- balance
|
||||
- localize
|
||||
flags:
|
||||
- runtime
|
||||
- name: rbd_tracing
|
||||
type: bool
|
||||
level: advanced
|
||||
desc: true if LTTng-UST tracepoints should be enabled
|
||||
default: false
|
||||
services:
|
||||
- rbd
|
||||
- name: rbd_blkin_trace_all
|
||||
type: bool
|
||||
level: advanced
|
||||
desc: create a blkin trace for all RBD requests
|
||||
default: false
|
||||
services:
|
||||
- rbd
|
||||
- name: rbd_validate_pool
|
||||
type: bool
|
||||
level: advanced
|
||||
desc: validate empty pools for RBD compatibility
|
||||
default: true
|
||||
services:
|
||||
- rbd
|
||||
- name: rbd_validate_names
|
||||
type: bool
|
||||
level: advanced
|
||||
desc: validate new image names for RBD compatibility
|
||||
default: true
|
||||
services:
|
||||
- rbd
|
||||
- name: rbd_invalidate_object_map_on_timeout
|
||||
type: bool
|
||||
level: dev
|
||||
desc: true if object map should be invalidated when load or update timeout
|
||||
default: true
|
||||
services:
|
||||
- rbd
|
||||
- name: rbd_auto_exclusive_lock_until_manual_request
|
||||
type: bool
|
||||
level: advanced
|
||||
desc: automatically acquire/release exclusive lock until it is explicitly requested
|
||||
default: true
|
||||
services:
|
||||
- rbd
|
||||
- name: rbd_move_to_trash_on_remove
|
||||
type: bool
|
||||
level: basic
|
||||
desc: automatically move images to the trash when deleted
|
||||
default: false
|
||||
services:
|
||||
- rbd
|
||||
- name: rbd_move_to_trash_on_remove_expire_seconds
|
||||
type: uint
|
||||
level: basic
|
||||
desc: default number of seconds to protect deleted images in the trash
|
||||
default: 0
|
||||
services:
|
||||
- rbd
|
||||
- name: rbd_move_parent_to_trash_on_remove
|
||||
type: bool
|
||||
level: basic
|
||||
desc: move parent with clone format v2 children to the trash when deleted
|
||||
default: false
|
||||
services:
|
||||
- rbd
|
||||
- name: rbd_mirroring_resync_after_disconnect
|
||||
type: bool
|
||||
level: advanced
|
||||
desc: automatically start image resync after mirroring is disconnected due to being
|
||||
laggy
|
||||
default: false
|
||||
services:
|
||||
- rbd
|
||||
- name: rbd_mirroring_delete_delay
|
||||
type: uint
|
||||
level: advanced
|
||||
desc: time-delay in seconds for rbd-mirror delete propagation
|
||||
default: 0
|
||||
services:
|
||||
- rbd
|
||||
- name: rbd_mirroring_replay_delay
|
||||
type: uint
|
||||
level: advanced
|
||||
desc: time-delay in seconds for rbd-mirror asynchronous replication
|
||||
default: 0
|
||||
services:
|
||||
- rbd
|
||||
- name: rbd_mirroring_max_mirroring_snapshots
|
||||
type: uint
|
||||
level: advanced
|
||||
desc: mirroring snapshots limit
|
||||
default: 3
|
||||
services:
|
||||
- rbd
|
||||
min: 3
|
||||
- name: rbd_default_format
|
||||
type: uint
|
||||
level: advanced
|
||||
desc: default image format for new images
|
||||
default: 2
|
||||
services:
|
||||
- rbd
|
||||
- name: rbd_default_order
|
||||
type: uint
|
||||
level: advanced
|
||||
desc: default order (data block object size) for new images
|
||||
default: 22
|
||||
services:
|
||||
- rbd
|
||||
- name: rbd_default_stripe_count
|
||||
type: uint
|
||||
level: advanced
|
||||
desc: default stripe count for new images
|
||||
default: 0
|
||||
services:
|
||||
- rbd
|
||||
- name: rbd_default_stripe_unit
|
||||
type: size
|
||||
level: advanced
|
||||
desc: default stripe width for new images
|
||||
default: 0
|
||||
services:
|
||||
- rbd
|
||||
- name: rbd_default_map_options
|
||||
type: str
|
||||
level: advanced
|
||||
desc: default krbd map options
|
||||
services:
|
||||
- rbd
|
||||
- name: rbd_default_clone_format
|
||||
type: str
|
||||
level: advanced
|
||||
desc: default internal format for handling clones
|
||||
long_desc: This sets the internal format for tracking cloned images. The setting
|
||||
of '1' requires attaching to protected snapshots that cannot be removed until
|
||||
the clone is removed/flattened. The setting of '2' will allow clones to be attached
|
||||
to any snapshot and permits removing in-use parent snapshots but requires Mimic
|
||||
or later clients. The default setting of 'auto' will use the v2 format if the
|
||||
cluster is configured to require mimic or later clients.
|
||||
default: auto
|
||||
services:
|
||||
- rbd
|
||||
enum_values:
|
||||
- '1'
|
||||
- '2'
|
||||
- auto
|
||||
flags:
|
||||
- runtime
|
||||
- name: rbd_journal_order
|
||||
type: uint
|
||||
level: advanced
|
||||
desc: default order (object size) for journal data objects
|
||||
default: 24
|
||||
services:
|
||||
- rbd
|
||||
min: 12
|
||||
max: 26
|
||||
- name: rbd_journal_splay_width
|
||||
type: uint
|
||||
level: advanced
|
||||
desc: number of active journal objects
|
||||
default: 4
|
||||
services:
|
||||
- rbd
|
||||
- name: rbd_journal_commit_age
|
||||
type: float
|
||||
level: advanced
|
||||
desc: commit time interval, seconds
|
||||
default: 5
|
||||
services:
|
||||
- rbd
|
||||
- name: rbd_journal_object_writethrough_until_flush
|
||||
type: bool
|
||||
level: advanced
|
||||
desc: when enabled, the rbd_journal_object_flush* configuration options are ignored
|
||||
until the first flush so that batched journal IO is known to be safe for consistency
|
||||
default: true
|
||||
services:
|
||||
- rbd
|
||||
- name: rbd_journal_object_flush_interval
|
||||
type: uint
|
||||
level: advanced
|
||||
desc: maximum number of pending commits per journal object
|
||||
default: 0
|
||||
services:
|
||||
- rbd
|
||||
- name: rbd_journal_object_flush_bytes
|
||||
type: size
|
||||
level: advanced
|
||||
desc: maximum number of pending bytes per journal object
|
||||
default: 1_M
|
||||
services:
|
||||
- rbd
|
||||
- name: rbd_journal_object_flush_age
|
||||
type: float
|
||||
level: advanced
|
||||
desc: maximum age (in seconds) for pending commits
|
||||
default: 0
|
||||
services:
|
||||
- rbd
|
||||
- name: rbd_journal_object_max_in_flight_appends
|
||||
type: uint
|
||||
level: advanced
|
||||
desc: maximum number of in-flight appends per journal object
|
||||
default: 0
|
||||
services:
|
||||
- rbd
|
||||
- name: rbd_journal_pool
|
||||
type: str
|
||||
level: advanced
|
||||
desc: pool for journal objects
|
||||
services:
|
||||
- rbd
|
||||
- name: rbd_journal_max_payload_bytes
|
||||
type: size
|
||||
level: advanced
|
||||
desc: maximum journal payload size before splitting
|
||||
default: 16_K
|
||||
services:
|
||||
- rbd
|
||||
- name: rbd_journal_max_concurrent_object_sets
|
||||
type: uint
|
||||
level: advanced
|
||||
desc: maximum number of object sets a journal client can be behind before it is
|
||||
automatically unregistered
|
||||
default: 0
|
||||
services:
|
||||
- rbd
|
||||
- name: rbd_qos_iops_limit
|
||||
type: uint
|
||||
level: advanced
|
||||
desc: the desired limit of IO operations per second
|
||||
default: 0
|
||||
services:
|
||||
- rbd
|
||||
- name: rbd_qos_bps_limit
|
||||
type: uint
|
||||
level: advanced
|
||||
desc: the desired limit of IO bytes per second
|
||||
default: 0
|
||||
services:
|
||||
- rbd
|
||||
- name: rbd_qos_read_iops_limit
|
||||
type: uint
|
||||
level: advanced
|
||||
desc: the desired limit of read operations per second
|
||||
default: 0
|
||||
services:
|
||||
- rbd
|
||||
- name: rbd_qos_write_iops_limit
|
||||
type: uint
|
||||
level: advanced
|
||||
desc: the desired limit of write operations per second
|
||||
default: 0
|
||||
services:
|
||||
- rbd
|
||||
- name: rbd_qos_read_bps_limit
|
||||
type: uint
|
||||
level: advanced
|
||||
desc: the desired limit of read bytes per second
|
||||
default: 0
|
||||
services:
|
||||
- rbd
|
||||
- name: rbd_qos_write_bps_limit
|
||||
type: uint
|
||||
level: advanced
|
||||
desc: the desired limit of write bytes per second
|
||||
default: 0
|
||||
services:
|
||||
- rbd
|
||||
- name: rbd_qos_iops_burst
|
||||
type: uint
|
||||
level: advanced
|
||||
desc: the desired burst limit of IO operations
|
||||
default: 0
|
||||
services:
|
||||
- rbd
|
||||
- name: rbd_qos_bps_burst
|
||||
type: uint
|
||||
level: advanced
|
||||
desc: the desired burst limit of IO bytes
|
||||
default: 0
|
||||
services:
|
||||
- rbd
|
||||
- name: rbd_qos_read_iops_burst
|
||||
type: uint
|
||||
level: advanced
|
||||
desc: the desired burst limit of read operations
|
||||
default: 0
|
||||
services:
|
||||
- rbd
|
||||
- name: rbd_qos_write_iops_burst
|
||||
type: uint
|
||||
level: advanced
|
||||
desc: the desired burst limit of write operations
|
||||
default: 0
|
||||
services:
|
||||
- rbd
|
||||
- name: rbd_qos_read_bps_burst
|
||||
type: uint
|
||||
level: advanced
|
||||
desc: the desired burst limit of read bytes
|
||||
default: 0
|
||||
services:
|
||||
- rbd
|
||||
- name: rbd_qos_write_bps_burst
|
||||
type: uint
|
||||
level: advanced
|
||||
desc: the desired burst limit of write bytes
|
||||
default: 0
|
||||
services:
|
||||
- rbd
|
||||
- name: rbd_qos_iops_burst_seconds
|
||||
type: uint
|
||||
level: advanced
|
||||
desc: the desired burst duration in seconds of IO operations
|
||||
default: 1
|
||||
services:
|
||||
- rbd
|
||||
min: 1
|
||||
- name: rbd_qos_bps_burst_seconds
|
||||
type: uint
|
||||
level: advanced
|
||||
desc: the desired burst duration in seconds of IO bytes
|
||||
default: 1
|
||||
services:
|
||||
- rbd
|
||||
min: 1
|
||||
- name: rbd_qos_read_iops_burst_seconds
|
||||
type: uint
|
||||
level: advanced
|
||||
desc: the desired burst duration in seconds of read operations
|
||||
default: 1
|
||||
services:
|
||||
- rbd
|
||||
min: 1
|
||||
- name: rbd_qos_write_iops_burst_seconds
|
||||
type: uint
|
||||
level: advanced
|
||||
desc: the desired burst duration in seconds of write operations
|
||||
default: 1
|
||||
services:
|
||||
- rbd
|
||||
min: 1
|
||||
- name: rbd_qos_read_bps_burst_seconds
|
||||
type: uint
|
||||
level: advanced
|
||||
desc: the desired burst duration in seconds of read bytes
|
||||
default: 1
|
||||
services:
|
||||
- rbd
|
||||
min: 1
|
||||
- name: rbd_qos_write_bps_burst_seconds
|
||||
type: uint
|
||||
level: advanced
|
||||
desc: the desired burst duration in seconds of write bytes
|
||||
default: 1
|
||||
services:
|
||||
- rbd
|
||||
min: 1
|
||||
- name: rbd_qos_schedule_tick_min
|
||||
type: uint
|
||||
level: advanced
|
||||
desc: minimum schedule tick (in milliseconds) for QoS
|
||||
default: 50
|
||||
services:
|
||||
- rbd
|
||||
min: 1
|
||||
- name: rbd_qos_exclude_ops
|
||||
type: str
|
||||
level: advanced
|
||||
desc: optionally exclude ops from QoS
|
||||
long_desc: 'Optionally exclude ops from QoS. This setting accepts either an integer
|
||||
bitmask value or comma-delimited string of op names. This setting is always internally
|
||||
stored as an integer bitmask value. The mapping between op bitmask value and op
|
||||
name is as follows: +1 -> read, +2 -> write, +4 -> discard, +8 -> write_same,
|
||||
+16 -> compare_and_write'
|
||||
services:
|
||||
- rbd
|
||||
flags:
|
||||
- runtime
|
||||
validator: |
|
||||
[](std::string *value, std::string *error_message) {
|
||||
ostringstream ss;
|
||||
uint64_t exclude_ops = librbd::io::rbd_io_operations_from_string(*value, &ss);
|
||||
// Leave this in integer form to avoid breaking Cinder. Someday
|
||||
// we would like to present this in string form instead...
|
||||
*value = stringify(exclude_ops);
|
||||
if (ss.str().size()) {
|
||||
return -EINVAL;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
- name: rbd_discard_on_zeroed_write_same
|
||||
type: bool
|
||||
level: advanced
|
||||
desc: discard data on zeroed write same instead of writing zero
|
||||
default: true
|
||||
services:
|
||||
- rbd
|
||||
- name: rbd_mtime_update_interval
|
||||
type: uint
|
||||
level: advanced
|
||||
desc: RBD Image modify timestamp refresh interval. Set to 0 to disable modify timestamp
|
||||
update.
|
||||
default: 60
|
||||
services:
|
||||
- rbd
|
||||
min: 0
|
||||
- name: rbd_atime_update_interval
|
||||
type: uint
|
||||
level: advanced
|
||||
desc: RBD Image access timestamp refresh interval. Set to 0 to disable access timestamp
|
||||
update.
|
||||
default: 60
|
||||
services:
|
||||
- rbd
|
||||
min: 0
|
||||
- name: rbd_io_scheduler
|
||||
type: str
|
||||
level: advanced
|
||||
desc: RBD IO scheduler
|
||||
default: simple
|
||||
services:
|
||||
- rbd
|
||||
enum_values:
|
||||
- none
|
||||
- simple
|
||||
- name: rbd_io_scheduler_simple_max_delay
|
||||
type: uint
|
||||
level: advanced
|
||||
desc: maximum io delay (in milliseconds) for simple io scheduler (if set to 0 dalay
|
||||
is calculated based on latency stats)
|
||||
default: 0
|
||||
services:
|
||||
- rbd
|
||||
min: 0
|
||||
- name: rbd_persistent_cache_mode
|
||||
type: str
|
||||
level: advanced
|
||||
desc: enable persistent write back cache for this volume
|
||||
default: disabled
|
||||
services:
|
||||
- rbd
|
||||
enum_values:
|
||||
- disabled
|
||||
- rwl
|
||||
- ssd
|
||||
- name: rbd_persistent_cache_log_periodic_stats
|
||||
type: bool
|
||||
level: advanced
|
||||
desc: emit periodic perf stats to debug log
|
||||
default: false
|
||||
services:
|
||||
- rbd
|
||||
- name: rbd_persistent_cache_size
|
||||
type: uint
|
||||
level: advanced
|
||||
desc: size of the persistent write back cache for this volume
|
||||
default: 1_G
|
||||
services:
|
||||
- rbd
|
||||
min: 1_G
|
||||
- name: rbd_persistent_cache_path
|
||||
type: str
|
||||
level: advanced
|
||||
desc: location of the persistent write back cache in a DAX-enabled filesystem on
|
||||
persistent memory
|
||||
default: /tmp
|
||||
services:
|
||||
- rbd
|
||||
- name: rbd_quiesce_notification_attempts
|
||||
type: uint
|
||||
level: dev
|
||||
desc: the number of quiesce notification attempts
|
||||
default: 10
|
||||
services:
|
||||
- rbd
|
||||
min: 1
|
||||
- name: rbd_default_snapshot_quiesce_mode
|
||||
type: str
|
||||
level: advanced
|
||||
desc: default snapshot quiesce mode
|
||||
default: required
|
||||
services:
|
||||
- rbd
|
||||
enum_values:
|
||||
- required
|
||||
- ignore-error
|
||||
- skip
|
||||
- name: rbd_plugins
|
||||
type: str
|
||||
level: advanced
|
||||
desc: comma-delimited list of librbd plugins to enable
|
||||
services:
|
||||
- rbd
|
||||
- name: rbd_config_pool_override_update_timestamp
|
||||
type: uint
|
||||
level: dev
|
||||
desc: timestamp of last update to pool-level config overrides
|
||||
default: 0
|
||||
services:
|
||||
- rbd
|
||||
2569
src/common/options/rgw.yaml.in
Normal file
2569
src/common/options/rgw.yaml.in
Normal file
File diff suppressed because it is too large
Load Diff
323
src/common/options/y2c.py
Executable file
323
src/common/options/y2c.py
Executable file
@ -0,0 +1,323 @@
|
||||
#!/usr/bin/python3
|
||||
|
||||
import yaml
|
||||
import argparse
|
||||
import math
|
||||
import os
|
||||
import sys
|
||||
|
||||
|
||||
def type_to_cxx(t):
|
||||
return f'Option::TYPE_{t.upper()}'
|
||||
|
||||
|
||||
def level_to_cxx(lv):
|
||||
return f'Option::LEVEL_{lv.upper()}'
|
||||
|
||||
|
||||
def eval_str(v):
|
||||
if v == "":
|
||||
return v
|
||||
v = v.strip('"').replace('"', '\\"')
|
||||
return f'"{v}"'
|
||||
|
||||
|
||||
def eval_value(v, typ):
|
||||
try:
|
||||
if typ == 'str':
|
||||
return eval_str(v)
|
||||
if typ == 'float':
|
||||
return float(v)
|
||||
if typ in ('uint', 'int', 'size', 'secs', 'millisecs'):
|
||||
return int(v)
|
||||
if typ == 'bool':
|
||||
return 'true' if v else 'false'
|
||||
else:
|
||||
return f'"{v}"'
|
||||
except ValueError:
|
||||
times = dict(_min=60,
|
||||
_hr=60*60,
|
||||
_day=24*60*60,
|
||||
_K=1 << 10,
|
||||
_M=1 << 20,
|
||||
_G=1 << 30,
|
||||
_T=1 << 40)
|
||||
for unit, m in times.items():
|
||||
if v.endswith(unit):
|
||||
int(v[:-len(unit)])
|
||||
# user defined literals
|
||||
return v
|
||||
raise ValueError(f'unknown value: {v}')
|
||||
|
||||
|
||||
def set_default(default, typ):
|
||||
if default is None:
|
||||
return ''
|
||||
v = eval_value(default, typ)
|
||||
return f'.set_default({v})\n'
|
||||
|
||||
|
||||
def set_daemon_default(default, typ):
|
||||
if default is None:
|
||||
return ''
|
||||
v = eval_value(default, typ)
|
||||
return f'.set_daemon_default({v})\n'
|
||||
|
||||
|
||||
def add_tags(tags):
|
||||
if tags is None:
|
||||
return ''
|
||||
cxx = ''
|
||||
for tag in tags:
|
||||
v = eval_str(tag)
|
||||
cxx += f'.add_tag({v})\n'
|
||||
return cxx
|
||||
|
||||
|
||||
def add_services(services):
|
||||
if services is None:
|
||||
return ''
|
||||
if len(services) == 1:
|
||||
return f'.add_service("{services[0]}")\n'
|
||||
else:
|
||||
param = ', '.join(f'"{s}"' for s in services)
|
||||
return f'.add_service({{{param}}})\n'
|
||||
|
||||
|
||||
def add_see_also(see_also):
|
||||
if see_also is None:
|
||||
return ''
|
||||
param = ', '.join(f'"{v}"' for v in see_also)
|
||||
return f'.add_see_also({{{param}}})\n'
|
||||
|
||||
|
||||
def set_desc(desc):
|
||||
if desc is None:
|
||||
return ''
|
||||
v = eval_str(desc)
|
||||
return f'.set_description({v})\n'
|
||||
|
||||
|
||||
def set_long_desc(desc):
|
||||
if desc is None:
|
||||
return ''
|
||||
v = eval_str(desc)
|
||||
return f'.set_long_description({v})\n'
|
||||
|
||||
|
||||
def set_min_max(mi, ma, typ):
|
||||
if mi is None and ma is None:
|
||||
return ''
|
||||
if mi is not None and ma is not None:
|
||||
min_v = eval_value(mi, typ)
|
||||
max_v = eval_value(ma, typ)
|
||||
if isinstance(min_v, str) and isinstance(max_v, int):
|
||||
return f'.set_min_max({min_v}, {max_v}ULL)\n'
|
||||
elif isinstance(min_v, int) and isinstance(max_v, str):
|
||||
return f'.set_min_max({min_v}ULL, {max_v})\n'
|
||||
else:
|
||||
return f'.set_min_max({min_v}, {max_v})\n'
|
||||
if mi is not None:
|
||||
min_v = eval_value(mi, typ)
|
||||
return f'.set_min({min_v})\n'
|
||||
raise ValueError('set_max() is not implemented')
|
||||
|
||||
|
||||
def set_enum_allowed(values):
|
||||
if values is None:
|
||||
return ''
|
||||
param = ', '.join(f'"{v}"' for v in values)
|
||||
return f'.set_enum_allowed({{{param}}})'
|
||||
|
||||
|
||||
def add_flags(flags):
|
||||
if flags is None:
|
||||
return ''
|
||||
cxx = ''
|
||||
for flag in flags:
|
||||
cxx += f'.set_flag(Option::FLAG_{flag.upper()})\n'
|
||||
return cxx
|
||||
|
||||
|
||||
def set_validator(validator):
|
||||
if validator is None:
|
||||
return ''
|
||||
validator = validator.rstrip()
|
||||
return f'.set_validator({validator})\n'
|
||||
|
||||
|
||||
def add_verbatim(verbatim):
|
||||
if verbatim is None:
|
||||
return ''
|
||||
return verbatim + '\n'
|
||||
|
||||
|
||||
def yaml_to_cxx(opt, indent):
|
||||
name = opt['name']
|
||||
typ = opt['type']
|
||||
ctyp = type_to_cxx(typ)
|
||||
level = level_to_cxx(opt['level'])
|
||||
cxx = f'Option("{name}", {ctyp}, {level})\n'
|
||||
cxx += set_desc(opt.get('desc'))
|
||||
cxx += set_long_desc(opt.get('long_desc'))
|
||||
cxx += set_default(opt.get('default'), typ)
|
||||
cxx += set_daemon_default(opt.get('daemon_default'), typ)
|
||||
cxx += set_min_max(opt.get('min'), opt.get('max'), typ)
|
||||
cxx += set_enum_allowed(opt.get('enum_values'))
|
||||
cxx += set_validator(opt.get('validator'))
|
||||
cxx += add_flags(opt.get('flags'))
|
||||
cxx += add_services(opt.get('services'))
|
||||
cxx += add_tags(opt.get('tags'))
|
||||
cxx += add_see_also(opt.get('see_also'))
|
||||
verbatim = add_verbatim(opt.get('verbatim'))
|
||||
cxx += verbatim
|
||||
if verbatim:
|
||||
cxx += '\n'
|
||||
else:
|
||||
cxx = cxx.rstrip()
|
||||
cxx += ',\n'
|
||||
if indent > 0:
|
||||
indented = []
|
||||
for line in cxx.split('\n'):
|
||||
if line:
|
||||
indented.append(' ' * indent + line + '\n')
|
||||
cxx = ''.join(indented)
|
||||
return cxx
|
||||
|
||||
|
||||
TEMPLATE_CC = '''#include "common/options.h"
|
||||
{headers}
|
||||
|
||||
std::vector<Option> get_{name}_options() {{
|
||||
return std::vector<Option>({{
|
||||
@body@
|
||||
}});
|
||||
}}
|
||||
'''
|
||||
|
||||
|
||||
def translate(opts):
|
||||
if opts.raw:
|
||||
prelude, epilogue = '', ''
|
||||
else:
|
||||
prelude, epilogue = TEMPLATE_CC.split('@body@')
|
||||
|
||||
if opts.name:
|
||||
name = opts.name
|
||||
else:
|
||||
name = os.path.split(opts.input)[-1]
|
||||
name = name.rsplit('.', 1)[0]
|
||||
name = name.replace('-', '_')
|
||||
with open(opts.input) as infile, open(opts.output, 'w') as outfile:
|
||||
yml = yaml.safe_load(infile)
|
||||
headers = yml.get('headers', '')
|
||||
outfile.write(prelude.format(name=name, headers=headers))
|
||||
options = yml['options']
|
||||
for option in options:
|
||||
try:
|
||||
cxx = yaml_to_cxx(option, opts.indent)
|
||||
outfile.write(cxx)
|
||||
outfile.write('\n')
|
||||
except ValueError as e:
|
||||
print(f'failed to translate option "{name}": {e}',
|
||||
file=sys.stderr)
|
||||
return 1
|
||||
outfile.write(epilogue.replace("}}", "}"))
|
||||
|
||||
|
||||
def readable_size(value, typ):
|
||||
times = dict(T=1 << 40,
|
||||
G=1 << 30,
|
||||
M=1 << 20,
|
||||
K=1 << 10)
|
||||
if isinstance(value, str):
|
||||
value = value.strip('"')
|
||||
try:
|
||||
v = int(value)
|
||||
if v == 0:
|
||||
return 0
|
||||
for unit, m in times.items():
|
||||
if v % m == 0:
|
||||
v = int(v / m)
|
||||
return f'{v}_{unit}'
|
||||
return v
|
||||
except ValueError:
|
||||
return value
|
||||
|
||||
|
||||
def readable_duration(value, typ):
|
||||
times = dict(day=24*60*60,
|
||||
hr=60*60,
|
||||
min=60)
|
||||
if isinstance(value, str):
|
||||
value = value.strip('"')
|
||||
try:
|
||||
v = float(value)
|
||||
if math.floor(v) != v:
|
||||
return v
|
||||
v = int(v)
|
||||
if v == 0:
|
||||
return 0
|
||||
for unit, m in times.items():
|
||||
if v % m == 0:
|
||||
v = int(v / m)
|
||||
return f'{v}_{unit}'
|
||||
return v
|
||||
except ValueError:
|
||||
return value
|
||||
|
||||
|
||||
def readable_millisecs(value, typ):
|
||||
return int(value)
|
||||
|
||||
|
||||
def readable(opts):
|
||||
with open(opts.input) as infile, open(opts.output, 'w') as outfile:
|
||||
yml = yaml.safe_load(infile)
|
||||
options = yml['options']
|
||||
for option in options:
|
||||
typ = option['type']
|
||||
if typ in ('size', 'uint'):
|
||||
do_readable = readable_size
|
||||
elif typ in ('float', 'int', 'secs'):
|
||||
do_readable = readable_duration
|
||||
elif typ == 'millisecs':
|
||||
do_readable = readable_millisecs
|
||||
else:
|
||||
continue
|
||||
for field in ['default', 'min', 'max', 'daemon_default']:
|
||||
v = option.get(field)
|
||||
if v is not None:
|
||||
option[field] = do_readable(v, typ)
|
||||
yml['options'] = options
|
||||
yaml.dump(yml, outfile, sort_keys=False, indent=2)
|
||||
|
||||
|
||||
def main():
|
||||
parser = argparse.ArgumentParser(
|
||||
formatter_class=argparse.ArgumentDefaultsHelpFormatter)
|
||||
parser.add_argument('-i', '--input', dest='input',
|
||||
default='options.yaml',
|
||||
help='the YAML file to be processed')
|
||||
parser.add_argument('-o', '--output', dest='output',
|
||||
default='options',
|
||||
help='the path to the generated .cc file')
|
||||
parser.add_argument('--indent', type=int,
|
||||
default=4,
|
||||
help='the number of spaces added before each line')
|
||||
parser.add_argument('--name',
|
||||
help='the name of the option group')
|
||||
parser.add_argument('--raw', action='store_true',
|
||||
help='output the array without the full function')
|
||||
parser.add_argument('--op', choices=('readable', 'translate'),
|
||||
default='translate',
|
||||
help='operation to perform.')
|
||||
opts = parser.parse_args(sys.argv[1:])
|
||||
if opts.op == 'translate':
|
||||
translate(opts)
|
||||
else:
|
||||
readable(opts)
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
main()
|
||||
@ -118,7 +118,8 @@ add_library(crimson-common STATIC
|
||||
${PROJECT_SOURCE_DIR}/src/osd/PGPeeringEvent.cc
|
||||
${PROJECT_SOURCE_DIR}/src/xxHash/xxhash.c
|
||||
${crimson_common_srcs}
|
||||
$<TARGET_OBJECTS:common_mountcephfs_objs>)
|
||||
$<TARGET_OBJECTS:common_mountcephfs_objs>
|
||||
$<TARGET_OBJECTS:common-options-objs>)
|
||||
|
||||
target_compile_definitions(crimson-common PRIVATE
|
||||
"CMAKE_INSTALL_LIBDIR=\"${CMAKE_INSTALL_LIBDIR}\""
|
||||
|
||||
@ -324,9 +324,6 @@
|
||||
|
||||
#cmakedefine MGR_PYTHON_EXECUTABLE "@MGR_PYTHON_EXECUTABLE@"
|
||||
|
||||
/* the default value of "mgr_disabled_module" option */
|
||||
#cmakedefine MGR_DISABLED_MODULES "@MGR_DISABLED_MODULES@"
|
||||
|
||||
/* Define to 1 if you have the `getprogname' function. */
|
||||
#cmakedefine HAVE_GETPROGNAME 1
|
||||
|
||||
|
||||
@ -68,14 +68,16 @@ mkdir -p $depsSrcDir
|
||||
case "$OS" in
|
||||
ubuntu)
|
||||
sudo apt-get update
|
||||
sudo apt-get -y install mingw-w64 cmake pkg-config python3-dev python3-pip \
|
||||
sudo apt-get -y install mingw-w64 cmake pkg-config \
|
||||
python3-dev python3-pip python3-yaml \
|
||||
autoconf libtool ninja-build zip
|
||||
sudo python3 -m pip install cython
|
||||
;;
|
||||
suse)
|
||||
for PKG in mingw64-cross-gcc-c++ mingw64-libgcc_s_seh1 mingw64-libstdc++6 \
|
||||
cmake pkgconf python3-devel autoconf libtool ninja zip \
|
||||
python3-Cython gcc patch wget git; do
|
||||
python3-Cython python3-PyYAML \
|
||||
gcc patch wget git; do
|
||||
rpm -q $PKG >/dev/null || zypper -n install $PKG
|
||||
done
|
||||
;;
|
||||
|
||||
Loading…
Reference in New Issue
Block a user