[lvm-devel] master - cache: introduce allocation/cache_metadata_format
Zdenek Kabelac
zkabelac at sourceware.org
Fri Mar 10 18:37:02 UTC 2017
Gitweb: https://sourceware.org/git/?p=lvm2.git;a=commitdiff;h=4a394f410d571d8c8ef7c9f87df781df0f7988bd
Commit: 4a394f410d571d8c8ef7c9f87df781df0f7988bd
Parent: bb20fac4ab65454dd4cabc90426546c25254d927
Author: Zdenek Kabelac <zkabelac at redhat.com>
AuthorDate: Sun Feb 26 20:19:07 2017 +0100
Committer: Zdenek Kabelac <zkabelac at redhat.com>
CommitterDate: Fri Mar 10 19:33:01 2017 +0100
cache: introduce allocation/cache_metadata_format
Add new profilable configation setting to let user select
which metadata format of a created cache pool he wish to use.
By default the 'best' available format is autodetected at runtime,
but user may enforce format 1 or 2 ATM.
Code also detects availability for metadata2 supporting cache target.
In case of troubles user may easily Disable usage of this feature
by placing 'metadata2' into global/cache_disabled_features list.
---
WHATS_NEW | 1 +
conf/example.conf.in | 20 ++++++++++++++++----
lib/cache_segtype/cache.c | 11 +++++++++++
lib/config/config_settings.h | 13 +++++++++++--
lib/config/defaults.h | 1 +
lib/metadata/metadata-exported.h | 7 +++++++
lib/metadata/segtype.h | 1 +
7 files changed, 48 insertions(+), 6 deletions(-)
diff --git a/WHATS_NEW b/WHATS_NEW
index ef3ec3f..d1efed0 100644
--- a/WHATS_NEW
+++ b/WHATS_NEW
@@ -1,5 +1,6 @@
Version 2.02.169 -
=====================================
+ Add allocation/cache_metadata_format profilable setttings.
Use function cache_set_params() for both lvcreate and lvconvert.
Skip rounding on cache chunk size boudary when create cache LV.
Improve cache_set_params support for chunk_size selection.
diff --git a/conf/example.conf.in b/conf/example.conf.in
index 5e238e4..614ce53 100644
--- a/conf/example.conf.in
+++ b/conf/example.conf.in
@@ -403,9 +403,20 @@ allocation {
# This configuration option has an automatic default value.
# cache_mode = "writethrough"
+ # Configuration option allocation/cache_metadata_format.
+ # Sets default metadata format for new cache.
+ #
+ # Accepted values:
+ # 0 Automatically detected best available format
+ # 1 Original format
+ # 2 Improved 2nd. generation format
+ #
+ # This configuration option has an automatic default value.
+ # cache_metadata_format = 0
+
# Configuration option allocation/cache_policy.
# The default cache policy used for new cache volume.
- # Since kernel 4.2 the default policy is smq (Stochastic multique),
+ # Since kernel 4.2 the default policy is smq (Stochastic multiqueue),
# otherwise the older mq (Multiqueue) policy is selected.
# This configuration option does not have a default value defined.
@@ -1013,7 +1024,7 @@ global {
# Configuration option global/cache_disabled_features.
# Features to not use in the cache driver.
# This can be helpful for testing, or to avoid using a feature that is
- # causing problems. Features include: policy_mq, policy_smq.
+ # causing problems. Features include: policy_mq, policy_smq, metadata2.
#
# Example
# cache_disabled_features = [ "policy_smq" ]
@@ -1277,8 +1288,9 @@ activation {
# Configuration option activation/raid_region_size.
# Size in KiB of each raid or mirror synchronization region.
- # For raid or mirror segment types, this is the amount of data that is
- # copied at once when initializing, or moved at once by pvmove.
+ # The clean/dirty state of data is tracked for each region.
+ # The value is rounded down to a power of two if necessary, and
+ # is ignored if it is not a multiple of the machine memory page size.
raid_region_size = 512
# Configuration option activation/error_when_full.
diff --git a/lib/cache_segtype/cache.c b/lib/cache_segtype/cache.c
index ffa5d37..c378eda 100644
--- a/lib/cache_segtype/cache.c
+++ b/lib/cache_segtype/cache.c
@@ -213,6 +213,7 @@ static int _target_present(struct cmd_context *cmd,
const char *aliasing;
} _features[] = {
/* Assumption: cache >=1.9 always aliases MQ policy */
+ { 1, 10, CACHE_FEATURE_METADATA2, 0, "metadata2" },
{ 1, 9, CACHE_FEATURE_POLICY_SMQ, CACHE_FEATURE_POLICY_MQ, "policy_smq", "cache-smq",
" and aliases cache-mq" },
{ 1, 8, CACHE_FEATURE_POLICY_SMQ, 0, "policy_smq", "cache-smq" },
@@ -250,6 +251,16 @@ static int _target_present(struct cmd_context *cmd,
for (i = 0; i < DM_ARRAY_SIZE(_features); ++i) {
if (_attrs & _features[i].cache_feature)
continue; /* already present */
+
+ if (!_features[i].module[0]) {
+ if ((maj > _features[i].maj) ||
+ (maj == _features[i].maj && min >= _features[i].min)) {
+ log_debug_activation("Cache supports %s.",
+ _features[i].feature);
+ _attrs |= _features[i].cache_feature;
+ }
+ continue;
+ }
if (((maj > _features[i].maj) ||
(maj == _features[i].maj && min >= _features[i].min)) &&
module_present(cmd, _features[i].module)) {
diff --git a/lib/config/config_settings.h b/lib/config/config_settings.h
index 6a01a97..b701722 100644
--- a/lib/config/config_settings.h
+++ b/lib/config/config_settings.h
@@ -480,6 +480,15 @@ cfg(allocation_cache_pool_cachemode_CFG, "cache_pool_cachemode", allocation_CFG_
"This has been replaced by the allocation/cache_mode setting.\n",
"Cache mode.\n")
+cfg(allocation_cache_metadata_format_CFG, "cache_metadata_format", allocation_CFG_SECTION, CFG_PROFILABLE | CFG_PROFILABLE_METADATA | CFG_DEFAULT_COMMENTED, CFG_TYPE_INT, DEFAULT_CACHE_METADATA_FORMAT, vsn(2, 2, 169), NULL, 0, NULL,
+ "Sets default metadata format for new cache.\n"
+ "#\n"
+ "Accepted values:\n"
+ " 0 Automatically detected best available format\n"
+ " 1 Original format\n"
+ " 2 Improved 2nd. generation format\n"
+ "#\n")
+
cfg(allocation_cache_mode_CFG, "cache_mode", allocation_CFG_SECTION, CFG_PROFILABLE | CFG_PROFILABLE_METADATA | CFG_DEFAULT_COMMENTED, CFG_TYPE_STRING, DEFAULT_CACHE_MODE, vsn(2, 2, 128), NULL, 0, NULL,
"The default cache mode used for new cache.\n"
"#\n"
@@ -494,7 +503,7 @@ cfg(allocation_cache_mode_CFG, "cache_mode", allocation_CFG_SECTION, CFG_PROFILA
cfg(allocation_cache_policy_CFG, "cache_policy", allocation_CFG_SECTION, CFG_PROFILABLE | CFG_PROFILABLE_METADATA | CFG_DEFAULT_UNDEFINED, CFG_TYPE_STRING, 0, vsn(2, 2, 128), NULL, 0, NULL,
"The default cache policy used for new cache volume.\n"
- "Since kernel 4.2 the default policy is smq (Stochastic multique),\n"
+ "Since kernel 4.2 the default policy is smq (Stochastic multiqueue),\n"
"otherwise the older mq (Multiqueue) policy is selected.\n")
cfg_section(allocation_cache_settings_CFG_SECTION, "cache_settings", allocation_CFG_SECTION, CFG_PROFILABLE | CFG_PROFILABLE_METADATA | CFG_DEFAULT_COMMENTED, vsn(2, 2, 128), 0, NULL,
@@ -992,7 +1001,7 @@ cfg_array(global_thin_disabled_features_CFG, "thin_disabled_features", global_CF
cfg_array(global_cache_disabled_features_CFG, "cache_disabled_features", global_CFG_SECTION, CFG_ALLOW_EMPTY | CFG_DEFAULT_UNDEFINED, CFG_TYPE_STRING, NULL, vsn(2, 2, 128), NULL, 0, NULL,
"Features to not use in the cache driver.\n"
"This can be helpful for testing, or to avoid using a feature that is\n"
- "causing problems. Features include: policy_mq, policy_smq.\n"
+ "causing problems. Features include: policy_mq, policy_smq, metadata2.\n"
"#\n"
"Example\n"
"cache_disabled_features = [ \"policy_smq\" ]\n"
diff --git a/lib/config/defaults.h b/lib/config/defaults.h
index 5554c9c..2340636 100644
--- a/lib/config/defaults.h
+++ b/lib/config/defaults.h
@@ -132,6 +132,7 @@
#define DEFAULT_CACHE_POOL_MIN_METADATA_SIZE 2048 /* KB */
#define DEFAULT_CACHE_POOL_MAX_METADATA_SIZE (16 * 1024 * 1024) /* KB */
#define DEFAULT_CACHE_POLICY "mq"
+#define DEFAULT_CACHE_METADATA_FORMAT CACHE_METADATA_FORMAT_UNSELECTED /* Autodetect */
#define DEFAULT_CACHE_MODE "writethrough"
#define DEFAULT_UMASK 0077
diff --git a/lib/metadata/metadata-exported.h b/lib/metadata/metadata-exported.h
index 3486902..5c84bdf 100644
--- a/lib/metadata/metadata-exported.h
+++ b/lib/metadata/metadata-exported.h
@@ -294,6 +294,13 @@ typedef enum {
CACHE_MODE_PASSTHROUGH,
} cache_mode_t;
+/* ATM used for cache only */
+typedef enum {
+ CACHE_METADATA_FORMAT_UNSELECTED = 0, /* On input means 'auto' */
+ CACHE_METADATA_FORMAT_1,
+ CACHE_METADATA_FORMAT_2,
+} cache_metadata_format_t;
+
typedef enum {
LOCK_TYPE_INVALID = -1,
LOCK_TYPE_NONE = 0,
diff --git a/lib/metadata/segtype.h b/lib/metadata/segtype.h
index a7a3857..f99d3ad 100644
--- a/lib/metadata/segtype.h
+++ b/lib/metadata/segtype.h
@@ -315,6 +315,7 @@ int init_cache_segtypes(struct cmd_context *cmd, struct segtype_library *seglib)
#define CACHE_FEATURE_POLICY_MQ (1U << 0)
#define CACHE_FEATURE_POLICY_SMQ (1U << 1)
+#define CACHE_FEATURE_METADATA2 (1U << 2)
#define SNAPSHOT_FEATURE_FIXED_LEAK (1U << 0) /* version 1.12 */
More information about the lvm-devel
mailing list