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