osaf/services/saf/cpsv/cpd/cpd_db.c | 15 +++++++++++++++ osaf/services/saf/cpsv/cpd/cpd_proc.c | 18 ++++++++++++++++-- 2 files changed, 31 insertions(+), 2 deletions(-)
problem: In case a failover happens while a checkpoint is being unlinked, it might causes an unfinished unlink operation (i.e the checkpoint IMM object is not deleted). Later on, when the checkpoint is created again, it will not succeed because the CPD detects that the checkpoint IMM object existing. Fix: - When error occur delete the existing checkpoint IMM object and re-create new one. - Stop timer of removed node. - Update data in patricia trees. diff --git a/osaf/services/saf/cpsv/cpd/cpd_db.c b/osaf/services/saf/cpsv/cpd/cpd_db.c --- a/osaf/services/saf/cpsv/cpd/cpd_db.c +++ b/osaf/services/saf/cpsv/cpd/cpd_db.c @@ -104,6 +104,21 @@ uint32_t cpd_ckpt_node_add(NCS_PATRICIA_ /*create the imm runtime object */ if (ha_state == SA_AMF_HA_ACTIVE) { err = create_runtime_ckpt_object(ckpt_node, immOiHandle); + + /* The Checkpoint IMM object exist due to unfinished previous opernation (e.g unlink) + * The action is to delete the old object and create a new one */ + + if (err == SA_AIS_ERR_EXIST) { + LOG_WA("cpd ckpt node add - the IMM object exits %s", ckpt_node->ckpt_name); + + if (delete_runtime_ckpt_object(ckpt_node, immOiHandle) != SA_AIS_OK) { + LOG_ER("Deleting run time object %s FAILED", ckpt_node->ckpt_name); + return NCSCC_RC_FAILURE; + } + + err = create_runtime_ckpt_object(ckpt_node, immOiHandle); + } + if (err != SA_AIS_OK) { LOG_ER("create runtime ckpt object failed with error: %u",err); if (err == SA_AIS_ERR_INVALID_PARAM) { diff --git a/osaf/services/saf/cpsv/cpd/cpd_proc.c b/osaf/services/saf/cpsv/cpd/cpd_proc.c --- a/osaf/services/saf/cpsv/cpd/cpd_proc.c +++ b/osaf/services/saf/cpsv/cpd/cpd_proc.c @@ -348,7 +348,8 @@ uint32_t cpd_ckpt_db_entry_update(CPD_CB proc_rc = cpd_ckpt_reploc_node_add(&cb->ckpt_reploc_tree, reploc_info, cb->ha_state, cb->immOiHandle); if (proc_rc != NCSCC_RC_SUCCESS) { /* goto reploc_node_add_fail; */ - TRACE_4("cpd db add failed "); + LOG_ER("cpd db replica add failed "); + goto replica_node_add_fail; } } @@ -367,6 +368,10 @@ uint32_t cpd_ckpt_db_entry_update(CPD_CB TRACE_LEAVE(); return NCSCC_RC_SUCCESS; + replica_node_add_fail: + cpd_ckpt_node_delete(cb, ckpt_node); + ckpt_node = NULL; + ckpt_node_add_fail: cpd_ckpt_map_node_delete(cb, map_info); map_info = NULL; @@ -679,7 +684,8 @@ uint32_t cpd_process_cpnd_down(CPD_CB *c cpd_cpnd_info_node_find_add(&cb->cpnd_tree, cpnd_dest, &cpnd_info, &add_flag); if (!cpnd_info) return NCSCC_RC_SUCCESS; - + /* Stop timer before processing down */ + cpd_tmr_stop(&cpnd_info->cpnd_ret_timer); cref_info = cpnd_info->ckpt_ref_list; while (cref_info) { @@ -984,6 +990,14 @@ uint32_t cpd_proc_retention_set(CPD_CB * /* Update the retention Time */ (*ckpt_node)->ret_time = reten_time; + (*ckpt_node)->attributes.retentionDuration = reten_time; + + /* Update the related patricia tree */ + CPD_CKPT_MAP_INFO *map_info = NULL; + cpd_ckpt_map_node_get(&cb->ckpt_map_tree, (*ckpt_node)->ckpt_name, &map_info); + if (map_info) { + map_info->attributes.retentionDuration = reten_time; + } return rc; } ------------------------------------------------------------------------------ Check out the vibrant tech community on one of the world's most engaging tech sites, SlashDot.org! http://sdm.link/slashdot _______________________________________________ Opensaf-devel mailing list Opensaf-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/opensaf-devel