Hi Vu, Thanks, I will check this and fix what's needed before pushing.
/Lennart > -----Original Message----- > From: Vu Minh Nguyen [mailto:[email protected]] > Sent: den 8 december 2015 04:26 > To: 'Mathivanan Naickan Palanivelu'; Lennart Lund > Cc: [email protected] > Subject: RE: [PATCH 1 of 1] lgs: Correcting OI initializing thread handling > [#1527] > > Hi Lennart, > > I have just found two things in imm_impl_set_sequence(). Please see my > below > comments [Vu]. > > > + if ( true == *(bool*) > > lgs_cfg_get(LGS_IMM_LOG_OPENSAFLOGCONFIG_CLASS_EXIST)) { > > + > (void)immutil_saImmOiClassImplementerSet(immOiHandle, > > "OpenSafLogConfig"); > > [Vu] Not sure if calling immutil_ here is your intention or not? I think it > is not necessary, as you have the retry mechanism below. > > > + msecs_waited = 0; > > + rc = > saImmOiClassImplementerSet(immOiHandle, > > "OpenSafLogConfig"); > > + while (((rc == SA_AIS_ERR_TRY_AGAIN) || (rc > == > > SA_AIS_ERR_EXIST)) > > + && (msecs_waited > < > > max_waiting_time_60s)) { > > + usleep(sleep_delay_ms * 1000); > > + msecs_waited += > sleep_delay_ms; > > + rc = > saImmOiClassImplementerSet(immOiHandle, > > "OpenSafLogConfig"); > > + } > > + if (rc != SA_AIS_OK) { > > + > TRACE("saImmOiClassImplementerSet > > OpenSafLogConfig failed %s", saf_error(rc)); > > + goto done; > > + } > > + } > > + > > + if (*(bool*) > > lgs_cfg_get(LGS_IMM_LOG_OPENSAFLOGCONFIG_CLASS_EXIST)) { > > [Vu] This condition checking for the IMM obj class "SafLogStreamConfig" > seems not correct. > The checking should use for "OpenSafLogConfig" instead. (above code check > this) > > > + msecs_waited = 0; > > + rc = > saImmOiClassImplementerSet(immOiHandle, > > "SaLogStreamConfig"); > > + while (((rc == SA_AIS_ERR_TRY_AGAIN) || (rc > == > > SA_AIS_ERR_EXIST)) > > + && (msecs_waited > < > > max_waiting_time_60s)) { > > + usleep(sleep_delay_ms * 1000); > > + msecs_waited += > sleep_delay_ms; > > + rc = > saImmOiClassImplementerSet(immOiHandle, > > "SaLogStreamConfig"); > > + } > > + if (rc != SA_AIS_OK) { > > + > TRACE("saImmOiClassImplementerSet > > SaLogStreamConfig failed %u", rc); > > + goto done; > > + } > > + } > > Regards, Vu. > > >-----Original Message----- > >From: Mathivanan Naickan Palanivelu [mailto:[email protected]] > >Sent: Monday, December 07, 2015 7:30 PM > >To: Lennart Lund; [email protected] > >Cc: [email protected] > >Subject: RE: [PATCH 1 of 1] lgs: Correcting OI initializing thread handling > [#1527] > > > >Tested Ack, > >Mathi. > > > >> -----Original Message----- > >> From: Lennart Lund [mailto:[email protected]] > >> Sent: Thursday, December 03, 2015 5:25 PM > >> To: Mathivanan Naickan Palanivelu; [email protected] > >> Cc: [email protected] > >> Subject: [PATCH 1 of 1] lgs: Correcting OI initializing thread handling > [#1527] > >> > >> osaf/services/saf/logsv/lgs/lgs.h | 8 +- > >> osaf/services/saf/logsv/lgs/lgs_amf.c | 29 +-- > >> osaf/services/saf/logsv/lgs/lgs_config.c | 61 +----- > >> osaf/services/saf/logsv/lgs/lgs_evt.c | 5 +- > >> osaf/services/saf/logsv/lgs/lgs_imm.c | 323 > +++++++++++++++++---------- > >> --- > >> osaf/services/saf/logsv/lgs/lgs_main.c | 88 +------- > >> 6 files changed, 210 insertions(+), 304 deletions(-) > >> > >> > >> Fix in existing code to prevent possible use of imm OI handle in two > threads > >> at the same time. Also protecting usage of global variable for storing > this > >> handle and a selection object in some situations. > >> Note: This must be seen as a temporary fix for this problem. Has to be > >> replaced by better threaded handling of OI. See #1531 and #1609 > >> > >> diff --git a/osaf/services/saf/logsv/lgs/lgs.h > >> b/osaf/services/saf/logsv/lgs/lgs.h > >> --- a/osaf/services/saf/logsv/lgs/lgs.h > >> +++ b/osaf/services/saf/logsv/lgs/lgs.h > >> @@ -93,6 +93,7 @@ extern uint32_t mbox_msgs[NCS_IPC_PRIORI > extern > >> bool mbox_full[NCS_IPC_PRIORITY_MAX]; extern uint32_t > >> mbox_low[NCS_IPC_PRIORITY_MAX]; extern pthread_mutex_t > >> lgs_mbox_init_mutex; > >> +extern pthread_mutex_t lgs_OI_init_mutex; > >> > >> extern uint32_t lgs_configure_mailbox(void); > >> > >> @@ -105,12 +106,15 @@ extern uint32_t lgs_mds_msg_send(lgs_cb_ > >> MDS_DEST *dest, > MDS_SYNC_SND_CTXT > >> *mds_ctxt, MDS_SEND_PRIORITY_TYPE prio); > >> > >> extern SaAisErrorT lgs_imm_create_configStream(lgs_cb_t *cb); -extern > >> void lgs_imm_impl_restore(lgs_cb_t *cb); -extern SaAisErrorT > >> lgs_imm_init_OI(lgs_cb_t *cb); extern void logRootDirectory_filemove( > >> const char *new_logRootDirectory, > >> const char *old_logRootDirectory, > >> time_t *cur_time_in); > >> extern void logDataGroupname_fileown(const char > >> *new_logDataGroupname); > >> > >> +extern void lgs_imm_impl_reinit_nonblocking(lgs_cb_t *cb); extern void > >> +lgs_imm_init_OI_handle(SaImmOiHandleT *immOiHandle, > >> + SaSelectionObjectT *immSelectionObject); extern void > >> +lgs_imm_impl_set(SaImmOiHandleT immOiHandle); > >> + > >> #endif /* ifndef __LGS_H */ > >> diff --git a/osaf/services/saf/logsv/lgs/lgs_amf.c > >> b/osaf/services/saf/logsv/lgs/lgs_amf.c > >> --- a/osaf/services/saf/logsv/lgs/lgs_amf.c > >> +++ b/osaf/services/saf/logsv/lgs/lgs_amf.c > >> @@ -64,33 +64,8 @@ static SaAisErrorT amf_active_state_hand > >> goto done; > >> } > >> > >> - /* switch over, become implementer > >> - */ > >> - immutilWrapperProfile.nTries = 250; /* LOG will be blocked > until IMM > >> responds */ > >> - immutilWrapperProfile.errorsAreFatal = 0; > >> - if ((error = immutil_saImmOiImplementerSet(lgs_cb- > >immOiHandle, > >> "safLogService")) > >> - != SA_AIS_OK) { > >> - LOG_ER("saImmOiClassImplementerSet > (safLogService) > >> failed: %d", error); > >> - goto done; > >> - } > >> - if ((error = immutil_saImmOiClassImplementerSet(lgs_cb- > >> >immOiHandle, > >> - "SaLogStreamConfig")) != > SA_AIS_OK) { > >> - LOG_ER("saImmOiClassImplementerSet > >> (SaLogStreamConfig) failed: %d", error); > >> - goto done; > >> - } > >> - /* Do this only if the log service configuration class exists */ > >> - if (*(bool*) > >> lgs_cfg_get(LGS_IMM_LOG_OPENSAFLOGCONFIG_CLASS_EXIST)) { > >> - if ((error = > immutil_saImmOiClassImplementerSet(cb- > >> >immOiHandle, "OpenSafLogConfig")) > >> - != SA_AIS_OK) { > >> - > LOG_ER("saImmOiClassImplementerSet > >> (OpenSafLogConfig) failed: %d", error); > >> - goto done; > >> - } > >> - > >> - /* Create a log service configuration runtime > object if the > >> - * configuration runtime class exist and no > object exist > >> - */ > >> - conf_runtime_obj_create(cb->immOiHandle); > >> - } > >> + lgs_imm_impl_set(cb->immOiHandle); > >> + conf_runtime_obj_create(cb->immOiHandle); > >> > >> /* check existing streams */ > >> stream = log_stream_getnext_by_name(NULL); diff --git > >> a/osaf/services/saf/logsv/lgs/lgs_config.c > >> b/osaf/services/saf/logsv/lgs/lgs_config.c > >> --- a/osaf/services/saf/logsv/lgs/lgs_config.c > >> +++ b/osaf/services/saf/logsv/lgs/lgs_config.c > >> @@ -1124,56 +1124,6 @@ static void read_log_config_environ_var_ > >> TRACE_LEAVE(); > >> } > >> > >> -/** > >> - * Become class implementer for the SaLogStreamConfig class > >> - * If HA state is ACTIVE > >> - * > >> - * @param immOiHandle[in] > >> - * @return -1 on error > >> - */ > >> -static int config_class_impl_set(SaImmOiHandleT immOiHandle, > >> SaAmfHAStateT ha_state) -{ > >> - int rc = 0; > >> - SaAisErrorT ais_rc = SA_AIS_OK; > >> - struct ImmutilWrapperProfile immutilWrapperProfile_tmp; > >> - > >> - TRACE_ENTER2("immOiHandle = %lld, ha_state = %d (1 = > Active)", > >> - immOiHandle, ha_state); > >> - > >> - if (ha_state != SA_AMF_HA_ACTIVE) { > >> - /* We are standby and cannot become > implementer */ > >> - TRACE("HA state STANDBY"); > >> - TRACE_LEAVE(); > >> - return 0; > >> - } > >> - > >> - /* Save immutil settings */ > >> - immutilWrapperProfile_tmp.errorsAreFatal = > >> immutilWrapperProfile.errorsAreFatal; > >> - immutilWrapperProfile_tmp.nTries = > immutilWrapperProfile.nTries; > >> - > >> - /* Allow missed sync of large data to complete */ > >> - immutilWrapperProfile.nTries = 250; > >> - /* Do not assert on error */ > >> - immutilWrapperProfile.errorsAreFatal = 0; > >> - > >> - ais_rc = immutil_saImmOiClassImplementerSet(immOiHandle, > >> "OpenSafLogConfig"); > >> - if (ais_rc != SA_AIS_OK) { > >> - /* immutil_saImmOiClassImplementerSet Fail > >> - * Class may not exist > >> - */ > >> - LOG_WA("%s: saImmOiClassImplementerSet > Fail > >> %s",__FUNCTION__, > >> - saf_error(ais_rc)); > >> - rc = -1; > >> - } > >> - > >> - /* Restore immutil settings */ > >> - immutilWrapperProfile.errorsAreFatal = > >> immutilWrapperProfile_tmp.errorsAreFatal; > >> - immutilWrapperProfile.nTries = > immutilWrapperProfile_tmp.nTries; > >> - > >> - TRACE_LEAVE(); > >> - return rc; > >> -} > >> - > >> > >> > /********************************************************** > >> ******************** > >> * Public functions for handling configuration information > >> > >> > ********************************************************** > >> ********************/ > >> @@ -1184,23 +1134,16 @@ static int config_class_impl_set(SaImmOi > >> */ > >> void lgs_cfg_init(SaImmOiHandleT immOiHandle, SaAmfHAStateT > ha_state) > >> { > >> - int int_rc = 0; > >> - > >> TRACE_ENTER2("immOiHandle = %lld", immOiHandle); > >> + > >> /* Initiate the default values for all parameters > >> */ > >> init_default(); > >> > >> /* Read configuration step 1 > >> - * Become class implementer for SaLogStreamConfig class > >> * Read all values from the log service configuration object > >> */ > >> - int_rc = config_class_impl_set(immOiHandle, ha_state); > >> - if (int_rc != -1) { > >> - read_logsv_config_obj_2(); > >> - } else { > >> - TRACE("Failed to become class implementer. > Config object > >> not read"); > >> - } > >> + read_logsv_config_obj_2(); > >> > >> /* Read configuration step 2 > >> * Get configuration data from environment variables. > >> diff --git a/osaf/services/saf/logsv/lgs/lgs_evt.c > >> b/osaf/services/saf/logsv/lgs/lgs_evt.c > >> --- a/osaf/services/saf/logsv/lgs/lgs_evt.c > >> +++ b/osaf/services/saf/logsv/lgs/lgs_evt.c > >> @@ -522,9 +522,8 @@ static uint32_t proc_rda_cb_msg(lgsv_lgs > >> exit(EXIT_FAILURE); > >> } > >> > >> - /* fail over, become implementer > >> - * Declare implementership from a separate > thread */ > >> - lgs_imm_impl_restore(lgs_cb); > >> + /* fail over, become implementer */ > >> + lgs_imm_impl_set(lgs_cb->immOiHandle); > >> > >> /* Agent down list has to be processed first */ > >> lgs_process_lga_down_list(); > >> diff --git a/osaf/services/saf/logsv/lgs/lgs_imm.c > >> b/osaf/services/saf/logsv/lgs/lgs_imm.c > >> --- a/osaf/services/saf/logsv/lgs/lgs_imm.c > >> +++ b/osaf/services/saf/logsv/lgs/lgs_imm.c > >> @@ -58,6 +58,11 @@ > >> * ---------------- > >> */ > >> > >> +/* Used for protecting global imm OI handle and selection object during > >> + * initialize of OI > >> + */ > >> +pthread_mutex_t lgs_OI_init_mutex = PTHREAD_MUTEX_INITIALIZER; > >> + > >> /* Used for checkpointing time when files are closed */ static time_t > >> chkp_file_close_time = 0; > >> > >> @@ -2739,114 +2744,14 @@ SaAisErrorT lgs_imm_create_configStream( } > >> > >> /** > >> - * Thread > >> - * Restore object and class implementer/applier. Wait max > >> - * 'max_waiting_time_ms'. > >> - * @param _cb > >> - * > >> - * @return void* > >> - */ > >> -static void *imm_impl_restore_thread(void *_cb) -{ > >> - SaAisErrorT rc = SA_AIS_OK; > >> - int msecs_waited; > >> - lgs_cb_t *cb = (lgs_cb_t *)_cb; > >> - > >> - TRACE_ENTER(); > >> - > >> - /* Become object implementer > >> - */ > >> - msecs_waited = 0; > >> - rc = saImmOiImplementerSet(cb->immOiHandle, > >> implementerName); > >> - while (((rc == SA_AIS_ERR_TRY_AGAIN) || (rc == > >> SA_AIS_ERR_EXIST)) && > >> - (msecs_waited < > max_waiting_time_60s)) { > >> - usleep(sleep_delay_ms * 1000); > >> - msecs_waited += sleep_delay_ms; > >> - rc = saImmOiImplementerSet(cb- > >immOiHandle, > >> implementerName); > >> - } > >> - if (rc != SA_AIS_OK) { > >> - LOG_ER("saImmOiImplementerSet failed %u", > rc); > >> - exit(EXIT_FAILURE); > >> - } > >> - > >> - /* Become class implementer for the SaLogStreamConfig > >> - * Become class implementer for the OpenSafLogConfig class if > it > >> exists > >> - */ > >> - if ( true == *(bool*) > >> lgs_cfg_get(LGS_IMM_LOG_OPENSAFLOGCONFIG_CLASS_EXIST)) { > >> - > (void)immutil_saImmOiClassImplementerSet(cb- > >> >immOiHandle, "OpenSafLogConfig"); > >> - msecs_waited = 0; > >> - rc = saImmOiClassImplementerSet(cb- > >immOiHandle, > >> "OpenSafLogConfig"); > >> - while (((rc == SA_AIS_ERR_TRY_AGAIN) || (rc > == > >> SA_AIS_ERR_EXIST)) > >> - && (msecs_waited > < > >> max_waiting_time_60s)) { > >> - usleep(sleep_delay_ms * 1000); > >> - msecs_waited += > sleep_delay_ms; > >> - rc = > saImmOiClassImplementerSet(cb- > >> >immOiHandle, "OpenSafLogConfig"); > >> - } > >> - if (rc != SA_AIS_OK) { > >> - > LOG_ER("saImmOiClassImplementerSet > >> OpenSafLogConfig failed %u", rc); > >> - exit(EXIT_FAILURE); > >> - } > >> - } > >> - > >> - msecs_waited = 0; > >> - rc = saImmOiClassImplementerSet(cb->immOiHandle, > >> "SaLogStreamConfig"); > >> - while (((rc == SA_AIS_ERR_TRY_AGAIN) || (rc == > >> SA_AIS_ERR_EXIST)) > >> - && (msecs_waited < > max_waiting_time_60s)) { > >> - usleep(sleep_delay_ms * 1000); > >> - msecs_waited += sleep_delay_ms; > >> - rc = saImmOiClassImplementerSet(cb- > >immOiHandle, > >> "SaLogStreamConfig"); > >> - } > >> - if (rc != SA_AIS_OK) { > >> - LOG_ER("saImmOiClassImplementerSet > SaLogStreamConfig > >> failed %u", rc); > >> - exit(EXIT_FAILURE); > >> - } > >> - > >> - TRACE_LEAVE(); > >> - return NULL; > >> -} > >> - > >> -/** > >> - * Restore object and class implementer, non-blocking. > >> - * Remove: Become object and class implementer or applier, non- > blocking. > >> - * @param cb > >> - */ > >> -void lgs_imm_impl_restore(lgs_cb_t *cb) -{ > >> - pthread_t thread; > >> - pthread_attr_t attr; > >> - > >> - TRACE_ENTER(); > >> - > >> - /* In active state: Become object implementer. > >> - */ > >> - if (cb->ha_state == SA_AMF_HA_STANDBY) { > >> - return; > >> - } > >> - > >> - > >> - pthread_attr_init(&attr); > >> - pthread_attr_setdetachstate(&attr, > PTHREAD_CREATE_DETACHED); > >> - > >> - if (pthread_create(&thread, &attr, imm_impl_restore_thread, > cb) != > >> 0) { > >> - LOG_ER("pthread_create FAILED: %s", > strerror(errno)); > >> - exit(EXIT_FAILURE); > >> - } > >> - > >> - pthread_attr_destroy(&attr); > >> - > >> - TRACE_LEAVE(); > >> -} > >> - > >> -/** > >> * Initialize the OI interface and get a selection object. > >> * Become OI for safLogService if Active > >> * > >> - * Wait max 'max_waiting_time_ms'. > >> - * @param cb > >> - * > >> - * @return SaAisErrorT > >> + * @param immOiHandle[out] > >> + * @param immSelectionObject[out] > >> */ > >> -SaAisErrorT lgs_imm_init_OI(lgs_cb_t *cb) > >> +void lgs_imm_init_OI_handle(SaImmOiHandleT *immOiHandle, > >> + SaSelectionObjectT *immSelectionObject) > >> { > >> SaAisErrorT rc; > >> int msecs_waited; > >> @@ -2855,56 +2760,198 @@ SaAisErrorT lgs_imm_init_OI(lgs_cb_t *cb > >> > >> /* Initialize IMM OI service */ > >> msecs_waited = 0; > >> - rc = saImmOiInitialize_2(&cb->immOiHandle, &callbacks, > >> &immVersion); > >> + rc = saImmOiInitialize_2(immOiHandle, &callbacks, > &immVersion); > >> while ((rc == SA_AIS_ERR_TRY_AGAIN) && (msecs_waited < > >> max_waiting_time_60s)) { > >> usleep(sleep_delay_ms * 1000); > >> msecs_waited += sleep_delay_ms; > >> - rc = saImmOiInitialize_2(&cb->immOiHandle, > &callbacks, > >> &immVersion); > >> + rc = saImmOiInitialize_2(immOiHandle, > &callbacks, > >> &immVersion); > >> } > >> if (rc != SA_AIS_OK) { > >> - LOG_ER("saImmOiInitialize_2 Failed %u", rc); > >> - return rc; > >> - } > >> - TRACE("%s: saImmOiInitialize_2() Done",__FUNCTION__); > >> - > >> - /* If started as Active */ > >> - if (cb->ha_state == SA_AMF_HA_ACTIVE) { > >> - /* Become Object Implementer for the log > service */ > >> - msecs_waited = 0; > >> - rc = saImmOiImplementerSet(cb- > >immOiHandle, > >> implementerName); > >> - while (((rc == SA_AIS_ERR_TRY_AGAIN) || (rc > == > >> SA_AIS_ERR_EXIST)) && > >> - (msecs_waited < > max_waiting_time_60s)) { > >> - usleep(sleep_delay_ms * 1000); > >> - msecs_waited += > sleep_delay_ms; > >> - rc = saImmOiImplementerSet(cb- > >immOiHandle, > >> implementerName); > >> - } > >> - if (rc != SA_AIS_OK) { > >> - > LOG_ER("saImmOiImplementerSet Failed %u", rc); > >> - exit(EXIT_FAILURE); > >> - } > >> - TRACE("%s: saImmOiImplementerSet() for %s > Done", > >> - __FUNCTION__, > implementerName); > >> - > >> - /* Create the runtime object for showing the > actual > >> - * log server configuration > >> - */ > >> - conf_runtime_obj_create(cb->immOiHandle); > >> + lgs_exit("saImmOiInitialize_2 failed", > >> SA_AMF_COMPONENT_RESTART); > >> } > >> > >> /* Get selection object for event handling */ > >> msecs_waited = 0; > >> - rc = saImmOiSelectionObjectGet(cb->immOiHandle, &cb- > >> >immSelectionObject); > >> + rc = saImmOiSelectionObjectGet(*immOiHandle, > >> immSelectionObject); > >> while ((rc == SA_AIS_ERR_TRY_AGAIN) && (msecs_waited < > >> max_waiting_time_10s)) { > >> usleep(sleep_delay_ms * 1000); > >> msecs_waited += sleep_delay_ms; > >> - rc = saImmOiSelectionObjectGet(cb- > >immOiHandle, &cb- > >> >immSelectionObject); > >> + rc = > saImmOiSelectionObjectGet(*immOiHandle, > >> immSelectionObject); > >> } > >> if (rc != SA_AIS_OK) { > >> - LOG_ER("saImmOiSelectionObjectGet failed > %u", rc); > >> + lgs_exit("saImmOiSelectionObjectGet failed", > >> SA_AMF_COMPONENT_RESTART); > >> + } > >> + > >> + TRACE_LEAVE(); > >> +} > >> + > >> +/** > >> + * Does the sequence of setting an implementer name and class > >> +implementer > >> + * > >> + * @param immOiHandle[in] > >> + * @return SaAisErrorT > >> + */ > >> +static SaAisErrorT imm_impl_set_sequence(SaImmOiHandleT > >> immOiHandle) { > >> + SaAisErrorT rc = SA_AIS_OK; > >> + int msecs_waited; > >> + > >> + TRACE_ENTER(); > >> + > >> + /* Become object implementer > >> + */ > >> + msecs_waited = 0; > >> + rc = saImmOiImplementerSet(immOiHandle, > implementerName); > >> + while (((rc == SA_AIS_ERR_TRY_AGAIN) || (rc == > >> SA_AIS_ERR_EXIST)) && > >> + (msecs_waited < > max_waiting_time_60s)) { > >> + usleep(sleep_delay_ms * 1000); > >> + msecs_waited += sleep_delay_ms; > >> + rc = saImmOiImplementerSet(immOiHandle, > >> implementerName); > >> + } > >> + if (rc != SA_AIS_OK) { > >> + TRACE("saImmOiImplementerSet failed %s", > saf_error(rc)); > >> + goto done; > >> + } > >> + > >> + /* Become class implementer for the SaLogStreamConfig > >> + * Become class implementer for the OpenSafLogConfig class if > it > >> exists > >> + */ > >> + if ( true == *(bool*) > >> lgs_cfg_get(LGS_IMM_LOG_OPENSAFLOGCONFIG_CLASS_EXIST)) { > >> + > (void)immutil_saImmOiClassImplementerSet(immOiHandle, > >> "OpenSafLogConfig"); > >> + msecs_waited = 0; > >> + rc = > saImmOiClassImplementerSet(immOiHandle, > >> "OpenSafLogConfig"); > >> + while (((rc == SA_AIS_ERR_TRY_AGAIN) || (rc > == > >> SA_AIS_ERR_EXIST)) > >> + && (msecs_waited > < > >> max_waiting_time_60s)) { > >> + usleep(sleep_delay_ms * 1000); > >> + msecs_waited += > sleep_delay_ms; > >> + rc = > saImmOiClassImplementerSet(immOiHandle, > >> "OpenSafLogConfig"); > >> + } > >> + if (rc != SA_AIS_OK) { > >> + > TRACE("saImmOiClassImplementerSet > >> OpenSafLogConfig failed %s", saf_error(rc)); > >> + goto done; > >> + } > >> + } > >> + > >> + if (*(bool*) > >> lgs_cfg_get(LGS_IMM_LOG_OPENSAFLOGCONFIG_CLASS_EXIST)) { > >> + msecs_waited = 0; > >> + rc = > saImmOiClassImplementerSet(immOiHandle, > >> "SaLogStreamConfig"); > >> + while (((rc == SA_AIS_ERR_TRY_AGAIN) || (rc > == > >> SA_AIS_ERR_EXIST)) > >> + && (msecs_waited > < > >> max_waiting_time_60s)) { > >> + usleep(sleep_delay_ms * 1000); > >> + msecs_waited += > sleep_delay_ms; > >> + rc = > saImmOiClassImplementerSet(immOiHandle, > >> "SaLogStreamConfig"); > >> + } > >> + if (rc != SA_AIS_OK) { > >> + > TRACE("saImmOiClassImplementerSet > >> SaLogStreamConfig failed %u", rc); > >> + goto done; > >> + } > >> + } > >> + > >> +done: > >> + return rc; > >> + TRACE_LEAVE(); > >> +} > >> + > >> +/** > >> + * Set implementer name and become class implementer. > >> + * This function will block until done. > >> + * > >> + * @param cb > >> + */ > >> +void lgs_imm_impl_set(SaImmOiHandleT immOiHandle) { > >> + SaAisErrorT rc = SA_AIS_OK; > >> + > >> + TRACE_ENTER(); > >> + > >> + rc = imm_impl_set_sequence(immOiHandle); > >> + if (rc != SA_AIS_OK) { > >> + lgs_exit("Becoming OI implementer failed", > >> SA_AMF_COMPONENT_RESTART); > >> + } > >> + > >> + TRACE_LEAVE(); > >> +} > >> + > >> +/** > >> + * Thread > >> + * Restore object and class implementer/applier. > >> + * > >> + * @param _cb[in] > >> + */ > >> +static void *imm_impl_init_thread(void *_cb) { > >> + lgs_cb_t *cb = (lgs_cb_t *)_cb; > >> + SaSelectionObjectT immSelectionObject = 0; > >> + SaImmOiHandleT immOiHandle = 0; > >> + SaAisErrorT rc = SA_AIS_OK; > >> + > >> + TRACE_ENTER(); > >> + > >> + /* Initialize handles and become implementer */ > >> + lgs_imm_init_OI_handle(&immOiHandle, > &immSelectionObject); > >> + rc = imm_impl_set_sequence(immOiHandle); > >> + if (rc != SA_AIS_OK) { > >> + lgs_exit("Becoming OI implementer failed", > >> SA_AMF_COMPONENT_RESTART); > >> + } > >> + > >> + /* Store handle and selection object. > >> + * Protect if the poll loop in main is released during the storage > >> + * sequence. > >> + */ > >> + osaf_mutex_lock_ordie(&lgs_OI_init_mutex); > >> + cb->immSelectionObject = immSelectionObject; > >> + cb->immOiHandle = immOiHandle; > >> + osaf_mutex_unlock_ordie(&lgs_OI_init_mutex); > >> + > >> + /* Activate the poll loop in main() > >> + * This will reinstall IMM poll event handling > >> + */ > >> + lgsv_lgs_evt_t *lgsv_evt; > >> + lgsv_evt = calloc(1, sizeof(lgsv_lgs_evt_t)); > >> + osafassert(lgsv_evt); > >> + lgsv_evt->evt_type = LGSV_EVT_NO_OP; > >> + if (m_NCS_IPC_SEND(&lgs_mbx, lgsv_evt, > >> LGS_IPC_PRIO_CTRL_MSGS) != > >> + NCSCC_RC_SUCCESS) { > >> + LOG_WA("imm_reinit_thread failed to send IPC > message to > >> main thread"); > >> + /* > >> + * Se no reason why this would happen. But if it > does at > least > >> there > >> + * is something in the syslog. The main thread > should still > pick > >> up > >> + * the new imm FD when there is a healthcheck, > but it could > >> take > >> + *minutes. > >> + */ > >> + free(lgsv_evt); > >> + } > >> + > >> + TRACE_LEAVE(); > >> + return NULL; > >> +} > >> + > >> +/** > >> + * In a separate thread: > >> + * Initiate IMM OI handle and selection object > >> + * Create imm implementer for log IMM objects > >> + * When complete: > >> + * Store the new handle and selection object in the cb store. > >> + * Activate the poll loop in main() by sending an empty mailbox message > >> + * > >> + * @param cb[out] > >> + */ > >> +void lgs_imm_impl_reinit_nonblocking(lgs_cb_t *cb) { > >> + pthread_t thread; > >> + pthread_attr_t attr; > >> + > >> + TRACE_ENTER(); > >> + > >> + pthread_attr_init(&attr); > >> + pthread_attr_setdetachstate(&attr, > PTHREAD_CREATE_DETACHED); > >> + > >> + if (pthread_create(&thread, &attr, imm_impl_init_thread, cb) > != 0) { > >> + LOG_ER("pthread_create FAILED: %s", > strerror(errno)); > >> exit(EXIT_FAILURE); > >> } > >> > >> + pthread_attr_destroy(&attr); > >> + > >> TRACE_LEAVE(); > >> - > >> - return rc; > >> } > >> diff --git a/osaf/services/saf/logsv/lgs/lgs_main.c > >> b/osaf/services/saf/logsv/lgs/lgs_main.c > >> --- a/osaf/services/saf/logsv/lgs/lgs_main.c > >> +++ b/osaf/services/saf/logsv/lgs/lgs_main.c > >> @@ -227,14 +227,9 @@ static uint32_t log_initialize(void) > >> goto done; > >> } > >> > >> - /* Initialize IMM OI and get corresponding OI selection object > >> - * Become OI for safLogService if Active > >> - * IMM OI handle and IMM selection object is saved in lgs_cb > >> - */ > >> - if ((rc = lgs_imm_init_OI(lgs_cb)) != SA_AIS_OK) { > >> - LOG_ER("lgs_imm_init FAILED"); > >> - goto done; > >> - } > >> + /* Initialize IMM OI handle and selection object */ > >> + lgs_imm_init_OI_handle(&lgs_cb->immOiHandle, > >> +&lgs_cb->immSelectionObject); > >> + > >> TRACE("IMM init done: lgs_cb->immOiHandle = %lld", lgs_cb- > >> >immOiHandle); > >> > >> /* Initialize log configuration > >> @@ -325,6 +320,10 @@ static uint32_t log_initialize(void) > >> } > >> > >> if (lgs_cb->ha_state == SA_AMF_HA_ACTIVE) { > >> + /* Become OI. We will be blocked here until > done */ > >> + lgs_imm_impl_set(lgs_cb->immOiHandle); > >> + conf_runtime_obj_create(lgs_cb- > >immOiHandle); > >> + > >> /* Create streams that has configuration objects > and become > >> * class implementer for the SaLogStreamConfig > class > >> */ > >> @@ -353,72 +352,6 @@ done: > >> } > >> > >> /** > >> - * Wait a while on IMM and initialize, sel obj get & implementer > >> - * set. > >> - * > >> - * @param _cb > >> - * > >> - * @return void* > >> - */ > >> -static void *imm_reinit_thread(void *_cb) -{ > >> - SaAisErrorT error; > >> - lgs_cb_t *cb = (lgs_cb_t *)_cb; > >> - lgsv_lgs_evt_t *lgsv_evt; > >> - > >> - TRACE_ENTER(); > >> - > >> - if ((error = lgs_imm_init_OI(cb)) != SA_AIS_OK) { > >> - LOG_ER("lgs_imm_init FAILED: %u", error); > >> - exit(EXIT_FAILURE); > >> - } > >> - > >> - lgs_imm_impl_restore(cb); > >> - > >> - /* Wake up the main thread so it discovers the new imm > descriptor. > >> */ > >> - lgsv_evt = calloc(1, sizeof(lgsv_lgs_evt_t)); > >> - osafassert(lgsv_evt); > >> - lgsv_evt->evt_type = LGSV_EVT_NO_OP; > >> - if (m_NCS_IPC_SEND(&lgs_mbx, lgsv_evt, > >> LGS_IPC_PRIO_CTRL_MSGS) != > >> - NCSCC_RC_SUCCESS) { > >> - LOG_WA("imm_reinit_thread failed to send IPC > message to > >> main thread"); > >> - /* > >> - * Se no reason why thos would happen. But if it > does at > least > >> there > >> - * is something in the syslog. The main thread > should still > pick > >> up > >> - * the new imm FD when there is a healthcheck, > but it could > >> take > >> - *minutes. > >> - */ > >> - free(lgsv_evt); > >> - } > >> - > >> - TRACE_LEAVE(); > >> - return NULL; > >> -} > >> - > >> -/** > >> - * Start a background thread to do IMM reinitialization. > >> - * > >> - * @param cb > >> - */ > >> -static void imm_reinit_bg(lgs_cb_t *cb) -{ > >> - pthread_t thread; > >> - pthread_attr_t attr; > >> - pthread_attr_init(&attr); > >> - pthread_attr_setdetachstate(&attr, > PTHREAD_CREATE_DETACHED); > >> - > >> - TRACE_ENTER(); > >> - if (pthread_create(&thread, &attr, imm_reinit_thread, cb) != > 0) { > >> - LOG_ER("pthread_create FAILED: %s", > strerror(errno)); > >> - exit(EXIT_FAILURE); > >> - } > >> - > >> - pthread_attr_destroy(&attr); > >> - > >> - TRACE_LEAVE(); > >> -} > >> - > >> -/** > >> * The main routine for the lgs daemon. > >> * @param argc > >> * @param argv > >> @@ -457,6 +390,10 @@ int main(int argc, char *argv[]) > >> > >> while (1) { > >> > >> + /* Protect since the reinit thread may be in the > process of > >> + * changing the values > >> + */ > >> + osaf_mutex_lock_ordie(&lgs_OI_init_mutex); > >> if (lgs_cb->immOiHandle != 0) { > >> fds[FD_IMM].fd = lgs_cb- > >immSelectionObject; > >> fds[FD_IMM].events = POLLIN; > >> @@ -464,6 +401,7 @@ int main(int argc, char *argv[]) > >> } else { > >> nfds = FD_IMM; > >> } > >> + > osaf_mutex_unlock_ordie(&lgs_OI_init_mutex); > >> > >> int ret = poll(fds, nfds, -1); > >> > >> @@ -538,7 +476,7 @@ int main(int argc, char *argv[]) > >> lgs_cb- > >immOiHandle = 0; > >> > >> /* Initiate IMM > reinitializtion in the > >> background */ > >> - > imm_reinit_bg(lgs_cb); > >> + > lgs_imm_impl_reinit_nonblocking(lgs_cb); > >> } else if (error != SA_AIS_OK) { > >> > LOG_ER("saImmOiDispatch FAILED: %u", > >> error); > >> break; ------------------------------------------------------------------------------ Go from Idea to Many App Stores Faster with Intel(R) XDK Give your users amazing mobile app experiences with Intel(R) XDK. Use one codebase in this all-in-one HTML5 development environment. Design, debug & build mobile apps & 2D/3D high-impact games for multiple OSs. http://pubads.g.doubleclick.net/gampad/clk?id=254741911&iu=/4140 _______________________________________________ Opensaf-devel mailing list [email protected] https://lists.sourceforge.net/lists/listinfo/opensaf-devel
