Hi All, If there are no further comments, I will push the patch by tomorrow.
/Neel. On 2016/06/16 04:22 PM, Neelakanta Reddy wrote: > Hi Rafael, > > I will update the comments, while pushing the patch. > > /Neel. > > On 2016/06/16 04:14 PM, Rafael Odzakow wrote: >> ran cppcheck on this patch it added two comments. >> >> otherwise ACK from me. >> >> On 06/14/2016 01:26 PM, reddy.neelaka...@oracle.com wrote: >>> osaf/services/saf/smfsv/smfd/smfd.h | 4 + >>> osaf/services/saf/smfsv/smfd/smfd_campaign_oi.cc | 19 ++++- >>> osaf/services/saf/smfsv/smfd/smfd_cb.h | 1 + >>> osaf/services/saf/smfsv/smfd/smfd_main.c | 86 >>> ++++++++++++++++++++++- >>> 4 files changed, 104 insertions(+), 6 deletions(-) >>> >>> >>> mutex is introduced, when accessing IMM OI handle, between campaign >>> thread and main thread >>> >>> diff --git a/osaf/services/saf/smfsv/smfd/smfd.h >>> b/osaf/services/saf/smfsv/smfd/smfd.h >>> --- a/osaf/services/saf/smfsv/smfd/smfd.h >>> +++ b/osaf/services/saf/smfsv/smfd/smfd.h >>> @@ -98,6 +98,10 @@ extern "C" { >>> void smfd_cb_lock(); >>> void smfd_cb_unlock(); >>> + void smfd_imm_lock(); >>> + void smfd_imm_unlock(); >>> + int smfd_imm_trylock(); >>> + >>> #ifdef __cplusplus >>> } >>> diff --git a/osaf/services/saf/smfsv/smfd/smfd_campaign_oi.cc >>> b/osaf/services/saf/smfsv/smfd/smfd_campaign_oi.cc >>> --- a/osaf/services/saf/smfsv/smfd/smfd_campaign_oi.cc >>> +++ b/osaf/services/saf/smfsv/smfd/smfd_campaign_oi.cc >>> @@ -743,11 +743,26 @@ uint32_t create_campaign_objects(smfd_cb >>> */ >>> uint32_t updateImmAttr(const char *dn, SaImmAttrNameT >>> attributeName, SaImmValueTypeT attrValueType, void *value) >>> { >>> + smfd_imm_lock(); >>> SaAisErrorT rc = >>> immutil_update_one_rattr(smfd_cb->campaignOiHandle, dn, >>> attributeName, attrValueType, value); >>> + smfd_imm_unlock(); >>> + >>> if (rc != SA_AIS_OK) { >>> - LOG_ER("updateImmAttr(): immutil_update_one_rattr FAILED, rc >>> = %d, going to assert", (int)rc); >>> - osafassert(0); >>> + if (rc == SA_AIS_ERR_BAD_HANDLE){ >>> + /* If there is IMMND restart in the middle of campign, >>> there is chance that >>> + * the camiaign thread with Rt-update will get timeout, >>> because the update >>> + * has been sent to IMMND, before the reply is sent >>> back to OI(SMFD) the IMMND >>> + * is restarted and BAD_HANDLE is returned after API >>> timout. >>> + */ >>> + >>> + LOG_WA("updateImmAttr(): immutil_update_one_rattr >>> FAILED, rc = %d," >>> + "OI handle will be resurrected", (int)rc); >>> + } else { >>> + LOG_ER("updateImmAttr(): immutil_update_one_rattr >>> FAILED, rc = %d, going to assert", (int)rc); >>> + osafassert(0); >>> + } >>> } >>> + >>> return NCSCC_RC_SUCCESS; >>> } >>> diff --git a/osaf/services/saf/smfsv/smfd/smfd_cb.h >>> b/osaf/services/saf/smfsv/smfd/smfd_cb.h >>> --- a/osaf/services/saf/smfsv/smfd/smfd_cb.h >>> +++ b/osaf/services/saf/smfsv/smfd/smfd_cb.h >>> @@ -68,6 +68,7 @@ typedef struct smfd_cb { >>> SMFD_SMFND_ADEST_INVID_MAP *smfnd_list; /* SMFNDs need to >>> respond to the callback. */ >>> uint32_t no_of_smfnd; >>> pthread_mutex_t lock; /* Used by smfd_cb_t >>> lock/unlock functions */ >>> + pthread_mutex_t imm_lock; /* Used when IMM >>> OI handle is shared between campaign thread and main thread*/ >>> uint32_t maxDnLength; /* Max DN length */ >>> uint32_t procExecutionMode; /* Control the >>> procedure execution modes >>> SMF_STANDARD 0 >>> diff --git a/osaf/services/saf/smfsv/smfd/smfd_main.c >>> b/osaf/services/saf/smfsv/smfd/smfd_main.c >>> --- a/osaf/services/saf/smfsv/smfd/smfd_main.c >>> +++ b/osaf/services/saf/smfsv/smfd/smfd_main.c >>> @@ -96,6 +96,50 @@ void smfd_cb_unlock() >>> } >>> } >>> +int smfd_imm_trylock() >>> +{ >>> + TRACE_ENTER(); >>> + int err ; >>> + >>> + err = pthread_mutex_trylock(&(smfd_cb->imm_lock)); >>> + if (err != 0) { >>> + if ( err == EBUSY ){ >>> + LOG_WA("Lock failed eith EBUSY pthread_mutex_trylock for >>> imm %d", err); >>> + return 1; >>> + } else { >>> + LOG_ER("Lock failed pthread_mutex_trylock for imm %d", >>> err); >>> + abort(); >>> + } >>> + } >>> + return 0; >> [rafael] this return is never reached >>> + TRACE_LEAVE(); >>> +} >>> + >>> +void smfd_imm_lock() >>> +{ >>> + TRACE_ENTER(); >>> + int errno; >> [rafael] errno is never used >>> + >>> + if (pthread_mutex_lock(&(smfd_cb->imm_lock)) != 0) { >>> + LOG_ER("Lock failed pthread_mutex_lock for imm"); >>> + abort(); >>> + } >>> + TRACE_LEAVE(); >>> +} >>> + >>> + >>> +void smfd_imm_unlock() >>> +{ >>> + TRACE_ENTER(); >>> + if (pthread_mutex_unlock(&(smfd_cb->imm_lock)) != 0) { >>> + LOG_ER("Unlock failed pthread_mutex_unlock for imm"); >>> + abort(); >>> + } >>> + TRACE_LEAVE(); >>> +} >>> + >>> + >>> + >>> /**************************************************************************** >>> * Name : smfd_cb_init >>> * >>> @@ -112,7 +156,7 @@ uint32_t smfd_cb_init(smfd_cb_t * smfd_c >>> { >>> TRACE_ENTER(); >>> - pthread_mutexattr_t mutex_attr; >>> + pthread_mutexattr_t mutex_attr, mutex_attr1; >>> smfd_cb->amfSelectionObject = -1; >>> smfd_cb->campaignSelectionObject = -1; >>> @@ -159,6 +203,28 @@ uint32_t smfd_cb_init(smfd_cb_t * smfd_c >>> LOG_ER("Failed pthread_mutexattr_destroy"); >>> return NCSCC_RC_FAILURE; >>> } >>> + if (pthread_mutexattr_init(&mutex_attr1) != 0) { >>> + LOG_ER("Failed pthread_mutexattr_init used for imm"); >>> + return NCSCC_RC_FAILURE; >>> + } >>> + >>> + if (pthread_mutexattr_settype(&mutex_attr1, >>> PTHREAD_MUTEX_RECURSIVE) != 0) { >>> + LOG_ER("Failed pthread_mutexattr_settype used for imm"); >>> + pthread_mutexattr_destroy(&mutex_attr1); >>> + return NCSCC_RC_FAILURE; >>> + } >>> + >>> + if (pthread_mutex_init(&(smfd_cb->imm_lock), &mutex_attr1) != 0) { >>> + LOG_ER("Failed pthread_mutex_init used for imm"); >>> + pthread_mutexattr_destroy(&mutex_attr1); >>> + return NCSCC_RC_FAILURE; >>> + } >>> + >>> + if (pthread_mutexattr_destroy(&mutex_attr1) != 0) { >>> + LOG_ER("Failed pthread_mutexattr_destroy used for imm"); >>> + return NCSCC_RC_FAILURE; >>> + } >>> + >>> TRACE_LEAVE(); >>> return NCSCC_RC_SUCCESS; >>> @@ -335,9 +401,21 @@ static void main_process(void) >>> /* Process all the Imm callback events */ >>> if (fds[SMFD_COI_FD].revents & POLLIN) { >>> - if ((error = >>> - saImmOiDispatch(smfd_cb->campaignOiHandle, >>> - SA_DISPATCH_ALL)) != SA_AIS_OK) { >>> + if ( smfd_imm_trylock() == 0 ) { >>> + >>> + /* In the case of IMMND restart, If trylock succedes >>> then the oiDispatch >>> + * is called and IMM OI will get resurrected. >>> Otherwise, the campign >>> + * thread has taken the imm_lock. Campign thread >>> will resurrect the IMM >>> + * OI handle. trylock is used to unlock the main >>> thread, if the >>> + * immlock is taken by campaign thread. >>> + */ >>> + >>> + error = saImmOiDispatch(smfd_cb->campaignOiHandle, >>> + SA_DISPATCH_ALL); >>> + smfd_imm_unlock(); >>> + } >>> + >>> + if (error != SA_AIS_OK) { >>> /* >>> ** BAD_HANDLE is interpreted as an IMM service >>> restart. Try >>> ** reinitialize the IMM OI API in a background >>> thread and let > > ------------------------------------------------------------------------------ > What NetFlow Analyzer can do for you? Monitors network bandwidth and traffic > patterns at an interface-level. Reveals which users, apps, and protocols are > consuming the most bandwidth. Provides multi-vendor support for NetFlow, > J-Flow, sFlow and other flows. Make informed decisions using capacity planning > reports. http://pubads.g.doubleclick.net/gampad/clk?id=1444514421&iu=/41014381 > _______________________________________________ > Opensaf-devel mailing list > Opensaf-devel@lists.sourceforge.net > https://lists.sourceforge.net/lists/listinfo/opensaf-devel ------------------------------------------------------------------------------ What NetFlow Analyzer can do for you? Monitors network bandwidth and traffic patterns at an interface-level. Reveals which users, apps, and protocols are consuming the most bandwidth. Provides multi-vendor support for NetFlow, J-Flow, sFlow and other flows. Make informed decisions using capacity planning reports. http://sdm.link/zohomanageengine _______________________________________________ Opensaf-devel mailing list Opensaf-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/opensaf-devel