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
[email protected]
https://lists.sourceforge.net/lists/listinfo/opensaf-devel