---
 src/amf/amfd/cb.h         |  1 +
 src/amf/amfd/main.cc      | 32 ++++++++++++++++++++++++++++++++
 src/amf/amfd/osaf-amfd.in |  1 +
 3 files changed, 34 insertions(+)

diff --git a/src/amf/amfd/cb.h b/src/amf/amfd/cb.h
index 7ac743e..89cf15d 100644
--- a/src/amf/amfd/cb.h
+++ b/src/amf/amfd/cb.h
@@ -202,6 +202,7 @@ typedef struct cl_cb_tag {
   AVD_TMR heartbeat_tmr; /* The timer for sending heart beats to nd. */
   SaTimeT heartbeat_tmr_period;
   uint32_t minimum_cluster_size;
+  std::string fmd_conf_file;
 
   uint32_t nodes_exit_cnt; /* The counter to identifies the number
                       of nodes that have exited the membership
diff --git a/src/amf/amfd/main.cc b/src/amf/amfd/main.cc
index 563dea5..a86e536 100644
--- a/src/amf/amfd/main.cc
+++ b/src/amf/amfd/main.cc
@@ -45,6 +45,7 @@
 
 #include "base/daemon.h"
 #include "base/logtrace.h"
+#include "osaf/consensus/consensus.h"
 #include "nid/agent/nid_api.h"
 #include "rde/agent/rda_papi.h"
 
@@ -70,6 +71,7 @@ enum {
   FD_MBX,
   FD_MBCSV,
   FD_CLM,
+  FD_SIGHUP,
   FD_IMM  // must be last
 };
 
@@ -82,12 +84,16 @@ AVD_CL_CB *avd_cb = &_control_block;
 static nfds_t nfds = FD_IMM + 1;
 static struct pollfd fds[FD_IMM + 1];
 
+static NCS_SEL_OBJ sighup_sel_obj;
+
 static void process_event(AVD_CL_CB *cb_now, AVD_EVT *evt);
 static void invalid_evh(AVD_CL_CB *cb, AVD_EVT *evt);
 static void standby_invalid_evh(AVD_CL_CB *cb, AVD_EVT *evt);
 static void qsd_invalid_evh(AVD_CL_CB *cb, AVD_EVT *evt);
 static void qsd_ignore_evh(AVD_CL_CB *cb, AVD_EVT *evt);
 
+static void sighup_handler(int signum, siginfo_t *info, void *ptr);
+
 /* list of all the function pointers related to handling the events
  * for active director.
  */
@@ -574,6 +580,7 @@ static uint32_t initialize(void) {
   }
   cb->minimum_cluster_size =
       base::GetEnv("OSAF_AMF_MIN_CLUSTER_SIZE", uint32_t{2});
+  cb->fmd_conf_file = base::GetEnv("FMS_CONF_FILE", "");
 
   node_list_db = new AmfDb<uint32_t, AVD_FAIL_OVER_NODE>;
   amfnd_svc_db = new std::set<uint32_t>;
@@ -626,8 +633,23 @@ static void main_loop(void) {
   mbx_fd = ncs_ipc_get_sel_obj(&cb->avd_mbx);
   daemon_sigterm_install(&term_fd);
 
+  int rc = ncs_sel_obj_create(&sighup_sel_obj);
+  osafassert(rc == NCSCC_RC_SUCCESS);
+
+  struct sigaction sighup;
+  sigemptyset(&sighup.sa_mask);
+  sighup.sa_sigaction = sighup_handler;
+  sighup.sa_flags = SA_SIGINFO;
+
+  if (sigaction(SIGHUP, &sighup, NULL) != 0) {
+    osafassert(false);
+  }
+
+
   fds[FD_TERM].fd = term_fd;
   fds[FD_TERM].events = POLLIN;
+  fds[FD_SIGHUP].fd = sighup_sel_obj.rmv_obj;
+  fds[FD_SIGHUP].events = POLLIN;
   fds[FD_MBX].fd = mbx_fd.rmv_obj;
   fds[FD_MBX].events = POLLIN;
   while (1) {
@@ -668,6 +690,12 @@ static void main_loop(void) {
       daemon_exit();
     }
 
+    if (fds[FD_SIGHUP].revents & POLLIN) {
+      ncs_sel_obj_rmv_ind(&sighup_sel_obj, true, true);
+      Consensus consensus_service;
+      consensus_service.ReloadConfiguration();
+    }
+
     if (fds[FD_MBX].revents & POLLIN) {
       evt = (AVD_EVT *)ncs_ipc_non_blk_recv(&cb->avd_mbx);
 
@@ -823,6 +851,10 @@ static void process_event(AVD_CL_CB *cb_now, AVD_EVT *evt) 
{
   TRACE_LEAVE();
 }
 
+static void sighup_handler(int signum, siginfo_t *info, void *ptr) {
+  ncs_sel_obj_ind(&sighup_sel_obj);
+}
+
 /**
  * Entry point for the AMF Director process
  * @param argc
diff --git a/src/amf/amfd/osaf-amfd.in b/src/amf/amfd/osaf-amfd.in
index 822b003..0aae769 100644
--- a/src/amf/amfd/osaf-amfd.in
+++ b/src/amf/amfd/osaf-amfd.in
@@ -28,6 +28,7 @@ else
        unset args
        . $pkgsysconfdir/nid.conf
        . $pkgsysconfdir/amfd.conf
+       export FMS_CONF_FILE=$pkgsysconfdir/fmd.conf
 fi     
 
 binary=$pkglibdir/$osafprog
-- 
2.7.4



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

Reply via email to