fix: table scan crash issue
This commit is contained in:
parent
097723f446
commit
05bd600ef8
|
@ -155,6 +155,7 @@ typedef struct SBlockInfoBuf {
|
||||||
int32_t currentIndex;
|
int32_t currentIndex;
|
||||||
SArray* pData;
|
SArray* pData;
|
||||||
int32_t numPerBucket;
|
int32_t numPerBucket;
|
||||||
|
int32_t numOfTables;
|
||||||
} SBlockInfoBuf;
|
} SBlockInfoBuf;
|
||||||
|
|
||||||
struct STsdbReader {
|
struct STsdbReader {
|
||||||
|
@ -300,6 +301,47 @@ static int32_t initBlockScanInfoBuf(SBlockInfoBuf* pBuf, int32_t numOfTables) {
|
||||||
taosArrayPush(pBuf->pData, &p);
|
taosArrayPush(pBuf->pData, &p);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pBuf->numOfTables = numOfTables;
|
||||||
|
|
||||||
|
return TSDB_CODE_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int32_t ensureBlockScanInfoBuf(SBlockInfoBuf* pBuf, int32_t numOfTables) {
|
||||||
|
if (numOfTables <= pBuf->numOfTables) {
|
||||||
|
return TSDB_CODE_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (pBuf->numOfTables > 0) {
|
||||||
|
STableBlockScanInfo *p = (STableBlockScanInfo*)taosArrayPop(pBuf->pData);
|
||||||
|
taosMemoryFree(p);
|
||||||
|
pBuf->numOfTables /= pBuf->numPerBucket;
|
||||||
|
}
|
||||||
|
|
||||||
|
int32_t num = (numOfTables - pBuf->numOfTables) / pBuf->numPerBucket;
|
||||||
|
int32_t remainder = (numOfTables - pBuf->numOfTables) % pBuf->numPerBucket;
|
||||||
|
if (pBuf->pData == NULL) {
|
||||||
|
pBuf->pData = taosArrayInit(num + 1, POINTER_BYTES);
|
||||||
|
}
|
||||||
|
|
||||||
|
for (int32_t i = 0; i < num; ++i) {
|
||||||
|
char* p = taosMemoryCalloc(pBuf->numPerBucket, sizeof(STableBlockScanInfo));
|
||||||
|
if (p == NULL) {
|
||||||
|
return TSDB_CODE_OUT_OF_MEMORY;
|
||||||
|
}
|
||||||
|
|
||||||
|
taosArrayPush(pBuf->pData, &p);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (remainder > 0) {
|
||||||
|
char* p = taosMemoryCalloc(remainder, sizeof(STableBlockScanInfo));
|
||||||
|
if (p == NULL) {
|
||||||
|
return TSDB_CODE_OUT_OF_MEMORY;
|
||||||
|
}
|
||||||
|
taosArrayPush(pBuf->pData, &p);
|
||||||
|
}
|
||||||
|
|
||||||
|
pBuf->numOfTables = numOfTables;
|
||||||
|
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -3738,8 +3780,12 @@ int32_t tsdbSetTableList(STsdbReader* pReader, const void* pTableList, int32_t n
|
||||||
clearBlockScanInfo(*p);
|
clearBlockScanInfo(*p);
|
||||||
}
|
}
|
||||||
|
|
||||||
// todo handle the case where size is less than the value of num
|
if (size < num) {
|
||||||
ASSERT(size >= num);
|
int32_t code = ensureBlockScanInfoBuf(&pReader->blockInfoBuf, num);
|
||||||
|
if (code) {
|
||||||
|
return code;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
taosHashClear(pReader->status.pTableMap);
|
taosHashClear(pReader->status.pTableMap);
|
||||||
STableUidList* pUidList = &pReader->status.uidList;
|
STableUidList* pUidList = &pReader->status.uidList;
|
||||||
|
|
|
@ -179,7 +179,8 @@
|
||||||
,,y,script,./test.sh -f tsim/query/sys_tbname.sim
|
,,y,script,./test.sh -f tsim/query/sys_tbname.sim
|
||||||
,,y,script,./test.sh -f tsim/query/groupby.sim
|
,,y,script,./test.sh -f tsim/query/groupby.sim
|
||||||
,,y,script,./test.sh -f tsim/query/forceFill.sim
|
,,y,script,./test.sh -f tsim/query/forceFill.sim
|
||||||
,,n,script,./test.sh -f tsim/query/join.sim
|
,,y,script,./test.sh -f tsim/query/join.sim
|
||||||
|
,,y,script,./test.sh -f tsim/query/partitionby.sim
|
||||||
,,y,script,./test.sh -f tsim/qnode/basic1.sim
|
,,y,script,./test.sh -f tsim/qnode/basic1.sim
|
||||||
,,y,script,./test.sh -f tsim/snode/basic1.sim
|
,,y,script,./test.sh -f tsim/snode/basic1.sim
|
||||||
,,y,script,./test.sh -f tsim/mnode/basic1.sim
|
,,y,script,./test.sh -f tsim/mnode/basic1.sim
|
||||||
|
|
|
@ -0,0 +1,39 @@
|
||||||
|
system sh/stop_dnodes.sh
|
||||||
|
system sh/deploy.sh -n dnode1 -i 1
|
||||||
|
system sh/exec.sh -n dnode1 -s start
|
||||||
|
sql connect
|
||||||
|
|
||||||
|
$dbPrefix = db
|
||||||
|
$tbPrefix1 = tba
|
||||||
|
$tbPrefix2 = tbb
|
||||||
|
$mtPrefix = stb
|
||||||
|
$tbNum = 10
|
||||||
|
$rowNum = 2
|
||||||
|
|
||||||
|
print =============== step1
|
||||||
|
$i = 0
|
||||||
|
$db = $dbPrefix . $i
|
||||||
|
$mt1 = $mtPrefix . $i
|
||||||
|
$i = 1
|
||||||
|
$mt2 = $mtPrefix . $i
|
||||||
|
|
||||||
|
sql drop database $db -x step1
|
||||||
|
step1:
|
||||||
|
sql create database $db vgroups 3
|
||||||
|
sql use $db
|
||||||
|
sql create table $mt1 (ts timestamp, f1 int) TAGS(tag1 int, tag2 binary(500))
|
||||||
|
sql create table tb0 using $mt1 tags(0, 'a');
|
||||||
|
sql create table tb1 using $mt1 tags(1, 'b');
|
||||||
|
sql create table tb2 using $mt1 tags(1, 'a');
|
||||||
|
sql create table tb3 using $mt1 tags(1, 'a');
|
||||||
|
sql create table tb4 using $mt1 tags(3, 'b');
|
||||||
|
sql create table tb5 using $mt1 tags(3, 'a');
|
||||||
|
sql create table tb6 using $mt1 tags(3, 'b');
|
||||||
|
sql create table tb7 using $mt1 tags(3, 'b');
|
||||||
|
|
||||||
|
sql select * from $mt1 partition by tag1,tag2 limit 1;
|
||||||
|
if $rows != 0 then
|
||||||
|
return -1
|
||||||
|
endi
|
||||||
|
|
||||||
|
system sh/exec.sh -n dnode1 -s stop -x SIGINT
|
Loading…
Reference in New Issue