From 83d8e3a5244d33d98ca612c6353d447fc0300fff Mon Sep 17 00:00:00 2001 From: xsren <285808407@qq.com> Date: Mon, 18 Sep 2023 13:46:29 +0800 Subject: [PATCH] mem exception handle --- include/common/tdataformat.h | 2 +- include/util/talgo.h | 3 ++- include/util/tarray.h | 2 +- source/common/src/tdataformat.c | 10 +++++++--- source/libs/executor/src/dataInserter.c | 4 ++-- source/libs/parser/src/parInsertUtil.c | 4 ++-- source/util/src/talgo.c | 10 +++++++--- source/util/src/tarray.c | 4 ++-- 8 files changed, 24 insertions(+), 15 deletions(-) diff --git a/include/common/tdataformat.h b/include/common/tdataformat.h index e04bdd1b07..aed1d03fc1 100644 --- a/include/common/tdataformat.h +++ b/include/common/tdataformat.h @@ -108,7 +108,7 @@ int32_t tBufferReserve(SBuffer *pBuffer, int64_t nData, void **ppData); int32_t tRowBuild(SArray *aColVal, const STSchema *pTSchema, SRow **ppRow); int32_t tRowGet(SRow *pRow, STSchema *pTSchema, int32_t iCol, SColVal *pColVal); void tRowDestroy(SRow *pRow); -void tRowSort(SArray *aRowP); +int32_t tRowSort(SArray *aRowP); int32_t tRowMerge(SArray *aRowP, STSchema *pTSchema, int8_t flag); int32_t tRowUpsertColData(SRow *pRow, STSchema *pTSchema, SColData *aColData, int32_t nColData, int32_t flag); diff --git a/include/util/talgo.h b/include/util/talgo.h index 675bb66431..b065ea3705 100644 --- a/include/util/talgo.h +++ b/include/util/talgo.h @@ -61,8 +61,9 @@ void taosqsort(void *src, int64_t numOfElem, int64_t size, const void *param, __ * @param numOfElem * @param size * @param comparFn + * @return int32_t 0 for success, other for failure. */ -void taosMergeSort(void *src, int64_t numOfElem, int64_t size, __compar_fn_t comparFn); +int32_t taosMergeSort(void *src, int64_t numOfElem, int64_t size, __compar_fn_t comparFn); /** * binary search, with range support diff --git a/include/util/tarray.h b/include/util/tarray.h index 17fc69cde5..e494f78f48 100644 --- a/include/util/tarray.h +++ b/include/util/tarray.h @@ -225,7 +225,7 @@ void taosArraySort(SArray* pArray, __compar_fn_t comparFn); * @param pArray * @param compar */ -void taosArrayMSort(SArray* pArray, __compar_fn_t comparFn); +int32_t taosArrayMSort(SArray* pArray, __compar_fn_t comparFn); /** * search the array diff --git a/source/common/src/tdataformat.c b/source/common/src/tdataformat.c index 1f754cd4b8..b4ca8d1b17 100644 --- a/source/common/src/tdataformat.c +++ b/source/common/src/tdataformat.c @@ -610,9 +610,13 @@ _exit: return code; } -void tRowSort(SArray *aRowP) { - if (TARRAY_SIZE(aRowP) <= 1) return; - taosArrayMSort(aRowP, tRowPCmprFn); +int32_t tRowSort(SArray *aRowP) { + if (TARRAY_SIZE(aRowP) <= 1) return 0; + int32_t code = taosArrayMSort(aRowP, tRowPCmprFn); + if (code != TSDB_CODE_SUCCESS) { + uError("taosArrayMSort failed caused by %d", code); + } + return code; } int32_t tRowMerge(SArray *aRowP, STSchema *pTSchema, int8_t flag) { diff --git a/source/libs/executor/src/dataInserter.c b/source/libs/executor/src/dataInserter.c index e47cbb7eba..f301ddf4be 100644 --- a/source/libs/executor/src/dataInserter.c +++ b/source/libs/executor/src/dataInserter.c @@ -289,8 +289,8 @@ int32_t buildSubmitReqFromBlock(SDataInserterHandle* pInserter, SSubmitReq2** pp } if (disorderTs) { - tRowSort(tbData.aRowP); - if ((terrno = tRowMerge(tbData.aRowP, (STSchema*)pTSchema, 0)) != 0) { + if ((tRowSort(tbData.aRowP) != TSDB_CODE_SUCCESS) || + (terrno = tRowMerge(tbData.aRowP, (STSchema*)pTSchema, 0)) != 0) { goto _end; } } diff --git a/source/libs/parser/src/parInsertUtil.c b/source/libs/parser/src/parInsertUtil.c index 79e305989b..3efb5dafcb 100644 --- a/source/libs/parser/src/parInsertUtil.c +++ b/source/libs/parser/src/parInsertUtil.c @@ -495,9 +495,9 @@ int32_t insMergeTableDataCxt(SHashObj* pTableHash, SArray** pVgDataBlocks) { tColDataSortMerge(pTableCxt->pData->aCol); } else { if (!pTableCxt->ordered) { - tRowSort(pTableCxt->pData->aRowP); + code = tRowSort(pTableCxt->pData->aRowP); } - if (!pTableCxt->ordered || pTableCxt->duplicateTs) { + if (code == TSDB_CODE_SUCCESS && (!pTableCxt->ordered || pTableCxt->duplicateTs)) { code = tRowMerge(pTableCxt->pData->aRowP, pTableCxt->pSchema, 0); } } diff --git a/source/util/src/talgo.c b/source/util/src/talgo.c index a39dd4cc99..8d83a70c11 100644 --- a/source/util/src/talgo.c +++ b/source/util/src/talgo.c @@ -312,10 +312,12 @@ static void taosMerge(void *src, int32_t start, int32_t leftend, int32_t end, in } } -static void taosMergeSortHelper(void *src, int64_t numOfElem, int64_t size, const void *param, __ext_compar_fn_t comparFn) { +static int32_t taosMergeSortHelper(void *src, int64_t numOfElem, int64_t size, const void *param, + __ext_compar_fn_t comparFn) { // short array sort, instead of merge sort process const int32_t THRESHOLD_SIZE = 6; char *buf = taosMemoryCalloc(1, size); // prepare the swap buffer + if (buf == NULL) return TSDB_CODE_OUT_OF_MEMORY; for (int32_t start = 0; start < numOfElem - 1; start += THRESHOLD_SIZE) { int32_t end = (start + THRESHOLD_SIZE - 1) <= numOfElem - 1 ? (start + THRESHOLD_SIZE - 1) : numOfElem - 1; tInsertSort(src, size, start, end, param, comparFn, buf); @@ -325,6 +327,7 @@ static void taosMergeSortHelper(void *src, int64_t numOfElem, int64_t size, cons if (numOfElem > THRESHOLD_SIZE) { int32_t currSize; void *tmp = taosMemoryMalloc(numOfElem * size); + if (tmp == NULL) return TSDB_CODE_OUT_OF_MEMORY; for (currSize = THRESHOLD_SIZE; currSize <= numOfElem - 1; currSize = 2 * currSize) { int32_t leftStart; @@ -340,6 +343,7 @@ static void taosMergeSortHelper(void *src, int64_t numOfElem, int64_t size, cons taosMemoryFreeClear(tmp); } + return 0; } int32_t msortHelper(const void *p1, const void *p2, const void *param) { @@ -348,7 +352,7 @@ int32_t msortHelper(const void *p1, const void *p2, const void *param) { } -void taosMergeSort(void *src, int64_t numOfElem, int64_t size, __compar_fn_t comparFn) { +int32_t taosMergeSort(void *src, int64_t numOfElem, int64_t size, __compar_fn_t comparFn) { void *param = comparFn; - taosMergeSortHelper(src, numOfElem, size, param, msortHelper); + return taosMergeSortHelper(src, numOfElem, size, param, msortHelper); } diff --git a/source/util/src/tarray.c b/source/util/src/tarray.c index 0a71061c52..a7c28df22b 100644 --- a/source/util/src/tarray.c +++ b/source/util/src/tarray.c @@ -417,8 +417,8 @@ void taosArraySort(SArray* pArray, __compar_fn_t compar) { taosSort(pArray->pData, pArray->size, pArray->elemSize, compar); } -void taosArrayMSort(SArray* pArray, __compar_fn_t compar) { - taosMergeSort(pArray->pData, pArray->size, pArray->elemSize, compar); +int32_t taosArrayMSort(SArray* pArray, __compar_fn_t compar) { + return taosMergeSort(pArray->pData, pArray->size, pArray->elemSize, compar); } void* taosArraySearch(const SArray* pArray, const void* key, __compar_fn_t comparFn, int32_t flags) {