Hi Alex! Nice to see this performance enhancement out for review. Good work!
I have a few minor comments, see inline below (marked AndersW>): regards, Anders Widell On 05/20/2014 11:27 PM, Alex Jones wrote: > osaf/libs/common/cpsv/include/cpnd_cb.h | 6 +- > osaf/libs/common/cpsv/include/cpnd_init.h | 14 +- > osaf/libs/common/cpsv/include/cpsv_evt.h | 2 +- > osaf/services/saf/cpsv/cpnd/Makefile.am | 3 +- > osaf/services/saf/cpsv/cpnd/cpnd_db.c | 246 +---------------- > osaf/services/saf/cpsv/cpnd/cpnd_evt.c | 115 ++++--- > osaf/services/saf/cpsv/cpnd/cpnd_proc.c | 26 +- > osaf/services/saf/cpsv/cpnd/cpnd_res.c | 15 +- > osaf/services/saf/cpsv/cpnd/cpnd_sec.cc | 424 > ++++++++++++++++++++++++++++++ > 9 files changed, 531 insertions(+), 320 deletions(-) > > > Jan 7 21:32:32.772347 <1789648919> ERR |MDTM: Frag recd is not next frag > so dropping adest=<0x010010023922604c> > Jan 7 21:32:32.772399 <1789648919> ERR |MDTM: Message is dropped as msg > is out of seq TRANSPOR-ID=<0x010010023922604c> > With large numbers of sections (>5k) on the standby the CPU is pegged and all > ckpt API functions return with SA_AIS_ERR_TIMEOUT, including ActiveReplicaSet, > and CheckpointClose! > > The section id database is implemented as a linked list. Each write to a > section must traverse the list in order to find the section. With 1000's of > sections this takes a looong time. Also, sync data being sent over is too > large > for one packet (30M). This causes the transport layer (in this case TIPC), to > drop packets. Lastly, the SectionCreate message is not asynchronous when > ACTIVE_REPLICA is specified. > > Solution is in 3 parts: (1) make the section id database a C++ STL map for > fast > access. (2) make MAX_SYNC_TRANSFER_SIZE much smaller: 3M instead of 30M. > (3) SectionCreate message should be asynchronous when ACTIVE_REPLICA is > specified. > > diff --git a/osaf/libs/common/cpsv/include/cpnd_cb.h > b/osaf/libs/common/cpsv/include/cpnd_cb.h > --- a/osaf/libs/common/cpsv/include/cpnd_cb.h > +++ b/osaf/libs/common/cpsv/include/cpnd_cb.h > @@ -23,7 +23,7 @@ > #include "ncs_queue.h" > > /* global variables */ > -uint32_t gl_cpnd_cb_hdl; > +extern uint32_t gl_cpnd_cb_hdl; > > /* macros for the CB handle */ > #define m_CPND_TAKE_CPND_CB ncshm_take_hdl(NCS_SERVICE_ID_CPND, > gl_cpnd_cb_hdl) > @@ -131,7 +131,6 @@ typedef struct cpnd_ckpt_section_info { > SaSizeT sec_size; > SaTimeT exp_tmr; > SaTimeT lastUpdate; > - struct cpnd_ckpt_section_info *prev, *next; > } CPND_CKPT_SECTION_INFO; > > #define CPND_CKPT_SECTION_INFO_NULL ((CPND_CKPT_SECTION_INFO *)0) > @@ -144,7 +143,8 @@ typedef struct cpnd_ckpt_replica_info_ta > SaUint32T mem_used; /* Used for status */ > NCS_OS_POSIX_SHM_REQ_INFO open; /* for shm open */ > uint32_t *shm_sec_mapping; /* for validity of sec */ > - CPND_CKPT_SECTION_INFO *section_info; /* Sections in the shared > memory */ > + void *section_db; /* used for C++ STL map */ > + void *local_section_db; /* used for C++ STL map */ > } CPND_CKPT_REPLICA_INFO; > > /*Structure to store info for ALL_REPL_WRITE EVT processing*/ > diff --git a/osaf/libs/common/cpsv/include/cpnd_init.h > b/osaf/libs/common/cpsv/include/cpnd_init.h > --- a/osaf/libs/common/cpsv/include/cpnd_init.h > +++ b/osaf/libs/common/cpsv/include/cpnd_init.h > @@ -157,15 +157,21 @@ void cpnd_evt_node_getnext(CPND_CB *cb, > uint32_t cpnd_evt_node_add(CPND_CB *cb, CPSV_CPND_ALL_REPL_EVT_NODE > *evt_node); > uint32_t cpnd_evt_node_del(CPND_CB *cb, CPSV_CPND_ALL_REPL_EVT_NODE > *evt_node); > CPND_CKPT_NODE *cpnd_ckpt_node_find_by_name(CPND_CB *cpnd_cb, SaNameT > ckpt_name); > -CPND_CKPT_SECTION_INFO *cpnd_ckpt_sec_get(CPND_CKPT_NODE *cp_node, > SaCkptSectionIdT *id); > -CPND_CKPT_SECTION_INFO *cpnd_ckpt_sec_get_create(CPND_CKPT_NODE *cp_node, > SaCkptSectionIdT *id); > -uint32_t cpnd_ckpt_sec_find(CPND_CKPT_NODE *cp_node, SaCkptSectionIdT *id); > +void cpnd_ckpt_sec_map_init(CPND_CKPT_REPLICA_INFO *replica_info); > +void cpnd_ckpt_sec_map_destroy(CPND_CKPT_REPLICA_INFO *replica_info); > +CPND_CKPT_SECTION_INFO *cpnd_ckpt_sec_get_first(const CPND_CKPT_REPLICA_INFO > *replicaInfo); > +CPND_CKPT_SECTION_INFO *cpnd_ckpt_sec_get_next(const CPND_CKPT_REPLICA_INFO > *replicaInfo, const CPND_CKPT_SECTION_INFO *section); > +CPND_CKPT_SECTION_INFO *cpnd_ckpt_sec_get(const CPND_CKPT_NODE *cp_node, > const SaCkptSectionIdT *id); > +CPND_CKPT_SECTION_INFO *cpnd_ckpt_sec_get_create(const CPND_CKPT_NODE > *cp_node, const SaCkptSectionIdT *id); > +uint32_t cpnd_ckpt_sec_find(const CPND_CKPT_NODE *cp_node, const > SaCkptSectionIdT *id); > CPND_CKPT_SECTION_INFO *cpnd_ckpt_sec_del(CPND_CKPT_NODE *cp_node, > SaCkptSectionIdT *id); > CPND_CKPT_SECTION_INFO *cpnd_ckpt_sec_add(CPND_CKPT_NODE *cp_node, > SaCkptSectionIdT *id, SaTimeT exp_time, > uint32_t gen_flag); > +uint32_t cpnd_ckpt_sec_add_db(CPND_CKPT_REPLICA_INFO *replicaInfo, > CPND_CKPT_SECTION_INFO *sectionInfo); > void cpnd_ckpt_delete_all_sect(CPND_CKPT_NODE *cp_node); > +bool cpnd_ckpt_sec_empty(const CPND_CKPT_REPLICA_INFO *replicaInfo); > void cpnd_evt_backup_queue_add(CPND_CKPT_NODE *cp_node, CPND_EVT *evt); > -CPND_CKPT_SECTION_INFO *cpnd_get_sect_with_id(CPND_CKPT_NODE *cp_node, > uint32_t lcl_sec_id); > +CPND_CKPT_SECTION_INFO *cpnd_get_sect_with_id(const CPND_CKPT_NODE *cp_node, > uint32_t lcl_sec_id); > uint32_t cpnd_ckpt_node_tree_init(CPND_CB *cb); > uint32_t cpnd_allrepl_write_evt_node_tree_init(CPND_CB *cb); > uint32_t cpnd_client_node_tree_init(CPND_CB *cb); > diff --git a/osaf/libs/common/cpsv/include/cpsv_evt.h > b/osaf/libs/common/cpsv/include/cpsv_evt.h > --- a/osaf/libs/common/cpsv/include/cpsv_evt.h > +++ b/osaf/libs/common/cpsv/include/cpsv_evt.h > @@ -429,7 +429,7 @@ typedef struct cpsv_a2nd_ckpt_list_updat > #define CPSV_CKPT_ACCESS_READ 0x2 > #define CPSV_CKPT_ACCESS_SYNC 0x3 > > -#define MAX_SYNC_TRANSFER_SIZE (30 * 1024 * 1024) > +#define MAX_SYNC_TRANSFER_SIZE (3 * 1024 * 1024) > > typedef struct cpsv_ckpt_access { > SaUint32T type; /* --- 0-write/1-overwrite/2-read/3-sync ----- > */ > diff --git a/osaf/services/saf/cpsv/cpnd/Makefile.am > b/osaf/services/saf/cpsv/cpnd/Makefile.am > --- a/osaf/services/saf/cpsv/cpnd/Makefile.am > +++ b/osaf/services/saf/cpsv/cpnd/Makefile.am > @@ -38,7 +38,8 @@ osafckptnd_SOURCES = \ > cpnd_mds.c \ > cpnd_proc.c \ > cpnd_res.c \ > - cpnd_tmr.c > + cpnd_tmr.c \ > + cpnd_sec.cc > > osafckptnd_LDADD = \ > $(top_builddir)/osaf/libs/core/libopensaf_core.la \ > 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 > @@ -156,6 +156,8 @@ void cpnd_ckpt_node_destroy(CPND_CB *cb, > if (cp_node->ret_tmr.is_active) > cpnd_tmr_stop(&cp_node->ret_tmr); > > + cpnd_ckpt_sec_map_destroy(&cp_node->replica_info); > + > m_MMGR_FREE_CPND_CKPT_NODE(cp_node); > TRACE_LEAVE(); > > @@ -353,163 +355,6 @@ uint32_t cpnd_evt_node_del(CPND_CB *cb, > } > > > /**************************************************************************** > - * Name : cpnd_ckpt_sec_get > - * > - * Description : Function to Find the section in a checkpoint. > - * > - * Arguments : CPND_CKPT_NODE *cp_node - Check point node. > - * : SaCkptSectionIdT id - Section Identifier > - * > - * Return Values : NULL/CPND_CKPT_SECTION_INFO > - * > - * Notes : None. > - > *****************************************************************************/ > -CPND_CKPT_SECTION_INFO *cpnd_ckpt_sec_get(CPND_CKPT_NODE *cp_node, > SaCkptSectionIdT *id) > -{ > - > - CPND_CKPT_SECTION_INFO *pSecPtr = NULL; > - > - TRACE_ENTER(); > - if (cp_node->replica_info.n_secs == 0) { > - TRACE_4("cpnd replica has no section for > ckpt_id:%llx",cp_node->ckpt_id); > - TRACE_LEAVE(); > - return NULL; > - } > - > - pSecPtr = cp_node->replica_info.section_info; > - while (pSecPtr != NULL) { > - if ((pSecPtr->sec_id.idLen == id->idLen) && > (memcmp(pSecPtr->sec_id.id, id->id, id->idLen) == 0)) { > - return pSecPtr; > - } > - pSecPtr = pSecPtr->next; > - } > - TRACE_LEAVE(); > - return NULL; > -} > - > -/**************************************************************************** > - * Name : cpnd_ckpt_sec_get_create > - * > - * Description : Function to Find the section in a checkpoint before > create. > - * > - * Arguments : CPND_CKPT_NODE *cp_node - Check point node. > - * : SaCkptSectionIdT id - Section Identifier > - * > - * Return Values : NULL/CPND_CKPT_SECTION_INFO > - * > - * Notes : None. > - > *****************************************************************************/ > -CPND_CKPT_SECTION_INFO *cpnd_ckpt_sec_get_create(CPND_CKPT_NODE *cp_node, > SaCkptSectionIdT *id) > -{ > - CPND_CKPT_SECTION_INFO *pSecPtr = NULL; > - TRACE_ENTER(); > - if (cp_node->replica_info.n_secs == 0) { > - TRACE_2("cpnd replica has no sections for > ckpt_id:%llx",cp_node->ckpt_id); > - TRACE_LEAVE(); > - return NULL; > - } > - pSecPtr = cp_node->replica_info.section_info; > - while (pSecPtr != NULL) { > - if ((pSecPtr->sec_id.idLen == id->idLen) && > (memcmp(pSecPtr->sec_id.id, id->id, id->idLen) == 0)) { > - TRACE_LEAVE(); > - return pSecPtr; > - } > - pSecPtr = pSecPtr->next; > - } > - TRACE_LEAVE(); > - return NULL; > -} > - > -/**************************************************************************** > - * Name : cpnd_ckpt_sec_find > - * > - * Description : Function to Find the section in a checkpoint. > - * > - * Arguments : CPND_CKPT_NODE *cp_node - Check point node. > - * : SaCkptSectionIdT id - Section Identifier > - * > - * Return Values : NCSCC_RC_FAILURE/NCSCC_RC_SUCCESS > - * > - * Notes : None. > - > *****************************************************************************/ > -uint32_t cpnd_ckpt_sec_find(CPND_CKPT_NODE *cp_node, SaCkptSectionIdT *id) > -{ > - > - uint32_t rc = NCSCC_RC_SUCCESS; > - CPND_CKPT_SECTION_INFO *pSecPtr = NULL; > - > - TRACE_ENTER(); > - if (cp_node->replica_info.n_secs == 0) { > - TRACE_LEAVE(); > - return NCSCC_RC_FAILURE; > - } > - > - pSecPtr = cp_node->replica_info.section_info; > - while (pSecPtr != NULL) { > - if ((pSecPtr->sec_id.idLen == id->idLen) && > (memcmp(pSecPtr->sec_id.id, id->id, id->idLen) == 0)) { > - TRACE_LEAVE(); > - return rc; > - } > - pSecPtr = pSecPtr->next; > - } > - > - TRACE_LEAVE(); > - return NCSCC_RC_FAILURE; > - > -} > - > -/**************************************************************************** > - * 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) > -{ > - CPND_CKPT_SECTION_INFO *pSecPtr = NULL; > - uint32_t rc = NCSCC_RC_SUCCESS; > - > - TRACE_ENTER(); > - pSecPtr = cp_node->replica_info.section_info; > - while (pSecPtr != NULL) { > - if ((pSecPtr->sec_id.idLen == id->idLen) && > (memcmp(pSecPtr->sec_id.id, id->id, id->idLen) == 0)) { > - /* delete it from the list and return the pointer */ > - if (cp_node->replica_info.section_info == pSecPtr) > - cp_node->replica_info.section_info = > cp_node->replica_info.section_info->next; > - if (pSecPtr->prev) > - pSecPtr->prev->next = pSecPtr->next; > - if (pSecPtr->next) > - pSecPtr->next->prev = pSecPtr->prev; > - > - cp_node->replica_info.n_secs--; > - cp_node->replica_info.mem_used = > cp_node->replica_info.mem_used - (pSecPtr->sec_size); > - > - /* UPDATE THE SECTION HEADER */ > - rc = cpnd_sec_hdr_update(pSecPtr, 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"); > - } > - TRACE_LEAVE(); > - return pSecPtr; > - } > - pSecPtr = pSecPtr->next; > - } > - TRACE_LEAVE(); > - return NULL; > -} > - > -/**************************************************************************** > * Name : cpnd_ckpt_sec_add > * > * Description : Function to add the section to a checkpoint. > @@ -581,13 +426,9 @@ CPND_CKPT_SECTION_INFO *cpnd_ckpt_sec_ad > pSecPtr->sec_state = SA_CKPT_SECTION_VALID; > > /* add the structure */ > - > - if (cp_node->replica_info.section_info != NULL) { > - pSecPtr->next = cp_node->replica_info.section_info; > - cp_node->replica_info.section_info->prev = pSecPtr; > - cp_node->replica_info.section_info = pSecPtr; > - } else { > - cp_node->replica_info.section_info = pSecPtr; > + rc = cpnd_ckpt_sec_add_db(&cp_node->replica_info, pSecPtr); > + if (rc == NCSCC_RC_FAILURE) { > + LOG_ER("unable to add section to database"); > } > > cp_node->replica_info.n_secs++; > @@ -607,46 +448,6 @@ CPND_CKPT_SECTION_INFO *cpnd_ckpt_sec_ad > } > > > /**************************************************************************** > - * Name : cpnd_ckpt_delete_all_sect > - * > - * Description : Function to add the section to a checkpoint. > - * > - * Arguments : CPND_CKPT_NODE *cp_node - Check point node. > - * > - * Return Values : NCSCC_RC_FAILURE/NCSCC_RC_SUCCESS > - * > - * Notes : None. > - > *****************************************************************************/ > -void cpnd_ckpt_delete_all_sect(CPND_CKPT_NODE *cp_node) > -{ > - CPND_CKPT_SECTION_INFO *pSecPtr = NULL; > - > - TRACE_ENTER(); > - /* delete it from the list and return the pointer */ > - do { > - pSecPtr = cp_node->replica_info.section_info; > - if (pSecPtr != NULL) { > - cp_node->replica_info.section_info = > cp_node->replica_info.section_info->next; > - if (pSecPtr->prev) > - pSecPtr->prev->next = pSecPtr->next; > - if (pSecPtr->next) > - pSecPtr->next->prev = pSecPtr->prev; > - > - cp_node->replica_info.n_secs--; > - if (pSecPtr->ckpt_sec_exptmr.is_active) > - cpnd_tmr_stop(&pSecPtr->ckpt_sec_exptmr); > - > - m_CPND_FREE_CKPT_SECTION(pSecPtr); > - > - } > - > - } while (cp_node->replica_info.section_info != NULL); > - > - TRACE_LEAVE(); > - return; > -} > - > -/**************************************************************************** > * Name : cpnd_evt_backup_queue_add > * > * Description : Function to add write event into back up queue > @@ -687,40 +488,6 @@ void cpnd_evt_backup_queue_add(CPND_CKPT > } > > > /**************************************************************************** > - * Name : cpnd_get_sect_with_id > - * > - * Description : Function to Find the section in a checkpoint. > - * > - * Arguments : CPND_CKPT_NODE *cp_node - Check point node. > - * : lck_sec_id - lcl Section Identifier > - * > - * Return Values : NULL/ pointer to CPND_CKPT_SECTION_INFO > - * > - * Notes : None. > - > *****************************************************************************/ > -CPND_CKPT_SECTION_INFO *cpnd_get_sect_with_id(CPND_CKPT_NODE *cp_node, > uint32_t lcl_sec_id) > -{ > - > - CPND_CKPT_SECTION_INFO *pSecPtr = NULL; > - > - if (cp_node->replica_info.n_secs == 0) { > - TRACE_4("cpnd replica has no sections for > ckpt_id:%llx",cp_node->ckpt_id); > - return NULL; > - } > - > - pSecPtr = cp_node->replica_info.section_info; > - while (pSecPtr != NULL) { > - if (pSecPtr->lcl_sec_id == lcl_sec_id) { > - return pSecPtr; > - } > - pSecPtr = pSecPtr->next; > - } > - > - return NULL; > - > -} > - > -/**************************************************************************** > * Name : cpnd_ckpt_node_tree_init > * > * Description : Function to Initialise ckpt tree > @@ -805,6 +572,9 @@ void cpnd_ckpt_node_tree_cleanup(CPND_CB > ncs_patricia_tree_del(&cb->ckpt_info_db, (NCS_PATRICIA_NODE > *)&cp_node->patnode); > if (cp_node->ret_tmr.is_active) > cpnd_tmr_stop(&cp_node->ret_tmr); > + > + cpnd_ckpt_sec_map_destroy(&cp_node->replica_info); > + > m_MMGR_FREE_CPND_CKPT_NODE(cp_node); > } > TRACE_LEAVE(); > 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 > @@ -79,7 +79,6 @@ static uint32_t cpnd_evt_proc_ckpt_refcn > static uint32_t cpnd_proc_cpd_new_active(CPND_CB *cb); > > static uint32_t cpnd_is_cpd_up(CPND_CB *cb); > - > static uint32_t cpnd_transfer_replica(CPND_CB *cb, CPND_CKPT_NODE *cp_node, > SaCkptCheckpointHandleT ckpt_id, > CPSV_CPND_DEST_INFO *dest_list, > CPSV_A2ND_CKPT_SYNC sync); > static uint32_t cpnd_evt_proc_ckpt_ckpt_list_update(CPND_CB *cb, CPND_EVT > *evt, CPSV_SEND_INFO *sinfo); > @@ -774,6 +773,8 @@ static uint32_t cpnd_evt_proc_ckpt_open( > cp_node->create_attrib = > out_evt->info.cpnd.info.ckpt_info.attributes; > cp_node->open_flags = SA_CKPT_CHECKPOINT_CREATE; > > + cpnd_ckpt_sec_map_init(&cp_node->replica_info); > + > if (evt->info.openReq.ckpt_flags & SA_CKPT_CHECKPOINT_READ) > cl_node->open_reader_flags_cnt++; > if (evt->info.openReq.ckpt_flags & SA_CKPT_CHECKPOINT_WRITE) > @@ -978,6 +979,7 @@ static uint32_t cpnd_evt_proc_ckpt_open( > } > if (cp_node->ret_tmr.is_active) > cpnd_tmr_stop(&cp_node->ret_tmr); > + cpnd_ckpt_sec_map_destroy(&cp_node->replica_info); > m_MMGR_FREE_CPND_CKPT_NODE(cp_node); > > agent_rsp: > @@ -2294,55 +2296,69 @@ static uint32_t cpnd_evt_proc_ckpt_sect_ > > evt->info.sec_creatReq.init_data; > > send_evt.info.cpnd.info.active_sec_creat.init_size = > > evt->info.sec_creatReq.init_size; > - rc = cpnd_mds_msg_sync_send(cb, > NCSMDS_SVC_ID_CPND, tmp->dest, > + > + if > (m_CPND_IS_ALL_REPLICA_ATTR_SET(cp_node->create_attrib.creationFlags) == > true) { > + rc = > cpnd_mds_msg_sync_send(cb, NCSMDS_SVC_ID_CPND, tmp->dest, > > &send_evt, &out_evt, > > CPND_WAIT_TIME(evt->info. > > sec_creatReq.init_size)); > - if (rc != NCSCC_RC_SUCCESS) { > - if (rc == > NCSCC_RC_REQ_TIMOUT) { > - TRACE_4("cpnd > active to remote mds send fail for cpnd_mdest_id:%"PRIu64" \ > - > dest:%"PRIu64",ckpt_id:%llx,return val:%d", > - > cb->cpnd_mdest_id, tmp->dest, > - > cp_node->ckpt_id, rc); > + if (rc != > NCSCC_RC_SUCCESS) { > + if (rc == > NCSCC_RC_REQ_TIMOUT) { > + > TRACE_4("cpnd active to remote mds send fail for cpnd_mdest_id:%"PRIu64" \ > + > dest:%"PRIu64",ckpt_id:%llx,return val:%d", > + > cb->cpnd_mdest_id, tmp->dest, > + > cp_node->ckpt_id, rc); > + } > + } > + > + if (out_evt > + && > out_evt->info.cpnd.info.active_sec_creat_rsp.error != > + SA_AIS_OK) { > + > CPND_CKPT_SECTION_INFO *tmp_sec_info = NULL; > + > memset(&send_evt, '\0', sizeof(CPSV_EVT)); > + send_evt.type = > CPSV_EVT_TYPE_CPA; > + > send_evt.info.cpa.type = CPA_EVT_ND2A_SEC_CREATE_RSP; > + /* TBD: Don't > know what to do, revisit this. Ideally send the request to > + other CPNDs to > delete */ > + /* Section > Create fails with SA_AIS_NOT_VALID */ > + > send_evt.info.cpa.info.sec_creat_rsp.error = > + > out_evt->info.cpnd.info.active_sec_creat_rsp.error; > + TRACE_4("cpnd > ckpt sect creqte failed for ckpt_id:%llx,error value:%d", > + > cp_node->ckpt_id,send_evt.info.cpa.info.sec_creat_rsp.error); > + > + /* delete the > section */ > + if (gen_sec_id) > + > tmp_sec_info = > + > cpnd_ckpt_sec_del(cp_node, &sec_info->sec_id); > + else > + > tmp_sec_info = > + > cpnd_ckpt_sec_del(cp_node, > + > evt->info.sec_creatReq. > + > sec_attri.sectionId); > + > + if > (tmp_sec_info == sec_info) { > + > cp_node->replica_info. > + > shm_sec_mapping[sec_info->lcl_sec_id] = 1; > + > m_CPND_FREE_CKPT_SECTION(sec_info); > + } else { > + > TRACE_4("cpnd ckpt sect del failed "); > + } > + > cpnd_evt_destroy(out_evt); > + out_evt = NULL; > + goto agent_rsp; > } > } > - > - if (out_evt > - && > out_evt->info.cpnd.info.active_sec_creat_rsp.error != > - SA_AIS_OK) { > - CPND_CKPT_SECTION_INFO > *tmp_sec_info = NULL; > - memset(&send_evt, '\0', > sizeof(CPSV_EVT)); > - send_evt.type = > CPSV_EVT_TYPE_CPA; > - send_evt.info.cpa.type > = CPA_EVT_ND2A_SEC_CREATE_RSP; > - /* TBD: Don't know what > to do, revisit this. Ideally send the request to > - other CPNDs to > delete */ > - /* Section Create > fails with SA_AIS_NOT_VALID */ > - > send_evt.info.cpa.info.sec_creat_rsp.error = > - > out_evt->info.cpnd.info.active_sec_creat_rsp.error; > - TRACE_4("cpnd ckpt sect > creqte failed for ckpt_id:%llx,error value:%d", > - > cp_node->ckpt_id,send_evt.info.cpa.info.sec_creat_rsp.error); > - > - /* delete the section */ > - if (gen_sec_id) > - tmp_sec_info = > - > cpnd_ckpt_sec_del(cp_node, &sec_info->sec_id); > - else > - tmp_sec_info = > - > cpnd_ckpt_sec_del(cp_node, > - > evt->info.sec_creatReq. > - > sec_attri.sectionId); > - > - if (tmp_sec_info == > sec_info) { > - > cp_node->replica_info. > - > shm_sec_mapping[sec_info->lcl_sec_id] = 1; > - > m_CPND_FREE_CKPT_SECTION(sec_info); > - } else { > - TRACE_4("cpnd > ckpt sect del failed "); > - } > - > cpnd_evt_destroy(out_evt); > - out_evt = NULL; > - goto agent_rsp; > + else if > ((m_CPND_IS_ACTIVE_REPLICA_ATTR_SET(cp_node->create_attrib.creationFlags) == > true) || > + > (m_CPND_IS_ACTIVE_REPLICA_WEAK_ATTR_SET(cp_node->create_attrib.creationFlags) > == true)) { > + rc = > cpnd_mds_msg_send(cb, NCSMDS_SVC_ID_CPND, tmp->dest, &send_evt); > + if (rc == > NCSCC_RC_FAILURE) { > + if (rc == > NCSCC_RC_REQ_TIMOUT) { > + > LOG_ER("CPND - MDS send failed from Active Dest to Remote Dest > cpnd_mdest_id:%"PRIu64",\ > + > dest:%"PRIu64",ckpt_id:%llx:rc:%d for replica sect create",cb->cpnd_mdest_id, > tmp->dest,cp_node->ckpt_id, rc); > + } > + } > } > + > tmp = tmp->next; > if (out_evt) { > > cpnd_evt_destroy(out_evt); > @@ -3264,7 +3280,7 @@ static uint32_t cpnd_evt_proc_ckpt_sync( > goto agent_rsp; > } > > - if (cp_node->replica_info.section_info == NULL) { > + if (cpnd_ckpt_sec_empty(&cp_node->replica_info)) { > send_evt.info.cpa.info.sync_rsp.error = SA_AIS_ERR_NOT_EXIST; > goto agent_rsp; > } > @@ -3399,7 +3415,7 @@ static uint32_t cpnd_evt_proc_nd2nd_ckpt > rc = cpnd_mds_send_rsp(cb, sinfo, &send_evt); > } > > - if ((cp_node->replica_info.n_secs > 0) && > (cp_node->replica_info.section_info)) { > + if ((cp_node->replica_info.n_secs > 0) && > !cpnd_ckpt_sec_empty(&cp_node->replica_info)) { > > if (evt->info.sync_req.is_ckpt_open) { > dest_list.dest = sinfo->dest; > @@ -3977,6 +3993,8 @@ static uint32_t cpnd_evt_proc_ckpt_creat > cp_node->create_attrib = > evt->info.ckpt_create.ckpt_info.attributes; > cp_node->ckpt_id = evt->info.ckpt_create.ckpt_info.ckpt_id; > > + cpnd_ckpt_sec_map_init(&cp_node->replica_info); > + > if (evt->info.ckpt_create.ckpt_info.is_active_exists == true) { > cp_node->active_mds_dest = > evt->info.ckpt_create.ckpt_info.active_dest; > cp_node->is_active_exist = true; > @@ -3998,6 +4016,7 @@ static uint32_t cpnd_evt_proc_ckpt_creat > rc = NCSCC_RC_FAILURE; > if (cp_node->ret_tmr.is_active) > cpnd_tmr_stop(&cp_node->ret_tmr); > + cpnd_ckpt_sec_map_destroy(&cp_node->replica_info); > m_MMGR_FREE_CPND_CKPT_NODE(cp_node); > return rc; > } > @@ -4536,7 +4555,7 @@ static uint32_t cpnd_transfer_replica(CP > send_evt.info.cpnd.info.ckpt_nd2nd_sync.ckpt_id = ckpt_id; > send_evt.info.cpnd.info.ckpt_nd2nd_sync.ckpt_sync = sync; > > - tmp_sec_info = cp_node->replica_info.section_info; > + tmp_sec_info = cpnd_ckpt_sec_get_first(&cp_node->replica_info); > if (tmp_sec_info == NULL) { > rc = NCSCC_RC_FAILURE; > TRACE_4("cpnd ckpt memory allocation failed"); > @@ -4604,7 +4623,7 @@ static uint32_t cpnd_transfer_replica(CP > num++; > total_num++; > > - tmp_sec_info = tmp_sec_info->next; > + tmp_sec_info = cpnd_ckpt_sec_get_next(&cp_node->replica_info, > tmp_sec_info); > } > > TRACE_LEAVE(); > 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 > @@ -1095,7 +1095,7 @@ CPSV_CKPT_DATA *cpnd_ckpt_generate_cpsv_ > CPND_CKPT_SECTION_INFO *tmp_sec_info = NULL; > uint32_t i; > > - tmp_sec_info = cp_node->replica_info.section_info; > + tmp_sec_info = cpnd_ckpt_sec_get_first(&cp_node->replica_info); > > for (i = 0; i < cp_node->replica_info.n_secs; i++) { > tmp_sec_data = m_MMGR_ALLOC_CPSV_CKPT_DATA; > @@ -1111,7 +1111,7 @@ CPSV_CKPT_DATA *cpnd_ckpt_generate_cpsv_ > tmp_sec_data->next = sec_data; > sec_data = tmp_sec_data; > > - tmp_sec_info = tmp_sec_info->next; > + tmp_sec_info = cpnd_ckpt_sec_get_next(&cp_node->replica_info, > tmp_sec_info); > } > > return sec_data; > @@ -1653,7 +1653,7 @@ cpnd_proc_getnext_section(CPND_CKPT_NODE > { > > CPND_CKPT_SECTION_INFO *pSecPtr = NULL, *pTmpSecPtr = NULL; > - pSecPtr = cp_node->replica_info.section_info; > + pSecPtr = cpnd_ckpt_sec_get_first(&cp_node->replica_info); > > TRACE_ENTER(); > if (cp_node->replica_info.n_secs == 0 || (cp_node->replica_info.n_secs > <= get_next->n_secs_trav)) { > @@ -1679,12 +1679,8 @@ cpnd_proc_getnext_section(CPND_CKPT_NODE > > /* search the existing section id */ > *n_secs_trav = get_next->n_secs_trav; > - while (pSecPtr != NULL && *n_secs_trav != 0) { > - if ((pSecPtr->sec_id.idLen == > get_next->section_id.idLen) && > - (memcmp(pSecPtr->sec_id.id, > get_next->section_id.id, get_next->section_id.idLen) == 0)) { > - break; > - } > - pSecPtr = pSecPtr->next; > + if (pSecPtr != NULL && *n_secs_trav != 0) { > + pSecPtr = cpnd_ckpt_sec_get(cp_node, > &get_next->section_id); > } > /* if next is NULL then return no more sections */ > if (pSecPtr == NULL) { > @@ -1696,7 +1692,7 @@ cpnd_proc_getnext_section(CPND_CKPT_NODE > if (*n_secs_trav == 0) > pTmpSecPtr = pSecPtr; > else > - pTmpSecPtr = pSecPtr->next; > + pTmpSecPtr = > cpnd_ckpt_sec_get_next(&cp_node->replica_info, pSecPtr); > > switch (get_next->filter) { > case SA_CKPT_SECTIONS_ANY: > @@ -1714,7 +1710,7 @@ cpnd_proc_getnext_section(CPND_CKPT_NODE > (*n_secs_trav)++; > break; > } else > - pTmpSecPtr = pTmpSecPtr->next; > + pTmpSecPtr = > cpnd_ckpt_sec_get_next(&cp_node->replica_info, pTmpSecPtr); > } > if (pTmpSecPtr == NULL) { > TRACE_4("cpnd replica has no sections "); > @@ -1729,7 +1725,7 @@ cpnd_proc_getnext_section(CPND_CKPT_NODE > (*n_secs_trav)++; > break; > } else > - pTmpSecPtr = pTmpSecPtr->next; > + pTmpSecPtr = > cpnd_ckpt_sec_get_next(&cp_node->replica_info, pTmpSecPtr); > } > if (pTmpSecPtr == NULL) { > TRACE_4("cpnd replica has no sections in lEQ > expiration time"); > @@ -1744,7 +1740,7 @@ cpnd_proc_getnext_section(CPND_CKPT_NODE > (*n_secs_trav)++; > break; > } else > - pTmpSecPtr = pTmpSecPtr->next; > + pTmpSecPtr = > cpnd_ckpt_sec_get_next(&cp_node->replica_info, pTmpSecPtr); > } > if (pTmpSecPtr == NULL) { > TRACE_4("cpnd replica has no sections in GEQ > expiration time"); > @@ -2048,10 +2044,10 @@ void cpnd_dump_replica_info(CPND_CKPT_RE > > if (ckpt_replica_node->n_secs) { > CPND_CKPT_SECTION_INFO *sec_info = NULL; > - sec_info = ckpt_replica_node->section_info; > + sec_info = cpnd_ckpt_sec_get_first(ckpt_replica_node); > while (sec_info != NULL) { > cpnd_dump_section_info(sec_info); > - sec_info = sec_info->next; > + sec_info = cpnd_ckpt_sec_get_next(ckpt_replica_node, > sec_info); > } > } > } > diff --git a/osaf/services/saf/cpsv/cpnd/cpnd_res.c > b/osaf/services/saf/cpsv/cpnd/cpnd_res.c > --- a/osaf/services/saf/cpsv/cpnd/cpnd_res.c > +++ b/osaf/services/saf/cpsv/cpnd/cpnd_res.c > @@ -93,14 +93,7 @@ uint32_t cpnd_client_extract_bits(uint32 > > uint32_t cpnd_res_ckpt_sec_add(CPND_CKPT_SECTION_INFO *pSecPtr, > CPND_CKPT_NODE *cp_node) > { > - if (cp_node->replica_info.section_info != NULL) { > - pSecPtr->next = cp_node->replica_info.section_info; > - cp_node->replica_info.section_info->prev = pSecPtr; > - cp_node->replica_info.section_info = pSecPtr; > - } else { > - cp_node->replica_info.section_info = pSecPtr; > - } > - return NCSCC_RC_SUCCESS; > + return cpnd_ckpt_sec_add_db(&cp_node->replica_info, pSecPtr); > > } > > @@ -118,10 +111,10 @@ uint32_t cpnd_res_ckpt_sec_del(CPND_CKPT > { > CPND_CKPT_SECTION_INFO *pSecPtr = NULL, *nextPtr = NULL; > > - pSecPtr = cp_node->replica_info.section_info; > + pSecPtr = cpnd_ckpt_sec_get_first(&cp_node->replica_info); > while (pSecPtr != NULL) { > nextPtr = pSecPtr; > - pSecPtr = pSecPtr->next; > + pSecPtr = cpnd_ckpt_sec_get_next(&cp_node->replica_info, > pSecPtr); > if ((nextPtr->sec_id.id != NULL) && (nextPtr->sec_id.idLen != > 0)) { > m_MMGR_FREE_CPSV_DEFAULT_VAL(nextPtr->sec_id.id, > NCS_SERVICE_ID_CPND); > } > @@ -466,6 +459,8 @@ void *cpnd_restart_shm_create(NCS_OS_POS > cp_node->is_unlink = cp_info.is_unlink; > cp_node->close_time = cp_info.close_time; > cp_node->cpnd_rep_create = > cp_info.cpnd_rep_create; > + cpnd_ckpt_sec_map_init(&cp_node->replica_info); > + > /* Non-collocated Differentiator flag */ > if (cp_info.cpnd_rep_create) { > /* OPEN THE SHARED MEMORY ALREADY > CREATED FOR CHECKPOINT REPLICA */ > diff --git a/osaf/services/saf/cpsv/cpnd/cpnd_sec.cc > b/osaf/services/saf/cpsv/cpnd/cpnd_sec.cc > new file mode 100644 > --- /dev/null > +++ b/osaf/services/saf/cpsv/cpnd/cpnd_sec.cc > @@ -0,0 +1,424 @@ > +/* -*- OpenSAF -*- > + * > + * (C) Copyright 2008 The OpenSAF Foundation AndersW> This is a new file, should be copyright 2014 instead of 2008. > + * > + * This program is distributed in the hope that it will be useful, but > + * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY > + * or FITNESS FOR A PARTICULAR PURPOSE. This file and program are licensed > + * under the GNU Lesser General Public License Version 2.1, February 1999. > + * The complete license can be accessed from the following location: > + * http://opensource.org/licenses/lgpl-license.php > + * See the Copying file included with the OpenSAF distribution for full > + * licensing terms. > + * > + * Author(s): Emerson Network Power AndersW> Put your company name here instead of Emerson. > + * > + */ > + > +/***************************************************************************** > + * FILE NAME: cpnd_sec.cc > + * > + * DESCRIPTION: C++ implementation of section id map > + * > + > ****************************************************************************/ > + > +#include <cassert> > +#include <map> AndersW> Missing include files: cstring (for memcmp), logtrace.h (for the trace macros), ncsgl_defs.h (for osafassert, NCSCC_RC_SUCCESS, NCSCC_RC_FAILURE). > +extern "C" { > + #include "cpnd.h" > +} AndersW> The extern "C" really should go into the header files, rather than here in cpnd_sec.cc. I realize that probably most, if not all CKPT header files need to be fixed in order for this to work, so I suppose it is something that could be done later in a cleanup phase, but in that case we should have a ticket for it so that it is not forgotten. Another thing that needs to be cleaned up is that there should be a cpnd_sec.h header file where the public interface is defined, and this header file should be included before all other header files in cpnd_sec.h. If you write a ticket about the extern "C", the missing cpnd_sec.h could also be mentioned. > + > +struct ltSectionIdT { > + bool operator()(const SaCkptSectionIdT *s1, const SaCkptSectionIdT *s2) > const > + { > + bool status(false); > + > + if (s1->idLen < s2->idLen) > + status = true; > + else if (s1->idLen > s2->idLen) > + status = false; > + else > + status = (memcmp(s1->id, s2->id, s1->idLen) < 0); > + > + return status; > + } > +}; > + > +typedef std::map<const SaCkptSectionIdT *, > + CPND_CKPT_SECTION_INFO *, > + ltSectionIdT> SectionMap; > + > +typedef std::map<uint32_t, CPND_CKPT_SECTION_INFO *> LocalSectionIdMap; > + > +void > +cpnd_ckpt_sec_map_init(CPND_CKPT_REPLICA_INFO *replicaInfo) > +{ > + if (replicaInfo->section_db) { > + LOG_ER("section map already exists"); > + assert(false); AndersW> Please use osafassert instead of assert. > + } > + > + if (replicaInfo->local_section_db) { > + LOG_ER("section map for local section id already exists"); > + assert(false); > + } > + > + replicaInfo->section_db = new SectionMap; > + replicaInfo->local_section_db = new LocalSectionIdMap; > +} > + > +void > +cpnd_ckpt_sec_map_destroy(CPND_CKPT_REPLICA_INFO *replicaInfo) > +{ > + delete static_cast<SectionMap *>(replicaInfo->section_db); > + delete static_cast<LocalSectionIdMap *>(replicaInfo->local_section_db); > + > + replicaInfo->section_db = 0; > + replicaInfo->local_section_db = 0; > +} > + > +/**************************************************************************** > + * Name : cpnd_ckpt_sec_get > + * > + * Description : Function to Find the section in a checkpoint. > + * > + * Arguments : CPND_CKPT_NODE *cp_node - Check point node. > + * : SaCkptSectionIdT id - Section Identifier > + * > + * Return Values : NULL/CPND_CKPT_SECTION_INFO > + * > + * Notes : None. > + > *****************************************************************************/ > +CPND_CKPT_SECTION_INFO * > +cpnd_ckpt_sec_get(const CPND_CKPT_NODE *cp_node, const SaCkptSectionIdT *id) > +{ > + CPND_CKPT_SECTION_INFO *sectionInfo(0); > + > + TRACE_ENTER(); > + > + if (cp_node->replica_info.n_secs) { > + SectionMap *map(static_cast<SectionMap *> > + (cp_node->replica_info.section_db)); > + > + if (map) { > + SectionMap::iterator it(map->find(id)); > + > + if (it != map->end()) > + sectionInfo = it->second; > + } > + else { > + LOG_ER("can't find map in cpnd_ckpt_sec_get"); > + assert(false); > + } > + } > + else { > + TRACE_4("cpnd replica has no section for ckpt_id:%llx",cp_node->ckpt_id); > + } > + > + TRACE_LEAVE(); > + return sectionInfo; > +} > + > +/**************************************************************************** > + * Name : cpnd_ckpt_sec_get_create > + * > + * Description : Function to Find the section in a checkpoint before > create. > + * > + * Arguments : CPND_CKPT_NODE *cp_node - Check point node. > + * : SaCkptSectionIdT id - Section Identifier > + * > + * Return Values : NULL/CPND_CKPT_SECTION_INFO > + * > + * Notes : None. > + > *****************************************************************************/ > +CPND_CKPT_SECTION_INFO * > +cpnd_ckpt_sec_get_create(const CPND_CKPT_NODE *cp_node, > + const SaCkptSectionIdT *id) > +{ > + return cpnd_ckpt_sec_get(cp_node, id); > +} > + > +/**************************************************************************** > + * Name : cpnd_ckpt_sec_find > + * > + * Description : Function to Find the section in a checkpoint. > + * > + * Arguments : CPND_CKPT_NODE *cp_node - Check point node. > + * : SaCkptSectionIdT id - Section Identifier > + * > + * Return Values : NCSCC_RC_FAILURE/NCSCC_RC_SUCCESS > + * > + * Notes : None. > + > *****************************************************************************/ > +uint32_t > +cpnd_ckpt_sec_find(const CPND_CKPT_NODE *cp_node, const SaCkptSectionIdT *id) > +{ > + return (cpnd_ckpt_sec_get(cp_node, id)) ? NCSCC_RC_SUCCESS : > NCSCC_RC_FAILURE; > +} > + > +/**************************************************************************** > + * 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) > +{ > + CPND_CKPT_SECTION_INFO *sectionInfo(0); > + > + TRACE_ENTER(); > + > + SectionMap *map(static_cast<SectionMap > *>(cp_node->replica_info.section_db)); > + > + if (map) { > + SectionMap::iterator it(map->find(id)); > + > + if (it != map->end()) { > + sectionInfo = it->second; > + map->erase(it); > + } > + } > + else { > + LOG_ER("can't find map in cpnd_ckpt_sec_del"); > + assert(false); > + } > + > + LocalSectionIdMap *localSecMap(static_cast<LocalSectionIdMap *> > + (cp_node->replica_info.local_section_db)); > + > + if (localSecMap) { > + if (sectionInfo) { > + LocalSectionIdMap::iterator > it(localSecMap->find(sectionInfo->lcl_sec_id)); > + > + if (it != localSecMap->end()) > + localSecMap->erase(it); > + } > + } > + else { > + LOG_ER("can't find local sec map in cpnd_ckpt_sec_del"); > + assert(false); > + } > + > + if (sectionInfo) { > + 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"); > + } > + > + // UPDATE THE CHECKPOINT HEADER > + rc = cpnd_ckpt_hdr_update(cp_node); > + if (rc == NCSCC_RC_FAILURE) { > + TRACE_4("cpnd ckpt hdr update failed"); > + } > + } > + > + TRACE_LEAVE(); > + > + return sectionInfo; > +} > + > +/**************************************************************************** > + * Name : cpnd_ckpt_sec_add_db > + * > + * Description : Function to add the section to a checkpoint. > + * > + * Arguments : CPND_CKPT_REPLICA_INFO *replicaInfo - Check point replica. > + * : CPND_CKPT_SECTION_INFO sectionInfo - Section Info > + * > + * Return Values : NCSCC_RC_SUCCESS/NCSCC_RC_FAILURE > + * > + * Notes : None. > + > *****************************************************************************/ > +uint32_t > +cpnd_ckpt_sec_add_db(CPND_CKPT_REPLICA_INFO *replicaInfo, > + CPND_CKPT_SECTION_INFO *sectionInfo) > +{ > + uint32_t rc(NCSCC_RC_SUCCESS); > + > + SectionMap *map(static_cast<SectionMap *>(replicaInfo->section_db)); > + > + if (map) { > + std::pair<SectionMap::iterator, bool> p(map->insert( > + std::make_pair(§ionInfo->sec_id, sectionInfo))); > + > + if (!p.second) { > + LOG_ER("unable to add section info to map"); > + rc = NCSCC_RC_FAILURE; > + } > + } > + else { > + LOG_ER("can't find map in cpnd_ckpt_sec_add_db"); > + assert(false); > + } > + > + LocalSectionIdMap *localSecMap( > + static_cast<LocalSectionIdMap *>(replicaInfo->local_section_db)); > + > + if (localSecMap) { > + std::pair<LocalSectionIdMap::iterator, bool> p(localSecMap->insert( > + std::make_pair(sectionInfo->lcl_sec_id, sectionInfo))); > + > + if (!p.second) { > + LOG_ER("unable to add section info to local section id map"); > + rc = NCSCC_RC_FAILURE; > + } > + } > + else { > + LOG_ER("can't find local sec map in cpnd_ckpt_sec_add_db"); > + assert(false); > + } > + > + return rc; > +} > + > +/**************************************************************************** > + * Name : cpnd_ckpt_delete_all_sect > + * > + * Description : Function to add the section to a checkpoint. > + * > + * Arguments : CPND_CKPT_NODE *cp_node - Check point node. > + * > + * Return Values : NCSCC_RC_FAILURE/NCSCC_RC_SUCCESS > + * > + * Notes : None. > + > *****************************************************************************/ > +void > +cpnd_ckpt_delete_all_sect(CPND_CKPT_NODE *cp_node) > +{ > + LocalSectionIdMap *localSecMap(static_cast<LocalSectionIdMap *> > + (cp_node->replica_info.local_section_db)); > + > + if (localSecMap) > + localSecMap->erase(localSecMap->begin(), localSecMap->end()); > + else { > + LOG_ER("can't find local sec map in cpnd_ckpt_delete_all_sect"); > + assert(false); > + } AndersW> Coding style issue: curly braces missing for the "true" case in the if-statement above (either both true and false branches should have curly braces, or neither of them should). > + > + SectionMap *map(static_cast<SectionMap > *>(cp_node->replica_info.section_db)); > + > + if (map) { > + SectionMap::iterator it(map->begin()); > + > + while (it != map->end()) { > + cp_node->replica_info.n_secs--; > + > + CPND_CKPT_SECTION_INFO *section(it->second); > + > + if (section->ckpt_sec_exptmr.is_active) > + cpnd_tmr_stop(§ion->ckpt_sec_exptmr); > + > + m_CPND_FREE_CKPT_SECTION(section); > + > + SectionMap::iterator tmpIt(it); > + ++it; > + > + map->erase(tmpIt); > + } > + } > + else { > + LOG_ER("can't find sec map in cpnd_ckpt_delete_all_sect"); > + assert(false); > + } > +} > + > +/**************************************************************************** > + * Name : cpnd_get_sect_with_id > + * > + * Description : Function to Find the section in a checkpoint. > + * > + * Arguments : CPND_CKPT_NODE *cp_node - Check point node. > + * : lck_sec_id - lcl Section Identifier > + * > + * Return Values : NULL/ pointer to CPND_CKPT_SECTION_INFO > + * > + * Notes : None. > + > *****************************************************************************/ > +CPND_CKPT_SECTION_INFO * > +cpnd_get_sect_with_id(const CPND_CKPT_NODE *cp_node, uint32_t lcl_sec_id) > +{ > + CPND_CKPT_SECTION_INFO *sectionInfo(0); > + > + if (cp_node->replica_info.n_secs) { > + LocalSectionIdMap *map(static_cast<LocalSectionIdMap *> > + (cp_node->replica_info.local_section_db)); > + > + if (map) { > + LocalSectionIdMap::iterator it(map->find(lcl_sec_id)); > + > + if (it != map->end()) > + sectionInfo = it->second; > + } > + else { > + LOG_ER("can't find sec map in cpnd_get_sect_with_id"); > + assert(false); > + } > + } > + else { > + TRACE_4("cpnd replica has no sections for > ckpt_id:%llx",cp_node->ckpt_id); > + } > + > + return sectionInfo; > +} > + > +bool > +cpnd_ckpt_sec_empty(const CPND_CKPT_REPLICA_INFO *replicaInfo) > +{ > + SectionMap *map(static_cast<SectionMap *>(replicaInfo->section_db)); > + > + return map ? map->empty() : true; > +} > + > +CPND_CKPT_SECTION_INFO * > +cpnd_ckpt_sec_get_first(const CPND_CKPT_REPLICA_INFO *replicaInfo) > +{ > + CPND_CKPT_SECTION_INFO *sectionInfo(0); > + > + SectionMap *map(static_cast<SectionMap *>(replicaInfo->section_db)); > + > + if (map) { > + SectionMap::iterator it(map->begin()); > + > + if (it != map->end()) > + sectionInfo = it->second; > + } > + else { > + LOG_ER("can't find sec map in cpnd_ckpt_sec_get_first"); > + } > + > + return sectionInfo; > +} > + > +CPND_CKPT_SECTION_INFO * > +cpnd_ckpt_sec_get_next(const CPND_CKPT_REPLICA_INFO *replicaInfo, > + const CPND_CKPT_SECTION_INFO *section) > +{ > + CPND_CKPT_SECTION_INFO *sectionInfo(0); > + > + SectionMap *map(static_cast<SectionMap *>(replicaInfo->section_db)); > + > + if (map) { > + SectionMap::iterator it(map->find(§ion->sec_id)); > + > + if (it != map->end()) { > + if (++it != map->end()) > + sectionInfo = it->second; > + } > + } > + else { > + LOG_ER("can't find sec map in cpnd_ckpt_sec_get_next"); > + } > + > + return sectionInfo; > +} > > > ------------------------------------------------------------------------------ > "Accelerate Dev Cycles with Automated Cross-Browser Testing - For FREE > Instantly run your Selenium tests across 300+ browser/OS combos. > Get unparalleled scalability from the best Selenium testing platform available > Simple to use. Nothing to install. Get started now for free." > http://p.sf.net/sfu/SauceLabs > _______________________________________________ > Opensaf-devel mailing list > Opensaf-devel@lists.sourceforge.net > https://lists.sourceforge.net/lists/listinfo/opensaf-devel > ------------------------------------------------------------------------------ "Accelerate Dev Cycles with Automated Cross-Browser Testing - For FREE Instantly run your Selenium tests across 300+ browser/OS combos. Get unparalleled scalability from the best Selenium testing platform available Simple to use. Nothing to install. Get started now for free." http://p.sf.net/sfu/SauceLabs _______________________________________________ Opensaf-devel mailing list Opensaf-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/opensaf-devel