Ensure that the htpp context is valid before release
This commit is contained in:
parent
a6a0c40862
commit
4c024aab37
|
@ -120,7 +120,7 @@ SConnObj *mnodeAccquireConn(int32_t connId, char *user, uint32_t ip, uint16_t po
|
||||||
}
|
}
|
||||||
|
|
||||||
if (/* pConn->ip != ip || */ pConn->port != port /* || strcmp(pConn->user, user) != 0 */) {
|
if (/* pConn->ip != ip || */ pConn->port != port /* || strcmp(pConn->user, user) != 0 */) {
|
||||||
mError("connId:%d, incoming conn user:%s ip:%s:%u, not match exist conn user:%s ip:%s:%u", connId, user,
|
mDebug("connId:%d, incoming conn user:%s ip:%s:%u, not match exist conn user:%s ip:%s:%u", connId, user,
|
||||||
taosIpStr(ip), port, pConn->user, taosIpStr(pConn->ip), pConn->port);
|
taosIpStr(ip), port, pConn->user, taosIpStr(pConn->ip), pConn->port);
|
||||||
taosCacheRelease(tsMnodeConnCache, (void **)&pConn, false);
|
taosCacheRelease(tsMnodeConnCache, (void **)&pConn, false);
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
|
@ -58,7 +58,7 @@ static void httpDestroyContext(void *data) {
|
||||||
}
|
}
|
||||||
|
|
||||||
bool httpInitContexts() {
|
bool httpInitContexts() {
|
||||||
tsHttpServer.contextCache = taosCacheInit(TSDB_DATA_TYPE_BIGINT, 2, true, httpDestroyContext, "restc");
|
tsHttpServer.contextCache = taosCacheInit(TSDB_DATA_TYPE_BIGINT, 3, true, httpDestroyContext, "restc");
|
||||||
if (tsHttpServer.contextCache == NULL) {
|
if (tsHttpServer.contextCache == NULL) {
|
||||||
httpError("failed to init context cache");
|
httpError("failed to init context cache");
|
||||||
return false;
|
return false;
|
||||||
|
@ -108,7 +108,7 @@ HttpContext *httpCreateContext(int32_t fd) {
|
||||||
pContext->lastAccessTime = taosGetTimestampSec();
|
pContext->lastAccessTime = taosGetTimestampSec();
|
||||||
pContext->state = HTTP_CONTEXT_STATE_READY;
|
pContext->state = HTTP_CONTEXT_STATE_READY;
|
||||||
|
|
||||||
HttpContext **ppContext = taosCachePut(tsHttpServer.contextCache, &pContext, sizeof(int64_t), &pContext, sizeof(int64_t), 3);
|
HttpContext **ppContext = taosCachePut(tsHttpServer.contextCache, &pContext, sizeof(int64_t), &pContext, sizeof(int64_t), 5);
|
||||||
pContext->ppContext = ppContext;
|
pContext->ppContext = ppContext;
|
||||||
httpDebug("context:%p, fd:%d, is created, data:%p", pContext, fd, ppContext);
|
httpDebug("context:%p, fd:%d, is created, data:%p", pContext, fd, ppContext);
|
||||||
|
|
||||||
|
@ -133,13 +133,22 @@ HttpContext *httpGetContext(void *ptr) {
|
||||||
}
|
}
|
||||||
|
|
||||||
void httpReleaseContext(HttpContext *pContext) {
|
void httpReleaseContext(HttpContext *pContext) {
|
||||||
|
// Ensure that the context is valid before release
|
||||||
|
HttpContext **ppContext = taosCacheAcquireByKey(tsHttpServer.contextCache, &pContext, sizeof(HttpContext *));
|
||||||
|
if (ppContext == NULL) {
|
||||||
|
httpError("context:%p, is already released", pContext);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
int32_t refCount = atomic_sub_fetch_32(&pContext->refCount, 1);
|
int32_t refCount = atomic_sub_fetch_32(&pContext->refCount, 1);
|
||||||
assert(refCount >= 0);
|
assert(refCount >= 0);
|
||||||
|
assert(ppContext == pContext->ppContext);
|
||||||
|
|
||||||
HttpContext **ppContext = pContext->ppContext;
|
|
||||||
httpDebug("context:%p, is released, data:%p refCount:%d", pContext, ppContext, refCount);
|
httpDebug("context:%p, is released, data:%p refCount:%d", pContext, ppContext, refCount);
|
||||||
|
|
||||||
if (tsHttpServer.contextCache != NULL) {
|
if (tsHttpServer.contextCache != NULL) {
|
||||||
|
// and release context twice
|
||||||
|
taosCacheRelease(tsHttpServer.contextCache, (void **)(&ppContext), false);
|
||||||
taosCacheRelease(tsHttpServer.contextCache, (void **)(&ppContext), false);
|
taosCacheRelease(tsHttpServer.contextCache, (void **)(&ppContext), false);
|
||||||
} else {
|
} else {
|
||||||
httpDebug("context:%p, won't be destroyed for cache is already released", pContext);
|
httpDebug("context:%p, won't be destroyed for cache is already released", pContext);
|
||||||
|
|
Loading…
Reference in New Issue