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