fix: memory leak issues
This commit is contained in:
parent
81439ba0cf
commit
ce1b294c51
|
@ -48,6 +48,14 @@ typedef int32_t (*__block_search_fn_t)(char* data, int32_t num, int64_t key, int
|
||||||
typedef struct STsdbReader STsdbReader;
|
typedef struct STsdbReader STsdbReader;
|
||||||
typedef struct STqReader STqReader;
|
typedef struct STqReader STqReader;
|
||||||
|
|
||||||
|
|
||||||
|
typedef enum SOperatorParamType{
|
||||||
|
OP_GET_PARAM = 1,
|
||||||
|
OP_NOTIFY_PARAM
|
||||||
|
} SOperatorParamType;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#define IS_VALID_SESSION_WIN(winInfo) ((winInfo).sessionWin.win.skey > 0)
|
#define IS_VALID_SESSION_WIN(winInfo) ((winInfo).sessionWin.win.skey > 0)
|
||||||
#define SET_SESSION_WIN_INVALID(winInfo) ((winInfo).sessionWin.win.skey = INT64_MIN)
|
#define SET_SESSION_WIN_INVALID(winInfo) ((winInfo).sessionWin.win.skey = INT64_MIN)
|
||||||
#define IS_INVALID_SESSION_WIN_KEY(winKey) ((winKey).win.skey <= 0)
|
#define IS_INVALID_SESSION_WIN_KEY(winKey) ((winKey).win.skey <= 0)
|
||||||
|
@ -741,6 +749,11 @@ void streamOpReloadState(struct SOperatorInfo* pOperator);
|
||||||
void destroyOperatorParamValue(void* pValues);
|
void destroyOperatorParamValue(void* pValues);
|
||||||
int32_t mergeOperatorParams(SOperatorParam* pDst, SOperatorParam* pSrc);
|
int32_t mergeOperatorParams(SOperatorParam* pDst, SOperatorParam* pSrc);
|
||||||
int32_t buildTableScanOperatorParam(SOperatorParam** ppRes, SArray* pUidList, int32_t srcOpType, bool tableSeq);
|
int32_t buildTableScanOperatorParam(SOperatorParam** ppRes, SArray* pUidList, int32_t srcOpType, bool tableSeq);
|
||||||
|
void freeExchangeGetBasicOperatorParam(void* pParam);
|
||||||
|
void freeOperatorParam(SOperatorParam* pParam, SOperatorParamType type);
|
||||||
|
void freeResetOperatorParams(struct SOperatorInfo* pOperator, SOperatorParamType type, bool allFree);
|
||||||
|
SSDataBlock* getNextBlockFromDownstreamImpl(struct SOperatorInfo* pOperator, int32_t idx, bool clearParam);
|
||||||
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
|
|
|
@ -56,7 +56,7 @@ typedef struct SGcDownstreamCtx {
|
||||||
SRWLatch grpLock;
|
SRWLatch grpLock;
|
||||||
int64_t fetchSessionId;
|
int64_t fetchSessionId;
|
||||||
SArray* pNewGrpList; // SArray<SGcNewGroupInfo>
|
SArray* pNewGrpList; // SArray<SGcNewGroupInfo>
|
||||||
SSHashObj* pVgTbHash;
|
SSHashObj* pVgTbHash; // SHash<SGcVgroupCtx>
|
||||||
SHashObj* pGrpHash;
|
SHashObj* pGrpHash;
|
||||||
SRWLatch blkLock;
|
SRWLatch blkLock;
|
||||||
SSDataBlock* pBaseBlock;
|
SSDataBlock* pBaseBlock;
|
||||||
|
@ -136,7 +136,6 @@ typedef struct SGcBlkBufInfo {
|
||||||
} SGcBlkBufInfo;
|
} SGcBlkBufInfo;
|
||||||
|
|
||||||
typedef struct SGcExecInfo {
|
typedef struct SGcExecInfo {
|
||||||
int32_t downstreamNum;
|
|
||||||
int64_t* pDownstreamBlkNum;
|
int64_t* pDownstreamBlkNum;
|
||||||
} SGcExecInfo;
|
} SGcExecInfo;
|
||||||
|
|
||||||
|
@ -157,13 +156,13 @@ typedef struct SGcBlkCacheInfo {
|
||||||
} SGcBlkCacheInfo;
|
} SGcBlkCacheInfo;
|
||||||
|
|
||||||
typedef struct SGroupCacheOperatorInfo {
|
typedef struct SGroupCacheOperatorInfo {
|
||||||
TdThreadMutex sessionMutex;
|
|
||||||
int64_t maxCacheSize;
|
int64_t maxCacheSize;
|
||||||
int64_t currentBlkId;
|
int64_t currentBlkId;
|
||||||
SGroupColsInfo groupColsInfo;
|
SGroupColsInfo groupColsInfo;
|
||||||
bool globalGrp;
|
bool globalGrp;
|
||||||
bool grpByUid;
|
bool grpByUid;
|
||||||
bool batchFetch;
|
bool batchFetch;
|
||||||
|
int32_t downstreamNum;
|
||||||
SGcDownstreamCtx* pDownstreams;
|
SGcDownstreamCtx* pDownstreams;
|
||||||
SGcBlkCacheInfo blkCache;
|
SGcBlkCacheInfo blkCache;
|
||||||
SHashObj* pGrpHash;
|
SHashObj* pGrpHash;
|
||||||
|
|
|
@ -20,11 +20,6 @@
|
||||||
extern "C" {
|
extern "C" {
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
typedef enum SOperatorParamType{
|
|
||||||
OP_GET_PARAM = 1,
|
|
||||||
OP_NOTIFY_PARAM
|
|
||||||
} SOperatorParamType;
|
|
||||||
|
|
||||||
typedef struct SOperatorCostInfo {
|
typedef struct SOperatorCostInfo {
|
||||||
double openCost;
|
double openCost;
|
||||||
double totalCost;
|
double totalCost;
|
||||||
|
@ -180,7 +175,7 @@ int32_t optrDefaultBufFn(SOperatorInfo* pOperator);
|
||||||
SSDataBlock* optrDefaultGetNextExtFn(struct SOperatorInfo* pOperator, SOperatorParam* pParam);
|
SSDataBlock* optrDefaultGetNextExtFn(struct SOperatorInfo* pOperator, SOperatorParam* pParam);
|
||||||
int32_t optrDefaultNotifyFn(struct SOperatorInfo* pOperator, SOperatorParam* pParam);
|
int32_t optrDefaultNotifyFn(struct SOperatorInfo* pOperator, SOperatorParam* pParam);
|
||||||
SSDataBlock* getNextBlockFromDownstream(struct SOperatorInfo* pOperator, int32_t idx);
|
SSDataBlock* getNextBlockFromDownstream(struct SOperatorInfo* pOperator, int32_t idx);
|
||||||
SSDataBlock* getNextBlockFromDownstreamOnce(struct SOperatorInfo* pOperator, int32_t idx);
|
SSDataBlock* getNextBlockFromDownstreamRemain(struct SOperatorInfo* pOperator, int32_t idx);
|
||||||
int16_t getOperatorResultBlockId(struct SOperatorInfo* pOperator, int32_t idx);
|
int16_t getOperatorResultBlockId(struct SOperatorInfo* pOperator, int32_t idx);
|
||||||
|
|
||||||
SOperatorInfo* createOperator(SPhysiNode* pPhyNode, SExecTaskInfo* pTaskInfo, SReadHandle* pHandle, SNode* pTagCond,
|
SOperatorInfo* createOperator(SPhysiNode* pPhyNode, SExecTaskInfo* pTaskInfo, SReadHandle* pHandle, SNode* pTagCond,
|
||||||
|
|
|
@ -33,224 +33,64 @@ void freeVgTableList(void* ptr) {
|
||||||
taosArrayDestroy(*(SArray**)ptr);
|
taosArrayDestroy(*(SArray**)ptr);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void destroyStbJoinTableList(SStbJoinTableList* pListHead) {
|
||||||
|
SStbJoinTableList* pNext = NULL;
|
||||||
|
|
||||||
|
while (pListHead) {
|
||||||
|
taosMemoryFree(pListHead->pLeftVg);
|
||||||
|
taosMemoryFree(pListHead->pLeftUid);
|
||||||
|
taosMemoryFree(pListHead->pRightVg);
|
||||||
|
taosMemoryFree(pListHead->pRightUid);
|
||||||
|
pNext = pListHead->pNext;
|
||||||
|
taosMemoryFree(pListHead);
|
||||||
|
pListHead = pNext;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void destroyStbJoinDynCtrlInfo(SStbJoinDynCtrlInfo* pStbJoin) {
|
||||||
|
qError("dynQueryCtrl exec info, prevBlk:%" PRId64 ", prevRows:%" PRId64 ", postBlk:%" PRId64 ", postRows:%" PRId64 ", leftCacheNum:%" PRId64 ", rightCacheNum:%" PRId64,
|
||||||
|
pStbJoin->execInfo.prevBlkNum, pStbJoin->execInfo.prevBlkRows, pStbJoin->execInfo.postBlkNum,
|
||||||
|
pStbJoin->execInfo.postBlkRows, pStbJoin->execInfo.leftCacheNum, pStbJoin->execInfo.rightCacheNum);
|
||||||
|
|
||||||
|
if (pStbJoin->basic.batchFetch) {
|
||||||
|
if (pStbJoin->ctx.prev.leftHash) {
|
||||||
|
tSimpleHashSetFreeFp(pStbJoin->ctx.prev.leftHash, freeVgTableList);
|
||||||
|
tSimpleHashCleanup(pStbJoin->ctx.prev.leftHash);
|
||||||
|
}
|
||||||
|
if (pStbJoin->ctx.prev.rightHash) {
|
||||||
|
tSimpleHashSetFreeFp(pStbJoin->ctx.prev.rightHash, freeVgTableList);
|
||||||
|
tSimpleHashCleanup(pStbJoin->ctx.prev.rightHash);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if (pStbJoin->ctx.prev.leftCache) {
|
||||||
|
tSimpleHashCleanup(pStbJoin->ctx.prev.leftCache);
|
||||||
|
}
|
||||||
|
if (pStbJoin->ctx.prev.rightCache) {
|
||||||
|
tSimpleHashCleanup(pStbJoin->ctx.prev.rightCache);
|
||||||
|
}
|
||||||
|
if (pStbJoin->ctx.prev.onceTable) {
|
||||||
|
tSimpleHashCleanup(pStbJoin->ctx.prev.onceTable);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
destroyStbJoinTableList(pStbJoin->ctx.prev.pListHead);
|
||||||
|
}
|
||||||
|
|
||||||
static void destroyDynQueryCtrlOperator(void* param) {
|
static void destroyDynQueryCtrlOperator(void* param) {
|
||||||
SDynQueryCtrlOperatorInfo* pDyn = (SDynQueryCtrlOperatorInfo*)param;
|
SDynQueryCtrlOperatorInfo* pDyn = (SDynQueryCtrlOperatorInfo*)param;
|
||||||
qError("dynQueryCtrl exec info, prevBlk:%" PRId64 ", prevRows:%" PRId64 ", postBlk:%" PRId64 ", postRows:%" PRId64 ", leftCacheNum:%" PRId64 ", rightCacheNum:%" PRId64,
|
|
||||||
pDyn->stbJoin.execInfo.prevBlkNum, pDyn->stbJoin.execInfo.prevBlkRows, pDyn->stbJoin.execInfo.postBlkNum,
|
|
||||||
pDyn->stbJoin.execInfo.postBlkRows, pDyn->stbJoin.execInfo.leftCacheNum, pDyn->stbJoin.execInfo.rightCacheNum);
|
|
||||||
|
|
||||||
if (pDyn->stbJoin.basic.batchFetch) {
|
switch (pDyn->qType) {
|
||||||
if (pDyn->stbJoin.ctx.prev.leftHash) {
|
case DYN_QTYPE_STB_HASH:
|
||||||
tSimpleHashSetFreeFp(pDyn->stbJoin.ctx.prev.leftHash, freeVgTableList);
|
destroyStbJoinDynCtrlInfo(&pDyn->stbJoin);
|
||||||
tSimpleHashCleanup(pDyn->stbJoin.ctx.prev.leftHash);
|
break;
|
||||||
}
|
default:
|
||||||
if (pDyn->stbJoin.ctx.prev.rightHash) {
|
qError("unsupported dynamic query ctrl type: %d", pDyn->qType);
|
||||||
tSimpleHashSetFreeFp(pDyn->stbJoin.ctx.prev.rightHash, freeVgTableList);
|
break;
|
||||||
tSimpleHashCleanup(pDyn->stbJoin.ctx.prev.rightHash);
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
if (pDyn->stbJoin.ctx.prev.leftCache) {
|
|
||||||
tSimpleHashCleanup(pDyn->stbJoin.ctx.prev.leftCache);
|
|
||||||
}
|
|
||||||
if (pDyn->stbJoin.ctx.prev.rightCache) {
|
|
||||||
tSimpleHashCleanup(pDyn->stbJoin.ctx.prev.rightCache);
|
|
||||||
}
|
|
||||||
if (pDyn->stbJoin.ctx.prev.onceTable) {
|
|
||||||
tSimpleHashCleanup(pDyn->stbJoin.ctx.prev.onceTable);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
taosMemoryFreeClear(param);
|
taosMemoryFreeClear(param);
|
||||||
}
|
}
|
||||||
|
|
||||||
static FORCE_INLINE int32_t buildGroupCacheOperatorParam(SOperatorParam** ppRes, int32_t downstreamIdx, int32_t vgId, int64_t tbUid, bool needCache, SOperatorParam* pChild) {
|
|
||||||
*ppRes = taosMemoryMalloc(sizeof(SOperatorParam));
|
|
||||||
if (NULL == *ppRes) {
|
|
||||||
return TSDB_CODE_OUT_OF_MEMORY;
|
|
||||||
}
|
|
||||||
if (pChild) {
|
|
||||||
(*ppRes)->pChildren = taosArrayInit(1, POINTER_BYTES);
|
|
||||||
if (NULL == *ppRes) {
|
|
||||||
return TSDB_CODE_OUT_OF_MEMORY;
|
|
||||||
}
|
|
||||||
if (NULL == taosArrayPush((*ppRes)->pChildren, &pChild)) {
|
|
||||||
return TSDB_CODE_OUT_OF_MEMORY;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
(*ppRes)->pChildren = NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
SGcOperatorParam* pGc = taosMemoryMalloc(sizeof(SGcOperatorParam));
|
|
||||||
if (NULL == pGc) {
|
|
||||||
return TSDB_CODE_OUT_OF_MEMORY;
|
|
||||||
}
|
|
||||||
|
|
||||||
pGc->sessionId = atomic_add_fetch_64(&gSessionId, 1);
|
|
||||||
pGc->downstreamIdx = downstreamIdx;
|
|
||||||
pGc->vgId = vgId;
|
|
||||||
pGc->tbUid = tbUid;
|
|
||||||
pGc->needCache = needCache;
|
|
||||||
|
|
||||||
(*ppRes)->opType = QUERY_NODE_PHYSICAL_PLAN_GROUP_CACHE;
|
|
||||||
(*ppRes)->downstreamIdx = downstreamIdx;
|
|
||||||
(*ppRes)->value = pGc;
|
|
||||||
|
|
||||||
return TSDB_CODE_SUCCESS;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
static FORCE_INLINE int32_t buildGroupCacheNotifyOperatorParam(SOperatorParam** ppRes, int32_t downstreamIdx, int32_t vgId, int64_t tbUid) {
|
|
||||||
*ppRes = taosMemoryMalloc(sizeof(SOperatorParam));
|
|
||||||
if (NULL == *ppRes) {
|
|
||||||
return TSDB_CODE_OUT_OF_MEMORY;
|
|
||||||
}
|
|
||||||
(*ppRes)->pChildren = NULL;
|
|
||||||
|
|
||||||
SGcNotifyOperatorParam* pGc = taosMemoryMalloc(sizeof(SGcNotifyOperatorParam));
|
|
||||||
if (NULL == pGc) {
|
|
||||||
return TSDB_CODE_OUT_OF_MEMORY;
|
|
||||||
}
|
|
||||||
|
|
||||||
pGc->downstreamIdx = downstreamIdx;
|
|
||||||
pGc->vgId = vgId;
|
|
||||||
pGc->tbUid = tbUid;
|
|
||||||
|
|
||||||
(*ppRes)->opType = QUERY_NODE_PHYSICAL_PLAN_GROUP_CACHE;
|
|
||||||
(*ppRes)->downstreamIdx = downstreamIdx;
|
|
||||||
(*ppRes)->value = pGc;
|
|
||||||
|
|
||||||
return TSDB_CODE_SUCCESS;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
static FORCE_INLINE int32_t buildExchangeOperatorParam(SOperatorParam** ppRes, int32_t downstreamIdx, int32_t* pVgId, int64_t* pUid) {
|
|
||||||
*ppRes = taosMemoryMalloc(sizeof(SOperatorParam));
|
|
||||||
if (NULL == *ppRes) {
|
|
||||||
return TSDB_CODE_OUT_OF_MEMORY;
|
|
||||||
}
|
|
||||||
(*ppRes)->pChildren = NULL;
|
|
||||||
|
|
||||||
SExchangeOperatorParam* pExc = taosMemoryMalloc(sizeof(SExchangeOperatorParam));
|
|
||||||
if (NULL == pExc) {
|
|
||||||
return TSDB_CODE_OUT_OF_MEMORY;
|
|
||||||
}
|
|
||||||
|
|
||||||
pExc->multiParams = false;
|
|
||||||
pExc->basic.vgId = *pVgId;
|
|
||||||
pExc->basic.tableSeq = true;
|
|
||||||
pExc->basic.srcOpType = QUERY_NODE_PHYSICAL_PLAN_TABLE_SCAN;
|
|
||||||
pExc->basic.uidList = taosArrayInit(1, sizeof(int64_t));
|
|
||||||
if (NULL == pExc->basic.uidList) {
|
|
||||||
taosMemoryFree(pExc);
|
|
||||||
return TSDB_CODE_OUT_OF_MEMORY;
|
|
||||||
}
|
|
||||||
taosArrayPush(pExc->basic.uidList, pUid);
|
|
||||||
|
|
||||||
(*ppRes)->opType = QUERY_NODE_PHYSICAL_PLAN_EXCHANGE;
|
|
||||||
(*ppRes)->downstreamIdx = downstreamIdx;
|
|
||||||
(*ppRes)->value = pExc;
|
|
||||||
|
|
||||||
return TSDB_CODE_SUCCESS;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
static FORCE_INLINE int32_t buildBatchExchangeOperatorParam(SOperatorParam** ppRes, int32_t downstreamIdx, SSHashObj* pVg) {
|
|
||||||
*ppRes = taosMemoryMalloc(sizeof(SOperatorParam));
|
|
||||||
if (NULL == *ppRes) {
|
|
||||||
return TSDB_CODE_OUT_OF_MEMORY;
|
|
||||||
}
|
|
||||||
(*ppRes)->pChildren = NULL;
|
|
||||||
|
|
||||||
SExchangeOperatorBatchParam* pExc = taosMemoryMalloc(sizeof(SExchangeOperatorBatchParam));
|
|
||||||
if (NULL == pExc) {
|
|
||||||
return TSDB_CODE_OUT_OF_MEMORY;
|
|
||||||
}
|
|
||||||
|
|
||||||
pExc->multiParams = true;
|
|
||||||
pExc->pBatchs = tSimpleHashInit(tSimpleHashGetSize(pVg), taosGetDefaultHashFunction(TSDB_DATA_TYPE_INT));
|
|
||||||
if (NULL == pExc->pBatchs) {
|
|
||||||
taosMemoryFree(pExc);
|
|
||||||
return TSDB_CODE_OUT_OF_MEMORY;
|
|
||||||
}
|
|
||||||
|
|
||||||
SExchangeOperatorBasicParam basic;
|
|
||||||
basic.srcOpType = QUERY_NODE_PHYSICAL_PLAN_TABLE_SCAN;
|
|
||||||
|
|
||||||
int32_t iter = 0;
|
|
||||||
void* p = NULL;
|
|
||||||
while (p = tSimpleHashIterate(pVg, p, &iter)) {
|
|
||||||
int32_t* pVgId = tSimpleHashGetKey(p, NULL);
|
|
||||||
SArray* pUidList = *(SArray**)p;
|
|
||||||
basic.vgId = *pVgId;
|
|
||||||
basic.uidList = pUidList;
|
|
||||||
basic.tableSeq = false;
|
|
||||||
|
|
||||||
tSimpleHashPut(pExc->pBatchs, pVgId, sizeof(*pVgId), &basic, sizeof(basic));
|
|
||||||
|
|
||||||
qTrace("build downstreamIdx %d batch scan, vgId:%d, uidNum:%" PRId64, downstreamIdx, *pVgId, (int64_t)taosArrayGetSize(pUidList));
|
|
||||||
}
|
|
||||||
|
|
||||||
(*ppRes)->opType = QUERY_NODE_PHYSICAL_PLAN_EXCHANGE;
|
|
||||||
(*ppRes)->downstreamIdx = downstreamIdx;
|
|
||||||
(*ppRes)->value = pExc;
|
|
||||||
|
|
||||||
return TSDB_CODE_SUCCESS;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
static FORCE_INLINE int32_t buildMergeJoinOperatorParam(SOperatorParam** ppRes, bool initParam, SOperatorParam* pChild0, SOperatorParam* pChild1) {
|
|
||||||
*ppRes = taosMemoryMalloc(sizeof(SOperatorParam));
|
|
||||||
if (NULL == *ppRes) {
|
|
||||||
return TSDB_CODE_OUT_OF_MEMORY;
|
|
||||||
}
|
|
||||||
(*ppRes)->pChildren = taosArrayInit(2, POINTER_BYTES);
|
|
||||||
if (NULL == *ppRes) {
|
|
||||||
return TSDB_CODE_OUT_OF_MEMORY;
|
|
||||||
}
|
|
||||||
if (NULL == taosArrayPush((*ppRes)->pChildren, &pChild0)) {
|
|
||||||
return TSDB_CODE_OUT_OF_MEMORY;
|
|
||||||
}
|
|
||||||
if (NULL == taosArrayPush((*ppRes)->pChildren, &pChild1)) {
|
|
||||||
return TSDB_CODE_OUT_OF_MEMORY;
|
|
||||||
}
|
|
||||||
|
|
||||||
SSortMergeJoinOperatorParam* pJoin = taosMemoryMalloc(sizeof(SSortMergeJoinOperatorParam));
|
|
||||||
if (NULL == pJoin) {
|
|
||||||
return TSDB_CODE_OUT_OF_MEMORY;
|
|
||||||
}
|
|
||||||
|
|
||||||
pJoin->initDownstreamNum = initParam ? 2 : 0;
|
|
||||||
|
|
||||||
(*ppRes)->opType = QUERY_NODE_PHYSICAL_PLAN_MERGE_JOIN;
|
|
||||||
(*ppRes)->value = pJoin;
|
|
||||||
|
|
||||||
return TSDB_CODE_SUCCESS;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
static FORCE_INLINE int32_t buildMergeJoinNotifyOperatorParam(SOperatorParam** ppRes, SOperatorParam* pChild0, SOperatorParam* pChild1) {
|
|
||||||
*ppRes = taosMemoryMalloc(sizeof(SOperatorParam));
|
|
||||||
if (NULL == *ppRes) {
|
|
||||||
return TSDB_CODE_OUT_OF_MEMORY;
|
|
||||||
}
|
|
||||||
(*ppRes)->pChildren = taosArrayInit(2, POINTER_BYTES);
|
|
||||||
if (NULL == *ppRes) {
|
|
||||||
return TSDB_CODE_OUT_OF_MEMORY;
|
|
||||||
}
|
|
||||||
if (pChild0 && NULL == taosArrayPush((*ppRes)->pChildren, &pChild0)) {
|
|
||||||
return TSDB_CODE_OUT_OF_MEMORY;
|
|
||||||
}
|
|
||||||
if (pChild1 && NULL == taosArrayPush((*ppRes)->pChildren, &pChild1)) {
|
|
||||||
return TSDB_CODE_OUT_OF_MEMORY;
|
|
||||||
}
|
|
||||||
|
|
||||||
(*ppRes)->opType = QUERY_NODE_PHYSICAL_PLAN_MERGE_JOIN;
|
|
||||||
(*ppRes)->value = NULL;
|
|
||||||
|
|
||||||
return TSDB_CODE_SUCCESS;
|
|
||||||
}
|
|
||||||
|
|
||||||
static FORCE_INLINE bool tableNeedCache(int64_t uid, SStbJoinPrevJoinCtx* pPrev, SStbJoinPostJoinCtx* pPost, bool rightTable, bool batchFetch) {
|
static FORCE_INLINE bool tableNeedCache(int64_t uid, SStbJoinPrevJoinCtx* pPrev, SStbJoinPostJoinCtx* pPost, bool rightTable, bool batchFetch) {
|
||||||
if (batchFetch) {
|
if (batchFetch) {
|
||||||
return true;
|
return true;
|
||||||
|
@ -307,7 +147,199 @@ static void updatePostJoinCurrTableInfo(SStbJoinDynCtrlInfo* pStbJoin)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static FORCE_INLINE int32_t buildBatchTableScanOperatorParam(SOperatorParam** ppRes, int32_t downstreamIdx, SSHashObj* pVg) {
|
|
||||||
|
static int32_t buildGroupCacheOperatorParam(SOperatorParam** ppRes, int32_t downstreamIdx, int32_t vgId, int64_t tbUid, bool needCache, SOperatorParam* pChild) {
|
||||||
|
*ppRes = taosMemoryMalloc(sizeof(SOperatorParam));
|
||||||
|
if (NULL == *ppRes) {
|
||||||
|
return TSDB_CODE_OUT_OF_MEMORY;
|
||||||
|
}
|
||||||
|
if (pChild) {
|
||||||
|
(*ppRes)->pChildren = taosArrayInit(1, POINTER_BYTES);
|
||||||
|
if (NULL == *ppRes) {
|
||||||
|
return TSDB_CODE_OUT_OF_MEMORY;
|
||||||
|
}
|
||||||
|
if (NULL == taosArrayPush((*ppRes)->pChildren, &pChild)) {
|
||||||
|
return TSDB_CODE_OUT_OF_MEMORY;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
(*ppRes)->pChildren = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
SGcOperatorParam* pGc = taosMemoryMalloc(sizeof(SGcOperatorParam));
|
||||||
|
if (NULL == pGc) {
|
||||||
|
return TSDB_CODE_OUT_OF_MEMORY;
|
||||||
|
}
|
||||||
|
|
||||||
|
pGc->sessionId = atomic_add_fetch_64(&gSessionId, 1);
|
||||||
|
pGc->downstreamIdx = downstreamIdx;
|
||||||
|
pGc->vgId = vgId;
|
||||||
|
pGc->tbUid = tbUid;
|
||||||
|
pGc->needCache = needCache;
|
||||||
|
|
||||||
|
(*ppRes)->opType = QUERY_NODE_PHYSICAL_PLAN_GROUP_CACHE;
|
||||||
|
(*ppRes)->downstreamIdx = downstreamIdx;
|
||||||
|
(*ppRes)->value = pGc;
|
||||||
|
|
||||||
|
return TSDB_CODE_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static int32_t buildGroupCacheNotifyOperatorParam(SOperatorParam** ppRes, int32_t downstreamIdx, int32_t vgId, int64_t tbUid) {
|
||||||
|
*ppRes = taosMemoryMalloc(sizeof(SOperatorParam));
|
||||||
|
if (NULL == *ppRes) {
|
||||||
|
return TSDB_CODE_OUT_OF_MEMORY;
|
||||||
|
}
|
||||||
|
(*ppRes)->pChildren = NULL;
|
||||||
|
|
||||||
|
SGcNotifyOperatorParam* pGc = taosMemoryMalloc(sizeof(SGcNotifyOperatorParam));
|
||||||
|
if (NULL == pGc) {
|
||||||
|
return TSDB_CODE_OUT_OF_MEMORY;
|
||||||
|
}
|
||||||
|
|
||||||
|
pGc->downstreamIdx = downstreamIdx;
|
||||||
|
pGc->vgId = vgId;
|
||||||
|
pGc->tbUid = tbUid;
|
||||||
|
|
||||||
|
(*ppRes)->opType = QUERY_NODE_PHYSICAL_PLAN_GROUP_CACHE;
|
||||||
|
(*ppRes)->downstreamIdx = downstreamIdx;
|
||||||
|
(*ppRes)->value = pGc;
|
||||||
|
|
||||||
|
return TSDB_CODE_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static int32_t buildExchangeOperatorParam(SOperatorParam** ppRes, int32_t downstreamIdx, int32_t* pVgId, int64_t* pUid) {
|
||||||
|
*ppRes = taosMemoryMalloc(sizeof(SOperatorParam));
|
||||||
|
if (NULL == *ppRes) {
|
||||||
|
return TSDB_CODE_OUT_OF_MEMORY;
|
||||||
|
}
|
||||||
|
(*ppRes)->pChildren = NULL;
|
||||||
|
|
||||||
|
SExchangeOperatorParam* pExc = taosMemoryMalloc(sizeof(SExchangeOperatorParam));
|
||||||
|
if (NULL == pExc) {
|
||||||
|
return TSDB_CODE_OUT_OF_MEMORY;
|
||||||
|
}
|
||||||
|
|
||||||
|
pExc->multiParams = false;
|
||||||
|
pExc->basic.vgId = *pVgId;
|
||||||
|
pExc->basic.tableSeq = true;
|
||||||
|
pExc->basic.srcOpType = QUERY_NODE_PHYSICAL_PLAN_TABLE_SCAN;
|
||||||
|
pExc->basic.uidList = taosArrayInit(1, sizeof(int64_t));
|
||||||
|
if (NULL == pExc->basic.uidList) {
|
||||||
|
taosMemoryFree(pExc);
|
||||||
|
return TSDB_CODE_OUT_OF_MEMORY;
|
||||||
|
}
|
||||||
|
taosArrayPush(pExc->basic.uidList, pUid);
|
||||||
|
|
||||||
|
(*ppRes)->opType = QUERY_NODE_PHYSICAL_PLAN_EXCHANGE;
|
||||||
|
(*ppRes)->downstreamIdx = downstreamIdx;
|
||||||
|
(*ppRes)->value = pExc;
|
||||||
|
|
||||||
|
return TSDB_CODE_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static int32_t buildBatchExchangeOperatorParam(SOperatorParam** ppRes, int32_t downstreamIdx, SSHashObj* pVg) {
|
||||||
|
*ppRes = taosMemoryMalloc(sizeof(SOperatorParam));
|
||||||
|
if (NULL == *ppRes) {
|
||||||
|
return TSDB_CODE_OUT_OF_MEMORY;
|
||||||
|
}
|
||||||
|
(*ppRes)->pChildren = NULL;
|
||||||
|
|
||||||
|
SExchangeOperatorBatchParam* pExc = taosMemoryMalloc(sizeof(SExchangeOperatorBatchParam));
|
||||||
|
if (NULL == pExc) {
|
||||||
|
return TSDB_CODE_OUT_OF_MEMORY;
|
||||||
|
}
|
||||||
|
|
||||||
|
pExc->multiParams = true;
|
||||||
|
pExc->pBatchs = tSimpleHashInit(tSimpleHashGetSize(pVg), taosGetDefaultHashFunction(TSDB_DATA_TYPE_INT));
|
||||||
|
if (NULL == pExc->pBatchs) {
|
||||||
|
taosMemoryFree(pExc);
|
||||||
|
return TSDB_CODE_OUT_OF_MEMORY;
|
||||||
|
}
|
||||||
|
tSimpleHashSetFreeFp(pExc->pBatchs, freeExchangeGetBasicOperatorParam);
|
||||||
|
|
||||||
|
SExchangeOperatorBasicParam basic;
|
||||||
|
basic.srcOpType = QUERY_NODE_PHYSICAL_PLAN_TABLE_SCAN;
|
||||||
|
|
||||||
|
int32_t iter = 0;
|
||||||
|
void* p = NULL;
|
||||||
|
while (p = tSimpleHashIterate(pVg, p, &iter)) {
|
||||||
|
int32_t* pVgId = tSimpleHashGetKey(p, NULL);
|
||||||
|
SArray* pUidList = *(SArray**)p;
|
||||||
|
basic.vgId = *pVgId;
|
||||||
|
basic.uidList = pUidList;
|
||||||
|
basic.tableSeq = false;
|
||||||
|
|
||||||
|
tSimpleHashPut(pExc->pBatchs, pVgId, sizeof(*pVgId), &basic, sizeof(basic));
|
||||||
|
|
||||||
|
qTrace("build downstreamIdx %d batch scan, vgId:%d, uidNum:%" PRId64, downstreamIdx, *pVgId, (int64_t)taosArrayGetSize(pUidList));
|
||||||
|
*(SArray**)p = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
(*ppRes)->opType = QUERY_NODE_PHYSICAL_PLAN_EXCHANGE;
|
||||||
|
(*ppRes)->downstreamIdx = downstreamIdx;
|
||||||
|
(*ppRes)->value = pExc;
|
||||||
|
|
||||||
|
return TSDB_CODE_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static int32_t buildMergeJoinOperatorParam(SOperatorParam** ppRes, bool initParam, SOperatorParam* pChild0, SOperatorParam* pChild1) {
|
||||||
|
*ppRes = taosMemoryMalloc(sizeof(SOperatorParam));
|
||||||
|
if (NULL == *ppRes) {
|
||||||
|
return TSDB_CODE_OUT_OF_MEMORY;
|
||||||
|
}
|
||||||
|
(*ppRes)->pChildren = taosArrayInit(2, POINTER_BYTES);
|
||||||
|
if (NULL == *ppRes) {
|
||||||
|
return TSDB_CODE_OUT_OF_MEMORY;
|
||||||
|
}
|
||||||
|
if (NULL == taosArrayPush((*ppRes)->pChildren, &pChild0)) {
|
||||||
|
return TSDB_CODE_OUT_OF_MEMORY;
|
||||||
|
}
|
||||||
|
if (NULL == taosArrayPush((*ppRes)->pChildren, &pChild1)) {
|
||||||
|
return TSDB_CODE_OUT_OF_MEMORY;
|
||||||
|
}
|
||||||
|
|
||||||
|
SSortMergeJoinOperatorParam* pJoin = taosMemoryMalloc(sizeof(SSortMergeJoinOperatorParam));
|
||||||
|
if (NULL == pJoin) {
|
||||||
|
return TSDB_CODE_OUT_OF_MEMORY;
|
||||||
|
}
|
||||||
|
|
||||||
|
pJoin->initDownstreamNum = initParam ? 2 : 0;
|
||||||
|
|
||||||
|
(*ppRes)->opType = QUERY_NODE_PHYSICAL_PLAN_MERGE_JOIN;
|
||||||
|
(*ppRes)->value = pJoin;
|
||||||
|
|
||||||
|
return TSDB_CODE_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static int32_t buildMergeJoinNotifyOperatorParam(SOperatorParam** ppRes, SOperatorParam* pChild0, SOperatorParam* pChild1) {
|
||||||
|
*ppRes = taosMemoryMalloc(sizeof(SOperatorParam));
|
||||||
|
if (NULL == *ppRes) {
|
||||||
|
return TSDB_CODE_OUT_OF_MEMORY;
|
||||||
|
}
|
||||||
|
(*ppRes)->pChildren = taosArrayInit(2, POINTER_BYTES);
|
||||||
|
if (NULL == *ppRes) {
|
||||||
|
return TSDB_CODE_OUT_OF_MEMORY;
|
||||||
|
}
|
||||||
|
if (pChild0 && NULL == taosArrayPush((*ppRes)->pChildren, &pChild0)) {
|
||||||
|
return TSDB_CODE_OUT_OF_MEMORY;
|
||||||
|
}
|
||||||
|
if (pChild1 && NULL == taosArrayPush((*ppRes)->pChildren, &pChild1)) {
|
||||||
|
return TSDB_CODE_OUT_OF_MEMORY;
|
||||||
|
}
|
||||||
|
|
||||||
|
(*ppRes)->opType = QUERY_NODE_PHYSICAL_PLAN_MERGE_JOIN;
|
||||||
|
(*ppRes)->value = NULL;
|
||||||
|
|
||||||
|
return TSDB_CODE_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
static int32_t buildBatchTableScanOperatorParam(SOperatorParam** ppRes, int32_t downstreamIdx, SSHashObj* pVg) {
|
||||||
int32_t code = TSDB_CODE_SUCCESS;
|
int32_t code = TSDB_CODE_SUCCESS;
|
||||||
int32_t vgNum = tSimpleHashGetSize(pVg);
|
int32_t vgNum = tSimpleHashGetSize(pVg);
|
||||||
if (vgNum <= 0 || vgNum > 1) {
|
if (vgNum <= 0 || vgNum > 1) {
|
||||||
|
@ -325,13 +357,14 @@ static FORCE_INLINE int32_t buildBatchTableScanOperatorParam(SOperatorParam** pp
|
||||||
if (code) {
|
if (code) {
|
||||||
return code;
|
return code;
|
||||||
}
|
}
|
||||||
|
*(SArray**)p = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static FORCE_INLINE int32_t buildSingleTableScanOperatorParam(SOperatorParam** ppRes, int32_t downstreamIdx, int32_t* pVgId, int64_t* pUid) {
|
static int32_t buildSingleTableScanOperatorParam(SOperatorParam** ppRes, int32_t downstreamIdx, int32_t* pVgId, int64_t* pUid) {
|
||||||
SArray* pUidList = taosArrayInit(1, sizeof(int64_t));
|
SArray* pUidList = taosArrayInit(1, sizeof(int64_t));
|
||||||
if (NULL == pUidList) {
|
if (NULL == pUidList) {
|
||||||
return TSDB_CODE_OUT_OF_MEMORY;
|
return TSDB_CODE_OUT_OF_MEMORY;
|
||||||
|
|
|
@ -382,6 +382,7 @@ void doDestroyExchangeOperatorInfo(void* param) {
|
||||||
taosArrayDestroyEx(pExInfo->pRecycledBlocks, freeBlock);
|
taosArrayDestroyEx(pExInfo->pRecycledBlocks, freeBlock);
|
||||||
|
|
||||||
blockDataDestroy(pExInfo->pDummyBlock);
|
blockDataDestroy(pExInfo->pDummyBlock);
|
||||||
|
tSimpleHashCleanup(pExInfo->pHashSources);
|
||||||
|
|
||||||
tsem_destroy(&pExInfo->ready);
|
tsem_destroy(&pExInfo->ready);
|
||||||
taosMemoryFreeClear(param);
|
taosMemoryFreeClear(param);
|
||||||
|
@ -438,11 +439,14 @@ int32_t buildTableScanOperatorParam(SOperatorParam** ppRes, SArray* pUidList, in
|
||||||
|
|
||||||
STableScanOperatorParam* pScan = taosMemoryMalloc(sizeof(STableScanOperatorParam));
|
STableScanOperatorParam* pScan = taosMemoryMalloc(sizeof(STableScanOperatorParam));
|
||||||
if (NULL == pScan) {
|
if (NULL == pScan) {
|
||||||
|
taosMemoryFreeClear(*ppRes);
|
||||||
return TSDB_CODE_OUT_OF_MEMORY;
|
return TSDB_CODE_OUT_OF_MEMORY;
|
||||||
}
|
}
|
||||||
|
|
||||||
pScan->pUidList = taosArrayDup(pUidList, NULL);
|
pScan->pUidList = taosArrayDup(pUidList, NULL);
|
||||||
if (NULL == pScan->pUidList) {
|
if (NULL == pScan->pUidList) {
|
||||||
|
taosMemoryFree(pScan);
|
||||||
|
taosMemoryFreeClear(*ppRes);
|
||||||
return TSDB_CODE_OUT_OF_MEMORY;
|
return TSDB_CODE_OUT_OF_MEMORY;
|
||||||
}
|
}
|
||||||
pScan->tableSeq = tableSeq;
|
pScan->tableSeq = tableSeq;
|
||||||
|
@ -500,6 +504,7 @@ int32_t doSendFetchDataRequest(SExchangeInfo* pExchangeInfo, SExecTaskInfo* pTas
|
||||||
if (msgSize < 0) {
|
if (msgSize < 0) {
|
||||||
pTaskInfo->code = TSDB_CODE_OUT_OF_MEMORY;
|
pTaskInfo->code = TSDB_CODE_OUT_OF_MEMORY;
|
||||||
taosMemoryFree(pWrapper);
|
taosMemoryFree(pWrapper);
|
||||||
|
freeOperatorParam(req.pOpParam, OP_GET_PARAM);
|
||||||
return pTaskInfo->code;
|
return pTaskInfo->code;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -507,6 +512,7 @@ int32_t doSendFetchDataRequest(SExchangeInfo* pExchangeInfo, SExecTaskInfo* pTas
|
||||||
if (NULL == msg) {
|
if (NULL == msg) {
|
||||||
pTaskInfo->code = TSDB_CODE_OUT_OF_MEMORY;
|
pTaskInfo->code = TSDB_CODE_OUT_OF_MEMORY;
|
||||||
taosMemoryFree(pWrapper);
|
taosMemoryFree(pWrapper);
|
||||||
|
freeOperatorParam(req.pOpParam, OP_GET_PARAM);
|
||||||
return pTaskInfo->code;
|
return pTaskInfo->code;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -514,9 +520,12 @@ int32_t doSendFetchDataRequest(SExchangeInfo* pExchangeInfo, SExecTaskInfo* pTas
|
||||||
pTaskInfo->code = TSDB_CODE_OUT_OF_MEMORY;
|
pTaskInfo->code = TSDB_CODE_OUT_OF_MEMORY;
|
||||||
taosMemoryFree(pWrapper);
|
taosMemoryFree(pWrapper);
|
||||||
taosMemoryFree(msg);
|
taosMemoryFree(msg);
|
||||||
|
freeOperatorParam(req.pOpParam, OP_GET_PARAM);
|
||||||
return pTaskInfo->code;
|
return pTaskInfo->code;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
freeOperatorParam(req.pOpParam, OP_GET_PARAM);
|
||||||
|
|
||||||
qDebug("%s build fetch msg and send to vgId:%d, ep:%s, taskId:0x%" PRIx64 ", execId:%d, %p, %d/%" PRIzu,
|
qDebug("%s build fetch msg and send to vgId:%d, ep:%s, taskId:0x%" PRIx64 ", execId:%d, %p, %d/%" PRIzu,
|
||||||
GET_TASKID(pTaskInfo), pSource->addr.nodeId, pSource->addr.epSet.eps[0].fqdn, pSource->taskId,
|
GET_TASKID(pTaskInfo), pSource->addr.nodeId, pSource->addr.epSet.eps[0].fqdn, pSource->taskId,
|
||||||
pSource->execId, pExchangeInfo, sourceIndex, totalSources);
|
pSource->execId, pExchangeInfo, sourceIndex, totalSources);
|
||||||
|
|
|
@ -502,10 +502,6 @@ bool qIsDynamicExecTask(qTaskInfo_t tinfo) {
|
||||||
return ((SExecTaskInfo*)tinfo)->dynamicTask;
|
return ((SExecTaskInfo*)tinfo)->dynamicTask;
|
||||||
}
|
}
|
||||||
|
|
||||||
void destroyOperatorParamValue(void* pValues) {
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
void destroyOperatorParam(SOperatorParam* pParam) {
|
void destroyOperatorParam(SOperatorParam* pParam) {
|
||||||
if (NULL == pParam) {
|
if (NULL == pParam) {
|
||||||
return;
|
return;
|
||||||
|
|
|
@ -1070,3 +1070,140 @@ void streamOpReloadState(SOperatorInfo* pOperator) {
|
||||||
downstream->fpSet.reloadStreamStateFn(downstream);
|
downstream->fpSet.reloadStreamStateFn(downstream);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void freeOperatorParamImpl(SOperatorParam* pParam, SOperatorParamType type) {
|
||||||
|
int32_t childrenNum = taosArrayGetSize(pParam->pChildren);
|
||||||
|
for (int32_t i = 0; i < childrenNum; ++i) {
|
||||||
|
SOperatorParam* pChild = taosArrayGetP(pParam->pChildren, i);
|
||||||
|
freeOperatorParam(pChild, type);
|
||||||
|
}
|
||||||
|
|
||||||
|
taosArrayDestroy(pParam->pChildren);
|
||||||
|
|
||||||
|
taosMemoryFree(pParam->value);
|
||||||
|
|
||||||
|
taosMemoryFree(pParam);
|
||||||
|
}
|
||||||
|
|
||||||
|
void freeExchangeGetBasicOperatorParam(void* pParam) {
|
||||||
|
SExchangeOperatorBasicParam* pBasic = (SExchangeOperatorBasicParam*)pParam;
|
||||||
|
taosArrayDestroy(pBasic->uidList);
|
||||||
|
}
|
||||||
|
|
||||||
|
void freeExchangeGetOperatorParam(SOperatorParam* pParam) {
|
||||||
|
SExchangeOperatorParam* pExcParam = (SExchangeOperatorParam*)pParam->value;
|
||||||
|
if (pExcParam->multiParams) {
|
||||||
|
SExchangeOperatorBatchParam* pExcBatch = (SExchangeOperatorBatchParam*)pParam->value;
|
||||||
|
tSimpleHashCleanup(pExcBatch->pBatchs);
|
||||||
|
} else {
|
||||||
|
freeExchangeGetBasicOperatorParam(&pExcParam->basic);
|
||||||
|
}
|
||||||
|
|
||||||
|
freeOperatorParamImpl(pParam, OP_GET_PARAM);
|
||||||
|
}
|
||||||
|
|
||||||
|
void freeExchangeNotifyOperatorParam(SOperatorParam* pParam) {
|
||||||
|
freeOperatorParamImpl(pParam, OP_NOTIFY_PARAM);
|
||||||
|
}
|
||||||
|
|
||||||
|
void freeGroupCacheGetOperatorParam(SOperatorParam* pParam) {
|
||||||
|
freeOperatorParamImpl(pParam, OP_GET_PARAM);
|
||||||
|
}
|
||||||
|
|
||||||
|
void freeGroupCacheNotifyOperatorParam(SOperatorParam* pParam) {
|
||||||
|
freeOperatorParamImpl(pParam, OP_NOTIFY_PARAM);
|
||||||
|
}
|
||||||
|
|
||||||
|
void freeMergeJoinGetOperatorParam(SOperatorParam* pParam) {
|
||||||
|
freeOperatorParamImpl(pParam, OP_GET_PARAM);
|
||||||
|
}
|
||||||
|
|
||||||
|
void freeMergeJoinNotifyOperatorParam(SOperatorParam* pParam) {
|
||||||
|
freeOperatorParamImpl(pParam, OP_NOTIFY_PARAM);
|
||||||
|
}
|
||||||
|
|
||||||
|
void freeTableScanGetOperatorParam(SOperatorParam* pParam) {
|
||||||
|
STableScanOperatorParam* pTableScanParam = (STableScanOperatorParam*)pParam->value;
|
||||||
|
taosArrayDestroy(pTableScanParam->pUidList);
|
||||||
|
freeOperatorParamImpl(pParam, OP_GET_PARAM);
|
||||||
|
}
|
||||||
|
|
||||||
|
void freeTableScanNotifyOperatorParam(SOperatorParam* pParam) {
|
||||||
|
freeOperatorParamImpl(pParam, OP_NOTIFY_PARAM);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void freeOperatorParam(SOperatorParam* pParam, SOperatorParamType type) {
|
||||||
|
if (NULL == pParam) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
switch (pParam->opType) {
|
||||||
|
case QUERY_NODE_PHYSICAL_PLAN_EXCHANGE:
|
||||||
|
type == OP_GET_PARAM ? freeExchangeGetOperatorParam(pParam) : freeExchangeNotifyOperatorParam(pParam);
|
||||||
|
break;
|
||||||
|
case QUERY_NODE_PHYSICAL_PLAN_GROUP_CACHE:
|
||||||
|
type == OP_GET_PARAM ? freeGroupCacheGetOperatorParam(pParam) : freeGroupCacheNotifyOperatorParam(pParam);
|
||||||
|
break;
|
||||||
|
case QUERY_NODE_PHYSICAL_PLAN_MERGE_JOIN:
|
||||||
|
type == OP_GET_PARAM ? freeMergeJoinGetOperatorParam(pParam) : freeMergeJoinNotifyOperatorParam(pParam);
|
||||||
|
break;
|
||||||
|
case QUERY_NODE_PHYSICAL_PLAN_TABLE_SCAN:
|
||||||
|
type == OP_GET_PARAM ? freeTableScanGetOperatorParam(pParam) : freeTableScanNotifyOperatorParam(pParam);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
qError("unsupported op %d param, type %d", pParam->opType, type);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void freeResetOperatorParams(struct SOperatorInfo* pOperator, SOperatorParamType type, bool allFree) {
|
||||||
|
SOperatorParam** ppParam = NULL;
|
||||||
|
SOperatorParam*** pppDownstramParam = NULL;
|
||||||
|
switch (type) {
|
||||||
|
case OP_GET_PARAM:
|
||||||
|
ppParam = &pOperator->pOperatorGetParam;
|
||||||
|
pppDownstramParam = &pOperator->pDownstreamGetParams;
|
||||||
|
break;
|
||||||
|
case OP_NOTIFY_PARAM:
|
||||||
|
ppParam = &pOperator->pOperatorNotifyParam;
|
||||||
|
pppDownstramParam = &pOperator->pDownstreamNotifyParams;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (*ppParam) {
|
||||||
|
freeOperatorParam(*ppParam, type);
|
||||||
|
*ppParam = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (*pppDownstramParam) {
|
||||||
|
for (int32_t i = 0; i < pOperator->numOfDownstream; ++i) {
|
||||||
|
if ((*pppDownstramParam)[i]) {
|
||||||
|
freeOperatorParam((*pppDownstramParam)[i], type);
|
||||||
|
(*pppDownstramParam)[i] = NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (allFree) {
|
||||||
|
taosMemoryFreeClear(*pppDownstramParam);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
FORCE_INLINE SSDataBlock* getNextBlockFromDownstreamImpl(struct SOperatorInfo* pOperator, int32_t idx, bool clearParam) {
|
||||||
|
if (pOperator->pDownstreamGetParams && pOperator->pDownstreamGetParams[idx]) {
|
||||||
|
qDebug("DynOp: op %s start to get block from downstream %s", pOperator->name, pOperator->pDownstream[idx]->name);
|
||||||
|
SSDataBlock* pBlock = pOperator->pDownstream[idx]->fpSet.getNextExtFn(pOperator->pDownstream[idx], pOperator->pDownstreamGetParams[idx]);
|
||||||
|
if (clearParam) {
|
||||||
|
freeOperatorParam(pOperator->pDownstreamGetParams[idx], OP_GET_PARAM);
|
||||||
|
pOperator->pDownstreamGetParams[idx] = NULL;
|
||||||
|
}
|
||||||
|
return pBlock;
|
||||||
|
}
|
||||||
|
|
||||||
|
return pOperator->pDownstream[idx]->fpSet.getNextFn(pOperator->pDownstream[idx]);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -73,15 +73,85 @@ static int32_t initGroupColsInfo(SGroupColsInfo* pCols, bool grpColsMayBeNull, S
|
||||||
}
|
}
|
||||||
|
|
||||||
static void logGroupCacheExecInfo(SGroupCacheOperatorInfo* pGrpCacheOperator) {
|
static void logGroupCacheExecInfo(SGroupCacheOperatorInfo* pGrpCacheOperator) {
|
||||||
char* buf = taosMemoryMalloc(pGrpCacheOperator->execInfo.downstreamNum * 32 + 100);
|
char* buf = taosMemoryMalloc(pGrpCacheOperator->downstreamNum * 32 + 100);
|
||||||
if (NULL == buf) {
|
if (NULL == buf) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
int32_t offset = sprintf(buf, "groupCache exec info, downstreamBlkNum:");
|
int32_t offset = sprintf(buf, "groupCache exec info, downstreamBlkNum:");
|
||||||
for (int32_t i = 0; i < pGrpCacheOperator->execInfo.downstreamNum; ++i) {
|
for (int32_t i = 0; i < pGrpCacheOperator->downstreamNum; ++i) {
|
||||||
offset += sprintf(buf + offset, " %" PRId64 , pGrpCacheOperator->execInfo.pDownstreamBlkNum[i]);
|
offset += sprintf(buf + offset, " %" PRId64 , pGrpCacheOperator->execInfo.pDownstreamBlkNum[i]);
|
||||||
}
|
}
|
||||||
qDebug("%s", buf);
|
qDebug("%s", buf);
|
||||||
|
taosMemoryFree(buf);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void freeSGcSessionCtx(void* p) {
|
||||||
|
SGcSessionCtx* pSession = p;
|
||||||
|
if (pSession->semInit) {
|
||||||
|
tsem_destroy(&pSession->waitSem);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void freeSGroupCacheFileInfo(void* p) {
|
||||||
|
SGroupCacheFileInfo* pFileInfo = p;
|
||||||
|
if (pFileInfo->deleted) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
removeGroupCacheFile(pFileInfo);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void freeSGcFileCacheCtx(SGcFileCacheCtx* pFileCtx) {
|
||||||
|
taosHashCleanup(pFileCtx->pCacheFile);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void freeSGcVgroupCtx(void* p) {
|
||||||
|
SGcVgroupCtx* pVgCtx = p;
|
||||||
|
taosArrayDestroy(pVgCtx->pTbList);
|
||||||
|
freeSGcFileCacheCtx(&pVgCtx->fileCtx);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void freeGcBlockInList(void* p) {
|
||||||
|
SSDataBlock** ppBlock = p;
|
||||||
|
if (*ppBlock) {
|
||||||
|
taosArrayDestroy((*ppBlock)->pDataBlock);
|
||||||
|
taosMemoryFree(*ppBlock);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void freeSGcDownstreamCtx(SGcDownstreamCtx* pCtx) {
|
||||||
|
taosArrayDestroy(pCtx->pNewGrpList);
|
||||||
|
tSimpleHashCleanup(pCtx->pVgTbHash);
|
||||||
|
taosHashCleanup(pCtx->pGrpHash);
|
||||||
|
|
||||||
|
taosArrayDestroyEx(pCtx->pFreeBlock, freeGcBlockInList);
|
||||||
|
taosHashCleanup(pCtx->pSessions);
|
||||||
|
taosHashCleanup(pCtx->pWaitSessions);
|
||||||
|
freeSGcFileCacheCtx(&pCtx->fileCtx);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void destroyGroupCacheDownstreamCtx(SGroupCacheOperatorInfo* pGrpCacheOperator) {
|
||||||
|
if (NULL == pGrpCacheOperator->pDownstreams) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (int32_t i = 0; i < pGrpCacheOperator->downstreamNum; ++i) {
|
||||||
|
SGcDownstreamCtx* pCtx = &pGrpCacheOperator->pDownstreams[i];
|
||||||
|
freeSGcDownstreamCtx(pCtx);
|
||||||
|
}
|
||||||
|
|
||||||
|
taosMemoryFree(pGrpCacheOperator->pDownstreams);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void destroySGcBlkCacheInfo(SGcBlkCacheInfo* pBlkCache) {
|
||||||
|
taosHashCleanup(pBlkCache->pDirtyBlk);
|
||||||
|
|
||||||
|
void* p = NULL;
|
||||||
|
while (p = taosHashIterate(pBlkCache->pReadBlk, p)) {
|
||||||
|
freeGcBlockInList(p);
|
||||||
|
}
|
||||||
|
|
||||||
|
taosHashCleanup(pBlkCache->pReadBlk);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void destroyGroupCacheOperator(void* param) {
|
static void destroyGroupCacheOperator(void* param) {
|
||||||
|
@ -91,8 +161,13 @@ static void destroyGroupCacheOperator(void* param) {
|
||||||
|
|
||||||
taosMemoryFree(pGrpCacheOperator->groupColsInfo.pColsInfo);
|
taosMemoryFree(pGrpCacheOperator->groupColsInfo.pColsInfo);
|
||||||
taosMemoryFree(pGrpCacheOperator->groupColsInfo.pBuf);
|
taosMemoryFree(pGrpCacheOperator->groupColsInfo.pBuf);
|
||||||
|
|
||||||
|
destroyGroupCacheDownstreamCtx(pGrpCacheOperator);
|
||||||
|
destroySGcBlkCacheInfo(&pGrpCacheOperator->blkCache);
|
||||||
taosHashCleanup(pGrpCacheOperator->pGrpHash);
|
taosHashCleanup(pGrpCacheOperator->pGrpHash);
|
||||||
|
|
||||||
|
taosMemoryFree(pGrpCacheOperator->execInfo.pDownstreamBlkNum);
|
||||||
|
|
||||||
taosMemoryFreeClear(param);
|
taosMemoryFreeClear(param);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -117,6 +192,7 @@ static int32_t acquireFdFromFileCtx(SGcFileCacheCtx* pFileCtx, int32_t fileId, S
|
||||||
if (NULL == pFileCtx->pCacheFile) {
|
if (NULL == pFileCtx->pCacheFile) {
|
||||||
return TSDB_CODE_OUT_OF_MEMORY;
|
return TSDB_CODE_OUT_OF_MEMORY;
|
||||||
}
|
}
|
||||||
|
taosHashSetFreeFp(pFileCtx->pCacheFile, freeSGroupCacheFileInfo);
|
||||||
}
|
}
|
||||||
|
|
||||||
SGroupCacheFileInfo* pTmp = taosHashGet(pFileCtx->pCacheFile, &fileId, sizeof(fileId));
|
SGroupCacheFileInfo* pTmp = taosHashGet(pFileCtx->pCacheFile, &fileId, sizeof(fileId));
|
||||||
|
@ -622,6 +698,7 @@ static int32_t addFileRefTableNum(SGcFileCacheCtx* pFileCtx, int32_t fileId, int
|
||||||
if (NULL == pFileCtx->pCacheFile) {
|
if (NULL == pFileCtx->pCacheFile) {
|
||||||
return TSDB_CODE_OUT_OF_MEMORY;
|
return TSDB_CODE_OUT_OF_MEMORY;
|
||||||
}
|
}
|
||||||
|
taosHashSetFreeFp(pFileCtx->pCacheFile, freeSGroupCacheFileInfo);
|
||||||
}
|
}
|
||||||
|
|
||||||
SGroupCacheFileInfo* pTmp = taosHashGet(pFileCtx->pCacheFile, &fileId, sizeof(fileId));
|
SGroupCacheFileInfo* pTmp = taosHashGet(pFileCtx->pCacheFile, &fileId, sizeof(fileId));
|
||||||
|
@ -1091,7 +1168,6 @@ static int32_t getBlkFromGroupCache(struct SOperatorInfo* pOperator, SSDataBlock
|
||||||
|
|
||||||
static int32_t initGroupCacheExecInfo(SOperatorInfo* pOperator) {
|
static int32_t initGroupCacheExecInfo(SOperatorInfo* pOperator) {
|
||||||
SGroupCacheOperatorInfo* pInfo = pOperator->info;
|
SGroupCacheOperatorInfo* pInfo = pOperator->info;
|
||||||
pInfo->execInfo.downstreamNum = pOperator->numOfDownstream;
|
|
||||||
pInfo->execInfo.pDownstreamBlkNum = taosMemoryCalloc(pOperator->numOfDownstream, sizeof(int64_t));
|
pInfo->execInfo.pDownstreamBlkNum = taosMemoryCalloc(pOperator->numOfDownstream, sizeof(int64_t));
|
||||||
if (NULL == pInfo->execInfo.pDownstreamBlkNum) {
|
if (NULL == pInfo->execInfo.pDownstreamBlkNum) {
|
||||||
return TSDB_CODE_OUT_OF_MEMORY;
|
return TSDB_CODE_OUT_OF_MEMORY;
|
||||||
|
@ -1127,6 +1203,7 @@ static void freeRemoveGroupCacheData(void* p) {
|
||||||
|
|
||||||
taosArrayDestroy(pGroup->waitQueue);
|
taosArrayDestroy(pGroup->waitQueue);
|
||||||
taosArrayDestroy(pGroup->blkList.pList);
|
taosArrayDestroy(pGroup->blkList.pList);
|
||||||
|
taosThreadMutexDestroy(&pGroup->mutex);
|
||||||
|
|
||||||
qTrace("group removed");
|
qTrace("group removed");
|
||||||
}
|
}
|
||||||
|
@ -1139,6 +1216,7 @@ static int32_t initGroupCacheDownstreamCtx(SOperatorInfo* pOperator) {
|
||||||
if (NULL == pInfo->pDownstreams) {
|
if (NULL == pInfo->pDownstreams) {
|
||||||
return TSDB_CODE_OUT_OF_MEMORY;
|
return TSDB_CODE_OUT_OF_MEMORY;
|
||||||
}
|
}
|
||||||
|
pInfo->downstreamNum = pOperator->numOfDownstream;
|
||||||
|
|
||||||
for (int32_t i = 0; i < pOperator->numOfDownstream; ++i) {
|
for (int32_t i = 0; i < pOperator->numOfDownstream; ++i) {
|
||||||
SGcDownstreamCtx* pCtx = &pInfo->pDownstreams[i];
|
SGcDownstreamCtx* pCtx = &pInfo->pDownstreams[i];
|
||||||
|
@ -1149,6 +1227,8 @@ static int32_t initGroupCacheDownstreamCtx(SOperatorInfo* pOperator) {
|
||||||
if (NULL == pCtx->pVgTbHash) {
|
if (NULL == pCtx->pVgTbHash) {
|
||||||
return TSDB_CODE_OUT_OF_MEMORY;
|
return TSDB_CODE_OUT_OF_MEMORY;
|
||||||
}
|
}
|
||||||
|
tSimpleHashSetFreeFp(pCtx->pVgTbHash, freeSGcVgroupCtx);
|
||||||
|
|
||||||
if (pInfo->batchFetch) {
|
if (pInfo->batchFetch) {
|
||||||
int32_t defaultVg = 0;
|
int32_t defaultVg = 0;
|
||||||
SGcVgroupCtx vgCtx = {0};
|
SGcVgroupCtx vgCtx = {0};
|
||||||
|
@ -1172,6 +1252,7 @@ static int32_t initGroupCacheDownstreamCtx(SOperatorInfo* pOperator) {
|
||||||
if (pCtx->pSessions == NULL) {
|
if (pCtx->pSessions == NULL) {
|
||||||
return TSDB_CODE_OUT_OF_MEMORY;
|
return TSDB_CODE_OUT_OF_MEMORY;
|
||||||
}
|
}
|
||||||
|
taosHashSetFreeFp(pCtx->pSessions, freeSGcSessionCtx);
|
||||||
|
|
||||||
pCtx->pFreeBlock = taosArrayInit(10, POINTER_BYTES);
|
pCtx->pFreeBlock = taosArrayInit(10, POINTER_BYTES);
|
||||||
if (NULL == pCtx->pFreeBlock) {
|
if (NULL == pCtx->pFreeBlock) {
|
||||||
|
@ -1234,7 +1315,7 @@ SOperatorInfo* createGroupCacheOperatorInfo(SOperatorInfo** pDownstream, int32_t
|
||||||
|
|
||||||
setOperatorInfo(pOperator, "GroupCacheOperator", QUERY_NODE_PHYSICAL_PLAN_GROUP_CACHE, false, OP_NOT_OPENED, pInfo, pTaskInfo);
|
setOperatorInfo(pOperator, "GroupCacheOperator", QUERY_NODE_PHYSICAL_PLAN_GROUP_CACHE, false, OP_NOT_OPENED, pInfo, pTaskInfo);
|
||||||
|
|
||||||
pInfo->maxCacheSize = 1;
|
pInfo->maxCacheSize = 0;
|
||||||
pInfo->grpByUid = pPhyciNode->grpByUid;
|
pInfo->grpByUid = pPhyciNode->grpByUid;
|
||||||
pInfo->globalGrp = pPhyciNode->globalGrp;
|
pInfo->globalGrp = pPhyciNode->globalGrp;
|
||||||
pInfo->batchFetch = pPhyciNode->batchFetch;
|
pInfo->batchFetch = pPhyciNode->batchFetch;
|
||||||
|
|
|
@ -301,10 +301,15 @@ SOperatorInfo* createMergeJoinOperatorInfo(SOperatorInfo** pDownstream, int32_t
|
||||||
pInfo->rightBuildTable = tSimpleHashInit(256, hashFn);
|
pInfo->rightBuildTable = tSimpleHashInit(256, hashFn);
|
||||||
}
|
}
|
||||||
pOperator->fpSet = createOperatorFpSet(optrDummyOpenFn, doMergeJoin, NULL, destroyMergeJoinOperator, optrDefaultBufFn, NULL, optrDefaultGetNextExtFn, NULL);
|
pOperator->fpSet = createOperatorFpSet(optrDummyOpenFn, doMergeJoin, NULL, destroyMergeJoinOperator, optrDefaultBufFn, NULL, optrDefaultGetNextExtFn, NULL);
|
||||||
|
|
||||||
code = appendDownstream(pOperator, pDownstream, numOfDownstream);
|
code = appendDownstream(pOperator, pDownstream, numOfDownstream);
|
||||||
if (code != TSDB_CODE_SUCCESS) {
|
if (code != TSDB_CODE_SUCCESS) {
|
||||||
goto _error;
|
goto _error;
|
||||||
}
|
}
|
||||||
|
if (newDownstreams) {
|
||||||
|
taosMemoryFree(pDownstream);
|
||||||
|
}
|
||||||
|
|
||||||
pOperator->numOfRealDownstream = newDownstreams ? 1 : 2;
|
pOperator->numOfRealDownstream = newDownstreams ? 1 : 2;
|
||||||
|
|
||||||
return pOperator;
|
return pOperator;
|
||||||
|
@ -449,7 +454,7 @@ static int32_t mergeJoinGetDownStreamRowsEqualTimeStamp(SOperatorInfo* pOperator
|
||||||
mergeJoinGetBlockRowsEqualTs(dataBlock, tsSlotId, startPos, timestamp, &endPos, rowLocations, createdBlocks);
|
mergeJoinGetBlockRowsEqualTs(dataBlock, tsSlotId, startPos, timestamp, &endPos, rowLocations, createdBlocks);
|
||||||
while (endPos == dataBlock->info.rows) {
|
while (endPos == dataBlock->info.rows) {
|
||||||
SOperatorInfo* ds = pOperator->pDownstream[whichChild];
|
SOperatorInfo* ds = pOperator->pDownstream[whichChild];
|
||||||
dataBlock = getNextBlockFromDownstream(pOperator, whichChild);
|
dataBlock = getNextBlockFromDownstreamRemain(pOperator, whichChild);
|
||||||
qError("merge join %s got block for same ts, rows:%" PRId64, whichChild == 0 ? "left" : "right", dataBlock ? dataBlock->info.rows : 0);
|
qError("merge join %s got block for same ts, rows:%" PRId64, whichChild == 0 ? "left" : "right", dataBlock ? dataBlock->info.rows : 0);
|
||||||
if (whichChild == 0) {
|
if (whichChild == 0) {
|
||||||
pJoinInfo->leftPos = 0;
|
pJoinInfo->leftPos = 0;
|
||||||
|
@ -648,6 +653,8 @@ static int32_t mergeJoinJoinDownstreamTsRanges(SOperatorInfo* pOperator, int64_t
|
||||||
|
|
||||||
static void setMergeJoinDone(SOperatorInfo* pOperator) {
|
static void setMergeJoinDone(SOperatorInfo* pOperator) {
|
||||||
pOperator->status = OP_EXEC_DONE;
|
pOperator->status = OP_EXEC_DONE;
|
||||||
|
freeOperatorParam(pOperator->pDownstreamGetParams[0], OP_GET_PARAM);
|
||||||
|
freeOperatorParam(pOperator->pDownstreamGetParams[1], OP_GET_PARAM);
|
||||||
pOperator->pDownstreamGetParams[0] = NULL;
|
pOperator->pDownstreamGetParams[0] = NULL;
|
||||||
pOperator->pDownstreamGetParams[1] = NULL;
|
pOperator->pDownstreamGetParams[1] = NULL;
|
||||||
}
|
}
|
||||||
|
@ -658,7 +665,7 @@ static bool mergeJoinGetNextTimestamp(SOperatorInfo* pOperator, int64_t* pLeftTs
|
||||||
|
|
||||||
if (pJoinInfo->pLeft == NULL || pJoinInfo->leftPos >= pJoinInfo->pLeft->info.rows) {
|
if (pJoinInfo->pLeft == NULL || pJoinInfo->leftPos >= pJoinInfo->pLeft->info.rows) {
|
||||||
if (!pJoinInfo->downstreamFetchDone[0]) {
|
if (!pJoinInfo->downstreamFetchDone[0]) {
|
||||||
pJoinInfo->pLeft = getNextBlockFromDownstream(pOperator, 0);
|
pJoinInfo->pLeft = getNextBlockFromDownstreamRemain(pOperator, 0);
|
||||||
|
|
||||||
pJoinInfo->leftPos = 0;
|
pJoinInfo->leftPos = 0;
|
||||||
qError("merge join left got block, rows:%" PRId64, pJoinInfo->pLeft ? pJoinInfo->pLeft->info.rows : 0);
|
qError("merge join left got block, rows:%" PRId64, pJoinInfo->pLeft ? pJoinInfo->pLeft->info.rows : 0);
|
||||||
|
@ -679,7 +686,7 @@ static bool mergeJoinGetNextTimestamp(SOperatorInfo* pOperator, int64_t* pLeftTs
|
||||||
|
|
||||||
if (pJoinInfo->pRight == NULL || pJoinInfo->rightPos >= pJoinInfo->pRight->info.rows) {
|
if (pJoinInfo->pRight == NULL || pJoinInfo->rightPos >= pJoinInfo->pRight->info.rows) {
|
||||||
if (!pJoinInfo->downstreamFetchDone[1]) {
|
if (!pJoinInfo->downstreamFetchDone[1]) {
|
||||||
pJoinInfo->pRight = getNextBlockFromDownstream(pOperator, 1);
|
pJoinInfo->pRight = getNextBlockFromDownstreamRemain(pOperator, 1);
|
||||||
|
|
||||||
if (pOperator->pOperatorGetParam && ((SSortMergeJoinOperatorParam*)pOperator->pOperatorGetParam->value)->initDownstreamNum > 0) {
|
if (pOperator->pOperatorGetParam && ((SSortMergeJoinOperatorParam*)pOperator->pOperatorGetParam->value)->initDownstreamNum > 0) {
|
||||||
((SSortMergeJoinOperatorParam*)pOperator->pOperatorGetParam->value)->initDownstreamNum--;
|
((SSortMergeJoinOperatorParam*)pOperator->pOperatorGetParam->value)->initDownstreamNum--;
|
||||||
|
|
|
@ -551,11 +551,15 @@ SOperatorInfo* createOperator(SPhysiNode* pPhyNode, SExecTaskInfo* pTaskInfo, SR
|
||||||
return pOptr;
|
return pOptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void destroyOperator(SOperatorInfo* pOperator) {
|
void destroyOperator(SOperatorInfo* pOperator) {
|
||||||
if (pOperator == NULL) {
|
if (pOperator == NULL) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
freeResetOperatorParams(pOperator, OP_GET_PARAM, true);
|
||||||
|
freeResetOperatorParams(pOperator, OP_NOTIFY_PARAM, true);
|
||||||
|
|
||||||
if (pOperator->fpSet.closeFn != NULL) {
|
if (pOperator->fpSet.closeFn != NULL) {
|
||||||
pOperator->fpSet.closeFn(pOperator->info);
|
pOperator->fpSet.closeFn(pOperator->info);
|
||||||
}
|
}
|
||||||
|
@ -626,9 +630,12 @@ int32_t mergeOperatorParams(SOperatorParam* pDst, SOperatorParam* pSrc) {
|
||||||
taosMemoryFree(pBatch);
|
taosMemoryFree(pBatch);
|
||||||
return TSDB_CODE_OUT_OF_MEMORY;
|
return TSDB_CODE_OUT_OF_MEMORY;
|
||||||
}
|
}
|
||||||
|
tSimpleHashSetFreeFp(pBatch->pBatchs, freeExchangeGetBasicOperatorParam);
|
||||||
|
|
||||||
tSimpleHashPut(pBatch->pBatchs, &pDExc->basic.vgId, sizeof(pDExc->basic.vgId), &pDExc->basic, sizeof(pDExc->basic));
|
tSimpleHashPut(pBatch->pBatchs, &pDExc->basic.vgId, sizeof(pDExc->basic.vgId), &pDExc->basic, sizeof(pDExc->basic));
|
||||||
tSimpleHashPut(pBatch->pBatchs, &pSExc->basic.vgId, sizeof(pSExc->basic.vgId), &pSExc->basic, sizeof(pSExc->basic));
|
tSimpleHashPut(pBatch->pBatchs, &pSExc->basic.vgId, sizeof(pSExc->basic.vgId), &pSExc->basic, sizeof(pSExc->basic));
|
||||||
destroyOperatorParamValue(pDst->value);
|
|
||||||
|
taosMemoryFree(pDst->value);
|
||||||
pDst->value = pBatch;
|
pDst->value = pBatch;
|
||||||
} else {
|
} else {
|
||||||
taosArrayAddAll(pDExc->basic.uidList, pSExc->basic.uidList);
|
taosArrayAddAll(pDExc->basic.uidList, pSExc->basic.uidList);
|
||||||
|
@ -669,9 +676,9 @@ int32_t setOperatorParams(struct SOperatorInfo* pOperator, SOperatorParam* pInpu
|
||||||
return TSDB_CODE_INVALID_PARA;
|
return TSDB_CODE_INVALID_PARA;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
freeResetOperatorParams(pOperator, type, false);
|
||||||
|
|
||||||
if (NULL == pInput) {
|
if (NULL == pInput) {
|
||||||
*ppParam = NULL;
|
|
||||||
taosMemoryFreeClear(*pppDownstramParam);
|
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -710,31 +717,19 @@ int32_t setOperatorParams(struct SOperatorInfo* pOperator, SOperatorParam* pInpu
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
taosArrayClear((*ppParam)->pChildren);
|
taosArrayDestroy((*ppParam)->pChildren);
|
||||||
|
(*ppParam)->pChildren = NULL;
|
||||||
|
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
SSDataBlock* getNextBlockFromDownstreamImpl(struct SOperatorInfo* pOperator, int32_t idx, bool clearParam) {
|
|
||||||
if (pOperator->pDownstreamGetParams && pOperator->pDownstreamGetParams[idx]) {
|
|
||||||
qDebug("DynOp: op %s start to get block from downstream %s", pOperator->name, pOperator->pDownstream[idx]->name);
|
|
||||||
SSDataBlock* pBlock = pOperator->pDownstream[idx]->fpSet.getNextExtFn(pOperator->pDownstream[idx], pOperator->pDownstreamGetParams[idx]);
|
|
||||||
if (clearParam) {
|
|
||||||
pOperator->pDownstreamGetParams[idx] = NULL;
|
|
||||||
}
|
|
||||||
return pBlock;
|
|
||||||
}
|
|
||||||
|
|
||||||
return pOperator->pDownstream[idx]->fpSet.getNextFn(pOperator->pDownstream[idx]);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
SSDataBlock* getNextBlockFromDownstream(struct SOperatorInfo* pOperator, int32_t idx) {
|
SSDataBlock* getNextBlockFromDownstream(struct SOperatorInfo* pOperator, int32_t idx) {
|
||||||
return getNextBlockFromDownstreamImpl(pOperator, idx, false);
|
return getNextBlockFromDownstreamImpl(pOperator, idx, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
SSDataBlock* getNextBlockFromDownstreamOnce(struct SOperatorInfo* pOperator, int32_t idx) {
|
SSDataBlock* getNextBlockFromDownstreamRemain(struct SOperatorInfo* pOperator, int32_t idx) {
|
||||||
return getNextBlockFromDownstreamImpl(pOperator, idx, true);
|
return getNextBlockFromDownstreamImpl(pOperator, idx, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -924,6 +924,7 @@ static SSDataBlock* doTableScan(SOperatorInfo* pOperator) {
|
||||||
if (pOperator->pOperatorGetParam) {
|
if (pOperator->pOperatorGetParam) {
|
||||||
pOperator->dynamicTask = true;
|
pOperator->dynamicTask = true;
|
||||||
int32_t code = createTableListInfoFromParam(pOperator);
|
int32_t code = createTableListInfoFromParam(pOperator);
|
||||||
|
freeOperatorParam(pOperator->pOperatorGetParam, OP_GET_PARAM);
|
||||||
pOperator->pOperatorGetParam = NULL;
|
pOperator->pOperatorGetParam = NULL;
|
||||||
if (code != TSDB_CODE_SUCCESS) {
|
if (code != TSDB_CODE_SUCCESS) {
|
||||||
pTaskInfo->code = code;
|
pTaskInfo->code = code;
|
||||||
|
|
|
@ -992,9 +992,11 @@ static int32_t createGroupCachePhysiNode(SPhysiPlanContext* pCxt, SNodeList* pCh
|
||||||
pGrpCache->batchFetch = pLogicNode->batchFetch;
|
pGrpCache->batchFetch = pLogicNode->batchFetch;
|
||||||
SDataBlockDescNode* pChildDesc = ((SPhysiNode*)nodesListGetNode(pChildren, 0))->pOutputDataBlockDesc;
|
SDataBlockDescNode* pChildDesc = ((SPhysiNode*)nodesListGetNode(pChildren, 0))->pOutputDataBlockDesc;
|
||||||
int32_t code = TSDB_CODE_SUCCESS;
|
int32_t code = TSDB_CODE_SUCCESS;
|
||||||
|
/*
|
||||||
if (TSDB_CODE_SUCCESS == code) {
|
if (TSDB_CODE_SUCCESS == code) {
|
||||||
code = setListSlotId(pCxt, pChildDesc->dataBlockId, -1, pLogicNode->pGroupCols, &pGrpCache->pGroupCols);
|
code = setListSlotId(pCxt, pChildDesc->dataBlockId, -1, pLogicNode->pGroupCols, &pGrpCache->pGroupCols);
|
||||||
}
|
}
|
||||||
|
*/
|
||||||
|
|
||||||
if (TSDB_CODE_SUCCESS == code) {
|
if (TSDB_CODE_SUCCESS == code) {
|
||||||
*pPhyNode = (SPhysiNode*)pGrpCache;
|
*pPhyNode = (SPhysiNode*)pGrpCache;
|
||||||
|
|
Loading…
Reference in New Issue