When there are no more log client in log agent, unregister mds and shutdown log 
agent.
---
 src/log/agent/lga_agent.cc | 18 +++++++++++++++
 src/log/agent/lga_agent.h  |  3 +++
 src/log/agent/lga_mds.cc   | 28 +++++++++++++++++++++++
 src/log/agent/lga_mds.h    |  1 +
 src/log/agent/lga_util.cc  | 47 ++++++++++++++++++++++++++++++++++++++
 src/log/agent/lga_util.h   |  1 +
 6 files changed, 98 insertions(+)

diff --git a/src/log/agent/lga_agent.cc b/src/log/agent/lga_agent.cc
index b61d82a03..bbff2b0ad 100644
--- a/src/log/agent/lga_agent.cc
+++ b/src/log/agent/lga_agent.cc
@@ -625,6 +625,11 @@ SaAisErrorT LogAgent::saLogDispatch(SaLogHandleT logHandle,
   return ais_rc;
 }
 
+size_t LogAgent::CountClient() {
+  ScopeLock scopeLock(mutex_);
+  return client_list_.size();
+}
+
 SaAisErrorT LogAgent::SendFinalizeMsg(uint32_t client_id) {
   uint32_t mds_rc;
   lgsv_msg_t msg, *o_msg = nullptr;
@@ -671,6 +676,7 @@ SaAisErrorT LogAgent::saLogFinalize(SaLogHandleT logHandle) 
{
   bool updated = false;
   bool is_locked = false;
   SaAisErrorT ais_rc = SA_AIS_OK;
+  int rc;
 
   TRACE_ENTER();
 
@@ -751,6 +757,18 @@ SaAisErrorT LogAgent::saLogFinalize(SaLogHandleT 
logHandle) {
     }
   }
 
+  if (CountClient() == 0) {
+    // Shutdown the agent if there are no clients
+    rc = lga_shutdown();
+    if (rc != NCSCC_RC_SUCCESS) {
+      TRACE("lga_shutdown FAILED");
+      ais_rc = SA_AIS_ERR_LIBRARY;
+    }
+    m_NCS_SEL_OBJ_RMV_IND(&init_clm_status_sel_, true, false);
+    m_NCS_SEL_OBJ_RMV_IND(&log_server_up_sel_, true, false);
+    atomic_data_.waiting_log_server_up = true;
+  }
+
   TRACE_LEAVE2("ais_rc = %s", saf_error(ais_rc));
   return ais_rc;
 }
diff --git a/src/log/agent/lga_agent.h b/src/log/agent/lga_agent.h
index 957adc716..55632684a 100644
--- a/src/log/agent/lga_agent.h
+++ b/src/log/agent/lga_agent.h
@@ -198,6 +198,9 @@ class LogAgent {
   // True if there is no LOG server at all (headless)
   bool is_no_log_server() const;
 
+  // Count number of clients in agent
+  size_t CountClient();
+
   // Form finalize Msg and send to MDS
   SaAisErrorT SendFinalizeMsg(uint32_t client_id);
 
diff --git a/src/log/agent/lga_mds.cc b/src/log/agent/lga_mds.cc
index 838eca5e1..2836ce2ed 100644
--- a/src/log/agent/lga_mds.cc
+++ b/src/log/agent/lga_mds.cc
@@ -1329,6 +1329,34 @@ uint32_t lga_mds_init() {
   return rc;
 }
 
+/****************************************************************************
+  Name          : lga_mds_deinit
+
+  Description   : This routine unregisters the LGA Service in MDS.
+
+  Return Values : NCSCC_RC_SUCCESS/NCSCC_RC_FAILURE
+
+  Notes         : None.
+******************************************************************************/
+uint32_t lga_mds_deinit() {
+  NCSMDS_INFO mds_info;
+  uint32_t rc = NCSCC_RC_SUCCESS;
+  std::atomic<MDS_HDL> &mds_hdl = LogAgent::instance()->atomic_get_mds_hdl();
+  TRACE_ENTER();
+
+  memset(&mds_info, 0, sizeof(NCSMDS_INFO));
+  mds_info.i_mds_hdl = mds_hdl.load();
+  mds_info.i_svc_id = NCSMDS_SVC_ID_LGA;
+  mds_info.i_op = MDS_UNINSTALL;
+  if ((rc = ncsmds_api(&mds_info)) != NCSCC_RC_SUCCESS) {
+    TRACE("mds api call failed");
+    return NCSCC_RC_FAILURE;
+  }
+
+  TRACE_LEAVE();
+  return rc;
+}
+
 /****************************************************************************
   Name          : lga_mds_msg_sync_send
 
diff --git a/src/log/agent/lga_mds.h b/src/log/agent/lga_mds.h
index 2fbe906e3..af5608849 100644
--- a/src/log/agent/lga_mds.h
+++ b/src/log/agent/lga_mds.h
@@ -25,6 +25,7 @@ struct lga_cb_t;
 struct lgsv_msg_t;
 
 uint32_t lga_mds_init();
+uint32_t lga_mds_deinit();
 void lga_msg_destroy(lgsv_msg_t *msg);
 
 uint32_t lga_mds_msg_sync_send(lgsv_msg_t *i_msg, lgsv_msg_t **o_msg,
diff --git a/src/log/agent/lga_util.cc b/src/log/agent/lga_util.cc
index d64496839..c1a50f5ae 100644
--- a/src/log/agent/lga_util.cc
+++ b/src/log/agent/lga_util.cc
@@ -54,12 +54,32 @@ static unsigned int lga_create() {
     TRACE("WaitLogServerUp FAILED");
     // Delete the lga init instances
     LogAgent::instance()->RemoveAllLogClients();
+    // Unregister MDS
+    lga_mds_deinit();
     return rc;
   }
 
   return rc;
 }
 
+/**
+ * Delete log agent
+ * 
+ * @return unsigned int
+ */
+static unsigned int lga_delete() {
+  unsigned int rc = NCSCC_RC_SUCCESS;
+
+  // Unregister in MDS
+  rc = lga_mds_deinit();
+  if (rc != NCSCC_RC_SUCCESS) {
+    TRACE("lga_mds_deinit FAILED");
+    rc = NCSCC_RC_FAILURE;
+  }
+
+  return rc;
+}
+
 /**
  * Initiate the agent when first used.
  * Start NCS service
@@ -92,6 +112,33 @@ done:
   return rc;
 }
 
+/**
+ * Shutdown the agent when not in use
+ * Stop NCS service and unregister MDS
+ *
+ * @return unsigned int
+ */
+unsigned int lga_shutdown() {
+  unsigned int rc = NCSCC_RC_SUCCESS;
+  ScopeLock lock(init_lock);
+  std::atomic<MDS_HDL>& mds_hdl = LogAgent::instance()->atomic_get_mds_hdl();
+  TRACE_ENTER();
+
+  if (mds_hdl) {
+    rc = lga_delete();
+    if (rc != NCSCC_RC_SUCCESS) {
+      TRACE("lga_delete FAILED");
+      goto done;
+    }
+    ncs_agents_shutdown();
+    mds_hdl = 0;
+  }
+
+done:
+  TRACE_LEAVE2("rc: %u", rc);
+  return rc;
+}
+
 /**
  * Increase user counter
  * The function help to trace number of clients
diff --git a/src/log/agent/lga_util.h b/src/log/agent/lga_util.h
index 81175dd22..179c6ae9d 100644
--- a/src/log/agent/lga_util.h
+++ b/src/log/agent/lga_util.h
@@ -23,6 +23,7 @@
 #include <saLog.h>
 
 unsigned int lga_startup();
+unsigned int lga_shutdown();
 void lga_increase_user_counter(void);
 void lga_decrease_user_counter(void);
 
-- 
2.17.1



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

Reply via email to