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

Reply via email to