fix mem leak and invalid read/write found by valgrind
This commit is contained in:
parent
db474b2078
commit
40fc4b6cf3
|
@ -117,6 +117,7 @@ int tfileWriterFinish(TFileWriter* tw);
|
||||||
|
|
||||||
//
|
//
|
||||||
IndexTFile* indexTFileCreate(const char* path);
|
IndexTFile* indexTFileCreate(const char* path);
|
||||||
|
void indexTFileDestroy(IndexTFile* tfile);
|
||||||
int indexTFilePut(void* tfile, SIndexTerm* term, uint64_t uid);
|
int indexTFilePut(void* tfile, SIndexTerm* term, uint64_t uid);
|
||||||
int indexTFileSearch(void* tfile, SIndexTermQuery* query, SArray* result);
|
int indexTFileSearch(void* tfile, SIndexTermQuery* query, SArray* result);
|
||||||
|
|
||||||
|
|
|
@ -103,6 +103,7 @@ void indexClose(SIndex* sIdx) {
|
||||||
}
|
}
|
||||||
taosHashCleanup(sIdx->colObj);
|
taosHashCleanup(sIdx->colObj);
|
||||||
pthread_mutex_destroy(&sIdx->mtx);
|
pthread_mutex_destroy(&sIdx->mtx);
|
||||||
|
indexTFileDestroy(sIdx->tindex);
|
||||||
#endif
|
#endif
|
||||||
free(sIdx->path);
|
free(sIdx->path);
|
||||||
free(sIdx);
|
free(sIdx);
|
||||||
|
@ -479,7 +480,7 @@ void iterateValueDestroy(IterateValue* value, bool destroy) {
|
||||||
} else {
|
} else {
|
||||||
if (value->val != NULL) { taosArrayClear(value->val); }
|
if (value->val != NULL) { taosArrayClear(value->val); }
|
||||||
}
|
}
|
||||||
// free(value->colVal);
|
free(value->colVal);
|
||||||
value->colVal = NULL;
|
value->colVal = NULL;
|
||||||
}
|
}
|
||||||
static int indexGenTFile(SIndex* sIdx, IndexCache* cache, SArray* batch) {
|
static int indexGenTFile(SIndex* sIdx, IndexCache* cache, SArray* batch) {
|
||||||
|
|
|
@ -150,6 +150,7 @@ Iterate* indexCacheIteratorCreate(IndexCache* cache) {
|
||||||
|
|
||||||
MemTable* tbl = cache->imm;
|
MemTable* tbl = cache->imm;
|
||||||
iiter->val.val = taosArrayInit(1, sizeof(uint64_t));
|
iiter->val.val = taosArrayInit(1, sizeof(uint64_t));
|
||||||
|
iiter->val.colVal = NULL;
|
||||||
iiter->iter = tbl != NULL ? tSkipListCreateIter(tbl->mem) : NULL;
|
iiter->iter = tbl != NULL ? tSkipListCreateIter(tbl->mem) : NULL;
|
||||||
iiter->next = indexCacheIteratorNext;
|
iiter->next = indexCacheIteratorNext;
|
||||||
iiter->getValue = indexCacheIteratorGetValue;
|
iiter->getValue = indexCacheIteratorGetValue;
|
||||||
|
|
|
@ -1062,6 +1062,7 @@ Output fstEmptyFinalOutput(Fst* fst, bool* null) {
|
||||||
} else {
|
} else {
|
||||||
*null = true;
|
*null = true;
|
||||||
}
|
}
|
||||||
|
fstNodeDestroy(node);
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1286,6 +1287,7 @@ StreamWithStateResult* streamWithStateNextWith(StreamWithState* sws, StreamCallb
|
||||||
StreamWithStateResult* result = swsResultCreate(&slice, fOutput, tState);
|
StreamWithStateResult* result = swsResultCreate(&slice, fOutput, tState);
|
||||||
free(buf);
|
free(buf);
|
||||||
fstSliceDestroy(&slice);
|
fstSliceDestroy(&slice);
|
||||||
|
taosArrayDestroy(nodes);
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
free(buf);
|
free(buf);
|
||||||
|
|
|
@ -360,7 +360,7 @@ IndexTFile* indexTFileCreate(const char* path) {
|
||||||
tfile->cache = tfileCacheCreate(path);
|
tfile->cache = tfileCacheCreate(path);
|
||||||
return tfile;
|
return tfile;
|
||||||
}
|
}
|
||||||
void IndexTFileDestroy(IndexTFile* tfile) {
|
void indexTFileDestroy(IndexTFile* tfile) {
|
||||||
tfileCacheDestroy(tfile->cache);
|
tfileCacheDestroy(tfile->cache);
|
||||||
free(tfile);
|
free(tfile);
|
||||||
}
|
}
|
||||||
|
@ -415,7 +415,7 @@ static bool tfileIteratorNext(Iterate* iiter) {
|
||||||
static IterateValue* tifileIterateGetValue(Iterate* iter) { return &iter->val; }
|
static IterateValue* tifileIterateGetValue(Iterate* iter) { return &iter->val; }
|
||||||
|
|
||||||
static TFileFstIter* tfileFstIteratorCreate(TFileReader* reader) {
|
static TFileFstIter* tfileFstIteratorCreate(TFileReader* reader) {
|
||||||
TFileFstIter* tIter = calloc(1, sizeof(Iterate));
|
TFileFstIter* tIter = calloc(1, sizeof(TFileFstIter));
|
||||||
if (tIter == NULL) { return NULL; }
|
if (tIter == NULL) { return NULL; }
|
||||||
|
|
||||||
tIter->ctx = automCtxCreate(NULL, AUTOMATION_ALWAYS);
|
tIter->ctx = automCtxCreate(NULL, AUTOMATION_ALWAYS);
|
||||||
|
@ -437,6 +437,7 @@ Iterate* tfileIteratorCreate(TFileReader* reader) {
|
||||||
iter->next = tfileIteratorNext;
|
iter->next = tfileIteratorNext;
|
||||||
iter->getValue = tifileIterateGetValue;
|
iter->getValue = tifileIterateGetValue;
|
||||||
iter->val.val = taosArrayInit(1, sizeof(uint64_t));
|
iter->val.val = taosArrayInit(1, sizeof(uint64_t));
|
||||||
|
iter->val.colVal = NULL;
|
||||||
return iter;
|
return iter;
|
||||||
}
|
}
|
||||||
void tfileIteratorDestroy(Iterate* iter) {
|
void tfileIteratorDestroy(Iterate* iter) {
|
||||||
|
@ -449,6 +450,7 @@ void tfileIteratorDestroy(Iterate* iter) {
|
||||||
streamWithStateDestroy(tIter->st);
|
streamWithStateDestroy(tIter->st);
|
||||||
fstStreamBuilderDestroy(tIter->fb);
|
fstStreamBuilderDestroy(tIter->fb);
|
||||||
automCtxDestroy(tIter->ctx);
|
automCtxDestroy(tIter->ctx);
|
||||||
|
free(tIter);
|
||||||
|
|
||||||
free(iter);
|
free(iter);
|
||||||
}
|
}
|
||||||
|
@ -482,7 +484,7 @@ static int tfileValueCompare(const void* a, const void* b, const void* param) {
|
||||||
TFileValue* tfileValueCreate(char* val) {
|
TFileValue* tfileValueCreate(char* val) {
|
||||||
TFileValue* tf = calloc(1, sizeof(TFileValue));
|
TFileValue* tf = calloc(1, sizeof(TFileValue));
|
||||||
if (tf == NULL) { return NULL; }
|
if (tf == NULL) { return NULL; }
|
||||||
tf->colVal = val;
|
tf->colVal = tstrdup(val);
|
||||||
tf->tableId = taosArrayInit(32, sizeof(uint64_t));
|
tf->tableId = taosArrayInit(32, sizeof(uint64_t));
|
||||||
return tf;
|
return tf;
|
||||||
}
|
}
|
||||||
|
@ -493,6 +495,7 @@ int tfileValuePush(TFileValue* tf, uint64_t val) {
|
||||||
}
|
}
|
||||||
void tfileValueDestroy(TFileValue* tf) {
|
void tfileValueDestroy(TFileValue* tf) {
|
||||||
taosArrayDestroy(tf->tableId);
|
taosArrayDestroy(tf->tableId);
|
||||||
|
free(tf->colVal);
|
||||||
free(tf);
|
free(tf);
|
||||||
}
|
}
|
||||||
static void tfileSerialTableIdsToBuf(char* buf, SArray* ids) {
|
static void tfileSerialTableIdsToBuf(char* buf, SArray* ids) {
|
||||||
|
|
|
@ -457,7 +457,10 @@ TEST_F(IndexTFileEnv, test_tfile_write) {
|
||||||
// taosArrayPush(data, &v4);
|
// taosArrayPush(data, &v4);
|
||||||
|
|
||||||
fObj->Put(data);
|
fObj->Put(data);
|
||||||
for (size_t i = 0; i < taosArrayGetSize(data); i++) { destroyTFileValue(taosArrayGetP(data, i)); }
|
for (size_t i = 0; i < taosArrayGetSize(data); i++) {
|
||||||
|
// data
|
||||||
|
destroyTFileValue(taosArrayGetP(data, i));
|
||||||
|
}
|
||||||
taosArrayDestroy(data);
|
taosArrayDestroy(data);
|
||||||
|
|
||||||
std::string colName("voltage");
|
std::string colName("voltage");
|
||||||
|
@ -470,6 +473,7 @@ TEST_F(IndexTFileEnv, test_tfile_write) {
|
||||||
fObj->Get(&query, result);
|
fObj->Get(&query, result);
|
||||||
assert(taosArrayGetSize(result) == 200);
|
assert(taosArrayGetSize(result) == 200);
|
||||||
indexTermDestroy(term);
|
indexTermDestroy(term);
|
||||||
|
taosArrayDestroy(result);
|
||||||
|
|
||||||
// tfileWriterDestroy(twrite);
|
// tfileWriterDestroy(twrite);
|
||||||
}
|
}
|
||||||
|
@ -534,6 +538,7 @@ TEST_F(IndexCacheEnv, cache_test) {
|
||||||
SIndexTerm* term = indexTermCreate(0, ADD_VALUE, TSDB_DATA_TYPE_BINARY, colName.c_str(), colName.size(),
|
SIndexTerm* term = indexTermCreate(0, ADD_VALUE, TSDB_DATA_TYPE_BINARY, colName.c_str(), colName.size(),
|
||||||
colVal.c_str(), colVal.size());
|
colVal.c_str(), colVal.size());
|
||||||
coj->Put(term, colId, version++, suid++);
|
coj->Put(term, colId, version++, suid++);
|
||||||
|
indexTermDestroy(term);
|
||||||
// indexTermDestry(term);
|
// indexTermDestry(term);
|
||||||
}
|
}
|
||||||
{
|
{
|
||||||
|
@ -541,24 +546,28 @@ TEST_F(IndexCacheEnv, cache_test) {
|
||||||
SIndexTerm* term = indexTermCreate(0, ADD_VALUE, TSDB_DATA_TYPE_BINARY, colName.c_str(), colName.size(),
|
SIndexTerm* term = indexTermCreate(0, ADD_VALUE, TSDB_DATA_TYPE_BINARY, colName.c_str(), colName.size(),
|
||||||
colVal.c_str(), colVal.size());
|
colVal.c_str(), colVal.size());
|
||||||
coj->Put(term, colId, version++, suid++);
|
coj->Put(term, colId, version++, suid++);
|
||||||
|
indexTermDestroy(term);
|
||||||
}
|
}
|
||||||
{
|
{
|
||||||
std::string colVal("v2");
|
std::string colVal("v2");
|
||||||
SIndexTerm* term = indexTermCreate(0, ADD_VALUE, TSDB_DATA_TYPE_BINARY, colName.c_str(), colName.size(),
|
SIndexTerm* term = indexTermCreate(0, ADD_VALUE, TSDB_DATA_TYPE_BINARY, colName.c_str(), colName.size(),
|
||||||
colVal.c_str(), colVal.size());
|
colVal.c_str(), colVal.size());
|
||||||
coj->Put(term, colId, version++, suid++);
|
coj->Put(term, colId, version++, suid++);
|
||||||
|
indexTermDestroy(term);
|
||||||
}
|
}
|
||||||
{
|
{
|
||||||
std::string colVal("v3");
|
std::string colVal("v3");
|
||||||
SIndexTerm* term = indexTermCreate(0, ADD_VALUE, TSDB_DATA_TYPE_BINARY, colName.c_str(), colName.size(),
|
SIndexTerm* term = indexTermCreate(0, ADD_VALUE, TSDB_DATA_TYPE_BINARY, colName.c_str(), colName.size(),
|
||||||
colVal.c_str(), colVal.size());
|
colVal.c_str(), colVal.size());
|
||||||
coj->Put(term, colId, version++, suid++);
|
coj->Put(term, colId, version++, suid++);
|
||||||
|
indexTermDestroy(term);
|
||||||
}
|
}
|
||||||
{
|
{
|
||||||
std::string colVal("v3");
|
std::string colVal("v3");
|
||||||
SIndexTerm* term = indexTermCreate(0, ADD_VALUE, TSDB_DATA_TYPE_BINARY, colName.c_str(), colName.size(),
|
SIndexTerm* term = indexTermCreate(0, ADD_VALUE, TSDB_DATA_TYPE_BINARY, colName.c_str(), colName.size(),
|
||||||
colVal.c_str(), colVal.size());
|
colVal.c_str(), colVal.size());
|
||||||
coj->Put(term, colId, version++, suid++);
|
coj->Put(term, colId, version++, suid++);
|
||||||
|
indexTermDestroy(term);
|
||||||
}
|
}
|
||||||
coj->Debug();
|
coj->Debug();
|
||||||
std::cout << "--------first----------" << std::endl;
|
std::cout << "--------first----------" << std::endl;
|
||||||
|
@ -567,12 +576,14 @@ TEST_F(IndexCacheEnv, cache_test) {
|
||||||
SIndexTerm* term = indexTermCreate(0, ADD_VALUE, TSDB_DATA_TYPE_BINARY, colName.c_str(), colName.size(),
|
SIndexTerm* term = indexTermCreate(0, ADD_VALUE, TSDB_DATA_TYPE_BINARY, colName.c_str(), colName.size(),
|
||||||
colVal.c_str(), colVal.size());
|
colVal.c_str(), colVal.size());
|
||||||
coj->Put(term, othColId, version++, suid++);
|
coj->Put(term, othColId, version++, suid++);
|
||||||
|
indexTermDestroy(term);
|
||||||
}
|
}
|
||||||
{
|
{
|
||||||
std::string colVal("v4");
|
std::string colVal("v4");
|
||||||
SIndexTerm* term = indexTermCreate(0, ADD_VALUE, TSDB_DATA_TYPE_BINARY, colName.c_str(), colName.size(),
|
SIndexTerm* term = indexTermCreate(0, ADD_VALUE, TSDB_DATA_TYPE_BINARY, colName.c_str(), colName.size(),
|
||||||
colVal.c_str(), colVal.size());
|
colVal.c_str(), colVal.size());
|
||||||
coj->Put(term, othColId, version++, suid++);
|
coj->Put(term, othColId, version++, suid++);
|
||||||
|
indexTermDestroy(term);
|
||||||
}
|
}
|
||||||
coj->Debug();
|
coj->Debug();
|
||||||
std::cout << "--------second----------" << std::endl;
|
std::cout << "--------second----------" << std::endl;
|
||||||
|
@ -583,6 +594,7 @@ TEST_F(IndexCacheEnv, cache_test) {
|
||||||
SIndexTerm* term = indexTermCreate(0, ADD_VALUE, TSDB_DATA_TYPE_BINARY, colName.c_str(), colName.size(),
|
SIndexTerm* term = indexTermCreate(0, ADD_VALUE, TSDB_DATA_TYPE_BINARY, colName.c_str(), colName.size(),
|
||||||
colVal.c_str(), colVal.size());
|
colVal.c_str(), colVal.size());
|
||||||
coj->Put(term, colId, version++, suid++);
|
coj->Put(term, colId, version++, suid++);
|
||||||
|
indexTermDestroy(term);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
coj->Debug();
|
coj->Debug();
|
||||||
|
@ -598,6 +610,9 @@ TEST_F(IndexCacheEnv, cache_test) {
|
||||||
coj->Get(&query, colId, 10000, ret, &valType);
|
coj->Get(&query, colId, 10000, ret, &valType);
|
||||||
std::cout << "size : " << taosArrayGetSize(ret) << std::endl;
|
std::cout << "size : " << taosArrayGetSize(ret) << std::endl;
|
||||||
assert(taosArrayGetSize(ret) == 4);
|
assert(taosArrayGetSize(ret) == 4);
|
||||||
|
taosArrayDestroy(ret);
|
||||||
|
|
||||||
|
indexTermDestroy(term);
|
||||||
}
|
}
|
||||||
{
|
{
|
||||||
std::string colVal("v2");
|
std::string colVal("v2");
|
||||||
|
@ -609,6 +624,9 @@ TEST_F(IndexCacheEnv, cache_test) {
|
||||||
|
|
||||||
coj->Get(&query, colId, 10000, ret, &valType);
|
coj->Get(&query, colId, 10000, ret, &valType);
|
||||||
assert(taosArrayGetSize(ret) == 1);
|
assert(taosArrayGetSize(ret) == 1);
|
||||||
|
taosArrayDestroy(ret);
|
||||||
|
|
||||||
|
indexTermDestroy(term);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
class IndexObj {
|
class IndexObj {
|
||||||
|
@ -678,13 +696,16 @@ class IndexObj {
|
||||||
|
|
||||||
SArray* result = (SArray*)taosArrayInit(1, sizeof(uint64_t));
|
SArray* result = (SArray*)taosArrayInit(1, sizeof(uint64_t));
|
||||||
if (Search(mq, result) == 0) { std::cout << "search one successfully" << std::endl; }
|
if (Search(mq, result) == 0) { std::cout << "search one successfully" << std::endl; }
|
||||||
return taosArrayGetSize(result);
|
int sz = taosArrayGetSize(result);
|
||||||
|
indexMultiTermQueryDestroy(mq);
|
||||||
|
taosArrayDestroy(result);
|
||||||
|
return sz;
|
||||||
// assert(taosArrayGetSize(result) == targetSize);
|
// assert(taosArrayGetSize(result) == targetSize);
|
||||||
}
|
}
|
||||||
void PutOne(const std::string& colName, const std::string& colVal) {
|
void PutOne(const std::string& colName, const std::string& colVal) {
|
||||||
|
SIndexMultiTerm* terms = indexMultiTermCreate();
|
||||||
SIndexTerm* term = indexTermCreate(0, ADD_VALUE, TSDB_DATA_TYPE_BINARY, colName.c_str(), colName.size(),
|
SIndexTerm* term = indexTermCreate(0, ADD_VALUE, TSDB_DATA_TYPE_BINARY, colName.c_str(), colName.size(),
|
||||||
colVal.c_str(), colVal.size());
|
colVal.c_str(), colVal.size());
|
||||||
SIndexMultiTerm* terms = indexMultiTermCreate();
|
|
||||||
indexMultiTermAdd(terms, term);
|
indexMultiTermAdd(terms, term);
|
||||||
Put(terms, 10);
|
Put(terms, 10);
|
||||||
indexMultiTermDestroy(terms);
|
indexMultiTermDestroy(terms);
|
||||||
|
@ -783,6 +804,8 @@ TEST_F(IndexEnv2, testIndexOpen) {
|
||||||
index->Search(mq, result);
|
index->Search(mq, result);
|
||||||
std::cout << "target size: " << taosArrayGetSize(result) << std::endl;
|
std::cout << "target size: " << taosArrayGetSize(result) << std::endl;
|
||||||
assert(taosArrayGetSize(result) == 400);
|
assert(taosArrayGetSize(result) == 400);
|
||||||
|
taosArrayDestroy(result);
|
||||||
|
indexMultiTermQueryDestroy(mq);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue