osaf/libs/common/cpsv/include/cpnd_sec.h |   2 +-
 osaf/services/saf/cpsv/cpnd/cpnd_db.c    |   5 ++++-
 osaf/services/saf/cpsv/cpnd/cpnd_evt.c   |   8 ++++----
 osaf/services/saf/cpsv/cpnd/cpnd_proc.c  |   2 +-
 osaf/services/saf/cpsv/cpnd/cpnd_sec.cc  |  25 ++++++++++++++-----------
 5 files changed, 24 insertions(+), 18 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,7 +39,7 @@ CPND_CKPT_SECTION_INFO *
 cpnd_ckpt_sec_get_create(const CPND_CKPT_NODE *, const SaCkptSectionIdT *);
 
 CPND_CKPT_SECTION_INFO *
-cpnd_ckpt_sec_del(CPND_CKPT_NODE *, SaCkptSectionIdT *);
+cpnd_ckpt_sec_del(CPND_CKPT_NODE *, SaCkptSectionIdT *, bool);
 
 CPND_CKPT_SECTION_INFO *
 cpnd_get_sect_with_id(const CPND_CKPT_NODE *, uint32_t lcl_sec_id);
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
@@ -391,6 +391,7 @@ CPND_CKPT_SECTION_INFO *cpnd_ckpt_sec_ad
        int32_t lcl_sec_id = 0;
        uint32_t rc = NCSCC_RC_SUCCESS;
        uint32_t value = 0, i = 0, j = 0;
+       bool hdr_update = true;
 
        TRACE_ENTER();
        /* get the lcl_sec_id */
@@ -469,8 +470,10 @@ CPND_CKPT_SECTION_INFO *cpnd_ckpt_sec_ad
        return pSecPtr;
 
  section_hdr_update_fails:
+       hdr_update = false;
+
  ckpt_hdr_update_fails:
-       cpnd_ckpt_sec_del(cp_node, id);
+       cpnd_ckpt_sec_del(cp_node, id, hdr_update);
 
  section_add_fails:
        if (pSecPtr->sec_id.id != NULL) 
diff --git a/osaf/services/saf/cpsv/cpnd/cpnd_evt.c 
b/osaf/services/saf/cpsv/cpnd/cpnd_evt.c
--- a/osaf/services/saf/cpsv/cpnd/cpnd_evt.c
+++ b/osaf/services/saf/cpsv/cpnd/cpnd_evt.c
@@ -2357,12 +2357,12 @@ static uint32_t cpnd_evt_proc_ckpt_sect_
                                                                /* delete the 
section */
                                                                if (gen_sec_id)
                                                                        
tmp_sec_info =
-                                                                       
cpnd_ckpt_sec_del(cp_node, &sec_info->sec_id);
+                                                                       
cpnd_ckpt_sec_del(cp_node, &sec_info->sec_id, true);
                                                                else
                                                                        
tmp_sec_info =
                                                                        
cpnd_ckpt_sec_del(cp_node,
                                                                                
        evt->info.sec_creatReq.
-                                                                               
        sec_attri.sectionId);
+                                                                               
        sec_attri.sectionId, true);
 
                                                                if 
(tmp_sec_info == sec_info) {
                                                                        
cp_node->replica_info.
@@ -2494,7 +2494,7 @@ static uint32_t cpnd_evt_proc_ckpt_sect_
        rc = cpnd_ckpt_sec_find(cp_node, &evt->info.sec_delReq.sec_id);
        if (rc == NCSCC_RC_SUCCESS) {
 
-               sec_info = cpnd_ckpt_sec_del(cp_node, 
&evt->info.sec_delReq.sec_id);
+               sec_info = cpnd_ckpt_sec_del(cp_node, 
&evt->info.sec_delReq.sec_id, true);
                /* resetting lcl_sec_id mapping */
                if (sec_info == NULL) {
                        rc = NCSCC_RC_FAILURE;
@@ -2774,7 +2774,7 @@ static uint32_t cpnd_evt_proc_nd2nd_ckpt
                send_evt.info.cpnd.info.sec_delete_rsp.error = 
SA_AIS_ERR_TRY_AGAIN;
                goto nd_rsp;
        }
-       sec_info = cpnd_ckpt_sec_del(cp_node, &evt->info.sec_delete_req.sec_id);
+       sec_info = cpnd_ckpt_sec_del(cp_node, &evt->info.sec_delete_req.sec_id, 
true);
        if (sec_info == NULL) {
                if 
(m_CPND_IS_COLLOCATED_ATTR_SET(cp_node->create_attrib.creationFlags)) {
                        TRACE_4("cpnd ckpt sect del failed for 
sec_id:%s,ckpt_id:%llx",
diff --git a/osaf/services/saf/cpsv/cpnd/cpnd_proc.c 
b/osaf/services/saf/cpsv/cpnd/cpnd_proc.c
--- a/osaf/services/saf/cpsv/cpnd/cpnd_proc.c
+++ b/osaf/services/saf/cpsv/cpnd/cpnd_proc.c
@@ -1544,7 +1544,7 @@ uint32_t cpnd_proc_sec_expiry(CPND_CB *c
                return NCSCC_RC_FAILURE;
        }
 
-       cpnd_ckpt_sec_del(cp_node, &pSec_info->sec_id);
+       cpnd_ckpt_sec_del(cp_node, &pSec_info->sec_id, true);
        cp_node->replica_info.shm_sec_mapping[pSec_info->lcl_sec_id] = 1;
 
        /* send out destory to all cpnd's maintaining this ckpt */
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
@@ -163,13 +163,14 @@ cpnd_ckpt_sec_find(const CPND_CKPT_NODE 
  *
  * Arguments     : CPND_CKPT_NODE *cp_node - Check point node.
  *               : SaCkptSectionIdT id - Section Identifier
- *                 
+ *               : hdr_update - UPDATE THE SECTION/CHECKPOINT HEADER or NOT
+ *
  * 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(CPND_CKPT_NODE *cp_node, SaCkptSectionIdT *id, bool 
hdr_update)
 {
   CPND_CKPT_SECTION_INFO *sectionInfo(0);
 
@@ -210,16 +211,18 @@ cpnd_ckpt_sec_del(CPND_CKPT_NODE *cp_nod
     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");
-    }
+    if (hdr_update == true) {
+        // 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");
+        }
 
-    // UPDATE THE CHECKPOINT HEADER
-    rc = cpnd_ckpt_hdr_update(cp_node);
-    if (rc == NCSCC_RC_FAILURE) {
-      TRACE_4("cpnd ckpt hdr update failed");
+        // UPDATE THE CHECKPOINT HEADER
+        rc = cpnd_ckpt_hdr_update(cp_node);
+        if (rc == NCSCC_RC_FAILURE) {
+          TRACE_4("cpnd ckpt hdr update failed");
+        }
     }
   }
 

------------------------------------------------------------------------------
_______________________________________________
Opensaf-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/opensaf-devel

Reply via email to