Merge pull request #22520 from taosdata/fix/dataSinkIssue
fix: global data sink manager issue
This commit is contained in:
commit
9a192442c2
|
@ -59,7 +59,7 @@ typedef struct SDataSinkMgtCfg {
|
||||||
uint32_t maxDataBlockNumPerQuery;
|
uint32_t maxDataBlockNumPerQuery;
|
||||||
} SDataSinkMgtCfg;
|
} SDataSinkMgtCfg;
|
||||||
|
|
||||||
int32_t dsDataSinkMgtInit(SDataSinkMgtCfg* cfg, SStorageAPI* pAPI);
|
int32_t dsDataSinkMgtInit(SDataSinkMgtCfg* cfg, SStorageAPI* pAPI, void** ppSinkManager);
|
||||||
|
|
||||||
typedef struct SInputData {
|
typedef struct SInputData {
|
||||||
const struct SSDataBlock* pData;
|
const struct SSDataBlock* pData;
|
||||||
|
@ -83,7 +83,7 @@ typedef struct SOutputData {
|
||||||
* @param pHandle output
|
* @param pHandle output
|
||||||
* @return error code
|
* @return error code
|
||||||
*/
|
*/
|
||||||
int32_t dsCreateDataSinker(const SDataSinkNode* pDataSink, DataSinkHandle* pHandle, void* pParam, const char* id);
|
int32_t dsCreateDataSinker(void* pSinkManager, const SDataSinkNode* pDataSink, DataSinkHandle* pHandle, void* pParam, const char* id);
|
||||||
|
|
||||||
int32_t dsDataSinkGetCacheSize(SDataSinkStat* pStat);
|
int32_t dsDataSinkGetCacheSize(SDataSinkStat* pStat);
|
||||||
|
|
||||||
|
|
|
@ -224,6 +224,8 @@ static int32_t destroyDataSinker(SDataSinkHandle* pHandle) {
|
||||||
}
|
}
|
||||||
taosCloseQueue(pDeleter->pDataBlocks);
|
taosCloseQueue(pDeleter->pDataBlocks);
|
||||||
taosThreadMutexDestroy(&pDeleter->mutex);
|
taosThreadMutexDestroy(&pDeleter->mutex);
|
||||||
|
|
||||||
|
taosMemoryFree(pDeleter->pManager);
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -279,6 +281,8 @@ _end:
|
||||||
if (deleter != NULL) {
|
if (deleter != NULL) {
|
||||||
destroyDataSinker((SDataSinkHandle*)deleter);
|
destroyDataSinker((SDataSinkHandle*)deleter);
|
||||||
taosMemoryFree(deleter);
|
taosMemoryFree(deleter);
|
||||||
|
} else {
|
||||||
|
taosMemoryFree(pManager);
|
||||||
}
|
}
|
||||||
return code;
|
return code;
|
||||||
}
|
}
|
||||||
|
|
|
@ -226,6 +226,7 @@ static int32_t destroyDataSinker(SDataSinkHandle* pHandle) {
|
||||||
}
|
}
|
||||||
taosCloseQueue(pDispatcher->pDataBlocks);
|
taosCloseQueue(pDispatcher->pDataBlocks);
|
||||||
taosThreadMutexDestroy(&pDispatcher->mutex);
|
taosThreadMutexDestroy(&pDispatcher->mutex);
|
||||||
|
taosMemoryFree(pDispatcher->pManager);
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -240,7 +241,7 @@ int32_t createDataDispatcher(SDataSinkManager* pManager, const SDataSinkNode* pD
|
||||||
SDataDispatchHandle* dispatcher = taosMemoryCalloc(1, sizeof(SDataDispatchHandle));
|
SDataDispatchHandle* dispatcher = taosMemoryCalloc(1, sizeof(SDataDispatchHandle));
|
||||||
if (NULL == dispatcher) {
|
if (NULL == dispatcher) {
|
||||||
terrno = TSDB_CODE_OUT_OF_MEMORY;
|
terrno = TSDB_CODE_OUT_OF_MEMORY;
|
||||||
return TSDB_CODE_OUT_OF_MEMORY;
|
goto _return;
|
||||||
}
|
}
|
||||||
dispatcher->sink.fPut = putDataBlock;
|
dispatcher->sink.fPut = putDataBlock;
|
||||||
dispatcher->sink.fEndPut = endPut;
|
dispatcher->sink.fEndPut = endPut;
|
||||||
|
@ -257,8 +258,13 @@ int32_t createDataDispatcher(SDataSinkManager* pManager, const SDataSinkNode* pD
|
||||||
if (NULL == dispatcher->pDataBlocks) {
|
if (NULL == dispatcher->pDataBlocks) {
|
||||||
taosMemoryFree(dispatcher);
|
taosMemoryFree(dispatcher);
|
||||||
terrno = TSDB_CODE_OUT_OF_MEMORY;
|
terrno = TSDB_CODE_OUT_OF_MEMORY;
|
||||||
return TSDB_CODE_OUT_OF_MEMORY;
|
goto _return;
|
||||||
}
|
}
|
||||||
*pHandle = dispatcher;
|
*pHandle = dispatcher;
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
|
|
||||||
|
_return:
|
||||||
|
|
||||||
|
taosMemoryFree(pManager);
|
||||||
|
return terrno;
|
||||||
}
|
}
|
||||||
|
|
|
@ -395,6 +395,8 @@ static int32_t destroyDataSinker(SDataSinkHandle* pHandle) {
|
||||||
taosMemoryFree(pInserter->pParam);
|
taosMemoryFree(pInserter->pParam);
|
||||||
taosHashCleanup(pInserter->pCols);
|
taosHashCleanup(pInserter->pCols);
|
||||||
taosThreadMutexDestroy(&pInserter->mutex);
|
taosThreadMutexDestroy(&pInserter->mutex);
|
||||||
|
|
||||||
|
taosMemoryFree(pInserter->pManager);
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -411,7 +413,7 @@ int32_t createDataInserter(SDataSinkManager* pManager, const SDataSinkNode* pDat
|
||||||
if (NULL == inserter) {
|
if (NULL == inserter) {
|
||||||
taosMemoryFree(pParam);
|
taosMemoryFree(pParam);
|
||||||
terrno = TSDB_CODE_OUT_OF_MEMORY;
|
terrno = TSDB_CODE_OUT_OF_MEMORY;
|
||||||
return TSDB_CODE_OUT_OF_MEMORY;
|
goto _return;
|
||||||
}
|
}
|
||||||
|
|
||||||
SQueryInserterNode* pInserterNode = (SQueryInserterNode*)pDataSink;
|
SQueryInserterNode* pInserterNode = (SQueryInserterNode*)pDataSink;
|
||||||
|
@ -431,23 +433,18 @@ int32_t createDataInserter(SDataSinkManager* pManager, const SDataSinkNode* pDat
|
||||||
int64_t suid = 0;
|
int64_t suid = 0;
|
||||||
int32_t code = pManager->pAPI->metaFn.getTableSchema(inserter->pParam->readHandle->vnode, pInserterNode->tableId, &inserter->pSchema, &suid);
|
int32_t code = pManager->pAPI->metaFn.getTableSchema(inserter->pParam->readHandle->vnode, pInserterNode->tableId, &inserter->pSchema, &suid);
|
||||||
if (code) {
|
if (code) {
|
||||||
destroyDataSinker((SDataSinkHandle*)inserter);
|
terrno = code;
|
||||||
taosMemoryFree(inserter);
|
goto _return;
|
||||||
return code;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (pInserterNode->stableId != suid) {
|
if (pInserterNode->stableId != suid) {
|
||||||
destroyDataSinker((SDataSinkHandle*)inserter);
|
|
||||||
taosMemoryFree(inserter);
|
|
||||||
terrno = TSDB_CODE_TDB_INVALID_TABLE_ID;
|
terrno = TSDB_CODE_TDB_INVALID_TABLE_ID;
|
||||||
return terrno;
|
goto _return;
|
||||||
}
|
}
|
||||||
|
|
||||||
inserter->pDataBlocks = taosArrayInit(1, POINTER_BYTES);
|
inserter->pDataBlocks = taosArrayInit(1, POINTER_BYTES);
|
||||||
taosThreadMutexInit(&inserter->mutex, NULL);
|
taosThreadMutexInit(&inserter->mutex, NULL);
|
||||||
if (NULL == inserter->pDataBlocks) {
|
if (NULL == inserter->pDataBlocks) {
|
||||||
destroyDataSinker((SDataSinkHandle*)inserter);
|
|
||||||
taosMemoryFree(inserter);
|
|
||||||
terrno = TSDB_CODE_OUT_OF_MEMORY;
|
terrno = TSDB_CODE_OUT_OF_MEMORY;
|
||||||
return TSDB_CODE_OUT_OF_MEMORY;
|
return TSDB_CODE_OUT_OF_MEMORY;
|
||||||
}
|
}
|
||||||
|
@ -471,4 +468,15 @@ int32_t createDataInserter(SDataSinkManager* pManager, const SDataSinkNode* pDat
|
||||||
|
|
||||||
*pHandle = inserter;
|
*pHandle = inserter;
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
|
|
||||||
|
_return:
|
||||||
|
|
||||||
|
if (inserter) {
|
||||||
|
destroyDataSinker((SDataSinkHandle*)inserter);
|
||||||
|
taosMemoryFree(inserter);
|
||||||
|
} else {
|
||||||
|
taosMemoryFree(pManager);
|
||||||
|
}
|
||||||
|
|
||||||
|
return terrno;
|
||||||
}
|
}
|
||||||
|
|
|
@ -18,12 +18,17 @@
|
||||||
#include "planner.h"
|
#include "planner.h"
|
||||||
#include "tarray.h"
|
#include "tarray.h"
|
||||||
|
|
||||||
static SDataSinkManager gDataSinkManager = {0};
|
|
||||||
SDataSinkStat gDataSinkStat = {0};
|
SDataSinkStat gDataSinkStat = {0};
|
||||||
|
|
||||||
int32_t dsDataSinkMgtInit(SDataSinkMgtCfg* cfg, SStorageAPI* pAPI) {
|
int32_t dsDataSinkMgtInit(SDataSinkMgtCfg* cfg, SStorageAPI* pAPI, void** ppSinkManager) {
|
||||||
gDataSinkManager.cfg = *cfg;
|
SDataSinkManager* pSinkManager = taosMemoryMalloc(sizeof(SDataSinkManager));
|
||||||
gDataSinkManager.pAPI = pAPI;
|
if (NULL == pSinkManager) {
|
||||||
|
return TSDB_CODE_OUT_OF_MEMORY;
|
||||||
|
}
|
||||||
|
pSinkManager->cfg = *cfg;
|
||||||
|
pSinkManager->pAPI = pAPI;
|
||||||
|
|
||||||
|
*ppSinkManager = pSinkManager;
|
||||||
return 0; // to avoid compiler eror
|
return 0; // to avoid compiler eror
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -33,18 +38,22 @@ int32_t dsDataSinkGetCacheSize(SDataSinkStat* pStat) {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t dsCreateDataSinker(const SDataSinkNode* pDataSink, DataSinkHandle* pHandle, void* pParam, const char* id) {
|
int32_t dsCreateDataSinker(void* pSinkManager, const SDataSinkNode* pDataSink, DataSinkHandle* pHandle, void* pParam, const char* id) {
|
||||||
|
SDataSinkManager* pManager = pSinkManager;
|
||||||
switch ((int)nodeType(pDataSink)) {
|
switch ((int)nodeType(pDataSink)) {
|
||||||
case QUERY_NODE_PHYSICAL_PLAN_DISPATCH:
|
case QUERY_NODE_PHYSICAL_PLAN_DISPATCH:
|
||||||
return createDataDispatcher(&gDataSinkManager, pDataSink, pHandle);
|
return createDataDispatcher(pManager, pDataSink, pHandle);
|
||||||
case QUERY_NODE_PHYSICAL_PLAN_DELETE: {
|
case QUERY_NODE_PHYSICAL_PLAN_DELETE: {
|
||||||
return createDataDeleter(&gDataSinkManager, pDataSink, pHandle, pParam);
|
return createDataDeleter(pManager, pDataSink, pHandle, pParam);
|
||||||
}
|
}
|
||||||
case QUERY_NODE_PHYSICAL_PLAN_QUERY_INSERT: {
|
case QUERY_NODE_PHYSICAL_PLAN_QUERY_INSERT: {
|
||||||
return createDataInserter(&gDataSinkManager, pDataSink, pHandle, pParam);
|
return createDataInserter(pManager, pDataSink, pHandle, pParam);
|
||||||
}
|
}
|
||||||
|
default:
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
taosMemoryFree(pSinkManager);
|
||||||
qError("invalid input node type:%d, %s", nodeType(pDataSink), id);
|
qError("invalid input node type:%d, %s", nodeType(pDataSink), id);
|
||||||
return TSDB_CODE_QRY_INVALID_INPUT;
|
return TSDB_CODE_QRY_INVALID_INPUT;
|
||||||
}
|
}
|
||||||
|
|
|
@ -511,23 +511,25 @@ int32_t qCreateExecTask(SReadHandle* readHandle, int32_t vgId, uint64_t taskId,
|
||||||
goto _error;
|
goto _error;
|
||||||
}
|
}
|
||||||
|
|
||||||
SDataSinkMgtCfg cfg = {.maxDataBlockNum = 500, .maxDataBlockNumPerQuery = 50};
|
|
||||||
code = dsDataSinkMgtInit(&cfg, &(*pTask)->storageAPI);
|
|
||||||
if (code != TSDB_CODE_SUCCESS) {
|
|
||||||
qError("failed to dsDataSinkMgtInit, code:%s, %s", tstrerror(code), (*pTask)->id.str);
|
|
||||||
goto _error;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (handle) {
|
if (handle) {
|
||||||
|
SDataSinkMgtCfg cfg = {.maxDataBlockNum = 500, .maxDataBlockNumPerQuery = 50};
|
||||||
|
void* pSinkManager = NULL;
|
||||||
|
code = dsDataSinkMgtInit(&cfg, &(*pTask)->storageAPI, &pSinkManager);
|
||||||
|
if (code != TSDB_CODE_SUCCESS) {
|
||||||
|
qError("failed to dsDataSinkMgtInit, code:%s, %s", tstrerror(code), (*pTask)->id.str);
|
||||||
|
goto _error;
|
||||||
|
}
|
||||||
|
|
||||||
void* pSinkParam = NULL;
|
void* pSinkParam = NULL;
|
||||||
code = createDataSinkParam(pSubplan->pDataSink, &pSinkParam, (*pTask), readHandle);
|
code = createDataSinkParam(pSubplan->pDataSink, &pSinkParam, (*pTask), readHandle);
|
||||||
if (code != TSDB_CODE_SUCCESS) {
|
if (code != TSDB_CODE_SUCCESS) {
|
||||||
qError("failed to createDataSinkParam, vgId:%d, code:%s, %s", vgId, tstrerror(code), (*pTask)->id.str);
|
qError("failed to createDataSinkParam, vgId:%d, code:%s, %s", vgId, tstrerror(code), (*pTask)->id.str);
|
||||||
|
taosMemoryFree(pSinkManager);
|
||||||
goto _error;
|
goto _error;
|
||||||
}
|
}
|
||||||
|
|
||||||
// pSinkParam has been freed during create sinker.
|
// pSinkParam has been freed during create sinker.
|
||||||
code = dsCreateDataSinker(pSubplan->pDataSink, handle, pSinkParam, (*pTask)->id.str);
|
code = dsCreateDataSinker(pSinkManager, pSubplan->pDataSink, handle, pSinkParam, (*pTask)->id.str);
|
||||||
}
|
}
|
||||||
|
|
||||||
qDebug("subplan task create completed, TID:0x%" PRIx64 " QID:0x%" PRIx64, taskId, pSubplan->id.queryId);
|
qDebug("subplan task create completed, TID:0x%" PRIx64 " QID:0x%" PRIx64, taskId, pSubplan->id.queryId);
|
||||||
|
|
Loading…
Reference in New Issue