fix: sink function return code processing
This commit is contained in:
parent
ef96d37c1f
commit
14383a32a3
|
@ -53,7 +53,7 @@ typedef struct SDataDeleterHandle {
|
||||||
TdThreadMutex mutex;
|
TdThreadMutex mutex;
|
||||||
} SDataDeleterHandle;
|
} SDataDeleterHandle;
|
||||||
|
|
||||||
static void toDataCacheEntry(SDataDeleterHandle* pHandle, const SInputData* pInput, SDataDeleterBuf* pBuf) {
|
static int32_t toDataCacheEntry(SDataDeleterHandle* pHandle, const SInputData* pInput, SDataDeleterBuf* pBuf) {
|
||||||
int32_t numOfCols = LIST_LENGTH(pHandle->pSchema->pSlots);
|
int32_t numOfCols = LIST_LENGTH(pHandle->pSchema->pSlots);
|
||||||
|
|
||||||
SDataCacheEntry* pEntry = (SDataCacheEntry*)pBuf->pData;
|
SDataCacheEntry* pEntry = (SDataCacheEntry*)pBuf->pData;
|
||||||
|
@ -65,14 +65,23 @@ static void toDataCacheEntry(SDataDeleterHandle* pHandle, const SInputData* pInp
|
||||||
pBuf->useSize = sizeof(SDataCacheEntry);
|
pBuf->useSize = sizeof(SDataCacheEntry);
|
||||||
|
|
||||||
SColumnInfoData* pColRes = (SColumnInfoData*)taosArrayGet(pInput->pData->pDataBlock, 0);
|
SColumnInfoData* pColRes = (SColumnInfoData*)taosArrayGet(pInput->pData->pDataBlock, 0);
|
||||||
|
if (NULL == pColRes) {
|
||||||
|
QRY_ERR_RET(TSDB_CODE_QRY_EXECUTOR_INTERNAL_ERROR);
|
||||||
|
}
|
||||||
SColumnInfoData* pColSKey = (SColumnInfoData*)taosArrayGet(pInput->pData->pDataBlock, 1);
|
SColumnInfoData* pColSKey = (SColumnInfoData*)taosArrayGet(pInput->pData->pDataBlock, 1);
|
||||||
|
if (NULL == pColSKey) {
|
||||||
|
QRY_ERR_RET(TSDB_CODE_QRY_EXECUTOR_INTERNAL_ERROR);
|
||||||
|
}
|
||||||
SColumnInfoData* pColEKey = (SColumnInfoData*)taosArrayGet(pInput->pData->pDataBlock, 2);
|
SColumnInfoData* pColEKey = (SColumnInfoData*)taosArrayGet(pInput->pData->pDataBlock, 2);
|
||||||
|
if (NULL == pColEKey) {
|
||||||
|
QRY_ERR_RET(TSDB_CODE_QRY_EXECUTOR_INTERNAL_ERROR);
|
||||||
|
}
|
||||||
|
|
||||||
SDeleterRes* pRes = (SDeleterRes*)pEntry->data;
|
SDeleterRes* pRes = (SDeleterRes*)pEntry->data;
|
||||||
pRes->suid = pHandle->pParam->suid;
|
pRes->suid = pHandle->pParam->suid;
|
||||||
pRes->uidList = pHandle->pParam->pUidList;
|
pRes->uidList = pHandle->pParam->pUidList;
|
||||||
strcpy(pRes->tableName, pHandle->pDeleter->tableFName);
|
TAOS_STRCPY(pRes->tableName, pHandle->pDeleter->tableFName);
|
||||||
strcpy(pRes->tsColName, pHandle->pDeleter->tsColName);
|
TAOS_STRCPY(pRes->tsColName, pHandle->pDeleter->tsColName);
|
||||||
pRes->affectedRows = *(int64_t*)pColRes->pData;
|
pRes->affectedRows = *(int64_t*)pColRes->pData;
|
||||||
|
|
||||||
if (pRes->affectedRows) {
|
if (pRes->affectedRows) {
|
||||||
|
@ -88,16 +97,18 @@ static void toDataCacheEntry(SDataDeleterHandle* pHandle, const SInputData* pInp
|
||||||
|
|
||||||
pBuf->useSize += pEntry->dataLen;
|
pBuf->useSize += pEntry->dataLen;
|
||||||
|
|
||||||
atomic_add_fetch_64(&pHandle->cachedSize, pEntry->dataLen);
|
(void)atomic_add_fetch_64(&pHandle->cachedSize, pEntry->dataLen);
|
||||||
atomic_add_fetch_64(&gDataSinkStat.cachedSize, pEntry->dataLen);
|
(void)atomic_add_fetch_64(&gDataSinkStat.cachedSize, pEntry->dataLen);
|
||||||
|
|
||||||
|
return TSDB_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool allocBuf(SDataDeleterHandle* pDeleter, const SInputData* pInput, SDataDeleterBuf* pBuf) {
|
static int32_t allocBuf(SDataDeleterHandle* pDeleter, const SInputData* pInput, SDataDeleterBuf* pBuf) {
|
||||||
uint32_t capacity = pDeleter->pManager->cfg.maxDataBlockNumPerQuery;
|
uint32_t capacity = pDeleter->pManager->cfg.maxDataBlockNumPerQuery;
|
||||||
if (taosQueueItemSize(pDeleter->pDataBlocks) > capacity) {
|
if (taosQueueItemSize(pDeleter->pDataBlocks) > capacity) {
|
||||||
qError("SinkNode queue is full, no capacity, max:%d, current:%d, no capacity", capacity,
|
qError("SinkNode queue is full, no capacity, max:%d, current:%d, no capacity", capacity,
|
||||||
taosQueueItemSize(pDeleter->pDataBlocks));
|
taosQueueItemSize(pDeleter->pDataBlocks));
|
||||||
return false;
|
return TSDB_CODE_OUT_OF_MEMORY;
|
||||||
}
|
}
|
||||||
|
|
||||||
pBuf->allocSize = sizeof(SDataCacheEntry) + sizeof(SDeleterRes);
|
pBuf->allocSize = sizeof(SDataCacheEntry) + sizeof(SDeleterRes);
|
||||||
|
@ -105,55 +116,66 @@ static bool allocBuf(SDataDeleterHandle* pDeleter, const SInputData* pInput, SDa
|
||||||
pBuf->pData = taosMemoryMalloc(pBuf->allocSize);
|
pBuf->pData = taosMemoryMalloc(pBuf->allocSize);
|
||||||
if (pBuf->pData == NULL) {
|
if (pBuf->pData == NULL) {
|
||||||
qError("SinkNode failed to malloc memory, size:%d, code:%d", pBuf->allocSize, TAOS_SYSTEM_ERROR(errno));
|
qError("SinkNode failed to malloc memory, size:%d, code:%d", pBuf->allocSize, TAOS_SYSTEM_ERROR(errno));
|
||||||
|
return terrno;
|
||||||
}
|
}
|
||||||
|
|
||||||
return NULL != pBuf->pData;
|
return TSDB_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int32_t updateStatus(SDataDeleterHandle* pDeleter) {
|
static int32_t updateStatus(SDataDeleterHandle* pDeleter) {
|
||||||
taosThreadMutexLock(&pDeleter->mutex);
|
(void)taosThreadMutexLock(&pDeleter->mutex);
|
||||||
int32_t blockNums = taosQueueItemSize(pDeleter->pDataBlocks);
|
int32_t blockNums = taosQueueItemSize(pDeleter->pDataBlocks);
|
||||||
int32_t status =
|
int32_t status =
|
||||||
(0 == blockNums ? DS_BUF_EMPTY
|
(0 == blockNums ? DS_BUF_EMPTY
|
||||||
: (blockNums < pDeleter->pManager->cfg.maxDataBlockNumPerQuery ? DS_BUF_LOW : DS_BUF_FULL));
|
: (blockNums < pDeleter->pManager->cfg.maxDataBlockNumPerQuery ? DS_BUF_LOW : DS_BUF_FULL));
|
||||||
pDeleter->status = status;
|
pDeleter->status = status;
|
||||||
taosThreadMutexUnlock(&pDeleter->mutex);
|
(void)taosThreadMutexUnlock(&pDeleter->mutex);
|
||||||
|
|
||||||
return status;
|
return status;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int32_t getStatus(SDataDeleterHandle* pDeleter) {
|
static int32_t getStatus(SDataDeleterHandle* pDeleter) {
|
||||||
taosThreadMutexLock(&pDeleter->mutex);
|
(void)taosThreadMutexLock(&pDeleter->mutex);
|
||||||
int32_t status = pDeleter->status;
|
int32_t status = pDeleter->status;
|
||||||
taosThreadMutexUnlock(&pDeleter->mutex);
|
(void)taosThreadMutexUnlock(&pDeleter->mutex);
|
||||||
|
|
||||||
return status;
|
return status;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int32_t putDataBlock(SDataSinkHandle* pHandle, const SInputData* pInput, bool* pContinue) {
|
static int32_t putDataBlock(SDataSinkHandle* pHandle, const SInputData* pInput, bool* pContinue) {
|
||||||
SDataDeleterHandle* pDeleter = (SDataDeleterHandle*)pHandle;
|
SDataDeleterHandle* pDeleter = (SDataDeleterHandle*)pHandle;
|
||||||
SDataDeleterBuf* pBuf;
|
SDataDeleterBuf* pBuf = NULL;
|
||||||
|
|
||||||
int32_t code = taosAllocateQitem(sizeof(SDataDeleterBuf), DEF_QITEM, 0, (void**)&pBuf);
|
int32_t code = taosAllocateQitem(sizeof(SDataDeleterBuf), DEF_QITEM, 0, (void**)&pBuf);
|
||||||
if (code) {
|
if (code) {
|
||||||
return code;
|
return code;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!allocBuf(pDeleter, pInput, pBuf)) {
|
code = allocBuf(pDeleter, pInput, pBuf);
|
||||||
|
if (code) {
|
||||||
taosFreeQitem(pBuf);
|
taosFreeQitem(pBuf);
|
||||||
return TSDB_CODE_OUT_OF_MEMORY;
|
return code;
|
||||||
}
|
}
|
||||||
|
|
||||||
toDataCacheEntry(pDeleter, pInput, pBuf);
|
QRY_ERR_JRET(toDataCacheEntry(pDeleter, pInput, pBuf));
|
||||||
taosWriteQitem(pDeleter->pDataBlocks, pBuf);
|
QRY_ERR_JRET(taosWriteQitem(pDeleter->pDataBlocks, pBuf));
|
||||||
*pContinue = (DS_BUF_LOW == updateStatus(pDeleter) ? true : false);
|
*pContinue = (DS_BUF_LOW == updateStatus(pDeleter) ? true : false);
|
||||||
|
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
|
|
||||||
|
_return:
|
||||||
|
|
||||||
|
taosFreeQitem(pBuf);
|
||||||
|
|
||||||
|
return code;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void endPut(struct SDataSinkHandle* pHandle, uint64_t useconds) {
|
static void endPut(struct SDataSinkHandle* pHandle, uint64_t useconds) {
|
||||||
SDataDeleterHandle* pDeleter = (SDataDeleterHandle*)pHandle;
|
SDataDeleterHandle* pDeleter = (SDataDeleterHandle*)pHandle;
|
||||||
taosThreadMutexLock(&pDeleter->mutex);
|
(void)taosThreadMutexLock(&pDeleter->mutex);
|
||||||
pDeleter->queryEnd = true;
|
pDeleter->queryEnd = true;
|
||||||
pDeleter->useconds = useconds;
|
pDeleter->useconds = useconds;
|
||||||
taosThreadMutexUnlock(&pDeleter->mutex);
|
(void)taosThreadMutexUnlock(&pDeleter->mutex);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void getDataLength(SDataSinkHandle* pHandle, int64_t* pLen, int64_t* pRawLen, bool* pQueryEnd) {
|
static void getDataLength(SDataSinkHandle* pHandle, int64_t* pLen, int64_t* pRawLen, bool* pQueryEnd) {
|
||||||
|
@ -165,9 +187,9 @@ static void getDataLength(SDataSinkHandle* pHandle, int64_t* pLen, int64_t* pRaw
|
||||||
}
|
}
|
||||||
|
|
||||||
SDataDeleterBuf* pBuf = NULL;
|
SDataDeleterBuf* pBuf = NULL;
|
||||||
taosReadQitem(pDeleter->pDataBlocks, (void**)&pBuf);
|
(void)taosReadQitem(pDeleter->pDataBlocks, (void**)&pBuf);
|
||||||
if (pBuf != NULL) {
|
if (pBuf != NULL) {
|
||||||
memcpy(&pDeleter->nextOutput, pBuf, sizeof(SDataDeleterBuf));
|
TAOS_MEMCPY(&pDeleter->nextOutput, pBuf, sizeof(SDataDeleterBuf));
|
||||||
taosFreeQitem(pBuf);
|
taosFreeQitem(pBuf);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -192,35 +214,35 @@ static int32_t getDataBlock(SDataSinkHandle* pHandle, SOutputData* pOutput) {
|
||||||
}
|
}
|
||||||
|
|
||||||
SDataCacheEntry* pEntry = (SDataCacheEntry*)(pDeleter->nextOutput.pData);
|
SDataCacheEntry* pEntry = (SDataCacheEntry*)(pDeleter->nextOutput.pData);
|
||||||
memcpy(pOutput->pData, pEntry->data, pEntry->dataLen);
|
TAOS_MEMCPY(pOutput->pData, pEntry->data, pEntry->dataLen);
|
||||||
pDeleter->pParam->pUidList = NULL;
|
pDeleter->pParam->pUidList = NULL;
|
||||||
pOutput->numOfRows = pEntry->numOfRows;
|
pOutput->numOfRows = pEntry->numOfRows;
|
||||||
pOutput->numOfCols = pEntry->numOfCols;
|
pOutput->numOfCols = pEntry->numOfCols;
|
||||||
pOutput->compressed = pEntry->compressed;
|
pOutput->compressed = pEntry->compressed;
|
||||||
|
|
||||||
atomic_sub_fetch_64(&pDeleter->cachedSize, pEntry->dataLen);
|
(void)atomic_sub_fetch_64(&pDeleter->cachedSize, pEntry->dataLen);
|
||||||
atomic_sub_fetch_64(&gDataSinkStat.cachedSize, pEntry->dataLen);
|
(void)atomic_sub_fetch_64(&gDataSinkStat.cachedSize, pEntry->dataLen);
|
||||||
|
|
||||||
taosMemoryFreeClear(pDeleter->nextOutput.pData); // todo persistent
|
taosMemoryFreeClear(pDeleter->nextOutput.pData); // todo persistent
|
||||||
pOutput->bufStatus = updateStatus(pDeleter);
|
pOutput->bufStatus = updateStatus(pDeleter);
|
||||||
taosThreadMutexLock(&pDeleter->mutex);
|
(void)taosThreadMutexLock(&pDeleter->mutex);
|
||||||
pOutput->queryEnd = pDeleter->queryEnd;
|
pOutput->queryEnd = pDeleter->queryEnd;
|
||||||
pOutput->useconds = pDeleter->useconds;
|
pOutput->useconds = pDeleter->useconds;
|
||||||
pOutput->precision = pDeleter->pSchema->precision;
|
pOutput->precision = pDeleter->pSchema->precision;
|
||||||
taosThreadMutexUnlock(&pDeleter->mutex);
|
(void)taosThreadMutexUnlock(&pDeleter->mutex);
|
||||||
|
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int32_t destroyDataSinker(SDataSinkHandle* pHandle) {
|
static int32_t destroyDataSinker(SDataSinkHandle* pHandle) {
|
||||||
SDataDeleterHandle* pDeleter = (SDataDeleterHandle*)pHandle;
|
SDataDeleterHandle* pDeleter = (SDataDeleterHandle*)pHandle;
|
||||||
atomic_sub_fetch_64(&gDataSinkStat.cachedSize, pDeleter->cachedSize);
|
(void)atomic_sub_fetch_64(&gDataSinkStat.cachedSize, pDeleter->cachedSize);
|
||||||
taosMemoryFreeClear(pDeleter->nextOutput.pData);
|
taosMemoryFreeClear(pDeleter->nextOutput.pData);
|
||||||
taosArrayDestroy(pDeleter->pParam->pUidList);
|
taosArrayDestroy(pDeleter->pParam->pUidList);
|
||||||
taosMemoryFree(pDeleter->pParam);
|
taosMemoryFree(pDeleter->pParam);
|
||||||
while (!taosQueueEmpty(pDeleter->pDataBlocks)) {
|
while (!taosQueueEmpty(pDeleter->pDataBlocks)) {
|
||||||
SDataDeleterBuf* pBuf = NULL;
|
SDataDeleterBuf* pBuf = NULL;
|
||||||
taosReadQitem(pDeleter->pDataBlocks, (void**)&pBuf);
|
(void)taosReadQitem(pDeleter->pDataBlocks, (void**)&pBuf);
|
||||||
|
|
||||||
if (pBuf != NULL) {
|
if (pBuf != NULL) {
|
||||||
taosMemoryFreeClear(pBuf->pData);
|
taosMemoryFreeClear(pBuf->pData);
|
||||||
|
@ -228,9 +250,10 @@ static int32_t destroyDataSinker(SDataSinkHandle* pHandle) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
taosCloseQueue(pDeleter->pDataBlocks);
|
taosCloseQueue(pDeleter->pDataBlocks);
|
||||||
taosThreadMutexDestroy(&pDeleter->mutex);
|
(void)taosThreadMutexDestroy(&pDeleter->mutex);
|
||||||
|
|
||||||
taosMemoryFree(pDeleter->pManager);
|
taosMemoryFree(pDeleter->pManager);
|
||||||
|
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -247,8 +270,8 @@ int32_t createDataDeleter(SDataSinkManager* pManager, const SDataSinkNode* pData
|
||||||
|
|
||||||
SDataDeleterHandle* deleter = taosMemoryCalloc(1, sizeof(SDataDeleterHandle));
|
SDataDeleterHandle* deleter = taosMemoryCalloc(1, sizeof(SDataDeleterHandle));
|
||||||
if (NULL == deleter) {
|
if (NULL == deleter) {
|
||||||
|
code = terrno;
|
||||||
taosMemoryFree(pParam);
|
taosMemoryFree(pParam);
|
||||||
code = TSDB_CODE_OUT_OF_MEMORY;
|
|
||||||
goto _end;
|
goto _end;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -276,17 +299,22 @@ int32_t createDataDeleter(SDataSinkManager* pManager, const SDataSinkNode* pData
|
||||||
if (code) {
|
if (code) {
|
||||||
goto _end;
|
goto _end;
|
||||||
}
|
}
|
||||||
taosThreadMutexInit(&deleter->mutex, NULL);
|
code = taosThreadMutexInit(&deleter->mutex, NULL);
|
||||||
|
if (code) {
|
||||||
|
goto _end;
|
||||||
|
}
|
||||||
|
|
||||||
*pHandle = deleter;
|
*pHandle = deleter;
|
||||||
return code;
|
return code;
|
||||||
|
|
||||||
_end:
|
_end:
|
||||||
|
|
||||||
if (deleter != NULL) {
|
if (deleter != NULL) {
|
||||||
destroyDataSinker((SDataSinkHandle*)deleter);
|
(void)destroyDataSinker((SDataSinkHandle*)deleter);
|
||||||
taosMemoryFree(deleter);
|
taosMemoryFree(deleter);
|
||||||
} else {
|
} else {
|
||||||
taosMemoryFree(pManager);
|
taosMemoryFree(pManager);
|
||||||
}
|
}
|
||||||
|
|
||||||
return code;
|
return code;
|
||||||
}
|
}
|
||||||
|
|
|
@ -63,7 +63,7 @@ typedef struct SDataDispatchHandle {
|
||||||
// The length of bitmap is decided by number of rows of this data block, and the length of each column data is
|
// The length of bitmap is decided by number of rows of this data block, and the length of each column data is
|
||||||
// recorded in the first segment, next to the struct header
|
// recorded in the first segment, next to the struct header
|
||||||
// clang-format on
|
// clang-format on
|
||||||
static void toDataCacheEntry(SDataDispatchHandle* pHandle, const SInputData* pInput, SDataDispatchBuf* pBuf) {
|
static int32_t toDataCacheEntry(SDataDispatchHandle* pHandle, const SInputData* pInput, SDataDispatchBuf* pBuf) {
|
||||||
int32_t numOfCols = 0;
|
int32_t numOfCols = 0;
|
||||||
SNode* pNode;
|
SNode* pNode;
|
||||||
|
|
||||||
|
@ -88,6 +88,9 @@ static void toDataCacheEntry(SDataDispatchHandle* pHandle, const SInputData* pIn
|
||||||
if (pHandle->pCompressBuf == NULL) {
|
if (pHandle->pCompressBuf == NULL) {
|
||||||
// allocate additional 8 bytes to avoid invalid write if compress failed to reduce the size
|
// allocate additional 8 bytes to avoid invalid write if compress failed to reduce the size
|
||||||
pHandle->pCompressBuf = taosMemoryMalloc(pBuf->allocSize + 8);
|
pHandle->pCompressBuf = taosMemoryMalloc(pBuf->allocSize + 8);
|
||||||
|
if (NULL == pHandle->pCompressBuf) {
|
||||||
|
QRY_RET(terrno);
|
||||||
|
}
|
||||||
pHandle->bufSize = pBuf->allocSize + 8;
|
pHandle->bufSize = pBuf->allocSize + 8;
|
||||||
} else {
|
} else {
|
||||||
if (pHandle->bufSize < pBuf->allocSize + 8) {
|
if (pHandle->bufSize < pBuf->allocSize + 8) {
|
||||||
|
@ -96,9 +99,8 @@ static void toDataCacheEntry(SDataDispatchHandle* pHandle, const SInputData* pIn
|
||||||
if (p != NULL) {
|
if (p != NULL) {
|
||||||
pHandle->pCompressBuf = p;
|
pHandle->pCompressBuf = p;
|
||||||
} else {
|
} else {
|
||||||
terrno = TSDB_CODE_OUT_OF_MEMORY;
|
qError("failed to prepare compress buf:%d, code: %x", pHandle->bufSize, terrno);
|
||||||
qError("failed to prepare compress buf:%d, code: out of memory", pHandle->bufSize);
|
return terrno;
|
||||||
return;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -114,7 +116,7 @@ static void toDataCacheEntry(SDataDispatchHandle* pHandle, const SInputData* pIn
|
||||||
pEntry->compressed = 0;
|
pEntry->compressed = 0;
|
||||||
pEntry->dataLen = dataLen;
|
pEntry->dataLen = dataLen;
|
||||||
pEntry->rawLen = dataLen;
|
pEntry->rawLen = dataLen;
|
||||||
memcpy(pEntry->data, pHandle->pCompressBuf, dataLen);
|
TAOS_MEMCPY(pEntry->data, pHandle->pCompressBuf, dataLen);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
pEntry->dataLen = blockEncode(pInput->pData, pEntry->data, numOfCols);
|
pEntry->dataLen = blockEncode(pInput->pData, pEntry->data, numOfCols);
|
||||||
|
@ -124,11 +126,13 @@ static void toDataCacheEntry(SDataDispatchHandle* pHandle, const SInputData* pIn
|
||||||
|
|
||||||
pBuf->useSize += pEntry->dataLen;
|
pBuf->useSize += pEntry->dataLen;
|
||||||
|
|
||||||
atomic_add_fetch_64(&pHandle->cachedSize, pEntry->dataLen);
|
(void)atomic_add_fetch_64(&pHandle->cachedSize, pEntry->dataLen);
|
||||||
atomic_add_fetch_64(&gDataSinkStat.cachedSize, pEntry->dataLen);
|
(void)atomic_add_fetch_64(&gDataSinkStat.cachedSize, pEntry->dataLen);
|
||||||
|
|
||||||
|
return TSDB_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool allocBuf(SDataDispatchHandle* pDispatcher, const SInputData* pInput, SDataDispatchBuf* pBuf) {
|
static int32_t allocBuf(SDataDispatchHandle* pDispatcher, const SInputData* pInput, SDataDispatchBuf* pBuf) {
|
||||||
/*
|
/*
|
||||||
uint32_t capacity = pDispatcher->pManager->cfg.maxDataBlockNumPerQuery;
|
uint32_t capacity = pDispatcher->pManager->cfg.maxDataBlockNumPerQuery;
|
||||||
if (taosQueueItemSize(pDispatcher->pDataBlocks) > capacity) {
|
if (taosQueueItemSize(pDispatcher->pDataBlocks) > capacity) {
|
||||||
|
@ -142,69 +146,73 @@ static bool allocBuf(SDataDispatchHandle* pDispatcher, const SInputData* pInput,
|
||||||
|
|
||||||
pBuf->pData = taosMemoryMalloc(pBuf->allocSize);
|
pBuf->pData = taosMemoryMalloc(pBuf->allocSize);
|
||||||
if (pBuf->pData == NULL) {
|
if (pBuf->pData == NULL) {
|
||||||
qError("SinkNode failed to malloc memory, size:%d, code:%d", pBuf->allocSize, TAOS_SYSTEM_ERROR(errno));
|
qError("SinkNode failed to malloc memory, size:%d, code:%x", pBuf->allocSize, terrno);
|
||||||
|
return terrno;
|
||||||
}
|
}
|
||||||
|
|
||||||
return NULL != pBuf->pData;
|
return TSDB_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int32_t updateStatus(SDataDispatchHandle* pDispatcher) {
|
static int32_t updateStatus(SDataDispatchHandle* pDispatcher) {
|
||||||
taosThreadMutexLock(&pDispatcher->mutex);
|
(void)taosThreadMutexLock(&pDispatcher->mutex);
|
||||||
int32_t blockNums = taosQueueItemSize(pDispatcher->pDataBlocks);
|
int32_t blockNums = taosQueueItemSize(pDispatcher->pDataBlocks);
|
||||||
int32_t status =
|
int32_t status =
|
||||||
(0 == blockNums ? DS_BUF_EMPTY
|
(0 == blockNums ? DS_BUF_EMPTY
|
||||||
: (blockNums < pDispatcher->pManager->cfg.maxDataBlockNumPerQuery ? DS_BUF_LOW : DS_BUF_FULL));
|
: (blockNums < pDispatcher->pManager->cfg.maxDataBlockNumPerQuery ? DS_BUF_LOW : DS_BUF_FULL));
|
||||||
pDispatcher->status = status;
|
pDispatcher->status = status;
|
||||||
taosThreadMutexUnlock(&pDispatcher->mutex);
|
(void)taosThreadMutexUnlock(&pDispatcher->mutex);
|
||||||
return status;
|
return status;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int32_t getStatus(SDataDispatchHandle* pDispatcher) {
|
static int32_t getStatus(SDataDispatchHandle* pDispatcher) {
|
||||||
taosThreadMutexLock(&pDispatcher->mutex);
|
(void)taosThreadMutexLock(&pDispatcher->mutex);
|
||||||
int32_t status = pDispatcher->status;
|
int32_t status = pDispatcher->status;
|
||||||
taosThreadMutexUnlock(&pDispatcher->mutex);
|
(void)taosThreadMutexUnlock(&pDispatcher->mutex);
|
||||||
return status;
|
return status;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int32_t putDataBlock(SDataSinkHandle* pHandle, const SInputData* pInput, bool* pContinue) {
|
static int32_t putDataBlock(SDataSinkHandle* pHandle, const SInputData* pInput, bool* pContinue) {
|
||||||
int32_t code = 0;
|
int32_t code = 0;
|
||||||
SDataDispatchHandle* pDispatcher = (SDataDispatchHandle*)pHandle;
|
SDataDispatchHandle* pDispatcher = (SDataDispatchHandle*)pHandle;
|
||||||
SDataDispatchBuf* pBuf;
|
SDataDispatchBuf* pBuf = NULL;
|
||||||
|
|
||||||
code = taosAllocateQitem(sizeof(SDataDispatchBuf), DEF_QITEM, 0, (void**)&pBuf);
|
code = taosAllocateQitem(sizeof(SDataDispatchBuf), DEF_QITEM, 0, (void**)&pBuf);
|
||||||
if (code) {
|
if (code) {
|
||||||
return code;
|
return code;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!allocBuf(pDispatcher, pInput, pBuf)) {
|
code = allocBuf(pDispatcher, pInput, pBuf);
|
||||||
|
if (code) {
|
||||||
taosFreeQitem(pBuf);
|
taosFreeQitem(pBuf);
|
||||||
return TSDB_CODE_OUT_OF_MEMORY;
|
|
||||||
}
|
|
||||||
|
|
||||||
toDataCacheEntry(pDispatcher, pInput, pBuf);
|
|
||||||
code = taosWriteQitem(pDispatcher->pDataBlocks, pBuf);
|
|
||||||
if (code != 0) {
|
|
||||||
return code;
|
return code;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
QRY_ERR_JRET(toDataCacheEntry(pDispatcher, pInput, pBuf));
|
||||||
|
QRY_ERR_JRET(taosWriteQitem(pDispatcher->pDataBlocks, pBuf));
|
||||||
|
|
||||||
int32_t status = updateStatus(pDispatcher);
|
int32_t status = updateStatus(pDispatcher);
|
||||||
*pContinue = (status == DS_BUF_LOW || status == DS_BUF_EMPTY);
|
*pContinue = (status == DS_BUF_LOW || status == DS_BUF_EMPTY);
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
|
|
||||||
|
_return:
|
||||||
|
|
||||||
|
taosFreeQitem(pBuf);
|
||||||
|
return code;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void endPut(struct SDataSinkHandle* pHandle, uint64_t useconds) {
|
static void endPut(struct SDataSinkHandle* pHandle, uint64_t useconds) {
|
||||||
SDataDispatchHandle* pDispatcher = (SDataDispatchHandle*)pHandle;
|
SDataDispatchHandle* pDispatcher = (SDataDispatchHandle*)pHandle;
|
||||||
taosThreadMutexLock(&pDispatcher->mutex);
|
(void)taosThreadMutexLock(&pDispatcher->mutex);
|
||||||
pDispatcher->queryEnd = true;
|
pDispatcher->queryEnd = true;
|
||||||
pDispatcher->useconds = useconds;
|
pDispatcher->useconds = useconds;
|
||||||
taosThreadMutexUnlock(&pDispatcher->mutex);
|
(void)taosThreadMutexUnlock(&pDispatcher->mutex);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void resetDispatcher(struct SDataSinkHandle* pHandle) {
|
static void resetDispatcher(struct SDataSinkHandle* pHandle) {
|
||||||
SDataDispatchHandle* pDispatcher = (SDataDispatchHandle*)pHandle;
|
SDataDispatchHandle* pDispatcher = (SDataDispatchHandle*)pHandle;
|
||||||
taosThreadMutexLock(&pDispatcher->mutex);
|
(void)taosThreadMutexLock(&pDispatcher->mutex);
|
||||||
pDispatcher->queryEnd = false;
|
pDispatcher->queryEnd = false;
|
||||||
taosThreadMutexUnlock(&pDispatcher->mutex);
|
(void)taosThreadMutexUnlock(&pDispatcher->mutex);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void getDataLength(SDataSinkHandle* pHandle, int64_t* pLen, int64_t* pRowLen, bool* pQueryEnd) {
|
static void getDataLength(SDataSinkHandle* pHandle, int64_t* pLen, int64_t* pRowLen, bool* pQueryEnd) {
|
||||||
|
@ -216,9 +224,9 @@ static void getDataLength(SDataSinkHandle* pHandle, int64_t* pLen, int64_t* pRow
|
||||||
}
|
}
|
||||||
|
|
||||||
SDataDispatchBuf* pBuf = NULL;
|
SDataDispatchBuf* pBuf = NULL;
|
||||||
taosReadQitem(pDispatcher->pDataBlocks, (void**)&pBuf);
|
(void)taosReadQitem(pDispatcher->pDataBlocks, (void**)&pBuf);
|
||||||
if (pBuf != NULL) {
|
if (pBuf != NULL) {
|
||||||
memcpy(&pDispatcher->nextOutput, pBuf, sizeof(SDataDispatchBuf));
|
TAOS_MEMCPY(&pDispatcher->nextOutput, pBuf, sizeof(SDataDispatchBuf));
|
||||||
taosFreeQitem(pBuf);
|
taosFreeQitem(pBuf);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -243,33 +251,34 @@ static int32_t getDataBlock(SDataSinkHandle* pHandle, SOutputData* pOutput) {
|
||||||
}
|
}
|
||||||
|
|
||||||
SDataCacheEntry* pEntry = (SDataCacheEntry*)(pDispatcher->nextOutput.pData);
|
SDataCacheEntry* pEntry = (SDataCacheEntry*)(pDispatcher->nextOutput.pData);
|
||||||
memcpy(pOutput->pData, pEntry->data, pEntry->dataLen);
|
TAOS_MEMCPY(pOutput->pData, pEntry->data, pEntry->dataLen);
|
||||||
pOutput->numOfRows = pEntry->numOfRows;
|
pOutput->numOfRows = pEntry->numOfRows;
|
||||||
pOutput->numOfCols = pEntry->numOfCols;
|
pOutput->numOfCols = pEntry->numOfCols;
|
||||||
pOutput->compressed = pEntry->compressed;
|
pOutput->compressed = pEntry->compressed;
|
||||||
|
|
||||||
atomic_sub_fetch_64(&pDispatcher->cachedSize, pEntry->dataLen);
|
(void)atomic_sub_fetch_64(&pDispatcher->cachedSize, pEntry->dataLen);
|
||||||
atomic_sub_fetch_64(&gDataSinkStat.cachedSize, pEntry->dataLen);
|
(void)atomic_sub_fetch_64(&gDataSinkStat.cachedSize, pEntry->dataLen);
|
||||||
|
|
||||||
taosMemoryFreeClear(pDispatcher->nextOutput.pData); // todo persistent
|
taosMemoryFreeClear(pDispatcher->nextOutput.pData); // todo persistent
|
||||||
pOutput->bufStatus = updateStatus(pDispatcher);
|
pOutput->bufStatus = updateStatus(pDispatcher);
|
||||||
taosThreadMutexLock(&pDispatcher->mutex);
|
|
||||||
|
(void)taosThreadMutexLock(&pDispatcher->mutex);
|
||||||
pOutput->queryEnd = pDispatcher->queryEnd;
|
pOutput->queryEnd = pDispatcher->queryEnd;
|
||||||
pOutput->useconds = pDispatcher->useconds;
|
pOutput->useconds = pDispatcher->useconds;
|
||||||
pOutput->precision = pDispatcher->pSchema->precision;
|
pOutput->precision = pDispatcher->pSchema->precision;
|
||||||
taosThreadMutexUnlock(&pDispatcher->mutex);
|
(void)taosThreadMutexUnlock(&pDispatcher->mutex);
|
||||||
|
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int32_t destroyDataSinker(SDataSinkHandle* pHandle) {
|
static int32_t destroyDataSinker(SDataSinkHandle* pHandle) {
|
||||||
SDataDispatchHandle* pDispatcher = (SDataDispatchHandle*)pHandle;
|
SDataDispatchHandle* pDispatcher = (SDataDispatchHandle*)pHandle;
|
||||||
atomic_sub_fetch_64(&gDataSinkStat.cachedSize, pDispatcher->cachedSize);
|
(void)atomic_sub_fetch_64(&gDataSinkStat.cachedSize, pDispatcher->cachedSize);
|
||||||
taosMemoryFreeClear(pDispatcher->nextOutput.pData);
|
taosMemoryFreeClear(pDispatcher->nextOutput.pData);
|
||||||
|
|
||||||
while (!taosQueueEmpty(pDispatcher->pDataBlocks)) {
|
while (!taosQueueEmpty(pDispatcher->pDataBlocks)) {
|
||||||
SDataDispatchBuf* pBuf = NULL;
|
SDataDispatchBuf* pBuf = NULL;
|
||||||
taosReadQitem(pDispatcher->pDataBlocks, (void**)&pBuf);
|
(void)taosReadQitem(pDispatcher->pDataBlocks, (void**)&pBuf);
|
||||||
if (pBuf != NULL) {
|
if (pBuf != NULL) {
|
||||||
taosMemoryFreeClear(pBuf->pData);
|
taosMemoryFreeClear(pBuf->pData);
|
||||||
taosFreeQitem(pBuf);
|
taosFreeQitem(pBuf);
|
||||||
|
@ -280,7 +289,7 @@ static int32_t destroyDataSinker(SDataSinkHandle* pHandle) {
|
||||||
taosMemoryFreeClear(pDispatcher->pCompressBuf);
|
taosMemoryFreeClear(pDispatcher->pCompressBuf);
|
||||||
pDispatcher->bufSize = 0;
|
pDispatcher->bufSize = 0;
|
||||||
|
|
||||||
taosThreadMutexDestroy(&pDispatcher->mutex);
|
(void)taosThreadMutexDestroy(&pDispatcher->mutex);
|
||||||
taosMemoryFree(pDispatcher->pManager);
|
taosMemoryFree(pDispatcher->pManager);
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
|
@ -297,7 +306,6 @@ 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;
|
|
||||||
goto _return;
|
goto _return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -318,7 +326,11 @@ int32_t createDataDispatcher(SDataSinkManager* pManager, const SDataSinkNode* pD
|
||||||
terrno = code;
|
terrno = code;
|
||||||
goto _return;
|
goto _return;
|
||||||
}
|
}
|
||||||
taosThreadMutexInit(&dispatcher->mutex, NULL);
|
code = taosThreadMutexInit(&dispatcher->mutex, NULL);
|
||||||
|
if (code) {
|
||||||
|
terrno = code;
|
||||||
|
goto _return;
|
||||||
|
}
|
||||||
|
|
||||||
if (NULL == dispatcher->pDataBlocks) {
|
if (NULL == dispatcher->pDataBlocks) {
|
||||||
taosMemoryFree(dispatcher);
|
taosMemoryFree(dispatcher);
|
||||||
|
@ -330,6 +342,7 @@ int32_t createDataDispatcher(SDataSinkManager* pManager, const SDataSinkNode* pD
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
|
|
||||||
_return:
|
_return:
|
||||||
|
|
||||||
taosMemoryFree(pManager);
|
taosMemoryFree(pManager);
|
||||||
return terrno;
|
return terrno;
|
||||||
}
|
}
|
||||||
|
|
|
@ -58,10 +58,17 @@ int32_t inserterCallback(void* param, SDataBuf* pMsg, int32_t code) {
|
||||||
SSubmitRspParam* pParam = (SSubmitRspParam*)param;
|
SSubmitRspParam* pParam = (SSubmitRspParam*)param;
|
||||||
SDataInserterHandle* pInserter = pParam->pInserter;
|
SDataInserterHandle* pInserter = pParam->pInserter;
|
||||||
|
|
||||||
|
if (code) {
|
||||||
pInserter->submitRes.code = code;
|
pInserter->submitRes.code = code;
|
||||||
|
}
|
||||||
|
|
||||||
if (code == TSDB_CODE_SUCCESS) {
|
if (code == TSDB_CODE_SUCCESS) {
|
||||||
pInserter->submitRes.pRsp = taosMemoryCalloc(1, sizeof(SSubmitRsp2));
|
pInserter->submitRes.pRsp = taosMemoryCalloc(1, sizeof(SSubmitRsp2));
|
||||||
|
if (NULL == pInserter->submitRes.pRsp) {
|
||||||
|
pInserter->submitRes.code = terrno;
|
||||||
|
goto _return;
|
||||||
|
}
|
||||||
|
|
||||||
SDecoder coder = {0};
|
SDecoder coder = {0};
|
||||||
tDecoderInit(&coder, pMsg->pData, pMsg->len);
|
tDecoderInit(&coder, pMsg->pData, pMsg->len);
|
||||||
code = tDecodeSSubmitRsp2(&coder, pInserter->submitRes.pRsp);
|
code = tDecodeSSubmitRsp2(&coder, pInserter->submitRes.pRsp);
|
||||||
|
@ -77,6 +84,10 @@ int32_t inserterCallback(void* param, SDataBuf* pMsg, int32_t code) {
|
||||||
|
|
||||||
for (int32_t i = 0; i < numOfTables; ++i) {
|
for (int32_t i = 0; i < numOfTables; ++i) {
|
||||||
SVCreateTbRsp* pRsp = taosArrayGet(pCreateTbList, i);
|
SVCreateTbRsp* pRsp = taosArrayGet(pCreateTbList, i);
|
||||||
|
if (NULL == pRsp) {
|
||||||
|
pInserter->submitRes.code = TSDB_CODE_QRY_EXECUTOR_INTERNAL_ERROR;
|
||||||
|
goto _return;
|
||||||
|
}
|
||||||
if (TSDB_CODE_SUCCESS != pRsp->code) {
|
if (TSDB_CODE_SUCCESS != pRsp->code) {
|
||||||
code = pRsp->code;
|
code = pRsp->code;
|
||||||
taosMemoryFree(pInserter->submitRes.pRsp);
|
taosMemoryFree(pInserter->submitRes.pRsp);
|
||||||
|
@ -94,8 +105,10 @@ int32_t inserterCallback(void* param, SDataBuf* pMsg, int32_t code) {
|
||||||
}
|
}
|
||||||
|
|
||||||
_return:
|
_return:
|
||||||
tsem_post(&pInserter->ready);
|
|
||||||
|
(void)tsem_post(&pInserter->ready);
|
||||||
taosMemoryFree(pMsg->pData);
|
taosMemoryFree(pMsg->pData);
|
||||||
|
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -105,11 +118,15 @@ static int32_t sendSubmitRequest(SDataInserterHandle* pInserter, void* pMsg, int
|
||||||
SMsgSendInfo* pMsgSendInfo = taosMemoryCalloc(1, sizeof(SMsgSendInfo));
|
SMsgSendInfo* pMsgSendInfo = taosMemoryCalloc(1, sizeof(SMsgSendInfo));
|
||||||
if (NULL == pMsgSendInfo) {
|
if (NULL == pMsgSendInfo) {
|
||||||
taosMemoryFreeClear(pMsg);
|
taosMemoryFreeClear(pMsg);
|
||||||
terrno = TSDB_CODE_OUT_OF_MEMORY;
|
|
||||||
return terrno;
|
return terrno;
|
||||||
}
|
}
|
||||||
|
|
||||||
SSubmitRspParam* pParam = taosMemoryCalloc(1, sizeof(SSubmitRspParam));
|
SSubmitRspParam* pParam = taosMemoryCalloc(1, sizeof(SSubmitRspParam));
|
||||||
|
if (NULL == pParam) {
|
||||||
|
taosMemoryFreeClear(pMsg);
|
||||||
|
taosMemoryFreeClear(pMsgSendInfo);
|
||||||
|
return terrno;
|
||||||
|
}
|
||||||
pParam->pInserter = pInserter;
|
pParam->pInserter = pInserter;
|
||||||
|
|
||||||
pMsgSendInfo->param = pParam;
|
pMsgSendInfo->param = pParam;
|
||||||
|
@ -133,7 +150,7 @@ static int32_t submitReqToMsg(int32_t vgId, SSubmitReq2* pReq, void** pData, int
|
||||||
len += sizeof(SSubmitReq2Msg);
|
len += sizeof(SSubmitReq2Msg);
|
||||||
pBuf = taosMemoryMalloc(len);
|
pBuf = taosMemoryMalloc(len);
|
||||||
if (NULL == pBuf) {
|
if (NULL == pBuf) {
|
||||||
return TSDB_CODE_OUT_OF_MEMORY;
|
return terrno;
|
||||||
}
|
}
|
||||||
((SSubmitReq2Msg*)pBuf)->header.vgId = htonl(vgId);
|
((SSubmitReq2Msg*)pBuf)->header.vgId = htonl(vgId);
|
||||||
((SSubmitReq2Msg*)pBuf)->header.contLen = htonl(len);
|
((SSubmitReq2Msg*)pBuf)->header.contLen = htonl(len);
|
||||||
|
@ -149,6 +166,7 @@ static int32_t submitReqToMsg(int32_t vgId, SSubmitReq2* pReq, void** pData, int
|
||||||
} else {
|
} else {
|
||||||
taosMemoryFree(pBuf);
|
taosMemoryFree(pBuf);
|
||||||
}
|
}
|
||||||
|
|
||||||
return code;
|
return code;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -162,12 +180,10 @@ int32_t buildSubmitReqFromBlock(SDataInserterHandle* pInserter, SSubmitReq2** pp
|
||||||
|
|
||||||
if (NULL == pReq) {
|
if (NULL == pReq) {
|
||||||
if (!(pReq = taosMemoryMalloc(sizeof(SSubmitReq2)))) {
|
if (!(pReq = taosMemoryMalloc(sizeof(SSubmitReq2)))) {
|
||||||
terrno = TSDB_CODE_OUT_OF_MEMORY;
|
|
||||||
goto _end;
|
goto _end;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!(pReq->aSubmitTbData = taosArrayInit(1, sizeof(SSubmitTbData)))) {
|
if (!(pReq->aSubmitTbData = taosArrayInit(1, sizeof(SSubmitTbData)))) {
|
||||||
terrno = TSDB_CODE_OUT_OF_MEMORY;
|
|
||||||
goto _end;
|
goto _end;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -208,6 +224,10 @@ int32_t buildSubmitReqFromBlock(SDataInserterHandle* pInserter, SSubmitReq2** pp
|
||||||
}
|
}
|
||||||
|
|
||||||
SColumnInfoData* pColInfoData = taosArrayGet(pDataBlock->pDataBlock, colIdx);
|
SColumnInfoData* pColInfoData = taosArrayGet(pDataBlock->pDataBlock, colIdx);
|
||||||
|
if (NULL == pColInfoData) {
|
||||||
|
terrno = TSDB_CODE_QRY_EXECUTOR_INTERNAL_ERROR;
|
||||||
|
goto _end;
|
||||||
|
}
|
||||||
void* var = POINTER_SHIFT(pColInfoData->pData, j * pColInfoData->info.bytes);
|
void* var = POINTER_SHIFT(pColInfoData->pData, j * pColInfoData->info.bytes);
|
||||||
|
|
||||||
switch (pColInfoData->info.type) {
|
switch (pColInfoData->info.type) {
|
||||||
|
@ -217,13 +237,17 @@ int32_t buildSubmitReqFromBlock(SDataInserterHandle* pInserter, SSubmitReq2** pp
|
||||||
ASSERT(pColInfoData->info.type == pCol->type);
|
ASSERT(pColInfoData->info.type == pCol->type);
|
||||||
if (colDataIsNull_s(pColInfoData, j)) {
|
if (colDataIsNull_s(pColInfoData, j)) {
|
||||||
SColVal cv = COL_VAL_NULL(pCol->colId, pCol->type);
|
SColVal cv = COL_VAL_NULL(pCol->colId, pCol->type);
|
||||||
taosArrayPush(pVals, &cv);
|
if (NULL == taosArrayPush(pVals, &cv)) {
|
||||||
|
goto _end;
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
void* data = colDataGetVarData(pColInfoData, j);
|
void* data = colDataGetVarData(pColInfoData, j);
|
||||||
SValue sv = (SValue){
|
SValue sv = (SValue){
|
||||||
.type = pCol->type, .nData = varDataLen(data), .pData = varDataVal(data)}; // address copy, no value
|
.type = pCol->type, .nData = varDataLen(data), .pData = varDataVal(data)}; // address copy, no value
|
||||||
SColVal cv = COL_VAL_VALUE(pCol->colId, sv);
|
SColVal cv = COL_VAL_VALUE(pCol->colId, sv);
|
||||||
taosArrayPush(pVals, &cv);
|
if (NULL == taosArrayPush(pVals, &cv)) {
|
||||||
|
goto _end;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -245,7 +269,9 @@ int32_t buildSubmitReqFromBlock(SDataInserterHandle* pInserter, SSubmitReq2** pp
|
||||||
}
|
}
|
||||||
|
|
||||||
SColVal cv = COL_VAL_NULL(pCol->colId, pCol->type); // should use pCol->type
|
SColVal cv = COL_VAL_NULL(pCol->colId, pCol->type); // should use pCol->type
|
||||||
taosArrayPush(pVals, &cv);
|
if (NULL == taosArrayPush(pVals, &cv)) {
|
||||||
|
goto _end;
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
if (PRIMARYKEY_TIMESTAMP_COL_ID == pCol->colId && !needSortMerge) {
|
if (PRIMARYKEY_TIMESTAMP_COL_ID == pCol->colId && !needSortMerge) {
|
||||||
if (*(int64_t*)var <= lastTs) {
|
if (*(int64_t*)var <= lastTs) {
|
||||||
|
@ -256,9 +282,11 @@ int32_t buildSubmitReqFromBlock(SDataInserterHandle* pInserter, SSubmitReq2** pp
|
||||||
}
|
}
|
||||||
|
|
||||||
SValue sv = {.type = pCol->type};
|
SValue sv = {.type = pCol->type};
|
||||||
memcpy(&sv.val, var, tDataTypes[pCol->type].bytes);
|
TAOS_MEMCPY(&sv.val, var, tDataTypes[pCol->type].bytes);
|
||||||
SColVal cv = COL_VAL_VALUE(pCol->colId, sv);
|
SColVal cv = COL_VAL_VALUE(pCol->colId, sv);
|
||||||
taosArrayPush(pVals, &cv);
|
if (NULL == taosArrayPush(pVals, &cv)) {
|
||||||
|
goto _end;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
uError("the column type %" PRIi16 " is undefined\n", pColInfoData->info.type);
|
uError("the column type %" PRIi16 " is undefined\n", pColInfoData->info.type);
|
||||||
|
@ -274,7 +302,9 @@ int32_t buildSubmitReqFromBlock(SDataInserterHandle* pInserter, SSubmitReq2** pp
|
||||||
tDestroySubmitTbData(&tbData, TSDB_MSG_FLG_ENCODE);
|
tDestroySubmitTbData(&tbData, TSDB_MSG_FLG_ENCODE);
|
||||||
goto _end;
|
goto _end;
|
||||||
}
|
}
|
||||||
taosArrayPush(tbData.aRowP, &pRow);
|
if (NULL == taosArrayPush(tbData.aRowP, &pRow)) {
|
||||||
|
goto _end;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (needSortMerge) {
|
if (needSortMerge) {
|
||||||
|
@ -284,9 +314,12 @@ int32_t buildSubmitReqFromBlock(SDataInserterHandle* pInserter, SSubmitReq2** pp
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
taosArrayPush(pReq->aSubmitTbData, &tbData);
|
if (NULL == taosArrayPush(pReq->aSubmitTbData, &tbData)) {
|
||||||
|
goto _end;
|
||||||
|
}
|
||||||
|
|
||||||
_end:
|
_end:
|
||||||
|
|
||||||
taosArrayDestroy(pVals);
|
taosArrayDestroy(pVals);
|
||||||
if (terrno != 0) {
|
if (terrno != 0) {
|
||||||
*ppReq = NULL;
|
*ppReq = NULL;
|
||||||
|
@ -294,9 +327,11 @@ _end:
|
||||||
tDestroySubmitReq(pReq, TSDB_MSG_FLG_ENCODE);
|
tDestroySubmitReq(pReq, TSDB_MSG_FLG_ENCODE);
|
||||||
taosMemoryFree(pReq);
|
taosMemoryFree(pReq);
|
||||||
}
|
}
|
||||||
|
|
||||||
return terrno;
|
return terrno;
|
||||||
}
|
}
|
||||||
*ppReq = pReq;
|
*ppReq = pReq;
|
||||||
|
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -312,7 +347,9 @@ int32_t dataBlocksToSubmitReq(SDataInserterHandle* pInserter, void** pMsg, int32
|
||||||
|
|
||||||
for (int32_t i = 0; i < sz; i++) {
|
for (int32_t i = 0; i < sz; i++) {
|
||||||
SSDataBlock* pDataBlock = taosArrayGetP(pBlocks, i);
|
SSDataBlock* pDataBlock = taosArrayGetP(pBlocks, i);
|
||||||
|
if (NULL == pDataBlock) {
|
||||||
|
return TSDB_CODE_QRY_EXECUTOR_INTERNAL_ERROR;
|
||||||
|
}
|
||||||
code = buildSubmitReqFromBlock(pInserter, &pReq, pDataBlock, pTSchema, uid, vgId, suid);
|
code = buildSubmitReqFromBlock(pInserter, &pReq, pDataBlock, pTSchema, uid, vgId, suid);
|
||||||
if (code) {
|
if (code) {
|
||||||
if (pReq) {
|
if (pReq) {
|
||||||
|
@ -334,7 +371,9 @@ int32_t dataBlocksToSubmitReq(SDataInserterHandle* pInserter, void** pMsg, int32
|
||||||
static int32_t putDataBlock(SDataSinkHandle* pHandle, const SInputData* pInput, bool* pContinue) {
|
static int32_t putDataBlock(SDataSinkHandle* pHandle, const SInputData* pInput, bool* pContinue) {
|
||||||
SDataInserterHandle* pInserter = (SDataInserterHandle*)pHandle;
|
SDataInserterHandle* pInserter = (SDataInserterHandle*)pHandle;
|
||||||
if (!pInserter->explain) {
|
if (!pInserter->explain) {
|
||||||
taosArrayPush(pInserter->pDataBlocks, &pInput->pData);
|
if (NULL == taosArrayPush(pInserter->pDataBlocks, &pInput->pData)) {
|
||||||
|
return terrno;
|
||||||
|
}
|
||||||
void* pMsg = NULL;
|
void* pMsg = NULL;
|
||||||
int32_t msgLen = 0;
|
int32_t msgLen = 0;
|
||||||
int32_t code = dataBlocksToSubmitReq(pInserter, &pMsg, &msgLen);
|
int32_t code = dataBlocksToSubmitReq(pInserter, &pMsg, &msgLen);
|
||||||
|
@ -350,7 +389,7 @@ static int32_t putDataBlock(SDataSinkHandle* pHandle, const SInputData* pInput,
|
||||||
return code;
|
return code;
|
||||||
}
|
}
|
||||||
|
|
||||||
tsem_wait(&pInserter->ready);
|
QRY_ERR_RET(tsem_wait(&pInserter->ready));
|
||||||
|
|
||||||
if (pInserter->submitRes.code) {
|
if (pInserter->submitRes.code) {
|
||||||
return pInserter->submitRes.code;
|
return pInserter->submitRes.code;
|
||||||
|
@ -364,10 +403,10 @@ static int32_t putDataBlock(SDataSinkHandle* pHandle, const SInputData* pInput,
|
||||||
|
|
||||||
static void endPut(struct SDataSinkHandle* pHandle, uint64_t useconds) {
|
static void endPut(struct SDataSinkHandle* pHandle, uint64_t useconds) {
|
||||||
SDataInserterHandle* pInserter = (SDataInserterHandle*)pHandle;
|
SDataInserterHandle* pInserter = (SDataInserterHandle*)pHandle;
|
||||||
taosThreadMutexLock(&pInserter->mutex);
|
(void)taosThreadMutexLock(&pInserter->mutex);
|
||||||
pInserter->queryEnd = true;
|
pInserter->queryEnd = true;
|
||||||
pInserter->useconds = useconds;
|
pInserter->useconds = useconds;
|
||||||
taosThreadMutexUnlock(&pInserter->mutex);
|
(void)taosThreadMutexUnlock(&pInserter->mutex);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void getDataLength(SDataSinkHandle* pHandle, int64_t* pLen, int64_t* pRawLen, bool* pQueryEnd) {
|
static void getDataLength(SDataSinkHandle* pHandle, int64_t* pLen, int64_t* pRawLen, bool* pQueryEnd) {
|
||||||
|
@ -378,12 +417,12 @@ static void getDataLength(SDataSinkHandle* pHandle, int64_t* pLen, int64_t* pRaw
|
||||||
|
|
||||||
static int32_t destroyDataSinker(SDataSinkHandle* pHandle) {
|
static int32_t destroyDataSinker(SDataSinkHandle* pHandle) {
|
||||||
SDataInserterHandle* pInserter = (SDataInserterHandle*)pHandle;
|
SDataInserterHandle* pInserter = (SDataInserterHandle*)pHandle;
|
||||||
atomic_sub_fetch_64(&gDataSinkStat.cachedSize, pInserter->cachedSize);
|
(void)atomic_sub_fetch_64(&gDataSinkStat.cachedSize, pInserter->cachedSize);
|
||||||
taosArrayDestroy(pInserter->pDataBlocks);
|
taosArrayDestroy(pInserter->pDataBlocks);
|
||||||
taosMemoryFree(pInserter->pSchema);
|
taosMemoryFree(pInserter->pSchema);
|
||||||
taosMemoryFree(pInserter->pParam);
|
taosMemoryFree(pInserter->pParam);
|
||||||
taosHashCleanup(pInserter->pCols);
|
taosHashCleanup(pInserter->pCols);
|
||||||
taosThreadMutexDestroy(&pInserter->mutex);
|
(void)taosThreadMutexDestroy(&pInserter->mutex);
|
||||||
|
|
||||||
taosMemoryFree(pInserter->pManager);
|
taosMemoryFree(pInserter->pManager);
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
|
@ -401,7 +440,6 @@ int32_t createDataInserter(SDataSinkManager* pManager, const SDataSinkNode* pDat
|
||||||
SDataInserterHandle* inserter = taosMemoryCalloc(1, sizeof(SDataInserterHandle));
|
SDataInserterHandle* inserter = taosMemoryCalloc(1, sizeof(SDataInserterHandle));
|
||||||
if (NULL == inserter) {
|
if (NULL == inserter) {
|
||||||
taosMemoryFree(pParam);
|
taosMemoryFree(pParam);
|
||||||
terrno = TSDB_CODE_OUT_OF_MEMORY;
|
|
||||||
goto _return;
|
goto _return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -432,28 +470,31 @@ int32_t createDataInserter(SDataSinkManager* pManager, const SDataSinkNode* pDat
|
||||||
}
|
}
|
||||||
|
|
||||||
inserter->pDataBlocks = taosArrayInit(1, POINTER_BYTES);
|
inserter->pDataBlocks = taosArrayInit(1, POINTER_BYTES);
|
||||||
taosThreadMutexInit(&inserter->mutex, NULL);
|
|
||||||
if (NULL == inserter->pDataBlocks) {
|
if (NULL == inserter->pDataBlocks) {
|
||||||
terrno = TSDB_CODE_OUT_OF_MEMORY;
|
|
||||||
goto _return;
|
goto _return;
|
||||||
}
|
}
|
||||||
|
QRY_ERR_JRET(taosThreadMutexInit(&inserter->mutex, NULL));
|
||||||
|
|
||||||
inserter->fullOrderColList = pInserterNode->pCols->length == inserter->pSchema->numOfCols;
|
inserter->fullOrderColList = pInserterNode->pCols->length == inserter->pSchema->numOfCols;
|
||||||
|
|
||||||
inserter->pCols = taosHashInit(pInserterNode->pCols->length, taosGetDefaultHashFunction(TSDB_DATA_TYPE_SMALLINT),
|
inserter->pCols = taosHashInit(pInserterNode->pCols->length, taosGetDefaultHashFunction(TSDB_DATA_TYPE_SMALLINT),
|
||||||
false, HASH_NO_LOCK);
|
false, HASH_NO_LOCK);
|
||||||
|
if (NULL == inserter->pCols) {
|
||||||
|
goto _return;
|
||||||
|
}
|
||||||
|
|
||||||
SNode* pNode = NULL;
|
SNode* pNode = NULL;
|
||||||
int32_t i = 0;
|
int32_t i = 0;
|
||||||
FOREACH(pNode, pInserterNode->pCols) {
|
FOREACH(pNode, pInserterNode->pCols) {
|
||||||
SColumnNode* pCol = (SColumnNode*)pNode;
|
SColumnNode* pCol = (SColumnNode*)pNode;
|
||||||
taosHashPut(inserter->pCols, &pCol->colId, sizeof(pCol->colId), &pCol->slotId, sizeof(pCol->slotId));
|
QRY_ERR_JRET(taosHashPut(inserter->pCols, &pCol->colId, sizeof(pCol->colId), &pCol->slotId, sizeof(pCol->slotId)));
|
||||||
if (inserter->fullOrderColList && pCol->colId != inserter->pSchema->columns[i].colId) {
|
if (inserter->fullOrderColList && pCol->colId != inserter->pSchema->columns[i].colId) {
|
||||||
inserter->fullOrderColList = false;
|
inserter->fullOrderColList = false;
|
||||||
}
|
}
|
||||||
++i;
|
++i;
|
||||||
}
|
}
|
||||||
|
|
||||||
tsem_init(&inserter->ready, 0, 0);
|
QRY_ERR_JRET(tsem_init(&inserter->ready, 0, 0));
|
||||||
|
|
||||||
*pHandle = inserter;
|
*pHandle = inserter;
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
|
@ -461,7 +502,7 @@ int32_t createDataInserter(SDataSinkManager* pManager, const SDataSinkNode* pDat
|
||||||
_return:
|
_return:
|
||||||
|
|
||||||
if (inserter) {
|
if (inserter) {
|
||||||
destroyDataSinker((SDataSinkHandle*)inserter);
|
(void)destroyDataSinker((SDataSinkHandle*)inserter);
|
||||||
taosMemoryFree(inserter);
|
taosMemoryFree(inserter);
|
||||||
} else {
|
} else {
|
||||||
taosMemoryFree(pManager);
|
taosMemoryFree(pManager);
|
||||||
|
|
|
@ -23,20 +23,20 @@ SDataSinkStat gDataSinkStat = {0};
|
||||||
int32_t dsDataSinkMgtInit(SDataSinkMgtCfg* cfg, SStorageAPI* pAPI, void** ppSinkManager) {
|
int32_t dsDataSinkMgtInit(SDataSinkMgtCfg* cfg, SStorageAPI* pAPI, void** ppSinkManager) {
|
||||||
SDataSinkManager* pSinkManager = taosMemoryMalloc(sizeof(SDataSinkManager));
|
SDataSinkManager* pSinkManager = taosMemoryMalloc(sizeof(SDataSinkManager));
|
||||||
if (NULL == pSinkManager) {
|
if (NULL == pSinkManager) {
|
||||||
return TSDB_CODE_OUT_OF_MEMORY;
|
return terrno;
|
||||||
}
|
}
|
||||||
|
|
||||||
pSinkManager->cfg = *cfg;
|
pSinkManager->cfg = *cfg;
|
||||||
pSinkManager->pAPI = pAPI;
|
pSinkManager->pAPI = pAPI;
|
||||||
|
|
||||||
*ppSinkManager = pSinkManager;
|
*ppSinkManager = pSinkManager;
|
||||||
return 0; // to avoid compiler eror
|
return TSDB_CODE_SUCCESS; // to avoid compiler eror
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t dsDataSinkGetCacheSize(SDataSinkStat* pStat) {
|
int32_t dsDataSinkGetCacheSize(SDataSinkStat* pStat) {
|
||||||
pStat->cachedSize = atomic_load_64(&gDataSinkStat.cachedSize);
|
pStat->cachedSize = atomic_load_64(&gDataSinkStat.cachedSize);
|
||||||
|
|
||||||
return 0;
|
return TSDB_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t dsCreateDataSinker(void* pSinkManager, 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) {
|
||||||
|
@ -56,6 +56,7 @@ int32_t dsCreateDataSinker(void* pSinkManager, const SDataSinkNode* pDataSink, D
|
||||||
|
|
||||||
taosMemoryFree(pSinkManager);
|
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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -97,6 +98,6 @@ void dsScheduleProcess(void* ahandle, void* pItem) {
|
||||||
|
|
||||||
void dsDestroyDataSinker(DataSinkHandle handle) {
|
void dsDestroyDataSinker(DataSinkHandle handle) {
|
||||||
SDataSinkHandle* pHandleImpl = (SDataSinkHandle*)handle;
|
SDataSinkHandle* pHandleImpl = (SDataSinkHandle*)handle;
|
||||||
pHandleImpl->fDestroy(pHandleImpl);
|
(void)pHandleImpl->fDestroy(pHandleImpl);
|
||||||
taosMemoryFree(pHandleImpl);
|
taosMemoryFree(pHandleImpl);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue