From 13a2e4899b58892cdd16aeb3d3ff451c4b88ef24 Mon Sep 17 00:00:00 2001 From: zhihaop Date: Mon, 26 Sep 2022 13:28:35 +0800 Subject: [PATCH] fix: nTables != nBlocks because incorrect use of compareSName --- src/client/inc/tscBatchMerge.h | 2 +- src/client/src/tscBatchMerge.c | 46 +++++++++++++++++++--------------- src/client/src/tscBatchWrite.c | 1 + 3 files changed, 28 insertions(+), 21 deletions(-) diff --git a/src/client/inc/tscBatchMerge.h b/src/client/inc/tscBatchMerge.h index 0cfc7a9d5d..12fe66c9cf 100644 --- a/src/client/inc/tscBatchMerge.h +++ b/src/client/inc/tscBatchMerge.h @@ -68,7 +68,7 @@ typedef struct STableDataBlocksListBuilder { */ typedef struct STableNameListBuilder { // store the unsorted table names, SArray. - SArray* tableNames; + SArray* pTableNameList; } STableNameListBuilder; /** diff --git a/src/client/src/tscBatchMerge.c b/src/client/src/tscBatchMerge.c index c15f2fbb84..177de143f9 100644 --- a/src/client/src/tscBatchMerge.c +++ b/src/client/src/tscBatchMerge.c @@ -18,13 +18,13 @@ /** * A util function to compare two SName. */ -static int32_t compareSName(const void *x, const void *y) { - SName* left = *((SName **) x); - SName* right = *((SName **) y); +static int32_t compareSName(const void *left, const void *right) { if (left == right) { return 0; } - return strncmp((const char*) left, (const char*) right, sizeof(SName)); + SName* x = *(SName** ) left; + SName* y = *(SName** ) right; + return memcmp(x, y, sizeof(SName)); } /** @@ -67,21 +67,22 @@ inline static SSubmitBlkBuilder* computeIfAbsentSSubmitBlkBuilder(SSubmitMsgBloc return blocksBuilder; } -SName** buildSTableNameListBuilder(STableNameListBuilder* builder, size_t* numOfTables) { - if (!taosArrayGetSize(builder->tableNames)) { - *numOfTables = 0; +SName** buildSTableNameListBuilder(STableNameListBuilder* builder, size_t* nTables) { + if (!taosArrayGetSize(builder->pTableNameList)) { + *nTables = 0; return NULL; } // sort and unique. - taosArraySort(builder->tableNames, compareSName); + taosArraySort(builder->pTableNameList, compareSName); size_t tail = 0; - for (size_t i = 1; i < taosArrayGetSize(builder->tableNames); ++i) { - SName* last = taosArrayGetP(builder->tableNames, tail); - SName* current = taosArrayGetP(builder->tableNames, i); - if (compareSName(last, current) != 0) { + size_t nNames = taosArrayGetSize(builder->pTableNameList); + for (size_t i = 1; i < nNames; ++i) { + SName* last = taosArrayGetP(builder->pTableNameList, tail); + SName* current = taosArrayGetP(builder->pTableNameList, i); + if (memcmp(last, current, sizeof(SName)) != 0) { ++tail; - taosArraySet(builder->tableNames, tail, ¤t); + taosArraySet(builder->pTableNameList, tail, ¤t); } } @@ -97,11 +98,11 @@ SName** buildSTableNameListBuilder(STableNameListBuilder* builder, size_t* numOf if (!clone) { goto error; } - memcpy(clone, taosArrayGetP(builder->tableNames, i), sizeof(SName)); + memcpy(clone, taosArrayGetP(builder->pTableNameList, i), sizeof(SName)); tableNames[i] = clone; } - *numOfTables = tail + 1; + *nTables = tail + 1; return tableNames; error: @@ -437,8 +438,8 @@ STableNameListBuilder* createSTableNameListBuilder() { return NULL; } - builder->tableNames = taosArrayInit(1, sizeof(SName*)); - if (!builder->tableNames) { + builder->pTableNameList = taosArrayInit(1, sizeof(SName*)); + if (!builder->pTableNameList) { free(builder); return NULL; } @@ -450,12 +451,12 @@ void destroySTableNameListBuilder(STableNameListBuilder* builder) { if (!builder) { return; } - taosArrayDestroy(&builder->tableNames); + taosArrayDestroy(&builder->pTableNameList); free(builder); } bool insertSTableNameListBuilder(STableNameListBuilder* builder, SName* name) { - return taosArrayPush(builder->tableNames, &name); + return taosArrayPush(builder->pTableNameList, &name); } int32_t tscMergeSSqlObjs(SSqlObj** polls, size_t nPolls, SSqlObj* result) { @@ -525,7 +526,12 @@ int32_t tscMergeSSqlObjs(SSqlObj** polls, size_t nPolls, SSqlObj* result) { destroySTableNameListBuilder(nameListBuilder); return TSDB_CODE_TSC_OUT_OF_MEMORY; } - assert(nTables == nBlocks); + + if (nTables != nBlocks) { + destroySTableDataBlocksListBuilder(builder); + destroySTableNameListBuilder(nameListBuilder); + return TSDB_CODE_TSC_INVALID_OPERATION; + } // replace table name list. if (pInsertParam->pTableNameList) { diff --git a/src/client/src/tscBatchWrite.c b/src/client/src/tscBatchWrite.c index 258c913b84..d1b0f30937 100644 --- a/src/client/src/tscBatchWrite.c +++ b/src/client/src/tscBatchWrite.c @@ -497,6 +497,7 @@ SAsyncBatchWriteDispatcher* dispatcherAcquire(SDispatcherManager* manager) { } SAsyncBatchWriteDispatcher* value = pthread_getspecific(manager->key); + printf("acquire thread local"); if (value) { return value; } -- GitLab