Hi Hoang,

The  new messages between old cpd to new cpd  (A to S) was not handled ,

please refer `osaf/libs/common/cpsv/cpsv_edu.c ` file for MSG_FORMAT_VER 
handling or any old patches


-AVM

On 8/9/2016 3:05 PM, A V Mahesh wrote:
> Hi Hoang ,
>
> Please hold on pushing.
>
> On new node we have see some issue please check CPD enode and decode 
> once ( new patch node ) .
>
> Aug  9 14:23:01 SC-1 osafckptd[20478]: hj_enc.c:311: 
> decode_flatten_space: Assertion 'p8' failed.
> Aug  9 14:23:01 SC-1 osafamfnd[20439]: NO 
> 'safComp=CPD,safSu=SC-1,safSg=2N,safApp=OpenSAF' faulted due to 
> 'avaDown' : Recovery is 'nodeFailfast'
>
> -AVM
>
>
>
> On 8/9/2016 2:09 PM, A V Mahesh wrote:
>> ACK,
>>
>> -AVM
>>
>>
>> On 8/3/2016 4:02 PM, Hoang Vo 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  |   13 ++
>>>   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   |   96 ++++++++++++++++---
>>>   osaf/services/saf/cpsv/cpd/cpd_proc.c    |  148 
>>> +++++++++++++++++++++++++++++++
>>>   osaf/services/saf/cpsv/cpd/cpd_red.c     |   30 ++++-
>>>   osaf/services/saf/cpsv/cpd/cpd_sbevt.c   |   57 +++++++++--
>>>   10 files changed, 344 insertions(+), 35 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
>>> @@ -64,6 +64,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 +88,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
>>> @@ -24,6 +24,10 @@
>>>     #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
>>>    *
>>> @@ -439,12 +443,7 @@ uint32_t cpd_mbcsv_enc_async_update(CPD_
>>>         case CPD_A2S_MSG_CKPT_USR_INFO:
>>>           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:
>>> @@ -744,7 +743,6 @@ uint32_t cpd_mbcsv_dec_async_update(CPD_
>>>       CPSV_CKPT_DEST_INFO *ckpt_dest_add = NULL;
>>>       CPSV_CKPT_DEST_INFO *ckpt_dest_del = NULL;
>>>       CPSV_CKPT_DEST_INFO *ckpt_dest_down = NULL;
>>> -    CPD_A2S_CKPT_USR_INFO *ckpt_usr_info = NULL;
>>>       uint32_t evt_type, rc = NCSCC_RC_SUCCESS;
>>>       EDU_ERR ederror = 0;
>>>   @@ -889,16 +887,8 @@ uint32_t cpd_mbcsv_dec_async_update(CPD_
>>>           break;
>>>         case CPD_A2S_MSG_CKPT_USR_INFO:
>>> -        ckpt_usr_info = &cpd_msg->info.usr_info;
>>> -        rc = m_NCS_EDU_EXEC(&cb->edu_hdl, 
>>> FUNC_NAME(CPD_A2S_CKPT_USR_INFO), &arg->info.decode.i_uba,
>>> -                    EDP_OP_TYPE_DEC, &ckpt_usr_info, &ederror);
>>> -        if (rc != NCSCC_RC_SUCCESS) {
>>> -            TRACE_4("edu exec async dest del failed");
>>> -            rc = NCSCC_RC_FAILURE;
>>> -            goto end;
>>> -        }
>>>           cpd_msg->type = evt_type;
>>> -        cpd_msg->info.usr_info = *ckpt_usr_info;
>>> + 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) {
>>> @@ -1154,3 +1144,77 @@ 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
>>> + *
>>> + * 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
>>> + *
>>> + *
>>> + * 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);
>>> +
>>> +    // Handle old message
>>> +    if (!usr_info->node_users_cnt) {
>>> +        TRACE_LEAVE();
>>> +        return;
>>> +    }
>>> +
>>> +    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.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
>>> @@ -549,14 +549,15 @@ uint32_t cpd_sb_proc_ckpt_dest_add(CPD_C
>>> /**********************************************************************************
>>>  
>>>
>>>   *  Name :  cpd_sb_proc_ckpt_usrinfo
>>>   *
>>> -*  Description : This routine will set the active replica flag of 
>>> the checkpoint
>>> +*  Description : This routine will update user information of the 
>>> checkpoint
>>> +*                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(CPD_CB *cb, CPD_MBCSV_MSG *msg)
>>>   {
>>> @@ -569,12 +570,48 @@ uint32_t cpd_sb_proc_ckpt_usrinfo(CPD_CB
>>>           return NCSCC_RC_FAILURE;
>>>       }
>>>   -    ckpt_node->num_users = msg->info.usr_info.num_user;
>>> -    ckpt_node->num_writers = msg->info.usr_info.num_writer;
>>> -    ckpt_node->num_readers = msg->info.usr_info.num_reader;
>>> -    ckpt_node->num_sections = msg->info.usr_info.num_sections;
>>> -    ckpt_node->ckpt_on_scxb1 = msg->info.usr_info.ckpt_on_scxb1;
>>> -    ckpt_node->ckpt_on_scxb2 = msg->info.usr_info.ckpt_on_scxb2;
>>> +    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;
>>> +
>>> +    if (!msg->info.usr_info_2.node_users_cnt) {
>>> +        TRACE_LEAVE();
>>> +        return NCSCC_RC_SUCCESS;
>>> +    }
>>> +
>>> +    /* 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;
>>
>


------------------------------------------------------------------------------
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
[email protected]
https://lists.sourceforge.net/lists/listinfo/opensaf-devel

Reply via email to