From 318556486922addcd447f0b4d1df18f883b0d9b8 Mon Sep 17 00:00:00 2001 From: Krzysztof Majzerowicz-Jaszcz Date: Wed, 15 Sep 2021 15:53:29 +0200 Subject: [PATCH] Standby state API changes Don't print statistics for a cache in passive state Passive cache - casadm set/get cache param disabled in passive state Obsolete "cache_get_param" function removed Error in layer_cache_management.c fixed Flushing cache/core disabled with error for passive mode Core addition disabled in passive mode IO class setting disabled for passive mode Counters reset disabled for passive mode Ioctl handling changes to reflect OCF API changes Signed-off-by: Krzysztof Majzerowicz-Jaszcz --- casadm/cas_lib.c | 77 +++++++++++----------- casadm/statistics_model.c | 4 ++ modules/cas_cache/layer_cache_management.c | 43 +++++++----- ocf | 2 +- 4 files changed, 69 insertions(+), 57 deletions(-) diff --git a/casadm/cas_lib.c b/casadm/cas_lib.c index eec3e2a..4af403a 100644 --- a/casadm/cas_lib.c +++ b/casadm/cas_lib.c @@ -1138,8 +1138,12 @@ int get_cache_mode(int ctrl_fd, unsigned int cache_id, int *mode) cmd_info.cache_id = cache_id; if (ioctl(ctrl_fd, KCAS_IOCTL_CACHE_INFO, &cmd_info) < 0) - return FAILURE; + { + if (cmd_info.ext_err_code == OCF_ERR_CACHE_STANDBY) + cas_printf(LOG_ERR, "Cannot get cache mode while cache %d is in standby mode.", cmd_info.cache_id); + return FAILURE; + } *mode = cmd_info.info.cache_mode; return SUCCESS; } @@ -1202,6 +1206,10 @@ int set_cache_mode(unsigned int cache_mode, unsigned int cache_id, int flush) "of cache mode. If you want to switch cache mode immediately, use\n" "'--flush-cache no' parameter.\n"); return INTERRUPTED; + } else if (OCF_ERR_CACHE_STANDBY == cmd.ext_err_code) { + cas_printf(LOG_ERR, "Cannot change cache mode while cache %d is in standby mode\n", + cache_id); + return FAILURE; } else { cas_printf(LOG_ERR, "Error while setting cache state for cache %d\n", cache_id); @@ -1261,6 +1269,9 @@ int core_params_set(unsigned int cache_id, unsigned int core_id, if (run_ioctl(fd, KCAS_IOCTL_SET_CORE_PARAM, &cmd) < 0) { close(fd); + if (cmd.ext_err_code == OCF_ERR_CACHE_STANDBY) { + cas_printf(LOG_ERR, "Cannot set parameters for cache %d while in standby mode.\n", cmd.cache_id); + } return FAILURE; } } @@ -1359,6 +1370,9 @@ int cache_params_set(unsigned int cache_id, struct cas_param *params) cmd.param_value = params[i].value; if (run_ioctl(fd, KCAS_IOCTL_SET_CACHE_PARAM, &cmd) < 0) { + if (cmd.ext_err_code == OCF_ERR_CACHE_STANDBY) + cas_printf(LOG_ERR, "Cannot set cache parameters while cache %d is in standby mode\n", cmd.cache_id); + close(fd); return FAILURE; } @@ -1368,41 +1382,6 @@ int cache_params_set(unsigned int cache_id, struct cas_param *params) return SUCCESS; } -int cache_get_param(unsigned int cache_id, unsigned int param_id, - struct cas_param *param) -{ - struct kcas_get_cache_param cmd = { 0 }; - int fd = 0; - - if (param_id >= cache_param_id_max) - return FAILURE; - - fd = open_ctrl_device(); - if (fd == -1) - return FAILURE; - - cmd.param_id = param_id; - cmd.cache_id = cache_id; - - if (run_ioctl(fd, KCAS_IOCTL_GET_CACHE_PARAM, &cmd) < 0) { - if (cmd.ext_err_code == OCF_ERR_CACHE_NOT_EXIST) - cas_printf(LOG_ERR, "Cache id %d not running\n", cache_id); - else - cas_printf(LOG_ERR, "Can't get parameters\n"); - close(fd); - return FAILURE; - } - - if (param->transform_value) - param->value = param->transform_value(cmd.param_value); - else - param->value = cmd.param_value; - - close(fd); - - return SUCCESS; -} - int cache_params_get(unsigned int cache_id, struct cas_param *params, unsigned int output_format) { @@ -1434,6 +1413,8 @@ int cache_params_get(unsigned int cache_id, struct cas_param *params, if (run_ioctl(fd, KCAS_IOCTL_GET_CACHE_PARAM, &cmd) < 0) { if (cmd.ext_err_code == OCF_ERR_CACHE_NOT_EXIST) cas_printf(LOG_ERR, "Cache id %d not running\n", cache_id); + else if (cmd.ext_err_code == OCF_ERR_CACHE_STANDBY) + cas_printf(LOG_ERR, "Cannot get cache parameters while cache %d is in standby mode\n", cmd.cache_id); else cas_printf(LOG_ERR, "Can't get parameters\n"); fclose(intermediate_file[0]); @@ -1763,6 +1744,8 @@ int add_core(unsigned int cache_id, unsigned int core_id, const char *core_devic "accessing it or unmount the device.\n", user_core_path); } + } else if (OCF_ERR_CACHE_STANDBY == cmd.ext_err_code) { + cas_printf(LOG_ERR, "Cannot add core to cache %d in standby mode\n", cache_id); } else { print_err(cmd.ext_err_code); } @@ -1986,6 +1969,9 @@ int flush_cache(unsigned int cache_id) if (OCF_ERR_FLUSHING_INTERRUPTED == cmd.ext_err_code) { cas_printf(LOG_ERR, DIRTY_FLUSHING_WARNING); return INTERRUPTED; + } else if (OCF_ERR_CACHE_STANDBY == cmd.ext_err_code) { + cas_printf(LOG_ERR, "Cannot flush cache %d in standby mode\n", cmd.cache_id); + return FAILURE; } else { print_err(cmd.ext_err_code); return FAILURE; @@ -2012,9 +1998,15 @@ int purge_core(unsigned int cache_id, unsigned int core_id) /* synchronous flag */ if (run_ioctl_interruptible(fd, KCAS_IOCTL_PURGE_CORE, &cmd, "Purging core", cache_id, core_id) < 0) { close(fd); - print_err(cmd.ext_err_code); + + if (OCF_ERR_CACHE_STANDBY == cmd.ext_err_code) + cas_printf(LOG_ERR, "Cannot purge core while cache %d is in standby mode\n", cmd.cache_id); + else + print_err(cmd.ext_err_code); + return FAILURE; } + close(fd); return SUCCESS; } @@ -2430,6 +2422,9 @@ int partition_set_config(struct kcas_io_classes *cnfg) if (result) { if (OCF_ERR_IO_CLASS_NOT_EXIST == cnfg->ext_err_code) { result = SUCCESS; + } else if (OCF_ERR_CACHE_STANDBY == cnfg->ext_err_code) { + cas_printf(LOG_ERR, "Cannot set IO class config for cache %d while in standby mode.\n", cnfg->cache_id); + result = FAILURE; } else { print_err(cnfg->ext_err_code); result = FAILURE; @@ -2504,9 +2499,13 @@ int reset_counters(unsigned int cache_id, unsigned int core_id) cmd.core_id = core_id; if (ioctl(fd, KCAS_IOCTL_RESET_STATS, &cmd) < 0) { + if (OCF_ERR_CACHE_STANDBY == cmd.ext_err_code) { + cas_printf(LOG_ERR, "Cannot reset statistics for cache %d while in standby mode.\n", cmd.cache_id); + } else { + cas_printf(LOG_ERR, "Error encountered while resetting counters\n"); + print_err(cmd.ext_err_code); + } close(fd); - cas_printf(LOG_ERR, "Error encountered while reseting counters\n"); - print_err(cmd.ext_err_code); return FAILURE; } diff --git a/casadm/statistics_model.c b/casadm/statistics_model.c index 20beeaf..5a9db61 100644 --- a/casadm/statistics_model.c +++ b/casadm/statistics_model.c @@ -628,6 +628,10 @@ static int cache_stats(int ctrl_fd, const struct kcas_cache_info *cache_info, if (stats_filters & STATS_FILTER_CONF) cache_stats_conf(ctrl_fd, cache_info, cache_id, outfile, by_id_path); + /* Don't print stats for a cache in standby state */ + if (cache_info->info.state & (1 << ocf_cache_state_standby)) + return SUCCESS; + if (stats_filters & STATS_FILTER_USAGE) print_usage_stats(&cache_stats.usage, outfile); diff --git a/modules/cas_cache/layer_cache_management.c b/modules/cas_cache/layer_cache_management.c index 1b10156..959c160 100644 --- a/modules/cas_cache/layer_cache_management.c +++ b/modules/cas_cache/layer_cache_management.c @@ -778,6 +778,11 @@ int cache_mngt_purge_object(const char *cache_name, size_t cache_name_len, if (result) return result; + if (ocf_cache_is_standby(cache)) { + ocf_mngt_cache_put(cache); + return -OCF_ERR_CACHE_STANDBY; + } + result = _cache_mngt_read_lock_sync(cache); if (result) { ocf_mngt_cache_put(cache); @@ -989,7 +994,7 @@ int cache_mngt_get_promotion_policy(ocf_cache_t cache, uint32_t *type) return result; } - *type = ocf_mngt_cache_promotion_get_policy(cache); + result = ocf_mngt_cache_promotion_get_policy(cache, type); ocf_mngt_cache_read_unlock(cache); return result; @@ -1156,29 +1161,34 @@ int cache_mngt_prepare_core_cfg(struct ocf_mngt_core_config *cfg, struct kcas_insert_core *cmd_info) { char core_name[OCF_CORE_NAME_SIZE] = {}; - ocf_cache_t cache; + ocf_cache_t cache = NULL; uint16_t core_id; int result; if (strnlen(cmd_info->core_path_name, MAX_STR_LEN) >= MAX_STR_LEN) return -OCF_ERR_INVAL; + result = mngt_get_cache_by_id(cas_ctx, cmd_info->cache_id, &cache); + if (result && result != -OCF_ERR_CACHE_NOT_EXIST) { + return result; + } else if (!result && ocf_cache_is_standby(cache)) { + ocf_mngt_cache_put(cache); + return -OCF_ERR_CACHE_STANDBY; + } + if (cmd_info->core_id == OCF_CORE_MAX) { - result = mngt_get_cache_by_id(cas_ctx, cmd_info->cache_id, - &cache); - if (result && result != -OCF_ERR_CACHE_NOT_EXIST) { - return result; - } else if (!result) { - struct cache_priv *cache_priv; - cache_priv = ocf_cache_get_priv(cache); - ocf_mngt_cache_put(cache); + struct cache_priv *cache_priv; + cache_priv = ocf_cache_get_priv(cache); + core_id = find_free_core_id(cache_priv->core_id_bitmap); + if (core_id == OCF_CORE_MAX) + return -OCF_ERR_INVAL; - core_id = find_free_core_id(cache_priv->core_id_bitmap); - if (core_id == OCF_CORE_MAX) - return -OCF_ERR_INVAL; + cmd_info->core_id = core_id; + } - cmd_info->core_id = core_id; - } + if (cache) { + ocf_mngt_cache_put(cache); + cache = NULL; } snprintf(core_name, sizeof(core_name), "core%d", cmd_info->core_id); @@ -1627,7 +1637,7 @@ int cache_mngt_reset_stats(const char *cache_name, size_t cache_name_len, ocf_core_stats_initialize(core); } else { - ocf_core_stats_initialize_all(cache); + result = ocf_core_stats_initialize_all(cache); } out: @@ -3194,7 +3204,6 @@ int cache_mngt_get_cache_params(struct kcas_get_cache_param *info) result = cache_mngt_get_cleaning_policy(cache, &info->param_value); break; - case cache_param_cleaning_alru_wake_up_time: result = cache_mngt_get_cleaning_param(cache, ocf_cleaning_alru, ocf_alru_wake_up_time, diff --git a/ocf b/ocf index 7b12016..12c8b4e 160000 --- a/ocf +++ b/ocf @@ -1 +1 @@ -Subproject commit 7b120162a573868221a3f66366ecbf2e1f4b90be +Subproject commit 12c8b4e333d7472f55f277195418db3df8ba6e2d