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:
Kefu Chai 2021-04-09 18:54:46 +08:00
parent 3bee4b0261
commit 5ddda38da4
22 changed files with 12887 additions and 8852 deletions

View File

@ -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)

View File

@ -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
View File

@ -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,

View File

@ -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>

View File

@ -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

View File

@ -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;

View 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})

View 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;
}

View 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();

View 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

File diff suppressed because it is too large Load Diff

View 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

View 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

File diff suppressed because it is too large Load Diff

View 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

View 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

File diff suppressed because it is too large Load Diff

323
src/common/options/y2c.py Executable file
View 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()

View File

@ -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}\""

View File

@ -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

View File

@ -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
;;