Recovery on passive start
Adjust recovery procedure to allow rebuilding metadata from partialy valid metadata Signed-off-by: Michal Mielewczyk <michal.mielewczyk@intel.com>
This commit is contained in:
parent
11dacd6a84
commit
6d4e6af5b6
@ -500,34 +500,35 @@ static void _recovery_reset_cline_metadata(struct ocf_cache *cache,
|
|||||||
ocf_cleaning_init_cache_block(cache, cline);
|
ocf_cleaning_init_cache_block(cache, cline);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void _ocf_mngt_recovery_rebuild_metadata(ocf_cache_t cache)
|
static void _ocf_mngt_rebuild_metadata(ocf_cache_t cache, bool initialized)
|
||||||
{
|
{
|
||||||
ocf_cache_line_t cline;
|
ocf_cache_line_t cline;
|
||||||
ocf_core_id_t core_id;
|
ocf_core_id_t core_id;
|
||||||
uint64_t core_line;
|
uint64_t core_line;
|
||||||
unsigned char step = 0;
|
unsigned char step = 0;
|
||||||
bool dirty_only = !ocf_volume_is_atomic(ocf_cache_get_volume(cache));
|
|
||||||
const uint64_t collision_table_entries =
|
const uint64_t collision_table_entries =
|
||||||
ocf_metadata_collision_table_entries(cache);
|
ocf_metadata_collision_table_entries(cache);
|
||||||
|
|
||||||
ocf_metadata_start_exclusive_access(&cache->metadata.lock);
|
ocf_metadata_start_exclusive_access(&cache->metadata.lock);
|
||||||
|
|
||||||
for (cline = 0; cline < collision_table_entries; cline++) {
|
for (cline = 0; cline < collision_table_entries; cline++) {
|
||||||
ocf_metadata_get_core_info(cache, cline, &core_id, &core_line);
|
bool any_valid = true;
|
||||||
if (core_id != OCF_CORE_MAX &&
|
|
||||||
(!dirty_only || metadata_test_dirty(cache,
|
|
||||||
cline))) {
|
|
||||||
/* Rebuild metadata for mapped cache line */
|
|
||||||
ocf_cline_rebuild_metadata(cache, core_id,
|
|
||||||
core_line, cline);
|
|
||||||
if (dirty_only)
|
|
||||||
metadata_clear_valid_if_clean(cache, cline);
|
|
||||||
} else {
|
|
||||||
/* Reset metadata for not mapped or clean cache line */
|
|
||||||
_recovery_reset_cline_metadata(cache, cline);
|
|
||||||
}
|
|
||||||
|
|
||||||
OCF_COND_RESCHED(step, 128);
|
OCF_COND_RESCHED(step, 128);
|
||||||
|
ocf_metadata_get_core_info(cache, cline, &core_id, &core_line);
|
||||||
|
|
||||||
|
if (!initialized)
|
||||||
|
metadata_clear_dirty_if_invalid(cache, cline);
|
||||||
|
|
||||||
|
any_valid = metadata_clear_valid_if_clean(cache, cline);
|
||||||
|
if (!any_valid || core_id >= OCF_CORE_MAX) {
|
||||||
|
/* Reset metadata for not mapped or clean cache line */
|
||||||
|
_recovery_reset_cline_metadata(cache, cline);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Rebuild metadata for mapped cache line */
|
||||||
|
ocf_cline_rebuild_metadata(cache, core_id, core_line, cline);
|
||||||
}
|
}
|
||||||
|
|
||||||
ocf_metadata_end_exclusive_access(&cache->metadata.lock);
|
ocf_metadata_end_exclusive_access(&cache->metadata.lock);
|
||||||
@ -2035,6 +2036,18 @@ static void _ocf_mngt_bind_init_attached_structures(ocf_pipeline_t pipeline,
|
|||||||
ocf_pipeline_next(context->pipeline);
|
ocf_pipeline_next(context->pipeline);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void _ocf_mngt_bind_recovery_unsafe(ocf_pipeline_t pipeline,
|
||||||
|
void *priv, ocf_pipeline_arg_t arg)
|
||||||
|
{
|
||||||
|
struct ocf_cache_attach_context *context = priv;
|
||||||
|
ocf_cache_t cache = context->cache;
|
||||||
|
|
||||||
|
_ocf_mngt_bind_rebuild_metadata(cache);
|
||||||
|
__populate_free_unsafe(cache);
|
||||||
|
|
||||||
|
ocf_pipeline_next(pipeline);
|
||||||
|
}
|
||||||
|
|
||||||
static void _ocf_mngt_bind_post_init(ocf_pipeline_t pipeline,
|
static void _ocf_mngt_bind_post_init(ocf_pipeline_t pipeline,
|
||||||
void *priv, ocf_pipeline_arg_t arg)
|
void *priv, ocf_pipeline_arg_t arg)
|
||||||
{
|
{
|
||||||
@ -2060,6 +2073,7 @@ struct ocf_pipeline_properties _ocf_mngt_cache_standby_pipeline_properties = {
|
|||||||
OCF_PL_STEP(_ocf_mngt_attach_prepare_metadata),
|
OCF_PL_STEP(_ocf_mngt_attach_prepare_metadata),
|
||||||
OCF_PL_STEP(_ocf_mngt_load_metadata_unsafe),
|
OCF_PL_STEP(_ocf_mngt_load_metadata_unsafe),
|
||||||
OCF_PL_STEP(_ocf_mngt_bind_init_attached_structures),
|
OCF_PL_STEP(_ocf_mngt_bind_init_attached_structures),
|
||||||
|
OCF_PL_STEP(_ocf_mngt_bind_recovery_unsafe),
|
||||||
OCF_PL_STEP(_ocf_mngt_bind_post_init),
|
OCF_PL_STEP(_ocf_mngt_bind_post_init),
|
||||||
OCF_PL_STEP_TERMINATOR(),
|
OCF_PL_STEP_TERMINATOR(),
|
||||||
},
|
},
|
||||||
|
Loading…
Reference in New Issue
Block a user