- When sending response message to Adest which is not exist (crash/terminate), current MDS try to wait for 1.5 seconds before conclude no route to send RSP.
- Here are scenarios may waste 1.5s waiting: SVCs DOWN (dead adest or vdest role change) -> get SNDRSP -> send RSP (wait 1.5s) get SNDRSP -> SVCs DOWN (dead adest or vdest role change) -> send RSP (wait 1.5s) This long wait time cause trouble for higher layer services, e.g: ntf, imm, etc... where there are many agents send initialize request (use message SNDRSP type) - Solution: create adest list, a timer start when last SVC of adest DOWN. When sending RSP to this adest, the wait time will reduce to only 10ms. Notice that following origin behavior is kept: No any SVC UP before -> get SNDRSP -> send RSP (wait 1.5s) - New TC tet_send_response_tp_13() is created to verify this scenario. --- src/mds/apitest/mdstipc.h | 1 + src/mds/apitest/mdstipc_api.c | 107 ++++++++++++++++++ src/mds/apitest/mdstipc_conf.c | 1 - src/mds/mds_c_api.c | 199 +++++++++++++++++++++++++++------ src/mds/mds_c_sndrcv.c | 38 ++++--- src/mds/mds_core.h | 30 ++++- src/mds/mds_dt2c.h | 2 +- src/mds/mds_dt_common.c | 24 +++- src/mds/mds_main.c | 4 + 9 files changed, 350 insertions(+), 56 deletions(-) diff --git a/src/mds/apitest/mdstipc.h b/src/mds/apitest/mdstipc.h index b56940ea6..2b9fcf2fd 100644 --- a/src/mds/apitest/mdstipc.h +++ b/src/mds/apitest/mdstipc.h @@ -157,6 +157,7 @@ TET_VDEST gl_tet_vdest[4]; /*change it to 6 to run VDS Redundancy: 101 for Stress*/ TET_SVC gl_tet_svc; TET_MDS_RECVD_MSG_INFO gl_rcvdmsginfo, gl_direct_rcvmsginfo; +TET_EVENT_INFO gl_event_data; int gl_vdest_indx; MDS_DIRECT_BUFF direct_buff; diff --git a/src/mds/apitest/mdstipc_api.c b/src/mds/apitest/mdstipc_api.c index 847f9a7f1..4a97f99e9 100644 --- a/src/mds/apitest/mdstipc_api.c +++ b/src/mds/apitest/mdstipc_api.c @@ -28,6 +28,7 @@ #include "mdstipc.h" #include "base/ncssysf_tmr.h" #include "base/osaf_poll.h" +#include "base/osaf_time.h" #define MSG_SIZE MDS_DIRECT_BUF_MAXSIZE static MDS_CLIENT_MSG_FORMAT_VER gl_set_msg_fmt_ver; @@ -5633,6 +5634,109 @@ TODO: Check this testcase, it was outcomment already in the "tet"-files } #endif +void tet_send_response_tp_13() +{ + int FAIL = 1; + mds_shutdown(); + + printf("\nTest Case 13: Now send_response" + " to dead Adest don't stuck in waiting 1.5s\n"); + /*--------------------------------------------------------------------*/ + pid_t pid = fork(); + if (pid == 0) { + /* child as sender */ + MDS_SVC_ID to_svcids[] = {NCSMDS_SVC_ID_EXTERNAL_MIN}; + mds_startup(); + if (adest_get_handle() == NCSCC_RC_SUCCESS) { + if (mds_service_install( + gl_tet_adest.mds_pwe1_hdl, + NCSMDS_SVC_ID_INTERNAL_MIN, 1, + NCSMDS_SCOPE_NONE, false, false) + == NCSCC_RC_SUCCESS) { + if (mds_service_subscribe( + gl_tet_adest.mds_pwe1_hdl, + NCSMDS_SVC_ID_INTERNAL_MIN, + NCSMDS_SCOPE_INTRANODE, + 1, to_svcids) + == NCSCC_RC_SUCCESS) { + sleep(1); + TET_MDS_MSG msg; + mds_send_get_response( + gl_tet_adest.mds_pwe1_hdl, + NCSMDS_SVC_ID_INTERNAL_MIN, + NCSMDS_SVC_ID_EXTERNAL_MIN, + gl_tet_adest.svc[0].svcevt[0].dest, + 1000, MDS_SEND_PRIORITY_HIGH, + &msg); + } + } + } + mds_shutdown(); + } else if (pid > 0) { + /* parent as receiver */ + struct timespec time1, time2, wait_time; + MDS_SVC_ID to_svcids[] = {NCSMDS_SVC_ID_INTERNAL_MIN}; + mds_startup(); + if (adest_get_handle() == NCSCC_RC_SUCCESS) { + if (mds_service_install( + gl_tet_adest.mds_pwe1_hdl, + NCSMDS_SVC_ID_EXTERNAL_MIN, 1, + NCSMDS_SCOPE_NONE, true, false) + == NCSCC_RC_SUCCESS) { + if (mds_service_subscribe( + gl_tet_adest.mds_pwe1_hdl, + NCSMDS_SVC_ID_EXTERNAL_MIN, + NCSMDS_SCOPE_INTRANODE, + 1, to_svcids) + == NCSCC_RC_SUCCESS) { + sleep(6); // Wait for subscribe timer expiry + while (is_adest_sel_obj_found(0)) { + if (mds_service_retrieve( + gl_tet_adest.mds_pwe1_hdl, + NCSMDS_SVC_ID_EXTERNAL_MIN, + SA_DISPATCH_ONE) + == NCSCC_RC_SUCCESS) { + if (gl_rcvdmsginfo.msg) + kill(pid, SIGKILL); + if (gl_event_data.event == NCSMDS_DOWN) + break; + } + } + osaf_clock_gettime( + CLOCK_MONOTONIC, + &time1); + TET_MDS_MSG msg; + if (mds_send_response( + gl_tet_adest.mds_pwe1_hdl, + NCSMDS_SVC_ID_EXTERNAL_MIN, + &msg) + == NCSCC_RC_FAILURE) { + osaf_clock_gettime( + CLOCK_MONOTONIC, + &time2); + osaf_timespec_subtract( + &time2, + &time1, + &wait_time); + if (osaf_timespec_to_millis( + &wait_time) > 50) { + printf("\nResponse to dead" + " Adest hang > 50ms"); + } else { + FAIL = 0; + } + } + } + } + } + kill(pid, SIGKILL); + mds_shutdown(); + } else { + printf("\nFAIL to fork()\n"); + } + test_validate(FAIL, 0); +} + void tet_vdest_rcvr_thread() { MDS_SVC_ID svc_id; @@ -14130,6 +14234,9 @@ __attribute__((constructor)) static void mdsTipcAPI_constructor(void) // TODO: Check this testcase // test_case_add(9, tet_send_response_tp_12, "Able to send a messages // 200 times to Svc 2000 on Active Vdest"); + test_case_add( + 9, tet_send_response_tp_13, + "Now send_response to dead Adest don't stuck in waiting 1.5s"); test_suite_add(10, "Send All test cases"); test_case_add( diff --git a/src/mds/apitest/mdstipc_conf.c b/src/mds/apitest/mdstipc_conf.c index 44814427e..eb0de75c5 100644 --- a/src/mds/apitest/mdstipc_conf.c +++ b/src/mds/apitest/mdstipc_conf.c @@ -2107,7 +2107,6 @@ uint32_t tet_mds_cb_direct_rcv(NCSMDS_CALLBACK_INFO *mds_to_svc_info) uint32_t tet_mds_svc_event(NCSMDS_CALLBACK_INFO *mds_to_svc_info) { int i, j, k; - TET_EVENT_INFO gl_event_data; gl_event_data.ur_svc_id = mds_to_svc_info->info.svc_evt.i_your_id; diff --git a/src/mds/mds_c_api.c b/src/mds/mds_c_api.c index 132555b8e..a76b2b76a 100644 --- a/src/mds/mds_c_api.c +++ b/src/mds/mds_c_api.c @@ -27,6 +27,79 @@ #include "mds_log.h" #include "mds_core.h" +/* Internal use functions */ +static void start_mds_down_tmr(MDS_DEST adest, MDS_SVC_ID svc_id) +{ + MDS_TMR_REQ_INFO *tmr_req_info = calloc(1, sizeof(MDS_TMR_REQ_INFO)); + if (tmr_req_info == NULL) { + m_MDS_LOG_ERR("mds_mcm_svc_down out of memory\n"); + abort(); + } + + tmr_req_info->type = MDS_DOWN_TMR; + tmr_req_info->info.down_event_tmr_info.adest = adest; + tmr_req_info->info.down_event_tmr_info.svc_id = svc_id; + + tmr_t tmr_id = ncs_tmr_alloc(__FILE__, __LINE__); + if (tmr_id == NULL) { + m_MDS_LOG_ERR("mds_mcm_svc_down out of memory\n"); + abort(); + } + + tmr_req_info->info.down_event_tmr_info.tmr_id = tmr_id; + + uint32_t tmr_hdl = + ncshm_create_hdl(NCS_HM_POOL_ID_COMMON, NCS_SERVICE_ID_COMMON, + (NCSCONTEXT)(tmr_req_info)); + + if (svc_id == 0) { + MDS_ADEST_INFO *adest_info = + (MDS_ADEST_INFO *)ncs_patricia_tree_get( + &gl_mds_mcm_cb->adest_list, + (uint8_t *)&adest); + if (adest_info) { + adest_info->tmr_req_info = tmr_req_info; + adest_info->tmr_hdl = tmr_hdl; + } + } + tmr_id = ncs_tmr_start(tmr_id, MDS_DOWN_TMR_VAL, + (TMR_CALLBACK)mds_tmr_callback, + (void *)(long)(tmr_hdl), __FILE__, __LINE__); + assert(tmr_id != NULL); +} + +static void stop_mds_down_tmr(MDS_ADEST_INFO *adest_info) +{ + assert(adest_info != NULL); + if (adest_info->tmr_req_info) { + MDS_TMR_REQ_INFO *tmr_req_info = adest_info->tmr_req_info; + ncs_tmr_stop(tmr_req_info->info.down_event_tmr_info.tmr_id); + ncs_tmr_free(tmr_req_info->info.down_event_tmr_info.tmr_id); + m_MMGR_FREE_TMR_INFO(tmr_req_info); + adest_info->tmr_req_info = NULL; + ncshm_destroy_hdl( + NCS_SERVICE_ID_COMMON, + (uint32_t)adest_info->tmr_hdl); + } +} + +static void mds_adest_list_cleanup(void) +{ + MDS_ADEST_INFO *adest_info = NULL; + + adest_info = (MDS_ADEST_INFO *)ncs_patricia_tree_getnext( + &gl_mds_mcm_cb->adest_list, NULL); + while (adest_info != NULL) { + stop_mds_down_tmr(adest_info); + ncs_patricia_tree_del( + &gl_mds_mcm_cb->adest_list, + (NCS_PATRICIA_NODE *)adest_info); + m_MMGR_FREE_ADEST_INFO(adest_info); + adest_info = (MDS_ADEST_INFO *)ncs_patricia_tree_getnext( + &gl_mds_mcm_cb->adest_list, NULL); + } +} + /********************************************************* Function NAME: mds_validate_pwe_hdl @@ -1449,6 +1522,26 @@ uint32_t mds_mcm_svc_unsubscribe(NCSMDS_INFO *info) subscr_req_hdl); } + /* Find and delete related adest from adest list */ + MDS_SUBSCRIPTION_RESULTS_INFO *s_info = NULL; + mds_subtn_res_tbl_getnext_any(svc_hdl, + info->info.svc_cancel.i_svc_ids[i], + &s_info); + if (s_info) { + MDS_ADEST_INFO *adest_info = + (MDS_ADEST_INFO *) + ncs_patricia_tree_get( + &gl_mds_mcm_cb->adest_list, + (uint8_t *)&s_info->key.adest); + if (adest_info) { + stop_mds_down_tmr(adest_info); + ncs_patricia_tree_del( + &gl_mds_mcm_cb->adest_list, + (NCS_PATRICIA_NODE *)adest_info); + m_MMGR_FREE_ADEST_INFO(adest_info); + } + } + /* Delete all MDTM entries */ mds_subtn_res_tbl_del_all(svc_hdl, info->info.svc_cancel.i_svc_ids[i]); @@ -1900,6 +1993,29 @@ uint32_t mds_mcm_svc_up(PW_ENV_ID pwe_id, MDS_SVC_ID svc_id, V_DEST_RL role, /*************** Validation for SCOPE **********************/ + if (adest != m_MDS_GET_ADEST) { + MDS_ADEST_INFO *adest_info = + (MDS_ADEST_INFO *)ncs_patricia_tree_get( + &gl_mds_mcm_cb->adest_list, + (uint8_t *)&adest); + if (!adest_info) { + /* Add adest to adest list */ + adest_info = m_MMGR_ALLOC_ADEST_INFO; + memset(adest_info, 0, sizeof(MDS_ADEST_INFO)); + adest_info->adest = adest; + adest_info->node.key_info = + (uint8_t *)&adest_info->adest; + adest_info->svc_cnt = 1; + ncs_patricia_tree_add( + &gl_mds_mcm_cb->adest_list, + (NCS_PATRICIA_NODE *)adest_info); + } else { + if (adest_info->svc_cnt == 0) + stop_mds_down_tmr(adest_info); + adest_info->svc_cnt++; + } + } + status = mds_get_subtn_res_tbl_by_adest(local_svc_hdl, svc_id, vdest_id, adest, &log_subtn_result_info); @@ -3377,36 +3493,6 @@ uint32_t mds_mcm_svc_up(PW_ENV_ID pwe_id, MDS_SVC_ID svc_id, V_DEST_RL role, return NCSCC_RC_SUCCESS; } -static void start_mds_down_tmr(MDS_DEST adest, MDS_SVC_ID svc_id) -{ - MDS_TMR_REQ_INFO *tmr_req_info = calloc(1, sizeof(MDS_TMR_REQ_INFO)); - if (tmr_req_info == NULL) { - m_MDS_LOG_ERR("mds_mcm_svc_down out of memory\n"); - abort(); - } - - tmr_req_info->type = MDS_DOWN_TMR; - tmr_req_info->info.down_event_tmr_info.adest = adest; - tmr_req_info->info.down_event_tmr_info.svc_id = svc_id; - - tmr_t tmr_id = ncs_tmr_alloc(__FILE__, __LINE__); - if (tmr_id == NULL) { - m_MDS_LOG_ERR("mds_mcm_svc_down out of memory\n"); - abort(); - } - - tmr_req_info->info.down_event_tmr_info.tmr_id = tmr_id; - - uint32_t tmr_hdl = - ncshm_create_hdl(NCS_HM_POOL_ID_COMMON, NCS_SERVICE_ID_COMMON, - (NCSCONTEXT)(tmr_req_info)); - - tmr_id = ncs_tmr_start(tmr_id, 1000, // 10ms unit - (TMR_CALLBACK)mds_tmr_callback, - (void *)(long)(tmr_hdl), __FILE__, __LINE__); - assert(tmr_id != NULL); -} - /********************************************************* Function NAME: mds_mcm_svc_down @@ -3571,6 +3657,22 @@ uint32_t mds_mcm_svc_down(PW_ENV_ID pwe_id, MDS_SVC_ID svc_id, V_DEST_RL role, /* Discard : Getting down before getting up */ } else { /* Entry exist in subscription result table */ + MDS_ADEST_INFO *adest_info = + (MDS_ADEST_INFO *)ncs_patricia_tree_get( + &gl_mds_mcm_cb->adest_list, + (uint8_t *)&adest); + if (adest_info) { + adest_info->svc_cnt--; + if (adest_info->svc_cnt == 0) { + m_MDS_LOG_INFO( + "MCM:API: Adest <0x%08x, %u>" + " down timer start", + m_MDS_GET_NODE_ID_FROM_ADEST(adest), + m_MDS_GET_PROCESS_ID_FROM_ADEST(adest)); + start_mds_down_tmr(adest, 0); + } + } + if (vdest_id == m_VDEST_ID_FOR_ADEST_ENTRY) { status = mds_subtn_res_tbl_del( local_svc_hdl, svc_id, vdest_id, adest, @@ -4952,7 +5054,18 @@ uint32_t mds_mcm_init(void) ncs_patricia_tree_init(&gl_mds_mcm_cb->vdest_list, &pat_tree_params)) { m_MDS_LOG_ERR( - "MCM:API: patricia_tree_init: vdest :failure, L mds_mcm_init"); + "MCM:API: patricia_tree_init: vdest :failure"); + return NCSCC_RC_FAILURE; + } + + /* ADEST TREE */ + memset(&pat_tree_params, 0, sizeof(NCS_PATRICIA_PARAMS)); + pat_tree_params.key_size = sizeof(MDS_DEST); + if (NCSCC_RC_SUCCESS != + ncs_patricia_tree_init(&gl_mds_mcm_cb->adest_list, + &pat_tree_params)) { + m_MDS_LOG_ERR( + "MCM:API: patricia_tree_init: adest :failure"); return NCSCC_RC_FAILURE; } @@ -4962,11 +5075,16 @@ uint32_t mds_mcm_init(void) if (NCSCC_RC_SUCCESS != ncs_patricia_tree_init(&gl_mds_mcm_cb->svc_list, &pat_tree_params)) { m_MDS_LOG_ERR( - "MCM:API: patricia_tree_init:service :failure, L mds_mcm_init"); + "MCM:API: patricia_tree_init:service :failure"); if (NCSCC_RC_SUCCESS != ncs_patricia_tree_destroy(&gl_mds_mcm_cb->vdest_list)) { m_MDS_LOG_ERR( - "MCM:API: patricia_tree_destroy: service :failure, L mds_mcm_init"); + "MCM:API: patricia_tree_destroy: vdest :failure"); + } + if (NCSCC_RC_SUCCESS != + ncs_patricia_tree_destroy(&gl_mds_mcm_cb->adest_list)) { + m_MDS_LOG_ERR( + "MCM:API: patricia_tree_destroy: adest :failure"); } return NCSCC_RC_FAILURE; } @@ -4978,16 +5096,21 @@ uint32_t mds_mcm_init(void) ncs_patricia_tree_init(&gl_mds_mcm_cb->subtn_results, &pat_tree_params)) { m_MDS_LOG_ERR( - "MCM:API: patricia_tree_init: subscription: failure, L mds_mcm_init"); + "MCM:API: patricia_tree_init: subscription: failure"); if (NCSCC_RC_SUCCESS != ncs_patricia_tree_destroy(&gl_mds_mcm_cb->svc_list)) { m_MDS_LOG_ERR( - "MCM:API: patricia_tree_destroy: service :failure, L mds_mcm_init"); + "MCM:API: patricia_tree_destroy: service :failure"); } if (NCSCC_RC_SUCCESS != ncs_patricia_tree_destroy(&gl_mds_mcm_cb->vdest_list)) { m_MDS_LOG_ERR( - "MCM:API: patricia_tree_destroy: vdest :failure, L mds_mcm_init"); + "MCM:API: patricia_tree_destroy: vdest :failure"); + } + if (NCSCC_RC_SUCCESS != + ncs_patricia_tree_destroy(&gl_mds_mcm_cb->adest_list)) { + m_MDS_LOG_ERR( + "MCM:API: patricia_tree_destroy: adest :failure"); } return NCSCC_RC_FAILURE; } @@ -5036,6 +5159,10 @@ uint32_t mds_mcm_destroy(void) /* VDEST TREE */ ncs_patricia_tree_destroy(&gl_mds_mcm_cb->vdest_list); + /* ADEST TREE */ + mds_adest_list_cleanup(); + ncs_patricia_tree_destroy(&gl_mds_mcm_cb->adest_list); + /* Free MCM control block */ m_MMGR_FREE_MCM_CB(gl_mds_mcm_cb); diff --git a/src/mds/mds_c_sndrcv.c b/src/mds/mds_c_sndrcv.c index 475749580..3106a0197 100644 --- a/src/mds/mds_c_sndrcv.c +++ b/src/mds/mds_c_sndrcv.c @@ -339,7 +339,7 @@ static uint32_t mds_subtn_tbl_add_disc_queue(MDS_SUBSCRIPTION_INFO *sub_info, MDS_VDEST_ID dest_vdest_id, MDS_DEST dest, MDS_HDL env_hdl, MDS_SVC_ID fr_svc_id, - bool time_wait); + int64_t time_wait); static uint32_t mcm_pvt_red_snd_process_common( MDS_HDL env_hdl, MDS_SVC_ID fr_svc_id, SEND_MSG msg, MDS_DEST to_dest, @@ -1908,7 +1908,7 @@ mds_mcm_process_disc_queue_checks(MDS_SVC_INFO *svc_cb, MDS_SVC_ID dest_svc_id, V_DEST_QA anchor; uint32_t disc_rc; MDS_HDL env_hdl; - bool time_wait = false; + int64_t time_wait = 0; MDS_SUBSCRIPTION_RESULTS_INFO *t_send_hdl = NULL; /* Subscription Result */ @@ -1950,7 +1950,7 @@ mds_mcm_process_disc_queue_checks(MDS_SVC_INFO *svc_cb, MDS_SVC_ID dest_svc_id, } else if (sub_info->tmr_flag != true) { if ((MDS_SENDTYPE_RSP == req->i_sendtype) || (MDS_SENDTYPE_RRSP == req->i_sendtype)) { - time_wait = true; + time_wait = MDS_SVC_UP_WAIT_LONG_TIME; m_MDS_LOG_INFO( "MDS_SND_RCV:Disc queue: Subscr exists no timer running: Waiting for some time\n"); } else { @@ -2070,15 +2070,10 @@ static uint32_t mds_subtn_tbl_add_disc_queue(MDS_SUBSCRIPTION_INFO *sub_info, MDS_VDEST_ID dest_vdest_id, MDS_DEST dest, MDS_HDL env_hdl, MDS_SVC_ID fr_svc_id, - bool time_wait) + int64_t time_wait) { MDS_AWAIT_DISC_QUEUE *add_ptr = NULL, *mov_ptr = NULL; uint32_t rc = NCSCC_RC_SUCCESS, status = 0; - int64_t timeout_val = 0; - - if (true == time_wait) { - timeout_val = 150; /* This may need a tuning */ - } mov_ptr = sub_info->await_disc_queue; add_ptr = m_MMGR_ALLOC_DISC_QUEUE; @@ -2123,7 +2118,7 @@ static uint32_t mds_subtn_tbl_add_disc_queue(MDS_SUBSCRIPTION_INFO *sub_info, case MDS_SENDTYPE_RBCAST: { m_MDS_LOG_INFO("MDS_SND_RCV: Waiting for timeout\n"); if (NCSCC_RC_SUCCESS != - mds_mcm_time_wait(&add_ptr->sel_obj, timeout_val)) { + mds_mcm_time_wait(&add_ptr->sel_obj, time_wait)) { m_MDS_LOG_ERR( "MDS_SND_RCV: timeout or error occured\n"); rc = NCSCC_RC_REQ_TIMOUT; @@ -2689,7 +2684,7 @@ static uint32_t mds_mcm_process_disc_queue_checks_redundant( MDS_SUBSCRIPTION_INFO *sub_info = NULL; MDS_SUBSCRIPTION_RESULTS_INFO *log_subtn_result_info = NULL; uint32_t disc_rc; - bool time_wait = false; + int64_t time_wait = 0; MDS_HDL env_hdl; @@ -2716,9 +2711,23 @@ static uint32_t mds_mcm_process_disc_queue_checks_redundant( } else if (sub_info->tmr_flag != true) { if ((MDS_SENDTYPE_RSP == req->i_sendtype) || (MDS_SENDTYPE_RRSP == req->i_sendtype)) { - time_wait = true; - m_MDS_LOG_INFO( - "MDS_SND_RCV:Disc queue red: Subscr exists no timer running: Waiting for some time\n"); + MDS_ADEST_INFO *adest_info = + (MDS_ADEST_INFO *)ncs_patricia_tree_get( + &gl_mds_mcm_cb->adest_list, + (uint8_t *)&anchor); + if (adest_info && adest_info->svc_cnt == 0) { + m_MDS_LOG_NOTIFY( + "MDS_SND_RCV: Adest <0x%08x, %u> may down," + " wait for some time for sure", + m_MDS_GET_NODE_ID_FROM_ADEST(anchor), + m_MDS_GET_PROCESS_ID_FROM_ADEST(anchor)); + time_wait = MDS_SVC_UP_WAIT_SHORT_TIME; + } else { + time_wait = MDS_SVC_UP_WAIT_LONG_TIME; + m_MDS_LOG_INFO( + "MDS_SND_RCV:Disc queue red: Subscr exists" + " no timer running: Waiting for some time"); + } } else { m_MDS_LOG_INFO( "MDS_SND_RCV: Subscription exists but Timer has expired\n"); @@ -5025,6 +5034,7 @@ static uint32_t mds_mcm_process_recv_snd_msg_common(MDS_SVC_INFO *svccb, mds_mcm_free_msg_memory(recv->msg); return NCSCC_RC_FAILURE; } + cbinfo.info.receive.pid = recv->pid; cbinfo.info.receive.uid = recv->uid; cbinfo.info.receive.gid = recv->gid; diff --git a/src/mds/mds_core.h b/src/mds/mds_core.h index c09b428ba..91d3675a1 100644 --- a/src/mds/mds_core.h +++ b/src/mds/mds_core.h @@ -204,12 +204,12 @@ typedef struct mds_subscription_info { #define m_GET_HDL_FROM_MDS_SVC_INFO(info) \ ((info->svc-id)<<32 || \ (info->parent_pwe->pwe_id)<<16 || \ - (info->parent_pwe->parent_vdest->vdest-id))) + (info->parent_pwe->parent_vdest->vdest-id)) #define m_GET_HDL_FROM_MDS_SVC_PWE_VDEST(s, p, v) \ ((s)<<32 || \ (p)<<16 || \ - (v))) + (v)) /**************************************\ MDS PWE related declarations @@ -251,6 +251,16 @@ typedef struct mds_vdest_info { } MDS_VDEST_INFO; +typedef struct mds_adest_info { + /* Indexing info */ + NCS_PATRICIA_NODE node; + /* Adest info */ + MDS_DEST adest; /* Key for Patricia node */ + uint16_t svc_cnt; /* Adest SVC counter */ + MDS_TMR_REQ_INFO *tmr_req_info; + uint32_t tmr_hdl; +} MDS_ADEST_INFO; + typedef struct mds_svc_info { /* Indexing info */ NCS_PATRICIA_NODE svc_list_node; @@ -301,12 +311,18 @@ typedef struct mds_mcm_cb { NCS_PATRICIA_TREE subtn_results; NCS_PATRICIA_TREE svc_list; /* Tree of MDS_SVC_INFO information */ NCS_PATRICIA_TREE vdest_list; /* Tree of MDS_VDEST_INFO information */ + NCS_PATRICIA_TREE adest_list; /* Tree of MDS_ADEST_INFO information */ } MDS_MCM_CB; /* Global MDSCB */ extern MDS_MCM_CB *gl_mds_mcm_cb; +/* Time wait for SVC UP */ +extern uint32_t MDS_SVC_UP_WAIT_LONG_TIME; +extern uint32_t MDS_SVC_UP_WAIT_SHORT_TIME; + /* Global TMR Values */ +extern uint32_t MDS_DOWN_TMR_VAL; extern uint32_t MDS_QUIESCED_TMR_VAL; extern uint32_t MDS_AWAIT_ACTIVE_TMR_VAL; extern uint32_t MDS_SUBSCRIPTION_TMR_VAL; @@ -681,6 +697,15 @@ uint32_t (*mds_mdtm_node_unsubscribe)(MDS_SUBTN_REF_VAL subtn_ref_val); m_NCS_MEM_FREE(p, NCS_MEM_REGION_TRANSIENT, NCS_SERVICE_ID_MDS, \ MDS_MEM_VDEST_INFO) +#define m_MMGR_ALLOC_ADEST_INFO \ + (MDS_ADEST_INFO *)m_NCS_MEM_ALLOC(sizeof(MDS_ADEST_INFO), \ + NCS_MEM_REGION_TRANSIENT, \ + NCS_SERVICE_ID_MDS, MDS_MEM_ADEST_INFO) + +#define m_MMGR_FREE_ADEST_INFO(p) \ + m_NCS_MEM_FREE(p, NCS_MEM_REGION_TRANSIENT, NCS_SERVICE_ID_MDS, \ + MDS_MEM_ADEST_INFO) + #define m_MMGR_ALLOC_PWE_INFO \ (MDS_PWE_INFO *)m_NCS_MEM_ALLOC(sizeof(MDS_PWE_INFO), \ NCS_MEM_REGION_TRANSIENT, \ @@ -768,7 +793,6 @@ typedef struct mds_mcm_msg_elem { NCSMDS_CALLBACK_INFO cbinfo; } event; } info; - } MDS_MCM_MSG_ELEM; /* ******************************************** */ diff --git a/src/mds/mds_dt2c.h b/src/mds/mds_dt2c.h index c92fecbba..49c9b09c4 100644 --- a/src/mds/mds_dt2c.h +++ b/src/mds/mds_dt2c.h @@ -223,7 +223,7 @@ typedef enum { MDS_MEM_DIRECT_BUFF, MDS_MEM_AWAIT_ACTIVE, MDS_MEM_MSGELEM, - MDS_MEM_ADEST_LIST, + MDS_MEM_ADEST_INFO, MDS_MEM_REASSEM_QUEUE, MDS_MEM_HDL_LIST, MDS_MEM_CACHED_EVENTS_LIST, diff --git a/src/mds/mds_dt_common.c b/src/mds/mds_dt_common.c index de1388367..381541055 100644 --- a/src/mds/mds_dt_common.c +++ b/src/mds/mds_dt_common.c @@ -998,6 +998,28 @@ uint32_t mds_tmr_mailbox_processing(void) info->mds_dest, info->pid); (void)mds_process_info_del(info); free(info); + } else { + MDS_DEST adest = + tmr_req_info->info + .down_event_tmr_info.adest; + m_MDS_LOG_INFO( + "TIMEOUT Adest <0x%08x, %u> down", + m_MDS_GET_NODE_ID_FROM_ADEST(adest), + m_MDS_GET_PROCESS_ID_FROM_ADEST( + adest)); + MDS_ADEST_INFO *adest_info = + (MDS_ADEST_INFO *) + ncs_patricia_tree_get( + &gl_mds_mcm_cb->adest_list, + (uint8_t *)&adest); + if (adest_info && + adest_info->svc_cnt == 0) { + ncs_patricia_tree_del( + &gl_mds_mcm_cb->adest_list, + (NCS_PATRICIA_NODE *) + adest_info); + m_MMGR_FREE_ADEST_INFO(adest_info); + } } if (tmr_req_info->info.down_event_tmr_info @@ -1700,7 +1722,7 @@ uint16_t mds_checksum(uint32_t length, uint8_t buff[]) /* Take the one's complement of sum */ sum = ~sum; - return ((uint16_t)sum); + return (uint16_t)sum; } /**************************************************************************** diff --git a/src/mds/mds_main.c b/src/mds/mds_main.c index c7d2f7b76..0bcb2f996 100644 --- a/src/mds/mds_main.c +++ b/src/mds/mds_main.c @@ -110,6 +110,10 @@ static void mds_mutex_init_once(void) /* global Log level variable */ uint32_t gl_mds_checksum = 0; +/* Time value in centiseconds */ +uint32_t MDS_SVC_UP_WAIT_LONG_TIME = 150; +uint32_t MDS_SVC_UP_WAIT_SHORT_TIME = 1; +uint32_t MDS_DOWN_TMR_VAL = 1000; uint32_t MDS_QUIESCED_TMR_VAL = 80; uint32_t MDS_AWAIT_ACTIVE_TMR_VAL = 18000; uint32_t MDS_SUBSCRIPTION_TMR_VAL = 500; -- 2.17.1 _______________________________________________ Opensaf-devel mailing list Opensaf-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/opensaf-devel