From: Michael Chase-S. <mc...@us...> - 2012-07-19 17:21:25
|
Update of /cvsroot/sblim/sfcb In directory vz-cvs-3.sog:/tmp/cvs-serv25819 Modified Files: ChangeLog NEWS brokerUpc.c indCIMXMLExport.c indCIMXMLHandler.c interopProvider.c support.c support.h Log Message: [ 3539006 ] Possible indication deadlock Index: indCIMXMLExport.c =================================================================== RCS file: /cvsroot/sblim/sfcb/indCIMXMLExport.c,v retrieving revision 1.19 retrieving revision 1.20 diff -u -d -r1.19 -r1.20 --- indCIMXMLExport.c 7 Jun 2012 02:56:09 -0000 1.19 +++ indCIMXMLExport.c 19 Jul 2012 17:21:22 -0000 1.20 @@ -215,6 +215,8 @@ // Fail if we receive an error (HTTP response code >= 300) rv = curl_easy_setopt(cd->mHandle, CURLOPT_FAILONERROR, 1); + rv = curl_easy_setopt(cd->mHandle, CURLOPT_NOSIGNAL, 1); + // Turn this on to enable debugging // rv = curl_easy_setopt(mHandle, CURLOPT_VERBOSE, 1); Index: ChangeLog =================================================================== RCS file: /cvsroot/sblim/sfcb/ChangeLog,v retrieving revision 1.793 retrieving revision 1.794 diff -u -d -r1.793 -r1.794 --- ChangeLog 10 Jul 2012 16:29:04 -0000 1.793 +++ ChangeLog 19 Jul 2012 17:21:22 -0000 1.794 @@ -1,3 +1,10 @@ +2012-07-19 Michael Chase-Salerno <br...@li...> + + * brokerUpc.c, indCIMXMLExport.c, indCIMXMLHandler.c, interopProvider.c, +support.c, support.h: + [ 3539006 ] Possible indication deadlock + + 2012-07-10 Michael Chase-Salerno <br...@li...> * test/stageschema.sh: Index: interopProvider.c =================================================================== RCS file: /cvsroot/sblim/sfcb/interopProvider.c,v retrieving revision 1.66 retrieving revision 1.67 diff -u -d -r1.66 -r1.67 --- interopProvider.c 5 Jul 2012 23:04:47 -0000 1.66 +++ interopProvider.c 19 Jul 2012 17:21:22 -0000 1.67 @@ -90,6 +90,12 @@ static UtilHashTable *handlerHt = NULL; static UtilHashTable *subscriptionHt = NULL; +// Mutex's to protect the hash tables +static pthread_mutex_t filterHTlock = PTHREAD_MUTEX_INITIALIZER; +static pthread_mutex_t handlerHTlock = PTHREAD_MUTEX_INITIALIZER; +static pthread_mutex_t subHTlock = PTHREAD_MUTEX_INITIALIZER; +static pthread_mutex_t subDelLock = PTHREAD_MUTEX_INITIALIZER; + /* for indication delivery */ static long MAX_IND_THREADS; static long IND_THREAD_TO; @@ -142,6 +148,7 @@ _SFCB_ENTER(TRACE_INDPROVIDER, "addSubscription"); + pthread_mutex_lock(&subHTlock); if (subscriptionHt == NULL) { subscriptionHt=UtilFactory->newHashTable(61,UtilHashTable_charKey); subscriptionHt->ft->setReleaseFunctions(subscriptionHt, free, NULL); @@ -150,7 +157,10 @@ _SFCB_TRACE(1,("-- Subscription: %s\n",key)); su=subscriptionHt->ft->get(subscriptionHt,key); - if (su) _SFCB_RETURN(NULL); + if (su) { + pthread_mutex_unlock(&subHTlock); + _SFCB_RETURN(su); + } su=(Subscription*)malloc(sizeof(Subscription)); su->sci=CMClone(ci,NULL); @@ -160,6 +170,7 @@ ha->useCount++; subscriptionHt->ft->put(subscriptionHt,key,su); + pthread_mutex_unlock(&subHTlock); _SFCB_RETURN(su); } @@ -186,6 +197,7 @@ { _SFCB_ENTER(TRACE_INDPROVIDER, "removeSubscription"); + pthread_mutex_lock(&subHTlock); if (subscriptionHt) { subscriptionHt->ft->remove(subscriptionHt,key); if (su) { @@ -194,10 +206,13 @@ } } if (su) { - CMRelease(su->sci); + if (su->sci) { + CMRelease(su->sci); + } free (su); } + pthread_mutex_unlock(&subHTlock); _SFCB_EXIT(); } @@ -219,13 +234,17 @@ _SFCB_TRACE(1,("--- Filter: >%s<",key)); _SFCB_TRACE(1,("--- query: >%s<",query)); + pthread_mutex_lock(&filterHTlock); if (filterHt==NULL) { filterHt=UtilFactory->newHashTable(61,UtilHashTable_charKey); filterHt->ft->setReleaseFunctions(filterHt, free, NULL); } fi=filterHt->ft->get(filterHt,key); - if (fi) _SFCB_RETURN(NULL); + if (fi) { + pthread_mutex_unlock(&filterHTlock); + _SFCB_RETURN(NULL); + } fi=(Filter*)malloc(sizeof(Filter)); fi->fci=CMClone(ci,NULL); @@ -238,6 +257,7 @@ else fi->snsa = NULL; fi->type=NULL; filterHt->ft->put(filterHt,key,fi); + pthread_mutex_unlock(&filterHTlock); _SFCB_RETURN(fi); } @@ -265,6 +285,7 @@ { _SFCB_ENTER(TRACE_INDPROVIDER, "removeFilter"); + pthread_mutex_lock(&filterHTlock); if (filterHt) { filterHt->ft->remove(filterHt,key); } @@ -278,6 +299,7 @@ free (fi); } + pthread_mutex_unlock(&filterHTlock); _SFCB_EXIT(); } @@ -292,6 +314,7 @@ _SFCB_ENTER(TRACE_INDPROVIDER, "addHandler"); + pthread_mutex_lock(&handlerHTlock); if (handlerHt==NULL) { handlerHt=UtilFactory->newHashTable(61,UtilHashTable_charKey); handlerHt->ft->setReleaseFunctions(handlerHt, free, NULL); @@ -304,6 +327,7 @@ if ((ha=handlerHt->ft->get(handlerHt,key))!=NULL) { _SFCB_TRACE(1,("--- Handler already registered %p",ha)); if(key) free(key); + pthread_mutex_unlock(&handlerHTlock); _SFCB_RETURN(NULL); } @@ -313,6 +337,7 @@ ha->useCount=0; handlerHt->ft->put(handlerHt,key,ha); + pthread_mutex_unlock(&handlerHTlock); _SFCB_RETURN(ha); } @@ -339,6 +364,7 @@ { _SFCB_ENTER(TRACE_INDPROVIDER, "removeHandler"); + pthread_mutex_lock(&handlerHTlock); if (handlerHt) { handlerHt->ft->remove(handlerHt,key); } @@ -348,6 +374,7 @@ free (ha); } + pthread_mutex_unlock(&handlerHTlock); _SFCB_EXIT(); } @@ -370,10 +397,12 @@ _SFCB_TRACE(1,("--- Handler: %s",key)); + pthread_mutex_lock(&handlerHTlock); // do we need to check?? if ((ha=handlerHt->ft->get(handlerHt,key))==NULL) { _SFCB_TRACE(1,("--- No handler %p",ha)); if(key) free(key); + pthread_mutex_unlock(&handlerHTlock); _SFCB_RETURN(NULL); } @@ -383,6 +412,7 @@ ha->hop=CMClone(op,NULL); handlerHt->ft->put(handlerHt,key,ha); + pthread_mutex_unlock(&handlerHTlock); _SFCB_RETURN(ha); } @@ -1164,10 +1194,12 @@ /*check if SubscriptionState changed enable/disableIndication */ + pthread_mutex_lock(&subHTlock); su=getSubscription(key); free(key); if(!su) { st.rc = CMPI_RC_ERR_NOT_FOUND; + pthread_mutex_unlock(&subHTlock); return st; } oldInst = su->sci; @@ -1182,6 +1214,7 @@ getControlNum("MaxActiveSubscriptions", &cfgmax); if (AScount+1 > cfgmax) { setStatus(&st,CMPI_RC_ERR_FAILED,"Subscription activation would exceed MaxActiveSubscription limit"); + pthread_mutex_unlock(&subHTlock); return st; } switchIndications(ctx, ci, OPS_EnableIndications); @@ -1195,6 +1228,7 @@ /*replace the instance in the hashtable*/ CMRelease(su->sci); su->sci=CMClone(ci,NULL); + pthread_mutex_unlock(&subHTlock); } else if(isa("root/interop", cns, "cim_listenerdestination")) { @@ -1252,6 +1286,7 @@ _SFCB_ENTER(TRACE_INDPROVIDER, "InteropProviderDeleteInstance"); if(isa(nss, cns, "cim_indicationsubscription")) { + pthread_mutex_lock(&subDelLock); _SFCB_TRACE(1,("--- delete cim_indicationsubscription %s",key)); if ((su=getSubscription(key))) { fi=su->fi; @@ -1278,6 +1313,7 @@ removeSubscription(su,key); } else setStatus(&st,CMPI_RC_ERR_NOT_FOUND,NULL); + pthread_mutex_unlock(&subDelLock); } else if (isa(nss, cns, "cim_indicationfilter")) { @@ -1403,6 +1439,7 @@ CMRelease(ind); /* this is ok since AddArg will make a copy */ CMAddArg(hin,"nameSpace",ns,CMPI_chars); + pthread_mutex_lock(&subHTlock); if (subscriptionHt) for (i = subscriptionHt->ft->getFirst(subscriptionHt, (void**)&suName, (void**)&su); i; i = subscriptionHt->ft->getNext(subscriptionHt,i, @@ -1442,6 +1479,7 @@ } } + pthread_mutex_unlock(&subHTlock); } else if (strcasecmp(methodName, "_addHandler") == 0) { Index: support.c =================================================================== RCS file: /cvsroot/sblim/sfcb/support.c,v retrieving revision 1.41 retrieving revision 1.42 diff -u -d -r1.41 -r1.42 --- support.c 5 Jul 2012 23:04:47 -0000 1.41 +++ support.c 19 Jul 2012 17:21:22 -0000 1.42 @@ -1099,3 +1099,16 @@ if (hostnameLib) dlclose(hostnameLib); return; } + +CMPIContext * prepareNorespCtx(const CMPIContext *ctx) +{ + /* + * used to allow calls without waiting for the response to be returned + */ + CMPIContext *ctxLocal; + ctxLocal = native_clone_CMPIContext(ctx); + CMPIValue val; + val.boolean = 1; + ctxLocal->ft->addEntry(ctxLocal, "noResp", &val, CMPI_boolean); + return ctxLocal; +} Index: indCIMXMLHandler.c =================================================================== RCS file: /cvsroot/sblim/sfcb/indCIMXMLHandler.c,v retrieving revision 1.55 retrieving revision 1.56 diff -u -d -r1.55 -r1.56 --- indCIMXMLHandler.c 3 Jul 2012 02:00:22 -0000 1.55 +++ indCIMXMLHandler.c 19 Jul 2012 17:21:22 -0000 1.56 @@ -37,6 +37,7 @@ #include "native.h" #include "control.h" #include "instance.h" +#include "support.h" extern void closeProviderContext(BinRequestContext* ctx); extern int exportIndication(char *url, char *payload, char **resp, char **msg); @@ -794,7 +795,8 @@ // 2, delete the sub; 3, disable the sub; otherwise, nothing if (ract == 2 ) { _SFCB_TRACE(1,("--- Subscription threshold reached, deleting.")); - CBDeleteInstance(_broker, ctx, cur->sub); + CMPIContext *ctxDel = prepareNorespCtx(ctx); + CBDeleteInstance(_broker, ctxDel, cur->sub); purge=cur; cur=cur->next; dqRetry(ctx,purge); Index: NEWS =================================================================== RCS file: /cvsroot/sblim/sfcb/NEWS,v retrieving revision 1.708 retrieving revision 1.709 diff -u -d -r1.708 -r1.709 --- NEWS 9 Jul 2012 18:34:17 -0000 1.708 +++ NEWS 19 Jul 2012 17:21:22 -0000 1.709 @@ -9,6 +9,7 @@ - 3539557 Memory leak in providerDrv with property list - 3539555 Memory leak in TestInstanceProvider - 1901737 Memory leak in internalProvider.c +- 3539006 Possible indication deadlock Changes in 1.3.15 ================= Index: brokerUpc.c =================================================================== RCS file: /cvsroot/sblim/sfcb/brokerUpc.c,v retrieving revision 1.41 retrieving revision 1.42 diff -u -d -r1.41 -r1.42 --- brokerUpc.c 17 May 2012 21:45:11 -0000 1.41 +++ brokerUpc.c 19 Jul 2012 17:21:22 -0000 1.42 @@ -254,6 +254,9 @@ ctxData=CMGetContextEntry(ctx,CMPIInvocationFlags,NULL); bHdr->flags=ctxData.value.Int; bHdr->sessionId=ctx->ft->getEntry(ctx,"CMPISessionId",NULL).value.uint32; + ctxData = ctx->ft->getEntry(ctx, "noResp", NULL); + binCtx->noResp = (ctxData.state == CMPI_nullValue) ? 0 : ctxData.value.boolean; + binCtx->oHdr = oHdr; binCtx->bHdr = bHdr; @@ -757,7 +760,7 @@ const CMPIContext * context, const CMPIObjectPath * cop) { BinRequestContext binCtx; - BinResponseHdr *resp; + BinResponseHdr *resp = NULL; DeleteInstanceReq sreq = BINREQ(OPS_DeleteInstance, DI_REQ_REG_SEGMENTS); OperationHdr oHdr = { OPS_DeleteInstance, 2 }; CMPIStatus st = { CMPI_RC_OK, NULL }; @@ -803,9 +806,11 @@ resp = invokeProvider(&binCtx); closeProviderContext(&binCtx); - resp->rc--; - buildStatus(resp,&st); - free(resp); + if (resp) { + resp->rc--; + buildStatus(resp,&st); + free(resp); + } } else st = setErrorStatus(irc); Index: support.h =================================================================== RCS file: /cvsroot/sblim/sfcb/support.h,v retrieving revision 1.16 retrieving revision 1.17 diff -u -d -r1.16 -r1.17 --- support.h 10 Mar 2009 19:18:19 -0000 1.16 +++ support.h 19 Jul 2012 17:21:22 -0000 1.17 @@ -226,6 +226,8 @@ char* sfcb_snprintf(const char* fmt, ...); +CMPIContext * prepareNorespCtx(const CMPIContext *ctx); + #if defined(__ia64__) #define PADDING_LEN(s) ( (s)%sizeof(void *) ? sizeof(void *) - (s)%sizeof(void *) : 0) #else |