From: Mohan Kanakam <mo...@hasolutions.in>

---
 src/ntf/ntfd/NtfSubscription.cc | 38 +++++++++++++++++++++++++++++++++++++-
 src/ntf/ntfd/ntfs_evt.c         | 12 ++++++++++++
 src/ntf/ntfd/ntfs_mbcsv.c       | 18 ++++++++++++++++++
 3 files changed, 67 insertions(+), 1 deletion(-)

diff --git a/src/ntf/ntfd/NtfSubscription.cc b/src/ntf/ntfd/NtfSubscription.cc
index 9bf47c0..1e1d2c7 100644
--- a/src/ntf/ntfd/NtfSubscription.cc
+++ b/src/ntf/ntfd/NtfSubscription.cc
@@ -23,6 +23,7 @@
 #include "base/logtrace.h"
 #include "ntf/common/ntfsv_mem.h"
 #include "ntf/ntfd/NtfClient.h"
+#include "ntfs.h"
 
 #if DISCARDED_TEST
 /* TODO REMOVE TEST */
@@ -280,9 +281,44 @@ void NtfSubscription::sendNotification(NtfSmartPtr& 
notification,
        * list.*/
       notificationSentConfirmed(client->getClientId(), getSubscriptionId(),
                                 notification->getNotificationId(), 1);
-    }
+      { //Start
+        // Generate Discarded Ntf Clean up as
+        //we are not able to send second time.
+        ntfsv_ntfs_evt_t *evt = NULL;
+        if (NULL ==
+            (evt = (ntfsv_ntfs_evt_t *)calloc(1, sizeof(ntfsv_ntfs_evt_t)))) {
+          LOG_WA("mem alloc FAILURE");
+          goto done;
+        }
+        evt->evt_type = NTFSV_NTFS_EVT_NTFA_DOWN;
+        /** Initialize the Event Header **/
+        evt->cb_hdl = 1; //Filling non-zero to determine  an internal event
+        evt->fr_node_id =
+          m_NTFS_GET_NODE_ID_FROM_ADEST(client->getMdsDest());
+        evt->fr_dest = client->getMdsDest();
+
+        /** Initialize the MDS portion of the header **/
+        evt->info.mds_info.node_id =
+          m_NTFS_GET_NODE_ID_FROM_ADEST(client->getMdsDest());
+        evt->info.mds_info.mds_dest_id = client->getMdsDest();
+        TRACE("Nodeid: %u, MdsDest: %lu", evt->info.mds_info.node_id,
+            evt->info.mds_info.mds_dest_id);
+        TRACE("mdsDest: %" PRIu64, evt->info.mds_info.mds_dest_id);
+
+        /* Push the event and we are done */
+        if (m_NCS_IPC_SEND(&ntfs_cb->mbx, evt, NCS_IPC_PRIORITY_HIGH) !=
+            NCSCC_RC_SUCCESS) {
+          LOG_WA("ipc send failed");
+          free(evt);
+          goto done;
+        }
+        LOG_ER("Down event missed for app with mdsdest: %lu on node: %u",
+            evt->info.mds_info.mds_dest_id, evt->info.mds_info.node_id);
+      } // End
+  }
     free(d_info.discardedNotificationIdentifiers);
   }
+done:
   TRACE_LEAVE();
 }
 
diff --git a/src/ntf/ntfd/ntfs_evt.c b/src/ntf/ntfd/ntfs_evt.c
index 19b2f60..40cd083 100644
--- a/src/ntf/ntfd/ntfs_evt.c
+++ b/src/ntf/ntfd/ntfs_evt.c
@@ -110,6 +110,18 @@ static uint32_t proc_ntfa_updn_mds_msg(ntfsv_ntfs_evt_t 
*evt)
                } else {
                        clientRemoveMDS(evt->fr_dest);
                }
+    if (evt->cb_hdl == 1) {
+      // Internal down generated event in case of discarded ntf
+      TRACE("Sending async update to standby");
+      ntfsv_ckpt_msg_t ckpt;
+      memset(&ckpt, 0, sizeof(ckpt));
+      ckpt.header.ckpt_rec_type = NTFS_CKPT_AGENT_DOWN;
+      ckpt.header.num_ckpt_records = 1;
+      ckpt.header.data_len = 0;
+      ckpt.ckpt_rec.agent_dest = evt->fr_dest;
+      update_standby(&ckpt, NCS_MBCSV_ACT_RMV);
+    }
+
                break;
        default:
                TRACE("Unknown evt type!!!");
diff --git a/src/ntf/ntfd/ntfs_mbcsv.c b/src/ntf/ntfd/ntfs_mbcsv.c
index 713615a..83162a5 100644
--- a/src/ntf/ntfd/ntfs_mbcsv.c
+++ b/src/ntf/ntfd/ntfs_mbcsv.c
@@ -602,6 +602,24 @@ static uint32_t ckpt_encode_async_update(ntfs_cb_t 
*ntfs_cb, EDU_HDL edu_hdl,
                        TRACE_2("eduerr: %x", ederror);
                }
                break;
+  case NTFS_CKPT_AGENT_DOWN:
+    /* Encode RegHeader */
+    ckpt_hdr.ckpt_rec_type = NTFS_CKPT_AGENT_DOWN;
+    ckpt_hdr.num_ckpt_records = 1;
+    ckpt_hdr.data_len = 0;
+    enc_ckpt_header(pheader, ckpt_hdr);
+
+    TRACE_2("NTFS_CKPT_AGENT_DOWN REC: ENCODE");
+    rc = m_NCS_EDU_EXEC(&ntfs_cb->edu_hdl,
+        ncs_edp_mds_dest,
+        &cbk_arg->info.encode.io_uba,
+        EDP_OP_TYPE_ENC, &data->ckpt_rec.agent_dest, &ederror);
+    if (rc != NCSCC_RC_SUCCESS) {
+      m_NCS_EDU_PRINT_ERROR_STRING(ederror);
+      /* free(data); FIX ??? */
+      TRACE_2("eduerr: %x", ederror);
+    }
+    break;
        case NTFS_CKPT_SUBSCRIBE:
                TRACE("Async update NTFS_CKPT_SUBSCRIBE");
                ckpt_hdr.ckpt_rec_type = NTFS_CKPT_SUBSCRIBE;
-- 
2.7.4



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

Reply via email to