|
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
|