osaf/services/saf/logsv/lgs/lgs_clm.cc |  12 ++++++++++++
 1 files changed, 12 insertions(+), 0 deletions(-)


LOG did not deal with TRY_AGAIN error code of `saClmInitialize()`,
LOG would exit, and cause node reboot if getting TRY_AGAIN.

The patch adds a while loop to do retry when getting TRY_AGAIN.

diff --git a/osaf/services/saf/logsv/lgs/lgs_clm.cc 
b/osaf/services/saf/logsv/lgs/lgs_clm.cc
--- a/osaf/services/saf/logsv/lgs/lgs_clm.cc
+++ b/osaf/services/saf/logsv/lgs/lgs_clm.cc
@@ -348,13 +348,25 @@ void *lgs_clm_init_thread(void *cb) {
   static SaVersionT clmVersion = { 'B', 0x04, 0x01 };
   lgs_cb_t *_lgs_cb = reinterpret_cast<lgs_cb_t *> (cb);
   SaAisErrorT rc;
+  uint32_t msecs_waited = 0;
+  const uint32_t max_waiting_time_10s = 10 * 1000; /* 10 secs */
+
   TRACE_ENTER();
+
   rc = saClmInitialize_4(&_lgs_cb->clm_hdl, &clm_callbacks, &clmVersion);
+  while (((rc == SA_AIS_ERR_TRY_AGAIN) || (rc == SA_AIS_ERR_TIMEOUT) ||
+          (rc == SA_AIS_ERR_UNAVAILABLE)) &&
+         (msecs_waited < max_waiting_time_10s)) {
+    usleep(100*1000);
+    msecs_waited += 100;
+    rc = saClmInitialize_4(&_lgs_cb->clm_hdl, &clm_callbacks, &clmVersion);
+  }
   if (rc != SA_AIS_OK) {
     LOG_ER("saClmInitialize failed with error: %d", rc);
     TRACE_LEAVE();
     exit(EXIT_FAILURE);
   }
+
   rc = saClmSelectionObjectGet(_lgs_cb->clm_hdl, &lgs_cb->clmSelectionObject);
   if (rc != SA_AIS_OK) {
     LOG_ER("saClmSelectionObjectGet failed with error: %d", rc);

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

Reply via email to