Only FMS_PROMOTE_ACTIVE_TIMER, FMS_NODE_ISOLATION_TIMEOUT and
FMS_ACTIVATION_SUPERVISION_TIMER are currently supported.

These values can be changed in fmd.conf and take effect
by sending SIGHUP to fmd.
---
 src/fm/fmd/fm_cb.h     |  2 ++
 src/fm/fmd/fm_main.cc  | 70 ++++++++++++++++++++++++++++++++++++++++--
 src/fm/fmd/osaf-fmd.in |  1 +
 3 files changed, 71 insertions(+), 2 deletions(-)

diff --git a/src/fm/fmd/fm_cb.h b/src/fm/fmd/fm_cb.h
index 010ab735a..6eb0d54cd 100644
--- a/src/fm/fmd/fm_cb.h
+++ b/src/fm/fmd/fm_cb.h
@@ -109,6 +109,8 @@ struct FM_CB {
   std::atomic<bool> peer_node_terminated{false};
 
   base::Mutex mutex_{};
+
+  std::string config_file;
 };
 
 extern const char *role_string[];
diff --git a/src/fm/fmd/fm_main.cc b/src/fm/fmd/fm_main.cc
index 3371ec5e8..3f2e9123c 100644
--- a/src/fm/fmd/fm_main.cc
+++ b/src/fm/fmd/fm_main.cc
@@ -25,6 +25,7 @@ This file contains the main() routine for FM.
 
 #include <stdbool.h>
 #include <stdlib.h>
+#include "base/config_file_reader.h"
 #include "base/daemon.h"
 #include "base/logtrace.h"
 #include "base/osaf_extended_name.h"
@@ -40,7 +41,7 @@ This file contains the main() routine for FM.
 static SaVersionT clm_version = {'B', 4, 1};
 static const SaClmCallbacksT_4 clm_callbacks = {0, 0};
 
-enum { FD_TERM = 0, FD_AMF = 1, FD_MBX };
+enum { FD_TERM = 0, FD_AMF = 1, FD_MBX = 2, FD_SIGHUP = 3};
 
 FM_CB *fm_cb = NULL;
 const char *role_string[] = {"UNDEFINED", "ACTIVE", "STANDBY", "QUIESCED",
@@ -53,6 +54,7 @@ const char *role_string[] = {"UNDEFINED", "ACTIVE", 
"STANDBY", "QUIESCED",
  *****************************************************************/
 
 static uint32_t fm_agents_startup(void);
+static void reload_configuration(FM_CB *fm_cb);
 static uint32_t fm_get_args(FM_CB *);
 static uint32_t fms_fms_exchange_node_info(FM_CB *);
 static uint32_t fms_fms_inform_terminating(FM_CB *fm_cb);
@@ -69,6 +71,7 @@ void rda_cb(uint32_t cb_hdl, PCS_RDA_CB_INFO *cb_info,
             PCSRDA_RETURN_CODE error_code);
 uint32_t gl_fm_hdl;
 static NCS_SEL_OBJ usr1_sel_obj;
+static NCS_SEL_OBJ sighup_sel_obj;
 
 /**
  * USR1 signal is used when AMF wants instantiate us as a
@@ -83,6 +86,10 @@ static void sigusr1_handler(int sig) {
   ncs_sel_obj_ind(&usr1_sel_obj);
 }
 
+static void sighup_handler(int signum, siginfo_t *info, void *ptr) {
+  ncs_sel_obj_ind(&sighup_sel_obj);
+}
+
 /**
  * Callback from RDA. Post a message/event to the FM mailbox.
  * @param cb_hdl
@@ -124,7 +131,7 @@ DESCRIPTION:          Main routine for FM
 *****************************************************************************/
 int main(int argc, char *argv[]) {
   NCS_SEL_OBJ mbx_sel_obj;
-  nfds_t nfds = 3;
+  nfds_t nfds = 4;
   struct pollfd fds[nfds];
   int ret = 0;
   int rc = NCSCC_RC_FAILURE;
@@ -215,6 +222,21 @@ int main(int argc, char *argv[]) {
     goto fm_init_failed;
   }
 
+  rc = ncs_sel_obj_create(&sighup_sel_obj);
+  if (rc != NCSCC_RC_SUCCESS) {
+    LOG_ER("ncs_sel_obj_create FAILED");
+    goto fm_init_failed;
+  }
+
+  struct sigaction sighup;
+  sighup.sa_sigaction = sighup_handler;
+  sighup.sa_flags = SA_SIGINFO;
+
+  if (sigaction(SIGHUP, &sighup, NULL) != 0) {
+    LOG_ER("registering SIGHUP FAILED: %s", strerror(errno));
+    goto fm_init_failed;
+  }
+
   if (!nid_started && fm_amf_init(&fm_cb->fm_amf_cb) != NCSCC_RC_SUCCESS)
     goto fm_init_failed;
 
@@ -243,6 +265,9 @@ int main(int argc, char *argv[]) {
   fds[FD_MBX].fd = mbx_sel_obj.rmv_obj;
   fds[FD_MBX].events = POLLIN;
 
+  fds[FD_SIGHUP].fd = sighup_sel_obj.rmv_obj;
+  fds[FD_SIGHUP].events = POLLIN;
+
   /* notify the NID */
   if (nid_started) fm_nid_notify((uint32_t)NCSCC_RC_SUCCESS);
 
@@ -277,6 +302,11 @@ int main(int argc, char *argv[]) {
       }
     }
 
+    if (fds[FD_SIGHUP].revents & POLLIN) {
+      ncs_sel_obj_rmv_ind(&sighup_sel_obj, true, true);
+      reload_configuration(fm_cb);
+    }
+
     if (fds[FD_MBX].revents & POLLIN) handle_mbx_event();
   }
 
@@ -350,6 +380,37 @@ static uint32_t fm_agents_startup(void) {
   return rc;
 }
 
+// only timer related values are reloaded
+static void reload_configuration(FM_CB *fm_cb) {
+  ConfigFileReader reader;
+  ConfigFileReader::SettingsMap map;
+
+  LOG_NO("reload configuration");
+
+  if (fm_cb->config_file.empty() == false) {
+    map = reader.ParseFile(fm_cb->config_file);
+    for (const auto& kv : map) {
+      if (kv.first == "FMS_PROMOTE_ACTIVE_TIMER") {
+        fm_cb->active_promote_tmr_val =
+          std::stoi(kv.second);
+        TRACE("FMS_PROMOTE_ACTIVE_TIMER = %d",
+          fm_cb->active_promote_tmr_val);
+      } else if (kv.first == "FMS_NODE_ISOLATION_TIMEOUT") {
+        osaf_millis_to_timespec(std::stoi(kv.second),
+                                &fm_cb->node_isolation_timeout);
+        TRACE("NODE_ISOLATION_TIMEOUT = %" PRId64 ".%09ld",
+          (int64_t)fm_cb->node_isolation_timeout.tv_sec,
+          fm_cb->node_isolation_timeout.tv_nsec);
+      } else if (kv.first == "FMS_ACTIVATION_SUPERVISION_TIMER") {
+        fm_cb->activation_supervision_tmr_val =
+          std::stoi(kv.second);
+        TRACE("FMS_ACTIVATION_SUPERVISION_TIMER = %d",
+          fm_cb->activation_supervision_tmr_val);
+      }
+    }
+  }
+}
+
 /****************************************************************************
  * Name          : fm_get_args
  *
@@ -416,6 +477,11 @@ static uint32_t fm_get_args(FM_CB *fm_cb) {
         (int64_t)fm_cb->node_isolation_timeout.tv_sec,
         fm_cb->node_isolation_timeout.tv_nsec);
 
+  value = getenv("FMS_CONF_FILE");
+  if (value != nullptr) {
+    fm_cb->config_file = value;
+    LOG_NO("Configuration file located at %s", fm_cb->config_file.c_str());
+  }
   TRACE_LEAVE();
   return NCSCC_RC_SUCCESS;
 }
diff --git a/src/fm/fmd/osaf-fmd.in b/src/fm/fmd/osaf-fmd.in
index 18b8fd53a..a9ba2ff54 100644
--- a/src/fm/fmd/osaf-fmd.in
+++ b/src/fm/fmd/osaf-fmd.in
@@ -27,6 +27,7 @@ else
        . $osafdirfile
        . $pkgsysconfdir/nid.conf
        . $pkgsysconfdir/fmd.conf
+       export FMS_CONF_FILE=$pkgsysconfdir/fmd.conf
 fi     
 
 if [ -f $nodeinfofile ]; then
-- 
2.17.1



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

Reply via email to