Handle CLM-API errors during SC absence. Reinit with CLM.
---
 src/lck/lckd/gld_api.c    | 17 +++++++----------
 src/lck/lckd/gld_cb.h     |  1 +
 src/lck/lckd/gld_clm.cc   | 24 +++++++++++++++++++++++-
 src/lck/lckd/gld_clm.h    |  1 +
 src/lck/lcknd/glnd_api.c  | 38 +++++++++++++++++++++-----------------
 src/lck/lcknd/glnd_cb.h   |  1 +
 src/lck/lcknd/glnd_clm.cc | 21 ++++++++++++++++++++-
 src/lck/lcknd/glnd_clm.h  |  1 +
 8 files changed, 75 insertions(+), 29 deletions(-)

diff --git a/src/lck/lckd/gld_api.c b/src/lck/lckd/gld_api.c
index 2a9e968bf..b9ab18880 100644
--- a/src/lck/lckd/gld_api.c
+++ b/src/lck/lckd/gld_api.c
@@ -509,7 +509,7 @@ void gld_main_process(SYSF_MBX *mbx)
 SaAisErrorT error = SA_AIS_OK;
 GLSV_GLD_CB *gld_cb = NULL;
 NCS_MBCSV_ARG mbcsv_arg;
-SaSelectionObjectT amf_sel_obj, clm_sel_obj;
+SaSelectionObjectT amf_sel_obj;
 int term_fd;

 TRACE_ENTER();
@@ -528,13 +528,6 @@ void gld_main_process(SYSF_MBX *mbx)
 goto end;
 }

-error = saClmSelectionObjectGet(gld_cb->clm_hdl, &clm_sel_obj);
-
-if (error != SA_AIS_OK) {
-LOG_ER("CLM Selection object get error: %i", error);
-goto end;
-}
-
 daemon_sigterm_install(&term_fd);

 /* Set up all file descriptors to listen to */
@@ -546,10 +539,10 @@ void gld_main_process(SYSF_MBX *mbx)
 fds[FD_MBX].events = POLLIN;
 fds[FD_IMM].fd = gld_cb->imm_sel_obj;
 fds[FD_IMM].events = POLLIN;
-fds[FD_CLM].fd = clm_sel_obj;
 fds[FD_CLM].events = POLLIN;

 while (1) {
+fds[FD_CLM].fd = gld_cb->clm_sel_obj;
 fds[FD_MBCSV].fd = gld_cb->mbcsv_sel_obj;
 fds[FD_MBCSV].events = POLLIN;
 if ((gld_cb->immOiHandle != 0) &&
@@ -643,7 +636,11 @@ void gld_main_process(SYSF_MBX *mbx)
 if (fds[FD_CLM].revents & POLLIN) {
 /* dispatch all the CLM pending function */
 error = saClmDispatch(gld_cb->clm_hdl, SA_DISPATCH_ALL);
-if (error != SA_AIS_OK) {
+if (error == SA_AIS_ERR_BAD_HANDLE) {
+LOG_ER("saClmDispatch with bad handle");
+gld_cb->clm_sel_obj = -1;
+gld_clm_reinit_bg(gld_cb);
+} else if (error != SA_AIS_OK) {
 LOG_ER("CLM dispatch failed: %i", error);
 }
 }
diff --git a/src/lck/lckd/gld_cb.h b/src/lck/lckd/gld_cb.h
index e25eda92e..9e17324c4 100644
--- a/src/lck/lckd/gld_cb.h
+++ b/src/lck/lckd/gld_cb.h
@@ -111,6 +111,7 @@ typedef struct glsv_gld_cb_tag {
   SaImmOiHandleT immOiHandle;     /* IMM OI Handle */
   SaSelectionObjectT imm_sel_obj; /*Selection object to wait for
                                      IMM events */
+  SaSelectionObjectT clm_sel_obj;
   bool is_impl_set;
   bool fully_initialized;
 } GLSV_GLD_CB;
diff --git a/src/lck/lckd/gld_clm.cc b/src/lck/lckd/gld_clm.cc
index 6932ba08a..c8ed71e72 100644
--- a/src/lck/lckd/gld_clm.cc
+++ b/src/lck/lckd/gld_clm.cc
@@ -1,3 +1,4 @@
+#include <thread>
 #include <saClm.h>
 #include "lck/lckd/gld_clm.h"
 #include "base/osaf_time.h"
@@ -84,7 +85,7 @@ SaAisErrorT gld_clm_init(GLSV_GLD_CB *cb) {
     while (true) {
       rc = saClmInitialize_4(&cb->clm_hdl, &callbacks, &version);

-      if (rc == SA_AIS_ERR_TRY_AGAIN) {
+      if (rc == SA_AIS_ERR_TRY_AGAIN || rc == SA_AIS_ERR_UNAVAILABLE) {
         osaf_nanosleep(&kHundredMilliseconds);
         continue;
       } else if (rc != SA_AIS_OK) {
@@ -95,12 +96,22 @@ SaAisErrorT gld_clm_init(GLSV_GLD_CB *cb) {
       }
     }

+    if (rc != SA_AIS_OK)
+      break;
+
     rc = saClmClusterTrack_4(cb->clm_hdl, SA_TRACK_CHANGES_ONLY, 0);

     if (rc != SA_AIS_OK) {
       LOG_ER("saClmClusterTrack failed: %i", rc);
       break;
     }
+
+    rc = saClmSelectionObjectGet(cb->clm_hdl, &cb->clm_sel_obj);
+
+    if (rc != SA_AIS_OK) {
+      LOG_ER("saClmSelectionObjectGet failed: %i", rc);
+      break;
+    }
   } while (false);

   if (rc != SA_AIS_OK && cb->clm_hdl) gld_clm_deinit(cb);
@@ -118,3 +129,14 @@ SaAisErrorT gld_clm_deinit(GLSV_GLD_CB *cb) {

   return rc;
 }
+
+static void clm_init_thread(GLSV_GLD_CB *cb)
+{
+  gld_clm_init(cb);
+}
+
+void gld_clm_reinit_bg(GLSV_GLD_CB *cb)
+{
+  std::thread x(&clm_init_thread, cb);
+  x.detach();
+}
diff --git a/src/lck/lckd/gld_clm.h b/src/lck/lckd/gld_clm.h
index 0fb236632..db09fdb17 100644
--- a/src/lck/lckd/gld_clm.h
+++ b/src/lck/lckd/gld_clm.h
@@ -7,6 +7,7 @@
 extern "C" {
 #endif

+void gld_clm_reinit_bg(GLSV_GLD_CB *);
 SaAisErrorT gld_clm_init(GLSV_GLD_CB *);
 SaAisErrorT gld_clm_deinit(GLSV_GLD_CB *);

diff --git a/src/lck/lcknd/glnd_api.c b/src/lck/lcknd/glnd_api.c
index a71020e73..1801e5e45 100644
--- a/src/lck/lcknd/glnd_api.c
+++ b/src/lck/lcknd/glnd_api.c
@@ -31,6 +31,7 @@
 ******************************************************************************/

 #include "lck/lcknd/glnd.h"
+#include "lck/lcknd/glnd_clm.h"
 #include "base/osaf_poll.h"

 enum { FD_TERM = 0, FD_AMF, FD_MBX, FD_CLM, NUM_FD };
@@ -192,9 +193,8 @@ void glnd_main_process(SYSF_MBX *mbx)
 TRACE_ENTER();

 SaAmfHandleT amf_hdl;
-SaClmHandleT clm_hdl;

-SaSelectionObjectT amf_sel_obj, clm_sel_obj;
+SaSelectionObjectT amf_sel_obj;
 SaAisErrorT ais_error;

 struct pollfd sel[NUM_FD];
@@ -208,7 +208,6 @@ void glnd_main_process(SYSF_MBX *mbx)
 }

 amf_hdl = glnd_cb->amf_hdl;
-clm_hdl = glnd_cb->clm_hdl;

 /*giveup the handle */
 m_GLND_GIVEUP_GLND_CB;
@@ -219,12 +218,6 @@ void glnd_main_process(SYSF_MBX *mbx)
 goto end;
 }

-ais_error = saClmSelectionObjectGet(clm_hdl, &clm_sel_obj);
-if (ais_error != SA_AIS_OK) {
-LOG_ER("GLND clm get sel obj error: %i", ais_error);
-goto end;
-}
-
 daemon_sigterm_install(&term_fd);

 sel[FD_TERM].fd = term_fd;
@@ -233,17 +226,25 @@ void glnd_main_process(SYSF_MBX *mbx)
 sel[FD_AMF].events = POLLIN;
 sel[FD_MBX].fd = m_GET_FD_FROM_SEL_OBJ(mbx_fd);
 sel[FD_MBX].events = POLLIN;
-sel[FD_CLM].fd = clm_sel_obj;
 sel[FD_CLM].events = POLLIN;

-while (osaf_poll(&sel[0], NUM_FD, -1) > 0) {
+while (true) {
+sel[FD_CLM].fd = glnd_cb->clm_sel_obj;
+
+if (poll(sel, NUM_FD, -1) < 0) {
+if (errno == EINTR)
+continue;
+else {
+LOG_ER("poll failed: %s", strerror(errno));
+break;
+}
+}

 if (sel[FD_TERM].revents & POLLIN) {
 daemon_exit();
 }

-if (((sel[FD_AMF].revents | sel[FD_MBX].revents |
-      sel[FD_CLM].revents) &
+if (((sel[FD_AMF].revents | sel[FD_MBX].revents) &
      (POLLERR | POLLHUP | POLLNVAL)) != 0) {
 LOG_ER("GLND poll() failure: %hd %hd",
        sel[FD_AMF].revents, sel[FD_MBX].revents);
@@ -272,10 +273,13 @@ void glnd_main_process(SYSF_MBX *mbx)
 /* process all the AMF messages */
 if (sel[FD_CLM].revents & POLLIN) {
 /* dispatch all the CLM pending function */
-ais_error = saClmDispatch(clm_hdl, SA_DISPATCH_ALL);
-if (ais_error != SA_AIS_OK) {
-TRACE_2("GLND clm dispatch failure: %i",
-ais_error);
+ais_error = saClmDispatch(glnd_cb->clm_hdl, SA_DISPATCH_ALL);
+if (ais_error == SA_AIS_ERR_BAD_HANDLE) {
+LOG_ER("saClmDispatch bad handle");
+glnd_cb->clm_sel_obj = -1;
+glnd_clm_reinit_bg(glnd_cb);
+} else if (ais_error != SA_AIS_OK) {
+LOG_ER("saClmDispatch failure: %i", ais_error);
 }
 }
 }
diff --git a/src/lck/lcknd/glnd_cb.h b/src/lck/lcknd/glnd_cb.h
index 240be7a77..3b82f605f 100644
--- a/src/lck/lcknd/glnd_cb.h
+++ b/src/lck/lcknd/glnd_cb.h
@@ -197,6 +197,7 @@ typedef struct glnd_cb_tag {

   SaClmHandleT clm_hdl;   /* CLM handle, obtained thru CLM init        */
   SaAmfHandleT amf_hdl;   /* AMF handle, obtained thru AMF init        */
+  SaSelectionObjectT clm_sel_obj;
   SaAmfHAStateT ha_state; /* present AMF HA state of the component     */
   EDU_HDL glnd_edu_hdl;   /* edu handle used for encode/decode         */
   void *shm_base_addr; /* Stores shared memory starting address, which contains
diff --git a/src/lck/lcknd/glnd_clm.cc b/src/lck/lcknd/glnd_clm.cc
index d44292251..dc750e097 100644
--- a/src/lck/lcknd/glnd_clm.cc
+++ b/src/lck/lcknd/glnd_clm.cc
@@ -1,3 +1,4 @@
+#include <thread>
 #include <saClm.h>
 #include "lck/lcknd/glnd_clm.h"
 #include "base/osaf_time.h"
@@ -93,7 +94,7 @@ SaAisErrorT glnd_clm_init(GLND_CB *cb) {
     while (true) {
       rc = saClmInitialize_4(&cb->clm_hdl, &callbacks, &version);

-      if (rc == SA_AIS_ERR_TRY_AGAIN) {
+      if (rc == SA_AIS_ERR_TRY_AGAIN || rc == SA_AIS_ERR_UNAVAILABLE) {
         osaf_nanosleep(&kHundredMilliseconds);
         continue;
       } else if (rc != SA_AIS_OK) {
@@ -104,6 +105,9 @@ SaAisErrorT glnd_clm_init(GLND_CB *cb) {
       }
     }

+    if (rc != SA_AIS_OK)
+      break;
+
     rc = saClmClusterTrack_4(
         cb->clm_hdl, SA_TRACK_CURRENT | SA_TRACK_CHANGES | SA_TRACK_LOCAL, 0);

@@ -111,6 +115,12 @@ SaAisErrorT glnd_clm_init(GLND_CB *cb) {
       LOG_ER("saClmClusterTrack failed: %i", rc);
       break;
     }
+
+    rc = saClmSelectionObjectGet(cb->clm_hdl, &cb->clm_sel_obj);
+    if (rc != SA_AIS_OK) {
+      LOG_ER("saClmSelectionObjectGet failed: %i", rc);
+      break;
+    }
   } while (false);

   if (rc != SA_AIS_OK && cb->clm_hdl) glnd_clm_deinit(cb);
@@ -128,3 +138,12 @@ SaAisErrorT glnd_clm_deinit(GLND_CB *cb) {

   return rc;
 }
+
+static void clm_reinit_thread(GLND_CB *cb) {
+  glnd_clm_init(cb);
+}
+
+void glnd_clm_reinit_bg(GLND_CB *cb) {
+  std::thread x(&clm_reinit_thread, cb);
+  x.detach();
+}
diff --git a/src/lck/lcknd/glnd_clm.h b/src/lck/lcknd/glnd_clm.h
index 45407f203..1b76f2cb6 100644
--- a/src/lck/lcknd/glnd_clm.h
+++ b/src/lck/lcknd/glnd_clm.h
@@ -7,6 +7,7 @@
 extern "C" {
 #endif

+void glnd_clm_reinit_bg(GLND_CB *);
 SaAisErrorT glnd_clm_init(GLND_CB *);
 SaAisErrorT glnd_clm_deinit(GLND_CB *);

--
2.20.1


-----------------------------------------------------------------------------------------------------------------------
Notice: This e-mail together with any attachments may contain information of 
Ribbon Communications Inc. that
is confidential and/or proprietary for the sole use of the intended recipient.  
Any review, disclosure, reliance or
distribution by others or forwarding without express permission is strictly 
prohibited.  If you are not the intended
recipient, please notify the sender immediately and then delete all copies, 
including any attachments.
-----------------------------------------------------------------------------------------------------------------------

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

Reply via email to