osaf/services/saf/cpsv/cpd/cpd_init.c | 67 ++++++++++++++++++++++++++++++++++-
1 files changed, 66 insertions(+), 1 deletions(-)
Problem:
-------
cpd doesn't seem to currently recover from BAD_HANDLE when calling
saClmDispatch()
This is important if a node is promoted to a controller.
Solution:
--------
Re-initialize CLM HANDLE
diff --git a/osaf/services/saf/cpsv/cpd/cpd_init.c
b/osaf/services/saf/cpsv/cpd/cpd_init.c
--- a/osaf/services/saf/cpsv/cpd/cpd_init.c
+++ b/osaf/services/saf/cpsv/cpd/cpd_init.c
@@ -61,6 +61,8 @@ static uint32_t cpd_lib_destroy(CPD_DEST
static bool cpd_clear_mbx(NCSCONTEXT arg, NCSCONTEXT msg);
+static SaAisErrorT cpd_clm_init_bg(CPD_CB *cb);
+
void cpd_main_process(CPD_CB *cb);
/****************************************************************************
@@ -200,6 +202,63 @@ done:
}
/****************************************************************************
+ * Name : cpd_clm_init_thread
+ *
+ * Description : This function is thread function to initialize clm
+ *
+ * Arguments : -
+ *
+ * Return Values : -
+ *
+ * Notes : None.
+ *****************************************************************************/
+static void* cpd_clm_init_thread(void* arg)
+{
+ CPD_CB *cb = (CPD_CB*)arg;
+
+ TRACE_ENTER();
+
+ SaAisErrorT rc = cpd_clm_init(cb);
+ if (rc != SA_AIS_OK) {
+ exit(EXIT_FAILURE);
+ }
+
+ /* Notify main process to update clm select object */
+ ncs_sel_obj_ind((NCS_SEL_OBJ*)&cb->clm_sel_obj);
+
+ TRACE_LEAVE();
+ return NULL;
+}
+
+/****************************************************************************
+ * Name : cpd_clm_init_bg
+ *
+ * Description : This function is to start initialize clm thread
+ *
+ * Arguments : -
+ *
+ * Return Values : -
+ *
+ * Notes : None.
+ *****************************************************************************/
+static SaAisErrorT cpd_clm_init_bg(CPD_CB *cb)
+{
+ pthread_t thread;
+ pthread_attr_t attr;
+ pthread_attr_init(&attr);
+ pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
+
+ if (pthread_create(&thread, &attr, cpd_clm_init_thread, cb) != 0) {
+ LOG_ER("pthread_create FAILED: %s", strerror(errno));
+ exit(EXIT_FAILURE);
+ }
+
+ pthread_attr_destroy(&attr);
+
+ return SA_AIS_OK;
+}
+
+/****************************************************************************
* Name : cpd_lib_init
*
* Description : This is the function which initalize the CPD libarary.
@@ -572,7 +631,13 @@ void cpd_main_process(CPD_CB *cb)
if (fds[FD_CLM].revents & POLLIN) {
/* dispatch all the CLM pending function */
error = saClmDispatch(cb->clm_hdl, SA_DISPATCH_ALL);
- if (error != SA_AIS_OK) {
+ if (error == SA_AIS_ERR_BAD_HANDLE) {
+ LOG_NO("Bad CLM handle. Reinitializing.");
+ osaf_nanosleep(&kHundredMilliseconds);
+ cpd_clm_init_bg(cb);
+ /* Ignore the FD_CLM */
+ fds[FD_CLM].fd = -1;
+ } else if (error != SA_AIS_OK) {
LOG_ER("saClmDispatch failed: %u", error);
}
}
------------------------------------------------------------------------------
_______________________________________________
Opensaf-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/opensaf-devel