Hi Hoang, ACK tested with normal configuration .
Note : not created error SA_AIS_ERR_BAD_HANDLE. -AVM On 8/16/2016 12:15 PM, Hoang Vo wrote: > 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 Opensaf-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/opensaf-devel