mirror of
git://sourceware.org/git/lvm2.git
synced 2025-03-28 02:50:41 +03:00
writecache: support settings metadata_only and pause_writeback
Two new settings for tuning dm-writecache.
This commit is contained in:
parent
9ce55a43d0
commit
fa7fe5cbbe
@ -982,7 +982,9 @@ struct writecache_settings {
|
||||
uint32_t fua;
|
||||
uint32_t nofua;
|
||||
uint32_t cleaner;
|
||||
uint32_t max_age;
|
||||
uint32_t max_age; /* in milliseconds */
|
||||
uint32_t metadata_only;
|
||||
uint32_t pause_writeback; /* in milliseconds */
|
||||
|
||||
/*
|
||||
* Allow an unrecognized key and its val to be passed to the kernel for
|
||||
@ -1004,6 +1006,8 @@ struct writecache_settings {
|
||||
unsigned nofua_set:1;
|
||||
unsigned cleaner_set:1;
|
||||
unsigned max_age_set:1;
|
||||
unsigned metadata_only_set:1;
|
||||
unsigned pause_writeback_set:1;
|
||||
};
|
||||
|
||||
int dm_tree_node_add_writecache_target(struct dm_tree_node *node,
|
||||
|
@ -2679,6 +2679,10 @@ static int _writecache_emit_segment_line(struct dm_task *dmt,
|
||||
count += 1;
|
||||
if (seg->writecache_settings.max_age_set)
|
||||
count += 2;
|
||||
if (seg->writecache_settings.metadata_only_set)
|
||||
count += 1;
|
||||
if (seg->writecache_settings.pause_writeback_set)
|
||||
count += 2;
|
||||
if (seg->writecache_settings.new_key)
|
||||
count += 2;
|
||||
|
||||
@ -2730,6 +2734,14 @@ static int _writecache_emit_segment_line(struct dm_task *dmt,
|
||||
EMIT_PARAMS(pos, " max_age %u", seg->writecache_settings.max_age);
|
||||
}
|
||||
|
||||
if (seg->writecache_settings.metadata_only_set) {
|
||||
EMIT_PARAMS(pos, " metadata_only");
|
||||
}
|
||||
|
||||
if (seg->writecache_settings.pause_writeback_set) {
|
||||
EMIT_PARAMS(pos, " pause_writeback %u", seg->writecache_settings.pause_writeback);
|
||||
}
|
||||
|
||||
if (seg->writecache_settings.new_key) {
|
||||
EMIT_PARAMS(pos, " %s %s",
|
||||
seg->writecache_settings.new_key,
|
||||
|
@ -518,6 +518,14 @@ int writecache_settings_to_str_list(struct writecache_settings *settings, struct
|
||||
if (!_writecache_setting_str_list_add("max_age", (uint64_t)settings->max_age, NULL, result, mem))
|
||||
errors++;
|
||||
|
||||
if (settings->metadata_only_set)
|
||||
if (!_writecache_setting_str_list_add("metadata_only", (uint64_t)settings->metadata_only, NULL, result, mem))
|
||||
errors++;
|
||||
|
||||
if (settings->pause_writeback_set)
|
||||
if (!_writecache_setting_str_list_add("pause_writeback", (uint64_t)settings->pause_writeback, NULL, result, mem))
|
||||
errors++;
|
||||
|
||||
if (settings->new_key && settings->new_val)
|
||||
if (!_writecache_setting_str_list_add(settings->new_key, 0, settings->new_val, result, mem))
|
||||
errors++;
|
||||
|
@ -135,6 +135,18 @@ static int _writecache_text_import(struct lv_segment *seg,
|
||||
seg->writecache_settings.max_age_set = 1;
|
||||
}
|
||||
|
||||
if (dm_config_has_node(sn, "metadata_only")) {
|
||||
if (!dm_config_get_uint32(sn, "metadata_only", &seg->writecache_settings.metadata_only))
|
||||
return SEG_LOG_ERROR("Unknown writecache_setting in");
|
||||
seg->writecache_settings.metadata_only_set = 1;
|
||||
}
|
||||
|
||||
if (dm_config_has_node(sn, "pause_writeback")) {
|
||||
if (!dm_config_get_uint32(sn, "pause_writeback", &seg->writecache_settings.pause_writeback))
|
||||
return SEG_LOG_ERROR("Unknown writecache_setting in");
|
||||
seg->writecache_settings.pause_writeback_set = 1;
|
||||
}
|
||||
|
||||
if (dm_config_has_node(sn, "writecache_setting_key")) {
|
||||
const char *key;
|
||||
const char *val;
|
||||
@ -207,6 +219,14 @@ static int _writecache_text_export(const struct lv_segment *seg,
|
||||
outf(f, "max_age = %u", seg->writecache_settings.max_age);
|
||||
}
|
||||
|
||||
if (seg->writecache_settings.metadata_only_set) {
|
||||
outf(f, "metadata_only = %u", seg->writecache_settings.metadata_only);
|
||||
}
|
||||
|
||||
if (seg->writecache_settings.pause_writeback_set) {
|
||||
outf(f, "pause_writeback = %u", seg->writecache_settings.pause_writeback);
|
||||
}
|
||||
|
||||
if (seg->writecache_settings.new_key && seg->writecache_settings.new_val) {
|
||||
outf(f, "writecache_setting_key = \"%s\"",
|
||||
seg->writecache_settings.new_key);
|
||||
|
@ -340,6 +340,21 @@ perform. If not done beforehand, the splitcache command enables the
|
||||
cleaner mode and waits for flushing to complete before detaching the
|
||||
writecache. Adding cleaner=0 to the splitcache command will skip the
|
||||
cleaner mode, and any required flushing is performed in device suspend.
|
||||
.
|
||||
.TP
|
||||
max_age = <milliseconds>
|
||||
Specifies the maximum age of a block in milliseconds. If a block is stored in
|
||||
the cache for too long, it will be written to the underlying device and cleaned up.
|
||||
.
|
||||
.TP
|
||||
metadata_only = 0|1
|
||||
Only metadata is promoted to the cache. This option improves performance for
|
||||
heavier REQ_META workloads.
|
||||
.
|
||||
.TP
|
||||
pause_writeback = <milliseconds>
|
||||
Pause writeback if there was some write I/O redirected to the origin volume in
|
||||
the last number of milliseconds.
|
||||
|
||||
.SS dm-writecache using metadata profiles
|
||||
.
|
||||
|
@ -665,6 +665,16 @@ static int _lvchange_writecache(struct cmd_context *cmd,
|
||||
seg->writecache_settings.max_age = settings.max_age;
|
||||
set_count++;
|
||||
}
|
||||
if (settings.metadata_only_set) {
|
||||
seg->writecache_settings.metadata_only_set = settings.metadata_only_set;
|
||||
seg->writecache_settings.metadata_only = settings.metadata_only;
|
||||
set_count++;
|
||||
}
|
||||
if (settings.pause_writeback_set) {
|
||||
seg->writecache_settings.pause_writeback_set = settings.pause_writeback_set;
|
||||
seg->writecache_settings.pause_writeback = settings.pause_writeback;
|
||||
set_count++;
|
||||
}
|
||||
if (settings.new_key && settings.new_val) {
|
||||
seg->writecache_settings.new_key = settings.new_key;
|
||||
seg->writecache_settings.new_val = settings.new_val;
|
||||
|
@ -1473,6 +1473,20 @@ static int _get_one_writecache_setting(struct cmd_context *cmd, struct writecach
|
||||
return 1;
|
||||
}
|
||||
|
||||
if (!strncmp(key, "metadata_only", strlen("metadata_only"))) {
|
||||
if (sscanf(val, "%u", &settings->metadata_only) != 1)
|
||||
goto_bad;
|
||||
settings->metadata_only_set = 1;
|
||||
return 1;
|
||||
}
|
||||
|
||||
if (!strncmp(key, "pause_writeback", strlen("pause_writeback"))) {
|
||||
if (sscanf(val, "%u", &settings->pause_writeback) != 1)
|
||||
goto_bad;
|
||||
settings->pause_writeback_set = 1;
|
||||
return 1;
|
||||
}
|
||||
|
||||
if (settings->new_key) {
|
||||
log_error("Setting %s is not recognized. Only one unrecognized setting is allowed.", key);
|
||||
return 0;
|
||||
|
Loading…
x
Reference in New Issue
Block a user