Hi , On 11/25/2016 4:24 PM, Vo Minh Hoang wrote: > Maybe too much but would you please help me the solution to check > cpnd_sec_hdr_update() result in this case. Ok I will provide.
-AVM On 11/25/2016 4:24 PM, Vo Minh Hoang wrote: > Dear Mahesh, > > Thank you very much for your comment. > > Maybe too much but would you please help me the solution to check > cpnd_sec_hdr_update() result in this case. > > Calling it again is not really good when in case of insufficient resource > like now, the first call can return error but the second call after that > might return OK. > cpnd_ckpt_sec_del() itself do not have params that carry error information. > Global variable is should not be used also. > > Sincerely, > Hoang > > > -----Original Message----- > From: A V Mahesh [mailto:mahesh.va...@oracle.com] > Sent: Friday, November 25, 2016 5:37 PM > To: Vo Minh Hoang <hoang.m...@dektech.com.au> > Cc: opensaf-devel@lists.sourceforge.net > Subject: Re: [devel] [PATCH 1 of 1] cpnd: fix error handling while > section_hdr_update_fail [#2207] > > Hi Hoang, > > The better approach will be , keep existing cpnd_ckpt_sec_del() as it is, > keep condition , avoid functionality the that are not required in > cpnd_ckpt_sec_del(), in case of cpnd_sec_hdr_update() failure . > > -AVM > > On 11/25/2016 3:58 PM, Vo Minh Hoang wrote: >> Dear Mahesh, >> >> Thank you very much for your review and comments. >> I understood that I missed the point at n_secs calculation. >> >> Because checking cpnd_sec_hdr_update() result by calling it again is >> quite weird. >> Is that acceptable if I move n_secs-- part to cpnd_ckpt_sec_del_db() >> function? something like this: >> ====================================================================== >> ====== >> ======== >> >> .......... >> if (localSecMap) { >> if (sectionInfo) { >> LocalSectionIdMap::iterator >> it(localSecMap->find(sectionInfo->lcl_sec_id)); >> >> if (it != localSecMap->end()) >> localSecMap->erase(it); >> } >> } >> else { >> LOG_ER("can't find local sec map in cpnd_ckpt_sec_del"); >> osafassert(false); >> } >> // Move following: >> if (sectionInfo) { >> cp_node->replica_info.n_secs--; >> cp_node->replica_info.mem_used = cp_node->replica_info.mem_used - >> (sectionInfo->sec_size); >> } >> ........... >> >> ====================================================================== >> ====== >> ======= >> The ideal is that cpnd_ckpt_sec_del() keep original >> the cpnd_ckpt_sec_del_db() is revert of action before > cpnd_sec_hdr_update() >> cpnd_ckpt_sec_del_db() can be called after cpnd_ckpt_sec_del() many >> time without affecting system. >> >> Please consider and tell me your judgement. >> Best regards, >> Hoang >> >> -----Original Message----- >> From: Vo Minh Hoang [mailto:hoang.m...@dektech.com.au] >> Sent: Friday, November 25, 2016 5:14 PM >> To: 'A V Mahesh' <mahesh.va...@oracle.com> >> Cc: opensaf-devel@lists.sourceforge.net >> Subject: Re: [devel] [PATCH 1 of 1] cpnd: fix error handling while >> section_hdr_update_fail [#2207] >> >> Dear Mahesh, >> >> Thank you very much for your review and comments. >> I understood that I missed the point at n_secs calculation. >> >> Because checking cpnd_sec_hdr_update() >> >> -----Original Message----- >> From: A V Mahesh [mailto:mahesh.va...@oracle.com] >> Sent: Friday, November 25, 2016 3:28 PM >> To: Vo Minh Hoang <hoang.m...@dektech.com.au> >> Cc: anders.wid...@ericsson.com; opensaf-devel@lists.sourceforge.net >> Subject: Re: [PATCH 1 of 1] cpnd: fix error handling while >> section_hdr_update_fail [#2207] >> >> Hi Hoang, >> >> >>I am sorry that I cannot find the ER that you point out. >> >> Ok I understand that `map & localSecMap` will not become become null >> even all elements are removed in fist attempt of >> cpnd_ckpt_sec_del_db() invocation, so we will not core dump. >> >> But section DB still corrupted, because of cpnd_ckpt_sec_de() function >> split ( this patch ) >> >> Irrelevant of cpnd_sec_hdr_update() success or failure, the >> `cp_node->replica_info.n_secs++;` was occurring before >> cpnd_sec_hdr_update(), so we need to do >> `cp_node->replica_info.n_secs--;` >> >> If cpnd_sec_hdr_update() successful and cpnd_ckpt_hdr_update() fails, >> we also need to do roll-backing SECTION HEADER with roll backed >> sectionInfo , so we need to UPDATE THE SECTION HEADER. >> >> If you see original cpnd_ckpt_sec_del() function this is required >> irrelevant of cpnd_sec_hdr_update() success or failure >> ====================================================================== >> ====== >> ======================= >> if (sectionInfo) { >> cp_node->replica_info.n_secs--; >> cp_node->replica_info.mem_used = cp_node->replica_info.mem_used >> - (sectionInfo->sec_size); >> >> // UPDATE THE SECTION HEADER >> uint32_t rc(cpnd_sec_hdr_update(sectionInfo, cp_node)); >> if (rc == NCSCC_RC_FAILURE) { >> TRACE_4("cpnd sect hdr update failed"); >> } >> ====================================================================== >> ====== >> ======================= >> >> So splitting the function is not required you need to only ensure >> cpnd_ckpt_hdr_update() done or not yet done put some filter and do >> UPDATE THE CHECKPOINT HEADER based on >> cpnd_ckpt_hdr_update() >> ====================================================================== >> ====== >> ======================= >> >> if ( cpnd_ckpt_hdr_update() == was successful ) { // UPDATE THE >> CHECKPOINT HEADER >> rc = cpnd_ckpt_hdr_update(cp_node); >> if (rc == NCSCC_RC_FAILURE) { >> TRACE_4("cpnd ckpt hdr update failed"); >> } >> } >> ====================================================================== >> ====== >> ======================= >> >> -AVM >> >> >> On 11/25/2016 12:08 PM, Vo Minh Hoang wrote: >>> Dear Mahesh, >>> >>> The first call erase a element with id from map. >>> The second call with same id, no element found so iterator will point >>> to >>> map->end(). >>> Because of that map->erase() does not execute. >>> >>> I am sorry that I cannot find the ER that you point out. >>> >>> Sincerely, >>> Hoang >>> >>> -----Original Message----- >>> From: A V Mahesh [mailto:mahesh.va...@oracle.com] >>> Sent: Friday, November 25, 2016 1:20 PM >>> To: Vo Minh Hoang <hoang.m...@dektech.com.au> >>> Cc: anders.wid...@ericsson.com; opensaf-devel@lists.sourceforge.net >>> Subject: Re: [PATCH 1 of 1] cpnd: fix error handling while >>> section_hdr_update_fail [#2207] >>> >>> Hi Hoang, >>> >>> The second invocation of cpnd_ckpt_sec_del_db() with generate code dump. >>> >>> ============================================================= >>> >>> SectionMap *map(static_cast<SectionMap >>> *>(cp_node->replica_info.section_db)); >>> >>> if (map) { >>> SectionMap::iterator it(map->find(id)); >>> >>> if (it != map->end()) { >>> sectionInfo = it->second; >>> map->erase(it); >>> } >>> } >>> else { >>> LOG_ER("can't find map in cpnd_ckpt_sec_del"); >>> *osafassert(false);* >>> } >>> ============================================================= >>> >>> >>> -AVM >>> >>> On 11/25/2016 11:16 AM, Vo Minh Hoang wrote: >>>> 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 >> > ------------------------------------------------------------------------------ _______________________________________________ Opensaf-devel mailing list Opensaf-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/opensaf-devel