Hi Mahesh,

Could you please have a look at the patch for #1669 and #1670. Thanks.

Best regards,
Nhat Pham

-----Original Message-----
From: Nhat Pham [mailto:[email protected]]
Sent: Friday, January 29, 2016 2:02 PM
To: 'A V Mahesh' <[email protected]>; [email protected]
Cc: [email protected]
Subject: Re: [devel] [PATCH 1 of 1] cpsv: To update checkpoint user number
for each node [#1669]

Hi Mahesh,

It was verified with upgrade case.

Best regards,
Nhat Pham

-----Original Message-----
From: A V Mahesh [mailto:[email protected]]
Sent: Friday, January 29, 2016 11:29 AM
To: Nhat Pham <[email protected]>; [email protected]
Cc: [email protected]
Subject: Re: [PATCH 1 of 1] cpsv: To update checkpoint user number for each
node [#1669]

>[Nhat Pham] The cpd_process_cpnd_down() handles event node down. It
>makes confusion. Thus, it is changed to cpd_proc_node_down().
>There is another function cpnd_down_process() in cpd_evt.c handles cpnd
>process down event.


Ok , i will check that , by the way have you verified the
   in-services upgrade with this patch ( old CPD and New CPD )  ?

-AVM

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



----------------------------------------------------------------------------
--
Site24x7 APM Insight: Get Deep Visibility into Application Performance APM +
Mobile APM + RUM: Monitor 3 App instances at just $35/Month Monitor
end-to-end web transactions and take corrective actions now Troubleshoot
faster and improve end-user experience. Signup Now!
http://pubads.g.doubleclick.net/gampad/clk?id=267308311&iu=/4140
_______________________________________________
Opensaf-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/opensaf-devel



------------------------------------------------------------------------------
Transform Data into Opportunity.
Accelerate data analysis in your applications with
Intel Data Analytics Acceleration Library.
Click to learn more.
http://pubads.g.doubleclick.net/gampad/clk?id=278785231&iu=/4140
_______________________________________________
Opensaf-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/opensaf-devel

Reply via email to