[lvm-devel] master - libdm: tunning cache API
Zdenek Kabelac
zkabelac at fedoraproject.org
Mon Nov 10 21:06:27 UTC 2014
Gitweb: http://git.fedorahosted.org/git/?p=lvm2.git;a=commitdiff;h=824019531cbba02c722cb0bf0957ac84eccef3b9
Commit: 824019531cbba02c722cb0bf0957ac84eccef3b9
Parent: 3dbcd2a1c9027c08faab726a1f1a24085046f0df
Author: Zdenek Kabelac <zkabelac at redhat.com>
AuthorDate: Sat Nov 8 23:20:25 2014 +0100
Committer: Zdenek Kabelac <zkabelac at redhat.com>
CommitterDate: Mon Nov 10 22:05:48 2014 +0100
libdm: tunning cache API
Support new PASSTHROUGH 'feature' flag.
Add dm_config_node to pass in policy args.
Really use origin_uuid instead of using extra call
to pass seg_areas.
Switch to 64bit feature flag bit set so there is
enough space in future for new bits...
---
WHATS_NEW_DM | 1 +
lib/cache_segtype/cache.c | 9 +---
libdm/libdevmapper.h | 30 ++++++++++---
libdm/libdm-deptree.c | 103 +++++++++++++++++++++++----------------------
4 files changed, 79 insertions(+), 64 deletions(-)
diff --git a/WHATS_NEW_DM b/WHATS_NEW_DM
index 0305077..f4148bc 100644
--- a/WHATS_NEW_DM
+++ b/WHATS_NEW_DM
@@ -1,5 +1,6 @@
Version 1.02.91 -
====================================
+ Update API for cache creation and dm_config_node to pass policy.
Allow activation of any thin-pool with passed transaction_id == 0.
Don't print uninitialized stack bytes when non-root uses dm_check_version().
Fix selection criteria to not match reserved values when using >, <, >=, <.
diff --git a/lib/cache_segtype/cache.c b/lib/cache_segtype/cache.c
index e5512bf..ea480de 100644
--- a/lib/cache_segtype/cache.c
+++ b/lib/cache_segtype/cache.c
@@ -332,16 +332,13 @@ static int _cache_add_target_line(struct dev_manager *dm,
return_0;
if (!dm_tree_node_add_cache_target(node, len,
+ cache_pool_seg->feature_flags,
metadata_uuid,
data_uuid,
origin_uuid,
- cache_pool_seg->chunk_size,
- cache_pool_seg->feature_flags,
- cache_pool_seg->core_argc,
- cache_pool_seg->core_argv,
+ NULL,
cache_pool_seg->policy_name,
- cache_pool_seg->policy_argc,
- cache_pool_seg->policy_argv))
+ cache_pool_seg->chunk_size))
return_0;
return add_areas_line(dm, seg, node, 0u, seg->area_count);
diff --git a/libdm/libdevmapper.h b/libdm/libdevmapper.h
index 76c4eee..62a5941 100644
--- a/libdm/libdevmapper.h
+++ b/libdm/libdevmapper.h
@@ -320,7 +320,7 @@ struct dm_status_cache {
uint64_t demotions;
uint64_t promotions;
- uint32_t feature_flags;
+ uint64_t feature_flags;
int core_argc;
char **core_argv;
@@ -774,19 +774,35 @@ int dm_tree_node_add_raid_target_with_params(struct dm_tree_node *node,
/* Cache feature_flags */
#define DM_CACHE_FEATURE_WRITEBACK 0x00000001
#define DM_CACHE_FEATURE_WRITETHROUGH 0x00000002
+#define DM_CACHE_FEATURE_PASSTHROUGH 0x00000004
+struct dm_config_node;
+/*
+ * Use for passing cache policy and all its args e.g.:
+ *
+ * mq {
+ * migration_threshold=2048
+ * sequention_threashold=100
+ * ...
+ * }
+ *
+ * For policy without any parameters simply specify policy_name.
+ */
int dm_tree_node_add_cache_target(struct dm_tree_node *node,
uint64_t size,
+ uint64_t feature_flags, /* DM_CACHE_FEATURE_* */
const char *metadata_uuid,
const char *data_uuid,
const char *origin_uuid,
- uint32_t chunk_size,
- uint32_t feature_flags, /* DM_CACHE_FEATURE_* */
- unsigned core_argc,
- const char *const *core_argv,
+ const struct dm_config_node *policy,
const char *policy_name,
- unsigned policy_argc,
- const char *const *policy_argv);
+ uint32_t chunk_size);
+
+/*
+ * TODO: Add individual cache policy pairs <key> = value, like:
+ *int dm_tree_node_add_cache_policy_arg(struct dm_tree_node *dnode,
+ * const char *key, uint64_t value);
+ */
/*
* Replicator operation mode
diff --git a/libdm/libdm-deptree.c b/libdm/libdm-deptree.c
index d120bf5..6521360 100644
--- a/libdm/libdm-deptree.c
+++ b/libdm/libdm-deptree.c
@@ -171,11 +171,9 @@ struct load_segment {
uint32_t flags; /* Mirror + raid + Cache */
char *uuid; /* Clustered mirror log */
- unsigned core_argc; /* Cache */
- const char *const *core_argv; /* Cache */
const char *policy_name; /* Cache */
unsigned policy_argc; /* Cache */
- const char *const *policy_argv; /* Cache */
+ struct dm_config_node *policy; /* Cache */
const char *cipher; /* Crypt */
const char *chainmode; /* Crypt */
@@ -2366,25 +2364,23 @@ static int _cache_emit_segment_line(struct dm_task *dmt,
char *params, size_t paramsize)
{
int pos = 0;
- unsigned i = 0;
- unsigned feature_count;
- struct seg_area *area;
+ /* unsigned feature_count; */
char data[DM_FORMAT_DEV_BUFSIZE];
char metadata[DM_FORMAT_DEV_BUFSIZE];
char origin[DM_FORMAT_DEV_BUFSIZE];
+ const char *name;
+ struct dm_config_node *cn;
- /* Metadata Dev */
- if (!_build_dev_string(metadata, sizeof(metadata), seg->metadata))
+ /* Cache Dev */
+ if (!_build_dev_string(data, sizeof(data), seg->pool))
return_0;
- /* Cache Dev */
- if (!_build_dev_string(data, sizeof(origin), seg->pool))
+ /* Metadata Dev */
+ if (!_build_dev_string(metadata, sizeof(metadata), seg->metadata))
return_0;
/* Origin Dev */
- dm_list_iterate_items(area, &seg->areas)
- break; /* There is only ever 1 area */
- if (!_build_dev_string(origin, sizeof(data), area->dev_node))
+ if (!_build_dev_string(origin, sizeof(origin), seg->origin))
return_0;
EMIT_PARAMS(pos, " %s %s %s", metadata, data, origin);
@@ -2393,34 +2389,24 @@ static int _cache_emit_segment_line(struct dm_task *dmt,
EMIT_PARAMS(pos, " %u", seg->chunk_size);
/* Features */
- feature_count = hweight32(seg->flags);
- EMIT_PARAMS(pos, " %u", feature_count);
- if (seg->flags & DM_CACHE_FEATURE_WRITETHROUGH)
- EMIT_PARAMS(pos, " writethrough");
+ /* feature_count = hweight32(seg->flags); */
+ /* EMIT_PARAMS(pos, " %u", feature_count); */
+ if (seg->flags & DM_CACHE_FEATURE_PASSTHROUGH)
+ EMIT_PARAMS(pos, " 1 passthrough");
+ else if (seg->flags & DM_CACHE_FEATURE_WRITETHROUGH)
+ EMIT_PARAMS(pos, " 1 writethrough");
else if (seg->flags & DM_CACHE_FEATURE_WRITEBACK)
- EMIT_PARAMS(pos, " writeback");
-
- /* Core Arguments (like 'migration_threshold') */
- if (seg->core_argc) {
- EMIT_PARAMS(pos, " %u", seg->core_argc);
- for (i = 0; i < seg->core_argc; i++)
- EMIT_PARAMS(pos, " %s", seg->core_argv[i]);
- }
+ EMIT_PARAMS(pos, " 1 writeback");
/* Cache Policy */
- if (!seg->policy_name)
- EMIT_PARAMS(pos, " default 0");
- else {
- EMIT_PARAMS(pos, " %s %u", seg->policy_name, seg->policy_argc);
- if (seg->policy_argc % 2) {
- log_error(INTERNAL_ERROR
- "Cache policy arguments must be in "
- "<key> <value> pairs");
- return 0;
- }
- for (i = 0; i < seg->policy_argc; i++)
- EMIT_PARAMS(pos, " %s", seg->policy_argv[i]);
- }
+ name = seg->policy_name ? : seg->policy ? seg->policy->key : "default";
+
+ EMIT_PARAMS(pos, " %s", name);
+
+ EMIT_PARAMS(pos, " %u", seg->policy_argc * 2);
+ if (seg->policy)
+ for (cn = seg->policy->child; cn; cn = cn->sib)
+ EMIT_PARAMS(pos, " %s %" PRIu64, cn->key, cn->v->v.i);
return 1;
}
@@ -3313,17 +3299,15 @@ bad:
int dm_tree_node_add_cache_target(struct dm_tree_node *node,
uint64_t size,
+ uint64_t feature_flags, /* DM_CACHE_FEATURE_* */
const char *metadata_uuid,
const char *data_uuid,
const char *origin_uuid,
- uint32_t chunk_size,
- uint32_t feature_flags, /* DM_CACHE_FEATURE_* */
- unsigned core_argc,
- const char *const *core_argv,
+ const struct dm_config_node *policy,
const char *policy_name,
- unsigned policy_argc,
- const char *const *policy_argv)
+ uint32_t chunk_size)
{
+ struct dm_config_node *cn;
struct load_segment *seg;
if (!(seg = _add_segment(node, SEG_CACHE, size)))
@@ -3347,18 +3331,35 @@ int dm_tree_node_add_cache_target(struct dm_tree_node *node,
if (!_link_tree_nodes(node, seg->metadata))
return_0;
- seg->chunk_size = chunk_size;
+ if (!(seg->origin = dm_tree_find_node_by_uuid(node->dtree,
+ origin_uuid))) {
+ log_error("Missing cache's origin uuid %s.",
+ metadata_uuid);
+ return 0;
+ }
+ if (!_link_tree_nodes(node, seg->origin))
+ return_0;
+
+ seg->chunk_size = chunk_size;
seg->flags = feature_flags;
+ seg->policy_name = policy_name;
- /* FIXME: validation missing */
+ /* FIXME: better validation missing */
+ if (policy) {
+ if (!(seg->policy = dm_config_clone_node_with_mem(node->dtree->mem, policy, 0)))
+ return_0;
- seg->core_argc = core_argc;
- seg->core_argv = core_argv;
+ for (cn = seg->policy->child; cn; cn = cn->sib) {
+ if (!cn->v || (cn->v->type != DM_CFG_INT)) {
+ /* For now only <key> = <int> pairs are supported */
+ log_error("Cache policy parameter %s is without integer value.", cn->key);
+ return 0;
+ }
+ seg->policy_argc++;
+ }
+ }
- seg->policy_name = policy_name;
- seg->policy_argc = policy_argc;
- seg->policy_argv = policy_argv;
return 1;
}
More information about the lvm-devel
mailing list