Dear Mahesh, Thank you very much for your comment.
Would you please verify again my understanding about this. Old cpnd_ckpt_sec_del() function and new cpnd_ckpt_sec_del_db() search for the sectionInfo in 2 maps by its id and remove if found. In case ckpt_hdr_update_fails, the cpnd_ckpt_sec_del_db() is called twice, the first one remove sectionInfo from maps, the second one does not found sectionInfo and cannot remove anything, will not generate error. Sincerely, Hoang -----Original Message----- From: A V Mahesh [mailto:mahesh.va...@oracle.com] Sent: Friday, November 25, 2016 12:12 PM To: Hoang Vo <hoang.m...@dektech.com.au>; anders.wid...@ericsson.com Cc: opensaf-devel@lists.sourceforge.net Subject: Re: [PATCH 1 of 1] cpnd: fix error handling while section_hdr_update_fail [#2207] Hi Hoang, NACK This patch has some fundamental problem, this will corrupt the cpsv database . This patch instead of resolving the issue , increase the percentage of problem occurrence . Basically this patch splits cpnd_ckpt_sec_del() in to two parts cpnd_ckpt_sec_del_db() & cpnd_ckpt_sec_del() and the new cpnd_ckpt_sec_del() invokes cpnd_ckpt_sec_del_db() to fullfil the old function behavior , so that to support other old invocations and changed the error cleanup in cpnd_ckpt_sec_add() as follows : ckpt_hdr_update_fails: cpnd_ckpt_sec_del(cp_node, id); section_hdr_update_fails: cpnd_ckpt_sec_del_db(cp_node, id); This means cpnd_ckpt_sec_del_db() is always called twice in case of ckpt_hdr_update_fails , which will generate core -AVM On 11/24/2016 3:26 PM, Hoang Vo wrote: > osaf/libs/common/cpsv/include/cpnd_sec.h | 3 +++ > osaf/services/saf/cpsv/cpnd/cpnd_db.c | 4 +++- > osaf/services/saf/cpsv/cpnd/cpnd_sec.cc | 31 +++++++++++++++++++++++++++---- > 3 files changed, 33 insertions(+), 5 deletions(-) > > > problem: > the steps to add a section is add_db_tree -> update_sec_hdr -> > update_ckpt_hdr so if an error occur cpsv should handle error in reverse order. > currently, section_hdr_update_fails, cpsv revert ckpt_hdr also that > case error > > solution: > only revert db_tree in case section_hdr_update_fails > > diff --git a/osaf/libs/common/cpsv/include/cpnd_sec.h > b/osaf/libs/common/cpsv/include/cpnd_sec.h > --- a/osaf/libs/common/cpsv/include/cpnd_sec.h > +++ b/osaf/libs/common/cpsv/include/cpnd_sec.h > @@ -39,6 +39,9 @@ CPND_CKPT_SECTION_INFO * > cpnd_ckpt_sec_get_create(const CPND_CKPT_NODE *, const > SaCkptSectionIdT *); > > CPND_CKPT_SECTION_INFO * > +cpnd_ckpt_sec_del_db(CPND_CKPT_NODE *, SaCkptSectionIdT *); > + > +CPND_CKPT_SECTION_INFO * > cpnd_ckpt_sec_del(CPND_CKPT_NODE *, SaCkptSectionIdT *); > > CPND_CKPT_SECTION_INFO * > diff --git a/osaf/services/saf/cpsv/cpnd/cpnd_db.c > b/osaf/services/saf/cpsv/cpnd/cpnd_db.c > --- a/osaf/services/saf/cpsv/cpnd/cpnd_db.c > +++ b/osaf/services/saf/cpsv/cpnd/cpnd_db.c > @@ -468,10 +468,12 @@ CPND_CKPT_SECTION_INFO *cpnd_ckpt_sec_ad > TRACE_LEAVE(); > return pSecPtr; > > - section_hdr_update_fails: > ckpt_hdr_update_fails: > cpnd_ckpt_sec_del(cp_node, id); > > + section_hdr_update_fails: > + cpnd_ckpt_sec_del_db(cp_node, id); > + > section_add_fails: > if (pSecPtr->sec_id.id != NULL) > m_MMGR_FREE_CPND_DEFAULT(pSecPtr->sec_id.id); > diff --git a/osaf/services/saf/cpsv/cpnd/cpnd_sec.cc > b/osaf/services/saf/cpsv/cpnd/cpnd_sec.cc > --- a/osaf/services/saf/cpsv/cpnd/cpnd_sec.cc > +++ b/osaf/services/saf/cpsv/cpnd/cpnd_sec.cc > @@ -157,19 +157,19 @@ cpnd_ckpt_sec_find(const CPND_CKPT_NODE > } > > /*************************************************************************** * > - * Name : cpnd_ckpt_sec_del > + * Name : cpnd_ckpt_sec_del_db > * > - * Description : Function to remove the section from a checkpoint. > + * Description : Function to remove the section from a checkpoint map db. > * > * Arguments : CPND_CKPT_NODE *cp_node - Check point node. > * : SaCkptSectionIdT id - Section Identifier > - * > + * > * Return Values : ptr to CPND_CKPT_SECTION_INFO/NULL; > * > * Notes : None. > **************************************************************************** */ > CPND_CKPT_SECTION_INFO * > -cpnd_ckpt_sec_del(CPND_CKPT_NODE *cp_node, SaCkptSectionIdT *id) > +cpnd_ckpt_sec_del_db(CPND_CKPT_NODE *cp_node, SaCkptSectionIdT *id) > { > CPND_CKPT_SECTION_INFO *sectionInfo(0); > > @@ -206,6 +206,29 @@ cpnd_ckpt_sec_del(CPND_CKPT_NODE *cp_nod > osafassert(false); > } > > + TRACE_LEAVE(); > + > + return sectionInfo; > +} > + > +/************************************************************************** ** > + * Name : cpnd_ckpt_sec_del > + * > + * Description : Function to remove the section from a checkpoint. > + * > + * Arguments : CPND_CKPT_NODE *cp_node - Check point node. > + * : SaCkptSectionIdT id - Section Identifier > + * > + * Return Values : ptr to CPND_CKPT_SECTION_INFO/NULL; > + * > + * Notes : None. > + > +********************************************************************* > +********/ > +CPND_CKPT_SECTION_INFO * > +cpnd_ckpt_sec_del(CPND_CKPT_NODE *cp_node, SaCkptSectionIdT *id) { > + TRACE_ENTER(); > + CPND_CKPT_SECTION_INFO *sectionInfo = cpnd_ckpt_sec_del_db(cp_node, > +id); > + > if (sectionInfo) { > cp_node->replica_info.n_secs--; > cp_node->replica_info.mem_used = cp_node->replica_info.mem_used > - (sectionInfo->sec_size); ------------------------------------------------------------------------------ _______________________________________________ Opensaf-devel mailing list Opensaf-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/opensaf-devel