Hi Hoang, This patch looks more stable , I haven t found any issue in basic in service upgrade testing testing .
I am going to ACK the patch. -AVM On 8/3/2016 4:11 PM, Vo Minh Hoang wrote: > Dear Mahesh, > > I have just submit a V4 patch that try to eliminate the possible error in > communicating between old and new version. > > My testing shows OK result but when I cannot reproduce the problem exactly, > I do not have high confident about it. > > Would you please help me review and check the result of this patch. > > Thank you and best regards, > 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