- When sending response message which Adest not exist (already down)
current MDS try to wait for 1.5 seconds before conclude no route to
send response message.

- There are 2 scenarios may have:
UP -> DOWN -> receive SNDRSP -> response timeout after 1.5s
UP -> receive SNDRSP -> DOWN -> response timeout after 1.5s

- With this change, MDS will not waste for 1.5s which can cause trouble
for higher layer services, e.g: ntf, imm, etc...
---
 src/mds/mds_c_api.c     | 70 ++++++++++++++++++++++++++++++++++++++++-
 src/mds/mds_c_sndrcv.c  | 52 ++++++++++++++++++++++++++++--
 src/mds/mds_core.h      | 25 +++++++++++++--
 src/mds/mds_dt2c.h      |  2 +-
 src/mds/mds_dt_common.c | 22 ++++++++++++-
 5 files changed, 162 insertions(+), 9 deletions(-)

diff --git a/src/mds/mds_c_api.c b/src/mds/mds_c_api.c
index 132555b8e..5dd30c536 100644
--- a/src/mds/mds_c_api.c
+++ b/src/mds/mds_c_api.c
@@ -1900,6 +1900,32 @@ 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;
+                       adest_info->tmr_start = false;
+                       ncs_patricia_tree_add(
+                           &gl_mds_mcm_cb->adest_list,
+                           (NCS_PATRICIA_NODE *)adest_info);
+                       m_MDS_LOG_DBG("MCM:API: Adest=%" PRIu64
+                               " svc_cnt=%u", adest, adest_info->svc_cnt);
+               } else {
+                       adest_info->svc_cnt++;
+                       m_MDS_LOG_DBG("MCM:API: Adest=%" PRIu64
+                               " svc_cnt=%u", adest, adest_info->svc_cnt);
+               }
+       }
+
        status = mds_get_subtn_res_tbl_by_adest(local_svc_hdl, svc_id, vdest_id,
                                                adest, &log_subtn_result_info);
 
@@ -3571,6 +3597,24 @@ 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 */
 
+               /* If adest exist and no sndrsp, start a timer */
+               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 &&
+                           adest_info->sndrsp_cnt == 0) {
+                               m_MDS_LOG_INFO("MCM:API: Adest=%" PRIu64
+                                       " down timer start", adest);
+                               if (adest_info->tmr_start == false) {
+                                       adest_info->tmr_start = true;
+                                       start_mds_down_tmr(adest, svc_id);
+                               }
+                       }
+               }
+
                if (vdest_id == m_VDEST_ID_FOR_ADEST_ENTRY) {
                        status = mds_subtn_res_tbl_del(
                            local_svc_hdl, svc_id, vdest_id, adest,
@@ -4956,6 +5000,17 @@ uint32_t mds_mcm_init(void)
                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, L 
mds_mcm_init");
+               return NCSCC_RC_FAILURE;
+       }
+
        /* SERVICE TREE */
        memset(&pat_tree_params, 0, sizeof(NCS_PATRICIA_PARAMS));
        pat_tree_params.key_size = sizeof(MDS_SVC_HDL);
@@ -4966,7 +5021,12 @@ uint32_t mds_mcm_init(void)
                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, L 
mds_mcm_init");
+               }
+               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, L 
mds_mcm_init");
                }
                return NCSCC_RC_FAILURE;
        }
@@ -4989,6 +5049,11 @@ uint32_t mds_mcm_init(void)
                        m_MDS_LOG_ERR(
                            "MCM:API: patricia_tree_destroy: vdest :failure, L 
mds_mcm_init");
                }
+               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, L 
mds_mcm_init");
+               }
                return NCSCC_RC_FAILURE;
        }
 
@@ -5036,6 +5101,9 @@ uint32_t mds_mcm_destroy(void)
        /* VDEST TREE */
        ncs_patricia_tree_destroy(&gl_mds_mcm_cb->vdest_list);
 
+       /* ADEST TREE */
+       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 7850ac714..4d8865b3a 100644
--- a/src/mds/mds_c_sndrcv.c
+++ b/src/mds/mds_c_sndrcv.c
@@ -2650,6 +2650,22 @@ static uint32_t mcm_pvt_red_snd_process_common(
                }
        }
 
+       /* Update adest sndrsp counter */
+       if ((MDS_SENDTYPE_RSP == req->i_sendtype) ||
+           (MDS_SENDTYPE_RRSP == req->i_sendtype)) {
+               MDS_ADEST_INFO *adest_info =
+                       (MDS_ADEST_INFO *)ncs_patricia_tree_get(
+                               &gl_mds_mcm_cb->adest_list, (uint8_t *)&dest);
+               if (adest_info) {
+                       adest_info->sndrsp_cnt--;
+                       if (adest_info->sndrsp_cnt == 0 &&
+                           adest_info->svc_cnt == 0)
+                               ncs_patricia_tree_del(
+                                       &gl_mds_mcm_cb->adest_list,
+                                       (NCS_PATRICIA_NODE *)adest_info);
+               }
+       }
+
        if (NCSCC_RC_SUCCESS != mds_subtn_res_tbl_get_by_adest(
                                    svc_cb->svc_hdl, to_svc_id, dest_vdest_id,
                                    dest, &role_ret, &subs_result_hdl)) {
@@ -2716,9 +2732,27 @@ 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) {
+                               adest_info->sndrsp_cnt--;
+                               m_MDS_LOG_NOTIFY(
+                                       "MDS_SND_RCV: Adest already down,"
+                                       " skip response, remain sndrsp_cnt=%d",
+                                       adest_info->sndrsp_cnt);
+                               if (adest_info->sndrsp_cnt == 0)
+                                       ncs_patricia_tree_del(
+                                           &gl_mds_mcm_cb->adest_list,
+                                           (NCS_PATRICIA_NODE *)adest_info);
+                               return NCSCC_RC_FAILURE;
+                       } else {
+                               time_wait = true;
+                               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");
@@ -5024,6 +5058,18 @@ 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;
                }
+
+               /* Update adest sndrsp counter */
+               if (recv->snd_type == MDS_SENDTYPE_SNDRSP ||
+                   recv->snd_type == MDS_SENDTYPE_REDRSP) {
+                       MDS_ADEST_INFO *adest_info =
+                               (MDS_ADEST_INFO *)ncs_patricia_tree_get(
+                                       &gl_mds_mcm_cb->adest_list,
+                                       (uint8_t *)&recv->src_adest);
+                       if (adest_info)
+                               adest_info->sndrsp_cnt++;
+               }
+
                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..f5d4d22a1 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 */
+  uint32_t sndrsp_cnt; /* Counter for adest send sndrsp */
+  bool tmr_start; /* Adest down timer start flag */
+} MDS_ADEST_INFO;
+
 typedef struct mds_svc_info {
   /* Indexing info */
   NCS_PATRICIA_NODE svc_list_node;
@@ -301,6 +311,7 @@ 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 */
@@ -681,6 +692,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 +788,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..19000b387 100644
--- a/src/mds/mds_dt_common.c
+++ b/src/mds/mds_dt_common.c
@@ -998,6 +998,26 @@ 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=%" PRIu64
+                                           " down", 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->tmr_start = false;
+                                               if (adest_info->svc_cnt == 0 &&
+                                                   adest_info->sndrsp_cnt == 0)
+                                                   ncs_patricia_tree_del(
+                                                       
&gl_mds_mcm_cb->adest_list,
+                                                       (NCS_PATRICIA_NODE 
*)adest_info);
+                                       }
                                }
 
                                if (tmr_req_info->info.down_event_tmr_info
@@ -1700,7 +1720,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;
 }
 
 /****************************************************************************
-- 
2.17.1



_______________________________________________
Opensaf-devel mailing list
Opensaf-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/opensaf-devel

Reply via email to