HI All,

Validation of this patch dependent on #2202 , so please find the attached
re-based patch of this (#2207) ticket.

Hoang  will re-publish the V3 patch once he is in office.

-AVM

On 11/29/2016 4:23 PM, Hoang Vo wrote:
  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");
+        }
      }
    }

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_CB *cb, CPND_CKPT_NODE *, SaCkptSectionIdT *);
+cpnd_ckpt_sec_del(CPND_CB *cb, CPND_CKPT_NODE *, SaCkptSectionIdT *, bool hdr_update);
 
 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,9 @@ 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(cb, cp_node, id);
+	cpnd_ckpt_sec_del(cb, 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
@@ -2380,12 +2380,12 @@ static uint32_t cpnd_evt_proc_ckpt_sect_
 								/* delete the section */
 								if (gen_sec_id)
 									tmp_sec_info =
-								    	cpnd_ckpt_sec_del(cb, cp_node, &sec_info->sec_id);
+								    	cpnd_ckpt_sec_del(cb, cp_node, &sec_info->sec_id, true);
 								else
 									tmp_sec_info =
 								    	cpnd_ckpt_sec_del(cb, cp_node,
 										      	evt->info.sec_creatReq.
-										      	sec_attri.sectionId);
+										      	sec_attri.sectionId, true);
 
 								if (tmp_sec_info == sec_info) {
 									cp_node->replica_info.
@@ -2517,7 +2517,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(cb, cp_node, &evt->info.sec_delReq.sec_id);
+		sec_info = cpnd_ckpt_sec_del(cb, cp_node, &evt->info.sec_delReq.sec_id, true);
 		/* resetting lcl_sec_id mapping */
 		if (sec_info == NULL) {
 			rc = NCSCC_RC_FAILURE;
@@ -2797,7 +2797,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(cb, cp_node, &evt->info.sec_delete_req.sec_id);
+	sec_info = cpnd_ckpt_sec_del(cb, 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
@@ -1547,7 +1547,7 @@ uint32_t cpnd_proc_sec_expiry(CPND_CB *c
 		return NCSCC_RC_FAILURE;
 	}
 
-	cpnd_ckpt_sec_del(cb, cp_node, &pSec_info->sec_id);
+	cpnd_ckpt_sec_del(cb, 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_CB *cb, CPND_CKPT_NODE *cp_node, SaCkptSectionIdT *id)
+cpnd_ckpt_sec_del(CPND_CB *cb, CPND_CKPT_NODE *cp_node, SaCkptSectionIdT *id, bool hdr_update)
 {
   CPND_CKPT_SECTION_INFO *sectionInfo(0);
 
@@ -210,18 +211,20 @@ cpnd_ckpt_sec_del(CPND_CB *cb, CPND_CKPT
     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(cb, sectionInfo, cp_node));
-    if (rc == NCSCC_RC_FAILURE) {
-	    LOG_ER("cpnd sect hdr update failed");
+    if (hdr_update == true) {
+	    // UPDATE THE SECTION HEADER
+	    uint32_t rc(cpnd_sec_hdr_update(cb, sectionInfo, cp_node));
+	    if (rc == NCSCC_RC_FAILURE) {
+		    LOG_ER("cpnd sect hdr update failed");
+	    }
+
+	    // UPDATE THE CHECKPOINT HEADER
+	    rc = cpnd_ckpt_hdr_update(cb, cp_node);
+	    if (rc == NCSCC_RC_FAILURE) {
+		    LOG_ER("cpnd ckpt hdr update failed");
+	    }
     }
-
-    // UPDATE THE CHECKPOINT HEADER
-    rc = cpnd_ckpt_hdr_update(cb, cp_node);
-    if (rc == NCSCC_RC_FAILURE) {
-	    LOG_ER("cpnd ckpt hdr update failed");
-    }
-    }
+  }
 
   TRACE_LEAVE();
 
------------------------------------------------------------------------------
_______________________________________________
Opensaf-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/opensaf-devel

Reply via email to