Dear Mahesh, Thank you very much for your provided information. I will continue investigating this problem.
Sincerely, Hoang -----Original Message----- From: A V Mahesh [mailto:mahesh.va...@oracle.com] Sent: Wednesday, July 27, 2016 4:53 PM To: Vo Minh Hoang <hoang.m...@dektech.com.au>; 'Nhat Pham' <nhat.p...@dektech.com.au>; anders.wid...@ericsson.com Cc: opensaf-devel@lists.sourceforge.net Subject: Re: [PATCH 1 of 1] cpsv: To update checkpoint user number for each node [#1669] V3 Hi Hoang, I still able to reproduce the problem , some time it increments two time of current readers , some time it is getting decremented to less then zero ( variable are set (0xfffffff6) ) Unfortunately I don't have any specific steps order , but this issue occurs in cluster setup with 1new controller & 1 old controller and 2 old payloads when tow application opened & holded on old payloads ( don't exist) , and try to do fail-overs of controllers and then exit the applications on both payloads, you will end up with error. I broad , I suggest you look at the new messages that are getting introduced in this patch are prevented with version check ============================================================================ =========================================== PL-3:~ # immlist safCkpt=checkpoint_test77 Name Type Value(s) ======================================================================== safCkpt SA_STRING_T safCkpt=checkpoint_test77 saCkptCheckpointUsedSize SA_UINT64_T 110 (0x6e) saCkptCheckpointSize SA_UINT64_T 2097152 (0x200000) saCkptCheckpointRetDuration SA_TIME_T 9223372036854775807 (0x7fffffffffffffff, Sat Apr 12 05:17:16 2262) saCkptCheckpointNumWriters SA_UINT32_T 4294967286 (0xfffffff6) saCkptCheckpointNumSections SA_UINT32_T 1 (0x1) saCkptCheckpointNumReplicas SA_UINT32_T 2 (0x2) saCkptCheckpointNumReaders SA_UINT32_T 4294967286 (0xfffffff6) saCkptCheckpointNumOpeners SA_UINT32_T 0 (0x0) saCkptCheckpointNumCorruptSections SA_UINT32_T 0 (0x0) saCkptCheckpointMaxSections SA_UINT32_T 1 (0x1) saCkptCheckpointMaxSectionSize SA_UINT64_T 2097152 (0x200000) saCkptCheckpointMaxSectionIdSize SA_UINT64_T 256 (0x100) *saCkptCheckpointCreationTimestamp SA_TIME_T 1469609754000000000 (0x14651a48f19e8400, Wed Jul 27 14:25:54 2016)* saCkptCheckpointCreationFlags SA_UINT32_T 2 (0x2) SaImmAttrImplementerName SA_STRING_T safCheckPointService SaImmAttrClassName SA_STRING_T SaCkptCheckpoint SaImmAttrAdminOwnerName SA_STRING_T <Empty> SC-2:~ # immlist safCkpt=checkpoint_test77 Name Type Value(s) ======================================================================== safCkpt SA_STRING_T safCkpt=checkpoint_test77 saCkptCheckpointUsedSize SA_UINT64_T 110 (0x6e) saCkptCheckpointSize SA_UINT64_T 2097152 (0x200000) saCkptCheckpointRetDuration SA_TIME_T 9223372036854775807 (0x7fffffffffffffff, Sat Apr 12 05:17:16 2262) saCkptCheckpointNumWriters SA_UINT32_T 20 (0x14) saCkptCheckpointNumSections SA_UINT32_T 1 (0x1) saCkptCheckpointNumReplicas SA_UINT32_T 2 (0x2) saCkptCheckpointNumReaders SA_UINT32_T 20 (0x14) saCkptCheckpointNumOpeners SA_UINT32_T 20 (0x14) saCkptCheckpointNumCorruptSections SA_UINT32_T 0 (0x0) saCkptCheckpointMaxSections SA_UINT32_T 1 (0x1) saCkptCheckpointMaxSectionSize SA_UINT64_T 2097152 (0x200000) saCkptCheckpointMaxSectionIdSize SA_UINT64_T 256 (0x100) *saCkptCheckpointCreationTimestamp SA_TIME_T 1469610614000000000 (0x14651b112d9d1c00, Wed Jul 27 14:40:14 2016)* saCkptCheckpointCreationFlags SA_UINT32_T 2 (0x2) SaImmAttrImplementerName SA_STRING_T safCheckPointService SaImmAttrClassName SA_STRING_T SaCkptCheckpoint SaImmAttrAdminOwnerName SA_STRING_T <Empty> ============================================================================ =========================================== -AVM On 7/26/2016 8:41 AM, Vo Minh Hoang wrote: > Dear Mahesh, > > Thank you very much for your checking. > > Unfortunately, I unsuccessfully reproduce this problem in our environment. > Would you please send us the trace log of d and nd of both SC-1 and > SC-2 when error occur for investigating. > > For reference, here is my reproduce steps: > 1. prepare SC-1 with patch, SC-2 without patch 2. create checkpoint in > SC-1 3. open checkpoint in SC-2 4. immlist to get checkpoint > information 5. unlink and close checkpoint in SC-1 6. immlist again to > confirm its deletion 7. create checkpoint again in SC-1 8. list all > replica in sharemem, there is a different here, in you error log, why > sharemem is different between SC-1 and SC-2? In my opinion sharemem > should be one. > 9. immlist to check information > > Please tell us if I miss something. > I am sorry for any inconvenient. > > Thank you and best regards. > Hoang > > -----Original Message----- > From: A V Mahesh [mailto:mahesh.va...@oracle.com] > Sent: Friday, July 15, 2016 10:26 AM > To: Nhat Pham <nhat.p...@dektech.com.au>; anders.wid...@ericsson.com; > Nhat Pham <nhat.p...@dektech.com.au>; Hoang Vo > <hoang.m...@dektech.com.au> > Cc: opensaf-devel@lists.sourceforge.net > Subject: Re: [PATCH 1 of 1] cpsv: To update checkpoint user number for > each node [#1669] V3 > > Hi Hoang /Nhat Pham, > > > The basic testing with in-service upgrade (one old controller with > out patch and one new controller with patch ) is corrupting the > Writers/Readers/Openers DB, > > please verify in-service upgrade test with collocated & no-collocated > ckpts and address new issue and publish V4 patch. > > SC-1:/avm/opensaf_app/cpsv_applications/virtualaddr # immlist > safCkpt=checkpoint_test77 > Name Type Value(s) > ======================================================================== > safCkpt SA_STRING_T > safCkpt=checkpoint_test77 > saCkptCheckpointUsedSize SA_UINT64_T 110 (0x6e) > saCkptCheckpointSize SA_UINT64_T 2097152 > (0x200000) > saCkptCheckpointRetDuration SA_TIME_T > 9223372036854775807 (0x7fffffffffffffff, Sat Apr 12 05:17:16 2262) > saCkptCheckpointNumWriters SA_UINT32_T > 4294967291 (0xfffffffb) > saCkptCheckpointNumSections SA_UINT32_T 1 (0x1) > saCkptCheckpointNumReplicas SA_UINT32_T 4 (0x4) > saCkptCheckpointNumReaders SA_UINT32_T > 4294967291 (0xfffffffb) > saCkptCheckpointNumOpeners SA_UINT32_T > 4294967291 (0xfffffffb) > saCkptCheckpointNumCorruptSections SA_UINT32_T 0 (0x0) > saCkptCheckpointMaxSections SA_UINT32_T 1 (0x1) > saCkptCheckpointMaxSectionSize SA_UINT64_T 2097152 > (0x200000) > saCkptCheckpointMaxSectionIdSize SA_UINT64_T 256 (0x100) > saCkptCheckpointCreationTimestamp SA_TIME_T > 1468552553000000000 (0x146158c4278eda00, Fri Jul 15 08:45:53 2016) > saCkptCheckpointCreationFlags SA_UINT32_T 2 (0x2) > SaImmAttrImplementerName SA_STRING_T > safCheckPointService > SaImmAttrClassName SA_STRING_T > SaCkptCheckpoint > SaImmAttrAdminOwnerName SA_STRING_T <Empty> > > -AVM > > > On 7/13/2016 12:44 PM, A V Mahesh wrote: >> Hi Hoang /Nhat Pham, >> >> I just started testing , fowling test case is failing , I may report >> more as soon as I get some >> >> Test case 1 : >> >> Step 1 : saCkptCheckpointOpen on SC-1 >> >> SC-1:# ./node_A >> 0 saCkptCheckpointOpen returned checkpointHandle 626bf0 >> 1 saCkptCheckpointOpen returned checkpointHandle 626e70 >> 2 saCkptCheckpointOpen returned checkpointHandle 626ff0 >> 3 saCkptCheckpointOpen returned checkpointHandle 627170 >> 4 saCkptCheckpointOpen returned checkpointHandle 6272f0 >> saCkptCheckpointWrite Waiting to Read from Checkpoint .... >> saCkptCheckpointWrite Press <Enter> key to continue... >> >> 1 saCkptCheckpointWrite checkpointHandle 626bf0 >> 2 saCkptCheckpointWrite checkpointHandle 626bf0 >> 3 saCkptCheckpointWrite checkpointHandle 626bf0 >> 4 saCkptCheckpointWrite checkpointHandle 626bf0 >> 222 saCkptCheckpointWrite checkpointHandle 626bf0 >> saCkptCheckpointRead Waiting to Read from Checkpoint .... >> saCkptCheckpointRead Press <Enter> key to continue... >> >> Step 2 : saCkptCheckpointOpen on SC-2 >> >> SC-2:/avm/opensaf_app/cpsv_applications/virtualaddr # ./node_B >> 0 saCkptCheckpointOpen returned checkpointHandle 626bf0 >> 1 saCkptCheckpointOpen returned checkpointHandle 626e70 >> 2 saCkptCheckpointOpen returned checkpointHandle 626ff0 >> 3 saCkptCheckpointOpen returned checkpointHandle 627170 >> 4 saCkptCheckpointOpen returned checkpointHandle 6272f0 >> saCkptCheckpointWrite Waiting to Read from Checkpoint .... >> saCkptCheckpointWrite Press <Enter> key to continue... >> >> 1 saCkptCheckpointWrite checkpointHandle 626bf0 >> 2 saCkptCheckpointWrite checkpointHandle 626bf0 >> 3 saCkptCheckpointWrite checkpointHandle 626bf0 >> 4 saCkptCheckpointWrite checkpointHandle 626bf0 >> 222 saCkptCheckpointWrite checkpointHandle 626bf0 >> saCkptCheckpointRead Waiting to Read from Checkpoint .... >> saCkptCheckpointRead Press <Enter> key to continue... >> >> Step 3 : do <SC-1> # immlist safCkpt=checkpoint_test77 >> >> Name Type Value(s) >> ======================================================================== >> safCkpt SA_STRING_T >> safCkpt=checkpoint_test77 >> saCkptCheckpointUsedSize SA_UINT64_T 110 (0x6e) >> saCkptCheckpointSize SA_UINT64_T 2097152 >> (0x200000) >> saCkptCheckpointRetDuration SA_TIME_T >> 9223372036854775807 (0x7fffffffffffffff, Sat Apr 12 05:17:16 2262) >> saCkptCheckpointNumWriters SA_UINT32_T 10 (0xa) >> saCkptCheckpointNumSections SA_UINT32_T 1 (0x1) >> saCkptCheckpointNumReplicas SA_UINT32_T 2 (0x2) >> saCkptCheckpointNumReaders SA_UINT32_T 10 (0xa) >> saCkptCheckpointNumOpeners SA_UINT32_T 10 (0xa) >> saCkptCheckpointNumCorruptSections SA_UINT32_T 0 (0x0) >> saCkptCheckpointMaxSections SA_UINT32_T 1 (0x1) >> saCkptCheckpointMaxSectionSize SA_UINT64_T 2097152 >> (0x200000) >> saCkptCheckpointMaxSectionIdSize SA_UINT64_T 256 >> (0x100) >> saCkptCheckpointCreationTimestamp SA_TIME_T >> 1468392720000000000 (0x1460c766225ea000, Wed Jul 13 12:22:00 2016) >> saCkptCheckpointCreationFlags SA_UINT32_T 9 (0x9) >> SaImmAttrImplementerName SA_STRING_T >> safCheckPointService >> SaImmAttrClassName SA_STRING_T >> SaCkptCheckpoint >> SaImmAttrAdminOwnerName SA_STRING_T <Empty> >> >> >> Step 4 : saCkptCheckpointUnlink & saCkptCheckpointClose on SC-1 >> >> Attempt 1-0 Read DataBuffer >> :VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV >> V VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV >> 0 saCkptCheckpointClose checkpointHandle 626bf0 >> 1 saCkptCheckpointClose checkpointHandle 626e70 >> 2 saCkptCheckpointClose checkpointHandle 626ff0 >> 3 saCkptCheckpointClose checkpointHandle 627170 >> 4 saCkptCheckpointClose checkpointHandle 6272f0 >> >> Step 5 : do <SC-1> # immlist safCkpt=checkpoint_test77 >> >> error - object or attribute does not exist as expected >> >> Step 6 : saCkptCheckpointOpen on SC-1 again ( note on SC-2 ckpt >> still open ) >> >> SC-1:# ./node_A >> 0 saCkptCheckpointOpen returned checkpointHandle 626bf0 >> 1 saCkptCheckpointOpen returned checkpointHandle 626e70 >> 2 saCkptCheckpointOpen returned checkpointHandle 626ff0 >> 3 saCkptCheckpointOpen returned checkpointHandle 627170 >> 4 saCkptCheckpointOpen returned checkpointHandle 6272f0 >> saCkptCheckpointWrite Waiting to Read from Checkpoint .... >> saCkptCheckpointWrite Press <Enter> key to continue... >> >> Step 7 : check Replicas on both ( you will see 2 Replicas and >> partially 10 Openers ) >> >> SC-1: # ls /dev/shm/ >> opensaf_CPND_CHECKPOINT_INFO_131343 opensaf_NCS_GLND_LCK_CKPT_INFO >> opensaf_NCS_MQND_QUEUE_CKPT_INFO opensaf_NCS_GLND_EVT_CKPT_INFO >> opensaf_NCS_GLND_RES_CKPT_INFO >> opensaf_safCkpt=checkpoint_test7_131343_2 >> >> SC-2: # ls >> opensaf_CPND_CHECKPOINT_INFO_131599 opensaf_NCS_GLND_LCK_CKPT_INFO >> opensaf_NCS_MQND_QUEUE_CKPT_INFO opensaf_NCS_GLND_EVT_CKPT_INFO >> opensaf_NCS_GLND_RES_CKPT_INFO >> opensaf_safCkpt=checkpoint_test7_131599_1 >> >> Step 8 : do <SC-1> # immlist safCkpt=checkpoint_test77 ( observe >> the result of Replicas & Openers) >> >> Name Type Value(s) >> ======================================================================== >> safCkpt SA_STRING_T >> safCkpt=checkpoint_test77 >> saCkptCheckpointUsedSize SA_UINT64_T 0 (0x0) >> saCkptCheckpointSize SA_UINT64_T 2097152 >> (0x200000) >> saCkptCheckpointRetDuration SA_TIME_T >> 9223372036854775807 (0x7fffffffffffffff, Sat Apr 12 05:17:16 2262) >> saCkptCheckpointNumWriters SA_UINT32_T 5 (0x5) >> saCkptCheckpointNumSections SA_UINT32_T 1 (0x1) >> saCkptCheckpointNumReplicas SA_UINT32_T 1 (0x1) >> saCkptCheckpointNumReaders SA_UINT32_T 5 (0x5) >> saCkptCheckpointNumOpeners SA_UINT32_T 5 (0x5) >> saCkptCheckpointNumCorruptSections SA_UINT32_T 0 (0x0) >> saCkptCheckpointMaxSections SA_UINT32_T 1 (0x1) >> saCkptCheckpointMaxSectionSize SA_UINT64_T 2097152 >> (0x200000) >> saCkptCheckpointMaxSectionIdSize SA_UINT64_T 256 >> (0x100) >> saCkptCheckpointCreationTimestamp SA_TIME_T >> 1468392866000000000 (0x1460c78820a5d400, Wed Jul 13 12:24:26 2016) >> saCkptCheckpointCreationFlags SA_UINT32_T 9 (0x9) >> SaImmAttrImplementerName SA_STRING_T >> safCheckPointService >> SaImmAttrClassName SA_STRING_T >> SaCkptCheckpoint >> SaImmAttrAdminOwnerName SA_STRING_T <Empty> >> >> >> -AVM >> >> >> On 5/4/2016 12:17 PM, Nhat Pham wrote: >>> osaf/libs/common/cpsv/include/cpd_cb.h | 2 + >>> osaf/libs/common/cpsv/include/cpd_proc.h | 3 + >>> osaf/libs/common/cpsv/include/cpd_red.h | 14 ++ >>> osaf/libs/common/cpsv/include/cpsv_evt.h | 8 + >>> osaf/services/saf/cpsv/cpd/cpd_db.c | 14 ++- >>> osaf/services/saf/cpsv/cpd/cpd_evt.c | 8 + >>> osaf/services/saf/cpsv/cpd/cpd_mbcsv.c | 90 +++++++++++++++++- >>> osaf/services/saf/cpsv/cpd/cpd_proc.c | 148 >>> +++++++++++++++++++++++++++++++ >>> osaf/services/saf/cpsv/cpd/cpd_red.c | 32 +++++- >>> osaf/services/saf/cpsv/cpd/cpd_sbevt.c | 68 ++++++++++++++ >>> 10 files changed, 370 insertions(+), 17 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 >>> @@ -92,6 +92,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 >>> @@ -108,5 +108,8 @@ 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); >>> uint32_t cpd_proc_ckpt_update_post(CPD_CB *cb); >>> #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 >>> @@ -840,6 +840,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_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) { @@ -1258,8 +1266,11 @@ void >>> cpd_clm_cluster_track_cb(const SaCl >>> /* 2. Check the HA_STATE */ >>> for (counter = 0; counter < >>> notificationBuffer->numberOfItems; counter++) { >>> if >>> (notificationBuffer->notification[counter].clusterChange == >>> SA_CLM_NODE_LEFT) { >>> + node_id = >>> notificationBuffer->notification[counter].clusterNode.nodeId; >>> + >>> + cpd_proc_update_user_info_when_node_down(cb, >>> + node_id); >>> + >>> if (cb->ha_state == SA_AMF_HA_ACTIVE) { >>> - node_id = >>> notificationBuffer->notification[counter].clusterNode.nodeId; >>> key = node_id; >>> cpnd_info_node = (CPD_CPND_INFO_NODE *) >>> ncs_patricia_tree_get(&cb->cpnd_tree, (uint8_t *)&key); @@ -1267,7 >>> +1278,6 @@ void cpd_clm_cluster_track_cb(const SaCl >>> cpd_process_cpnd_down(cb, >>> &cpnd_info_node->cpnd_dest); >>> } >>> } else if (cb->ha_state == SA_AMF_HA_STANDBY) { >>> - node_id = >>> notificationBuffer->notification[counter].clusterNode.nodeId; >>> key = node_id; >>> cpnd_info_node = (CPD_CPND_INFO_NODE *) >>> ncs_patricia_tree_get(&cb->cpnd_tree, (uint8_t *)&key); 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 >>> @@ -249,6 +249,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; >>> @@ -447,6 +448,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) { >>> @@ -456,6 +459,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) { >>> @@ -493,6 +498,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) { >>> @@ -503,6 +510,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); 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,71 @@ 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_uint64(io_uba, usr_info->ckpt_id); >>> + 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_uint64(io_uba, (uint64_t *) &usr_info->ckpt_id); >>> + 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); >>> + } >>> + >>> + usr_info->node_list = node_list; >>> + >>> + 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 >>> @@ -1581,3 +1581,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, >>> }; >>> /******************************************************************* >>> * >>> ******* @@ -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 > > ------------------------------------------------------------------------------ What NetFlow Analyzer can do for you? Monitors network bandwidth and traffic patterns at an interface-level. Reveals which users, apps, and protocols are consuming the most bandwidth. Provides multi-vendor support for NetFlow, J-Flow, sFlow and other flows. Make informed decisions using capacity planning reports.http://sdm.link/zohodev2dev _______________________________________________ Opensaf-devel mailing list Opensaf-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/opensaf-devel