Hi Mahesh, Please see my comments below.
Best regards, Nhat Pham -----Original Message----- From: A V Mahesh [mailto:[email protected]] Sent: Friday, January 29, 2016 10:56 AM To: Nhat Pham <[email protected]>; [email protected] Cc: [email protected] Subject: Re: [PATCH 1 of 1] cpsv: To update checkpoint user number for each node [#1669] Hi Nhat Pham, I am not sure why we replaced the `cpd_process_cpnd_down` with `cpd_proc_node_down` [Nhat Pham] The cpd_process_cpnd_down() handles event node down. It makes confusion. Thus, it is changed to cpd_proc_node_down(). There is another function cpnd_down_process() in cpd_evt.c handles cpnd process down event. their is interpretation difference between cpnd down & node down - cpnd down means Cpa are still valid and checkpoint will be restored after cpnd restart , user number will be restored no action required in user count unless a application abounded while cpnd is restarting - Node down means Cpa are no more valid and checkpoint NO more restored ( user number will be restored ) user count will dicreased ( as for as CPD is not aware of Node CPND restart time will be indication ). I hope this patch is on default code base , not on top of headless state #1621 patch. [Nhat Pham] This patch is on default code base. -AVM On 1/29/2016 8:51 AM, Nhat Pham wrote: > osaf/libs/common/cpsv/include/cpd_cb.h | 2 + > osaf/libs/common/cpsv/include/cpd_proc.h | 7 +- > osaf/libs/common/cpsv/include/cpd_red.h | 14 ++ > osaf/libs/common/cpsv/include/cpsv_evt.h | 8 + > osaf/services/saf/cpsv/cpd/cpd_amf.c | 5 +- > osaf/services/saf/cpsv/cpd/cpd_db.c | 20 +++- > osaf/services/saf/cpsv/cpd/cpd_evt.c | 10 +- > osaf/services/saf/cpsv/cpd/cpd_mbcsv.c | 86 +++++++++++++++- > osaf/services/saf/cpsv/cpd/cpd_proc.c | 156 ++++++++++++++++++++++++++++++- > osaf/services/saf/cpsv/cpd/cpd_red.c | 32 ++++- > osaf/services/saf/cpsv/cpd/cpd_sbevt.c | 72 +++++++++++++- > 11 files changed, 384 insertions(+), 28 deletions(-) > > > Problem: > ------- > The saCkptCheckpointNumOpeners is not updated when a node which has a checkpoint client restarts. > > Solution: > -------- > Currently CPD doesn't store number of user on each node. This patch > updates CPD to update information about users on each node for each > checkpoint. When a node restarts, the CPD update the total number of users for a checkpoint accordingly. This is reflected on saCkptCheckpointNumOpeners attribute correctly. > > diff --git a/osaf/libs/common/cpsv/include/cpd_cb.h > b/osaf/libs/common/cpsv/include/cpd_cb.h > --- a/osaf/libs/common/cpsv/include/cpd_cb.h > +++ b/osaf/libs/common/cpsv/include/cpd_cb.h > @@ -90,6 +90,8 @@ typedef struct cpd_ckpt_info_node { > uint32_t num_users; > uint32_t num_readers; > uint32_t num_writers; > + uint32_t node_users_cnt; > + CPD_NODE_USER_INFO *node_users; > > /* for imm */ > SaUint32T ckpt_used_size; > diff --git a/osaf/libs/common/cpsv/include/cpd_proc.h > b/osaf/libs/common/cpsv/include/cpd_proc.h > --- a/osaf/libs/common/cpsv/include/cpd_proc.h > +++ b/osaf/libs/common/cpsv/include/cpd_proc.h > @@ -60,7 +60,7 @@ uint32_t cpd_noncolloc_ckpt_rep_create(C > CPD_CKPT_INFO_NODE *ckpt_node, CPD_CKPT_MAP_INFO *map_info); > uint32_t cpd_noncolloc_ckpt_rep_delete(CPD_CB *cb, > CPD_CKPT_INFO_NODE *ckpt_node, CPD_CKPT_MAP_INFO *map_info); > > -uint32_t cpd_process_cpnd_down(CPD_CB *cb, MDS_DEST *cpnd_dest); > +uint32_t cpd_proc_node_down(CPD_CB *cb, MDS_DEST *cpnd_dest); > > uint32_t cpd_proc_active_set(CPD_CB *cb, SaCkptCheckpointHandleT ckpt_id, > MDS_DEST mds_dest, CPD_CKPT_INFO_NODE **ckpt_node); @@ -93,7 > +93,7 @@ uint32_t cpd_mbcsv_decode_proc(NCS_MBCSV > uint32_t cpd_mbcsv_enc_warm_sync_resp(CPD_CB *cb, NCS_MBCSV_CB_ARG *arg); > uint32_t cpd_mbcsv_encode_proc(NCS_MBCSV_CB_ARG *arg); > uint32_t cpd_mbcsv_dec_sync_resp(CPD_CB *cb, NCS_MBCSV_CB_ARG *arg); > -uint32_t cpd_process_cpnd_del(CPD_CB *cb, MDS_DEST *cpnd_dest); > +uint32_t cpd_process_cpnd_del_on_standby(CPD_CB *cb, MDS_DEST > +*cpnd_dest); > uint32_t cpd_get_slot_sub_id_from_mds_dest(MDS_DEST dest); > uint32_t cpd_get_slot_sub_slot_id_from_node_id(NCS_NODE_ID i_node_id); > uint32_t cpd_mbcsv_register(CPD_CB *cb); @@ -102,4 +102,7 @@ > uint32_t cpd_mbcsv_enc_async_update(CPD_ > uint32_t cpd_mbcsv_close(CPD_CB *cb); > bool cpd_is_noncollocated_replica_present_on_payload(CPD_CB *cb, CPD_CKPT_INFO_NODE *ckpt_node); > uint32_t cpd_ckpt_reploc_imm_object_delete(CPD_CB *cb, > CPD_CKPT_REPLOC_INFO *ckpt_reploc_node ,bool is_unlink_set); > +void cpd_proc_increase_node_user_info(CPD_CKPT_INFO_NODE *ckpt_node, > +MDS_DEST cpnd_dest, SaCkptCheckpointOpenFlagsT open_flags); void > +cpd_proc_decrease_node_user_info(CPD_CKPT_INFO_NODE *ckpt_node, > +MDS_DEST cpnd_dest, SaCkptCheckpointOpenFlagsT open_flags); void > +cpd_proc_update_user_info_when_node_down(CPD_CB *cb, NODE_ID > +node_id); > #endif > diff --git a/osaf/libs/common/cpsv/include/cpd_red.h > b/osaf/libs/common/cpsv/include/cpd_red.h > --- a/osaf/libs/common/cpsv/include/cpd_red.h > +++ b/osaf/libs/common/cpsv/include/cpd_red.h > @@ -28,6 +28,7 @@ typedef enum cpd_mbcsv_msg_type { > CPD_A2S_MSG_CKPT_UNLINK, > CPD_A2S_MSG_CKPT_USR_INFO, > CPD_A2S_MSG_CKPT_DEST_DOWN, > + CPD_A2S_MSG_CKPT_USR_INFO_2, > CPD_A2S_MSG_MAX_EVT > } CPD_MBCSV_MSG_TYPE; > > @@ -64,6 +65,18 @@ typedef struct cpd_a2s_ckpt_usr_info { > > } CPD_A2S_CKPT_USR_INFO; > > +typedef struct cpd_a2s_ckpt_usr_info_2 { > + SaCkptCheckpointHandleT ckpt_id; > + uint32_t num_user; > + uint32_t num_writer; > + uint32_t num_reader; > + uint32_t num_sections; > + uint32_t ckpt_on_scxb1; > + uint32_t ckpt_on_scxb2; > + uint32_t node_users_cnt; > + CPD_NODE_USER_INFO *node_list; > +} CPD_A2S_CKPT_USR_INFO_2; > + > typedef struct cpd_mbcsv_msg { > CPD_MBCSV_MSG_TYPE type; > union { > @@ -76,6 +89,7 @@ typedef struct cpd_mbcsv_msg { > CPD_A2S_CKPT_UNLINK ckpt_ulink; > CPD_A2S_CKPT_USR_INFO usr_info; > CPSV_CKPT_DEST_INFO dest_down; > + CPD_A2S_CKPT_USR_INFO_2 usr_info_2; > } info; > } CPD_MBCSV_MSG; > > 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 > @@ -821,6 +821,14 @@ typedef struct cpd_tmr_info { > } info; > } CPD_TMR_INFO; > > +typedef struct cpd_node_user_info { > + MDS_DEST dest; > + uint32_t num_users; > + uint32_t num_writers; > + uint32_t num_readers; > + struct cpd_node_user_info *next; > +} CPD_NODE_USER_INFO; > + > /*************************************************************************** *** > CPD Event Data Structures > > ********************************************************************** > ********/ diff --git a/osaf/services/saf/cpsv/cpd/cpd_amf.c > b/osaf/services/saf/cpsv/cpd/cpd_amf.c > --- a/osaf/services/saf/cpsv/cpd/cpd_amf.c > +++ b/osaf/services/saf/cpsv/cpd/cpd_amf.c > @@ -226,9 +226,8 @@ void cpd_saf_csi_set_cb(SaInvocationT in > while (node_info) { > prev_dest = node_info->cpnd_dest; > if (node_info->timer_state == 2) { > - TRACE > - ("THE TIMER STATE IS 2 MEANS TIMER EXPIRED BUT STILL DID NOT GET ACTIVE STATE"); > - cpd_process_cpnd_down(cb, &node_info->cpnd_dest); > + TRACE("THE TIMER STATE IS 2 MEANS TIMER EXPIRED BUT STILL DID NOT GET ACTIVE STATE"); > + cpd_proc_node_down(cb, &node_info->cpnd_dest); > } > cpd_cpnd_info_node_getnext(&cb->cpnd_tree, &prev_dest, > &node_info); > > diff --git a/osaf/services/saf/cpsv/cpd/cpd_db.c > b/osaf/services/saf/cpsv/cpd/cpd_db.c > --- a/osaf/services/saf/cpsv/cpd/cpd_db.c > +++ b/osaf/services/saf/cpsv/cpd/cpd_db.c > @@ -137,6 +137,7 @@ uint32_t cpd_ckpt_node_delete(CPD_CB *cb > { > uint32_t rc = NCSCC_RC_SUCCESS; > CPD_NODE_REF_INFO *nref_info, *next_info; > + CPD_NODE_USER_INFO *node_user, *next_node_user; > > TRACE_ENTER(); > > @@ -153,6 +154,13 @@ uint32_t cpd_ckpt_node_delete(CPD_CB *cb > nref_info = next_info; > } > > + node_user = ckpt_node->node_users; > + while (node_user) { > + next_node_user = node_user->next; > + free(node_user); > + node_user = next_node_user; > + } > + > /* delete imm ckpt runtime object */ > if ((cb->ha_state == SA_AMF_HA_ACTIVE) && (ckpt_node->is_unlink_set != true)) { > if (immutil_saImmOiRtObjectDelete(cb->immOiHandle, > &ckpt_node->ckpt_name) != SA_AIS_OK) { @@ -780,6 +788,8 @@ uint32_t cpd_cpnd_info_node_find_add(NCS > /*MDS_DEST key; */ > NODE_ID key; > > + TRACE_ENTER(); > + > memset(&key, 0, sizeof(NODE_ID)); > /* Fill the Key */ > key = m_NCS_NODE_ID_FROM_MDS_DEST((*dest)); > @@ -790,6 +800,7 @@ uint32_t cpd_cpnd_info_node_find_add(NCS > *cpnd_info_node = m_MMGR_ALLOC_CPD_CPND_INFO_NODE; > if (*cpnd_info_node == NULL) { > LOG_CR("cpd cpnd info node memory allocation failed"); > + TRACE_LEAVE(); > return NCSCC_RC_FAILURE; > } > memset((*cpnd_info_node), '\0', sizeof(CPD_CPND_INFO_NODE)); @@ > -802,11 +813,13 @@ uint32_t cpd_cpnd_info_node_find_add(NCS > > if (ncs_patricia_tree_add(cpnd_tree, &(*cpnd_info_node)->patnode) != NCSCC_RC_SUCCESS) { > LOG_ER("cpd cpnd info node failed for mds_dest %"PRIu64,*dest); > + TRACE_LEAVE(); > return NCSCC_RC_FAILURE; > } > *add_flag = false; > } > > + TRACE_LEAVE(); > return NCSCC_RC_SUCCESS; > } > > @@ -1129,7 +1142,7 @@ void cpd_node_ref_info_del(CPD_CKPT_INFO > * > * > > ********************************************************************** > *********************************/ > -uint32_t cpd_process_cpnd_del(CPD_CB *cb, MDS_DEST *cpnd_dest) > +uint32_t cpd_process_cpnd_del_on_standby(CPD_CB *cb, MDS_DEST > +*cpnd_dest) > { > CPD_CPND_INFO_NODE *cpnd_info = NULL; > CPD_CKPT_REF_INFO *cref_info, *temp; @@ -1266,11 +1279,14 @@ void > cpd_clm_cluster_track_cb(const SaCl > if (notificationBuffer->notification[counter].clusterChange == SA_CLM_NODE_LEFT) { > if (cb->ha_state == SA_AMF_HA_ACTIVE) { > node_id = > notificationBuffer->notification[counter].clusterNode.nodeId; > + > + cpd_proc_update_user_info_when_node_down(cb, node_id); > + > key = node_id; > cpnd_info_node = (CPD_CPND_INFO_NODE *) > ncs_patricia_tree_get(&cb->cpnd_tree, (uint8_t *)&key); > if (cpnd_info_node) { > - cpd_process_cpnd_down(cb, &cpnd_info_node->cpnd_dest); > + cpd_proc_node_down(cb, &cpnd_info_node->cpnd_dest); > } > } else if (cb->ha_state == SA_AMF_HA_STANDBY) { > node_id = > notificationBuffer->notification[counter].clusterNode.nodeId; > diff --git a/osaf/services/saf/cpsv/cpd/cpd_evt.c > b/osaf/services/saf/cpsv/cpd/cpd_evt.c > --- a/osaf/services/saf/cpsv/cpd/cpd_evt.c > +++ b/osaf/services/saf/cpsv/cpd/cpd_evt.c > @@ -237,6 +237,7 @@ static uint32_t cpd_evt_proc_ckpt_create > ckpt_node->num_writers++; > > ckpt_node->num_users++; > + cpd_proc_increase_node_user_info(ckpt_node, sinfo->dest, > +ckpt_create->ckpt_flags); > > cb->is_db_upd = true; > > @@ -435,6 +436,8 @@ static uint32_t cpd_evt_proc_ckpt_usr_in > ckpt_node->num_readers++; > if (evt->info.ckpt_usr_info.ckpt_flags & SA_CKPT_CHECKPOINT_WRITE) > ckpt_node->num_writers++; > + > + cpd_proc_increase_node_user_info(ckpt_node, sinfo->dest, > +evt->info.ckpt_usr_info.ckpt_flags); > } > else if (evt->info.ckpt_usr_info.info_type == > CPSV_USR_INFO_CKPT_OPEN) { > > @@ -444,6 +447,8 @@ static uint32_t cpd_evt_proc_ckpt_usr_in > ckpt_node->num_readers++; > if (evt->info.ckpt_usr_info.ckpt_flags & SA_CKPT_CHECKPOINT_WRITE) > ckpt_node->num_writers++; > + > + cpd_proc_increase_node_user_info(ckpt_node, sinfo->dest, > +evt->info.ckpt_usr_info.ckpt_flags); > } > > if (evt->info.ckpt_usr_info.info_type == > CPSV_USR_INFO_CKPT_CLOSE_LAST) { @@ -481,6 +486,8 @@ static uint32_t cpd_evt_proc_ckpt_usr_in > ckpt_node->num_readers--; > if (evt->info.ckpt_usr_info.ckpt_flags & SA_CKPT_CHECKPOINT_WRITE) > ckpt_node->num_writers--; > + > + cpd_proc_decrease_node_user_info(ckpt_node, sinfo->dest, > +evt->info.ckpt_usr_info.ckpt_flags); > } > else if (evt->info.ckpt_usr_info.info_type == > CPSV_USR_INFO_CKPT_CLOSE) { > > @@ -491,6 +498,7 @@ static uint32_t cpd_evt_proc_ckpt_usr_in > if (evt->info.ckpt_usr_info.ckpt_flags & SA_CKPT_CHECKPOINT_WRITE) > ckpt_node->num_writers--; > > + cpd_proc_decrease_node_user_info(ckpt_node, sinfo->dest, > +evt->info.ckpt_usr_info.ckpt_flags); > } > > cpd_a2s_ckpt_usr_info(cb, ckpt_node); @@ -875,7 +883,7 @@ static > uint32_t cpd_evt_proc_timer_expir > if (cb->ha_state == SA_AMF_HA_ACTIVE) { > cpd_cpnd_info_node_get(&cb->cpnd_tree, &tmr_info->info.cpnd_dest, &node_info); > if (node_info) { > - (void)cpd_process_cpnd_down(cb, &tmr_info->info.cpnd_dest); > + (void)cpd_proc_node_down(cb, &tmr_info->info.cpnd_dest); > } > } > if (cb->ha_state == SA_AMF_HA_STANDBY) { diff --git > a/osaf/services/saf/cpsv/cpd/cpd_mbcsv.c > b/osaf/services/saf/cpsv/cpd/cpd_mbcsv.c > --- a/osaf/services/saf/cpsv/cpd/cpd_mbcsv.c > +++ b/osaf/services/saf/cpsv/cpd/cpd_mbcsv.c > @@ -23,6 +23,8 @@ > > ********************************************************************** > ********/ > > #include "cpd.h" > +static void cpd_mbcsv_enc_a2s_usr_info_2(NCS_UBAID *io_uba, > +CPD_A2S_CKPT_USR_INFO_2 *usr_info); static void > +cpd_mbcsv_dec_a2s_usr_info_2(NCS_UBAID *io_uba, > +CPD_A2S_CKPT_USR_INFO_2 *usr_info); > > /*************************************************************************** ******************* > * Name : cpd_mbcsv_async_update > @@ -437,14 +439,9 @@ uint32_t cpd_mbcsv_enc_async_update(CPD_ > } > break; > > - case CPD_A2S_MSG_CKPT_USR_INFO: > + case CPD_A2S_MSG_CKPT_USR_INFO_2: > cpd_msg = (CPD_MBCSV_MSG *)NCS_INT64_TO_PTR_CAST(arg->info.encode.io_reo_hdl); > - rc = m_NCS_EDU_EXEC(&cb->edu_hdl, FUNC_NAME(CPD_A2S_CKPT_USR_INFO), &arg->info.encode.io_uba, > - EDP_OP_TYPE_ENC, &cpd_msg->info.usr_info, &ederror); > - if (rc != NCSCC_RC_SUCCESS) { > - TRACE_4("edu exec async userinfo failed "); > - rc = NCSCC_RC_FAILURE; > - } > + cpd_mbcsv_enc_a2s_usr_info_2(&arg->info.encode.io_uba, > +&cpd_msg->info.usr_info_2); > break; > > case CPD_A2S_MSG_CKPT_DEST_DOWN: > @@ -907,6 +904,17 @@ uint32_t cpd_mbcsv_dec_async_update(CPD_ > } > break; > > + case CPD_A2S_MSG_CKPT_USR_INFO_2: > + cpd_msg->type = evt_type; > + cpd_mbcsv_dec_a2s_usr_info_2(&arg->info.decode.i_uba, &cpd_msg->info.usr_info_2); > + rc = cpd_process_sb_msg(cb, cpd_msg); > + > + if (rc != NCSCC_RC_SUCCESS) { > + TRACE_4("cpd standby dest del evt failed"); > + goto end; > + } > + break; > + > case CPD_A2S_MSG_CKPT_DEST_DOWN: > ckpt_dest_down = &cpd_msg->info.dest_down; > rc = m_NCS_EDU_EXEC(&cb->edu_hdl, FUNC_NAME(CPSV_CKPT_DEST_INFO), > &arg->info.decode.i_uba, @@ -1154,3 +1162,67 @@ uint32_t cpd_mbcsv_decode_proc(NCS_MBCSV > } > > } > + > +/************************************************************************** ******************** > + * Name : cpd_mbcsv_enc_a2s_usr_info_2 > + * > + * Description : This function encodes the message CPD_A2S_MSG_CKPT_USR_INFO_2 > + * > + * Return Values : None > + * > + * Notes : None > +********************************************************************* > +*************************/ void > +cpd_mbcsv_enc_a2s_usr_info_2(NCS_UBAID *io_uba, > +CPD_A2S_CKPT_USR_INFO_2 *usr_info) { > + TRACE_ENTER(); > + > + osaf_encode_uint32(io_uba, usr_info->num_user); > + osaf_encode_uint32(io_uba, usr_info->num_writer); > + osaf_encode_uint32(io_uba, usr_info->num_reader); > + osaf_encode_uint32(io_uba, usr_info->ckpt_on_scxb1); > + osaf_encode_uint32(io_uba, usr_info->ckpt_on_scxb2); > + osaf_encode_uint32(io_uba, usr_info->node_users_cnt); > + > + int i = 0; > + for (i = 0; i < usr_info->node_users_cnt; i++) { > + osaf_encode_uint64(io_uba, usr_info->node_list[i].dest); > + osaf_encode_uint32(io_uba, usr_info->node_list[i].num_users); > + osaf_encode_uint32(io_uba, usr_info->node_list[i].num_writers); > + osaf_encode_uint32(io_uba, usr_info->node_list[i].num_readers); > + } > + > + TRACE_LEAVE(); > +} > + > +/************************************************************************** ******************** > + * Name : cpd_mbcsv_dec_a2s_usr_info_2 > + * > + * Description : This function decodes the message CPD_A2S_MSG_CKPT_USR_INFO_2 > + * > + * > + * Return Values : None > + * > + * Notes : None > +********************************************************************* > +*************************/ void > +cpd_mbcsv_dec_a2s_usr_info_2(NCS_UBAID *io_uba, > +CPD_A2S_CKPT_USR_INFO_2 *usr_info) { > + TRACE_ENTER(); > + > + osaf_decode_uint32(io_uba, &usr_info->num_user); > + osaf_decode_uint32(io_uba, &usr_info->num_writer); > + osaf_decode_uint32(io_uba, &usr_info->num_reader); > + osaf_decode_uint32(io_uba, &usr_info->ckpt_on_scxb1); > + osaf_decode_uint32(io_uba, &usr_info->ckpt_on_scxb2); > + osaf_decode_uint32(io_uba, &usr_info->node_users_cnt); > + > + int i = 0; > + CPD_NODE_USER_INFO *node_list = malloc(usr_info->node_users_cnt * sizeof(CPD_NODE_USER_INFO)); > + for (i = 0; i < usr_info->node_users_cnt; i++) { > + osaf_decode_uint64(io_uba, &node_list[i].dest); > + osaf_decode_uint32(io_uba, &node_list[i].num_users); > + osaf_decode_uint32(io_uba, &node_list[i].num_writers); > + osaf_decode_uint32(io_uba, &node_list[i].num_readers); > + } > + > + TRACE_LEAVE(); > +} > diff --git a/osaf/services/saf/cpsv/cpd/cpd_proc.c > b/osaf/services/saf/cpsv/cpd/cpd_proc.c > --- a/osaf/services/saf/cpsv/cpd/cpd_proc.c > +++ b/osaf/services/saf/cpsv/cpd/cpd_proc.c > @@ -148,6 +148,8 @@ uint32_t cpd_ckpt_db_entry_update(CPD_CB > CPD_REP_KEY_INFO key_info; > bool noncoll_rep_on_payload = false; > > + TRACE_ENTER(); > + > memset(&ckpt_name, 0, sizeof(SaNameT)); > memset(&cluster_node, 0, sizeof(SaClmClusterNodeT)); > memset(&key_info, 0, sizeof(CPD_REP_KEY_INFO)); @@ -651,15 +653,15 > @@ uint32_t cpd_process_ckpt_delete(CPD_CB > } > > /*************************************************************************** * > - * Name : cpd_process_cpnd_down > + * Name : cpd_process_node_down > * > - * Description : This routine will process the CPND down event. > + * Description : This routine will process the node down event. > * > * Return Values : NCSCC_RC_SUCCESS/Error. > * > * Notes : None. > > ********************************************************************** > *******/ -uint32_t cpd_process_cpnd_down(CPD_CB *cb, MDS_DEST > *cpnd_dest) > +uint32_t cpd_proc_node_down(CPD_CB *cb, MDS_DEST *cpnd_dest) > { > CPD_CPND_INFO_NODE *cpnd_info = NULL; > CPD_CKPT_REF_INFO *cref_info; > @@ -1272,3 +1274,151 @@ void cpd_proc_broadcast_rdset_stop(SaCkp > send_evt.info.cpnd.info.rdset.type = CPSV_CKPT_RDSET_STOP; > cpd_mds_bcast_send(cb, &send_evt, NCSMDS_SVC_ID_CPND); > } > + > +/************************************************************************** **************** > + * Name : cpd_proc_increase_node_ref_user_info > + * > + * Description : This routine increases number of user, writer and reader for > + * the specified cpnd node reference > + * > + * Return Values : None > + * > + * Notes : None > +********************************************************************* > +*********************/ void > +cpd_proc_increase_node_user_info(CPD_CKPT_INFO_NODE *ckpt_node, MDS_DEST cpnd_dest, > + SaCkptCheckpointOpenFlagsT open_flags) { > + CPD_NODE_USER_INFO *node_user = ckpt_node->node_users; > + CPD_NODE_USER_INFO *last_node_user = NULL; > + > + TRACE_ENTER(); > + > + if (ckpt_node->node_users_cnt == 0) { > + node_user = malloc(sizeof(CPD_NODE_USER_INFO)); > + memset(node_user, 0, sizeof(CPD_NODE_USER_INFO)); > + node_user->dest = cpnd_dest; > + > + if (open_flags & SA_CKPT_CHECKPOINT_READ) > + node_user->num_readers++; > + if (open_flags & SA_CKPT_CHECKPOINT_WRITE) > + node_user->num_writers++; > + > + node_user->num_users++; > + node_user->next = NULL; > + ckpt_node->node_users = node_user; > + ckpt_node->node_users_cnt++; > + TRACE_LEAVE(); > + return; > + } > + > + while (node_user) { > + if (node_user->dest == cpnd_dest) { > + if (open_flags & SA_CKPT_CHECKPOINT_READ) > + node_user->num_readers++; > + if (open_flags & SA_CKPT_CHECKPOINT_WRITE) > + node_user->num_writers++; > + > + node_user->num_users++; > + TRACE_LEAVE(); > + return; > + } > + last_node_user = node_user; > + node_user = node_user->next; > + } > + > + /* Add node user */ > + node_user = malloc(sizeof(CPD_NODE_USER_INFO)); > + memset(node_user, 0, sizeof(CPD_NODE_USER_INFO)); > + node_user->dest = cpnd_dest; > + > + if (open_flags & SA_CKPT_CHECKPOINT_READ) > + node_user->num_readers++; > + if (open_flags & SA_CKPT_CHECKPOINT_WRITE) > + node_user->num_writers++; > + > + node_user->num_users++; > + node_user->next = NULL; > + last_node_user->next = node_user; > + ckpt_node->node_users_cnt++; > + > + TRACE_LEAVE(); > +} > + > +/************************************************************************** **************** > + * Name : cpd_proc_decrease_node_ref_user_info > + * > + * Description : This routine decreases number of user, writer and reader for > + * the specified cpnd node reference > + * > + * Return Values : None > + * > + * Notes : None > +********************************************************************* > +*********************/ void > +cpd_proc_decrease_node_user_info(CPD_CKPT_INFO_NODE *ckpt_node, MDS_DEST cpnd_dest, > + SaCkptCheckpointOpenFlagsT open_flags) { > + CPD_NODE_USER_INFO *node_user = ckpt_node->node_users; > + > + TRACE_ENTER(); > + > + while (node_user) { > + if (node_user->dest == cpnd_dest) { > + if (node_user->num_users == 0) { > + LOG_ER("cpd_proc_decrease_node_user_info failed - no user on node id 0x%X", > + m_NCS_NODE_ID_FROM_MDS_DEST(cpnd_dest)); > + TRACE_LEAVE(); > + return; > + } > + > + if (open_flags & SA_CKPT_CHECKPOINT_READ) > + node_user->num_readers--; > + if (open_flags & SA_CKPT_CHECKPOINT_WRITE) > + node_user->num_writers--; > + > + node_user->num_users--; > + TRACE_LEAVE(); > + return; > + } > + node_user = node_user->next; > + } > + > + TRACE_LEAVE(); > +} > + > +/************************************************************************** **************** > + * Name : cpd_proc_update_user_info_when_node_down > + * > + * Description : This routine updates number of user, writer and reader in case node down > + * > + * Return Values : None > + * > + * Notes : None > +********************************************************************* > +*********************/ void > +cpd_proc_update_user_info_when_node_down(CPD_CB *cb, NODE_ID node_id) > +{ > + CPD_CKPT_INFO_NODE *ckpt_node; > + TRACE_ENTER(); > + > + cpd_ckpt_node_getnext(&cb->ckpt_tree, NULL, &ckpt_node); > + while (ckpt_node) { > + SaCkptCheckpointHandleT prev_ckpt_hdl = ckpt_node->ckpt_id; > + CPD_NODE_USER_INFO *node_user; > + > + for (node_user = ckpt_node->node_users; node_user != NULL; node_user = node_user->next) { > + if (node_id == m_NCS_NODE_ID_FROM_MDS_DEST(node_user->dest)) { > + ckpt_node->num_users -= node_user->num_users; > + ckpt_node->num_writers -= node_user->num_writers; > + ckpt_node->num_readers -= node_user->num_readers; > + > + node_user->num_users = 0; > + node_user->num_writers = 0; > + node_user->num_readers = 0; > + break; > + } > + } > + > + cpd_ckpt_node_getnext(&cb->ckpt_tree, &prev_ckpt_hdl, &ckpt_node); > + } > + > + TRACE_LEAVE(); > +} > diff --git a/osaf/services/saf/cpsv/cpd/cpd_red.c > b/osaf/services/saf/cpsv/cpd/cpd_red.c > --- a/osaf/services/saf/cpsv/cpd/cpd_red.c > +++ b/osaf/services/saf/cpsv/cpd/cpd_red.c > @@ -301,18 +301,34 @@ void cpd_a2s_ckpt_dest_del(CPD_CB *cb, S > void cpd_a2s_ckpt_usr_info(CPD_CB *cb, CPD_CKPT_INFO_NODE *ckpt_node) > { > CPD_MBCSV_MSG cpd_msg; > + int count = 0; > uint32_t rc = SA_AIS_OK; > memset(&cpd_msg, '\0', sizeof(CPD_MBCSV_MSG)); > > TRACE_ENTER(); > - cpd_msg.type = CPD_A2S_MSG_CKPT_USR_INFO; > - cpd_msg.info.usr_info.ckpt_id = ckpt_node->ckpt_id; > - cpd_msg.info.usr_info.num_user = ckpt_node->num_users; > - cpd_msg.info.usr_info.num_writer = ckpt_node->num_writers; > - cpd_msg.info.usr_info.num_reader = ckpt_node->num_readers; > - cpd_msg.info.usr_info.num_sections = ckpt_node->num_sections; > - cpd_msg.info.usr_info.ckpt_on_scxb1 = ckpt_node->ckpt_on_scxb1; > - cpd_msg.info.usr_info.ckpt_on_scxb2 = ckpt_node->ckpt_on_scxb2; > + cpd_msg.type = CPD_A2S_MSG_CKPT_USR_INFO_2; > + cpd_msg.info.usr_info_2.ckpt_id = ckpt_node->ckpt_id; > + cpd_msg.info.usr_info_2.num_user = ckpt_node->num_users; > + cpd_msg.info.usr_info_2.num_writer = ckpt_node->num_writers; > + cpd_msg.info.usr_info_2.num_reader = ckpt_node->num_readers; > + cpd_msg.info.usr_info_2.num_sections = ckpt_node->num_sections; > + cpd_msg.info.usr_info_2.ckpt_on_scxb1 = ckpt_node->ckpt_on_scxb1; > + cpd_msg.info.usr_info_2.ckpt_on_scxb2 = ckpt_node->ckpt_on_scxb2; > + > + if (ckpt_node->node_users_cnt) { > + CPD_NODE_USER_INFO *node_user = ckpt_node->node_users; > + cpd_msg.info.usr_info_2.node_users_cnt = ckpt_node->node_users_cnt; > + cpd_msg.info.usr_info_2.node_list = malloc(ckpt_node->node_users_cnt * sizeof(CPD_NODE_USER_INFO)); > + memset(cpd_msg.info.usr_info_2.node_list, '\0', > +(sizeof(CPD_NODE_USER_INFO) * ckpt_node->node_users_cnt)); > + > + for (count = 0; count < ckpt_node->node_users_cnt; count++) { > + cpd_msg.info.usr_info_2.node_list[count].dest = node_user->dest; > + cpd_msg.info.usr_info_2.node_list[count].num_users = node_user->num_users; > + cpd_msg.info.usr_info_2.node_list[count].num_readers = node_user->num_readers; > + cpd_msg.info.usr_info_2.node_list[count].num_writers = node_user->num_writers; > + node_user = node_user->next; > + } > + } > > rc = cpd_mbcsv_async_update(cb, &cpd_msg); > if (rc != SA_AIS_OK) > diff --git a/osaf/services/saf/cpsv/cpd/cpd_sbevt.c > b/osaf/services/saf/cpsv/cpd/cpd_sbevt.c > --- a/osaf/services/saf/cpsv/cpd/cpd_sbevt.c > +++ b/osaf/services/saf/cpsv/cpd/cpd_sbevt.c > @@ -34,6 +34,7 @@ static uint32_t cpd_sb_proc_ckpt_rd_set( > static uint32_t cpd_sb_proc_ckpt_dest_add(CPD_CB *cb, CPD_MBCSV_MSG *msg); > static uint32_t cpd_sb_proc_ckpt_dest_del(CPD_CB *cb, CPD_MBCSV_MSG *msg); > static uint32_t cpd_sb_proc_ckpt_usrinfo(CPD_CB *cb, CPD_MBCSV_MSG > *msg); > +static uint32_t cpd_sb_proc_ckpt_usrinfo_2(CPD_CB *cb, CPD_MBCSV_MSG > +*msg); > static uint32_t cpd_sb_proc_ckpt_dest_down(CPD_CB *cb, CPD_MBCSV_MSG > *msg); > > const CPDS_EVT_HANDLER cpds_evt_dispatch_tbl[CPD_A2S_MSG_MAX_EVT - > CPD_A2S_MSG_BASE] = { @@ -45,6 +46,7 @@ const CPDS_EVT_HANDLER cpds_evt_dispatch > cpd_sb_proc_ckpt_unlink, > cpd_sb_proc_ckpt_usrinfo, > cpd_sb_proc_ckpt_dest_down, > + cpd_sb_proc_ckpt_usrinfo_2, > }; > > > /********************************************************************* > ****** @@ -280,7 +282,7 @@ uint32_t cpd_sb_proc_ckpt_dest_del(CPD_C > > /* IF CPND IS DOWN THEN CKPT_ID = 0 , DELETE THAT NODE INFO */ > if (msg->info.dest_del.ckpt_id == 0) { > - cpd_process_cpnd_del(cb, &msg->info.dest_del.mds_dest); > + cpd_process_cpnd_del_on_standby(cb, &msg->info.dest_del.mds_dest); > return proc_rc; > } > > @@ -549,7 +551,7 @@ uint32_t cpd_sb_proc_ckpt_dest_add(CPD_C > /*************************************************************************** ******* > * Name : cpd_sb_proc_ckpt_usrinfo > * > -* Description : This routine will set the active replica flag of the > checkpoint > +* Description : This routine will update user information of the > +checkpoint > * > * Arguments : CPD_MBCSV_MSG - mbcsv message > > @@ -581,6 +583,72 @@ uint32_t cpd_sb_proc_ckpt_usrinfo(CPD_CB > } > > > /********************************************************************* > ************* > +* Name : cpd_sb_proc_ckpt_usrinfo_2 > +* > +* Description : This routine will update user information of the checkpoint > +* This version includes user information of each node > +* > +* Arguments : CPD_MBCSV_MSG - mbcsv message > + > +* Return Values : Success / Error > + > +* Notes : None > + > +********************************************************************* > +*************/ uint32_t cpd_sb_proc_ckpt_usrinfo_2(CPD_CB *cb, > +CPD_MBCSV_MSG *msg) { > + CPD_CKPT_INFO_NODE *ckpt_node = NULL; > + > + TRACE_ENTER(); > + cpd_ckpt_node_get(&cb->ckpt_tree, &msg->info.dest_add.ckpt_id, &ckpt_node); > + if (ckpt_node == NULL) { > + TRACE_4("cpd ckpt info node get failed for ckpt_id: %llx",msg->info.dest_add.ckpt_id); > + return NCSCC_RC_FAILURE; > + } > + > + ckpt_node->num_users = msg->info.usr_info_2.num_user; > + ckpt_node->num_writers = msg->info.usr_info_2.num_writer; > + ckpt_node->num_readers = msg->info.usr_info_2.num_reader; > + ckpt_node->num_sections = msg->info.usr_info_2.num_sections; > + ckpt_node->ckpt_on_scxb1 = msg->info.usr_info_2.ckpt_on_scxb1; > + ckpt_node->ckpt_on_scxb2 = msg->info.usr_info_2.ckpt_on_scxb2; > + > + /* Free the old node_users */ > + CPD_NODE_USER_INFO *node_user = ckpt_node->node_users; > + CPD_NODE_USER_INFO *prev_node_user = NULL; > + > + while (node_user) { > + CPD_NODE_USER_INFO *prev_node_user = node_user; > + node_user = node_user->next; > + free(prev_node_user); > + } > + ckpt_node->node_users = NULL; > + > + /* Update the node_users */ > + int i = 0; > + for (i = 0; i < msg->info.usr_info_2.node_users_cnt; i++) { > + CPD_NODE_USER_INFO *node_user = malloc(sizeof(CPD_NODE_USER_INFO)); > + if (prev_node_user != NULL) > + prev_node_user->next = node_user; > + > + node_user->dest = msg->info.usr_info_2.node_list[i].dest; > + node_user->num_users = msg->info.usr_info_2.node_list[i].num_users; > + node_user->num_readers = msg->info.usr_info_2.node_list[i].num_readers; > + node_user->num_writers = msg->info.usr_info_2.node_list[i].num_writers; > + node_user->next = NULL; > + prev_node_user = node_user; > + > + if (i == 0) > + ckpt_node->node_users = node_user; > + } > + > + free(msg->info.usr_info_2.node_list); > + > + TRACE_LEAVE(); > + return NCSCC_RC_SUCCESS; > +} > + > +/******************************************************************** > +************** > * Name : cpd_sb_proc_ckpt_dest_down > * > * Description : This routine will start the timer ------------------------------------------------------------------------------ Site24x7 APM Insight: Get Deep Visibility into Application Performance APM + Mobile APM + RUM: Monitor 3 App instances at just $35/Month Monitor end-to-end web transactions and take corrective actions now Troubleshoot faster and improve end-user experience. Signup Now! http://pubads.g.doubleclick.net/gampad/clk?id=267308311&iu=/4140 _______________________________________________ Opensaf-devel mailing list [email protected] https://lists.sourceforge.net/lists/listinfo/opensaf-devel
