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

Reply via email to