Merge branch '3.0' into feature/stream
This commit is contained in:
commit
320202e60e
|
@ -100,6 +100,8 @@ IF (TD_WINDOWS)
|
||||||
SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${COMMON_FLAGS}")
|
SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${COMMON_FLAGS}")
|
||||||
SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${COMMON_FLAGS}")
|
SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${COMMON_FLAGS}")
|
||||||
|
|
||||||
|
SET(JEMALLOC_ENABLED OFF)
|
||||||
|
|
||||||
ELSE ()
|
ELSE ()
|
||||||
IF (${TD_DARWIN})
|
IF (${TD_DARWIN})
|
||||||
set(CMAKE_MACOSX_RPATH 0)
|
set(CMAKE_MACOSX_RPATH 0)
|
||||||
|
|
|
@ -2,7 +2,7 @@
|
||||||
# taosadapter
|
# taosadapter
|
||||||
ExternalProject_Add(taosadapter
|
ExternalProject_Add(taosadapter
|
||||||
GIT_REPOSITORY https://github.com/taosdata/taosadapter.git
|
GIT_REPOSITORY https://github.com/taosdata/taosadapter.git
|
||||||
GIT_TAG cc43ef0
|
GIT_TAG a11131c
|
||||||
SOURCE_DIR "${TD_SOURCE_DIR}/tools/taosadapter"
|
SOURCE_DIR "${TD_SOURCE_DIR}/tools/taosadapter"
|
||||||
BINARY_DIR ""
|
BINARY_DIR ""
|
||||||
#BUILD_IN_SOURCE TRUE
|
#BUILD_IN_SOURCE TRUE
|
||||||
|
|
|
@ -2,7 +2,7 @@
|
||||||
# taos-tools
|
# taos-tools
|
||||||
ExternalProject_Add(taos-tools
|
ExternalProject_Add(taos-tools
|
||||||
GIT_REPOSITORY https://github.com/taosdata/taos-tools.git
|
GIT_REPOSITORY https://github.com/taosdata/taos-tools.git
|
||||||
GIT_TAG bc99376
|
GIT_TAG f9c1d32
|
||||||
SOURCE_DIR "${TD_SOURCE_DIR}/tools/taos-tools"
|
SOURCE_DIR "${TD_SOURCE_DIR}/tools/taos-tools"
|
||||||
BINARY_DIR ""
|
BINARY_DIR ""
|
||||||
#BUILD_IN_SOURCE TRUE
|
#BUILD_IN_SOURCE TRUE
|
||||||
|
|
|
@ -143,13 +143,6 @@ int32_t qGetQueryTableSchemaVersion(qTaskInfo_t tinfo, char* dbName, char* table
|
||||||
int32_t qExecTaskOpt(qTaskInfo_t tinfo, SArray* pResList, uint64_t* useconds, bool* hasMore, SLocalFetch* pLocal);
|
int32_t qExecTaskOpt(qTaskInfo_t tinfo, SArray* pResList, uint64_t* useconds, bool* hasMore, SLocalFetch* pLocal);
|
||||||
int32_t qExecTask(qTaskInfo_t tinfo, SSDataBlock** pBlock, uint64_t* useconds);
|
int32_t qExecTask(qTaskInfo_t tinfo, SSDataBlock** pBlock, uint64_t* useconds);
|
||||||
|
|
||||||
/**
|
|
||||||
* kill the ongoing query and free the query handle and corresponding resources automatically
|
|
||||||
* @param tinfo qhandle
|
|
||||||
* @return
|
|
||||||
*/
|
|
||||||
int32_t qKillTask(qTaskInfo_t tinfo);
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* kill the ongoing query asynchronously
|
* kill the ongoing query asynchronously
|
||||||
* @param tinfo qhandle
|
* @param tinfo qhandle
|
||||||
|
|
|
@ -38,7 +38,6 @@ extern "C" {
|
||||||
#define TARRAY_MIN_SIZE 8
|
#define TARRAY_MIN_SIZE 8
|
||||||
#define TARRAY_GET_ELEM(array, index) ((void*)((char*)((array)->pData) + (index) * (array)->elemSize))
|
#define TARRAY_GET_ELEM(array, index) ((void*)((char*)((array)->pData) + (index) * (array)->elemSize))
|
||||||
#define TARRAY_ELEM_IDX(array, ele) (POINTER_DISTANCE(ele, (array)->pData) / (array)->elemSize)
|
#define TARRAY_ELEM_IDX(array, ele) (POINTER_DISTANCE(ele, (array)->pData) / (array)->elemSize)
|
||||||
#define TARRAY_GET_START(array) ((array)->pData)
|
|
||||||
|
|
||||||
typedef struct SArray {
|
typedef struct SArray {
|
||||||
size_t size;
|
size_t size;
|
||||||
|
@ -71,14 +70,6 @@ int32_t taosArrayEnsureCap(SArray* pArray, size_t tsize);
|
||||||
*/
|
*/
|
||||||
void* taosArrayAddBatch(SArray* pArray, const void* pData, int32_t nEles);
|
void* taosArrayAddBatch(SArray* pArray, const void* pData, int32_t nEles);
|
||||||
|
|
||||||
/**
|
|
||||||
*
|
|
||||||
* @param pArray
|
|
||||||
* @param pData position array list
|
|
||||||
* @param numOfElems the number of removed position
|
|
||||||
*/
|
|
||||||
void taosArrayRemoveBatch(SArray* pArray, const int32_t* pData, int32_t numOfElems);
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
*
|
*
|
||||||
* @param pArray
|
* @param pArray
|
||||||
|
@ -266,13 +257,6 @@ void* taosArraySearch(const SArray* pArray, const void* key, __compar_fn_t compa
|
||||||
*/
|
*/
|
||||||
int32_t taosArraySearchIdx(const SArray* pArray, const void* key, __compar_fn_t comparFn, int32_t flags);
|
int32_t taosArraySearchIdx(const SArray* pArray, const void* key, __compar_fn_t comparFn, int32_t flags);
|
||||||
|
|
||||||
/**
|
|
||||||
* search the array
|
|
||||||
* @param pArray
|
|
||||||
* @param key
|
|
||||||
*/
|
|
||||||
char* taosArraySearchString(const SArray* pArray, const char* key, __compar_fn_t comparFn, int32_t flags);
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* sort the pointer data in the array
|
* sort the pointer data in the array
|
||||||
* @param pArray
|
* @param pArray
|
||||||
|
@ -286,8 +270,6 @@ void taosArraySortPWithExt(SArray* pArray, __ext_compar_fn_t fn, const void* par
|
||||||
int32_t taosEncodeArray(void** buf, const SArray* pArray, FEncode encode);
|
int32_t taosEncodeArray(void** buf, const SArray* pArray, FEncode encode);
|
||||||
void* taosDecodeArray(const void* buf, SArray** pArray, FDecode decode, int32_t dataSz);
|
void* taosDecodeArray(const void* buf, SArray** pArray, FDecode decode, int32_t dataSz);
|
||||||
|
|
||||||
char* taosShowStrArray(const SArray* pArray);
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* swap array
|
* swap array
|
||||||
* @param a
|
* @param a
|
||||||
|
@ -295,6 +277,7 @@ char* taosShowStrArray(const SArray* pArray);
|
||||||
* @return
|
* @return
|
||||||
*/
|
*/
|
||||||
void taosArraySwap(SArray* a, SArray* b);
|
void taosArraySwap(SArray* a, SArray* b);
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -1,56 +0,0 @@
|
||||||
/*
|
|
||||||
* Copyright (c) 2019 TAOS Data, Inc. <jhtao@taosdata.com>
|
|
||||||
*
|
|
||||||
* This program is free software: you can use, redistribute, and/or modify
|
|
||||||
* it under the terms of the GNU Affero General Public License, version 3
|
|
||||||
* or later ("AGPL"), as published by the Free Software Foundation.
|
|
||||||
*
|
|
||||||
* This program is distributed in the hope that it will be useful, but WITHOUT
|
|
||||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
|
||||||
* FITNESS FOR A PARTICULAR PURPOSE.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU Affero General Public License
|
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
*/
|
|
||||||
#ifndef _TD_UTIL_FUNCTIONAL_H_
|
|
||||||
#define _TD_UTIL_FUNCTIONAL_H_
|
|
||||||
|
|
||||||
#include "os.h"
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
extern "C" {
|
|
||||||
#endif
|
|
||||||
|
|
||||||
// TODO: hard to use, trying to rewrite it using va_list
|
|
||||||
|
|
||||||
typedef void* (*GenericVaFunc)(void* args[]);
|
|
||||||
typedef int32_t (*I32VaFunc)(void* args[]);
|
|
||||||
typedef void (*VoidVaFunc)(void* args[]);
|
|
||||||
|
|
||||||
typedef struct GenericSavedFunc {
|
|
||||||
GenericVaFunc func;
|
|
||||||
void* args[];
|
|
||||||
} tGenericSavedFunc;
|
|
||||||
|
|
||||||
typedef struct I32SavedFunc {
|
|
||||||
I32VaFunc func;
|
|
||||||
void* args[];
|
|
||||||
} tI32SavedFunc;
|
|
||||||
|
|
||||||
typedef struct VoidSavedFunc {
|
|
||||||
VoidVaFunc func;
|
|
||||||
void* args[];
|
|
||||||
} tVoidSavedFunc;
|
|
||||||
|
|
||||||
tGenericSavedFunc* genericSavedFuncInit(GenericVaFunc func, int32_t numOfArgs);
|
|
||||||
tI32SavedFunc* i32SavedFuncInit(I32VaFunc func, int32_t numOfArgs);
|
|
||||||
tVoidSavedFunc* voidSavedFuncInit(VoidVaFunc func, int32_t numOfArgs);
|
|
||||||
void* genericInvoke(tGenericSavedFunc* const pSavedFunc);
|
|
||||||
int32_t i32Invoke(tI32SavedFunc* const pSavedFunc);
|
|
||||||
void voidInvoke(tVoidSavedFunc* const pSavedFunc);
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif /*_TD_UTIL_FUNCTIONAL_H_*/
|
|
|
@ -19,7 +19,6 @@
|
||||||
#include "os.h"
|
#include "os.h"
|
||||||
#include "taos.h"
|
#include "taos.h"
|
||||||
#include "tarray.h"
|
#include "tarray.h"
|
||||||
#include "tfunctional.h"
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
extern "C" {
|
extern "C" {
|
||||||
|
@ -67,7 +66,6 @@ typedef struct SSkipList {
|
||||||
uint32_t size;
|
uint32_t size;
|
||||||
SSkipListNode *pHead; // point to the first element
|
SSkipListNode *pHead; // point to the first element
|
||||||
SSkipListNode *pTail; // point to the last element
|
SSkipListNode *pTail; // point to the last element
|
||||||
tGenericSavedFunc *insertHandleFn;
|
|
||||||
} SSkipList;
|
} SSkipList;
|
||||||
|
|
||||||
typedef struct SSkipListIterator {
|
typedef struct SSkipListIterator {
|
||||||
|
|
|
@ -47,6 +47,15 @@ copy %binary_dir%\\build\\bin\\udfd.exe %tagert_dir% > nul
|
||||||
if exist %binary_dir%\\build\\bin\\taosBenchmark.exe (
|
if exist %binary_dir%\\build\\bin\\taosBenchmark.exe (
|
||||||
copy %binary_dir%\\build\\bin\\taosBenchmark.exe %tagert_dir% > nul
|
copy %binary_dir%\\build\\bin\\taosBenchmark.exe %tagert_dir% > nul
|
||||||
)
|
)
|
||||||
|
if exist %binary_dir%\\build\\lib\\taosws.dll.lib (
|
||||||
|
copy %binary_dir%\\build\\lib\\taosws.dll.lib %tagert_dir%\\driver > nul
|
||||||
|
)
|
||||||
|
if exist %binary_dir%\\build\\lib\\taosws.dll (
|
||||||
|
copy %binary_dir%\\build\\lib\\taosws.dll %tagert_dir%\\driver > nul
|
||||||
|
)
|
||||||
|
if exist %binary_dir%\\build\\bin\\taosdump.exe (
|
||||||
|
copy %binary_dir%\\build\\bin\\taosdump.exe %tagert_dir% > nul
|
||||||
|
)
|
||||||
if exist %binary_dir%\\build\\bin\\taosadapter.exe (
|
if exist %binary_dir%\\build\\bin\\taosadapter.exe (
|
||||||
copy %binary_dir%\\build\\bin\\taosadapter.exe %tagert_dir% > nul
|
copy %binary_dir%\\build\\bin\\taosadapter.exe %tagert_dir% > nul
|
||||||
)
|
)
|
||||||
|
@ -54,4 +63,7 @@ if exist %binary_dir%\\build\\bin\\taosadapter.exe (
|
||||||
mshta vbscript:createobject("shell.application").shellexecute("%~s0",":hasAdmin","","runas",1)(window.close)&& echo To start/stop TDengine with administrator privileges: sc start/stop taosd &goto :eof
|
mshta vbscript:createobject("shell.application").shellexecute("%~s0",":hasAdmin","","runas",1)(window.close)&& echo To start/stop TDengine with administrator privileges: sc start/stop taosd &goto :eof
|
||||||
:hasAdmin
|
:hasAdmin
|
||||||
copy /y C:\\TDengine\\driver\\taos.dll C:\\Windows\\System32 > nul
|
copy /y C:\\TDengine\\driver\\taos.dll C:\\Windows\\System32 > nul
|
||||||
|
if exist C:\\TDengine\\driver\\taosws.dll (
|
||||||
|
copy /y C:\\TDengine\\driver\\taosws.dll C:\\Windows\\System32 > nul
|
||||||
|
)
|
||||||
sc query "taosd" >nul || sc create "taosd" binPath= "C:\\TDengine\\taosd.exe --win_service" start= DEMAND
|
sc query "taosd" >nul || sc create "taosd" binPath= "C:\\TDengine\\taosd.exe --win_service" start= DEMAND
|
||||||
|
|
|
@ -1707,8 +1707,6 @@ void* tDecodeDataBlock(const void* buf, SSDataBlock* pBlock) {
|
||||||
|
|
||||||
if (IS_VAR_DATA_TYPE(data.info.type)) {
|
if (IS_VAR_DATA_TYPE(data.info.type)) {
|
||||||
buf = taosDecodeBinary(buf, (void**)&data.varmeta.offset, pBlock->info.rows * sizeof(int32_t));
|
buf = taosDecodeBinary(buf, (void**)&data.varmeta.offset, pBlock->info.rows * sizeof(int32_t));
|
||||||
data.varmeta.length = pBlock->info.rows * sizeof(int32_t);
|
|
||||||
data.varmeta.allocLen = data.varmeta.length;
|
|
||||||
} else {
|
} else {
|
||||||
buf = taosDecodeBinary(buf, (void**)&data.nullbitmap, BitmapLen(pBlock->info.rows));
|
buf = taosDecodeBinary(buf, (void**)&data.nullbitmap, BitmapLen(pBlock->info.rows));
|
||||||
}
|
}
|
||||||
|
@ -1716,6 +1714,10 @@ void* tDecodeDataBlock(const void* buf, SSDataBlock* pBlock) {
|
||||||
int32_t len = 0;
|
int32_t len = 0;
|
||||||
buf = taosDecodeFixedI32(buf, &len);
|
buf = taosDecodeFixedI32(buf, &len);
|
||||||
buf = taosDecodeBinary(buf, (void**)&data.pData, len);
|
buf = taosDecodeBinary(buf, (void**)&data.pData, len);
|
||||||
|
if (IS_VAR_DATA_TYPE(data.info.type)) {
|
||||||
|
data.varmeta.length = len;
|
||||||
|
data.varmeta.allocLen = len;
|
||||||
|
}
|
||||||
taosArrayPush(pBlock->pDataBlock, &data);
|
taosArrayPush(pBlock->pDataBlock, &data);
|
||||||
}
|
}
|
||||||
return (void*)buf;
|
return (void*)buf;
|
||||||
|
|
|
@ -167,7 +167,8 @@ void *tsdbGetIdx(SMeta *pMeta);
|
||||||
void *tsdbGetIvtIdx(SMeta *pMeta);
|
void *tsdbGetIvtIdx(SMeta *pMeta);
|
||||||
uint64_t getReaderMaxVersion(STsdbReader *pReader);
|
uint64_t getReaderMaxVersion(STsdbReader *pReader);
|
||||||
|
|
||||||
int32_t tsdbCacherowsReaderOpen(void *pVnode, int32_t type, SArray *pTableIdList, int32_t numOfCols, void **pReader);
|
int32_t tsdbCacherowsReaderOpen(void *pVnode, int32_t type, SArray *pTableIdList, int32_t numOfCols, uint64_t suid,
|
||||||
|
void **pReader);
|
||||||
int32_t tsdbRetrieveCacheRows(void *pReader, SSDataBlock *pResBlock, const int32_t *slotIds, SArray *pTableUids);
|
int32_t tsdbRetrieveCacheRows(void *pReader, SSDataBlock *pResBlock, const int32_t *slotIds, SArray *pTableUids);
|
||||||
void *tsdbCacherowsReaderClose(void *pReader);
|
void *tsdbCacherowsReaderClose(void *pReader);
|
||||||
int32_t tsdbGetTableSchema(SVnode *pVnode, int64_t uid, STSchema **pSchema, int64_t *suid);
|
int32_t tsdbGetTableSchema(SVnode *pVnode, int64_t uid, STSchema **pSchema, int64_t *suid);
|
||||||
|
|
|
@ -298,29 +298,6 @@ int32_t tsdbMerge(STsdb *pTsdb);
|
||||||
#define TSDB_CACHE_LAST_ROW(c) (((c).cacheLast & 1) > 0)
|
#define TSDB_CACHE_LAST_ROW(c) (((c).cacheLast & 1) > 0)
|
||||||
#define TSDB_CACHE_LAST(c) (((c).cacheLast & 2) > 0)
|
#define TSDB_CACHE_LAST(c) (((c).cacheLast & 2) > 0)
|
||||||
|
|
||||||
// tsdbCache ==============================================================================================
|
|
||||||
typedef struct {
|
|
||||||
TSKEY ts;
|
|
||||||
SColVal colVal;
|
|
||||||
} SLastCol;
|
|
||||||
|
|
||||||
int32_t tsdbOpenCache(STsdb *pTsdb);
|
|
||||||
void tsdbCloseCache(STsdb *pTsdb);
|
|
||||||
int32_t tsdbCacheInsertLast(SLRUCache *pCache, tb_uid_t uid, STSRow *row, STsdb *pTsdb);
|
|
||||||
int32_t tsdbCacheInsertLastrow(SLRUCache *pCache, STsdb *pTsdb, tb_uid_t uid, STSRow *row, bool dup);
|
|
||||||
int32_t tsdbCacheGetLastH(SLRUCache *pCache, tb_uid_t uid, STsdb *pTsdb, LRUHandle **h);
|
|
||||||
int32_t tsdbCacheGetLastrowH(SLRUCache *pCache, tb_uid_t uid, STsdb *pTsdb, LRUHandle **h);
|
|
||||||
int32_t tsdbCacheRelease(SLRUCache *pCache, LRUHandle *h);
|
|
||||||
|
|
||||||
int32_t tsdbCacheDeleteLastrow(SLRUCache *pCache, tb_uid_t uid, TSKEY eKey);
|
|
||||||
int32_t tsdbCacheDeleteLast(SLRUCache *pCache, tb_uid_t uid, TSKEY eKey);
|
|
||||||
int32_t tsdbCacheDelete(SLRUCache *pCache, tb_uid_t uid, TSKEY eKey);
|
|
||||||
|
|
||||||
void tsdbCacheSetCapacity(SVnode *pVnode, size_t capacity);
|
|
||||||
size_t tsdbCacheGetCapacity(SVnode *pVnode);
|
|
||||||
|
|
||||||
int32_t tsdbCacheLastArray2Row(SArray *pLastArray, STSRow **ppRow, STSchema *pSchema);
|
|
||||||
|
|
||||||
// tsdbDiskData ==============================================================================================
|
// tsdbDiskData ==============================================================================================
|
||||||
int32_t tDiskDataBuilderCreate(SDiskDataBuilder **ppBuilder);
|
int32_t tDiskDataBuilderCreate(SDiskDataBuilder **ppBuilder);
|
||||||
void *tDiskDataBuilderDestroy(SDiskDataBuilder *pBuilder);
|
void *tDiskDataBuilderDestroy(SDiskDataBuilder *pBuilder);
|
||||||
|
@ -729,6 +706,45 @@ void resetLastBlockLoadInfo(SSttBlockLoadInfo *pLoadInfo);
|
||||||
void getLastBlockLoadInfo(SSttBlockLoadInfo *pLoadInfo, int64_t *blocks, double *el);
|
void getLastBlockLoadInfo(SSttBlockLoadInfo *pLoadInfo, int64_t *blocks, double *el);
|
||||||
void *destroyLastBlockLoadInfo(SSttBlockLoadInfo *pLoadInfo);
|
void *destroyLastBlockLoadInfo(SSttBlockLoadInfo *pLoadInfo);
|
||||||
|
|
||||||
|
// tsdbCache ==============================================================================================
|
||||||
|
typedef struct SCacheRowsReader {
|
||||||
|
SVnode *pVnode;
|
||||||
|
STSchema *pSchema;
|
||||||
|
uint64_t uid;
|
||||||
|
uint64_t suid;
|
||||||
|
char **transferBuf; // todo remove it soon
|
||||||
|
int32_t numOfCols;
|
||||||
|
int32_t type;
|
||||||
|
int32_t tableIndex; // currently returned result tables
|
||||||
|
SArray *pTableList; // table id list
|
||||||
|
SSttBlockLoadInfo *pLoadInfo;
|
||||||
|
STsdbReadSnap *pReadSnap;
|
||||||
|
SDataFReader *pDataFReader;
|
||||||
|
SDataFReader *pDataFReaderLast;
|
||||||
|
} SCacheRowsReader;
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
TSKEY ts;
|
||||||
|
SColVal colVal;
|
||||||
|
} SLastCol;
|
||||||
|
|
||||||
|
int32_t tsdbOpenCache(STsdb *pTsdb);
|
||||||
|
void tsdbCloseCache(STsdb *pTsdb);
|
||||||
|
int32_t tsdbCacheInsertLast(SLRUCache *pCache, tb_uid_t uid, STSRow *row, STsdb *pTsdb);
|
||||||
|
int32_t tsdbCacheInsertLastrow(SLRUCache *pCache, STsdb *pTsdb, tb_uid_t uid, STSRow *row, bool dup);
|
||||||
|
int32_t tsdbCacheGetLastH(SLRUCache *pCache, tb_uid_t uid, SCacheRowsReader *pr, LRUHandle **h);
|
||||||
|
int32_t tsdbCacheGetLastrowH(SLRUCache *pCache, tb_uid_t uid, SCacheRowsReader *pr, LRUHandle **h);
|
||||||
|
int32_t tsdbCacheRelease(SLRUCache *pCache, LRUHandle *h);
|
||||||
|
|
||||||
|
int32_t tsdbCacheDeleteLastrow(SLRUCache *pCache, tb_uid_t uid, TSKEY eKey);
|
||||||
|
int32_t tsdbCacheDeleteLast(SLRUCache *pCache, tb_uid_t uid, TSKEY eKey);
|
||||||
|
int32_t tsdbCacheDelete(SLRUCache *pCache, tb_uid_t uid, TSKEY eKey);
|
||||||
|
|
||||||
|
void tsdbCacheSetCapacity(SVnode *pVnode, size_t capacity);
|
||||||
|
size_t tsdbCacheGetCapacity(SVnode *pVnode);
|
||||||
|
|
||||||
|
int32_t tsdbCacheLastArray2Row(SArray *pLastArray, STSRow **ppRow, STSchema *pSchema);
|
||||||
|
|
||||||
// ========== inline functions ==========
|
// ========== inline functions ==========
|
||||||
static FORCE_INLINE int32_t tsdbKeyCmprFn(const void *p1, const void *p2) {
|
static FORCE_INLINE int32_t tsdbKeyCmprFn(const void *p1, const void *p2) {
|
||||||
TSDBKEY *pKey1 = (TSDBKEY *)p1;
|
TSDBKEY *pKey1 = (TSDBKEY *)p1;
|
||||||
|
|
|
@ -26,7 +26,7 @@ int32_t tsdbOpenCache(STsdb *pTsdb) {
|
||||||
goto _err;
|
goto _err;
|
||||||
}
|
}
|
||||||
|
|
||||||
taosLRUCacheSetStrictCapacity(pCache, true);
|
taosLRUCacheSetStrictCapacity(pCache, false);
|
||||||
|
|
||||||
taosThreadMutexInit(&pTsdb->lruMutex, NULL);
|
taosThreadMutexInit(&pTsdb->lruMutex, NULL);
|
||||||
|
|
||||||
|
@ -230,7 +230,21 @@ int32_t tsdbCacheInsertLastrow(SLRUCache *pCache, STsdb *pTsdb, tb_uid_t uid, ST
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
taosArraySet(pLast, iCol, &(SLastCol){.ts = keyTs, .colVal = colVal});
|
SLastCol lastCol = {.ts = keyTs, .colVal = colVal};
|
||||||
|
if (IS_VAR_DATA_TYPE(colVal.type) && colVal.value.nData > 0) {
|
||||||
|
SLastCol *pLastCol = (SLastCol *)taosArrayGet(pLast, iCol);
|
||||||
|
taosMemoryFree(pLastCol->colVal.value.pData);
|
||||||
|
|
||||||
|
lastCol.colVal.value.pData = taosMemoryMalloc(colVal.value.nData);
|
||||||
|
if (lastCol.colVal.value.pData == NULL) {
|
||||||
|
terrno = TSDB_CODE_OUT_OF_MEMORY;
|
||||||
|
code = TSDB_CODE_OUT_OF_MEMORY;
|
||||||
|
goto _invalidate;
|
||||||
|
}
|
||||||
|
memcpy(lastCol.colVal.value.pData, colVal.value.pData, colVal.value.nData);
|
||||||
|
}
|
||||||
|
|
||||||
|
taosArraySet(pLast, iCol, &lastCol);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -342,7 +356,21 @@ int32_t tsdbCacheInsertLast(SLRUCache *pCache, tb_uid_t uid, STSRow *row, STsdb
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
taosArraySet(pLast, iCol, &(SLastCol){.ts = keyTs, .colVal = colVal});
|
SLastCol lastCol = {.ts = keyTs, .colVal = colVal};
|
||||||
|
if (IS_VAR_DATA_TYPE(colVal.type) && colVal.value.nData > 0) {
|
||||||
|
SLastCol *pLastCol = (SLastCol *)taosArrayGet(pLast, iCol);
|
||||||
|
taosMemoryFree(pLastCol->colVal.value.pData);
|
||||||
|
|
||||||
|
lastCol.colVal.value.pData = taosMemoryMalloc(colVal.value.nData);
|
||||||
|
if (lastCol.colVal.value.pData == NULL) {
|
||||||
|
terrno = TSDB_CODE_OUT_OF_MEMORY;
|
||||||
|
code = TSDB_CODE_OUT_OF_MEMORY;
|
||||||
|
goto _invalidate;
|
||||||
|
}
|
||||||
|
memcpy(lastCol.colVal.value.pData, colVal.value.pData, colVal.value.nData);
|
||||||
|
}
|
||||||
|
|
||||||
|
taosArraySet(pLast, iCol, &lastCol);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -488,11 +516,12 @@ typedef struct {
|
||||||
int32_t nFileSet;
|
int32_t nFileSet;
|
||||||
int32_t iFileSet;
|
int32_t iFileSet;
|
||||||
SArray *aDFileSet;
|
SArray *aDFileSet;
|
||||||
SDataFReader *pDataFReader;
|
SDataFReader **pDataFReader;
|
||||||
TSDBROW row;
|
TSDBROW row;
|
||||||
|
|
||||||
SMergeTree mergeTree;
|
SMergeTree mergeTree;
|
||||||
SMergeTree *pMergeTree;
|
SMergeTree *pMergeTree;
|
||||||
|
SSttBlockLoadInfo *pLoadInfo;
|
||||||
} SFSLastNextRowIter;
|
} SFSLastNextRowIter;
|
||||||
|
|
||||||
static int32_t getNextRowFromFSLast(void *iter, TSDBROW **ppRow) {
|
static int32_t getNextRowFromFSLast(void *iter, TSDBROW **ppRow) {
|
||||||
|
@ -519,18 +548,20 @@ static int32_t getNextRowFromFSLast(void *iter, TSDBROW **ppRow) {
|
||||||
return code;
|
return code;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (state->pDataFReader != NULL) {
|
if (*state->pDataFReader == NULL || (*state->pDataFReader)->pSet->fid != pFileSet->fid) {
|
||||||
tsdbDataFReaderClose(&state->pDataFReader);
|
if (*state->pDataFReader != NULL) {
|
||||||
state->pDataFReader = NULL;
|
tsdbDataFReaderClose(state->pDataFReader);
|
||||||
|
|
||||||
|
resetLastBlockLoadInfo(state->pLoadInfo);
|
||||||
}
|
}
|
||||||
|
|
||||||
code = tsdbDataFReaderOpen(&state->pDataFReader, state->pTsdb, pFileSet);
|
code = tsdbDataFReaderOpen(state->pDataFReader, state->pTsdb, pFileSet);
|
||||||
if (code) goto _err;
|
if (code) goto _err;
|
||||||
|
}
|
||||||
|
|
||||||
SSttBlockLoadInfo *pLoadInfo = tCreateLastBlockLoadInfo(state->pTSchema, NULL, 0);
|
tMergeTreeOpen(&state->mergeTree, 1, *state->pDataFReader, state->suid, state->uid,
|
||||||
tMergeTreeOpen(&state->mergeTree, 1, state->pDataFReader, state->suid, state->uid,
|
|
||||||
&(STimeWindow){.skey = TSKEY_MIN, .ekey = TSKEY_MAX},
|
&(STimeWindow){.skey = TSKEY_MIN, .ekey = TSKEY_MAX},
|
||||||
&(SVersionRange){.minVer = 0, .maxVer = UINT64_MAX}, pLoadInfo, true, NULL);
|
&(SVersionRange){.minVer = 0, .maxVer = UINT64_MAX}, state->pLoadInfo, false, NULL);
|
||||||
state->pMergeTree = &state->mergeTree;
|
state->pMergeTree = &state->mergeTree;
|
||||||
bool hasVal = tMergeTreeNext(&state->mergeTree);
|
bool hasVal = tMergeTreeNext(&state->mergeTree);
|
||||||
if (!hasVal) {
|
if (!hasVal) {
|
||||||
|
@ -554,10 +585,10 @@ static int32_t getNextRowFromFSLast(void *iter, TSDBROW **ppRow) {
|
||||||
}
|
}
|
||||||
|
|
||||||
_err:
|
_err:
|
||||||
if (state->pDataFReader) {
|
/*if (state->pDataFReader) {
|
||||||
tsdbDataFReaderClose(&state->pDataFReader);
|
tsdbDataFReaderClose(&state->pDataFReader);
|
||||||
state->pDataFReader = NULL;
|
state->pDataFReader = NULL;
|
||||||
}
|
}*/
|
||||||
if (state->pMergeTree != NULL) {
|
if (state->pMergeTree != NULL) {
|
||||||
tMergeTreeClose(state->pMergeTree);
|
tMergeTreeClose(state->pMergeTree);
|
||||||
state->pMergeTree = NULL;
|
state->pMergeTree = NULL;
|
||||||
|
@ -575,12 +606,12 @@ int32_t clearNextRowFromFSLast(void *iter) {
|
||||||
if (!state) {
|
if (!state) {
|
||||||
return code;
|
return code;
|
||||||
}
|
}
|
||||||
|
/*
|
||||||
if (state->pDataFReader) {
|
if (state->pDataFReader) {
|
||||||
tsdbDataFReaderClose(&state->pDataFReader);
|
tsdbDataFReaderClose(&state->pDataFReader);
|
||||||
state->pDataFReader = NULL;
|
state->pDataFReader = NULL;
|
||||||
}
|
}
|
||||||
|
*/
|
||||||
if (state->pMergeTree != NULL) {
|
if (state->pMergeTree != NULL) {
|
||||||
tMergeTreeClose(state->pMergeTree);
|
tMergeTreeClose(state->pMergeTree);
|
||||||
state->pMergeTree = NULL;
|
state->pMergeTree = NULL;
|
||||||
|
@ -606,7 +637,7 @@ typedef struct SFSNextRowIter {
|
||||||
int32_t nFileSet;
|
int32_t nFileSet;
|
||||||
int32_t iFileSet;
|
int32_t iFileSet;
|
||||||
SArray *aDFileSet;
|
SArray *aDFileSet;
|
||||||
SDataFReader *pDataFReader;
|
SDataFReader **pDataFReader;
|
||||||
SArray *aBlockIdx;
|
SArray *aBlockIdx;
|
||||||
SBlockIdx *pBlockIdx;
|
SBlockIdx *pBlockIdx;
|
||||||
SMapData blockMap;
|
SMapData blockMap;
|
||||||
|
@ -618,6 +649,7 @@ typedef struct SFSNextRowIter {
|
||||||
int32_t nRow;
|
int32_t nRow;
|
||||||
int32_t iRow;
|
int32_t iRow;
|
||||||
TSDBROW row;
|
TSDBROW row;
|
||||||
|
SSttBlockLoadInfo *pLoadInfo;
|
||||||
} SFSNextRowIter;
|
} SFSNextRowIter;
|
||||||
|
|
||||||
static int32_t getNextRowFromFS(void *iter, TSDBROW **ppRow) {
|
static int32_t getNextRowFromFS(void *iter, TSDBROW **ppRow) {
|
||||||
|
@ -648,8 +680,16 @@ static int32_t getNextRowFromFS(void *iter, TSDBROW **ppRow) {
|
||||||
return code;
|
return code;
|
||||||
}
|
}
|
||||||
|
|
||||||
code = tsdbDataFReaderOpen(&state->pDataFReader, state->pTsdb, pFileSet);
|
if (*state->pDataFReader == NULL || (*state->pDataFReader)->pSet->fid != pFileSet->fid) {
|
||||||
|
if (*state->pDataFReader != NULL) {
|
||||||
|
tsdbDataFReaderClose(state->pDataFReader);
|
||||||
|
|
||||||
|
resetLastBlockLoadInfo(state->pLoadInfo);
|
||||||
|
}
|
||||||
|
|
||||||
|
code = tsdbDataFReaderOpen(state->pDataFReader, state->pTsdb, pFileSet);
|
||||||
if (code) goto _err;
|
if (code) goto _err;
|
||||||
|
}
|
||||||
|
|
||||||
// tMapDataReset(&state->blockIdxMap);
|
// tMapDataReset(&state->blockIdxMap);
|
||||||
if (!state->aBlockIdx) {
|
if (!state->aBlockIdx) {
|
||||||
|
@ -657,7 +697,7 @@ static int32_t getNextRowFromFS(void *iter, TSDBROW **ppRow) {
|
||||||
} else {
|
} else {
|
||||||
taosArrayClear(state->aBlockIdx);
|
taosArrayClear(state->aBlockIdx);
|
||||||
}
|
}
|
||||||
code = tsdbReadBlockIdx(state->pDataFReader, state->aBlockIdx);
|
code = tsdbReadBlockIdx(*state->pDataFReader, state->aBlockIdx);
|
||||||
if (code) goto _err;
|
if (code) goto _err;
|
||||||
|
|
||||||
/* if (state->pBlockIdx) { */
|
/* if (state->pBlockIdx) { */
|
||||||
|
@ -666,17 +706,20 @@ static int32_t getNextRowFromFS(void *iter, TSDBROW **ppRow) {
|
||||||
* &state->blockIdx);
|
* &state->blockIdx);
|
||||||
*/
|
*/
|
||||||
state->pBlockIdx = taosArraySearch(state->aBlockIdx, state->pBlockIdxExp, tCmprBlockIdx, TD_EQ);
|
state->pBlockIdx = taosArraySearch(state->aBlockIdx, state->pBlockIdxExp, tCmprBlockIdx, TD_EQ);
|
||||||
if (!state->pBlockIdx) {
|
if (!state->pBlockIdx) { /*
|
||||||
tsdbDataFReaderClose(&state->pDataFReader);
|
tsdbDataFReaderClose(state->pDataFReader);
|
||||||
state->pDataFReader = NULL;
|
*state->pDataFReader = NULL;
|
||||||
|
resetLastBlockLoadInfo(state->pLoadInfo);*/
|
||||||
goto _next_fileset;
|
goto _next_fileset;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
tMapDataReset(&state->blockMap);
|
||||||
|
/*
|
||||||
if (state->blockMap.pData != NULL) {
|
if (state->blockMap.pData != NULL) {
|
||||||
tMapDataClear(&state->blockMap);
|
tMapDataClear(&state->blockMap);
|
||||||
}
|
}
|
||||||
|
*/
|
||||||
code = tsdbReadDataBlk(state->pDataFReader, state->pBlockIdx, &state->blockMap);
|
code = tsdbReadDataBlk(*state->pDataFReader, state->pBlockIdx, &state->blockMap);
|
||||||
if (code) goto _err;
|
if (code) goto _err;
|
||||||
|
|
||||||
state->nBlock = state->blockMap.nItem;
|
state->nBlock = state->blockMap.nItem;
|
||||||
|
@ -703,7 +746,7 @@ static int32_t getNextRowFromFS(void *iter, TSDBROW **ppRow) {
|
||||||
code = tBlockDataInit(state->pBlockData, &tid, state->pTSchema, NULL, 0);
|
code = tBlockDataInit(state->pBlockData, &tid, state->pTSchema, NULL, 0);
|
||||||
if (code) goto _err;
|
if (code) goto _err;
|
||||||
|
|
||||||
code = tsdbReadDataBlock(state->pDataFReader, &block, state->pBlockData);
|
code = tsdbReadDataBlock(*state->pDataFReader, &block, state->pBlockData);
|
||||||
if (code) goto _err;
|
if (code) goto _err;
|
||||||
|
|
||||||
state->nRow = state->blockData.nRow;
|
state->nRow = state->blockData.nRow;
|
||||||
|
@ -719,8 +762,9 @@ static int32_t getNextRowFromFS(void *iter, TSDBROW **ppRow) {
|
||||||
if (--state->iRow < 0) {
|
if (--state->iRow < 0) {
|
||||||
state->state = SFSNEXTROW_BLOCKDATA;
|
state->state = SFSNEXTROW_BLOCKDATA;
|
||||||
if (--state->iBlock < 0) {
|
if (--state->iBlock < 0) {
|
||||||
tsdbDataFReaderClose(&state->pDataFReader);
|
tsdbDataFReaderClose(state->pDataFReader);
|
||||||
state->pDataFReader = NULL;
|
*state->pDataFReader = NULL;
|
||||||
|
resetLastBlockLoadInfo(state->pLoadInfo);
|
||||||
|
|
||||||
if (state->aBlockIdx) {
|
if (state->aBlockIdx) {
|
||||||
taosArrayDestroy(state->aBlockIdx);
|
taosArrayDestroy(state->aBlockIdx);
|
||||||
|
@ -739,16 +783,17 @@ static int32_t getNextRowFromFS(void *iter, TSDBROW **ppRow) {
|
||||||
}
|
}
|
||||||
|
|
||||||
_err:
|
_err:
|
||||||
if (state->pDataFReader) {
|
/*
|
||||||
tsdbDataFReaderClose(&state->pDataFReader);
|
if (*state->pDataFReader) {
|
||||||
state->pDataFReader = NULL;
|
tsdbDataFReaderClose(state->pDataFReader);
|
||||||
}
|
*state->pDataFReader = NULL;
|
||||||
|
resetLastBlockLoadInfo(state->pLoadInfo);
|
||||||
|
}*/
|
||||||
if (state->aBlockIdx) {
|
if (state->aBlockIdx) {
|
||||||
taosArrayDestroy(state->aBlockIdx);
|
taosArrayDestroy(state->aBlockIdx);
|
||||||
state->aBlockIdx = NULL;
|
state->aBlockIdx = NULL;
|
||||||
}
|
}
|
||||||
if (state->pBlockData) {
|
if (state->pBlockData) {
|
||||||
// tBlockDataDestroy(&state->blockData, 1);
|
|
||||||
tBlockDataDestroy(state->pBlockData, 1);
|
tBlockDataDestroy(state->pBlockData, 1);
|
||||||
state->pBlockData = NULL;
|
state->pBlockData = NULL;
|
||||||
}
|
}
|
||||||
|
@ -765,11 +810,11 @@ int32_t clearNextRowFromFS(void *iter) {
|
||||||
if (!state) {
|
if (!state) {
|
||||||
return code;
|
return code;
|
||||||
}
|
}
|
||||||
|
/*
|
||||||
if (state->pDataFReader) {
|
if (state->pDataFReader) {
|
||||||
tsdbDataFReaderClose(&state->pDataFReader);
|
tsdbDataFReaderClose(&state->pDataFReader);
|
||||||
state->pDataFReader = NULL;
|
state->pDataFReader = NULL;
|
||||||
}
|
}*/
|
||||||
if (state->aBlockIdx) {
|
if (state->aBlockIdx) {
|
||||||
taosArrayDestroy(state->aBlockIdx);
|
taosArrayDestroy(state->aBlockIdx);
|
||||||
state->aBlockIdx = NULL;
|
state->aBlockIdx = NULL;
|
||||||
|
@ -930,25 +975,22 @@ typedef struct {
|
||||||
TSDBROW memRow, imemRow, fsLastRow, fsRow;
|
TSDBROW memRow, imemRow, fsLastRow, fsRow;
|
||||||
|
|
||||||
TsdbNextRowState input[4];
|
TsdbNextRowState input[4];
|
||||||
STsdbReadSnap *pReadSnap;
|
|
||||||
STsdb *pTsdb;
|
STsdb *pTsdb;
|
||||||
} CacheNextRowIter;
|
} CacheNextRowIter;
|
||||||
|
|
||||||
static int32_t nextRowIterOpen(CacheNextRowIter *pIter, tb_uid_t uid, STsdb *pTsdb, STSchema *pTSchema) {
|
static int32_t nextRowIterOpen(CacheNextRowIter *pIter, tb_uid_t uid, STsdb *pTsdb, STSchema *pTSchema, tb_uid_t suid,
|
||||||
|
SSttBlockLoadInfo *pLoadInfo, STsdbReadSnap *pReadSnap, SDataFReader **pDataFReader,
|
||||||
|
SDataFReader **pDataFReaderLast) {
|
||||||
int code = 0;
|
int code = 0;
|
||||||
|
|
||||||
tb_uid_t suid = getTableSuidByUid(uid, pTsdb);
|
|
||||||
|
|
||||||
tsdbTakeReadSnap(pTsdb, &pIter->pReadSnap, NULL);
|
|
||||||
|
|
||||||
STbData *pMem = NULL;
|
STbData *pMem = NULL;
|
||||||
if (pIter->pReadSnap->pMem) {
|
if (pReadSnap->pMem) {
|
||||||
pMem = tsdbGetTbDataFromMemTable(pIter->pReadSnap->pMem, suid, uid);
|
pMem = tsdbGetTbDataFromMemTable(pReadSnap->pMem, suid, uid);
|
||||||
}
|
}
|
||||||
|
|
||||||
STbData *pIMem = NULL;
|
STbData *pIMem = NULL;
|
||||||
if (pIter->pReadSnap->pIMem) {
|
if (pReadSnap->pIMem) {
|
||||||
pIMem = tsdbGetTbDataFromMemTable(pIter->pReadSnap->pIMem, suid, uid);
|
pIMem = tsdbGetTbDataFromMemTable(pReadSnap->pIMem, suid, uid);
|
||||||
}
|
}
|
||||||
|
|
||||||
pIter->pTsdb = pTsdb;
|
pIter->pTsdb = pTsdb;
|
||||||
|
@ -957,7 +999,7 @@ static int32_t nextRowIterOpen(CacheNextRowIter *pIter, tb_uid_t uid, STsdb *pTs
|
||||||
|
|
||||||
SDelIdx delIdx;
|
SDelIdx delIdx;
|
||||||
|
|
||||||
SDelFile *pDelFile = pIter->pReadSnap->fs.pDelFile;
|
SDelFile *pDelFile = pReadSnap->fs.pDelFile;
|
||||||
if (pDelFile) {
|
if (pDelFile) {
|
||||||
SDelFReader *pDelFReader;
|
SDelFReader *pDelFReader;
|
||||||
|
|
||||||
|
@ -988,18 +1030,22 @@ static int32_t nextRowIterOpen(CacheNextRowIter *pIter, tb_uid_t uid, STsdb *pTs
|
||||||
|
|
||||||
pIter->fsLastState.state = (SFSLASTNEXTROWSTATES)SFSNEXTROW_FS;
|
pIter->fsLastState.state = (SFSLASTNEXTROWSTATES)SFSNEXTROW_FS;
|
||||||
pIter->fsLastState.pTsdb = pTsdb;
|
pIter->fsLastState.pTsdb = pTsdb;
|
||||||
pIter->fsLastState.aDFileSet = pIter->pReadSnap->fs.aDFileSet;
|
pIter->fsLastState.aDFileSet = pReadSnap->fs.aDFileSet;
|
||||||
pIter->fsLastState.pTSchema = pTSchema;
|
pIter->fsLastState.pTSchema = pTSchema;
|
||||||
pIter->fsLastState.suid = suid;
|
pIter->fsLastState.suid = suid;
|
||||||
pIter->fsLastState.uid = uid;
|
pIter->fsLastState.uid = uid;
|
||||||
|
pIter->fsLastState.pLoadInfo = pLoadInfo;
|
||||||
|
pIter->fsLastState.pDataFReader = pDataFReaderLast;
|
||||||
|
|
||||||
pIter->fsState.state = SFSNEXTROW_FS;
|
pIter->fsState.state = SFSNEXTROW_FS;
|
||||||
pIter->fsState.pTsdb = pTsdb;
|
pIter->fsState.pTsdb = pTsdb;
|
||||||
pIter->fsState.aDFileSet = pIter->pReadSnap->fs.aDFileSet;
|
pIter->fsState.aDFileSet = pReadSnap->fs.aDFileSet;
|
||||||
pIter->fsState.pBlockIdxExp = &pIter->idx;
|
pIter->fsState.pBlockIdxExp = &pIter->idx;
|
||||||
pIter->fsState.pTSchema = pTSchema;
|
pIter->fsState.pTSchema = pTSchema;
|
||||||
pIter->fsState.suid = suid;
|
pIter->fsState.suid = suid;
|
||||||
pIter->fsState.uid = uid;
|
pIter->fsState.uid = uid;
|
||||||
|
pIter->fsState.pLoadInfo = pLoadInfo;
|
||||||
|
pIter->fsState.pDataFReader = pDataFReader;
|
||||||
|
|
||||||
pIter->input[0] = (TsdbNextRowState){&pIter->memRow, true, false, &pIter->memState, getNextRowFromMem, NULL};
|
pIter->input[0] = (TsdbNextRowState){&pIter->memRow, true, false, &pIter->memState, getNextRowFromMem, NULL};
|
||||||
pIter->input[1] = (TsdbNextRowState){&pIter->imemRow, true, false, &pIter->imemState, getNextRowFromMem, NULL};
|
pIter->input[1] = (TsdbNextRowState){&pIter->imemRow, true, false, &pIter->imemState, getNextRowFromMem, NULL};
|
||||||
|
@ -1040,8 +1086,6 @@ static int32_t nextRowIterClose(CacheNextRowIter *pIter) {
|
||||||
taosArrayDestroy(pIter->pSkyline);
|
taosArrayDestroy(pIter->pSkyline);
|
||||||
}
|
}
|
||||||
|
|
||||||
tsdbUntakeReadSnap(pIter->pTsdb, pIter->pReadSnap, NULL);
|
|
||||||
|
|
||||||
_err:
|
_err:
|
||||||
return code;
|
return code;
|
||||||
}
|
}
|
||||||
|
@ -1119,10 +1163,10 @@ _err:
|
||||||
return code;
|
return code;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int32_t mergeLastRow(tb_uid_t uid, STsdb *pTsdb, bool *dup, SArray **ppColArray) {
|
static int32_t mergeLastRow(tb_uid_t uid, STsdb *pTsdb, bool *dup, SArray **ppColArray, SCacheRowsReader *pr) {
|
||||||
int32_t code = 0;
|
int32_t code = 0;
|
||||||
|
|
||||||
STSchema *pTSchema = metaGetTbTSchema(pTsdb->pVnode->pMeta, uid, -1, 1);
|
STSchema *pTSchema = pr->pSchema; // metaGetTbTSchema(pTsdb->pVnode->pMeta, uid, -1, 1);
|
||||||
int16_t nCol = pTSchema->numOfCols;
|
int16_t nCol = pTSchema->numOfCols;
|
||||||
int16_t iCol = 0;
|
int16_t iCol = 0;
|
||||||
int16_t noneCol = 0;
|
int16_t noneCol = 0;
|
||||||
|
@ -1133,7 +1177,8 @@ static int32_t mergeLastRow(tb_uid_t uid, STsdb *pTsdb, bool *dup, SArray **ppCo
|
||||||
TSKEY lastRowTs = TSKEY_MAX;
|
TSKEY lastRowTs = TSKEY_MAX;
|
||||||
|
|
||||||
CacheNextRowIter iter = {0};
|
CacheNextRowIter iter = {0};
|
||||||
nextRowIterOpen(&iter, uid, pTsdb, pTSchema);
|
nextRowIterOpen(&iter, uid, pTsdb, pTSchema, pr->suid, pr->pLoadInfo, pr->pReadSnap, &pr->pDataFReader,
|
||||||
|
&pr->pDataFReaderLast);
|
||||||
|
|
||||||
do {
|
do {
|
||||||
TSDBROW *pRow = NULL;
|
TSDBROW *pRow = NULL;
|
||||||
|
@ -1233,20 +1278,20 @@ static int32_t mergeLastRow(tb_uid_t uid, STsdb *pTsdb, bool *dup, SArray **ppCo
|
||||||
}
|
}
|
||||||
|
|
||||||
nextRowIterClose(&iter);
|
nextRowIterClose(&iter);
|
||||||
taosMemoryFreeClear(pTSchema);
|
// taosMemoryFreeClear(pTSchema);
|
||||||
return code;
|
return code;
|
||||||
|
|
||||||
_err:
|
_err:
|
||||||
nextRowIterClose(&iter);
|
nextRowIterClose(&iter);
|
||||||
taosArrayDestroy(pColArray);
|
taosArrayDestroy(pColArray);
|
||||||
taosMemoryFreeClear(pTSchema);
|
// taosMemoryFreeClear(pTSchema);
|
||||||
return code;
|
return code;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int32_t mergeLast(tb_uid_t uid, STsdb *pTsdb, SArray **ppLastArray) {
|
static int32_t mergeLast(tb_uid_t uid, STsdb *pTsdb, SArray **ppLastArray, SCacheRowsReader *pr) {
|
||||||
int32_t code = 0;
|
int32_t code = 0;
|
||||||
|
|
||||||
STSchema *pTSchema = metaGetTbTSchema(pTsdb->pVnode->pMeta, uid, -1, 1);
|
STSchema *pTSchema = pr->pSchema; // metaGetTbTSchema(pTsdb->pVnode->pMeta, uid, -1, 1);
|
||||||
int16_t nCol = pTSchema->numOfCols;
|
int16_t nCol = pTSchema->numOfCols;
|
||||||
int16_t iCol = 0;
|
int16_t iCol = 0;
|
||||||
int16_t noneCol = 0;
|
int16_t noneCol = 0;
|
||||||
|
@ -1257,7 +1302,8 @@ static int32_t mergeLast(tb_uid_t uid, STsdb *pTsdb, SArray **ppLastArray) {
|
||||||
TSKEY lastRowTs = TSKEY_MAX;
|
TSKEY lastRowTs = TSKEY_MAX;
|
||||||
|
|
||||||
CacheNextRowIter iter = {0};
|
CacheNextRowIter iter = {0};
|
||||||
nextRowIterOpen(&iter, uid, pTsdb, pTSchema);
|
nextRowIterOpen(&iter, uid, pTsdb, pTSchema, pr->suid, pr->pLoadInfo, pr->pReadSnap, &pr->pDataFReader,
|
||||||
|
&pr->pDataFReaderLast);
|
||||||
|
|
||||||
do {
|
do {
|
||||||
TSDBROW *pRow = NULL;
|
TSDBROW *pRow = NULL;
|
||||||
|
@ -1350,18 +1396,18 @@ static int32_t mergeLast(tb_uid_t uid, STsdb *pTsdb, SArray **ppLastArray) {
|
||||||
}
|
}
|
||||||
|
|
||||||
nextRowIterClose(&iter);
|
nextRowIterClose(&iter);
|
||||||
taosMemoryFreeClear(pTSchema);
|
// taosMemoryFreeClear(pTSchema);
|
||||||
return code;
|
return code;
|
||||||
|
|
||||||
_err:
|
_err:
|
||||||
nextRowIterClose(&iter);
|
nextRowIterClose(&iter);
|
||||||
taosMemoryFreeClear(pTSchema);
|
// taosMemoryFreeClear(pTSchema);
|
||||||
*ppLastArray = NULL;
|
*ppLastArray = NULL;
|
||||||
taosArrayDestroy(pColArray);
|
taosArrayDestroy(pColArray);
|
||||||
return code;
|
return code;
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t tsdbCacheGetLastrowH(SLRUCache *pCache, tb_uid_t uid, STsdb *pTsdb, LRUHandle **handle) {
|
int32_t tsdbCacheGetLastrowH(SLRUCache *pCache, tb_uid_t uid, SCacheRowsReader *pr, LRUHandle **handle) {
|
||||||
int32_t code = 0;
|
int32_t code = 0;
|
||||||
char key[32] = {0};
|
char key[32] = {0};
|
||||||
int keyLen = 0;
|
int keyLen = 0;
|
||||||
|
@ -1370,13 +1416,14 @@ int32_t tsdbCacheGetLastrowH(SLRUCache *pCache, tb_uid_t uid, STsdb *pTsdb, LRUH
|
||||||
getTableCacheKey(uid, 0, key, &keyLen);
|
getTableCacheKey(uid, 0, key, &keyLen);
|
||||||
LRUHandle *h = taosLRUCacheLookup(pCache, key, keyLen);
|
LRUHandle *h = taosLRUCacheLookup(pCache, key, keyLen);
|
||||||
if (!h) {
|
if (!h) {
|
||||||
|
STsdb *pTsdb = pr->pVnode->pTsdb;
|
||||||
taosThreadMutexLock(&pTsdb->lruMutex);
|
taosThreadMutexLock(&pTsdb->lruMutex);
|
||||||
|
|
||||||
h = taosLRUCacheLookup(pCache, key, keyLen);
|
h = taosLRUCacheLookup(pCache, key, keyLen);
|
||||||
if (!h) {
|
if (!h) {
|
||||||
SArray *pArray = NULL;
|
SArray *pArray = NULL;
|
||||||
bool dup = false; // which is always false for now
|
bool dup = false; // which is always false for now
|
||||||
code = mergeLastRow(uid, pTsdb, &dup, &pArray);
|
code = mergeLastRow(uid, pTsdb, &dup, &pArray, pr);
|
||||||
// if table's empty or error, return code of -1
|
// if table's empty or error, return code of -1
|
||||||
if (code < 0 || pArray == NULL) {
|
if (code < 0 || pArray == NULL) {
|
||||||
if (!dup && pArray) {
|
if (!dup && pArray) {
|
||||||
|
@ -1392,17 +1439,17 @@ int32_t tsdbCacheGetLastrowH(SLRUCache *pCache, tb_uid_t uid, STsdb *pTsdb, LRUH
|
||||||
|
|
||||||
size_t charge = pArray->capacity * pArray->elemSize + sizeof(*pArray);
|
size_t charge = pArray->capacity * pArray->elemSize + sizeof(*pArray);
|
||||||
_taos_lru_deleter_t deleter = deleteTableCacheLast;
|
_taos_lru_deleter_t deleter = deleteTableCacheLast;
|
||||||
LRUStatus status = taosLRUCacheInsert(pCache, key, keyLen, pArray, charge, deleter, NULL, TAOS_LRU_PRIORITY_LOW);
|
LRUStatus status = taosLRUCacheInsert(pCache, key, keyLen, pArray, charge, deleter, &h, TAOS_LRU_PRIORITY_LOW);
|
||||||
if (status != TAOS_LRU_STATUS_OK) {
|
if (status != TAOS_LRU_STATUS_OK) {
|
||||||
code = -1;
|
code = -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
taosThreadMutexUnlock(&pTsdb->lruMutex);
|
// taosThreadMutexUnlock(&pTsdb->lruMutex);
|
||||||
|
|
||||||
h = taosLRUCacheLookup(pCache, key, keyLen);
|
// h = taosLRUCacheLookup(pCache, key, keyLen);
|
||||||
} else {
|
} // else {
|
||||||
taosThreadMutexUnlock(&pTsdb->lruMutex);
|
taosThreadMutexUnlock(&pTsdb->lruMutex);
|
||||||
}
|
//}
|
||||||
}
|
}
|
||||||
|
|
||||||
*handle = h;
|
*handle = h;
|
||||||
|
@ -1434,7 +1481,7 @@ _err:
|
||||||
return code;
|
return code;
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t tsdbCacheGetLastH(SLRUCache *pCache, tb_uid_t uid, STsdb *pTsdb, LRUHandle **handle) {
|
int32_t tsdbCacheGetLastH(SLRUCache *pCache, tb_uid_t uid, SCacheRowsReader *pr, LRUHandle **handle) {
|
||||||
int32_t code = 0;
|
int32_t code = 0;
|
||||||
char key[32] = {0};
|
char key[32] = {0};
|
||||||
int keyLen = 0;
|
int keyLen = 0;
|
||||||
|
@ -1443,12 +1490,13 @@ int32_t tsdbCacheGetLastH(SLRUCache *pCache, tb_uid_t uid, STsdb *pTsdb, LRUHand
|
||||||
getTableCacheKey(uid, 1, key, &keyLen);
|
getTableCacheKey(uid, 1, key, &keyLen);
|
||||||
LRUHandle *h = taosLRUCacheLookup(pCache, key, keyLen);
|
LRUHandle *h = taosLRUCacheLookup(pCache, key, keyLen);
|
||||||
if (!h) {
|
if (!h) {
|
||||||
|
STsdb *pTsdb = pr->pVnode->pTsdb;
|
||||||
taosThreadMutexLock(&pTsdb->lruMutex);
|
taosThreadMutexLock(&pTsdb->lruMutex);
|
||||||
|
|
||||||
h = taosLRUCacheLookup(pCache, key, keyLen);
|
h = taosLRUCacheLookup(pCache, key, keyLen);
|
||||||
if (!h) {
|
if (!h) {
|
||||||
SArray *pLastArray = NULL;
|
SArray *pLastArray = NULL;
|
||||||
code = mergeLast(uid, pTsdb, &pLastArray);
|
code = mergeLast(uid, pTsdb, &pLastArray, pr);
|
||||||
// if table's empty or error, return code of -1
|
// if table's empty or error, return code of -1
|
||||||
if (code < 0 || pLastArray == NULL) {
|
if (code < 0 || pLastArray == NULL) {
|
||||||
taosThreadMutexUnlock(&pTsdb->lruMutex);
|
taosThreadMutexUnlock(&pTsdb->lruMutex);
|
||||||
|
@ -1460,17 +1508,17 @@ int32_t tsdbCacheGetLastH(SLRUCache *pCache, tb_uid_t uid, STsdb *pTsdb, LRUHand
|
||||||
size_t charge = pLastArray->capacity * pLastArray->elemSize + sizeof(*pLastArray);
|
size_t charge = pLastArray->capacity * pLastArray->elemSize + sizeof(*pLastArray);
|
||||||
_taos_lru_deleter_t deleter = deleteTableCacheLast;
|
_taos_lru_deleter_t deleter = deleteTableCacheLast;
|
||||||
LRUStatus status =
|
LRUStatus status =
|
||||||
taosLRUCacheInsert(pCache, key, keyLen, pLastArray, charge, deleter, NULL, TAOS_LRU_PRIORITY_LOW);
|
taosLRUCacheInsert(pCache, key, keyLen, pLastArray, charge, deleter, &h, TAOS_LRU_PRIORITY_LOW);
|
||||||
if (status != TAOS_LRU_STATUS_OK) {
|
if (status != TAOS_LRU_STATUS_OK) {
|
||||||
code = -1;
|
code = -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
taosThreadMutexUnlock(&pTsdb->lruMutex);
|
// taosThreadMutexUnlock(&pTsdb->lruMutex);
|
||||||
|
|
||||||
h = taosLRUCacheLookup(pCache, key, keyLen);
|
// h = taosLRUCacheLookup(pCache, key, keyLen);
|
||||||
} else {
|
} // else {
|
||||||
taosThreadMutexUnlock(&pTsdb->lruMutex);
|
taosThreadMutexUnlock(&pTsdb->lruMutex);
|
||||||
}
|
//}
|
||||||
}
|
}
|
||||||
|
|
||||||
*handle = h;
|
*handle = h;
|
||||||
|
|
|
@ -18,17 +18,6 @@
|
||||||
#include "tcommon.h"
|
#include "tcommon.h"
|
||||||
#include "tsdb.h"
|
#include "tsdb.h"
|
||||||
|
|
||||||
typedef struct SCacheRowsReader {
|
|
||||||
SVnode* pVnode;
|
|
||||||
STSchema* pSchema;
|
|
||||||
uint64_t uid;
|
|
||||||
char** transferBuf; // todo remove it soon
|
|
||||||
int32_t numOfCols;
|
|
||||||
int32_t type;
|
|
||||||
int32_t tableIndex; // currently returned result tables
|
|
||||||
SArray* pTableList; // table id list
|
|
||||||
} SCacheRowsReader;
|
|
||||||
|
|
||||||
#define HASTYPE(_type, _t) (((_type) & (_t)) == (_t))
|
#define HASTYPE(_type, _t) (((_type) & (_t)) == (_t))
|
||||||
|
|
||||||
static void saveOneRow(SArray* pRow, SSDataBlock* pBlock, SCacheRowsReader* pReader, const int32_t* slotIds,
|
static void saveOneRow(SArray* pRow, SSDataBlock* pBlock, SCacheRowsReader* pReader, const int32_t* slotIds,
|
||||||
|
@ -75,7 +64,7 @@ static void saveOneRow(SArray* pRow, SSDataBlock* pBlock, SCacheRowsReader* pRea
|
||||||
colDataAppend(pColInfoData, numOfRows, (const char*)pRes[i], false);
|
colDataAppend(pColInfoData, numOfRows, (const char*)pRes[i], false);
|
||||||
}
|
}
|
||||||
|
|
||||||
pBlock->info.rows += allNullRow? 0:1;
|
pBlock->info.rows += allNullRow ? 0 : 1;
|
||||||
} else {
|
} else {
|
||||||
ASSERT(HASTYPE(pReader->type, CACHESCAN_RETRIEVE_LAST_ROW));
|
ASSERT(HASTYPE(pReader->type, CACHESCAN_RETRIEVE_LAST_ROW));
|
||||||
|
|
||||||
|
@ -108,7 +97,8 @@ static void saveOneRow(SArray* pRow, SSDataBlock* pBlock, SCacheRowsReader* pRea
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t tsdbCacherowsReaderOpen(void* pVnode, int32_t type, SArray* pTableIdList, int32_t numOfCols, void** pReader) {
|
int32_t tsdbCacherowsReaderOpen(void* pVnode, int32_t type, SArray* pTableIdList, int32_t numOfCols, uint64_t suid,
|
||||||
|
void** pReader) {
|
||||||
*pReader = NULL;
|
*pReader = NULL;
|
||||||
|
|
||||||
SCacheRowsReader* p = taosMemoryCalloc(1, sizeof(SCacheRowsReader));
|
SCacheRowsReader* p = taosMemoryCalloc(1, sizeof(SCacheRowsReader));
|
||||||
|
@ -119,6 +109,7 @@ int32_t tsdbCacherowsReaderOpen(void* pVnode, int32_t type, SArray* pTableIdList
|
||||||
p->type = type;
|
p->type = type;
|
||||||
p->pVnode = pVnode;
|
p->pVnode = pVnode;
|
||||||
p->numOfCols = numOfCols;
|
p->numOfCols = numOfCols;
|
||||||
|
p->suid = suid;
|
||||||
|
|
||||||
if (taosArrayGetSize(pTableIdList) == 0) {
|
if (taosArrayGetSize(pTableIdList) == 0) {
|
||||||
*pReader = p;
|
*pReader = p;
|
||||||
|
@ -145,6 +136,12 @@ int32_t tsdbCacherowsReaderOpen(void* pVnode, int32_t type, SArray* pTableIdList
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
p->pLoadInfo = tCreateLastBlockLoadInfo(p->pSchema, NULL, 0);
|
||||||
|
if (p->pLoadInfo == NULL) {
|
||||||
|
tsdbCacherowsReaderClose(p);
|
||||||
|
return TSDB_CODE_OUT_OF_MEMORY;
|
||||||
|
}
|
||||||
|
|
||||||
*pReader = p;
|
*pReader = p;
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
|
@ -161,6 +158,8 @@ void* tsdbCacherowsReaderClose(void* pReader) {
|
||||||
taosMemoryFree(p->pSchema);
|
taosMemoryFree(p->pSchema);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
destroyLastBlockLoadInfo(p->pLoadInfo);
|
||||||
|
|
||||||
taosMemoryFree(pReader);
|
taosMemoryFree(pReader);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
@ -171,9 +170,9 @@ static int32_t doExtractCacheRow(SCacheRowsReader* pr, SLRUCache* lruCache, uint
|
||||||
*pRow = NULL;
|
*pRow = NULL;
|
||||||
|
|
||||||
if (HASTYPE(pr->type, CACHESCAN_RETRIEVE_LAST_ROW)) {
|
if (HASTYPE(pr->type, CACHESCAN_RETRIEVE_LAST_ROW)) {
|
||||||
code = tsdbCacheGetLastrowH(lruCache, uid, pr->pVnode->pTsdb, h);
|
code = tsdbCacheGetLastrowH(lruCache, uid, pr, h);
|
||||||
} else {
|
} else {
|
||||||
code = tsdbCacheGetLastH(lruCache, uid, pr->pVnode->pTsdb, h);
|
code = tsdbCacheGetLastH(lruCache, uid, pr, h);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (code != TSDB_CODE_SUCCESS) {
|
if (code != TSDB_CODE_SUCCESS) {
|
||||||
|
@ -189,7 +188,7 @@ static int32_t doExtractCacheRow(SCacheRowsReader* pr, SLRUCache* lruCache, uint
|
||||||
}
|
}
|
||||||
|
|
||||||
static void freeItem(void* pItem) {
|
static void freeItem(void* pItem) {
|
||||||
SLastCol* pCol = (SLastCol*) pItem;
|
SLastCol* pCol = (SLastCol*)pItem;
|
||||||
if (IS_VAR_DATA_TYPE(pCol->colVal.type)) {
|
if (IS_VAR_DATA_TYPE(pCol->colVal.type)) {
|
||||||
taosMemoryFree(pCol->colVal.value.pData);
|
taosMemoryFree(pCol->colVal.value.pData);
|
||||||
}
|
}
|
||||||
|
@ -238,6 +237,10 @@ int32_t tsdbRetrieveCacheRows(void* pReader, SSDataBlock* pResBlock, const int32
|
||||||
taosArrayPush(pLastCols, &p);
|
taosArrayPush(pLastCols, &p);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
tsdbTakeReadSnap(pr->pVnode->pTsdb, &pr->pReadSnap, "cache-l");
|
||||||
|
pr->pDataFReader = NULL;
|
||||||
|
pr->pDataFReaderLast = NULL;
|
||||||
|
|
||||||
// retrieve the only one last row of all tables in the uid list.
|
// retrieve the only one last row of all tables in the uid list.
|
||||||
if (HASTYPE(pr->type, CACHESCAN_RETRIEVE_TYPE_SINGLE)) {
|
if (HASTYPE(pr->type, CACHESCAN_RETRIEVE_TYPE_SINGLE)) {
|
||||||
for (int32_t i = 0; i < numOfTables; ++i) {
|
for (int32_t i = 0; i < numOfTables; ++i) {
|
||||||
|
@ -306,7 +309,7 @@ int32_t tsdbRetrieveCacheRows(void* pReader, SSDataBlock* pResBlock, const int32
|
||||||
|
|
||||||
} else if (HASTYPE(pr->type, CACHESCAN_RETRIEVE_TYPE_ALL)) {
|
} else if (HASTYPE(pr->type, CACHESCAN_RETRIEVE_TYPE_ALL)) {
|
||||||
for (int32_t i = pr->tableIndex; i < numOfTables; ++i) {
|
for (int32_t i = pr->tableIndex; i < numOfTables; ++i) {
|
||||||
STableKeyInfo* pKeyInfo = (STableKeyInfo*) taosArrayGet(pr->pTableList, i);
|
STableKeyInfo* pKeyInfo = (STableKeyInfo*)taosArrayGet(pr->pTableList, i);
|
||||||
code = doExtractCacheRow(pr, lruCache, pKeyInfo->uid, &pRow, &h);
|
code = doExtractCacheRow(pr, lruCache, pKeyInfo->uid, &pRow, &h);
|
||||||
if (code != TSDB_CODE_SUCCESS) {
|
if (code != TSDB_CODE_SUCCESS) {
|
||||||
return code;
|
return code;
|
||||||
|
@ -331,7 +334,12 @@ int32_t tsdbRetrieveCacheRows(void* pReader, SSDataBlock* pResBlock, const int32
|
||||||
code = TSDB_CODE_INVALID_PARA;
|
code = TSDB_CODE_INVALID_PARA;
|
||||||
}
|
}
|
||||||
|
|
||||||
_end:
|
_end:
|
||||||
|
tsdbDataFReaderClose(&pr->pDataFReaderLast);
|
||||||
|
tsdbDataFReaderClose(&pr->pDataFReader);
|
||||||
|
|
||||||
|
tsdbUntakeReadSnap(pr->pVnode->pTsdb, pr->pReadSnap, "cache-l");
|
||||||
|
|
||||||
for (int32_t j = 0; j < pr->numOfCols; ++j) {
|
for (int32_t j = 0; j < pr->numOfCols; ++j) {
|
||||||
taosMemoryFree(pRes[j]);
|
taosMemoryFree(pRes[j]);
|
||||||
}
|
}
|
||||||
|
|
|
@ -1506,7 +1506,7 @@ static int32_t tsdbCommitTableData(SCommitter *pCommitter, TABLEID id) {
|
||||||
TSDB_CHECK_CODE(code, lino, _exit);
|
TSDB_CHECK_CODE(code, lino, _exit);
|
||||||
}
|
}
|
||||||
#else
|
#else
|
||||||
if (pCommitter->dWriter.bData.nRow >= pCommitter->maxRow) {
|
if (pCommitter->dWriter.bDatal.nRow >= pCommitter->maxRow) {
|
||||||
code = tsdbWriteSttBlock(pCommitter->dWriter.pWriter, &pCommitter->dWriter.bDatal, pCommitter->dWriter.aSttBlk,
|
code = tsdbWriteSttBlock(pCommitter->dWriter.pWriter, &pCommitter->dWriter.bDatal, pCommitter->dWriter.aSttBlk,
|
||||||
pCommitter->cmprAlg);
|
pCommitter->cmprAlg);
|
||||||
TSDB_CHECK_CODE(code, lino, _exit);
|
TSDB_CHECK_CODE(code, lino, _exit);
|
||||||
|
|
|
@ -152,8 +152,8 @@ static SBlockData *loadLastBlock(SLDataIter *pIter, const char *idStr) {
|
||||||
pInfo->loadBlocks += 1;
|
pInfo->loadBlocks += 1;
|
||||||
|
|
||||||
tsdbDebug("read last block, total load:%d, trigger by uid:%" PRIu64
|
tsdbDebug("read last block, total load:%d, trigger by uid:%" PRIu64
|
||||||
", last file index:%d, last block index:%d, entry:%d, %p, elapsed time:%.2f ms, %s",
|
", last file index:%d, last block index:%d, entry:%d, rows:%d, %p, elapsed time:%.2f ms, %s",
|
||||||
pInfo->loadBlocks, pIter->uid, pIter->iStt, pIter->iSttBlk, pInfo->currentLoadBlockIndex, pBlock, el,
|
pInfo->loadBlocks, pIter->uid, pIter->iStt, pIter->iSttBlk, pInfo->currentLoadBlockIndex, pBlock->nRow, pBlock, el,
|
||||||
idStr);
|
idStr);
|
||||||
|
|
||||||
pInfo->blockIndex[pInfo->currentLoadBlockIndex] = pIter->iSttBlk;
|
pInfo->blockIndex[pInfo->currentLoadBlockIndex] = pIter->iSttBlk;
|
||||||
|
|
|
@ -2139,6 +2139,7 @@ static int64_t getCurrentKeyInLastBlock(SLastBlockReader* pLastBlockReader) {
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool hasDataInLastBlock(SLastBlockReader* pLastBlockReader) { return pLastBlockReader->mergeTree.pIter != NULL; }
|
static bool hasDataInLastBlock(SLastBlockReader* pLastBlockReader) { return pLastBlockReader->mergeTree.pIter != NULL; }
|
||||||
|
|
||||||
bool hasDataInFileBlock(const SBlockData* pBlockData, const SFileBlockDumpInfo* pDumpInfo) {
|
bool hasDataInFileBlock(const SBlockData* pBlockData, const SFileBlockDumpInfo* pDumpInfo) {
|
||||||
if (pBlockData->nRow > 0) {
|
if (pBlockData->nRow > 0) {
|
||||||
ASSERT(pBlockData->nRow == pDumpInfo->totalRows);
|
ASSERT(pBlockData->nRow == pDumpInfo->totalRows);
|
||||||
|
@ -2619,6 +2620,7 @@ static int32_t doBuildDataBlock(STsdbReader* pReader) {
|
||||||
ASSERT(tsLast >= pBlock->maxKey.ts);
|
ASSERT(tsLast >= pBlock->maxKey.ts);
|
||||||
tBlockDataReset(&pReader->status.fileBlockData);
|
tBlockDataReset(&pReader->status.fileBlockData);
|
||||||
|
|
||||||
|
tsdbDebug("load data in last block firstly, due to desc scan data, %s", pReader->idStr);
|
||||||
code = buildComposedDataBlock(pReader);
|
code = buildComposedDataBlock(pReader);
|
||||||
} else { // whole block is required, return it directly
|
} else { // whole block is required, return it directly
|
||||||
SDataBlockInfo* pInfo = &pReader->pResBlock->info;
|
SDataBlockInfo* pInfo = &pReader->pResBlock->info;
|
||||||
|
|
|
@ -570,7 +570,7 @@ int32_t catalogInit(SCatalogCfg* cfg) {
|
||||||
CTG_ERR_RET(TSDB_CODE_CTG_INVALID_INPUT);
|
CTG_ERR_RET(TSDB_CODE_CTG_INVALID_INPUT);
|
||||||
}
|
}
|
||||||
|
|
||||||
atomic_store_8((int8_t*)&gCtgMgmt.exit, false);
|
memset(&gCtgMgmt, 0, sizeof(gCtgMgmt));
|
||||||
|
|
||||||
if (cfg) {
|
if (cfg) {
|
||||||
memcpy(&gCtgMgmt.cfg, cfg, sizeof(*cfg));
|
memcpy(&gCtgMgmt.cfg, cfg, sizeof(*cfg));
|
||||||
|
|
|
@ -72,7 +72,10 @@ void ctgRUnlockVgInfo(SCtgDBCache *dbCache) { CTG_UNLOCK(CTG_READ, &dbCache->vgC
|
||||||
|
|
||||||
void ctgWUnlockVgInfo(SCtgDBCache *dbCache) { CTG_UNLOCK(CTG_WRITE, &dbCache->vgCache.vgLock); }
|
void ctgWUnlockVgInfo(SCtgDBCache *dbCache) { CTG_UNLOCK(CTG_WRITE, &dbCache->vgCache.vgLock); }
|
||||||
|
|
||||||
void ctgReleaseDBCache(SCatalog *pCtg, SCtgDBCache *dbCache) { CTG_UNLOCK(CTG_READ, &dbCache->dbLock); }
|
void ctgReleaseDBCache(SCatalog *pCtg, SCtgDBCache *dbCache) {
|
||||||
|
CTG_UNLOCK(CTG_READ, &dbCache->dbLock);
|
||||||
|
taosHashRelease(pCtg->dbCache, dbCache);
|
||||||
|
}
|
||||||
|
|
||||||
int32_t ctgAcquireDBCacheImpl(SCatalog *pCtg, const char *dbFName, SCtgDBCache **pCache, bool acquire) {
|
int32_t ctgAcquireDBCacheImpl(SCatalog *pCtg, const char *dbFName, SCtgDBCache **pCache, bool acquire) {
|
||||||
char *p = strchr(dbFName, '.');
|
char *p = strchr(dbFName, '.');
|
||||||
|
@ -80,7 +83,14 @@ int32_t ctgAcquireDBCacheImpl(SCatalog *pCtg, const char *dbFName, SCtgDBCache *
|
||||||
dbFName = p + 1;
|
dbFName = p + 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
SCtgDBCache *dbCache = (SCtgDBCache *)taosHashGet(pCtg->dbCache, dbFName, strlen(dbFName));
|
SCtgDBCache *dbCache = NULL;
|
||||||
|
|
||||||
|
if (acquire) {
|
||||||
|
dbCache = (SCtgDBCache *)taosHashAcquire(pCtg->dbCache, dbFName, strlen(dbFName));
|
||||||
|
} else {
|
||||||
|
dbCache = (SCtgDBCache *)taosHashGet(pCtg->dbCache, dbFName, strlen(dbFName));
|
||||||
|
}
|
||||||
|
|
||||||
if (NULL == dbCache) {
|
if (NULL == dbCache) {
|
||||||
*pCache = NULL;
|
*pCache = NULL;
|
||||||
ctgDebug("db not in cache, dbFName:%s", dbFName);
|
ctgDebug("db not in cache, dbFName:%s", dbFName);
|
||||||
|
@ -1356,7 +1366,6 @@ int32_t ctgWriteTbMetaToCache(SCatalog *pCtg, SCtgDBCache *dbCache, char *dbFNam
|
||||||
SCtgTbCache *pCache = taosHashGet(dbCache->tbCache, tbName, strlen(tbName));
|
SCtgTbCache *pCache = taosHashGet(dbCache->tbCache, tbName, strlen(tbName));
|
||||||
STableMeta *orig = (pCache ? pCache->pMeta : NULL);
|
STableMeta *orig = (pCache ? pCache->pMeta : NULL);
|
||||||
int8_t origType = 0;
|
int8_t origType = 0;
|
||||||
uint64_t origSuid = 0;
|
|
||||||
|
|
||||||
if (orig) {
|
if (orig) {
|
||||||
origType = orig->tableType;
|
origType = orig->tableType;
|
||||||
|
@ -1375,8 +1384,6 @@ int32_t ctgWriteTbMetaToCache(SCatalog *pCtg, SCtgDBCache *dbCache, char *dbFNam
|
||||||
CTG_CACHE_STAT_DEC(numOfStb, 1);
|
CTG_CACHE_STAT_DEC(numOfStb, 1);
|
||||||
ctgDebug("stb removed from stbCache, dbFName:%s, stb:%s, suid:0x%" PRIx64, dbFName, tbName, orig->suid);
|
ctgDebug("stb removed from stbCache, dbFName:%s, stb:%s, suid:0x%" PRIx64, dbFName, tbName, orig->suid);
|
||||||
}
|
}
|
||||||
|
|
||||||
origSuid = orig->suid;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1408,8 +1415,7 @@ int32_t ctgWriteTbMetaToCache(SCatalog *pCtg, SCtgDBCache *dbCache, char *dbFNam
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (origSuid != meta->suid &&
|
if (taosHashPut(dbCache->stbCache, &meta->suid, sizeof(meta->suid), tbName, strlen(tbName) + 1) != 0) {
|
||||||
taosHashPut(dbCache->stbCache, &meta->suid, sizeof(meta->suid), tbName, strlen(tbName) + 1) != 0) {
|
|
||||||
ctgError("taosHashPut to stable cache failed, suid:0x%" PRIx64, meta->suid);
|
ctgError("taosHashPut to stable cache failed, suid:0x%" PRIx64, meta->suid);
|
||||||
CTG_ERR_RET(TSDB_CODE_OUT_OF_MEMORY);
|
CTG_ERR_RET(TSDB_CODE_OUT_OF_MEMORY);
|
||||||
}
|
}
|
||||||
|
|
|
@ -18,8 +18,8 @@ IF(NOT TD_DARWIN)
|
||||||
PRIVATE "${TD_SOURCE_DIR}/source/libs/catalog/inc"
|
PRIVATE "${TD_SOURCE_DIR}/source/libs/catalog/inc"
|
||||||
)
|
)
|
||||||
|
|
||||||
# add_test(
|
#add_test(
|
||||||
# NAME catalogTest
|
# NAME catalogTest
|
||||||
# COMMAND catalogTest
|
# COMMAND catalogTest
|
||||||
# )
|
#)
|
||||||
ENDIF()
|
ENDIF()
|
||||||
|
|
|
@ -142,6 +142,7 @@ void ctgTestInitLogFile() {
|
||||||
ctgdEnableDebug("api");
|
ctgdEnableDebug("api");
|
||||||
ctgdEnableDebug("meta");
|
ctgdEnableDebug("meta");
|
||||||
ctgdEnableDebug("cache");
|
ctgdEnableDebug("cache");
|
||||||
|
ctgdEnableDebug("lock");
|
||||||
|
|
||||||
if (taosInitLog(defaultLogFileNamePrefix, maxLogFileNum) < 0) {
|
if (taosInitLog(defaultLogFileNamePrefix, maxLogFileNum) < 0) {
|
||||||
printf("failed to open log file in directory:%s\n", tsLogDir);
|
printf("failed to open log file in directory:%s\n", tsLogDir);
|
||||||
|
@ -254,8 +255,8 @@ void ctgTestBuildSTableMetaRsp(STableMetaRsp *rspMsg) {
|
||||||
rspMsg->tableType = TSDB_SUPER_TABLE;
|
rspMsg->tableType = TSDB_SUPER_TABLE;
|
||||||
rspMsg->sversion = ctgTestSVersion + 1;
|
rspMsg->sversion = ctgTestSVersion + 1;
|
||||||
rspMsg->tversion = ctgTestTVersion + 1;
|
rspMsg->tversion = ctgTestTVersion + 1;
|
||||||
rspMsg->suid = ctgTestSuid + 1;
|
rspMsg->suid = ctgTestSuid;
|
||||||
rspMsg->tuid = ctgTestSuid + 1;
|
rspMsg->tuid = ctgTestSuid;
|
||||||
rspMsg->vgId = 1;
|
rspMsg->vgId = 1;
|
||||||
|
|
||||||
rspMsg->pSchemas = (SSchema *)taosMemoryCalloc(rspMsg->numOfTags + rspMsg->numOfColumns, sizeof(SSchema));
|
rspMsg->pSchemas = (SSchema *)taosMemoryCalloc(rspMsg->numOfTags + rspMsg->numOfColumns, sizeof(SSchema));
|
||||||
|
@ -423,7 +424,7 @@ void ctgTestRspSTableMeta(void *shandle, SEpSet *pEpSet, SRpcMsg *pMsg, SRpcMsg
|
||||||
metaRsp.sversion = ctgTestSVersion;
|
metaRsp.sversion = ctgTestSVersion;
|
||||||
metaRsp.tversion = ctgTestTVersion;
|
metaRsp.tversion = ctgTestTVersion;
|
||||||
metaRsp.suid = ctgTestSuid;
|
metaRsp.suid = ctgTestSuid;
|
||||||
metaRsp.tuid = ctgTestSuid++;
|
metaRsp.tuid = ctgTestSuid+1;
|
||||||
metaRsp.vgId = 0;
|
metaRsp.vgId = 0;
|
||||||
metaRsp.pSchemas = (SSchema *)taosMemoryMalloc((metaRsp.numOfTags + metaRsp.numOfColumns) * sizeof(SSchema));
|
metaRsp.pSchemas = (SSchema *)taosMemoryMalloc((metaRsp.numOfTags + metaRsp.numOfColumns) * sizeof(SSchema));
|
||||||
|
|
||||||
|
@ -773,13 +774,15 @@ void ctgTestSetRspDbVgroupsAndMultiSuperMeta() {
|
||||||
void *ctgTestGetDbVgroupThread(void *param) {
|
void *ctgTestGetDbVgroupThread(void *param) {
|
||||||
struct SCatalog *pCtg = (struct SCatalog *)param;
|
struct SCatalog *pCtg = (struct SCatalog *)param;
|
||||||
int32_t code = 0;
|
int32_t code = 0;
|
||||||
SRequestConnInfo *mockPointer = (SRequestConnInfo *)0x1;
|
SRequestConnInfo connInfo = {0};
|
||||||
|
SRequestConnInfo *mockPointer = (SRequestConnInfo *)&connInfo;
|
||||||
SArray *vgList = NULL;
|
SArray *vgList = NULL;
|
||||||
int32_t n = 0;
|
int32_t n = 0;
|
||||||
|
|
||||||
while (!ctgTestStop) {
|
while (!ctgTestStop) {
|
||||||
code = catalogGetDBVgList(pCtg, mockPointer, ctgTestDbname, &vgList);
|
code = catalogGetDBVgList(pCtg, mockPointer, ctgTestDbname, &vgList);
|
||||||
if (code) {
|
if (code) {
|
||||||
|
printf("code:%x\n", code);
|
||||||
assert(0);
|
assert(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -863,7 +866,7 @@ void *ctgTestGetCtableMetaThread(void *param) {
|
||||||
|
|
||||||
while (!ctgTestStop) {
|
while (!ctgTestStop) {
|
||||||
code = ctgReadTbMetaFromCache(pCtg, &ctx, &tbMeta);
|
code = ctgReadTbMetaFromCache(pCtg, &ctx, &tbMeta);
|
||||||
if (code || !inCache) {
|
if (code || NULL == tbMeta) {
|
||||||
assert(0);
|
assert(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -917,12 +920,12 @@ void *ctgTestSetCtableMetaThread(void *param) {
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
#if 1
|
|
||||||
|
|
||||||
TEST(tableMeta, normalTable) {
|
TEST(tableMeta, normalTable) {
|
||||||
struct SCatalog *pCtg = NULL;
|
struct SCatalog *pCtg = NULL;
|
||||||
SRequestConnInfo *mockPointer = (SRequestConnInfo *)0x1;
|
|
||||||
SVgroupInfo vgInfo = {0};
|
SVgroupInfo vgInfo = {0};
|
||||||
|
SRequestConnInfo connInfo = {0};
|
||||||
|
SRequestConnInfo *mockPointer = (SRequestConnInfo *)&connInfo;
|
||||||
|
|
||||||
ctgTestInitLogFile();
|
ctgTestInitLogFile();
|
||||||
|
|
||||||
|
@ -1028,7 +1031,8 @@ TEST(tableMeta, normalTable) {
|
||||||
|
|
||||||
TEST(tableMeta, childTableCase) {
|
TEST(tableMeta, childTableCase) {
|
||||||
struct SCatalog *pCtg = NULL;
|
struct SCatalog *pCtg = NULL;
|
||||||
SRequestConnInfo *mockPointer = (SRequestConnInfo *)0x1;
|
SRequestConnInfo connInfo = {0};
|
||||||
|
SRequestConnInfo *mockPointer = (SRequestConnInfo *)&connInfo;
|
||||||
SVgroupInfo vgInfo = {0};
|
SVgroupInfo vgInfo = {0};
|
||||||
|
|
||||||
ctgTestInitLogFile();
|
ctgTestInitLogFile();
|
||||||
|
@ -1136,7 +1140,8 @@ TEST(tableMeta, childTableCase) {
|
||||||
|
|
||||||
TEST(tableMeta, superTableCase) {
|
TEST(tableMeta, superTableCase) {
|
||||||
struct SCatalog *pCtg = NULL;
|
struct SCatalog *pCtg = NULL;
|
||||||
SRequestConnInfo *mockPointer = (SRequestConnInfo *)0x1;
|
SRequestConnInfo connInfo = {0};
|
||||||
|
SRequestConnInfo *mockPointer = (SRequestConnInfo *)&connInfo;
|
||||||
SVgroupInfo vgInfo = {0};
|
SVgroupInfo vgInfo = {0};
|
||||||
|
|
||||||
ctgTestSetRspDbVgroupsAndSuperMeta();
|
ctgTestSetRspDbVgroupsAndSuperMeta();
|
||||||
|
@ -1161,8 +1166,8 @@ TEST(tableMeta, superTableCase) {
|
||||||
ASSERT_EQ(tableMeta->tableType, TSDB_SUPER_TABLE);
|
ASSERT_EQ(tableMeta->tableType, TSDB_SUPER_TABLE);
|
||||||
ASSERT_EQ(tableMeta->sversion, ctgTestSVersion);
|
ASSERT_EQ(tableMeta->sversion, ctgTestSVersion);
|
||||||
ASSERT_EQ(tableMeta->tversion, ctgTestTVersion);
|
ASSERT_EQ(tableMeta->tversion, ctgTestTVersion);
|
||||||
ASSERT_EQ(tableMeta->uid, ctgTestSuid - 1);
|
ASSERT_EQ(tableMeta->uid, ctgTestSuid);
|
||||||
ASSERT_EQ(tableMeta->suid, ctgTestSuid - 1);
|
ASSERT_EQ(tableMeta->suid, ctgTestSuid);
|
||||||
ASSERT_EQ(tableMeta->tableInfo.numOfColumns, ctgTestColNum);
|
ASSERT_EQ(tableMeta->tableInfo.numOfColumns, ctgTestColNum);
|
||||||
ASSERT_EQ(tableMeta->tableInfo.numOfTags, ctgTestTagNum);
|
ASSERT_EQ(tableMeta->tableInfo.numOfTags, ctgTestTagNum);
|
||||||
ASSERT_EQ(tableMeta->tableInfo.precision, 1);
|
ASSERT_EQ(tableMeta->tableInfo.precision, 1);
|
||||||
|
@ -1257,7 +1262,8 @@ TEST(tableMeta, superTableCase) {
|
||||||
|
|
||||||
TEST(tableMeta, rmStbMeta) {
|
TEST(tableMeta, rmStbMeta) {
|
||||||
struct SCatalog *pCtg = NULL;
|
struct SCatalog *pCtg = NULL;
|
||||||
SRequestConnInfo *mockPointer = (SRequestConnInfo *)0x1;
|
SRequestConnInfo connInfo = {0};
|
||||||
|
SRequestConnInfo *mockPointer = (SRequestConnInfo *)&connInfo;
|
||||||
SVgroupInfo vgInfo = {0};
|
SVgroupInfo vgInfo = {0};
|
||||||
|
|
||||||
ctgTestInitLogFile();
|
ctgTestInitLogFile();
|
||||||
|
@ -1284,8 +1290,8 @@ TEST(tableMeta, rmStbMeta) {
|
||||||
ASSERT_EQ(tableMeta->tableType, TSDB_SUPER_TABLE);
|
ASSERT_EQ(tableMeta->tableType, TSDB_SUPER_TABLE);
|
||||||
ASSERT_EQ(tableMeta->sversion, ctgTestSVersion);
|
ASSERT_EQ(tableMeta->sversion, ctgTestSVersion);
|
||||||
ASSERT_EQ(tableMeta->tversion, ctgTestTVersion);
|
ASSERT_EQ(tableMeta->tversion, ctgTestTVersion);
|
||||||
ASSERT_EQ(tableMeta->uid, ctgTestSuid - 1);
|
ASSERT_EQ(tableMeta->uid, ctgTestSuid);
|
||||||
ASSERT_EQ(tableMeta->suid, ctgTestSuid - 1);
|
ASSERT_EQ(tableMeta->suid, ctgTestSuid);
|
||||||
ASSERT_EQ(tableMeta->tableInfo.numOfColumns, ctgTestColNum);
|
ASSERT_EQ(tableMeta->tableInfo.numOfColumns, ctgTestColNum);
|
||||||
ASSERT_EQ(tableMeta->tableInfo.numOfTags, ctgTestTagNum);
|
ASSERT_EQ(tableMeta->tableInfo.numOfTags, ctgTestTagNum);
|
||||||
ASSERT_EQ(tableMeta->tableInfo.precision, 1);
|
ASSERT_EQ(tableMeta->tableInfo.precision, 1);
|
||||||
|
@ -1300,7 +1306,7 @@ TEST(tableMeta, rmStbMeta) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
code = catalogRemoveStbMeta(pCtg, "1.db1", ctgTestDbId, ctgTestSTablename, ctgTestSuid - 1);
|
code = catalogRemoveStbMeta(pCtg, "1.db1", ctgTestDbId, ctgTestSTablename, ctgTestSuid);
|
||||||
ASSERT_EQ(code, 0);
|
ASSERT_EQ(code, 0);
|
||||||
|
|
||||||
while (true) {
|
while (true) {
|
||||||
|
@ -1325,7 +1331,8 @@ TEST(tableMeta, rmStbMeta) {
|
||||||
|
|
||||||
TEST(tableMeta, updateStbMeta) {
|
TEST(tableMeta, updateStbMeta) {
|
||||||
struct SCatalog *pCtg = NULL;
|
struct SCatalog *pCtg = NULL;
|
||||||
SRequestConnInfo *mockPointer = (SRequestConnInfo *)0x1;
|
SRequestConnInfo connInfo = {0};
|
||||||
|
SRequestConnInfo *mockPointer = (SRequestConnInfo *)&connInfo;
|
||||||
SVgroupInfo vgInfo = {0};
|
SVgroupInfo vgInfo = {0};
|
||||||
|
|
||||||
ctgTestInitLogFile();
|
ctgTestInitLogFile();
|
||||||
|
@ -1352,8 +1359,8 @@ TEST(tableMeta, updateStbMeta) {
|
||||||
ASSERT_EQ(tableMeta->tableType, TSDB_SUPER_TABLE);
|
ASSERT_EQ(tableMeta->tableType, TSDB_SUPER_TABLE);
|
||||||
ASSERT_EQ(tableMeta->sversion, ctgTestSVersion);
|
ASSERT_EQ(tableMeta->sversion, ctgTestSVersion);
|
||||||
ASSERT_EQ(tableMeta->tversion, ctgTestTVersion);
|
ASSERT_EQ(tableMeta->tversion, ctgTestTVersion);
|
||||||
ASSERT_EQ(tableMeta->uid, ctgTestSuid - 1);
|
ASSERT_EQ(tableMeta->uid, ctgTestSuid);
|
||||||
ASSERT_EQ(tableMeta->suid, ctgTestSuid - 1);
|
ASSERT_EQ(tableMeta->suid, ctgTestSuid);
|
||||||
ASSERT_EQ(tableMeta->tableInfo.numOfColumns, ctgTestColNum);
|
ASSERT_EQ(tableMeta->tableInfo.numOfColumns, ctgTestColNum);
|
||||||
ASSERT_EQ(tableMeta->tableInfo.numOfTags, ctgTestTagNum);
|
ASSERT_EQ(tableMeta->tableInfo.numOfTags, ctgTestTagNum);
|
||||||
ASSERT_EQ(tableMeta->tableInfo.precision, 1);
|
ASSERT_EQ(tableMeta->tableInfo.precision, 1);
|
||||||
|
@ -1399,8 +1406,8 @@ TEST(tableMeta, updateStbMeta) {
|
||||||
ASSERT_EQ(tableMeta->tableType, TSDB_SUPER_TABLE);
|
ASSERT_EQ(tableMeta->tableType, TSDB_SUPER_TABLE);
|
||||||
ASSERT_EQ(tableMeta->sversion, ctgTestSVersion + 1);
|
ASSERT_EQ(tableMeta->sversion, ctgTestSVersion + 1);
|
||||||
ASSERT_EQ(tableMeta->tversion, ctgTestTVersion + 1);
|
ASSERT_EQ(tableMeta->tversion, ctgTestTVersion + 1);
|
||||||
ASSERT_EQ(tableMeta->uid, ctgTestSuid + 1);
|
ASSERT_EQ(tableMeta->uid, ctgTestSuid);
|
||||||
ASSERT_EQ(tableMeta->suid, ctgTestSuid + 1);
|
ASSERT_EQ(tableMeta->suid, ctgTestSuid);
|
||||||
ASSERT_EQ(tableMeta->tableInfo.numOfColumns, ctgTestColNum);
|
ASSERT_EQ(tableMeta->tableInfo.numOfColumns, ctgTestColNum);
|
||||||
ASSERT_EQ(tableMeta->tableInfo.numOfTags, ctgTestTagNum);
|
ASSERT_EQ(tableMeta->tableInfo.numOfTags, ctgTestTagNum);
|
||||||
ASSERT_EQ(tableMeta->tableInfo.precision, 1 + 1);
|
ASSERT_EQ(tableMeta->tableInfo.precision, 1 + 1);
|
||||||
|
@ -1414,7 +1421,8 @@ TEST(tableMeta, updateStbMeta) {
|
||||||
|
|
||||||
TEST(refreshGetMeta, normal2normal) {
|
TEST(refreshGetMeta, normal2normal) {
|
||||||
struct SCatalog *pCtg = NULL;
|
struct SCatalog *pCtg = NULL;
|
||||||
SRequestConnInfo *mockPointer = (SRequestConnInfo *)0x1;
|
SRequestConnInfo connInfo = {0};
|
||||||
|
SRequestConnInfo *mockPointer = (SRequestConnInfo *)&connInfo;
|
||||||
SVgroupInfo vgInfo = {0};
|
SVgroupInfo vgInfo = {0};
|
||||||
SArray *vgList = NULL;
|
SArray *vgList = NULL;
|
||||||
|
|
||||||
|
@ -1493,7 +1501,8 @@ TEST(refreshGetMeta, normal2normal) {
|
||||||
|
|
||||||
TEST(refreshGetMeta, normal2notexist) {
|
TEST(refreshGetMeta, normal2notexist) {
|
||||||
struct SCatalog *pCtg = NULL;
|
struct SCatalog *pCtg = NULL;
|
||||||
SRequestConnInfo *mockPointer = (SRequestConnInfo *)0x1;
|
SRequestConnInfo connInfo = {0};
|
||||||
|
SRequestConnInfo *mockPointer = (SRequestConnInfo *)&connInfo;
|
||||||
SVgroupInfo vgInfo = {0};
|
SVgroupInfo vgInfo = {0};
|
||||||
SArray *vgList = NULL;
|
SArray *vgList = NULL;
|
||||||
|
|
||||||
|
@ -1563,7 +1572,8 @@ TEST(refreshGetMeta, normal2notexist) {
|
||||||
|
|
||||||
TEST(refreshGetMeta, normal2child) {
|
TEST(refreshGetMeta, normal2child) {
|
||||||
struct SCatalog *pCtg = NULL;
|
struct SCatalog *pCtg = NULL;
|
||||||
SRequestConnInfo *mockPointer = (SRequestConnInfo *)0x1;
|
SRequestConnInfo connInfo = {0};
|
||||||
|
SRequestConnInfo *mockPointer = (SRequestConnInfo *)&connInfo;
|
||||||
SVgroupInfo vgInfo = {0};
|
SVgroupInfo vgInfo = {0};
|
||||||
SArray *vgList = NULL;
|
SArray *vgList = NULL;
|
||||||
|
|
||||||
|
@ -1644,9 +1654,11 @@ TEST(refreshGetMeta, normal2child) {
|
||||||
ctgTestCurrentSTableName = NULL;
|
ctgTestCurrentSTableName = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
TEST(refreshGetMeta, stable2child) {
|
TEST(refreshGetMeta, stable2child) {
|
||||||
struct SCatalog *pCtg = NULL;
|
struct SCatalog *pCtg = NULL;
|
||||||
SRequestConnInfo *mockPointer = (SRequestConnInfo *)0x1;
|
SRequestConnInfo connInfo = {0};
|
||||||
|
SRequestConnInfo *mockPointer = (SRequestConnInfo *)&connInfo;
|
||||||
SVgroupInfo vgInfo = {0};
|
SVgroupInfo vgInfo = {0};
|
||||||
SArray *vgList = NULL;
|
SArray *vgList = NULL;
|
||||||
|
|
||||||
|
@ -1699,8 +1711,8 @@ TEST(refreshGetMeta, stable2child) {
|
||||||
ASSERT_EQ(tableMeta->tableType, TSDB_SUPER_TABLE);
|
ASSERT_EQ(tableMeta->tableType, TSDB_SUPER_TABLE);
|
||||||
ASSERT_EQ(tableMeta->sversion, ctgTestSVersion);
|
ASSERT_EQ(tableMeta->sversion, ctgTestSVersion);
|
||||||
ASSERT_EQ(tableMeta->tversion, ctgTestTVersion);
|
ASSERT_EQ(tableMeta->tversion, ctgTestTVersion);
|
||||||
ASSERT_EQ(tableMeta->uid, ctgTestSuid - 1);
|
ASSERT_EQ(tableMeta->uid, ctgTestSuid);
|
||||||
ASSERT_EQ(tableMeta->suid, ctgTestSuid - 1);
|
ASSERT_EQ(tableMeta->suid, ctgTestSuid);
|
||||||
ASSERT_EQ(tableMeta->tableInfo.numOfColumns, ctgTestColNum);
|
ASSERT_EQ(tableMeta->tableInfo.numOfColumns, ctgTestColNum);
|
||||||
ASSERT_EQ(tableMeta->tableInfo.numOfTags, ctgTestTagNum);
|
ASSERT_EQ(tableMeta->tableInfo.numOfTags, ctgTestTagNum);
|
||||||
ASSERT_EQ(tableMeta->tableInfo.precision, 1);
|
ASSERT_EQ(tableMeta->tableInfo.precision, 1);
|
||||||
|
@ -1732,7 +1744,8 @@ TEST(refreshGetMeta, stable2child) {
|
||||||
|
|
||||||
TEST(refreshGetMeta, stable2stable) {
|
TEST(refreshGetMeta, stable2stable) {
|
||||||
struct SCatalog *pCtg = NULL;
|
struct SCatalog *pCtg = NULL;
|
||||||
SRequestConnInfo *mockPointer = (SRequestConnInfo *)0x1;
|
SRequestConnInfo connInfo = {0};
|
||||||
|
SRequestConnInfo *mockPointer = (SRequestConnInfo *)&connInfo;
|
||||||
SVgroupInfo vgInfo = {0};
|
SVgroupInfo vgInfo = {0};
|
||||||
SArray *vgList = NULL;
|
SArray *vgList = NULL;
|
||||||
|
|
||||||
|
@ -1784,8 +1797,8 @@ TEST(refreshGetMeta, stable2stable) {
|
||||||
ASSERT_EQ(tableMeta->tableType, TSDB_SUPER_TABLE);
|
ASSERT_EQ(tableMeta->tableType, TSDB_SUPER_TABLE);
|
||||||
ASSERT_EQ(tableMeta->sversion, ctgTestSVersion);
|
ASSERT_EQ(tableMeta->sversion, ctgTestSVersion);
|
||||||
ASSERT_EQ(tableMeta->tversion, ctgTestTVersion);
|
ASSERT_EQ(tableMeta->tversion, ctgTestTVersion);
|
||||||
ASSERT_EQ(tableMeta->uid, ctgTestSuid - 1);
|
ASSERT_EQ(tableMeta->uid, ctgTestSuid);
|
||||||
ASSERT_EQ(tableMeta->suid, ctgTestSuid - 1);
|
ASSERT_EQ(tableMeta->suid, ctgTestSuid);
|
||||||
ASSERT_EQ(tableMeta->tableInfo.numOfColumns, ctgTestColNum);
|
ASSERT_EQ(tableMeta->tableInfo.numOfColumns, ctgTestColNum);
|
||||||
ASSERT_EQ(tableMeta->tableInfo.numOfTags, ctgTestTagNum);
|
ASSERT_EQ(tableMeta->tableInfo.numOfTags, ctgTestTagNum);
|
||||||
ASSERT_EQ(tableMeta->tableInfo.precision, 1);
|
ASSERT_EQ(tableMeta->tableInfo.precision, 1);
|
||||||
|
@ -1802,8 +1815,8 @@ TEST(refreshGetMeta, stable2stable) {
|
||||||
ASSERT_EQ(tableMeta->tableType, TSDB_SUPER_TABLE);
|
ASSERT_EQ(tableMeta->tableType, TSDB_SUPER_TABLE);
|
||||||
ASSERT_EQ(tableMeta->sversion, ctgTestSVersion);
|
ASSERT_EQ(tableMeta->sversion, ctgTestSVersion);
|
||||||
ASSERT_EQ(tableMeta->tversion, ctgTestTVersion);
|
ASSERT_EQ(tableMeta->tversion, ctgTestTVersion);
|
||||||
ASSERT_EQ(tableMeta->uid, ctgTestSuid - 1);
|
ASSERT_EQ(tableMeta->uid, ctgTestSuid);
|
||||||
ASSERT_EQ(tableMeta->suid, ctgTestSuid - 1);
|
ASSERT_EQ(tableMeta->suid, ctgTestSuid);
|
||||||
ASSERT_EQ(tableMeta->tableInfo.numOfColumns, ctgTestColNum);
|
ASSERT_EQ(tableMeta->tableInfo.numOfColumns, ctgTestColNum);
|
||||||
ASSERT_EQ(tableMeta->tableInfo.numOfTags, ctgTestTagNum);
|
ASSERT_EQ(tableMeta->tableInfo.numOfTags, ctgTestTagNum);
|
||||||
ASSERT_EQ(tableMeta->tableInfo.precision, 1);
|
ASSERT_EQ(tableMeta->tableInfo.precision, 1);
|
||||||
|
@ -1818,7 +1831,8 @@ TEST(refreshGetMeta, stable2stable) {
|
||||||
|
|
||||||
TEST(refreshGetMeta, child2stable) {
|
TEST(refreshGetMeta, child2stable) {
|
||||||
struct SCatalog *pCtg = NULL;
|
struct SCatalog *pCtg = NULL;
|
||||||
SRequestConnInfo *mockPointer = (SRequestConnInfo *)0x1;
|
SRequestConnInfo connInfo = {0};
|
||||||
|
SRequestConnInfo *mockPointer = (SRequestConnInfo *)&connInfo;
|
||||||
SVgroupInfo vgInfo = {0};
|
SVgroupInfo vgInfo = {0};
|
||||||
SArray *vgList = NULL;
|
SArray *vgList = NULL;
|
||||||
|
|
||||||
|
@ -1888,8 +1902,8 @@ TEST(refreshGetMeta, child2stable) {
|
||||||
ASSERT_EQ(tableMeta->tableType, TSDB_SUPER_TABLE);
|
ASSERT_EQ(tableMeta->tableType, TSDB_SUPER_TABLE);
|
||||||
ASSERT_EQ(tableMeta->sversion, ctgTestSVersion);
|
ASSERT_EQ(tableMeta->sversion, ctgTestSVersion);
|
||||||
ASSERT_EQ(tableMeta->tversion, ctgTestTVersion);
|
ASSERT_EQ(tableMeta->tversion, ctgTestTVersion);
|
||||||
ASSERT_EQ(tableMeta->uid, ctgTestSuid - 1);
|
ASSERT_EQ(tableMeta->uid, ctgTestSuid);
|
||||||
ASSERT_EQ(tableMeta->suid, ctgTestSuid - 1);
|
ASSERT_EQ(tableMeta->suid, ctgTestSuid);
|
||||||
ASSERT_EQ(tableMeta->tableInfo.numOfColumns, ctgTestColNum);
|
ASSERT_EQ(tableMeta->tableInfo.numOfColumns, ctgTestColNum);
|
||||||
ASSERT_EQ(tableMeta->tableInfo.numOfTags, ctgTestTagNum);
|
ASSERT_EQ(tableMeta->tableInfo.numOfTags, ctgTestTagNum);
|
||||||
ASSERT_EQ(tableMeta->tableInfo.precision, 1);
|
ASSERT_EQ(tableMeta->tableInfo.precision, 1);
|
||||||
|
@ -1904,7 +1918,8 @@ TEST(refreshGetMeta, child2stable) {
|
||||||
|
|
||||||
TEST(tableDistVgroup, normalTable) {
|
TEST(tableDistVgroup, normalTable) {
|
||||||
struct SCatalog *pCtg = NULL;
|
struct SCatalog *pCtg = NULL;
|
||||||
SRequestConnInfo *mockPointer = (SRequestConnInfo *)0x1;
|
SRequestConnInfo connInfo = {0};
|
||||||
|
SRequestConnInfo *mockPointer = (SRequestConnInfo *)&connInfo;
|
||||||
SVgroupInfo *vgInfo = NULL;
|
SVgroupInfo *vgInfo = NULL;
|
||||||
SArray *vgList = NULL;
|
SArray *vgList = NULL;
|
||||||
|
|
||||||
|
@ -1933,11 +1948,7 @@ TEST(tableDistVgroup, normalTable) {
|
||||||
strcpy(n.tname, ctgTestTablename);
|
strcpy(n.tname, ctgTestTablename);
|
||||||
|
|
||||||
code = catalogGetTableDistVgInfo(pCtg, mockPointer, &n, &vgList);
|
code = catalogGetTableDistVgInfo(pCtg, mockPointer, &n, &vgList);
|
||||||
ASSERT_EQ(code, 0);
|
ASSERT_TRUE(code != 0);
|
||||||
ASSERT_EQ(taosArrayGetSize((const SArray *)vgList), 1);
|
|
||||||
vgInfo = (SVgroupInfo *)taosArrayGet(vgList, 0);
|
|
||||||
ASSERT_EQ(vgInfo->vgId, 8);
|
|
||||||
ASSERT_EQ(vgInfo->epSet.numOfEps, 3);
|
|
||||||
|
|
||||||
catalogDestroy();
|
catalogDestroy();
|
||||||
memset(&gCtgMgmt, 0, sizeof(gCtgMgmt));
|
memset(&gCtgMgmt, 0, sizeof(gCtgMgmt));
|
||||||
|
@ -1945,7 +1956,8 @@ TEST(tableDistVgroup, normalTable) {
|
||||||
|
|
||||||
TEST(tableDistVgroup, childTableCase) {
|
TEST(tableDistVgroup, childTableCase) {
|
||||||
struct SCatalog *pCtg = NULL;
|
struct SCatalog *pCtg = NULL;
|
||||||
SRequestConnInfo *mockPointer = (SRequestConnInfo *)0x1;
|
SRequestConnInfo connInfo = {0};
|
||||||
|
SRequestConnInfo *mockPointer = (SRequestConnInfo *)&connInfo;
|
||||||
SVgroupInfo *vgInfo = NULL;
|
SVgroupInfo *vgInfo = NULL;
|
||||||
SArray *vgList = NULL;
|
SArray *vgList = NULL;
|
||||||
|
|
||||||
|
@ -1975,11 +1987,7 @@ TEST(tableDistVgroup, childTableCase) {
|
||||||
strcpy(n.tname, ctgTestCTablename);
|
strcpy(n.tname, ctgTestCTablename);
|
||||||
|
|
||||||
code = catalogGetTableDistVgInfo(pCtg, mockPointer, &n, &vgList);
|
code = catalogGetTableDistVgInfo(pCtg, mockPointer, &n, &vgList);
|
||||||
ASSERT_EQ(code, 0);
|
ASSERT_TRUE(code != 0);
|
||||||
ASSERT_EQ(taosArrayGetSize((const SArray *)vgList), 1);
|
|
||||||
vgInfo = (SVgroupInfo *)taosArrayGet(vgList, 0);
|
|
||||||
ASSERT_EQ(vgInfo->vgId, 9);
|
|
||||||
ASSERT_EQ(vgInfo->epSet.numOfEps, 4);
|
|
||||||
|
|
||||||
catalogDestroy();
|
catalogDestroy();
|
||||||
memset(&gCtgMgmt, 0, sizeof(gCtgMgmt));
|
memset(&gCtgMgmt, 0, sizeof(gCtgMgmt));
|
||||||
|
@ -1987,7 +1995,8 @@ TEST(tableDistVgroup, childTableCase) {
|
||||||
|
|
||||||
TEST(tableDistVgroup, superTableCase) {
|
TEST(tableDistVgroup, superTableCase) {
|
||||||
struct SCatalog *pCtg = NULL;
|
struct SCatalog *pCtg = NULL;
|
||||||
SRequestConnInfo *mockPointer = (SRequestConnInfo *)0x1;
|
SRequestConnInfo connInfo = {0};
|
||||||
|
SRequestConnInfo *mockPointer = (SRequestConnInfo *)&connInfo;
|
||||||
SVgroupInfo *vgInfo = NULL;
|
SVgroupInfo *vgInfo = NULL;
|
||||||
SArray *vgList = NULL;
|
SArray *vgList = NULL;
|
||||||
|
|
||||||
|
@ -2034,7 +2043,8 @@ TEST(tableDistVgroup, superTableCase) {
|
||||||
|
|
||||||
TEST(dbVgroup, getSetDbVgroupCase) {
|
TEST(dbVgroup, getSetDbVgroupCase) {
|
||||||
struct SCatalog *pCtg = NULL;
|
struct SCatalog *pCtg = NULL;
|
||||||
SRequestConnInfo *mockPointer = (SRequestConnInfo *)0x1;
|
SRequestConnInfo connInfo = {0};
|
||||||
|
SRequestConnInfo *mockPointer = (SRequestConnInfo *)&connInfo;
|
||||||
SVgroupInfo vgInfo = {0};
|
SVgroupInfo vgInfo = {0};
|
||||||
SVgroupInfo *pvgInfo = NULL;
|
SVgroupInfo *pvgInfo = NULL;
|
||||||
SDBVgInfo *dbVgroup = NULL;
|
SDBVgInfo *dbVgroup = NULL;
|
||||||
|
@ -2082,12 +2092,7 @@ TEST(dbVgroup, getSetDbVgroupCase) {
|
||||||
ASSERT_EQ(vgInfo.epSet.numOfEps, 3);
|
ASSERT_EQ(vgInfo.epSet.numOfEps, 3);
|
||||||
|
|
||||||
code = catalogGetTableDistVgInfo(pCtg, mockPointer, &n, &vgList);
|
code = catalogGetTableDistVgInfo(pCtg, mockPointer, &n, &vgList);
|
||||||
ASSERT_EQ(code, 0);
|
ASSERT_TRUE(code != 0);
|
||||||
ASSERT_EQ(taosArrayGetSize((const SArray *)vgList), 1);
|
|
||||||
pvgInfo = (SVgroupInfo *)taosArrayGet(vgList, 0);
|
|
||||||
ASSERT_EQ(pvgInfo->vgId, 8);
|
|
||||||
ASSERT_EQ(pvgInfo->epSet.numOfEps, 3);
|
|
||||||
taosArrayDestroy(vgList);
|
|
||||||
|
|
||||||
ctgTestBuildDBVgroup(&dbVgroup);
|
ctgTestBuildDBVgroup(&dbVgroup);
|
||||||
code = catalogUpdateDBVgInfo(pCtg, ctgTestDbname, ctgTestDbId, dbVgroup);
|
code = catalogUpdateDBVgInfo(pCtg, ctgTestDbname, ctgTestDbId, dbVgroup);
|
||||||
|
@ -2109,12 +2114,7 @@ TEST(dbVgroup, getSetDbVgroupCase) {
|
||||||
ASSERT_EQ(vgInfo.epSet.numOfEps, 2);
|
ASSERT_EQ(vgInfo.epSet.numOfEps, 2);
|
||||||
|
|
||||||
code = catalogGetTableDistVgInfo(pCtg, mockPointer, &n, &vgList);
|
code = catalogGetTableDistVgInfo(pCtg, mockPointer, &n, &vgList);
|
||||||
ASSERT_EQ(code, 0);
|
ASSERT_TRUE(code != 0);
|
||||||
ASSERT_EQ(taosArrayGetSize((const SArray *)vgList), 1);
|
|
||||||
pvgInfo = (SVgroupInfo *)taosArrayGet(vgList, 0);
|
|
||||||
ASSERT_EQ(pvgInfo->vgId, 8);
|
|
||||||
ASSERT_EQ(pvgInfo->epSet.numOfEps, 3);
|
|
||||||
taosArrayDestroy(vgList);
|
|
||||||
|
|
||||||
catalogDestroy();
|
catalogDestroy();
|
||||||
memset(&gCtgMgmt, 0, sizeof(gCtgMgmt));
|
memset(&gCtgMgmt, 0, sizeof(gCtgMgmt));
|
||||||
|
@ -2122,7 +2122,8 @@ TEST(dbVgroup, getSetDbVgroupCase) {
|
||||||
|
|
||||||
TEST(multiThread, getSetRmSameDbVgroup) {
|
TEST(multiThread, getSetRmSameDbVgroup) {
|
||||||
struct SCatalog *pCtg = NULL;
|
struct SCatalog *pCtg = NULL;
|
||||||
SRequestConnInfo *mockPointer = (SRequestConnInfo *)0x1;
|
SRequestConnInfo connInfo = {0};
|
||||||
|
SRequestConnInfo *mockPointer = (SRequestConnInfo *)&connInfo;
|
||||||
SVgroupInfo vgInfo = {0};
|
SVgroupInfo vgInfo = {0};
|
||||||
SVgroupInfo *pvgInfo = NULL;
|
SVgroupInfo *pvgInfo = NULL;
|
||||||
SDBVgInfo dbVgroup = {0};
|
SDBVgInfo dbVgroup = {0};
|
||||||
|
@ -2174,7 +2175,8 @@ TEST(multiThread, getSetRmSameDbVgroup) {
|
||||||
|
|
||||||
TEST(multiThread, getSetRmDiffDbVgroup) {
|
TEST(multiThread, getSetRmDiffDbVgroup) {
|
||||||
struct SCatalog *pCtg = NULL;
|
struct SCatalog *pCtg = NULL;
|
||||||
SRequestConnInfo *mockPointer = (SRequestConnInfo *)0x1;
|
SRequestConnInfo connInfo = {0};
|
||||||
|
SRequestConnInfo *mockPointer = (SRequestConnInfo *)&connInfo;
|
||||||
SVgroupInfo vgInfo = {0};
|
SVgroupInfo vgInfo = {0};
|
||||||
SVgroupInfo *pvgInfo = NULL;
|
SVgroupInfo *pvgInfo = NULL;
|
||||||
SDBVgInfo dbVgroup = {0};
|
SDBVgInfo dbVgroup = {0};
|
||||||
|
@ -2226,7 +2228,8 @@ TEST(multiThread, getSetRmDiffDbVgroup) {
|
||||||
|
|
||||||
TEST(multiThread, ctableMeta) {
|
TEST(multiThread, ctableMeta) {
|
||||||
struct SCatalog *pCtg = NULL;
|
struct SCatalog *pCtg = NULL;
|
||||||
SRequestConnInfo *mockPointer = (SRequestConnInfo *)0x1;
|
SRequestConnInfo connInfo = {0};
|
||||||
|
SRequestConnInfo *mockPointer = (SRequestConnInfo *)&connInfo;
|
||||||
SVgroupInfo vgInfo = {0};
|
SVgroupInfo vgInfo = {0};
|
||||||
SVgroupInfo *pvgInfo = NULL;
|
SVgroupInfo *pvgInfo = NULL;
|
||||||
SDBVgInfo dbVgroup = {0};
|
SDBVgInfo dbVgroup = {0};
|
||||||
|
@ -2277,7 +2280,8 @@ TEST(multiThread, ctableMeta) {
|
||||||
|
|
||||||
TEST(rentTest, allRent) {
|
TEST(rentTest, allRent) {
|
||||||
struct SCatalog *pCtg = NULL;
|
struct SCatalog *pCtg = NULL;
|
||||||
SRequestConnInfo *mockPointer = (SRequestConnInfo *)0x1;
|
SRequestConnInfo connInfo = {0};
|
||||||
|
SRequestConnInfo *mockPointer = (SRequestConnInfo *)&connInfo;
|
||||||
SVgroupInfo vgInfo = {0};
|
SVgroupInfo vgInfo = {0};
|
||||||
SVgroupInfo *pvgInfo = NULL;
|
SVgroupInfo *pvgInfo = NULL;
|
||||||
SDBVgInfo dbVgroup = {0};
|
SDBVgInfo dbVgroup = {0};
|
||||||
|
@ -2352,7 +2356,6 @@ TEST(rentTest, allRent) {
|
||||||
memset(&gCtgMgmt, 0, sizeof(gCtgMgmt));
|
memset(&gCtgMgmt, 0, sizeof(gCtgMgmt));
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
||||||
int main(int argc, char **argv) {
|
int main(int argc, char **argv) {
|
||||||
testing::InitGoogleTest(&argc, argv);
|
testing::InitGoogleTest(&argc, argv);
|
||||||
|
|
|
@ -46,7 +46,8 @@ SOperatorInfo* createCacherowsScanOperator(SLastRowScanPhysiNode* pScanNode, SRe
|
||||||
pInfo->pRes = createResDataBlock(pDescNode);
|
pInfo->pRes = createResDataBlock(pDescNode);
|
||||||
|
|
||||||
int32_t numOfCols = 0;
|
int32_t numOfCols = 0;
|
||||||
code = extractColMatchInfo(pScanNode->scan.pScanCols, pDescNode, &numOfCols, COL_MATCH_FROM_COL_ID, &pInfo->matchInfo);
|
code =
|
||||||
|
extractColMatchInfo(pScanNode->scan.pScanCols, pDescNode, &numOfCols, COL_MATCH_FROM_COL_ID, &pInfo->matchInfo);
|
||||||
removeRedundantTsCol(pScanNode, &pInfo->matchInfo);
|
removeRedundantTsCol(pScanNode, &pInfo->matchInfo);
|
||||||
|
|
||||||
code = extractCacheScanSlotId(pInfo->matchInfo.pList, pTaskInfo, &pInfo->pSlotIds);
|
code = extractCacheScanSlotId(pInfo->matchInfo.pList, pTaskInfo, &pInfo->pSlotIds);
|
||||||
|
@ -62,9 +63,10 @@ SOperatorInfo* createCacherowsScanOperator(SLastRowScanPhysiNode* pScanNode, SRe
|
||||||
|
|
||||||
// partition by tbname
|
// partition by tbname
|
||||||
if (taosArrayGetSize(pTableList->pGroupList) == taosArrayGetSize(pTableList->pTableList)) {
|
if (taosArrayGetSize(pTableList->pGroupList) == taosArrayGetSize(pTableList->pTableList)) {
|
||||||
pInfo->retrieveType = CACHESCAN_RETRIEVE_TYPE_ALL|(pScanNode->ignoreNull? CACHESCAN_RETRIEVE_LAST:CACHESCAN_RETRIEVE_LAST_ROW);
|
pInfo->retrieveType =
|
||||||
|
CACHESCAN_RETRIEVE_TYPE_ALL | (pScanNode->ignoreNull ? CACHESCAN_RETRIEVE_LAST : CACHESCAN_RETRIEVE_LAST_ROW);
|
||||||
code = tsdbCacherowsReaderOpen(pInfo->readHandle.vnode, pInfo->retrieveType, pTableList->pTableList,
|
code = tsdbCacherowsReaderOpen(pInfo->readHandle.vnode, pInfo->retrieveType, pTableList->pTableList,
|
||||||
taosArrayGetSize(pInfo->matchInfo.pList), &pInfo->pLastrowReader);
|
taosArrayGetSize(pInfo->matchInfo.pList), pTableList->suid, &pInfo->pLastrowReader);
|
||||||
if (code != TSDB_CODE_SUCCESS) {
|
if (code != TSDB_CODE_SUCCESS) {
|
||||||
goto _error;
|
goto _error;
|
||||||
}
|
}
|
||||||
|
@ -72,7 +74,8 @@ SOperatorInfo* createCacherowsScanOperator(SLastRowScanPhysiNode* pScanNode, SRe
|
||||||
pInfo->pBufferredRes = createOneDataBlock(pInfo->pRes, false);
|
pInfo->pBufferredRes = createOneDataBlock(pInfo->pRes, false);
|
||||||
blockDataEnsureCapacity(pInfo->pBufferredRes, pOperator->resultInfo.capacity);
|
blockDataEnsureCapacity(pInfo->pBufferredRes, pOperator->resultInfo.capacity);
|
||||||
} else { // by tags
|
} else { // by tags
|
||||||
pInfo->retrieveType = CACHESCAN_RETRIEVE_TYPE_SINGLE|(pScanNode->ignoreNull? CACHESCAN_RETRIEVE_LAST:CACHESCAN_RETRIEVE_LAST_ROW);
|
pInfo->retrieveType = CACHESCAN_RETRIEVE_TYPE_SINGLE |
|
||||||
|
(pScanNode->ignoreNull ? CACHESCAN_RETRIEVE_LAST : CACHESCAN_RETRIEVE_LAST_ROW);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (pScanNode->scan.pScanPseudoCols != NULL) {
|
if (pScanNode->scan.pScanPseudoCols != NULL) {
|
||||||
|
@ -188,7 +191,7 @@ SSDataBlock* doScanCache(SOperatorInfo* pOperator) {
|
||||||
SArray* pGroupTableList = taosArrayGetP(pTableList->pGroupList, pInfo->currentGroupIndex);
|
SArray* pGroupTableList = taosArrayGetP(pTableList->pGroupList, pInfo->currentGroupIndex);
|
||||||
|
|
||||||
tsdbCacherowsReaderOpen(pInfo->readHandle.vnode, pInfo->retrieveType, pGroupTableList,
|
tsdbCacherowsReaderOpen(pInfo->readHandle.vnode, pInfo->retrieveType, pGroupTableList,
|
||||||
taosArrayGetSize(pInfo->matchInfo.pList), &pInfo->pLastrowReader);
|
taosArrayGetSize(pInfo->matchInfo.pList), pTableList->suid, &pInfo->pLastrowReader);
|
||||||
taosArrayClear(pInfo->pUidList);
|
taosArrayClear(pInfo->pUidList);
|
||||||
|
|
||||||
int32_t code = tsdbRetrieveCacheRows(pInfo->pLastrowReader, pInfo->pRes, pInfo->pSlotIds, pInfo->pUidList);
|
int32_t code = tsdbRetrieveCacheRows(pInfo->pLastrowReader, pInfo->pRes, pInfo->pSlotIds, pInfo->pUidList);
|
||||||
|
@ -257,8 +260,7 @@ int32_t extractCacheScanSlotId(const SArray* pColMatchInfo, SExecTaskInfo* pTask
|
||||||
for (int32_t i = 0; i < numOfCols; ++i) {
|
for (int32_t i = 0; i < numOfCols; ++i) {
|
||||||
SColMatchItem* pColMatch = taosArrayGet(pColMatchInfo, i);
|
SColMatchItem* pColMatch = taosArrayGet(pColMatchInfo, i);
|
||||||
for (int32_t j = 0; j < pWrapper->nCols; ++j) {
|
for (int32_t j = 0; j < pWrapper->nCols; ++j) {
|
||||||
if (pColMatch->colId == pWrapper->pSchema[j].colId &&
|
if (pColMatch->colId == pWrapper->pSchema[j].colId && pColMatch->colId == PRIMARYKEY_TIMESTAMP_COL_ID) {
|
||||||
pColMatch->colId == PRIMARYKEY_TIMESTAMP_COL_ID) {
|
|
||||||
(*pSlotIds)[pColMatch->dstSlotId] = -1;
|
(*pSlotIds)[pColMatch->dstSlotId] = -1;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
|
@ -625,23 +625,6 @@ int32_t qExecTask(qTaskInfo_t tinfo, SSDataBlock** pRes, uint64_t* useconds) {
|
||||||
return pTaskInfo->code;
|
return pTaskInfo->code;
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t qKillTask(qTaskInfo_t qinfo) {
|
|
||||||
SExecTaskInfo* pTaskInfo = (SExecTaskInfo*)qinfo;
|
|
||||||
if (pTaskInfo == NULL) {
|
|
||||||
return TSDB_CODE_QRY_INVALID_QHANDLE;
|
|
||||||
}
|
|
||||||
|
|
||||||
qAsyncKillTask(qinfo);
|
|
||||||
|
|
||||||
// Wait for the query executing thread being stopped/
|
|
||||||
// Once the query is stopped, the owner of qHandle will be cleared immediately.
|
|
||||||
while (pTaskInfo->owner != 0) {
|
|
||||||
taosMsleep(100);
|
|
||||||
}
|
|
||||||
|
|
||||||
return TSDB_CODE_SUCCESS;
|
|
||||||
}
|
|
||||||
|
|
||||||
int32_t qAsyncKillTask(qTaskInfo_t qinfo) {
|
int32_t qAsyncKillTask(qTaskInfo_t qinfo) {
|
||||||
SExecTaskInfo* pTaskInfo = (SExecTaskInfo*)qinfo;
|
SExecTaskInfo* pTaskInfo = (SExecTaskInfo*)qinfo;
|
||||||
|
|
||||||
|
|
|
@ -3639,9 +3639,7 @@ SOperatorInfo* createOperatorTree(SPhysiNode* pPhyNode, SExecTaskInfo* pTaskInfo
|
||||||
return pOperator;
|
return pOperator;
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t num = 0;
|
|
||||||
size_t size = LIST_LENGTH(pPhyNode->pChildren);
|
size_t size = LIST_LENGTH(pPhyNode->pChildren);
|
||||||
|
|
||||||
SOperatorInfo** ops = taosMemoryCalloc(size, POINTER_BYTES);
|
SOperatorInfo** ops = taosMemoryCalloc(size, POINTER_BYTES);
|
||||||
for (int32_t i = 0; i < size; ++i) {
|
for (int32_t i = 0; i < size; ++i) {
|
||||||
SPhysiNode* pChildNode = (SPhysiNode*)nodesListGetNode(pPhyNode->pChildren, i);
|
SPhysiNode* pChildNode = (SPhysiNode*)nodesListGetNode(pPhyNode->pChildren, i);
|
||||||
|
|
|
@ -809,23 +809,6 @@ static int32_t savePullWindow(SPullWindowInfo* pPullInfo, SArray* pPullWins) {
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t compareResKey(void* pKey, void* data, int32_t index) {
|
|
||||||
SArray* res = (SArray*)data;
|
|
||||||
SResKeyPos* pos = taosArrayGetP(res, index);
|
|
||||||
SWinKey* pData = (SWinKey*)pKey;
|
|
||||||
if (pData->ts == *(int64_t*)pos->key) {
|
|
||||||
if (pData->groupId > pos->groupId) {
|
|
||||||
return 1;
|
|
||||||
} else if (pData->groupId < pos->groupId) {
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
} else if (pData->ts > *(int64_t*)pos->key) {
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int32_t saveResult(SResultWindowInfo winInfo, SSHashObj* pStUpdated) {
|
static int32_t saveResult(SResultWindowInfo winInfo, SSHashObj* pStUpdated) {
|
||||||
winInfo.sessionWin.win.ekey = winInfo.sessionWin.win.skey;
|
winInfo.sessionWin.win.ekey = winInfo.sessionWin.win.skey;
|
||||||
return tSimpleHashPut(pStUpdated, &winInfo.sessionWin, sizeof(SSessionKey), &winInfo, sizeof(SResultWindowInfo));
|
return tSimpleHashPut(pStUpdated, &winInfo.sessionWin, sizeof(SSessionKey), &winInfo, sizeof(SResultWindowInfo));
|
||||||
|
@ -863,12 +846,6 @@ static void removeResults(SArray* pWins, SHashObj* pUpdatedMap) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
int64_t getWinReskey(void* data, int32_t index) {
|
|
||||||
SArray* res = (SArray*)data;
|
|
||||||
SWinKey* pos = taosArrayGet(res, index);
|
|
||||||
return pos->ts;
|
|
||||||
}
|
|
||||||
|
|
||||||
int32_t compareWinRes(void* pKey, void* data, int32_t index) {
|
int32_t compareWinRes(void* pKey, void* data, int32_t index) {
|
||||||
SArray* res = (SArray*)data;
|
SArray* res = (SArray*)data;
|
||||||
SWinKey* pos = taosArrayGet(res, index);
|
SWinKey* pos = taosArrayGet(res, index);
|
||||||
|
@ -1307,27 +1284,6 @@ static SSDataBlock* doBuildIntervalResult(SOperatorInfo* pOperator) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// todo merged with the build group result.
|
|
||||||
static void finalizeUpdatedResult(int32_t numOfOutput, SDiskbasedBuf* pBuf, SArray* pUpdateList,
|
|
||||||
int32_t* rowEntryInfoOffset) {
|
|
||||||
size_t num = taosArrayGetSize(pUpdateList);
|
|
||||||
|
|
||||||
for (int32_t i = 0; i < num; ++i) {
|
|
||||||
SResKeyPos* pPos = taosArrayGetP(pUpdateList, i);
|
|
||||||
|
|
||||||
SFilePage* bufPage = getBufPage(pBuf, pPos->pos.pageId);
|
|
||||||
SResultRow* pRow = (SResultRow*)((char*)bufPage + pPos->pos.offset);
|
|
||||||
|
|
||||||
for (int32_t j = 0; j < numOfOutput; ++j) {
|
|
||||||
SResultRowEntryInfo* pEntry = getResultEntryInfo(pRow, j, rowEntryInfoOffset);
|
|
||||||
if (pRow->numOfRows < pEntry->numOfRes) {
|
|
||||||
pRow->numOfRows = pEntry->numOfRes;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
releaseBufPage(pBuf, bufPage);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
static void setInverFunction(SqlFunctionCtx* pCtx, int32_t num, EStreamType type) {
|
static void setInverFunction(SqlFunctionCtx* pCtx, int32_t num, EStreamType type) {
|
||||||
for (int i = 0; i < num; i++) {
|
for (int i = 0; i < num; i++) {
|
||||||
if (type == STREAM_INVERT) {
|
if (type == STREAM_INVERT) {
|
||||||
|
@ -1578,16 +1534,6 @@ static void closeChildIntervalWindow(SOperatorInfo* pOperator, SArray* pChildren
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void freeAllPages(SArray* pageIds, SDiskbasedBuf* pDiskBuf) {
|
|
||||||
int32_t size = taosArrayGetSize(pageIds);
|
|
||||||
for (int32_t i = 0; i < size; i++) {
|
|
||||||
int32_t pageId = *(int32_t*)taosArrayGet(pageIds, i);
|
|
||||||
// SFilePage* bufPage = getBufPage(pDiskBuf, pageId);
|
|
||||||
// dBufSetBufPageRecycled(pDiskBuf, bufPage);
|
|
||||||
}
|
|
||||||
taosArrayClear(pageIds);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void doBuildDeleteResult(SStreamIntervalOperatorInfo* pInfo, SArray* pWins, int32_t* index,
|
static void doBuildDeleteResult(SStreamIntervalOperatorInfo* pInfo, SArray* pWins, int32_t* index,
|
||||||
SSDataBlock* pBlock) {
|
SSDataBlock* pBlock) {
|
||||||
blockDataCleanup(pBlock);
|
blockDataCleanup(pBlock);
|
||||||
|
@ -2325,9 +2271,6 @@ static SSDataBlock* doTimeslice(SOperatorInfo* pOperator) {
|
||||||
genInterpolationResult(pSliceInfo, &pOperator->exprSupp, pResBlock);
|
genInterpolationResult(pSliceInfo, &pOperator->exprSupp, pResBlock);
|
||||||
pSliceInfo->current =
|
pSliceInfo->current =
|
||||||
taosTimeAdd(pSliceInfo->current, pInterval->interval, pInterval->intervalUnit, pInterval->precision);
|
taosTimeAdd(pSliceInfo->current, pInterval->interval, pInterval->intervalUnit, pInterval->precision);
|
||||||
if (pResBlock->info.rows >= pResBlock->info.capacity) {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2337,6 +2280,7 @@ static SSDataBlock* doTimeslice(SOperatorInfo* pOperator) {
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ts == pSliceInfo->current) {
|
if (ts == pSliceInfo->current) {
|
||||||
|
blockDataEnsureCapacity(pResBlock, pResBlock->info.rows + 1);
|
||||||
for (int32_t j = 0; j < pOperator->exprSupp.numOfExprs; ++j) {
|
for (int32_t j = 0; j < pOperator->exprSupp.numOfExprs; ++j) {
|
||||||
SExprInfo* pExprInfo = &pOperator->exprSupp.pExprInfo[j];
|
SExprInfo* pExprInfo = &pOperator->exprSupp.pExprInfo[j];
|
||||||
|
|
||||||
|
@ -2377,9 +2321,6 @@ static SSDataBlock* doTimeslice(SOperatorInfo* pOperator) {
|
||||||
genInterpolationResult(pSliceInfo, &pOperator->exprSupp, pResBlock);
|
genInterpolationResult(pSliceInfo, &pOperator->exprSupp, pResBlock);
|
||||||
pSliceInfo->current = taosTimeAdd(pSliceInfo->current, pInterval->interval, pInterval->intervalUnit,
|
pSliceInfo->current = taosTimeAdd(pSliceInfo->current, pInterval->interval, pInterval->intervalUnit,
|
||||||
pInterval->precision);
|
pInterval->precision);
|
||||||
if (pResBlock->info.rows >= pResBlock->info.capacity) {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (pSliceInfo->current > pSliceInfo->win.ekey) {
|
if (pSliceInfo->current > pSliceInfo->win.ekey) {
|
||||||
|
@ -2398,10 +2339,6 @@ static SSDataBlock* doTimeslice(SOperatorInfo* pOperator) {
|
||||||
doSetOperatorCompleted(pOperator);
|
doSetOperatorCompleted(pOperator);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (pResBlock->info.rows >= pResBlock->info.capacity) {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
} else if (ts < pSliceInfo->current) {
|
} else if (ts < pSliceInfo->current) {
|
||||||
// in case of interpolation window starts and ends between two datapoints, fill(prev) need to interpolate
|
// in case of interpolation window starts and ends between two datapoints, fill(prev) need to interpolate
|
||||||
|
@ -2419,9 +2356,6 @@ static SSDataBlock* doTimeslice(SOperatorInfo* pOperator) {
|
||||||
genInterpolationResult(pSliceInfo, &pOperator->exprSupp, pResBlock);
|
genInterpolationResult(pSliceInfo, &pOperator->exprSupp, pResBlock);
|
||||||
pSliceInfo->current = taosTimeAdd(pSliceInfo->current, pInterval->interval, pInterval->intervalUnit,
|
pSliceInfo->current = taosTimeAdd(pSliceInfo->current, pInterval->interval, pInterval->intervalUnit,
|
||||||
pInterval->precision);
|
pInterval->precision);
|
||||||
if (pResBlock->info.rows >= pResBlock->info.capacity) {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (pSliceInfo->current > pSliceInfo->win.ekey) {
|
if (pSliceInfo->current > pSliceInfo->win.ekey) {
|
||||||
|
@ -2443,9 +2377,6 @@ static SSDataBlock* doTimeslice(SOperatorInfo* pOperator) {
|
||||||
genInterpolationResult(pSliceInfo, &pOperator->exprSupp, pResBlock);
|
genInterpolationResult(pSliceInfo, &pOperator->exprSupp, pResBlock);
|
||||||
pSliceInfo->current = taosTimeAdd(pSliceInfo->current, pInterval->interval, pInterval->intervalUnit,
|
pSliceInfo->current = taosTimeAdd(pSliceInfo->current, pInterval->interval, pInterval->intervalUnit,
|
||||||
pInterval->precision);
|
pInterval->precision);
|
||||||
if (pResBlock->info.rows >= pResBlock->info.capacity) {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (pSliceInfo->current > pSliceInfo->win.ekey) {
|
if (pSliceInfo->current > pSliceInfo->win.ekey) {
|
||||||
|
@ -2467,13 +2398,11 @@ static SSDataBlock* doTimeslice(SOperatorInfo* pOperator) {
|
||||||
genInterpolationResult(pSliceInfo, &pOperator->exprSupp, pResBlock);
|
genInterpolationResult(pSliceInfo, &pOperator->exprSupp, pResBlock);
|
||||||
pSliceInfo->current =
|
pSliceInfo->current =
|
||||||
taosTimeAdd(pSliceInfo->current, pInterval->interval, pInterval->intervalUnit, pInterval->precision);
|
taosTimeAdd(pSliceInfo->current, pInterval->interval, pInterval->intervalUnit, pInterval->precision);
|
||||||
if (pResBlock->info.rows >= pResBlock->info.capacity) {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// add current row if timestamp match
|
// add current row if timestamp match
|
||||||
if (ts == pSliceInfo->current && pSliceInfo->current <= pSliceInfo->win.ekey) {
|
if (ts == pSliceInfo->current && pSliceInfo->current <= pSliceInfo->win.ekey) {
|
||||||
|
blockDataEnsureCapacity(pResBlock, pResBlock->info.rows + 1);
|
||||||
for (int32_t j = 0; j < pOperator->exprSupp.numOfExprs; ++j) {
|
for (int32_t j = 0; j < pOperator->exprSupp.numOfExprs; ++j) {
|
||||||
SExprInfo* pExprInfo = &pOperator->exprSupp.pExprInfo[j];
|
SExprInfo* pExprInfo = &pOperator->exprSupp.pExprInfo[j];
|
||||||
|
|
||||||
|
@ -2510,9 +2439,6 @@ static SSDataBlock* doTimeslice(SOperatorInfo* pOperator) {
|
||||||
genInterpolationResult(pSliceInfo, &pOperator->exprSupp, pResBlock);
|
genInterpolationResult(pSliceInfo, &pOperator->exprSupp, pResBlock);
|
||||||
pSliceInfo->current = taosTimeAdd(pSliceInfo->current, pInterval->interval, pInterval->intervalUnit,
|
pSliceInfo->current = taosTimeAdd(pSliceInfo->current, pInterval->interval, pInterval->intervalUnit,
|
||||||
pInterval->precision);
|
pInterval->precision);
|
||||||
if (pResBlock->info.rows >= pResBlock->info.capacity) {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (pSliceInfo->current > pSliceInfo->win.ekey) {
|
if (pSliceInfo->current > pSliceInfo->win.ekey) {
|
||||||
|
@ -2528,9 +2454,6 @@ static SSDataBlock* doTimeslice(SOperatorInfo* pOperator) {
|
||||||
pSliceInfo->current =
|
pSliceInfo->current =
|
||||||
taosTimeAdd(pSliceInfo->current, pInterval->interval, pInterval->intervalUnit, pInterval->precision);
|
taosTimeAdd(pSliceInfo->current, pInterval->interval, pInterval->intervalUnit, pInterval->precision);
|
||||||
|
|
||||||
if (pResBlock->info.rows >= pResBlock->info.capacity) {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2549,9 +2472,6 @@ static SSDataBlock* doTimeslice(SOperatorInfo* pOperator) {
|
||||||
genInterpolationResult(pSliceInfo, &pOperator->exprSupp, pResBlock);
|
genInterpolationResult(pSliceInfo, &pOperator->exprSupp, pResBlock);
|
||||||
pSliceInfo->current =
|
pSliceInfo->current =
|
||||||
taosTimeAdd(pSliceInfo->current, pInterval->interval, pInterval->intervalUnit, pInterval->precision);
|
taosTimeAdd(pSliceInfo->current, pInterval->interval, pInterval->intervalUnit, pInterval->precision);
|
||||||
if (pResBlock->info.rows >= pResBlock->info.capacity) {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// restore the value
|
// restore the value
|
||||||
|
@ -3379,7 +3299,9 @@ SOperatorInfo* createStreamFinalIntervalOperatorInfo(SOperatorInfo* downstream,
|
||||||
.calTrigger = pIntervalPhyNode->window.triggerType,
|
.calTrigger = pIntervalPhyNode->window.triggerType,
|
||||||
.maxTs = INT64_MIN,
|
.maxTs = INT64_MIN,
|
||||||
.minTs = INT64_MAX,
|
.minTs = INT64_MAX,
|
||||||
.deleteMark = INT64_MAX,
|
// for test 315360000000
|
||||||
|
.deleteMark = 1000LL * 60LL * 60LL * 24LL * 365LL * 10LL,
|
||||||
|
// .deleteMark = INT64_MAX,
|
||||||
};
|
};
|
||||||
ASSERT(pInfo->twAggSup.calTrigger != STREAM_TRIGGER_MAX_DELAY);
|
ASSERT(pInfo->twAggSup.calTrigger != STREAM_TRIGGER_MAX_DELAY);
|
||||||
pInfo->primaryTsIndex = ((SColumnNode*)pIntervalPhyNode->window.pTspk)->slotId;
|
pInfo->primaryTsIndex = ((SColumnNode*)pIntervalPhyNode->window.pTspk)->slotId;
|
||||||
|
|
|
@ -49,8 +49,7 @@ extern "C" {
|
||||||
#define FUNC_MGT_MULTI_ROWS_FUNC FUNC_MGT_FUNC_CLASSIFICATION_MASK(20)
|
#define FUNC_MGT_MULTI_ROWS_FUNC FUNC_MGT_FUNC_CLASSIFICATION_MASK(20)
|
||||||
#define FUNC_MGT_KEEP_ORDER_FUNC FUNC_MGT_FUNC_CLASSIFICATION_MASK(21)
|
#define FUNC_MGT_KEEP_ORDER_FUNC FUNC_MGT_FUNC_CLASSIFICATION_MASK(21)
|
||||||
#define FUNC_MGT_CUMULATIVE_FUNC FUNC_MGT_FUNC_CLASSIFICATION_MASK(22)
|
#define FUNC_MGT_CUMULATIVE_FUNC FUNC_MGT_FUNC_CLASSIFICATION_MASK(22)
|
||||||
#define FUNC_MGT_FORBID_STABLE_FUNC FUNC_MGT_FUNC_CLASSIFICATION_MASK(23)
|
#define FUNC_MGT_INTERP_PC_FUNC FUNC_MGT_FUNC_CLASSIFICATION_MASK(23)
|
||||||
#define FUNC_MGT_INTERP_PC_FUNC FUNC_MGT_FUNC_CLASSIFICATION_MASK(24)
|
|
||||||
|
|
||||||
#define FUNC_MGT_TEST_MASK(val, mask) (((val) & (mask)) != 0)
|
#define FUNC_MGT_TEST_MASK(val, mask) (((val) & (mask)) != 0)
|
||||||
|
|
||||||
|
|
|
@ -842,11 +842,17 @@ static int32_t translateElapsedImpl(SFunctionNode* pFunc, char* pErrBuf, int32_t
|
||||||
}
|
}
|
||||||
|
|
||||||
static int32_t translateElapsedPartial(SFunctionNode* pFunc, char* pErrBuf, int32_t len) {
|
static int32_t translateElapsedPartial(SFunctionNode* pFunc, char* pErrBuf, int32_t len) {
|
||||||
|
#if 0
|
||||||
return translateElapsedImpl(pFunc, pErrBuf, len, true);
|
return translateElapsedImpl(pFunc, pErrBuf, len, true);
|
||||||
|
#endif
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int32_t translateElapsedMerge(SFunctionNode* pFunc, char* pErrBuf, int32_t len) {
|
static int32_t translateElapsedMerge(SFunctionNode* pFunc, char* pErrBuf, int32_t len) {
|
||||||
|
#if 0
|
||||||
return translateElapsedImpl(pFunc, pErrBuf, len, false);
|
return translateElapsedImpl(pFunc, pErrBuf, len, false);
|
||||||
|
#endif
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int32_t translateLeastSQR(SFunctionNode* pFunc, char* pErrBuf, int32_t len) {
|
static int32_t translateLeastSQR(SFunctionNode* pFunc, char* pErrBuf, int32_t len) {
|
||||||
|
@ -2348,8 +2354,6 @@ const SBuiltinFuncDefinition funcMgtBuiltins[] = {
|
||||||
.finalizeFunc = elapsedFinalize,
|
.finalizeFunc = elapsedFinalize,
|
||||||
.invertFunc = NULL,
|
.invertFunc = NULL,
|
||||||
.combineFunc = elapsedCombine,
|
.combineFunc = elapsedCombine,
|
||||||
.pPartialFunc = "_elapsed_partial",
|
|
||||||
.pMergeFunc = "_elapsed_merge"
|
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
.name = "_elapsed_partial",
|
.name = "_elapsed_partial",
|
||||||
|
@ -2381,7 +2385,7 @@ const SBuiltinFuncDefinition funcMgtBuiltins[] = {
|
||||||
.name = "interp",
|
.name = "interp",
|
||||||
.type = FUNCTION_TYPE_INTERP,
|
.type = FUNCTION_TYPE_INTERP,
|
||||||
.classification = FUNC_MGT_TIMELINE_FUNC | FUNC_MGT_INTERVAL_INTERPO_FUNC | FUNC_MGT_IMPLICIT_TS_FUNC |
|
.classification = FUNC_MGT_TIMELINE_FUNC | FUNC_MGT_INTERVAL_INTERPO_FUNC | FUNC_MGT_IMPLICIT_TS_FUNC |
|
||||||
FUNC_MGT_FORBID_STREAM_FUNC | FUNC_MGT_FORBID_STABLE_FUNC,
|
FUNC_MGT_FORBID_STREAM_FUNC,
|
||||||
.translateFunc = translateInterp,
|
.translateFunc = translateInterp,
|
||||||
.getEnvFunc = getSelectivityFuncEnv,
|
.getEnvFunc = getSelectivityFuncEnv,
|
||||||
.initFunc = functionSetup,
|
.initFunc = functionSetup,
|
||||||
|
|
|
@ -5060,15 +5060,19 @@ int32_t sampleFinalize(SqlFunctionCtx* pCtx, SSDataBlock* pBlock) {
|
||||||
return pInfo->numSampled;
|
return pInfo->numSampled;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
bool getTailFuncEnv(SFunctionNode* pFunc, SFuncExecEnv* pEnv) {
|
bool getTailFuncEnv(SFunctionNode* pFunc, SFuncExecEnv* pEnv) {
|
||||||
|
#if 0
|
||||||
SColumnNode* pCol = (SColumnNode*)nodesListGetNode(pFunc->pParameterList, 0);
|
SColumnNode* pCol = (SColumnNode*)nodesListGetNode(pFunc->pParameterList, 0);
|
||||||
SValueNode* pVal = (SValueNode*)nodesListGetNode(pFunc->pParameterList, 1);
|
SValueNode* pVal = (SValueNode*)nodesListGetNode(pFunc->pParameterList, 1);
|
||||||
int32_t numOfPoints = pVal->datum.i;
|
int32_t numOfPoints = pVal->datum.i;
|
||||||
pEnv->calcMemSize = sizeof(STailInfo) + numOfPoints * (POINTER_BYTES + sizeof(STailItem) + pCol->node.resType.bytes);
|
pEnv->calcMemSize = sizeof(STailInfo) + numOfPoints * (POINTER_BYTES + sizeof(STailItem) + pCol->node.resType.bytes);
|
||||||
|
#endif
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool tailFunctionSetup(SqlFunctionCtx* pCtx, SResultRowEntryInfo* pResultInfo) {
|
bool tailFunctionSetup(SqlFunctionCtx* pCtx, SResultRowEntryInfo* pResultInfo) {
|
||||||
|
#if 0
|
||||||
if (!functionSetup(pCtx, pResultInfo)) {
|
if (!functionSetup(pCtx, pResultInfo)) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
@ -5096,11 +5100,13 @@ bool tailFunctionSetup(SqlFunctionCtx* pCtx, SResultRowEntryInfo* pResultInfo) {
|
||||||
pInfo->pItems[i] = (STailItem*)(pItem + i * unitSize);
|
pInfo->pItems[i] = (STailItem*)(pItem + i * unitSize);
|
||||||
pInfo->pItems[i]->isNull = false;
|
pInfo->pItems[i]->isNull = false;
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void tailAssignResult(STailItem* pItem, char* data, int32_t colBytes, TSKEY ts, bool isNull) {
|
static void tailAssignResult(STailItem* pItem, char* data, int32_t colBytes, TSKEY ts, bool isNull) {
|
||||||
|
#if 0
|
||||||
pItem->timestamp = ts;
|
pItem->timestamp = ts;
|
||||||
if (isNull) {
|
if (isNull) {
|
||||||
pItem->isNull = true;
|
pItem->isNull = true;
|
||||||
|
@ -5108,8 +5114,10 @@ static void tailAssignResult(STailItem* pItem, char* data, int32_t colBytes, TSK
|
||||||
pItem->isNull = false;
|
pItem->isNull = false;
|
||||||
memcpy(pItem->data, data, colBytes);
|
memcpy(pItem->data, data, colBytes);
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if 0
|
||||||
static int32_t tailCompFn(const void* p1, const void* p2, const void* param) {
|
static int32_t tailCompFn(const void* p1, const void* p2, const void* param) {
|
||||||
STailItem* d1 = *(STailItem**)p1;
|
STailItem* d1 = *(STailItem**)p1;
|
||||||
STailItem* d2 = *(STailItem**)p2;
|
STailItem* d2 = *(STailItem**)p2;
|
||||||
|
@ -5127,8 +5135,10 @@ static void doTailAdd(STailInfo* pInfo, char* data, TSKEY ts, bool isNull) {
|
||||||
taosheapadjust((void*)pList, sizeof(STailItem**), 0, pInfo->numOfPoints - 1, NULL, tailCompFn, NULL, 0);
|
taosheapadjust((void*)pList, sizeof(STailItem**), 0, pInfo->numOfPoints - 1, NULL, tailCompFn, NULL, 0);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
int32_t tailFunction(SqlFunctionCtx* pCtx) {
|
int32_t tailFunction(SqlFunctionCtx* pCtx) {
|
||||||
|
#if 0
|
||||||
SResultRowEntryInfo* pResInfo = GET_RES_INFO(pCtx);
|
SResultRowEntryInfo* pResInfo = GET_RES_INFO(pCtx);
|
||||||
STailInfo* pInfo = GET_ROWCELL_INTERBUF(pResInfo);
|
STailInfo* pInfo = GET_ROWCELL_INTERBUF(pResInfo);
|
||||||
|
|
||||||
|
@ -5162,9 +5172,12 @@ int32_t tailFunction(SqlFunctionCtx* pCtx) {
|
||||||
}
|
}
|
||||||
|
|
||||||
return pInfo->numOfPoints;
|
return pInfo->numOfPoints;
|
||||||
|
#endif
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t tailFinalize(SqlFunctionCtx* pCtx, SSDataBlock* pBlock) {
|
int32_t tailFinalize(SqlFunctionCtx* pCtx, SSDataBlock* pBlock) {
|
||||||
|
#if 0
|
||||||
SResultRowEntryInfo* pEntryInfo = GET_RES_INFO(pCtx);
|
SResultRowEntryInfo* pEntryInfo = GET_RES_INFO(pCtx);
|
||||||
STailInfo* pInfo = GET_ROWCELL_INTERBUF(pEntryInfo);
|
STailInfo* pInfo = GET_ROWCELL_INTERBUF(pEntryInfo);
|
||||||
pEntryInfo->complete = true;
|
pEntryInfo->complete = true;
|
||||||
|
@ -5183,14 +5196,19 @@ int32_t tailFinalize(SqlFunctionCtx* pCtx, SSDataBlock* pBlock) {
|
||||||
}
|
}
|
||||||
|
|
||||||
return pEntryInfo->numOfRes;
|
return pEntryInfo->numOfRes;
|
||||||
|
#endif
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool getUniqueFuncEnv(SFunctionNode* pFunc, SFuncExecEnv* pEnv) {
|
bool getUniqueFuncEnv(SFunctionNode* pFunc, SFuncExecEnv* pEnv) {
|
||||||
|
#if 0
|
||||||
pEnv->calcMemSize = sizeof(SUniqueInfo) + UNIQUE_MAX_RESULT_SIZE;
|
pEnv->calcMemSize = sizeof(SUniqueInfo) + UNIQUE_MAX_RESULT_SIZE;
|
||||||
|
#endif
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool uniqueFunctionSetup(SqlFunctionCtx* pCtx, SResultRowEntryInfo* pResInfo) {
|
bool uniqueFunctionSetup(SqlFunctionCtx* pCtx, SResultRowEntryInfo* pResInfo) {
|
||||||
|
#if 0
|
||||||
if (!functionSetup(pCtx, pResInfo)) {
|
if (!functionSetup(pCtx, pResInfo)) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
@ -5204,9 +5222,11 @@ bool uniqueFunctionSetup(SqlFunctionCtx* pCtx, SResultRowEntryInfo* pResInfo) {
|
||||||
} else {
|
} else {
|
||||||
pInfo->pHash = taosHashInit(64, taosGetDefaultHashFunction(TSDB_DATA_TYPE_BINARY), true, HASH_NO_LOCK);
|
pInfo->pHash = taosHashInit(64, taosGetDefaultHashFunction(TSDB_DATA_TYPE_BINARY), true, HASH_NO_LOCK);
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if 0
|
||||||
static void doUniqueAdd(SUniqueInfo* pInfo, char* data, TSKEY ts, bool isNull) {
|
static void doUniqueAdd(SUniqueInfo* pInfo, char* data, TSKEY ts, bool isNull) {
|
||||||
// handle null elements
|
// handle null elements
|
||||||
if (isNull == true) {
|
if (isNull == true) {
|
||||||
|
@ -5237,8 +5257,10 @@ static void doUniqueAdd(SUniqueInfo* pInfo, char* data, TSKEY ts, bool isNull) {
|
||||||
pHashItem->timestamp = ts;
|
pHashItem->timestamp = ts;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
int32_t uniqueFunction(SqlFunctionCtx* pCtx) {
|
int32_t uniqueFunction(SqlFunctionCtx* pCtx) {
|
||||||
|
#if 0
|
||||||
SResultRowEntryInfo* pResInfo = GET_RES_INFO(pCtx);
|
SResultRowEntryInfo* pResInfo = GET_RES_INFO(pCtx);
|
||||||
SUniqueInfo* pInfo = GET_ROWCELL_INTERBUF(pResInfo);
|
SUniqueInfo* pInfo = GET_ROWCELL_INTERBUF(pResInfo);
|
||||||
|
|
||||||
|
@ -5273,6 +5295,8 @@ int32_t uniqueFunction(SqlFunctionCtx* pCtx) {
|
||||||
}
|
}
|
||||||
|
|
||||||
return pInfo->numOfPoints;
|
return pInfo->numOfPoints;
|
||||||
|
#endif
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool getModeFuncEnv(SFunctionNode* pFunc, SFuncExecEnv* pEnv) {
|
bool getModeFuncEnv(SFunctionNode* pFunc, SFuncExecEnv* pEnv) {
|
||||||
|
|
|
@ -216,8 +216,6 @@ bool fmIsKeepOrderFunc(int32_t funcId) { return isSpecificClassifyFunc(funcId, F
|
||||||
|
|
||||||
bool fmIsCumulativeFunc(int32_t funcId) { return isSpecificClassifyFunc(funcId, FUNC_MGT_CUMULATIVE_FUNC); }
|
bool fmIsCumulativeFunc(int32_t funcId) { return isSpecificClassifyFunc(funcId, FUNC_MGT_CUMULATIVE_FUNC); }
|
||||||
|
|
||||||
bool fmIsForbidSuperTableFunc(int32_t funcId) { return isSpecificClassifyFunc(funcId, FUNC_MGT_FORBID_STABLE_FUNC); }
|
|
||||||
|
|
||||||
bool fmIsInterpFunc(int32_t funcId) {
|
bool fmIsInterpFunc(int32_t funcId) {
|
||||||
if (funcId < 0 || funcId >= funcMgtBuiltinsNum) {
|
if (funcId < 0 || funcId >= funcMgtBuiltinsNum) {
|
||||||
return false;
|
return false;
|
||||||
|
|
|
@ -888,10 +888,11 @@ static int32_t udfdUvInit() {
|
||||||
}
|
}
|
||||||
global.loop = loop;
|
global.loop = loop;
|
||||||
|
|
||||||
|
if (tsStartUdfd) { // udfd is started by taosd, which shall exit when taosd exit
|
||||||
uv_pipe_init(global.loop, &global.ctrlPipe, 1);
|
uv_pipe_init(global.loop, &global.ctrlPipe, 1);
|
||||||
uv_pipe_open(&global.ctrlPipe, 0);
|
uv_pipe_open(&global.ctrlPipe, 0);
|
||||||
uv_read_start((uv_stream_t *)&global.ctrlPipe, udfdCtrlAllocBufCb, udfdCtrlReadCb);
|
uv_read_start((uv_stream_t *)&global.ctrlPipe, udfdCtrlAllocBufCb, udfdCtrlReadCb);
|
||||||
|
}
|
||||||
getUdfdPipeName(global.listenPipeName, sizeof(global.listenPipeName));
|
getUdfdPipeName(global.listenPipeName, sizeof(global.listenPipeName));
|
||||||
|
|
||||||
removeListeningPipe();
|
removeListeningPipe();
|
||||||
|
@ -979,13 +980,13 @@ int32_t udfdDeinitResidentFuncs() {
|
||||||
char* funcName = taosArrayGet(global.residentFuncs, i);
|
char* funcName = taosArrayGet(global.residentFuncs, i);
|
||||||
SUdf** udfInHash = taosHashGet(global.udfsHash, funcName, strlen(funcName));
|
SUdf** udfInHash = taosHashGet(global.udfsHash, funcName, strlen(funcName));
|
||||||
if (udfInHash) {
|
if (udfInHash) {
|
||||||
taosHashRemove(global.udfsHash, funcName, strlen(funcName));
|
|
||||||
SUdf* udf = *udfInHash;
|
SUdf* udf = *udfInHash;
|
||||||
if (udf->destroyFunc) {
|
if (udf->destroyFunc) {
|
||||||
(udf->destroyFunc)();
|
(udf->destroyFunc)();
|
||||||
}
|
}
|
||||||
uv_dlclose(&udf->lib);
|
uv_dlclose(&udf->lib);
|
||||||
taosMemoryFree(udf);
|
taosMemoryFree(udf);
|
||||||
|
taosHashRemove(global.udfsHash, funcName, strlen(funcName));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
taosArrayDestroy(global.residentFuncs);
|
taosArrayDestroy(global.residentFuncs);
|
||||||
|
|
|
@ -1537,25 +1537,6 @@ static int32_t translateRepeatScanFunc(STranslateContext* pCxt, SFunctionNode* p
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int32_t translateForbidSuperTableFunc(STranslateContext* pCxt, SFunctionNode* pFunc) {
|
|
||||||
if (!fmIsForbidSuperTableFunc(pFunc->funcId)) {
|
|
||||||
return TSDB_CODE_SUCCESS;
|
|
||||||
}
|
|
||||||
if (!isSelectStmt(pCxt->pCurrStmt)) {
|
|
||||||
return generateSyntaxErrMsgExt(&pCxt->msgBuf, TSDB_CODE_PAR_ONLY_SUPPORT_SINGLE_TABLE,
|
|
||||||
"%s is only supported in single table query", pFunc->functionName);
|
|
||||||
}
|
|
||||||
SSelectStmt* pSelect = (SSelectStmt*)pCxt->pCurrStmt;
|
|
||||||
SNode* pTable = pSelect->pFromTable;
|
|
||||||
if ((NULL != pTable && (QUERY_NODE_REAL_TABLE != nodeType(pTable) ||
|
|
||||||
(TSDB_CHILD_TABLE != ((SRealTableNode*)pTable)->pMeta->tableType &&
|
|
||||||
TSDB_NORMAL_TABLE != ((SRealTableNode*)pTable)->pMeta->tableType)))) {
|
|
||||||
return generateSyntaxErrMsgExt(&pCxt->msgBuf, TSDB_CODE_PAR_ONLY_SUPPORT_SINGLE_TABLE,
|
|
||||||
"%s is only supported in single table query", pFunc->functionName);
|
|
||||||
}
|
|
||||||
return TSDB_CODE_SUCCESS;
|
|
||||||
}
|
|
||||||
|
|
||||||
static bool isStar(SNode* pNode) {
|
static bool isStar(SNode* pNode) {
|
||||||
return (QUERY_NODE_COLUMN == nodeType(pNode)) && ('\0' == ((SColumnNode*)pNode)->tableAlias[0]) &&
|
return (QUERY_NODE_COLUMN == nodeType(pNode)) && ('\0' == ((SColumnNode*)pNode)->tableAlias[0]) &&
|
||||||
(0 == strcmp(((SColumnNode*)pNode)->colName, "*"));
|
(0 == strcmp(((SColumnNode*)pNode)->colName, "*"));
|
||||||
|
@ -1717,9 +1698,6 @@ static int32_t rewriteSystemInfoFunc(STranslateContext* pCxt, SNode** pNode) {
|
||||||
|
|
||||||
static int32_t translateNoramlFunction(STranslateContext* pCxt, SFunctionNode* pFunc) {
|
static int32_t translateNoramlFunction(STranslateContext* pCxt, SFunctionNode* pFunc) {
|
||||||
int32_t code = translateAggFunc(pCxt, pFunc);
|
int32_t code = translateAggFunc(pCxt, pFunc);
|
||||||
if (TSDB_CODE_SUCCESS == code) {
|
|
||||||
code = translateForbidSuperTableFunc(pCxt, pFunc);
|
|
||||||
}
|
|
||||||
if (TSDB_CODE_SUCCESS == code) {
|
if (TSDB_CODE_SUCCESS == code) {
|
||||||
code = translateScanPseudoColumnFunc(pCxt, pFunc);
|
code = translateScanPseudoColumnFunc(pCxt, pFunc);
|
||||||
}
|
}
|
||||||
|
@ -3058,12 +3036,14 @@ static EDealRes checkStateExpr(SNode* pNode, void* pContext) {
|
||||||
return DEAL_RES_CONTINUE;
|
return DEAL_RES_CONTINUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool isPartitionByTbname(SNodeList* pPartitionByList) {
|
static bool hasPartitionByTbname(SNodeList* pPartitionByList) {
|
||||||
if (1 != LIST_LENGTH(pPartitionByList)) {
|
SNode* pPartKey = NULL;
|
||||||
return false;
|
FOREACH(pPartKey, pPartitionByList) {
|
||||||
|
if (QUERY_NODE_FUNCTION == nodeType(pPartKey) && FUNCTION_TYPE_TBNAME == ((SFunctionNode*)pPartKey)->funcType) {
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
SNode* pPartKey = nodesListGetNode(pPartitionByList, 0);
|
}
|
||||||
return QUERY_NODE_FUNCTION == nodeType(pPartKey) && FUNCTION_TYPE_TBNAME == ((SFunctionNode*)pPartKey)->funcType;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int32_t checkStateWindowForStream(STranslateContext* pCxt, SSelectStmt* pSelect) {
|
static int32_t checkStateWindowForStream(STranslateContext* pCxt, SSelectStmt* pSelect) {
|
||||||
|
@ -3071,7 +3051,7 @@ static int32_t checkStateWindowForStream(STranslateContext* pCxt, SSelectStmt* p
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
if (TSDB_SUPER_TABLE == ((SRealTableNode*)pSelect->pFromTable)->pMeta->tableType &&
|
if (TSDB_SUPER_TABLE == ((SRealTableNode*)pSelect->pFromTable)->pMeta->tableType &&
|
||||||
!isPartitionByTbname(pSelect->pPartitionByList)) {
|
!hasPartitionByTbname(pSelect->pPartitionByList)) {
|
||||||
return generateSyntaxErrMsgExt(&pCxt->msgBuf, TSDB_CODE_PAR_INVALID_STREAM_QUERY, "Unsupported stream query");
|
return generateSyntaxErrMsgExt(&pCxt->msgBuf, TSDB_CODE_PAR_INVALID_STREAM_QUERY, "Unsupported stream query");
|
||||||
}
|
}
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
|
@ -5365,12 +5345,12 @@ static int32_t translateKillTransaction(STranslateContext* pCxt, SKillStmt* pStm
|
||||||
static bool crossTableWithoutAggOper(SSelectStmt* pSelect) {
|
static bool crossTableWithoutAggOper(SSelectStmt* pSelect) {
|
||||||
return NULL == pSelect->pWindow && !pSelect->hasAggFuncs && !pSelect->hasIndefiniteRowsFunc &&
|
return NULL == pSelect->pWindow && !pSelect->hasAggFuncs && !pSelect->hasIndefiniteRowsFunc &&
|
||||||
!pSelect->hasInterpFunc && TSDB_SUPER_TABLE == ((SRealTableNode*)pSelect->pFromTable)->pMeta->tableType &&
|
!pSelect->hasInterpFunc && TSDB_SUPER_TABLE == ((SRealTableNode*)pSelect->pFromTable)->pMeta->tableType &&
|
||||||
!isPartitionByTbname(pSelect->pPartitionByList);
|
!hasPartitionByTbname(pSelect->pPartitionByList);
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool crossTableWithUdaf(SSelectStmt* pSelect) {
|
static bool crossTableWithUdaf(SSelectStmt* pSelect) {
|
||||||
return pSelect->hasUdaf && TSDB_SUPER_TABLE == ((SRealTableNode*)pSelect->pFromTable)->pMeta->tableType &&
|
return pSelect->hasUdaf && TSDB_SUPER_TABLE == ((SRealTableNode*)pSelect->pFromTable)->pMeta->tableType &&
|
||||||
!isPartitionByTbname(pSelect->pPartitionByList);
|
!hasPartitionByTbname(pSelect->pPartitionByList);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int32_t checkCreateStream(STranslateContext* pCxt, SCreateStreamStmt* pStmt) {
|
static int32_t checkCreateStream(STranslateContext* pCxt, SCreateStreamStmt* pStmt) {
|
||||||
|
|
|
@ -1085,7 +1085,8 @@ EDealRes sclRewriteNonConstOperator(SNode **pNode, SScalarCtx *ctx) {
|
||||||
EDealRes sclRewriteFunction(SNode **pNode, SScalarCtx *ctx) {
|
EDealRes sclRewriteFunction(SNode **pNode, SScalarCtx *ctx) {
|
||||||
SFunctionNode *node = (SFunctionNode *)*pNode;
|
SFunctionNode *node = (SFunctionNode *)*pNode;
|
||||||
SNode *tnode = NULL;
|
SNode *tnode = NULL;
|
||||||
if (!fmIsScalarFunc(node->funcId) && (!ctx->dual)) {
|
if ((!fmIsScalarFunc(node->funcId) && (!ctx->dual)) ||
|
||||||
|
fmIsUserDefinedFunc(node->funcId)) {
|
||||||
return DEAL_RES_CONTINUE;
|
return DEAL_RES_CONTINUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -57,8 +57,8 @@ typedef enum {
|
||||||
#define SCHEDULE_DEFAULT_POLICY SCH_LOAD_SEQ
|
#define SCHEDULE_DEFAULT_POLICY SCH_LOAD_SEQ
|
||||||
#define SCHEDULE_DEFAULT_MAX_NODE_NUM 20
|
#define SCHEDULE_DEFAULT_MAX_NODE_NUM 20
|
||||||
|
|
||||||
#define SCH_DEFAULT_TASK_TIMEOUT_USEC 10000000
|
#define SCH_DEFAULT_TASK_TIMEOUT_USEC 60000000
|
||||||
#define SCH_MAX_TASK_TIMEOUT_USEC 60000000
|
#define SCH_MAX_TASK_TIMEOUT_USEC 300000000
|
||||||
#define SCH_DEFAULT_MAX_RETRY_NUM 6
|
#define SCH_DEFAULT_MAX_RETRY_NUM 6
|
||||||
#define SCH_MIN_AYSNC_EXEC_NUM 3
|
#define SCH_MIN_AYSNC_EXEC_NUM 3
|
||||||
|
|
||||||
|
|
|
@ -145,7 +145,9 @@ int32_t schHandleResponseMsg(SSchJob *pJob, SSchTask *pTask, int32_t execId, SDa
|
||||||
int32_t msgType = pMsg->msgType;
|
int32_t msgType = pMsg->msgType;
|
||||||
|
|
||||||
bool dropExecNode = (msgType == TDMT_SCH_LINK_BROKEN || SCH_NETWORK_ERR(rspCode));
|
bool dropExecNode = (msgType == TDMT_SCH_LINK_BROKEN || SCH_NETWORK_ERR(rspCode));
|
||||||
|
if (SCH_IS_QUERY_JOB(pJob)) {
|
||||||
SCH_ERR_JRET(schUpdateTaskHandle(pJob, pTask, dropExecNode, pMsg->handle, execId));
|
SCH_ERR_JRET(schUpdateTaskHandle(pJob, pTask, dropExecNode, pMsg->handle, execId));
|
||||||
|
}
|
||||||
|
|
||||||
SCH_ERR_JRET(schValidateRspMsgType(pJob, pTask, msgType));
|
SCH_ERR_JRET(schValidateRspMsgType(pJob, pTask, msgType));
|
||||||
|
|
||||||
|
|
|
@ -127,6 +127,7 @@ int32_t schDropTaskExecNode(SSchJob *pJob, SSchTask *pTask, void *handle, int32_
|
||||||
|
|
||||||
if (taosHashRemove(pTask->execNodes, &execId, sizeof(execId))) {
|
if (taosHashRemove(pTask->execNodes, &execId, sizeof(execId))) {
|
||||||
SCH_TASK_DLOG("execId %d already not in execNodeList", execId);
|
SCH_TASK_DLOG("execId %d already not in execNodeList", execId);
|
||||||
|
SCH_ERR_RET(TSDB_CODE_SCH_IGNORE_ERROR);
|
||||||
} else {
|
} else {
|
||||||
SCH_TASK_DLOG("execId %d removed from execNodeList", execId);
|
SCH_TASK_DLOG("execId %d removed from execNodeList", execId);
|
||||||
}
|
}
|
||||||
|
|
|
@ -79,6 +79,12 @@ typedef struct SSyncTimer {
|
||||||
void* pData;
|
void* pData;
|
||||||
} SSyncTimer;
|
} SSyncTimer;
|
||||||
|
|
||||||
|
typedef struct SElectTimer {
|
||||||
|
uint64_t logicClock;
|
||||||
|
SSyncNode* pSyncNode;
|
||||||
|
void* pData;
|
||||||
|
} SElectTimer;
|
||||||
|
|
||||||
int32_t syncHbTimerInit(SSyncNode* pSyncNode, SSyncTimer* pSyncTimer, SRaftId destId);
|
int32_t syncHbTimerInit(SSyncNode* pSyncNode, SSyncTimer* pSyncTimer, SRaftId destId);
|
||||||
int32_t syncHbTimerStart(SSyncNode* pSyncNode, SSyncTimer* pSyncTimer);
|
int32_t syncHbTimerStart(SSyncNode* pSyncNode, SSyncTimer* pSyncTimer);
|
||||||
int32_t syncHbTimerStop(SSyncNode* pSyncNode, SSyncTimer* pSyncTimer);
|
int32_t syncHbTimerStop(SSyncNode* pSyncNode, SSyncTimer* pSyncTimer);
|
||||||
|
@ -155,7 +161,6 @@ typedef struct SSyncNode {
|
||||||
tmr_h pElectTimer;
|
tmr_h pElectTimer;
|
||||||
int32_t electTimerMS;
|
int32_t electTimerMS;
|
||||||
uint64_t electTimerLogicClock;
|
uint64_t electTimerLogicClock;
|
||||||
uint64_t electTimerLogicClockUser;
|
|
||||||
TAOS_TMR_CALLBACK FpElectTimerCB; // Timer Fp
|
TAOS_TMR_CALLBACK FpElectTimerCB; // Timer Fp
|
||||||
uint64_t electTimerCounter;
|
uint64_t electTimerCounter;
|
||||||
|
|
||||||
|
|
|
@ -1310,7 +1310,6 @@ SSyncNode* syncNodeOpen(SSyncInfo* pSyncInfo) {
|
||||||
pSyncNode->pElectTimer = NULL;
|
pSyncNode->pElectTimer = NULL;
|
||||||
pSyncNode->electTimerMS = syncUtilElectRandomMS(pSyncNode->electBaseLine, 2 * pSyncNode->electBaseLine);
|
pSyncNode->electTimerMS = syncUtilElectRandomMS(pSyncNode->electBaseLine, 2 * pSyncNode->electBaseLine);
|
||||||
atomic_store_64(&pSyncNode->electTimerLogicClock, 0);
|
atomic_store_64(&pSyncNode->electTimerLogicClock, 0);
|
||||||
atomic_store_64(&pSyncNode->electTimerLogicClockUser, 0);
|
|
||||||
pSyncNode->FpElectTimerCB = syncNodeEqElectTimer;
|
pSyncNode->FpElectTimerCB = syncNodeEqElectTimer;
|
||||||
pSyncNode->electTimerCounter = 0;
|
pSyncNode->electTimerCounter = 0;
|
||||||
|
|
||||||
|
@ -1565,17 +1564,14 @@ int32_t syncNodeStartElectTimer(SSyncNode* pSyncNode, int32_t ms) {
|
||||||
int32_t ret = 0;
|
int32_t ret = 0;
|
||||||
if (syncEnvIsStart()) {
|
if (syncEnvIsStart()) {
|
||||||
pSyncNode->electTimerMS = ms;
|
pSyncNode->electTimerMS = ms;
|
||||||
taosTmrReset(pSyncNode->FpElectTimerCB, pSyncNode->electTimerMS, pSyncNode, gSyncEnv->pTimerManager,
|
|
||||||
&pSyncNode->pElectTimer);
|
|
||||||
atomic_store_64(&pSyncNode->electTimerLogicClock, pSyncNode->electTimerLogicClockUser);
|
|
||||||
|
|
||||||
/*
|
SElectTimer* pElectTimer = taosMemoryMalloc(sizeof(SElectTimer));
|
||||||
do {
|
pElectTimer->logicClock = pSyncNode->electTimerLogicClock;
|
||||||
char logBuf[128];
|
pElectTimer->pSyncNode = pSyncNode;
|
||||||
snprintf(logBuf, sizeof(logBuf), "elect timer reset, ms:%d", ms);
|
pElectTimer->pData = NULL;
|
||||||
syncNodeEventLog(pSyncNode, logBuf);
|
|
||||||
} while (0);
|
taosTmrReset(pSyncNode->FpElectTimerCB, pSyncNode->electTimerMS, pElectTimer, gSyncEnv->pTimerManager,
|
||||||
*/
|
&pSyncNode->pElectTimer);
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
sError("vgId:%d, start elect timer error, sync env is stop", pSyncNode->vgId);
|
sError("vgId:%d, start elect timer error, sync env is stop", pSyncNode->vgId);
|
||||||
|
@ -1585,11 +1581,10 @@ int32_t syncNodeStartElectTimer(SSyncNode* pSyncNode, int32_t ms) {
|
||||||
|
|
||||||
int32_t syncNodeStopElectTimer(SSyncNode* pSyncNode) {
|
int32_t syncNodeStopElectTimer(SSyncNode* pSyncNode) {
|
||||||
int32_t ret = 0;
|
int32_t ret = 0;
|
||||||
atomic_add_fetch_64(&pSyncNode->electTimerLogicClockUser, 1);
|
atomic_add_fetch_64(&pSyncNode->electTimerLogicClock, 1);
|
||||||
taosTmrStop(pSyncNode->pElectTimer);
|
taosTmrStop(pSyncNode->pElectTimer);
|
||||||
pSyncNode->pElectTimer = NULL;
|
pSyncNode->pElectTimer = NULL;
|
||||||
|
|
||||||
// sTrace("vgId:%d, sync %s stop elect timer", pSyncNode->vgId, syncUtilState2String(pSyncNode->state));
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1815,8 +1810,6 @@ cJSON* syncNode2Json(const SSyncNode* pSyncNode) {
|
||||||
cJSON_AddNumberToObject(pRoot, "electTimerMS", pSyncNode->electTimerMS);
|
cJSON_AddNumberToObject(pRoot, "electTimerMS", pSyncNode->electTimerMS);
|
||||||
snprintf(u64buf, sizeof(u64buf), "%" PRIu64, pSyncNode->electTimerLogicClock);
|
snprintf(u64buf, sizeof(u64buf), "%" PRIu64, pSyncNode->electTimerLogicClock);
|
||||||
cJSON_AddStringToObject(pRoot, "electTimerLogicClock", u64buf);
|
cJSON_AddStringToObject(pRoot, "electTimerLogicClock", u64buf);
|
||||||
snprintf(u64buf, sizeof(u64buf), "%" PRIu64, pSyncNode->electTimerLogicClockUser);
|
|
||||||
cJSON_AddStringToObject(pRoot, "electTimerLogicClockUser", u64buf);
|
|
||||||
snprintf(u64buf, sizeof(u64buf), "%p", pSyncNode->FpElectTimerCB);
|
snprintf(u64buf, sizeof(u64buf), "%p", pSyncNode->FpElectTimerCB);
|
||||||
cJSON_AddStringToObject(pRoot, "FpElectTimerCB", u64buf);
|
cJSON_AddStringToObject(pRoot, "FpElectTimerCB", u64buf);
|
||||||
snprintf(u64buf, sizeof(u64buf), "%" PRIu64, pSyncNode->electTimerCounter);
|
snprintf(u64buf, sizeof(u64buf), "%" PRIu64, pSyncNode->electTimerCounter);
|
||||||
|
@ -1922,7 +1915,7 @@ inline void syncNodeEventLog(const SSyncNode* pSyncNode, char* str) {
|
||||||
snapshot.lastApplyTerm, pSyncNode->pRaftCfg->isStandBy, pSyncNode->pRaftCfg->snapshotStrategy,
|
snapshot.lastApplyTerm, pSyncNode->pRaftCfg->isStandBy, pSyncNode->pRaftCfg->snapshotStrategy,
|
||||||
pSyncNode->pRaftCfg->batchSize, pSyncNode->replicaNum, pSyncNode->pRaftCfg->lastConfigIndex,
|
pSyncNode->pRaftCfg->batchSize, pSyncNode->replicaNum, pSyncNode->pRaftCfg->lastConfigIndex,
|
||||||
pSyncNode->changing, pSyncNode->restoreFinish, syncNodeDynamicQuorum(pSyncNode),
|
pSyncNode->changing, pSyncNode->restoreFinish, syncNodeDynamicQuorum(pSyncNode),
|
||||||
pSyncNode->electTimerLogicClockUser, pSyncNode->heartbeatTimerLogicClockUser, peerStateStr, printStr);
|
pSyncNode->electTimerLogicClock, pSyncNode->heartbeatTimerLogicClockUser, peerStateStr, printStr);
|
||||||
} else {
|
} else {
|
||||||
snprintf(logBuf, sizeof(logBuf), "%s", str);
|
snprintf(logBuf, sizeof(logBuf), "%s", str);
|
||||||
}
|
}
|
||||||
|
@ -1946,7 +1939,7 @@ inline void syncNodeEventLog(const SSyncNode* pSyncNode, char* str) {
|
||||||
snapshot.lastApplyTerm, pSyncNode->pRaftCfg->isStandBy, pSyncNode->pRaftCfg->snapshotStrategy,
|
snapshot.lastApplyTerm, pSyncNode->pRaftCfg->isStandBy, pSyncNode->pRaftCfg->snapshotStrategy,
|
||||||
pSyncNode->pRaftCfg->batchSize, pSyncNode->replicaNum, pSyncNode->pRaftCfg->lastConfigIndex,
|
pSyncNode->pRaftCfg->batchSize, pSyncNode->replicaNum, pSyncNode->pRaftCfg->lastConfigIndex,
|
||||||
pSyncNode->changing, pSyncNode->restoreFinish, syncNodeDynamicQuorum(pSyncNode),
|
pSyncNode->changing, pSyncNode->restoreFinish, syncNodeDynamicQuorum(pSyncNode),
|
||||||
pSyncNode->electTimerLogicClockUser, pSyncNode->heartbeatTimerLogicClockUser, peerStateStr, printStr);
|
pSyncNode->electTimerLogicClock, pSyncNode->heartbeatTimerLogicClockUser, peerStateStr, printStr);
|
||||||
} else {
|
} else {
|
||||||
snprintf(s, len, "%s", str);
|
snprintf(s, len, "%s", str);
|
||||||
}
|
}
|
||||||
|
@ -2000,7 +1993,7 @@ inline void syncNodeErrorLog(const SSyncNode* pSyncNode, char* str) {
|
||||||
snapshot.lastApplyTerm, pSyncNode->pRaftCfg->isStandBy, pSyncNode->pRaftCfg->snapshotStrategy,
|
snapshot.lastApplyTerm, pSyncNode->pRaftCfg->isStandBy, pSyncNode->pRaftCfg->snapshotStrategy,
|
||||||
pSyncNode->pRaftCfg->batchSize, pSyncNode->replicaNum, pSyncNode->pRaftCfg->lastConfigIndex,
|
pSyncNode->pRaftCfg->batchSize, pSyncNode->replicaNum, pSyncNode->pRaftCfg->lastConfigIndex,
|
||||||
pSyncNode->changing, pSyncNode->restoreFinish, syncNodeDynamicQuorum(pSyncNode),
|
pSyncNode->changing, pSyncNode->restoreFinish, syncNodeDynamicQuorum(pSyncNode),
|
||||||
pSyncNode->electTimerLogicClockUser, pSyncNode->heartbeatTimerLogicClockUser, printStr);
|
pSyncNode->electTimerLogicClock, pSyncNode->heartbeatTimerLogicClockUser, printStr);
|
||||||
} else {
|
} else {
|
||||||
snprintf(logBuf, sizeof(logBuf), "%s", str);
|
snprintf(logBuf, sizeof(logBuf), "%s", str);
|
||||||
}
|
}
|
||||||
|
@ -2022,7 +2015,7 @@ inline void syncNodeErrorLog(const SSyncNode* pSyncNode, char* str) {
|
||||||
snapshot.lastApplyTerm, pSyncNode->pRaftCfg->isStandBy, pSyncNode->pRaftCfg->snapshotStrategy,
|
snapshot.lastApplyTerm, pSyncNode->pRaftCfg->isStandBy, pSyncNode->pRaftCfg->snapshotStrategy,
|
||||||
pSyncNode->pRaftCfg->batchSize, pSyncNode->replicaNum, pSyncNode->pRaftCfg->lastConfigIndex,
|
pSyncNode->pRaftCfg->batchSize, pSyncNode->replicaNum, pSyncNode->pRaftCfg->lastConfigIndex,
|
||||||
pSyncNode->changing, pSyncNode->restoreFinish, syncNodeDynamicQuorum(pSyncNode),
|
pSyncNode->changing, pSyncNode->restoreFinish, syncNodeDynamicQuorum(pSyncNode),
|
||||||
pSyncNode->electTimerLogicClockUser, pSyncNode->heartbeatTimerLogicClockUser, printStr);
|
pSyncNode->electTimerLogicClock, pSyncNode->heartbeatTimerLogicClockUser, printStr);
|
||||||
} else {
|
} else {
|
||||||
snprintf(s, len, "%s", str);
|
snprintf(s, len, "%s", str);
|
||||||
}
|
}
|
||||||
|
@ -2789,26 +2782,37 @@ static void syncNodeEqPingTimer(void* param, void* tmrId) {
|
||||||
}
|
}
|
||||||
|
|
||||||
static void syncNodeEqElectTimer(void* param, void* tmrId) {
|
static void syncNodeEqElectTimer(void* param, void* tmrId) {
|
||||||
SSyncNode* pSyncNode = (SSyncNode*)param;
|
SElectTimer* pElectTimer = (SElectTimer*)param;
|
||||||
if (atomic_load_64(&pSyncNode->electTimerLogicClockUser) <= atomic_load_64(&pSyncNode->electTimerLogicClock)) {
|
SSyncNode* pSyncNode = pElectTimer->pSyncNode;
|
||||||
SyncTimeout* pSyncMsg = syncTimeoutBuild2(SYNC_TIMEOUT_ELECTION, atomic_load_64(&pSyncNode->electTimerLogicClock),
|
|
||||||
pSyncNode->electTimerMS, pSyncNode->vgId, pSyncNode);
|
SyncTimeout* pSyncMsg = syncTimeoutBuild2(SYNC_TIMEOUT_ELECTION, pElectTimer->logicClock, pSyncNode->electTimerMS,
|
||||||
|
pSyncNode->vgId, pSyncNode);
|
||||||
SRpcMsg rpcMsg;
|
SRpcMsg rpcMsg;
|
||||||
syncTimeout2RpcMsg(pSyncMsg, &rpcMsg);
|
syncTimeout2RpcMsg(pSyncMsg, &rpcMsg);
|
||||||
syncRpcMsgLog2((char*)"==syncNodeEqElectTimer==", &rpcMsg);
|
|
||||||
if (pSyncNode->FpEqMsg != NULL) {
|
if (pSyncNode->FpEqMsg != NULL) {
|
||||||
int32_t code = pSyncNode->FpEqMsg(pSyncNode->msgcb, &rpcMsg);
|
int32_t code = pSyncNode->FpEqMsg(pSyncNode->msgcb, &rpcMsg);
|
||||||
if (code != 0) {
|
if (code != 0) {
|
||||||
sError("vgId:%d, sync enqueue elect msg error, code:%d", pSyncNode->vgId, code);
|
sError("vgId:%d, sync enqueue elect msg error, code:%d", pSyncNode->vgId, code);
|
||||||
rpcFreeCont(rpcMsg.pCont);
|
rpcFreeCont(rpcMsg.pCont);
|
||||||
syncTimeoutDestroy(pSyncMsg);
|
syncTimeoutDestroy(pSyncMsg);
|
||||||
|
taosMemoryFree(pElectTimer);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
do {
|
||||||
|
char logBuf[128];
|
||||||
|
snprintf(logBuf, sizeof(logBuf), "eq elect timer lc:%" PRIu64, pSyncMsg->logicClock);
|
||||||
|
syncNodeEventLog(pSyncNode, logBuf);
|
||||||
|
} while (0);
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
sTrace("syncNodeEqElectTimer FpEqMsg is NULL");
|
sTrace("syncNodeEqElectTimer FpEqMsg is NULL");
|
||||||
}
|
}
|
||||||
syncTimeoutDestroy(pSyncMsg);
|
|
||||||
|
|
||||||
|
syncTimeoutDestroy(pSyncMsg);
|
||||||
|
taosMemoryFree(pElectTimer);
|
||||||
|
|
||||||
|
#if 0
|
||||||
// reset timer ms
|
// reset timer ms
|
||||||
if (syncEnvIsStart() && pSyncNode->electBaseLine > 0) {
|
if (syncEnvIsStart() && pSyncNode->electBaseLine > 0) {
|
||||||
pSyncNode->electTimerMS = syncUtilElectRandomMS(pSyncNode->electBaseLine, 2 * pSyncNode->electBaseLine);
|
pSyncNode->electTimerMS = syncUtilElectRandomMS(pSyncNode->electBaseLine, 2 * pSyncNode->electBaseLine);
|
||||||
|
@ -2817,10 +2821,7 @@ static void syncNodeEqElectTimer(void* param, void* tmrId) {
|
||||||
} else {
|
} else {
|
||||||
sError("sync env is stop, syncNodeEqElectTimer");
|
sError("sync env is stop, syncNodeEqElectTimer");
|
||||||
}
|
}
|
||||||
} else {
|
#endif
|
||||||
sTrace("==syncNodeEqElectTimer== electTimerLogicClock:%" PRIu64 ", electTimerLogicClockUser:%" PRIu64,
|
|
||||||
pSyncNode->electTimerLogicClock, pSyncNode->electTimerLogicClockUser);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void syncNodeEqHeartbeatTimer(void* param, void* tmrId) {
|
static void syncNodeEqHeartbeatTimer(void* param, void* tmrId) {
|
||||||
|
@ -3000,16 +3001,6 @@ static int32_t syncNodeAppendNoop(SSyncNode* ths) {
|
||||||
// on message ----
|
// on message ----
|
||||||
int32_t syncNodeOnPingCb(SSyncNode* ths, SyncPing* pMsg) {
|
int32_t syncNodeOnPingCb(SSyncNode* ths, SyncPing* pMsg) {
|
||||||
// log state
|
// log state
|
||||||
char logBuf[1024] = {0};
|
|
||||||
snprintf(logBuf, sizeof(logBuf),
|
|
||||||
"==syncNodeOnPingCb== vgId:%d, state: %d, %s, term:%" PRIu64 " electTimerLogicClock:%" PRIu64
|
|
||||||
", "
|
|
||||||
"electTimerLogicClockUser:%" PRIu64 ", electTimerMS:%d",
|
|
||||||
ths->vgId, ths->state, syncUtilState2String(ths->state), ths->pRaftStore->currentTerm,
|
|
||||||
ths->electTimerLogicClock, ths->electTimerLogicClockUser, ths->electTimerMS);
|
|
||||||
|
|
||||||
int32_t ret = 0;
|
|
||||||
syncPingLog2(logBuf, pMsg);
|
|
||||||
SyncPingReply* pMsgReply = syncPingReplyBuild3(&ths->myRaftId, &pMsg->srcId, ths->vgId);
|
SyncPingReply* pMsgReply = syncPingReplyBuild3(&ths->myRaftId, &pMsg->srcId, ths->vgId);
|
||||||
SRpcMsg rpcMsg;
|
SRpcMsg rpcMsg;
|
||||||
syncPingReply2RpcMsg(pMsgReply, &rpcMsg);
|
syncPingReply2RpcMsg(pMsgReply, &rpcMsg);
|
||||||
|
@ -3024,7 +3015,7 @@ int32_t syncNodeOnPingCb(SSyncNode* ths, SyncPing* pMsg) {
|
||||||
syncNodeSendMsgById(&pMsgReply->destId, ths, &rpcMsg);
|
syncNodeSendMsgById(&pMsgReply->destId, ths, &rpcMsg);
|
||||||
syncPingReplyDestroy(pMsgReply);
|
syncPingReplyDestroy(pMsgReply);
|
||||||
|
|
||||||
return ret;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t syncNodeOnPingReplyCb(SSyncNode* ths, SyncPingReply* pMsg) {
|
int32_t syncNodeOnPingReplyCb(SSyncNode* ths, SyncPingReply* pMsg) {
|
||||||
|
|
|
@ -113,10 +113,8 @@ int32_t syncNodeOnTimer(SSyncNode* ths, SyncTimeout* pMsg) {
|
||||||
}
|
}
|
||||||
|
|
||||||
} else if (pMsg->timeoutType == SYNC_TIMEOUT_ELECTION) {
|
} else if (pMsg->timeoutType == SYNC_TIMEOUT_ELECTION) {
|
||||||
if (atomic_load_64(&ths->electTimerLogicClockUser) <= pMsg->logicClock) {
|
if (atomic_load_64(&ths->electTimerLogicClock) <= pMsg->logicClock) {
|
||||||
++(ths->electTimerCounter);
|
++(ths->electTimerCounter);
|
||||||
sTrace("vgId:%d, sync timer, type:election count:%" PRIu64 ", lc-user:%" PRIu64, ths->vgId,
|
|
||||||
ths->electTimerCounter, ths->electTimerLogicClockUser);
|
|
||||||
|
|
||||||
syncNodeElect(ths);
|
syncNodeElect(ths);
|
||||||
}
|
}
|
||||||
|
|
|
@ -66,7 +66,12 @@ bool voteGrantedMajority(SVotesGranted *pVotesGranted) {
|
||||||
|
|
||||||
void voteGrantedVote(SVotesGranted *pVotesGranted, SyncRequestVoteReply *pMsg) {
|
void voteGrantedVote(SVotesGranted *pVotesGranted, SyncRequestVoteReply *pMsg) {
|
||||||
ASSERT(pMsg->voteGranted == true);
|
ASSERT(pMsg->voteGranted == true);
|
||||||
ASSERT(pMsg->term == pVotesGranted->term);
|
|
||||||
|
if (pMsg->term != pVotesGranted->term) {
|
||||||
|
syncNodeEventLog(pVotesGranted->pSyncNode, "vote grant vnode error");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
ASSERT(syncUtilSameId(&pVotesGranted->pSyncNode->myRaftId, &pMsg->destId));
|
ASSERT(syncUtilSameId(&pVotesGranted->pSyncNode->myRaftId, &pMsg->destId));
|
||||||
|
|
||||||
int j = -1;
|
int j = -1;
|
||||||
|
@ -201,7 +206,11 @@ bool votesResponded(SVotesRespond *pVotesRespond, const SRaftId *pRaftId) {
|
||||||
}
|
}
|
||||||
|
|
||||||
void votesRespondAdd(SVotesRespond *pVotesRespond, const SyncRequestVoteReply *pMsg) {
|
void votesRespondAdd(SVotesRespond *pVotesRespond, const SyncRequestVoteReply *pMsg) {
|
||||||
ASSERT(pVotesRespond->term == pMsg->term);
|
if (pVotesRespond->term != pMsg->term) {
|
||||||
|
syncNodeEventLog(pVotesRespond->pSyncNode, "vote respond add error");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
for (int i = 0; i < pVotesRespond->replicaNum; ++i) {
|
for (int i = 0; i < pVotesRespond->replicaNum; ++i) {
|
||||||
if (syncUtilSameId(&((*(pVotesRespond->replicas))[i]), &pMsg->srcId)) {
|
if (syncUtilSameId(&((*(pVotesRespond->replicas))[i]), &pMsg->srcId)) {
|
||||||
// ASSERT(pVotesRespond->isRespond[i] == false);
|
// ASSERT(pVotesRespond->isRespond[i] == false);
|
||||||
|
|
|
@ -91,48 +91,6 @@ void* taosArrayAddBatch(SArray* pArray, const void* pData, int32_t nEles) {
|
||||||
return dst;
|
return dst;
|
||||||
}
|
}
|
||||||
|
|
||||||
void taosArrayRemoveBatch(SArray* pArray, const int32_t* pData, int32_t numOfElems) {
|
|
||||||
assert(pArray != NULL && pData != NULL);
|
|
||||||
if (numOfElems <= 0) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
size_t size = taosArrayGetSize(pArray);
|
|
||||||
if (numOfElems >= size) {
|
|
||||||
taosArrayClear(pArray);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
int32_t i = pData[0] + 1, j = 0;
|
|
||||||
while (i < size) {
|
|
||||||
if (j == numOfElems - 1) {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
char* p = TARRAY_GET_ELEM(pArray, i);
|
|
||||||
if (i > pData[j] && i < pData[j + 1]) {
|
|
||||||
char* dst = TARRAY_GET_ELEM(pArray, i - (j + 1));
|
|
||||||
memmove(dst, p, pArray->elemSize);
|
|
||||||
} else if (i == pData[j + 1]) {
|
|
||||||
j += 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
i += 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
assert(i == pData[numOfElems - 1] + 1 && i <= size);
|
|
||||||
|
|
||||||
int32_t srcIndex = pData[numOfElems - 1] + 1;
|
|
||||||
int32_t dstIndex = pData[numOfElems - 1] - numOfElems + 1;
|
|
||||||
if (pArray->size - srcIndex > 0) {
|
|
||||||
char* dst = TARRAY_GET_ELEM(pArray, dstIndex);
|
|
||||||
char* src = TARRAY_GET_ELEM(pArray, srcIndex);
|
|
||||||
memmove(dst, src, pArray->elemSize * (pArray->size - srcIndex));
|
|
||||||
}
|
|
||||||
|
|
||||||
pArray->size -= numOfElems;
|
|
||||||
}
|
|
||||||
|
|
||||||
void taosArrayRemoveDuplicate(SArray* pArray, __compar_fn_t comparFn, void (*fp)(void*)) {
|
void taosArrayRemoveDuplicate(SArray* pArray, __compar_fn_t comparFn, void (*fp)(void*)) {
|
||||||
assert(pArray);
|
assert(pArray);
|
||||||
|
|
||||||
|
@ -435,17 +393,6 @@ void taosArraySortString(SArray* pArray, __compar_fn_t comparFn) {
|
||||||
taosSort(pArray->pData, pArray->size, pArray->elemSize, comparFn);
|
taosSort(pArray->pData, pArray->size, pArray->elemSize, comparFn);
|
||||||
}
|
}
|
||||||
|
|
||||||
char* taosArraySearchString(const SArray* pArray, const char* key, __compar_fn_t comparFn, int32_t flags) {
|
|
||||||
assert(pArray != NULL);
|
|
||||||
assert(key != NULL);
|
|
||||||
|
|
||||||
void* p = taosbsearch(&key, pArray->pData, pArray->size, pArray->elemSize, comparFn, flags);
|
|
||||||
if (p == NULL) {
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
return *(char**)p;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int32_t taosArrayPartition(SArray* pArray, int32_t i, int32_t j, __ext_compar_fn_t fn, const void* userData) {
|
static int32_t taosArrayPartition(SArray* pArray, int32_t i, int32_t j, __ext_compar_fn_t fn, const void* userData) {
|
||||||
void* key = taosArrayGetP(pArray, i);
|
void* key = taosArrayGetP(pArray, i);
|
||||||
while (i < j) {
|
while (i < j) {
|
||||||
|
@ -543,26 +490,7 @@ void* taosDecodeArray(const void* buf, SArray** pArray, FDecode decode, int32_t
|
||||||
void taosArraySortPWithExt(SArray* pArray, __ext_compar_fn_t fn, const void* param) {
|
void taosArraySortPWithExt(SArray* pArray, __ext_compar_fn_t fn, const void* param) {
|
||||||
taosArrayGetSize(pArray) > 8 ? taosArrayQuickSort(pArray, fn, param) : taosArrayInsertSort(pArray, fn, param);
|
taosArrayGetSize(pArray) > 8 ? taosArrayQuickSort(pArray, fn, param) : taosArrayInsertSort(pArray, fn, param);
|
||||||
}
|
}
|
||||||
// TODO(yihaoDeng) add order array<type>
|
|
||||||
//
|
|
||||||
|
|
||||||
char* taosShowStrArray(const SArray* pArray) {
|
|
||||||
int32_t sz = pArray->size;
|
|
||||||
int32_t tlen = 0;
|
|
||||||
for (int32_t i = 0; i < sz; i++) {
|
|
||||||
tlen += strlen(taosArrayGetP(pArray, i)) + 1;
|
|
||||||
}
|
|
||||||
char* res = taosMemoryCalloc(1, tlen);
|
|
||||||
char* buf = res;
|
|
||||||
for (int32_t i = 0; i < sz; i++) {
|
|
||||||
char* str = taosArrayGetP(pArray, i);
|
|
||||||
int32_t len = strlen(str);
|
|
||||||
memcpy(buf, str, len);
|
|
||||||
buf += len;
|
|
||||||
if (i != sz - 1) *buf = ',';
|
|
||||||
}
|
|
||||||
return res;
|
|
||||||
}
|
|
||||||
void taosArraySwap(SArray* a, SArray* b) {
|
void taosArraySwap(SArray* a, SArray* b) {
|
||||||
if (a == NULL || b == NULL) return;
|
if (a == NULL || b == NULL) return;
|
||||||
size_t t = a->size;
|
size_t t = a->size;
|
||||||
|
|
|
@ -1,48 +0,0 @@
|
||||||
/*
|
|
||||||
* Copyright (c) 2019 TAOS Data, Inc. <jhtao@taosdata.com>
|
|
||||||
*
|
|
||||||
* This program is free software: you can use, redistribute, and/or modify
|
|
||||||
* it under the terms of the GNU Affero General Public License, version 3
|
|
||||||
* or later ("AGPL"), as published by the Free Software Foundation.
|
|
||||||
*
|
|
||||||
* This program is distributed in the hope that it will be useful, but WITHOUT
|
|
||||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
|
||||||
* FITNESS FOR A PARTICULAR PURPOSE.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU Affero General Public License
|
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#define _DEFAULT_SOURCE
|
|
||||||
#include "tfunctional.h"
|
|
||||||
|
|
||||||
FORCE_INLINE void* genericInvoke(tGenericSavedFunc* const pSavedFunc) { return pSavedFunc->func(pSavedFunc->args); }
|
|
||||||
|
|
||||||
#if 0
|
|
||||||
tGenericSavedFunc* genericSavedFuncInit(GenericVaFunc func, int32_t numOfArgs) {
|
|
||||||
tGenericSavedFunc* pSavedFunc = taosMemoryMalloc(sizeof(tGenericSavedFunc) + numOfArgs * (sizeof(void*)));
|
|
||||||
if (pSavedFunc == NULL) return NULL;
|
|
||||||
pSavedFunc->func = func;
|
|
||||||
return pSavedFunc;
|
|
||||||
}
|
|
||||||
|
|
||||||
tI32SavedFunc* i32SavedFuncInit(I32VaFunc func, int32_t numOfArgs) {
|
|
||||||
tI32SavedFunc* pSavedFunc = taosMemoryMalloc(sizeof(tI32SavedFunc) + numOfArgs * sizeof(void*));
|
|
||||||
if (pSavedFunc == NULL) return NULL;
|
|
||||||
pSavedFunc->func = func;
|
|
||||||
return pSavedFunc;
|
|
||||||
}
|
|
||||||
|
|
||||||
tVoidSavedFunc* voidSavedFuncInit(VoidVaFunc func, int32_t numOfArgs) {
|
|
||||||
tVoidSavedFunc* pSavedFunc = taosMemoryMalloc(sizeof(tVoidSavedFunc) + numOfArgs * sizeof(void*));
|
|
||||||
if (pSavedFunc == NULL) return NULL;
|
|
||||||
pSavedFunc->func = func;
|
|
||||||
return pSavedFunc;
|
|
||||||
}
|
|
||||||
|
|
||||||
FORCE_INLINE int32_t i32Invoke(tI32SavedFunc* const pSavedFunc) { return pSavedFunc->func(pSavedFunc->args); }
|
|
||||||
|
|
||||||
FORCE_INLINE void voidInvoke(tVoidSavedFunc* const pSavedFunc) {
|
|
||||||
if (pSavedFunc) pSavedFunc->func(pSavedFunc->args);
|
|
||||||
}
|
|
||||||
#endif
|
|
|
@ -798,7 +798,7 @@ static void *taosHashReleaseNode(SHashObj *pHashObj, void *p, int *slot) {
|
||||||
}
|
}
|
||||||
|
|
||||||
void *taosHashIterate(SHashObj *pHashObj, void *p) {
|
void *taosHashIterate(SHashObj *pHashObj, void *p) {
|
||||||
if (pHashObj == NULL) return NULL;
|
if (pHashObj == NULL || pHashObj->size == 0) return NULL;
|
||||||
|
|
||||||
int slot = 0;
|
int slot = 0;
|
||||||
char *data = NULL;
|
char *data = NULL;
|
||||||
|
|
|
@ -87,7 +87,6 @@ SSkipList *tSkipListCreate(uint8_t maxLevel, uint8_t keyType, uint16_t keyLen, _
|
||||||
#if SKIP_LIST_RECORD_PERFORMANCE
|
#if SKIP_LIST_RECORD_PERFORMANCE
|
||||||
pSkipList->state.nTotalMemSize += sizeof(SSkipList);
|
pSkipList->state.nTotalMemSize += sizeof(SSkipList);
|
||||||
#endif
|
#endif
|
||||||
pSkipList->insertHandleFn = NULL;
|
|
||||||
|
|
||||||
return pSkipList;
|
return pSkipList;
|
||||||
}
|
}
|
||||||
|
@ -105,8 +104,6 @@ void tSkipListDestroy(SSkipList *pSkipList) {
|
||||||
tSkipListFreeNode(pTemp);
|
tSkipListFreeNode(pTemp);
|
||||||
}
|
}
|
||||||
|
|
||||||
taosMemoryFreeClear(pSkipList->insertHandleFn);
|
|
||||||
|
|
||||||
tSkipListUnlock(pSkipList);
|
tSkipListUnlock(pSkipList);
|
||||||
if (pSkipList->lock != NULL) {
|
if (pSkipList->lock != NULL) {
|
||||||
taosThreadRwlockDestroy(pSkipList->lock);
|
taosThreadRwlockDestroy(pSkipList->lock);
|
||||||
|
@ -684,35 +681,14 @@ static SSkipListNode *tSkipListPutImpl(SSkipList *pSkipList, void *pData, SSkipL
|
||||||
} else {
|
} else {
|
||||||
pNode = SL_NODE_GET_BACKWARD_POINTER(direction[0], 0);
|
pNode = SL_NODE_GET_BACKWARD_POINTER(direction[0], 0);
|
||||||
}
|
}
|
||||||
if (pSkipList->insertHandleFn) {
|
|
||||||
pSkipList->insertHandleFn->args[0] = pData;
|
|
||||||
pSkipList->insertHandleFn->args[1] = pNode->pData;
|
|
||||||
pData = genericInvoke(pSkipList->insertHandleFn);
|
|
||||||
}
|
|
||||||
if (pData) {
|
if (pData) {
|
||||||
atomic_store_ptr(&(pNode->pData), pData);
|
atomic_store_ptr(&(pNode->pData), pData);
|
||||||
}
|
}
|
||||||
} else {
|
|
||||||
// for compatiblity, duplicate key inserted when update=0 should be also calculated as affected rows!
|
|
||||||
if (pSkipList->insertHandleFn) {
|
|
||||||
pSkipList->insertHandleFn->args[0] = NULL;
|
|
||||||
pSkipList->insertHandleFn->args[1] = NULL;
|
|
||||||
genericInvoke(pSkipList->insertHandleFn);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
pNode = tSkipListNewNode(getSkipListRandLevel(pSkipList));
|
pNode = tSkipListNewNode(getSkipListRandLevel(pSkipList));
|
||||||
if (pNode != NULL) {
|
if (pNode != NULL) {
|
||||||
// insertHandleFn will be assigned only for timeseries data,
|
|
||||||
// in which case, pData is pointed to an memory to be freed later;
|
|
||||||
// while for metadata, the mem alloc will not be called.
|
|
||||||
if (pSkipList->insertHandleFn) {
|
|
||||||
pSkipList->insertHandleFn->args[0] = pData;
|
|
||||||
pSkipList->insertHandleFn->args[1] = NULL;
|
|
||||||
pData = genericInvoke(pSkipList->insertHandleFn);
|
|
||||||
}
|
|
||||||
pNode->pData = pData;
|
pNode->pData = pData;
|
||||||
|
|
||||||
tSkipListDoInsert(pSkipList, direction, pNode, isForward);
|
tSkipListDoInsert(pSkipList, direction, pNode, isForward);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -5,52 +5,52 @@
|
||||||
|
|
||||||
#include "tarray.h"
|
#include "tarray.h"
|
||||||
#include "tcompare.h"
|
#include "tcompare.h"
|
||||||
|
/*
|
||||||
namespace {
|
namespace {
|
||||||
|
|
||||||
static void remove_batch_test() {
|
static void remove_batch_test() {
|
||||||
SArray* pa = (SArray*)taosArrayInit(4, sizeof(int32_t));
|
SArray* pa = (SArray*)taosArrayInit(4, sizeof(int32_t));
|
||||||
|
|
||||||
for (int32_t i = 0; i < 20; ++i) {
|
for (int32_t i = 0; i < 20; ++i) {
|
||||||
int32_t a = i;
|
int32_t a = i;
|
||||||
taosArrayPush(pa, &a);
|
taosArrayPush(pa, &a);
|
||||||
}
|
}
|
||||||
|
|
||||||
SArray* delList = (SArray*)taosArrayInit(4, sizeof(int32_t));
|
SArray* delList = (SArray*)taosArrayInit(4, sizeof(int32_t));
|
||||||
taosArrayRemoveBatch(pa, (const int32_t*)TARRAY_GET_START(delList), taosArrayGetSize(delList));
|
taosArrayRemoveBatch(pa, (const int32_t*)TARRAY_GET_START(delList), taosArrayGetSize(delList));
|
||||||
EXPECT_EQ(taosArrayGetSize(pa), 20);
|
EXPECT_EQ(taosArrayGetSize(pa), 20);
|
||||||
|
|
||||||
int32_t a = 5;
|
int32_t a = 5;
|
||||||
taosArrayPush(delList, &a);
|
taosArrayPush(delList, &a);
|
||||||
|
|
||||||
taosArrayRemoveBatch(pa, (const int32_t*)TARRAY_GET_START(delList), taosArrayGetSize(delList));
|
taosArrayRemoveBatch(pa, (const int32_t*)TARRAY_GET_START(delList), taosArrayGetSize(delList));
|
||||||
EXPECT_EQ(taosArrayGetSize(pa), 19);
|
EXPECT_EQ(taosArrayGetSize(pa), 19);
|
||||||
EXPECT_EQ(*(int*)taosArrayGet(pa, 5), 6);
|
EXPECT_EQ(*(int*)taosArrayGet(pa, 5), 6);
|
||||||
|
|
||||||
taosArrayInsert(pa, 5, &a);
|
taosArrayInsert(pa, 5, &a);
|
||||||
EXPECT_EQ(taosArrayGetSize(pa), 20);
|
EXPECT_EQ(taosArrayGetSize(pa), 20);
|
||||||
EXPECT_EQ(*(int*)taosArrayGet(pa, 5), 5);
|
EXPECT_EQ(*(int*)taosArrayGet(pa, 5), 5);
|
||||||
|
|
||||||
taosArrayClear(delList);
|
taosArrayClear(delList);
|
||||||
|
|
||||||
a = 6;
|
a = 6;
|
||||||
taosArrayPush(delList, &a);
|
taosArrayPush(delList, &a);
|
||||||
|
|
||||||
a = 9;
|
a = 9;
|
||||||
taosArrayPush(delList, &a);
|
taosArrayPush(delList, &a);
|
||||||
|
|
||||||
a = 14;
|
a = 14;
|
||||||
taosArrayPush(delList, &a);
|
taosArrayPush(delList, &a);
|
||||||
taosArrayRemoveBatch(pa, (const int32_t*)TARRAY_GET_START(delList), taosArrayGetSize(delList));
|
taosArrayRemoveBatch(pa, (const int32_t*)TARRAY_GET_START(delList), taosArrayGetSize(delList));
|
||||||
EXPECT_EQ(taosArrayGetSize(pa), 17);
|
EXPECT_EQ(taosArrayGetSize(pa), 17);
|
||||||
|
|
||||||
taosArrayDestroy(pa);
|
taosArrayDestroy(pa);
|
||||||
taosArrayDestroy(delList);
|
taosArrayDestroy(delList);
|
||||||
}
|
}
|
||||||
} // namespace
|
} // namespace
|
||||||
|
|
||||||
TEST(arrayTest, array_list_test) { remove_batch_test(); }
|
TEST(arrayTest, array_list_test) { remove_batch_test(); }
|
||||||
|
*/
|
||||||
TEST(arrayTest, array_search_test) {
|
TEST(arrayTest, array_search_test) {
|
||||||
SArray* pa = (SArray*)taosArrayInit(4, sizeof(int32_t));
|
SArray* pa = (SArray*)taosArrayInit(4, sizeof(int32_t));
|
||||||
|
|
||||||
|
|
|
@ -247,15 +247,15 @@
|
||||||
./test.sh -f tsim/stream/ignoreExpiredData.sim
|
./test.sh -f tsim/stream/ignoreExpiredData.sim
|
||||||
./test.sh -f tsim/stream/sliding.sim
|
./test.sh -f tsim/stream/sliding.sim
|
||||||
./test.sh -f tsim/stream/partitionbyColumnInterval.sim
|
./test.sh -f tsim/stream/partitionbyColumnInterval.sim
|
||||||
#./test.sh -f tsim/stream/partitionbyColumnSession.sim
|
./test.sh -f tsim/stream/partitionbyColumnSession.sim
|
||||||
#./test.sh -f tsim/stream/partitionbyColumnState.sim
|
./test.sh -f tsim/stream/partitionbyColumnState.sim
|
||||||
#./test.sh -f tsim/stream/deleteInterval.sim
|
./test.sh -f tsim/stream/deleteInterval.sim
|
||||||
#./test.sh -f tsim/stream/deleteSession.sim
|
./test.sh -f tsim/stream/deleteSession.sim
|
||||||
#./test.sh -f tsim/stream/deleteState.sim
|
./test.sh -f tsim/stream/deleteState.sim
|
||||||
#./test.sh -f tsim/stream/fillIntervalDelete0.sim
|
./test.sh -f tsim/stream/fillIntervalDelete0.sim
|
||||||
#./test.sh -f tsim/stream/fillIntervalDelete1.sim
|
./test.sh -f tsim/stream/fillIntervalDelete1.sim
|
||||||
./test.sh -f tsim/stream/fillIntervalLinear.sim
|
./test.sh -f tsim/stream/fillIntervalLinear.sim
|
||||||
#./test.sh -f tsim/stream/fillIntervalPartitionBy.sim
|
./test.sh -f tsim/stream/fillIntervalPartitionBy.sim
|
||||||
./test.sh -f tsim/stream/fillIntervalPrevNext.sim
|
./test.sh -f tsim/stream/fillIntervalPrevNext.sim
|
||||||
./test.sh -f tsim/stream/fillIntervalValue.sim
|
./test.sh -f tsim/stream/fillIntervalValue.sim
|
||||||
|
|
||||||
|
|
|
@ -236,7 +236,43 @@ endi
|
||||||
print loop3 over
|
print loop3 over
|
||||||
|
|
||||||
|
|
||||||
|
sql drop stream if exists streams1;
|
||||||
|
sql drop database if exists test1;
|
||||||
|
sql create database test1 vgroups 4 keep 7000;
|
||||||
|
sql use test1;
|
||||||
|
sql create stable st(ts timestamp,a int,b int,c int) tags(ta int,tb int,tc int);
|
||||||
|
sql create table t1 using st tags(1,1,1);
|
||||||
|
sql create table t2 using st tags(2,2,2);
|
||||||
|
sql create stream streams1 trigger at_once into streamt1 as select _wstart as c0, count(*) c1, count(a) c2 from st interval(10s) ;
|
||||||
|
|
||||||
|
sql insert into t1 values(1648791211000,1,2,3);
|
||||||
|
|
||||||
|
sql insert into t1 values(1262275200000,2,2,3);
|
||||||
|
sql insert into t2 values(1262275200000,1,2,3);
|
||||||
|
|
||||||
|
$loop_count = 0
|
||||||
|
loop4:
|
||||||
|
sleep 300
|
||||||
|
sql select * from streamt1 order by c0;
|
||||||
|
|
||||||
|
$loop_count = $loop_count + 1
|
||||||
|
if $loop_count == 10 then
|
||||||
|
return -1
|
||||||
|
endi
|
||||||
|
|
||||||
|
# row 0
|
||||||
|
if $rows != 2 then
|
||||||
|
print =====loop4=rows=$rows
|
||||||
|
goto loop4
|
||||||
|
endi
|
||||||
|
|
||||||
|
if $data01 != 2 then
|
||||||
|
print =====loop4=data11=$data11
|
||||||
|
goto loop4
|
||||||
|
endi
|
||||||
|
|
||||||
|
|
||||||
|
print loop4 over
|
||||||
|
|
||||||
|
|
||||||
#==system sh/exec.sh -n dnode1 -s stop -x SIGINT
|
#==system sh/exec.sh -n dnode1 -s stop -x SIGINT
|
||||||
|
|
|
@ -15,28 +15,30 @@
|
||||||
from util.log import *
|
from util.log import *
|
||||||
from util.cases import *
|
from util.cases import *
|
||||||
from util.sql import *
|
from util.sql import *
|
||||||
import subprocess
|
|
||||||
from util.common import *
|
from util.common import *
|
||||||
|
from util.sqlset import *
|
||||||
|
|
||||||
|
|
||||||
class TDTestCase:
|
class TDTestCase:
|
||||||
def init(self, conn, logSql):
|
def init(self, conn, logSql):
|
||||||
tdLog.debug("start to execute %s" % __file__)
|
tdLog.debug("start to execute %s" % __file__)
|
||||||
tdSql.init(conn.cursor())
|
tdSql.init(conn.cursor())
|
||||||
self.dbname = 'db'
|
self.setsql = TDSetSql()
|
||||||
self.ins_param_list = ['dnodes','mnodes','qnodes','cluster','functions','users','grants','topics','subscriptions','streams']
|
self.ins_param_list = ['dnodes','mnodes','qnodes','cluster','functions','users','grants','topics','subscriptions','streams']
|
||||||
self.perf_param = ['apps','connections','consumers','queries','transactions']
|
self.perf_param = ['apps','connections','consumers','queries','transactions']
|
||||||
self.perf_param_list = ['apps','connections','consumers','queries','trans']
|
self.perf_param_list = ['apps','connections','consumers','queries','trans']
|
||||||
|
|
||||||
def ins_check(self):
|
def ins_check(self):
|
||||||
|
tdSql.prepare()
|
||||||
for param in self.ins_param_list:
|
for param in self.ins_param_list:
|
||||||
tdSql.query(f'show {param}')
|
tdSql.query(f'show {param}')
|
||||||
show_result = tdSql.queryResult
|
show_result = tdSql.queryResult
|
||||||
tdSql.query(f'select * from information_schema.ins_{param}')
|
tdSql.query(f'select * from information_schema.ins_{param}')
|
||||||
select_result = tdSql.queryResult
|
select_result = tdSql.queryResult
|
||||||
tdSql.checkEqual(show_result,select_result)
|
tdSql.checkEqual(show_result,select_result)
|
||||||
|
tdSql.execute('drop database db')
|
||||||
def perf_check(self):
|
def perf_check(self):
|
||||||
|
tdSql.prepare()
|
||||||
for param in range(len(self.perf_param_list)):
|
for param in range(len(self.perf_param_list)):
|
||||||
tdSql.query(f'show {self.perf_param[param]}')
|
tdSql.query(f'show {self.perf_param[param]}')
|
||||||
if len(tdSql.queryResult) != 0:
|
if len(tdSql.queryResult) != 0:
|
||||||
|
@ -46,11 +48,74 @@ class TDTestCase:
|
||||||
tdSql.checkEqual(show_result,select_result)
|
tdSql.checkEqual(show_result,select_result)
|
||||||
else :
|
else :
|
||||||
continue
|
continue
|
||||||
def run(self):
|
tdSql.execute('drop database db')
|
||||||
|
def set_stb_sql(self,stbname,column_dict,tag_dict):
|
||||||
|
column_sql = ''
|
||||||
|
tag_sql = ''
|
||||||
|
for k,v in column_dict.items():
|
||||||
|
column_sql += f"{k} {v}, "
|
||||||
|
for k,v in tag_dict.items():
|
||||||
|
tag_sql += f"{k} {v}, "
|
||||||
|
create_stb_sql = f'create stable {stbname} ({column_sql[:-2]}) tags ({tag_sql[:-2]})'
|
||||||
|
return create_stb_sql
|
||||||
|
def show_sql(self):
|
||||||
tdSql.prepare()
|
tdSql.prepare()
|
||||||
|
tdSql.execute('use db')
|
||||||
|
stbname = f'`{tdCom.getLongName(5)}`'
|
||||||
|
tbname = f'`{tdCom.getLongName(3)}`'
|
||||||
|
column_dict = {
|
||||||
|
'`ts`': 'timestamp',
|
||||||
|
'`col1`': 'tinyint',
|
||||||
|
'`col2`': 'smallint',
|
||||||
|
'`col3`': 'int',
|
||||||
|
'`col4`': 'bigint',
|
||||||
|
'`col5`': 'tinyint unsigned',
|
||||||
|
'`col6`': 'smallint unsigned',
|
||||||
|
'`col7`': 'int unsigned',
|
||||||
|
'`col8`': 'bigint unsigned',
|
||||||
|
'`col9`': 'float',
|
||||||
|
'`col10`': 'double',
|
||||||
|
'`col11`': 'bool',
|
||||||
|
'`col12`': 'varchar(20)',
|
||||||
|
'`col13`': 'nchar(20)'
|
||||||
|
|
||||||
|
}
|
||||||
|
tag_dict = {
|
||||||
|
'`t1`': 'tinyint',
|
||||||
|
'`t2`': 'smallint',
|
||||||
|
'`t3`': 'int',
|
||||||
|
'`t4`': 'bigint',
|
||||||
|
'`t5`': 'tinyint unsigned',
|
||||||
|
'`t6`': 'smallint unsigned',
|
||||||
|
'`t7`': 'int unsigned',
|
||||||
|
'`t8`': 'bigint unsigned',
|
||||||
|
'`t9`': 'float',
|
||||||
|
'`t10`': 'double',
|
||||||
|
'`t11`': 'bool',
|
||||||
|
'`t12`': 'varchar(20)',
|
||||||
|
'`t13`': 'nchar(20)',
|
||||||
|
'`t14`': 'timestamp'
|
||||||
|
|
||||||
|
}
|
||||||
|
create_table_sql = self.set_stb_sql(stbname,column_dict,tag_dict)
|
||||||
|
tdSql.execute(create_table_sql)
|
||||||
|
tdSql.query(f'show create table {stbname}')
|
||||||
|
query_result = tdSql.queryResult
|
||||||
|
tdSql.checkEqual(query_result[0][1].lower(),create_table_sql)
|
||||||
|
tdSql.execute(f'create table {tbname} using {stbname} tags(1,1,1,1,1,1,1,1,1.000000e+00,1.000000e+00,true,"abc","abc123",0)')
|
||||||
|
tag_sql = '('
|
||||||
|
for tag_keys in tag_dict.keys():
|
||||||
|
tag_sql += f'{tag_keys}, '
|
||||||
|
tags = f'{tag_sql[:-2]})'
|
||||||
|
sql = f'create table {tbname} using {stbname} {tags} tags (1, 1, 1, 1, 1, 1, 1, 1, 1.000000e+00, 1.000000e+00, true, "abc", "abc123", 0)'
|
||||||
|
tdSql.query(f'show create table {tbname}')
|
||||||
|
query_result = tdSql.queryResult
|
||||||
|
tdSql.checkEqual(query_result[0][1].lower(),sql)
|
||||||
|
tdSql.execute('drop database db')
|
||||||
|
def run(self):
|
||||||
self.ins_check()
|
self.ins_check()
|
||||||
self.perf_check()
|
self.perf_check()
|
||||||
|
self.show_sql()
|
||||||
|
|
||||||
def stop(self):
|
def stop(self):
|
||||||
tdSql.close()
|
tdSql.close()
|
||||||
|
@ -58,3 +123,4 @@ class TDTestCase:
|
||||||
|
|
||||||
tdCases.addWindows(__file__, TDTestCase())
|
tdCases.addWindows(__file__, TDTestCase())
|
||||||
tdCases.addLinux(__file__, TDTestCase())
|
tdCases.addLinux(__file__, TDTestCase())
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,101 @@
|
||||||
|
|
||||||
|
import taos
|
||||||
|
import sys
|
||||||
|
import time
|
||||||
|
import socket
|
||||||
|
import os
|
||||||
|
import platform
|
||||||
|
if platform.system().lower() == 'windows':
|
||||||
|
import wexpect as taosExpect
|
||||||
|
else:
|
||||||
|
import pexpect as taosExpect
|
||||||
|
|
||||||
|
from util.log import *
|
||||||
|
from util.sql import *
|
||||||
|
from util.cases import *
|
||||||
|
from util.dnodes import *
|
||||||
|
from util.cluster import *
|
||||||
|
|
||||||
|
class TDTestCase:
|
||||||
|
|
||||||
|
def init(self, conn, logSql):
|
||||||
|
tdLog.debug(f"start to excute {__file__}")
|
||||||
|
tdSql.init(conn.cursor())
|
||||||
|
|
||||||
|
def getBuildPath(self):
|
||||||
|
selfPath = os.path.dirname(os.path.realpath(__file__))
|
||||||
|
|
||||||
|
if ("community" in selfPath):
|
||||||
|
projPath = selfPath[:selfPath.find("community")]
|
||||||
|
else:
|
||||||
|
projPath = selfPath[:selfPath.find("tests")]
|
||||||
|
|
||||||
|
for root, dirs, files in os.walk(projPath):
|
||||||
|
if ("taosd" in files or "taosd.exe" in files):
|
||||||
|
rootRealPath = os.path.dirname(os.path.realpath(root))
|
||||||
|
if ("packaging" not in rootRealPath):
|
||||||
|
buildPath = root[:len(root) - len("/build/bin")]
|
||||||
|
break
|
||||||
|
return buildPath
|
||||||
|
|
||||||
|
def preData(self):
|
||||||
|
# database\stb\tb\chiild-tb\rows\topics
|
||||||
|
tdSql.execute("create user testpy pass 'testpy'")
|
||||||
|
tdSql.execute("drop database if exists db0;")
|
||||||
|
tdSql.execute("create database db0 WAL_RETENTION_PERIOD -1 WAL_RETENTION_SIZE -1 ;")
|
||||||
|
tdSql.execute("use db0;")
|
||||||
|
tdSql.execute("create table if not exists db0.stb (ts timestamp, c1 int, c2 float, c3 double) tags (t1 int unsigned);")
|
||||||
|
tdSql.execute("create table db0.ct1 using db0.stb tags(1000);")
|
||||||
|
tdSql.execute("create table db0.ct2 using db0.stb tags(2000);")
|
||||||
|
tdSql.execute("create table if not exists db0.ntb (ts timestamp, c1 int, c2 float, c3 double) ;")
|
||||||
|
tdSql.query("show db0.stables;")
|
||||||
|
tdSql.execute("insert into db0.ct1 values(now+0s, 10, 2.0, 3.0);")
|
||||||
|
tdSql.execute("insert into db0.ct1 values(now+1s, 11, 2.1, 3.1)(now+2s, 12, 2.2, 3.2)(now+3s, 13, 2.3, 3.3);")
|
||||||
|
tdSql.execute("insert into db0.ntb values(now+2s, 10, 2.0, 3.0);")
|
||||||
|
tdSql.execute("create sma index sma_index_name1 on db0.stb function(max(c1),max(c2),min(c1)) interval(6m,10s) sliding(6m);")
|
||||||
|
tdSql.execute("create topic tpc1 as select * from db0.ct2; ")
|
||||||
|
|
||||||
|
|
||||||
|
#stream
|
||||||
|
tdSql.execute("drop database if exists source_db;")
|
||||||
|
tdSql.query("create database source_db vgroups 3;")
|
||||||
|
tdSql.query("use source_db")
|
||||||
|
tdSql.query("create table if not exists source_db.stb (ts timestamp, k int) tags (a int);")
|
||||||
|
tdSql.query("create table source_db.ct1 using source_db.stb tags(1000);create table source_db.ct2 using source_db.stb tags(2000);create table source_db.ct3 using source_db.stb tags(3000);")
|
||||||
|
tdSql.query("create stream s1 into source_db.output_stb as select _wstart AS start, min(k), max(k), sum(k) from source_db.stb interval(10m);")
|
||||||
|
|
||||||
|
def run(self):
|
||||||
|
buildPath = self.getBuildPath()
|
||||||
|
if (buildPath == ""):
|
||||||
|
tdLog.exit("taosd not found!")
|
||||||
|
else:
|
||||||
|
tdLog.info("taosd found in %s" % buildPath)
|
||||||
|
cfgPath = buildPath + "/../sim/psim/cfg"
|
||||||
|
taosdCfgPath = buildPath + "/../sim/dnode1/cfg"
|
||||||
|
walPath = buildPath + "/../sim/dnode1/data/vnode/vnode*/wal/"
|
||||||
|
walFilePath = buildPath + "/../sim/dnode1/data/vnode/vnode2/wal/"
|
||||||
|
|
||||||
|
tdLog.info("insert data")
|
||||||
|
self.preData()
|
||||||
|
tdDnodes.stop(1)
|
||||||
|
time.sleep(2)
|
||||||
|
tdLog.info("delete wal filePath")
|
||||||
|
# os.system("rm -rf %s/meta-ver*"%walPath)
|
||||||
|
os.system("rm -rf %s/*.idx"%walPath)
|
||||||
|
os.system("rm -rf %s/*.log"%walPath)
|
||||||
|
tdDnodes.start(1)
|
||||||
|
tdDnodes.stop(1)
|
||||||
|
time.sleep(2)
|
||||||
|
tdLog.info(" modify wal Index file")
|
||||||
|
os.system(" echo \"1231abcasep\" >> %s/00000000000000000000.idx"%walFilePath)
|
||||||
|
os.system(" echo \"1231abcasep\" >> %s/00000000000000000000.log"%walFilePath)
|
||||||
|
tdDnodes.start(1)
|
||||||
|
tdDnodes.stop(1)
|
||||||
|
|
||||||
|
|
||||||
|
def stop(self):
|
||||||
|
tdSql.close()
|
||||||
|
tdLog.success(f"{__file__} successfully executed")
|
||||||
|
|
||||||
|
tdCases.addLinux(__file__, TDTestCase())
|
||||||
|
tdCases.addWindows(__file__, TDTestCase())
|
|
@ -298,7 +298,7 @@ class TDTestCase:
|
||||||
def all_test(self):
|
def all_test(self):
|
||||||
self.test_create_sma()
|
self.test_create_sma()
|
||||||
|
|
||||||
def __create_tb(self):
|
def __create_tb(self, rollup=None):
|
||||||
tdLog.printNoPrefix("==========step: create table")
|
tdLog.printNoPrefix("==========step: create table")
|
||||||
create_stb_sql = f'''create table {STBNAME}(
|
create_stb_sql = f'''create table {STBNAME}(
|
||||||
ts timestamp, {INT_COL} int, {BINT_COL} bigint, {SINT_COL} smallint, {TINT_COL} tinyint,
|
ts timestamp, {INT_COL} int, {BINT_COL} bigint, {SINT_COL} smallint, {TINT_COL} tinyint,
|
||||||
|
@ -316,6 +316,10 @@ class TDTestCase:
|
||||||
{INT_UN_COL} int unsigned, {BINT_UN_COL} bigint unsigned
|
{INT_UN_COL} int unsigned, {BINT_UN_COL} bigint unsigned
|
||||||
)
|
)
|
||||||
'''
|
'''
|
||||||
|
if rollup is not None:
|
||||||
|
create_stb_sql += f" rollup({rollup})"
|
||||||
|
tdSql.execute(create_stb_sql)
|
||||||
|
else:
|
||||||
tdSql.execute(create_stb_sql)
|
tdSql.execute(create_stb_sql)
|
||||||
tdSql.execute(create_ntb_sql)
|
tdSql.execute(create_ntb_sql)
|
||||||
|
|
||||||
|
@ -343,7 +347,7 @@ class TDTestCase:
|
||||||
|
|
||||||
return data_set
|
return data_set
|
||||||
|
|
||||||
def __insert_data(self):
|
def __insert_data(self, rollup=None):
|
||||||
tdLog.printNoPrefix("==========step: start inser data into tables now.....")
|
tdLog.printNoPrefix("==========step: start inser data into tables now.....")
|
||||||
data = self.__data_set(rows=self.rows)
|
data = self.__data_set(rows=self.rows)
|
||||||
|
|
||||||
|
@ -369,6 +373,7 @@ class TDTestCase:
|
||||||
f"insert into ct2 values ( {NOW - i * int(TIME_STEP * 0.6)}, {neg_row_data} )")
|
f"insert into ct2 values ( {NOW - i * int(TIME_STEP * 0.6)}, {neg_row_data} )")
|
||||||
tdSql.execute(
|
tdSql.execute(
|
||||||
f"insert into ct4 values ( {NOW - i * int(TIME_STEP * 0.8) }, {row_data} )")
|
f"insert into ct4 values ( {NOW - i * int(TIME_STEP * 0.8) }, {row_data} )")
|
||||||
|
if rollup is None:
|
||||||
tdSql.execute(
|
tdSql.execute(
|
||||||
f"insert into {NTBNAME} values ( {NOW - i * int(TIME_STEP * 1.2)}, {row_data} )")
|
f"insert into {NTBNAME} values ( {NOW - i * int(TIME_STEP * 1.2)}, {row_data} )")
|
||||||
|
|
||||||
|
@ -385,7 +390,7 @@ class TDTestCase:
|
||||||
f"insert into ct4 values ( {NOW - (self.rows + 1) * int(TIME_STEP * 0.8)}, {null_data} )")
|
f"insert into ct4 values ( {NOW - (self.rows + 1) * int(TIME_STEP * 0.8)}, {null_data} )")
|
||||||
tdSql.execute(
|
tdSql.execute(
|
||||||
f"insert into ct4 values ( {NOW - self.rows * int(TIME_STEP * 0.39)}, {null_data} )")
|
f"insert into ct4 values ( {NOW - self.rows * int(TIME_STEP * 0.39)}, {null_data} )")
|
||||||
|
if rollup is None:
|
||||||
tdSql.execute(
|
tdSql.execute(
|
||||||
f"insert into {NTBNAME} values ( {NOW + int(TIME_STEP * 1.2)}, {null_data} )")
|
f"insert into {NTBNAME} values ( {NOW + int(TIME_STEP * 1.2)}, {null_data} )")
|
||||||
tdSql.execute(
|
tdSql.execute(
|
||||||
|
@ -421,6 +426,15 @@ class TDTestCase:
|
||||||
tdDnodes.stop(1)
|
tdDnodes.stop(1)
|
||||||
tdDnodes.start(1)
|
tdDnodes.start(1)
|
||||||
|
|
||||||
|
tdLog.printNoPrefix("==========step3:insert and flush in rollup database")
|
||||||
|
tdSql.execute("create database db4 retentions 1s:4m,2s:8m,3s:12m")
|
||||||
|
tdSql.execute("use db4")
|
||||||
|
self.__create_tb(rollup="first")
|
||||||
|
self.__insert_data(rollup="first")
|
||||||
|
tdSql.execute(f'drop stable if exists {STBNAME}')
|
||||||
|
tdSql.execute(f'flush database db4')
|
||||||
|
|
||||||
|
|
||||||
tdLog.printNoPrefix("==========step4:after wal, all check again ")
|
tdLog.printNoPrefix("==========step4:after wal, all check again ")
|
||||||
tdSql.prepare()
|
tdSql.prepare()
|
||||||
self.__create_tb()
|
self.__create_tb()
|
||||||
|
|
|
@ -0,0 +1,77 @@
|
||||||
|
from util.log import *
|
||||||
|
from util.cases import *
|
||||||
|
from util.sql import *
|
||||||
|
from util.common import *
|
||||||
|
|
||||||
|
|
||||||
|
class TDTestCase:
|
||||||
|
def init(self, conn, logSql):
|
||||||
|
tdLog.debug("start to execute %s" % __file__)
|
||||||
|
tdSql.init(conn.cursor())
|
||||||
|
self.ts = 1537146000000
|
||||||
|
self.binary_str = 'taosdata'
|
||||||
|
self.nchar_str = '涛思数据'
|
||||||
|
|
||||||
|
def set_create_normaltable_sql(self, ntbname, column_dict):
|
||||||
|
column_sql = ''
|
||||||
|
for k, v in column_dict.items():
|
||||||
|
column_sql += f"{k} {v},"
|
||||||
|
create_ntb_sql = f'create table {ntbname} (ts timestamp,{column_sql[:-1]})'
|
||||||
|
return create_ntb_sql
|
||||||
|
|
||||||
|
def set_create_stable_sql(self,stbname,column_dict,tag_dict):
|
||||||
|
column_sql = ''
|
||||||
|
tag_sql = ''
|
||||||
|
for k,v in column_dict.items():
|
||||||
|
column_sql += f"{k} {v},"
|
||||||
|
for k,v in tag_dict.items():
|
||||||
|
tag_sql += f"{k} {v},"
|
||||||
|
create_stb_sql = f'create table {stbname} (ts timestamp,{column_sql[:-1]}) tags({tag_sql[:-1]})'
|
||||||
|
return create_stb_sql
|
||||||
|
|
||||||
|
def gen_batch_sql(self, ntbname, batch=10):
|
||||||
|
values_str = ""
|
||||||
|
for i in range(batch):
|
||||||
|
values_str += f'({self.ts}, 1, 1, 1, {i+1}, 1, 1, 1, {i+1}, {i+0.1}, {i+0.1}, {i%2}, {i+1}, {i+1}),'
|
||||||
|
self.ts += 1
|
||||||
|
return f'insert into {ntbname} values {values_str[:-1]};'
|
||||||
|
|
||||||
|
def query_ntb_order_by_col(self, batch_num, rows_count):
|
||||||
|
tdSql.prepare()
|
||||||
|
ntbname = f'db.{tdCom.getLongName(5, "letters")}'
|
||||||
|
column_dict = {
|
||||||
|
'col1': 'tinyint',
|
||||||
|
'col2': 'smallint',
|
||||||
|
'col3': 'int',
|
||||||
|
'col4': 'bigint',
|
||||||
|
'col5': 'tinyint unsigned',
|
||||||
|
'col6': 'smallint unsigned',
|
||||||
|
'col7': 'int unsigned',
|
||||||
|
'col8': 'bigint unsigned',
|
||||||
|
'col9': 'float',
|
||||||
|
'col10': 'double',
|
||||||
|
'col11': 'bool',
|
||||||
|
'col12': 'binary(20)',
|
||||||
|
'col13': 'nchar(20)'
|
||||||
|
}
|
||||||
|
range_times = int(rows_count/batch_num)
|
||||||
|
create_ntb_sql = self.set_create_normaltable_sql(ntbname, column_dict)
|
||||||
|
tdSql.execute(create_ntb_sql)
|
||||||
|
for i in range(range_times):
|
||||||
|
tdSql.execute(self.gen_batch_sql(ntbname, batch_num))
|
||||||
|
tdSql.query(f'select count(*) from {ntbname}')
|
||||||
|
tdSql.checkEqual(tdSql.queryResult[0][0], rows_count)
|
||||||
|
tdSql.query(f'select * from {ntbname} order by col1')
|
||||||
|
tdSql.execute(f'flush database db')
|
||||||
|
|
||||||
|
|
||||||
|
def run(self):
|
||||||
|
self.query_ntb_order_by_col(batch_num=1000, rows_count=1000000)
|
||||||
|
|
||||||
|
def stop(self):
|
||||||
|
tdSql.close()
|
||||||
|
tdLog.success("%s successfully executed" % __file__)
|
||||||
|
|
||||||
|
|
||||||
|
tdCases.addWindows(__file__, TDTestCase())
|
||||||
|
tdCases.addLinux(__file__, TDTestCase())
|
|
@ -566,14 +566,17 @@ class TDTestCase:
|
||||||
|
|
||||||
tdSql.execute(f"flush database {DBNAME}")
|
tdSql.execute(f"flush database {DBNAME}")
|
||||||
|
|
||||||
tdLog.printNoPrefix("==========step1.5 : drop child table")
|
tdLog.printNoPrefix("==========step1.5 : drop index")
|
||||||
|
tdSql.execute(f"drop index {DBNAME}.sma_index_name1")
|
||||||
|
|
||||||
|
tdLog.printNoPrefix("==========step1.6 : drop child table")
|
||||||
tdSql.execute(f"drop table {CTBNAME}")
|
tdSql.execute(f"drop table {CTBNAME}")
|
||||||
tdSql.query(f"select max({INT_COL}), max({BINT_COL}), min({INT_COL}) from {DBNAME}.{STBNAME} interval(6m,10s) sliding(6m)")
|
tdSql.query(f"select max({INT_COL}), max({BINT_COL}), min({INT_COL}) from {DBNAME}.{STBNAME} interval(6m,10s) sliding(6m)")
|
||||||
tdSql.checkData(0, 0, self.rows - 1)
|
tdSql.checkData(0, 0, self.rows - 1)
|
||||||
tdSql.checkData(0, 1, (self.rows - 1) * 2 )
|
tdSql.checkData(0, 1, (self.rows - 1) * 2 )
|
||||||
tdSql.checkData(tdSql.queryRows - 1, 2, 0)
|
tdSql.checkData(tdSql.queryRows - 1, 2, 0)
|
||||||
|
|
||||||
tdLog.printNoPrefix("==========step1.6 : drop stable")
|
tdLog.printNoPrefix("==========step1.7 : drop stable")
|
||||||
tdSql.execute(f"drop table {STBNAME}")
|
tdSql.execute(f"drop table {STBNAME}")
|
||||||
tdSql.error(f"select * from {DBNAME}.{STBNAME}")
|
tdSql.error(f"select * from {DBNAME}.{STBNAME}")
|
||||||
|
|
||||||
|
|
|
@ -16,6 +16,7 @@ class TDTestCase:
|
||||||
'2020-5-1 00:00:00.001002001'
|
'2020-5-1 00:00:00.001002001'
|
||||||
|
|
||||||
]
|
]
|
||||||
|
self.rest_tag = str(conn).lower().split('.')[0].replace("<taos","")
|
||||||
self.db_param_precision = ['ms','us','ns']
|
self.db_param_precision = ['ms','us','ns']
|
||||||
self.time_unit = ['1w','1d','1h','1m','1s','1a','1u','1b']
|
self.time_unit = ['1w','1d','1h','1m','1s','1a','1u','1b']
|
||||||
self.error_unit = ['2w','2d','2h','2m','2s','2a','2u','1c','#1']
|
self.error_unit = ['2w','2d','2h','2m','2s','2a','2u','1c','#1']
|
||||||
|
@ -101,6 +102,7 @@ class TDTestCase:
|
||||||
for i in range(len(self.ts_str)):
|
for i in range(len(self.ts_str)):
|
||||||
tdSql.checkEqual(tdSql.queryResult[i][0],int(((date_time[i])-self.subtractor*1000000)))
|
tdSql.checkEqual(tdSql.queryResult[i][0],int(((date_time[i])-self.subtractor*1000000)))
|
||||||
elif precision.lower() == 'ns':
|
elif precision.lower() == 'ns':
|
||||||
|
if self.rest_tag != 'rest':
|
||||||
self.check_tb_type(unit,tb_type)
|
self.check_tb_type(unit,tb_type)
|
||||||
tdSql.checkRows(len(self.ts_str))
|
tdSql.checkRows(len(self.ts_str))
|
||||||
if unit.lower() == '1w':
|
if unit.lower() == '1w':
|
||||||
|
@ -162,10 +164,35 @@ class TDTestCase:
|
||||||
date_time = self.get_time.time_transform(self.ts_str,precision)
|
date_time = self.get_time.time_transform(self.ts_str,precision)
|
||||||
self.data_check(date_time,precision,'ctb')
|
self.data_check(date_time,precision,'ctb')
|
||||||
self.data_check(date_time,precision,'stb')
|
self.data_check(date_time,precision,'stb')
|
||||||
def run(self): # sourcery skip: extract-duplicate-method
|
def function_without_param(self):
|
||||||
|
for precision in self.db_param_precision:
|
||||||
|
tdSql.execute(f'drop database if exists {self.dbname}')
|
||||||
|
tdSql.execute(f'create database {self.dbname} precision "{precision}"')
|
||||||
|
tdSql.execute(f'use {self.dbname}')
|
||||||
|
tdSql.execute(f'create table {self.stbname} (ts timestamp,c0 int) tags(t0 int)')
|
||||||
|
tdSql.execute(f'create table {self.ctbname} using {self.stbname} tags(1)')
|
||||||
|
for ts in self.ts_str:
|
||||||
|
tdSql.execute(f'insert into {self.ctbname} values("{ts}",1)')
|
||||||
|
date_time = self.get_time.time_transform(self.ts_str,precision)
|
||||||
|
tdSql.query(f'select timediff(ts,{self.subtractor}) from {self.ctbname}')
|
||||||
|
if precision.lower() == 'ms':
|
||||||
|
for i in range(len(self.ts_str)):
|
||||||
|
tdSql.checkEqual(tdSql.queryResult[i][0],int(((date_time[i])-self.subtractor*1000)))
|
||||||
|
elif precision.lower() == 'us':
|
||||||
|
for i in range(len(self.ts_str)):
|
||||||
|
tdSql.checkEqual(tdSql.queryResult[i][0],int(((date_time[i])-self.subtractor*1000000)))
|
||||||
|
elif precision.lower() == 'ns':
|
||||||
|
for i in range(len(self.ts_str)):
|
||||||
|
tdSql.checkEqual(tdSql.queryResult[i][0],int(((date_time[i])-self.subtractor*1000000000)))
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
def run(self): # sourcery skip: extract-duplicate-method
|
||||||
self.function_check_ntb()
|
self.function_check_ntb()
|
||||||
self.function_check_stb()
|
self.function_check_stb()
|
||||||
|
self.function_without_param()
|
||||||
|
|
||||||
def stop(self):
|
def stop(self):
|
||||||
tdSql.close()
|
tdSql.close()
|
||||||
|
|
|
@ -1,12 +1,11 @@
|
||||||
import taos
|
import taos
|
||||||
import sys
|
import sys
|
||||||
import datetime
|
import numpy as np
|
||||||
import inspect
|
|
||||||
|
|
||||||
from util.log import *
|
from util.log import *
|
||||||
from util.sql import *
|
from util.sql import *
|
||||||
from util.cases import *
|
from util.cases import *
|
||||||
|
from util.sqlset import TDSetSql
|
||||||
|
from util.common import *
|
||||||
class TDTestCase:
|
class TDTestCase:
|
||||||
# updatecfgDict = {'debugFlag': 143 ,"cDebugFlag":143,"uDebugFlag":143 ,"rpcDebugFlag":143 , "tmrDebugFlag":143 ,
|
# updatecfgDict = {'debugFlag': 143 ,"cDebugFlag":143,"uDebugFlag":143 ,"rpcDebugFlag":143 , "tmrDebugFlag":143 ,
|
||||||
# "jniDebugFlag":143 ,"simDebugFlag":143,"dDebugFlag":143, "dDebugFlag":143,"vDebugFlag":143,"mDebugFlag":143,"qDebugFlag":143,
|
# "jniDebugFlag":143 ,"simDebugFlag":143,"dDebugFlag":143, "dDebugFlag":143,"vDebugFlag":143,"mDebugFlag":143,"qDebugFlag":143,
|
||||||
|
@ -14,6 +13,51 @@ class TDTestCase:
|
||||||
def init(self, conn, logSql):
|
def init(self, conn, logSql):
|
||||||
tdLog.debug(f"start to excute {__file__}")
|
tdLog.debug(f"start to excute {__file__}")
|
||||||
tdSql.init(conn.cursor(), False)
|
tdSql.init(conn.cursor(), False)
|
||||||
|
self.setsql = TDSetSql()
|
||||||
|
self.column_dict = {
|
||||||
|
'ts':'timestamp',
|
||||||
|
'col1': 'tinyint',
|
||||||
|
'col2': 'smallint',
|
||||||
|
'col3': 'int',
|
||||||
|
'col4': 'bigint',
|
||||||
|
'col5': 'tinyint unsigned',
|
||||||
|
'col6': 'smallint unsigned',
|
||||||
|
'col7': 'int unsigned',
|
||||||
|
'col8': 'bigint unsigned',
|
||||||
|
|
||||||
|
}
|
||||||
|
self.dbname = tdCom.getLongName(3,"letters")
|
||||||
|
self.row_num = 10
|
||||||
|
self.ts = 1537146000000
|
||||||
|
def insert_data(self,column_dict,tbname,row_num):
|
||||||
|
insert_sql = self.setsql.set_insertsql(column_dict,tbname)
|
||||||
|
for i in range(row_num):
|
||||||
|
insert_list = []
|
||||||
|
self.setsql.insert_values(column_dict,i,insert_sql,insert_list,self.ts)
|
||||||
|
|
||||||
|
def avg_check_unsigned(self):
|
||||||
|
stbname = f'{self.dbname}.{tdCom.getLongName(5,"letters")}'
|
||||||
|
tag_dict = {
|
||||||
|
't0':'int'
|
||||||
|
}
|
||||||
|
tag_values = [
|
||||||
|
f'1'
|
||||||
|
]
|
||||||
|
tdSql.execute(f"create database if not exists {self.dbname}")
|
||||||
|
tdSql.execute(self.setsql.set_create_stable_sql(stbname,self.column_dict,tag_dict))
|
||||||
|
tdSql.execute(f"create table {stbname}_1 using {stbname} tags({tag_values[0]})")
|
||||||
|
self.insert_data(self.column_dict,f'{stbname}_1',self.row_num)
|
||||||
|
for col in self.column_dict.keys():
|
||||||
|
col_val_list = []
|
||||||
|
if col.lower() != 'ts':
|
||||||
|
tdSql.query(f'select {col} from {stbname}_1')
|
||||||
|
sum_val = 0
|
||||||
|
for col_val in tdSql.queryResult:
|
||||||
|
col_val_list.append(col_val[0])
|
||||||
|
col_avg = np.mean(col_val_list)
|
||||||
|
tdSql.query(f'select avg({col}) from {stbname}_1')
|
||||||
|
tdSql.checkEqual(col_avg,tdSql.queryResult[0][0])
|
||||||
|
tdSql.execute(f'drop database {self.dbname}')
|
||||||
|
|
||||||
def prepare_datas(self, dbname="db"):
|
def prepare_datas(self, dbname="db"):
|
||||||
tdSql.execute(
|
tdSql.execute(
|
||||||
|
@ -412,6 +456,7 @@ class TDTestCase:
|
||||||
tdLog.printNoPrefix("==========step6: avg filter query ============")
|
tdLog.printNoPrefix("==========step6: avg filter query ============")
|
||||||
|
|
||||||
self.avg_func_filter()
|
self.avg_func_filter()
|
||||||
|
self.avg_check_unsigned()
|
||||||
|
|
||||||
def stop(self):
|
def stop(self):
|
||||||
tdSql.close()
|
tdSql.close()
|
||||||
|
|
|
@ -298,14 +298,14 @@ class TDTestCase:
|
||||||
|
|
||||||
self.explain_check()
|
self.explain_check()
|
||||||
|
|
||||||
# tdSql.query(f"explain verbose true select {INT_COL} from {dbname}.ct1")
|
tdSql.query(f"explain verbose true select {INT_COL} from {dbname}.ct1")
|
||||||
# tdSql.query(f"explain verbose true select 1 from {dbname}.ct2")
|
tdSql.query(f"explain verbose true select 1 from {dbname}.ct2")
|
||||||
# tdSql.query(f"explain verbose true select cast(ceil({DOUBLE_COL}) as bigint) from {dbname}.ct4 group by {DOUBLE_COL}")
|
tdSql.query(f"explain verbose true select cast(ceil({DOUBLE_COL}) as bigint) from {dbname}.ct4 group by {DOUBLE_COL}")
|
||||||
# tdSql.query(f"explain verbose true select count({SINT_COL}) from {dbname}.ct4 group by {BOOL_COL} having count({SINT_COL}) > 0")
|
tdSql.query(f"explain verbose true select count({SINT_COL}) from {dbname}.ct4 group by {BOOL_COL} having count({SINT_COL}) > 0")
|
||||||
# tdSql.query(f"explain verbose true select ct2.{SINT_COL} from {dbname}.ct4 ct4 join {dbname}.ct2 ct2 on ct4.ts=ct2.ts")
|
tdSql.query(f"explain verbose true select ct2.{SINT_COL} from {dbname}.ct4 ct4 join {dbname}.ct2 ct2 on ct4.ts=ct2.ts")
|
||||||
# tdSql.query(f"explain verbose true select {INT_COL} from {dbname}.stb1 where {INT_COL} is not null and {INT_COL} in (0, 1, 2) or {INT_COL} between 2 and 100 ")
|
tdSql.query(f"explain verbose true select {INT_COL} from {dbname}.stb1 where {INT_COL} is not null and {INT_COL} in (0, 1, 2) or {INT_COL} between 2 and 100 ")
|
||||||
|
|
||||||
# self.explain_check()
|
self.explain_check()
|
||||||
|
|
||||||
tdSql.query(f"explain verbose false select {INT_COL} from {dbname}.ct1")
|
tdSql.query(f"explain verbose false select {INT_COL} from {dbname}.ct1")
|
||||||
tdSql.query(f"explain verbose false select 1 from {dbname}.ct2")
|
tdSql.query(f"explain verbose false select 1 from {dbname}.ct2")
|
||||||
|
@ -326,14 +326,14 @@ class TDTestCase:
|
||||||
|
|
||||||
self.explain_check()
|
self.explain_check()
|
||||||
|
|
||||||
# tdSql.query(f"explain ratio {ratio} verbose true select {INT_COL} from {dbname}.ct1")
|
tdSql.query(f"explain ratio {ratio} verbose true select {INT_COL} from {dbname}.ct1")
|
||||||
# tdSql.query(f"explain ratio {ratio} verbose true select 1 from {dbname}.ct2")
|
tdSql.query(f"explain ratio {ratio} verbose true select 1 from {dbname}.ct2")
|
||||||
# tdSql.query(f"explain ratio {ratio} verbose true select cast(ceil({DOUBLE_COL}) as bigint) from {dbname}.ct4 group by {DOUBLE_COL}")
|
tdSql.query(f"explain ratio {ratio} verbose true select cast(ceil({DOUBLE_COL}) as bigint) from {dbname}.ct4 group by {DOUBLE_COL}")
|
||||||
# tdSql.query(f"explain ratio {ratio} verbose true select count({SINT_COL}) from {dbname}.ct4 group by {BOOL_COL} having count({SINT_COL}) > 0")
|
tdSql.query(f"explain ratio {ratio} verbose true select count({SINT_COL}) from {dbname}.ct4 group by {BOOL_COL} having count({SINT_COL}) > 0")
|
||||||
# tdSql.query(f"explain ratio {ratio} verbose true select ct2.{SINT_COL} from {dbname}.ct4 ct4 join {dbname}.ct2 ct2 on ct4.ts=ct2.ts")
|
tdSql.query(f"explain ratio {ratio} verbose true select ct2.{SINT_COL} from {dbname}.ct4 ct4 join {dbname}.ct2 ct2 on ct4.ts=ct2.ts")
|
||||||
# tdSql.query(f"explain ratio {ratio} verbose true select {INT_COL} from {dbname}.stb1 where {INT_COL} is not null and {INT_COL} in (0, 1, 2) or {INT_COL} between 2 and 100 ")
|
tdSql.query(f"explain ratio {ratio} verbose true select {INT_COL} from {dbname}.stb1 where {INT_COL} is not null and {INT_COL} in (0, 1, 2) or {INT_COL} between 2 and 100 ")
|
||||||
|
|
||||||
# self.explain_check()
|
self.explain_check()
|
||||||
|
|
||||||
tdSql.query(f"explain ratio {ratio} verbose false select {INT_COL} from {dbname}.ct1")
|
tdSql.query(f"explain ratio {ratio} verbose false select {INT_COL} from {dbname}.ct1")
|
||||||
tdSql.query(f"explain ratio {ratio} verbose false select 1 from {dbname}.ct2")
|
tdSql.query(f"explain ratio {ratio} verbose false select 1 from {dbname}.ct2")
|
||||||
|
@ -353,14 +353,14 @@ class TDTestCase:
|
||||||
|
|
||||||
self.explain_check()
|
self.explain_check()
|
||||||
|
|
||||||
# tdSql.query(f"explain analyze verbose true select {INT_COL} from {dbname}.ct1")
|
tdSql.query(f"explain analyze verbose true select {INT_COL} from {dbname}.ct1")
|
||||||
# tdSql.query(f"explain analyze verbose true select 1 from {dbname}.ct2")
|
tdSql.query(f"explain analyze verbose true select 1 from {dbname}.ct2")
|
||||||
# tdSql.query(f"explain analyze verbose true select cast(ceil({DOUBLE_COL}) as bigint) from {dbname}.ct4 group by {DOUBLE_COL}")
|
tdSql.query(f"explain analyze verbose true select cast(ceil({DOUBLE_COL}) as bigint) from {dbname}.ct4 group by {DOUBLE_COL}")
|
||||||
# tdSql.query(f"explain analyze verbose true select count({SINT_COL}) from {dbname}.ct4 group by {BOOL_COL} having count({SINT_COL}) > 0")
|
tdSql.query(f"explain analyze verbose true select count({SINT_COL}) from {dbname}.ct4 group by {BOOL_COL} having count({SINT_COL}) > 0")
|
||||||
# tdSql.query(f"explain analyze verbose true select ct2.{SINT_COL} from {dbname}.ct4 ct4 join {dbname}.ct2 ct2 on ct4.ts=ct2.ts")
|
tdSql.query(f"explain analyze verbose true select ct2.{SINT_COL} from {dbname}.ct4 ct4 join {dbname}.ct2 ct2 on ct4.ts=ct2.ts")
|
||||||
# tdSql.query(f"explain analyze verbose true select {INT_COL} from {dbname}.stb1 where {INT_COL} is not null and {INT_COL} in (0, 1, 2) or {INT_COL} between 2 and 100 ")
|
tdSql.query(f"explain analyze verbose true select {INT_COL} from {dbname}.stb1 where {INT_COL} is not null and {INT_COL} in (0, 1, 2) or {INT_COL} between 2 and 100 ")
|
||||||
|
|
||||||
# self.explain_check()
|
self.explain_check()
|
||||||
|
|
||||||
tdSql.query(f"explain analyze verbose false select {INT_COL} from {dbname}.ct1")
|
tdSql.query(f"explain analyze verbose false select {INT_COL} from {dbname}.ct1")
|
||||||
tdSql.query(f"explain analyze verbose false select 1 from {dbname}.ct2")
|
tdSql.query(f"explain analyze verbose false select 1 from {dbname}.ct2")
|
||||||
|
@ -381,14 +381,14 @@ class TDTestCase:
|
||||||
|
|
||||||
self.explain_check()
|
self.explain_check()
|
||||||
|
|
||||||
# tdSql.query(f"explain analyze ratio {ratio} verbose true select {INT_COL} from {dbname}.ct1")
|
tdSql.query(f"explain analyze ratio {ratio} verbose true select {INT_COL} from {dbname}.ct1")
|
||||||
# tdSql.query(f"explain analyze ratio {ratio} verbose true select 1 from {dbname}.ct2")
|
tdSql.query(f"explain analyze ratio {ratio} verbose true select 1 from {dbname}.ct2")
|
||||||
# tdSql.query(f"explain analyze ratio {ratio} verbose true select cast(ceil({DOUBLE_COL}) as bigint) from {dbname}.ct4 group by {DOUBLE_COL}")
|
tdSql.query(f"explain analyze ratio {ratio} verbose true select cast(ceil({DOUBLE_COL}) as bigint) from {dbname}.ct4 group by {DOUBLE_COL}")
|
||||||
# tdSql.query(f"explain analyze ratio {ratio} verbose true select count({SINT_COL}) from {dbname}.ct4 group by {BOOL_COL} having count({SINT_COL}) > 0")
|
tdSql.query(f"explain analyze ratio {ratio} verbose true select count({SINT_COL}) from {dbname}.ct4 group by {BOOL_COL} having count({SINT_COL}) > 0")
|
||||||
# tdSql.query(f"explain analyze ratio {ratio} verbose true select ct2.{SINT_COL} from {dbname}.ct4 ct4 join {dbname}.ct2 ct2 on ct4.ts=ct2.ts")
|
tdSql.query(f"explain analyze ratio {ratio} verbose true select ct2.{SINT_COL} from {dbname}.ct4 ct4 join {dbname}.ct2 ct2 on ct4.ts=ct2.ts")
|
||||||
# tdSql.query(f"explain analyze ratio {ratio} verbose true select {INT_COL} from {dbname}.stb1 where {INT_COL} is not null and {INT_COL} in (0, 1, 2) or {INT_COL} between 2 and 100 ")
|
tdSql.query(f"explain analyze ratio {ratio} verbose true select {INT_COL} from {dbname}.stb1 where {INT_COL} is not null and {INT_COL} in (0, 1, 2) or {INT_COL} between 2 and 100 ")
|
||||||
|
|
||||||
# self.explain_check()
|
self.explain_check()
|
||||||
|
|
||||||
tdSql.query(f"explain analyze ratio {ratio} verbose false select {INT_COL} from {dbname}.ct1")
|
tdSql.query(f"explain analyze ratio {ratio} verbose false select {INT_COL} from {dbname}.ct1")
|
||||||
tdSql.query(f"explain analyze ratio {ratio} verbose false select 1 from {dbname}.ct2")
|
tdSql.query(f"explain analyze ratio {ratio} verbose false select 1 from {dbname}.ct2")
|
||||||
|
|
|
@ -29,6 +29,8 @@ DBNAME = "db"
|
||||||
|
|
||||||
class TDTestCase:
|
class TDTestCase:
|
||||||
|
|
||||||
|
updatecfgDict = {"maxTablesPerVnode":2 ,"minTablesPerVnode":2,"tableIncStepPerVnode":2 }
|
||||||
|
|
||||||
def init(self, conn, logSql):
|
def init(self, conn, logSql):
|
||||||
tdLog.debug(f"start to excute {__file__}")
|
tdLog.debug(f"start to excute {__file__}")
|
||||||
tdSql.init(conn.cursor())
|
tdSql.init(conn.cursor())
|
||||||
|
|
|
@ -11,11 +11,15 @@ class TDTestCase:
|
||||||
|
|
||||||
def init(self, conn, logSql):
|
def init(self, conn, logSql):
|
||||||
tdLog.debug(f"start to excute {__file__}")
|
tdLog.debug(f"start to excute {__file__}")
|
||||||
tdSql.init(conn.cursor())
|
#tdSql.init(conn.cursor())
|
||||||
|
tdSql.init(conn.cursor(), logSql) # output sql.txt file
|
||||||
|
|
||||||
def run(self):
|
def run(self):
|
||||||
dbname = "db"
|
dbname = "db"
|
||||||
tbname = "tb"
|
tbname = "tb"
|
||||||
|
stbname = "stb"
|
||||||
|
ctbname1 = "ctb1"
|
||||||
|
ctbname2 = "ctb2"
|
||||||
|
|
||||||
tdSql.prepare()
|
tdSql.prepare()
|
||||||
|
|
||||||
|
@ -33,6 +37,8 @@ class TDTestCase:
|
||||||
tdSql.execute(f"insert into {dbname}.{tbname} values ('2020-02-01 00:00:10', 10, 10, 10, 10, 10.0, 10.0, true, 'varchar', 'nchar')")
|
tdSql.execute(f"insert into {dbname}.{tbname} values ('2020-02-01 00:00:10', 10, 10, 10, 10, 10.0, 10.0, true, 'varchar', 'nchar')")
|
||||||
tdSql.execute(f"insert into {dbname}.{tbname} values ('2020-02-01 00:00:15', 15, 15, 15, 15, 15.0, 15.0, true, 'varchar', 'nchar')")
|
tdSql.execute(f"insert into {dbname}.{tbname} values ('2020-02-01 00:00:15', 15, 15, 15, 15, 15.0, 15.0, true, 'varchar', 'nchar')")
|
||||||
|
|
||||||
|
tdSql.execute(f"insert into {dbname}.{tbname} (ts) values (now)")
|
||||||
|
|
||||||
tdLog.printNoPrefix("==========step3:fill null")
|
tdLog.printNoPrefix("==========step3:fill null")
|
||||||
|
|
||||||
## {. . .}
|
## {. . .}
|
||||||
|
@ -240,7 +246,7 @@ class TDTestCase:
|
||||||
|
|
||||||
## {. . .}
|
## {. . .}
|
||||||
tdSql.query(f"select interp(c0) from {dbname}.{tbname} range('2020-02-01 00:00:04', '2020-02-01 00:00:16') every(1s) fill(next)")
|
tdSql.query(f"select interp(c0) from {dbname}.{tbname} range('2020-02-01 00:00:04', '2020-02-01 00:00:16') every(1s) fill(next)")
|
||||||
tdSql.checkRows(12)
|
tdSql.checkRows(13)
|
||||||
tdSql.checkData(0, 0, 5)
|
tdSql.checkData(0, 0, 5)
|
||||||
tdSql.checkData(1, 0, 5)
|
tdSql.checkData(1, 0, 5)
|
||||||
tdSql.checkData(2, 0, 10)
|
tdSql.checkData(2, 0, 10)
|
||||||
|
@ -290,21 +296,21 @@ class TDTestCase:
|
||||||
|
|
||||||
## ..{.}
|
## ..{.}
|
||||||
tdSql.query(f"select interp(c0) from {dbname}.{tbname} range('2020-02-01 00:00:13', '2020-02-01 00:00:17') every(1s) fill(next)")
|
tdSql.query(f"select interp(c0) from {dbname}.{tbname} range('2020-02-01 00:00:13', '2020-02-01 00:00:17') every(1s) fill(next)")
|
||||||
tdSql.checkRows(3)
|
tdSql.checkRows(5)
|
||||||
tdSql.checkData(0, 0, 15)
|
tdSql.checkData(0, 0, 15)
|
||||||
tdSql.checkData(1, 0, 15)
|
tdSql.checkData(1, 0, 15)
|
||||||
tdSql.checkData(2, 0, 15)
|
tdSql.checkData(2, 0, 15)
|
||||||
|
|
||||||
## ... {}
|
## ... {}
|
||||||
tdSql.query(f"select interp(c0) from {dbname}.{tbname} range('2020-02-01 00:00:16', '2020-02-01 00:00:19') every(1s) fill(next)")
|
tdSql.query(f"select interp(c0) from {dbname}.{tbname} range('2020-02-01 00:00:16', '2020-02-01 00:00:19') every(1s) fill(next)")
|
||||||
tdSql.checkRows(0)
|
tdSql.checkRows(4)
|
||||||
|
|
||||||
|
|
||||||
tdLog.printNoPrefix("==========step7:fill linear")
|
tdLog.printNoPrefix("==========step7:fill linear")
|
||||||
|
|
||||||
## {. . .}
|
## {. . .}
|
||||||
tdSql.query(f"select interp(c0) from {dbname}.{tbname} range('2020-02-01 00:00:04', '2020-02-01 00:00:16') every(1s) fill(linear)")
|
tdSql.query(f"select interp(c0) from {dbname}.{tbname} range('2020-02-01 00:00:04', '2020-02-01 00:00:16') every(1s) fill(linear)")
|
||||||
tdSql.checkRows(11)
|
tdSql.checkRows(12)
|
||||||
tdSql.checkData(0, 0, 5)
|
tdSql.checkData(0, 0, 5)
|
||||||
tdSql.checkData(1, 0, 6)
|
tdSql.checkData(1, 0, 6)
|
||||||
tdSql.checkData(2, 0, 7)
|
tdSql.checkData(2, 0, 7)
|
||||||
|
@ -347,7 +353,7 @@ class TDTestCase:
|
||||||
|
|
||||||
## ..{.}
|
## ..{.}
|
||||||
tdSql.query(f"select interp(c0) from {dbname}.{tbname} range('2020-02-01 00:00:13', '2020-02-01 00:00:17') every(1s) fill(linear)")
|
tdSql.query(f"select interp(c0) from {dbname}.{tbname} range('2020-02-01 00:00:13', '2020-02-01 00:00:17') every(1s) fill(linear)")
|
||||||
tdSql.checkRows(3)
|
tdSql.checkRows(5)
|
||||||
tdSql.checkData(0, 0, 13)
|
tdSql.checkData(0, 0, 13)
|
||||||
tdSql.checkData(1, 0, 14)
|
tdSql.checkData(1, 0, 14)
|
||||||
tdSql.checkData(2, 0, 15)
|
tdSql.checkData(2, 0, 15)
|
||||||
|
@ -505,7 +511,7 @@ class TDTestCase:
|
||||||
tdSql.checkData(8, 0, '2020-02-01 00:00:12.000')
|
tdSql.checkData(8, 0, '2020-02-01 00:00:12.000')
|
||||||
|
|
||||||
tdSql.query(f"select _irowts,interp(c0) from {dbname}.{tbname} range('2020-02-01 00:00:04', '2020-02-01 00:00:16') every(1s) fill(next)")
|
tdSql.query(f"select _irowts,interp(c0) from {dbname}.{tbname} range('2020-02-01 00:00:04', '2020-02-01 00:00:16') every(1s) fill(next)")
|
||||||
tdSql.checkRows(12)
|
tdSql.checkRows(13)
|
||||||
tdSql.checkCols(2)
|
tdSql.checkCols(2)
|
||||||
|
|
||||||
tdSql.checkData(0, 0, '2020-02-01 00:00:04.000')
|
tdSql.checkData(0, 0, '2020-02-01 00:00:04.000')
|
||||||
|
@ -548,7 +554,7 @@ class TDTestCase:
|
||||||
tdSql.checkData(8, 0, '2020-02-01 00:00:12.000')
|
tdSql.checkData(8, 0, '2020-02-01 00:00:12.000')
|
||||||
|
|
||||||
tdSql.query(f"select _irowts,interp(c0) from {dbname}.{tbname} range('2020-02-01 00:00:04', '2020-02-01 00:00:16') every(1s) fill(linear)")
|
tdSql.query(f"select _irowts,interp(c0) from {dbname}.{tbname} range('2020-02-01 00:00:04', '2020-02-01 00:00:16') every(1s) fill(linear)")
|
||||||
tdSql.checkRows(11)
|
tdSql.checkRows(12)
|
||||||
tdSql.checkCols(2)
|
tdSql.checkCols(2)
|
||||||
|
|
||||||
tdSql.checkData(0, 0, '2020-02-01 00:00:05.000')
|
tdSql.checkData(0, 0, '2020-02-01 00:00:05.000')
|
||||||
|
@ -576,7 +582,7 @@ class TDTestCase:
|
||||||
|
|
||||||
# multiple _irowts
|
# multiple _irowts
|
||||||
tdSql.query(f"select interp(c0),_irowts from {dbname}.{tbname} range('2020-02-01 00:00:04', '2020-02-01 00:00:16') every(1s) fill(linear)")
|
tdSql.query(f"select interp(c0),_irowts from {dbname}.{tbname} range('2020-02-01 00:00:04', '2020-02-01 00:00:16') every(1s) fill(linear)")
|
||||||
tdSql.checkRows(11)
|
tdSql.checkRows(12)
|
||||||
tdSql.checkCols(2)
|
tdSql.checkCols(2)
|
||||||
|
|
||||||
tdSql.checkData(0, 1, '2020-02-01 00:00:05.000')
|
tdSql.checkData(0, 1, '2020-02-01 00:00:05.000')
|
||||||
|
@ -592,7 +598,7 @@ class TDTestCase:
|
||||||
tdSql.checkData(10, 1, '2020-02-01 00:00:15.000')
|
tdSql.checkData(10, 1, '2020-02-01 00:00:15.000')
|
||||||
|
|
||||||
tdSql.query(f"select _irowts, interp(c0), interp(c0), _irowts from {dbname}.{tbname} range('2020-02-01 00:00:04', '2020-02-01 00:00:16') every(1s) fill(linear)")
|
tdSql.query(f"select _irowts, interp(c0), interp(c0), _irowts from {dbname}.{tbname} range('2020-02-01 00:00:04', '2020-02-01 00:00:16') every(1s) fill(linear)")
|
||||||
tdSql.checkRows(11)
|
tdSql.checkRows(12)
|
||||||
tdSql.checkCols(4)
|
tdSql.checkCols(4)
|
||||||
|
|
||||||
cols = (0, 3)
|
cols = (0, 3)
|
||||||
|
@ -621,6 +627,32 @@ class TDTestCase:
|
||||||
tdSql.execute(f"insert into {dbname}.{tbname} values ('2020-02-01 00:00:05', 5, 5, 5, 5, 5.0, 5.0, true, 'varchar', 'nchar')")
|
tdSql.execute(f"insert into {dbname}.{tbname} values ('2020-02-01 00:00:05', 5, 5, 5, 5, 5.0, 5.0, true, 'varchar', 'nchar')")
|
||||||
tdSql.execute(f"insert into {dbname}.{tbname} values ('2020-02-11 00:00:05', 15, 15, 15, 15, 15.0, 15.0, true, 'varchar', 'nchar')")
|
tdSql.execute(f"insert into {dbname}.{tbname} values ('2020-02-11 00:00:05', 15, 15, 15, 15, 15.0, 15.0, true, 'varchar', 'nchar')")
|
||||||
|
|
||||||
|
tdSql.execute(
|
||||||
|
f'''create stable if not exists {dbname}.{stbname}
|
||||||
|
(ts timestamp, c0 tinyint, c1 smallint, c2 int, c3 bigint, c4 double, c5 float, c6 bool, c7 varchar(10), c8 nchar(10)) tags(t1 int)
|
||||||
|
'''
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
tdSql.execute(
|
||||||
|
f'''create table if not exists {dbname}.{ctbname1} using {dbname}.{stbname} tags(1)
|
||||||
|
'''
|
||||||
|
)
|
||||||
|
|
||||||
|
tdSql.execute(
|
||||||
|
f'''create table if not exists {dbname}.{ctbname2} using {dbname}.{stbname} tags(1)
|
||||||
|
'''
|
||||||
|
)
|
||||||
|
|
||||||
|
tdSql.execute(f"insert into {dbname}.{ctbname1} values ('2020-02-01 00:00:05', 5, 5, 5, 5, 5.0, 5.0, true, 'varchar', 'nchar')")
|
||||||
|
tdSql.execute(f"insert into {dbname}.{ctbname1} values ('2020-02-01 00:00:10', 10, 10, 10, 10, 10.0, 10.0, true, 'varchar', 'nchar')")
|
||||||
|
tdSql.execute(f"insert into {dbname}.{ctbname1} values ('2020-02-01 00:00:15', 15, 15, 15, 15, 15.0, 15.0, true, 'varchar', 'nchar')")
|
||||||
|
|
||||||
|
tdSql.execute(f"insert into {dbname}.{ctbname2} values ('2020-02-02 00:00:05', 5, 5, 5, 5, 5.0, 5.0, true, 'varchar', 'nchar')")
|
||||||
|
tdSql.execute(f"insert into {dbname}.{ctbname2} values ('2020-02-02 00:00:10', 10, 10, 10, 10, 10.0, 10.0, true, 'varchar', 'nchar')")
|
||||||
|
tdSql.execute(f"insert into {dbname}.{ctbname2} values ('2020-02-02 00:00:15', 15, 15, 15, 15, 15.0, 15.0, true, 'varchar', 'nchar')")
|
||||||
|
|
||||||
|
|
||||||
tdSql.execute(f"flush database {dbname}");
|
tdSql.execute(f"flush database {dbname}");
|
||||||
|
|
||||||
# test fill null
|
# test fill null
|
||||||
|
@ -851,6 +883,10 @@ class TDTestCase:
|
||||||
tdSql.checkRows(3)
|
tdSql.checkRows(3)
|
||||||
tdSql.checkCols(4)
|
tdSql.checkCols(4)
|
||||||
|
|
||||||
|
tdSql.query(f"select interp(c0),interp(c1),interp(c2),interp(c3),interp(c4),interp(c5) from {dbname}.{tbname} range('2020-02-09 00:00:05', '2020-02-13 00:00:05') every(1d) fill(linear)")
|
||||||
|
tdSql.checkRows(3)
|
||||||
|
tdSql.checkCols(6)
|
||||||
|
|
||||||
for i in range (tdSql.queryCols):
|
for i in range (tdSql.queryCols):
|
||||||
tdSql.checkData(0, i, 13)
|
tdSql.checkData(0, i, 13)
|
||||||
|
|
||||||
|
@ -877,6 +913,21 @@ class TDTestCase:
|
||||||
tdSql.error(f"select interp('abcd') from {dbname}.{tbname} range('2020-02-10 00:00:05', '2020-02-15 00:00:05') every(1d) fill(null)")
|
tdSql.error(f"select interp('abcd') from {dbname}.{tbname} range('2020-02-10 00:00:05', '2020-02-15 00:00:05') every(1d) fill(null)")
|
||||||
tdSql.error(f"select interp('中文字符') from {dbname}.{tbname} range('2020-02-10 00:00:05', '2020-02-15 00:00:05') every(1d) fill(null)")
|
tdSql.error(f"select interp('中文字符') from {dbname}.{tbname} range('2020-02-10 00:00:05', '2020-02-15 00:00:05') every(1d) fill(null)")
|
||||||
|
|
||||||
|
tdLog.printNoPrefix("==========step12:stable cases")
|
||||||
|
|
||||||
|
#tdSql.query(f"select interp(c0) from {dbname}.{stbname} range('2020-02-01 00:00:04', '2020-02-01 00:00:16') every(1s) fill(null)")
|
||||||
|
#tdSql.checkRows(13)
|
||||||
|
|
||||||
|
#tdSql.query(f"select interp(c0) from {dbname}.{ctbname1} range('2020-02-01 00:00:04', '2020-02-01 00:00:16') every(1s) fill(null)")
|
||||||
|
#tdSql.checkRows(13)
|
||||||
|
|
||||||
|
#tdSql.query(f"select interp(c0) from {dbname}.{stbname} partition by tbname range('2020-02-01 00:00:04', '2020-02-02 00:00:16') every(1s) fill(null)")
|
||||||
|
#tdSql.checkRows(13)
|
||||||
|
|
||||||
|
#tdSql.query(f"select _irowts,interp(c0) from {dbname}.{stbname} partition by tbname range('2020-02-01 00:00:04', '2020-02-02 00:00:16') every(1h) fill(prev)")
|
||||||
|
#tdSql.query(f"select tbname,_irowts,interp(c0) from {dbname}.{stbname} partition by tbname range('2020-02-01 00:00:04', '2020-02-02 00:00:16') every(1h) fill(prev)")
|
||||||
|
|
||||||
|
|
||||||
def stop(self):
|
def stop(self):
|
||||||
tdSql.close()
|
tdSql.close()
|
||||||
tdLog.success(f"{__file__} successfully executed")
|
tdLog.success(f"{__file__} successfully executed")
|
||||||
|
|
|
@ -0,0 +1,79 @@
|
||||||
|
###################################################################
|
||||||
|
# Copyright (c) 2016 by TAOS Technologies, Inc.
|
||||||
|
# All rights reserved.
|
||||||
|
#
|
||||||
|
# This file is proprietary and confidential to TAOS Technologies.
|
||||||
|
# No part of this file may be reproduced, stored, transmitted,
|
||||||
|
# disclosed or used in any form or by any means other than as
|
||||||
|
# expressly provided by the written permission from Jianhui Tao
|
||||||
|
#
|
||||||
|
###################################################################
|
||||||
|
|
||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
|
||||||
|
import random
|
||||||
|
import string
|
||||||
|
import numpy as np
|
||||||
|
from util.log import *
|
||||||
|
from util.cases import *
|
||||||
|
from util.sql import *
|
||||||
|
from util.common import *
|
||||||
|
from util.sqlset import *
|
||||||
|
class TDTestCase:
|
||||||
|
def init(self, conn, logSql):
|
||||||
|
tdLog.debug("start to execute %s" % __file__)
|
||||||
|
tdSql.init(conn.cursor())
|
||||||
|
self.dbname = 'db_test'
|
||||||
|
self.setsql = TDSetSql()
|
||||||
|
self.ntbname = f'{self.dbname}.ntb'
|
||||||
|
self.row_num = 10
|
||||||
|
self.ts = 1537146000000
|
||||||
|
self.column_dict = {
|
||||||
|
'ts':'timestamp',
|
||||||
|
'col1': 'tinyint',
|
||||||
|
'col2': 'smallint',
|
||||||
|
'col3': 'int',
|
||||||
|
'col4': 'bigint',
|
||||||
|
'col5': 'tinyint unsigned',
|
||||||
|
'col6': 'smallint unsigned',
|
||||||
|
'col7': 'int unsigned',
|
||||||
|
'col8': 'bigint unsigned',
|
||||||
|
|
||||||
|
}
|
||||||
|
def insert_data(self,column_dict,tbname,row_num):
|
||||||
|
insert_sql = self.setsql.set_insertsql(column_dict,tbname)
|
||||||
|
for i in range(row_num):
|
||||||
|
insert_list = []
|
||||||
|
self.setsql.insert_values(column_dict,i,insert_sql,insert_list,self.ts)
|
||||||
|
def stddev_check(self):
|
||||||
|
stbname = f'{self.dbname}.{tdCom.getLongName(5,"letters")}'
|
||||||
|
tag_dict = {
|
||||||
|
't0':'int'
|
||||||
|
}
|
||||||
|
tag_values = [
|
||||||
|
f'1'
|
||||||
|
]
|
||||||
|
tdSql.execute(f"create database if not exists {self.dbname}")
|
||||||
|
tdSql.execute(self.setsql.set_create_stable_sql(stbname,self.column_dict,tag_dict))
|
||||||
|
tdSql.execute(f"create table {stbname}_1 using {stbname} tags({tag_values[0]})")
|
||||||
|
self.insert_data(self.column_dict,f'{stbname}_1',self.row_num)
|
||||||
|
for col in self.column_dict.keys():
|
||||||
|
col_val_list = []
|
||||||
|
if col.lower() != 'ts':
|
||||||
|
tdSql.query(f'select {col} from {stbname}_1')
|
||||||
|
for col_val in tdSql.queryResult:
|
||||||
|
col_val_list.append(col_val[0])
|
||||||
|
col_std = np.std(col_val_list)
|
||||||
|
tdSql.query(f'select stddev({col}) from {stbname}_1')
|
||||||
|
tdSql.checkEqual(col_std,tdSql.queryResult[0][0])
|
||||||
|
tdSql.execute(f'drop database {self.dbname}')
|
||||||
|
def run(self):
|
||||||
|
self.stddev_check()
|
||||||
|
|
||||||
|
|
||||||
|
def stop(self):
|
||||||
|
tdSql.close()
|
||||||
|
tdLog.success(f"{__file__} successfully executed")
|
||||||
|
|
||||||
|
tdCases.addLinux(__file__, TDTestCase())
|
||||||
|
tdCases.addWindows(__file__, TDTestCase())
|
|
@ -181,6 +181,7 @@ class TDTestCase:
|
||||||
self.data_check(date_time,precision,'ctb')
|
self.data_check(date_time,precision,'ctb')
|
||||||
self.data_check(date_time,precision,'stb')
|
self.data_check(date_time,precision,'stb')
|
||||||
|
|
||||||
|
|
||||||
def run(self):
|
def run(self):
|
||||||
self.function_check_ntb()
|
self.function_check_ntb()
|
||||||
self.function_check_stb()
|
self.function_check_stb()
|
||||||
|
|
|
@ -24,7 +24,7 @@ class TDTestCase:
|
||||||
tdSql.execute(f"create database if not exists {dbname} keep 3650 duration 1000 vgroups 5")
|
tdSql.execute(f"create database if not exists {dbname} keep 3650 duration 1000 vgroups 5")
|
||||||
tdSql.execute(
|
tdSql.execute(
|
||||||
f'''create table {dbname}.stb1
|
f'''create table {dbname}.stb1
|
||||||
(ts timestamp, c1 int, c2 bigint, c3 smallint, c4 tinyint, c5 float, c6 double, c7 bool, c8 binary(16),c9 nchar(32), c10 timestamp)
|
(ts timestamp, c1 int, c2 bigint, c3 smallint, c4 tinyint, c5 float, c6 double, c7 bool, c8 binary(16),c9 nchar(32), c10 timestamp,c11 int UNSIGNED, c12 bigint UNSIGNED, c13 smallint UNSIGNED, c14 tinyint UNSIGNED)
|
||||||
tags (t0 timestamp, t1 int, t2 bigint, t3 smallint, t4 tinyint, t5 float, t6 double, t7 bool, t8 binary(16),t9 nchar(32))
|
tags (t0 timestamp, t1 int, t2 bigint, t3 smallint, t4 tinyint, t5 float, t6 double, t7 bool, t8 binary(16),t9 nchar(32))
|
||||||
'''
|
'''
|
||||||
)
|
)
|
||||||
|
@ -35,12 +35,12 @@ class TDTestCase:
|
||||||
for j in range(self.row_nums):
|
for j in range(self.row_nums):
|
||||||
ts+=j*self.time_step
|
ts+=j*self.time_step
|
||||||
tdSql.execute(
|
tdSql.execute(
|
||||||
f"insert into {dbname}.ct{i+1} values({ts}, 1, 11111, 111, 1, 1.11, 11.11, 2, 'binary{j}', 'nchar{j}', now()+{1*j}a )"
|
f"insert into {dbname}.ct{i+1} values({ts}, 1, 11111, 111, 1, 1.11, 11.11, 2, 'binary{j}', 'nchar{j}', now()+{1*j}a, 1, 11111, 111, 1 )"
|
||||||
)
|
)
|
||||||
|
|
||||||
tdSql.execute(f"insert into {dbname}.ct1 values (now()-810d, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL ) ")
|
tdSql.execute(f"insert into {dbname}.ct1 values (now()-810d, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL ) ")
|
||||||
tdSql.execute(f"insert into {dbname}.ct1 values (now()-400d, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL ) ")
|
tdSql.execute(f"insert into {dbname}.ct1 values (now()-400d, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL ) ")
|
||||||
tdSql.execute(f"insert into {dbname}.ct1 values (now()+90d, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL ) ")
|
tdSql.execute(f"insert into {dbname}.ct1 values (now()+90d, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL , NULL, NULL, NULL, NULL ) ")
|
||||||
|
|
||||||
tdLog.info(" prepare data for distributed_aggregate done! ")
|
tdLog.info(" prepare data for distributed_aggregate done! ")
|
||||||
|
|
||||||
|
@ -48,7 +48,7 @@ class TDTestCase:
|
||||||
tdSql.query(f"desc {dbname}.stb1 ")
|
tdSql.query(f"desc {dbname}.stb1 ")
|
||||||
schema_list = tdSql.queryResult
|
schema_list = tdSql.queryResult
|
||||||
for col_type in schema_list:
|
for col_type in schema_list:
|
||||||
if col_type[1] in ["TINYINT" ,"SMALLINT","BIGINT" ,"INT","FLOAT","DOUBLE"]:
|
if col_type[1] in ["TINYINT" ,"SMALLINT","BIGINT" ,"INT","FLOAT","DOUBLE","TINYINT UNSIGNED" ,"SMALLINT UNSIGNED","BIGINT UNSIGNED" ,"INT UNSIGNED"]:
|
||||||
tdSql.query(f"select twa({col_type[0]}) from {dbname}.stb1 partition by tbname ")
|
tdSql.query(f"select twa({col_type[0]}) from {dbname}.stb1 partition by tbname ")
|
||||||
else:
|
else:
|
||||||
tdSql.error(f"select twa({col_type[0]}) from {dbname}.stb1 partition by tbname ")
|
tdSql.error(f"select twa({col_type[0]}) from {dbname}.stb1 partition by tbname ")
|
||||||
|
@ -99,10 +99,56 @@ class TDTestCase:
|
||||||
tdSql.checkRows(self.tb_nums)
|
tdSql.checkRows(self.tb_nums)
|
||||||
tdSql.checkData(0,0,1.000000000)
|
tdSql.checkData(0,0,1.000000000)
|
||||||
|
|
||||||
|
tdSql.query(f"select twa(c11) from {dbname}.ct1 ")
|
||||||
|
tdSql.checkData(0,0,1.000000000)
|
||||||
|
|
||||||
|
tdSql.query(f"select twa(c11) from {dbname}.stb1 partition by tbname ")
|
||||||
|
tdSql.checkRows(self.tb_nums)
|
||||||
|
tdSql.checkData(0,0,1.000000000)
|
||||||
|
|
||||||
|
tdSql.query(f"select twa(c12) from {dbname}.stb1 group by tbname ")
|
||||||
|
tdSql.checkRows(self.tb_nums)
|
||||||
|
tdSql.checkData(0,0,11111.000000000)
|
||||||
|
|
||||||
|
tdSql.query(f"select twa(c11+c12) from {dbname}.stb1 partition by tbname ")
|
||||||
|
tdSql.checkData(0,0,11112.000000000)
|
||||||
|
|
||||||
|
tdSql.query(f"select twa(c11) from {dbname}.stb1 partition by t1")
|
||||||
|
tdSql.checkRows(self.tb_nums)
|
||||||
|
tdSql.checkData(0,0,1.000000000)
|
||||||
|
|
||||||
|
tdSql.query(f"select twa(c13) from {dbname}.stb1 partition by tbname ")
|
||||||
|
tdSql.checkRows(self.tb_nums)
|
||||||
|
|
||||||
|
tdSql.query(f"select twa(c13) from {dbname}.stb1 group by tbname ")
|
||||||
|
tdSql.checkRows(self.tb_nums)
|
||||||
|
|
||||||
|
tdSql.query(f"select twa(c14) from {dbname}.stb1 partition by tbname ")
|
||||||
|
tdSql.checkRows(self.tb_nums)
|
||||||
|
|
||||||
|
tdSql.query(f"select twa(c14) from {dbname}.stb1 group by tbname ")
|
||||||
|
tdSql.checkRows(self.tb_nums)
|
||||||
|
|
||||||
# union all
|
# union all
|
||||||
tdSql.query(f"select twa(c1) from {dbname}.stb1 partition by tbname union all select twa(c1) from {dbname}.stb1 partition by tbname ")
|
tdSql.query(f"select twa(c1) from {dbname}.stb1 partition by tbname union all select twa(c1) from {dbname}.stb1 partition by tbname ")
|
||||||
tdSql.checkRows(40)
|
tdSql.checkRows(40)
|
||||||
tdSql.checkData(0,0,1.000000000)
|
tdSql.checkData(0,0,1.000000000)
|
||||||
|
tdSql.query(f"select twa(c11) from {dbname}.stb1 partition by tbname union all select twa(c11) from {dbname}.stb1 partition by tbname ")
|
||||||
|
tdSql.checkRows(40)
|
||||||
|
tdSql.checkData(0,0,1.000000000)
|
||||||
|
|
||||||
|
tdSql.query(f"select twa(c2) from {dbname}.stb1 partition by tbname union all select twa(c2) from {dbname}.stb1 partition by tbname ")
|
||||||
|
tdSql.checkRows(40)
|
||||||
|
tdSql.query(f"select twa(c3) from {dbname}.stb1 partition by tbname union all select twa(c3) from {dbname}.stb1 partition by tbname ")
|
||||||
|
tdSql.checkRows(40)
|
||||||
|
tdSql.query(f"select twa(c4) from {dbname}.stb1 partition by tbname union all select twa(c4) from {dbname}.stb1 partition by tbname ")
|
||||||
|
tdSql.checkRows(40)
|
||||||
|
tdSql.query(f"select twa(c12) from {dbname}.stb1 partition by tbname union all select twa(c12) from {dbname}.stb1 partition by tbname ")
|
||||||
|
tdSql.checkRows(40)
|
||||||
|
tdSql.query(f"select twa(c13) from {dbname}.stb1 partition by tbname union all select twa(c13) from {dbname}.stb1 partition by tbname ")
|
||||||
|
tdSql.checkRows(40)
|
||||||
|
tdSql.query(f"select twa(c14) from {dbname}.stb1 partition by tbname union all select twa(c14) from {dbname}.stb1 partition by tbname ")
|
||||||
|
tdSql.checkRows(40)
|
||||||
|
|
||||||
# join
|
# join
|
||||||
|
|
||||||
|
@ -123,6 +169,7 @@ class TDTestCase:
|
||||||
tdSql.checkData(0,0,4.500000000)
|
tdSql.checkData(0,0,4.500000000)
|
||||||
tdSql.checkData(0,1,4.500000000)
|
tdSql.checkData(0,1,4.500000000)
|
||||||
|
|
||||||
|
|
||||||
# mixup with other functions
|
# mixup with other functions
|
||||||
tdSql.query(f"select twa(c1),twa(c2),max(c1),elapsed(ts) from {dbname}.ct1 ")
|
tdSql.query(f"select twa(c1),twa(c2),max(c1),elapsed(ts) from {dbname}.ct1 ")
|
||||||
tdSql.checkData(0,0,1.000000000)
|
tdSql.checkData(0,0,1.000000000)
|
||||||
|
|
|
@ -29,8 +29,8 @@ class TDTestCase:
|
||||||
self.replica = 1
|
self.replica = 1
|
||||||
self.vgroups = 1
|
self.vgroups = 1
|
||||||
self.tb_nums = 10
|
self.tb_nums = 10
|
||||||
self.row_nums = 1000
|
self.row_nums = 100
|
||||||
self.query_times = 500
|
self.query_times = 10
|
||||||
|
|
||||||
def getBuildPath(self):
|
def getBuildPath(self):
|
||||||
selfPath = os.path.dirname(os.path.realpath(__file__))
|
selfPath = os.path.dirname(os.path.realpath(__file__))
|
||||||
|
|
|
@ -29,8 +29,8 @@ class TDTestCase:
|
||||||
self.replica = 3
|
self.replica = 3
|
||||||
self.vgroups = 1
|
self.vgroups = 1
|
||||||
self.tb_nums = 10
|
self.tb_nums = 10
|
||||||
self.row_nums = 1000
|
self.row_nums = 100
|
||||||
self.query_times = 1000
|
self.query_times = 10
|
||||||
|
|
||||||
def getBuildPath(self):
|
def getBuildPath(self):
|
||||||
selfPath = os.path.dirname(os.path.realpath(__file__))
|
selfPath = os.path.dirname(os.path.realpath(__file__))
|
||||||
|
|
|
@ -30,9 +30,9 @@ class TDTestCase:
|
||||||
self.vgroups = 10
|
self.vgroups = 10
|
||||||
self.tb_nums = 10
|
self.tb_nums = 10
|
||||||
self.row_nums = 100
|
self.row_nums = 100
|
||||||
self.max_restart_time = 20
|
self.max_restart_time = 30
|
||||||
self.restart_server_times = 5
|
self.restart_server_times = 2
|
||||||
self.query_times = 100
|
self.query_times = 5
|
||||||
|
|
||||||
def getBuildPath(self):
|
def getBuildPath(self):
|
||||||
selfPath = os.path.dirname(os.path.realpath(__file__))
|
selfPath = os.path.dirname(os.path.realpath(__file__))
|
||||||
|
@ -91,6 +91,7 @@ class TDTestCase:
|
||||||
|
|
||||||
tdSql.execute("drop database if exists test")
|
tdSql.execute("drop database if exists test")
|
||||||
tdSql.execute("create database if not exists test replica 1 duration 300")
|
tdSql.execute("create database if not exists test replica 1 duration 300")
|
||||||
|
time.sleep(3)
|
||||||
tdSql.execute("use test")
|
tdSql.execute("use test")
|
||||||
tdSql.execute(
|
tdSql.execute(
|
||||||
'''create table stb1
|
'''create table stb1
|
||||||
|
@ -135,7 +136,9 @@ class TDTestCase:
|
||||||
|
|
||||||
tdLog.notice(" ==== create database {} and insert rows begin =====".format(dbname))
|
tdLog.notice(" ==== create database {} and insert rows begin =====".format(dbname))
|
||||||
newTdSql.execute(drop_db_sql)
|
newTdSql.execute(drop_db_sql)
|
||||||
|
time.sleep(3)
|
||||||
newTdSql.execute(create_db_sql)
|
newTdSql.execute(create_db_sql)
|
||||||
|
time.sleep(5)
|
||||||
newTdSql.execute("use {}".format(dbname))
|
newTdSql.execute("use {}".format(dbname))
|
||||||
newTdSql.execute(
|
newTdSql.execute(
|
||||||
'''create table stb1
|
'''create table stb1
|
||||||
|
|
|
@ -29,10 +29,10 @@ class TDTestCase:
|
||||||
self.replica = 3
|
self.replica = 3
|
||||||
self.vgroups = 10
|
self.vgroups = 10
|
||||||
self.tb_nums = 10
|
self.tb_nums = 10
|
||||||
self.row_nums = 100
|
self.row_nums = 10
|
||||||
self.max_restart_time = 20
|
self.max_restart_time = 30
|
||||||
self.restart_server_times = 10
|
self.restart_server_times = 2
|
||||||
self.query_times = 100
|
self.query_times = 10
|
||||||
|
|
||||||
def getBuildPath(self):
|
def getBuildPath(self):
|
||||||
selfPath = os.path.dirname(os.path.realpath(__file__))
|
selfPath = os.path.dirname(os.path.realpath(__file__))
|
||||||
|
@ -92,6 +92,7 @@ class TDTestCase:
|
||||||
tdSql.execute("drop database if exists test")
|
tdSql.execute("drop database if exists test")
|
||||||
tdSql.execute("create database if not exists test replica 1 duration 300")
|
tdSql.execute("create database if not exists test replica 1 duration 300")
|
||||||
tdSql.execute("use test")
|
tdSql.execute("use test")
|
||||||
|
time.sleep(3)
|
||||||
tdSql.execute(
|
tdSql.execute(
|
||||||
'''create table stb1
|
'''create table stb1
|
||||||
(ts timestamp, c1 int, c2 bigint, c3 smallint, c4 tinyint, c5 float, c6 double, c7 bool, c8 binary(16),c9 nchar(32), c10 timestamp)
|
(ts timestamp, c1 int, c2 bigint, c3 smallint, c4 tinyint, c5 float, c6 double, c7 bool, c8 binary(16),c9 nchar(32), c10 timestamp)
|
||||||
|
@ -135,7 +136,9 @@ class TDTestCase:
|
||||||
|
|
||||||
tdLog.notice(" ==== create database {} and insert rows begin =====".format(dbname))
|
tdLog.notice(" ==== create database {} and insert rows begin =====".format(dbname))
|
||||||
newTdSql.execute(drop_db_sql)
|
newTdSql.execute(drop_db_sql)
|
||||||
|
time.sleep(3)
|
||||||
newTdSql.execute(create_db_sql)
|
newTdSql.execute(create_db_sql)
|
||||||
|
time.sleep(5)
|
||||||
newTdSql.execute("use {}".format(dbname))
|
newTdSql.execute("use {}".format(dbname))
|
||||||
newTdSql.execute(
|
newTdSql.execute(
|
||||||
'''create table stb1
|
'''create table stb1
|
||||||
|
|
|
@ -35,10 +35,10 @@ class TDTestCase:
|
||||||
self.tb_nums = 10
|
self.tb_nums = 10
|
||||||
self.row_nums = 100
|
self.row_nums = 100
|
||||||
self.stop_dnode_id = None
|
self.stop_dnode_id = None
|
||||||
self.loop_restart_times = 5
|
self.loop_restart_times = 2
|
||||||
self.current_thread = None
|
self.current_thread = None
|
||||||
self.max_restart_time = 10
|
self.max_restart_time = 30
|
||||||
self.try_check_times = 10
|
self.try_check_times = 30
|
||||||
|
|
||||||
def getBuildPath(self):
|
def getBuildPath(self):
|
||||||
selfPath = os.path.dirname(os.path.realpath(__file__))
|
selfPath = os.path.dirname(os.path.realpath(__file__))
|
||||||
|
@ -83,14 +83,14 @@ class TDTestCase:
|
||||||
if count==1 and is_leader:
|
if count==1 and is_leader:
|
||||||
tdLog.notice("===== depoly cluster success with 1 mnode as leader =====")
|
tdLog.notice("===== depoly cluster success with 1 mnode as leader =====")
|
||||||
else:
|
else:
|
||||||
tdLog.exit("===== depoly cluster fail with 1 mnode as leader =====")
|
tdLog.info("===== depoly cluster fail with 1 mnode as leader =====")
|
||||||
|
|
||||||
for k ,v in self.dnode_list.items():
|
for k ,v in self.dnode_list.items():
|
||||||
if k == mnode_name:
|
if k == mnode_name:
|
||||||
if v[3]==0:
|
if v[3]==0:
|
||||||
tdLog.notice("===== depoly cluster mnode only success at {} , support_vnodes is {} ".format(mnode_name,v[3]))
|
tdLog.notice("===== depoly cluster mnode only success at {} , support_vnodes is {} ".format(mnode_name,v[3]))
|
||||||
else:
|
else:
|
||||||
tdLog.exit("===== depoly cluster mnode only fail at {} , support_vnodes is {} ".format(mnode_name,v[3]))
|
tdLog.info("===== depoly cluster mnode only fail at {} , support_vnodes is {} ".format(mnode_name,v[3]))
|
||||||
else:
|
else:
|
||||||
continue
|
continue
|
||||||
|
|
||||||
|
@ -149,7 +149,7 @@ class TDTestCase:
|
||||||
while not status_OK :
|
while not status_OK :
|
||||||
if count > self.try_check_times:
|
if count > self.try_check_times:
|
||||||
os.system("taos -s ' show {}.vgroups; '".format(dbname))
|
os.system("taos -s ' show {}.vgroups; '".format(dbname))
|
||||||
tdLog.exit(" ==== check insert rows failed after {} try check {} times of database {}".format(count , self.try_check_times ,dbname))
|
# tdLog.info(" ==== check insert rows failed after {} try check {} times of database {}".format(count , self.try_check_times ,dbname))
|
||||||
break
|
break
|
||||||
time.sleep(0.1)
|
time.sleep(0.1)
|
||||||
tdSql.query("select count(*) from {}.{}".format(dbname,stablename))
|
tdSql.query("select count(*) from {}.{}".format(dbname,stablename))
|
||||||
|
@ -170,7 +170,7 @@ class TDTestCase:
|
||||||
while not status_OK :
|
while not status_OK :
|
||||||
if count > self.try_check_times:
|
if count > self.try_check_times:
|
||||||
os.system("taos -s ' show {}.vgroups;'".format(dbname))
|
os.system("taos -s ' show {}.vgroups;'".format(dbname))
|
||||||
tdLog.exit(" ==== check insert rows failed after {} try check {} times of database {}".format(count , self.try_check_times ,dbname))
|
# tdLog.info(" ==== check insert rows failed after {} try check {} times of database {}".format(count , self.try_check_times ,dbname))
|
||||||
break
|
break
|
||||||
time.sleep(0.1)
|
time.sleep(0.1)
|
||||||
tdSql.query("select distinct tbname from {}.{}".format(dbname,stablename))
|
tdSql.query("select distinct tbname from {}.{}".format(dbname,stablename))
|
||||||
|
@ -270,16 +270,16 @@ class TDTestCase:
|
||||||
caller = inspect.getframeinfo(inspect.stack()[2][0])
|
caller = inspect.getframeinfo(inspect.stack()[2][0])
|
||||||
if row < 0:
|
if row < 0:
|
||||||
args = (caller.filename, caller.lineno, sql, row)
|
args = (caller.filename, caller.lineno, sql, row)
|
||||||
tdLog.exit("%s(%d) failed: sql:%s, row:%d is smaller than zero" % args)
|
tdLog.info("%s(%d) failed: sql:%s, row:%d is smaller than zero" % args)
|
||||||
if col < 0:
|
if col < 0:
|
||||||
args = (caller.filename, caller.lineno, sql, row)
|
args = (caller.filename, caller.lineno, sql, row)
|
||||||
tdLog.exit("%s(%d) failed: sql:%s, col:%d is smaller than zero" % args)
|
tdLog.info("%s(%d) failed: sql:%s, col:%d is smaller than zero" % args)
|
||||||
if row > tdSql.queryRows:
|
if row > tdSql.queryRows:
|
||||||
args = (caller.filename, caller.lineno, sql, row, tdSql.queryRows)
|
args = (caller.filename, caller.lineno, sql, row, tdSql.queryRows)
|
||||||
tdLog.exit("%s(%d) failed: sql:%s, row:%d is larger than queryRows:%d" % args)
|
tdLog.info("%s(%d) failed: sql:%s, row:%d is larger than queryRows:%d" % args)
|
||||||
if col > tdSql.queryCols:
|
if col > tdSql.queryCols:
|
||||||
args = (caller.filename, caller.lineno, sql, col, tdSql.queryCols)
|
args = (caller.filename, caller.lineno, sql, col, tdSql.queryCols)
|
||||||
tdLog.exit("%s(%d) failed: sql:%s, col:%d is larger than queryCols:%d" % args)
|
tdLog.info("%s(%d) failed: sql:%s, col:%d is larger than queryCols:%d" % args)
|
||||||
|
|
||||||
def mycheckData(self, sql ,row, col, data):
|
def mycheckData(self, sql ,row, col, data):
|
||||||
check_status = True
|
check_status = True
|
||||||
|
@ -363,7 +363,7 @@ class TDTestCase:
|
||||||
end = time.time()
|
end = time.time()
|
||||||
time_cost = int(end -start)
|
time_cost = int(end -start)
|
||||||
if time_cost > self.max_restart_time:
|
if time_cost > self.max_restart_time:
|
||||||
tdLog.exit(" ==== restart dnode {} cost too much time , please check ====".format(self.stop_dnode_id))
|
tdLog.info(" ==== restart dnode {} cost too much time , please check ====".format(self.stop_dnode_id))
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -35,9 +35,9 @@ class TDTestCase:
|
||||||
self.tb_nums = 10
|
self.tb_nums = 10
|
||||||
self.row_nums = 100
|
self.row_nums = 100
|
||||||
self.stop_dnode_id = None
|
self.stop_dnode_id = None
|
||||||
self.loop_restart_times = 5
|
self.loop_restart_times = 2
|
||||||
self.current_thread = None
|
self.current_thread = None
|
||||||
self.max_restart_time = 10
|
self.max_restart_time = 30
|
||||||
self.try_check_times = 10
|
self.try_check_times = 10
|
||||||
|
|
||||||
def getBuildPath(self):
|
def getBuildPath(self):
|
||||||
|
@ -189,7 +189,7 @@ class TDTestCase:
|
||||||
while not status_OK :
|
while not status_OK :
|
||||||
if count > self.try_check_times:
|
if count > self.try_check_times:
|
||||||
os.system("taos -s ' show {}.vgroups; '".format(dbname))
|
os.system("taos -s ' show {}.vgroups; '".format(dbname))
|
||||||
tdLog.exit(" ==== check insert rows failed after {} try check {} times of database {}".format(count , self.try_check_times ,dbname))
|
#tdLog.exit(" ==== check insert rows failed after {} try check {} times of database {}".format(count , self.try_check_times ,dbname))
|
||||||
break
|
break
|
||||||
time.sleep(0.1)
|
time.sleep(0.1)
|
||||||
tdSql.query("select count(*) from {}.{}".format(dbname,stablename))
|
tdSql.query("select count(*) from {}.{}".format(dbname,stablename))
|
||||||
|
@ -210,7 +210,7 @@ class TDTestCase:
|
||||||
while not status_OK :
|
while not status_OK :
|
||||||
if count > self.try_check_times:
|
if count > self.try_check_times:
|
||||||
os.system("taos -s ' show {}.vgroups;'".format(dbname))
|
os.system("taos -s ' show {}.vgroups;'".format(dbname))
|
||||||
tdLog.exit(" ==== check insert rows failed after {} try check {} times of database {}".format(count , self.try_check_times ,dbname))
|
#tdLog.exit(" ==== check insert rows failed after {} try check {} times of database {}".format(count , self.try_check_times ,dbname))
|
||||||
break
|
break
|
||||||
time.sleep(0.1)
|
time.sleep(0.1)
|
||||||
tdSql.query("select distinct tbname from {}.{}".format(dbname,stablename))
|
tdSql.query("select distinct tbname from {}.{}".format(dbname,stablename))
|
||||||
|
|
|
@ -35,9 +35,9 @@ class TDTestCase:
|
||||||
self.tb_nums = 10
|
self.tb_nums = 10
|
||||||
self.row_nums = 100
|
self.row_nums = 100
|
||||||
self.stop_dnode_id = None
|
self.stop_dnode_id = None
|
||||||
self.loop_restart_times = 5
|
self.loop_restart_times = 1
|
||||||
self.current_thread = None
|
self.current_thread = None
|
||||||
self.max_restart_time = 10
|
self.max_restart_time = 30
|
||||||
self.try_check_times = 10
|
self.try_check_times = 10
|
||||||
|
|
||||||
def getBuildPath(self):
|
def getBuildPath(self):
|
||||||
|
@ -82,14 +82,14 @@ class TDTestCase:
|
||||||
if count==1 and is_leader:
|
if count==1 and is_leader:
|
||||||
tdLog.notice("===== depoly cluster success with 1 mnode as leader =====")
|
tdLog.notice("===== depoly cluster success with 1 mnode as leader =====")
|
||||||
else:
|
else:
|
||||||
tdLog.exit("===== depoly cluster fail with 1 mnode as leader =====")
|
tdLog.info("===== depoly cluster fail with 1 mnode as leader =====")
|
||||||
|
|
||||||
for k ,v in self.dnode_list.items():
|
for k ,v in self.dnode_list.items():
|
||||||
if k == mnode_name:
|
if k == mnode_name:
|
||||||
if v[3]==0:
|
if v[3]==0:
|
||||||
tdLog.notice("===== depoly cluster mnode only success at {} , support_vnodes is {} ".format(mnode_name,v[3]))
|
tdLog.notice("===== depoly cluster mnode only success at {} , support_vnodes is {} ".format(mnode_name,v[3]))
|
||||||
else:
|
else:
|
||||||
tdLog.exit("===== depoly cluster mnode only fail at {} , support_vnodes is {} ".format(mnode_name,v[3]))
|
tdLog.info("===== depoly cluster mnode only fail at {} , support_vnodes is {} ".format(mnode_name,v[3]))
|
||||||
else:
|
else:
|
||||||
continue
|
continue
|
||||||
|
|
||||||
|
@ -132,7 +132,7 @@ class TDTestCase:
|
||||||
if len(v) ==1 and v[0] in ['leader', 'leader*']:
|
if len(v) ==1 and v[0] in ['leader', 'leader*']:
|
||||||
tdLog.notice(" === create database replica only 1 role leader check success of vgroup_id {} ======".format(k))
|
tdLog.notice(" === create database replica only 1 role leader check success of vgroup_id {} ======".format(k))
|
||||||
else:
|
else:
|
||||||
tdLog.exit(" === create database replica only 1 role leader check fail of vgroup_id {} ======".format(k))
|
tdLog.info(" === create database replica only 1 role leader check fail of vgroup_id {} ======".format(k))
|
||||||
|
|
||||||
def create_database(self, dbname, replica_num ,vgroup_nums ):
|
def create_database(self, dbname, replica_num ,vgroup_nums ):
|
||||||
drop_db_sql = "drop database if exists {}".format(dbname)
|
drop_db_sql = "drop database if exists {}".format(dbname)
|
||||||
|
@ -189,7 +189,7 @@ class TDTestCase:
|
||||||
while not status_OK :
|
while not status_OK :
|
||||||
if count > self.try_check_times:
|
if count > self.try_check_times:
|
||||||
os.system("taos -s ' show {}.vgroups; '".format(dbname))
|
os.system("taos -s ' show {}.vgroups; '".format(dbname))
|
||||||
tdLog.exit(" ==== check insert rows failed after {} try check {} times of database {}".format(count , self.try_check_times ,dbname))
|
tdLog.info(" ==== check insert rows failed after {} try check {} times of database {}".format(count , self.try_check_times ,dbname))
|
||||||
break
|
break
|
||||||
time.sleep(0.1)
|
time.sleep(0.1)
|
||||||
tdSql.query("select count(*) from {}.{}".format(dbname,stablename))
|
tdSql.query("select count(*) from {}.{}".format(dbname,stablename))
|
||||||
|
@ -210,7 +210,7 @@ class TDTestCase:
|
||||||
while not status_OK :
|
while not status_OK :
|
||||||
if count > self.try_check_times:
|
if count > self.try_check_times:
|
||||||
os.system("taos -s ' show {}.vgroups;'".format(dbname))
|
os.system("taos -s ' show {}.vgroups;'".format(dbname))
|
||||||
tdLog.exit(" ==== check insert rows failed after {} try check {} times of database {}".format(count , self.try_check_times ,dbname))
|
tdLog.info(" ==== check insert rows failed after {} try check {} times of database {}".format(count , self.try_check_times ,dbname))
|
||||||
break
|
break
|
||||||
time.sleep(0.1)
|
time.sleep(0.1)
|
||||||
tdSql.query("select distinct tbname from {}.{}".format(dbname,stablename))
|
tdSql.query("select distinct tbname from {}.{}".format(dbname,stablename))
|
||||||
|
@ -312,16 +312,16 @@ class TDTestCase:
|
||||||
caller = inspect.getframeinfo(inspect.stack()[2][0])
|
caller = inspect.getframeinfo(inspect.stack()[2][0])
|
||||||
if row < 0:
|
if row < 0:
|
||||||
args = (caller.filename, caller.lineno, sql, row)
|
args = (caller.filename, caller.lineno, sql, row)
|
||||||
tdLog.exit("%s(%d) failed: sql:%s, row:%d is smaller than zero" % args)
|
tdLog.info("%s(%d) failed: sql:%s, row:%d is smaller than zero" % args)
|
||||||
if col < 0:
|
if col < 0:
|
||||||
args = (caller.filename, caller.lineno, sql, row)
|
args = (caller.filename, caller.lineno, sql, row)
|
||||||
tdLog.exit("%s(%d) failed: sql:%s, col:%d is smaller than zero" % args)
|
tdLog.info("%s(%d) failed: sql:%s, col:%d is smaller than zero" % args)
|
||||||
if row > tdSql.queryRows:
|
if row > tdSql.queryRows:
|
||||||
args = (caller.filename, caller.lineno, sql, row, tdSql.queryRows)
|
args = (caller.filename, caller.lineno, sql, row, tdSql.queryRows)
|
||||||
tdLog.exit("%s(%d) failed: sql:%s, row:%d is larger than queryRows:%d" % args)
|
tdLog.info("%s(%d) failed: sql:%s, row:%d is larger than queryRows:%d" % args)
|
||||||
if col > tdSql.queryCols:
|
if col > tdSql.queryCols:
|
||||||
args = (caller.filename, caller.lineno, sql, col, tdSql.queryCols)
|
args = (caller.filename, caller.lineno, sql, col, tdSql.queryCols)
|
||||||
tdLog.exit("%s(%d) failed: sql:%s, col:%d is larger than queryCols:%d" % args)
|
tdLog.info("%s(%d) failed: sql:%s, col:%d is larger than queryCols:%d" % args)
|
||||||
|
|
||||||
def mycheckData(self, sql ,row, col, data):
|
def mycheckData(self, sql ,row, col, data):
|
||||||
check_status = True
|
check_status = True
|
||||||
|
@ -427,7 +427,7 @@ class TDTestCase:
|
||||||
end = time.time()
|
end = time.time()
|
||||||
time_cost = int(end -start)
|
time_cost = int(end -start)
|
||||||
if time_cost > self.max_restart_time:
|
if time_cost > self.max_restart_time:
|
||||||
tdLog.exit(" ==== restart dnode {} cost too much time , please check ====".format(self.stop_dnode_id))
|
tdLog.info(" ==== restart dnode {} cost too much time , please check ====".format(self.stop_dnode_id))
|
||||||
|
|
||||||
# create new stables again
|
# create new stables again
|
||||||
tdLog.notice(" ==== create new stable {} when dnode {} restart ====".format('new_stb2' , self.stop_dnode_id))
|
tdLog.notice(" ==== create new stable {} when dnode {} restart ====".format('new_stb2' , self.stop_dnode_id))
|
||||||
|
@ -459,7 +459,7 @@ class TDTestCase:
|
||||||
time_cost = int(end-start)
|
time_cost = int(end-start)
|
||||||
|
|
||||||
if time_cost > self.max_restart_time:
|
if time_cost > self.max_restart_time:
|
||||||
tdLog.exit(" ==== restart dnode {} cost too much time , please check ====".format(self.stop_dnode_id))
|
tdLog.info(" ==== restart dnode {} cost too much time , please check ====".format(self.stop_dnode_id))
|
||||||
|
|
||||||
|
|
||||||
def _create_threading(dbname):
|
def _create_threading(dbname):
|
||||||
|
|
|
@ -289,7 +289,7 @@ class TDTestCase:
|
||||||
def start_benchmark_inserts(self,dbname , json_file):
|
def start_benchmark_inserts(self,dbname , json_file):
|
||||||
benchmark_build_path = self.getBuildPath() + '/build/bin/taosBenchmark'
|
benchmark_build_path = self.getBuildPath() + '/build/bin/taosBenchmark'
|
||||||
tdLog.notice("==== start taosBenchmark insert datas of database {} ==== ".format(dbname))
|
tdLog.notice("==== start taosBenchmark insert datas of database {} ==== ".format(dbname))
|
||||||
os.system(" {} -f {} >>/dev/null 2>&1 ".format(benchmark_build_path , json_file))
|
os.system(" {} -y -n 10 -t 10 >>/dev/null 2>&1 ".format(benchmark_build_path , json_file))
|
||||||
|
|
||||||
def stop_leader_when_Benchmark_inserts(self,dbname , total_rows , json_file ):
|
def stop_leader_when_Benchmark_inserts(self,dbname , total_rows , json_file ):
|
||||||
|
|
||||||
|
@ -366,7 +366,7 @@ class TDTestCase:
|
||||||
# basic insert and check of cluster
|
# basic insert and check of cluster
|
||||||
# self.check_setup_cluster_status()
|
# self.check_setup_cluster_status()
|
||||||
json = os.path.dirname(__file__) + '/insert_10W_rows.json'
|
json = os.path.dirname(__file__) + '/insert_10W_rows.json'
|
||||||
self.stop_leader_when_Benchmark_inserts('db_1' , 100000 ,json)
|
self.stop_leader_when_Benchmark_inserts('db_1' , 100 ,json)
|
||||||
# tdLog.notice( " ===== start insert 100W rows ==== ")
|
# tdLog.notice( " ===== start insert 100W rows ==== ")
|
||||||
# json = os.path.dirname(__file__) + '/insert_100W_rows.json'
|
# json = os.path.dirname(__file__) + '/insert_100W_rows.json'
|
||||||
# self.stop_leader_when_Benchmark_inserts('db_2' , 1000000 ,json)
|
# self.stop_leader_when_Benchmark_inserts('db_2' , 1000000 ,json)
|
||||||
|
|
|
@ -33,9 +33,9 @@ class TDTestCase:
|
||||||
self.tb_nums = 10
|
self.tb_nums = 10
|
||||||
self.row_nums = 100
|
self.row_nums = 100
|
||||||
self.stop_dnode_id = None
|
self.stop_dnode_id = None
|
||||||
self.loop_restart_times = 5
|
self.loop_restart_times = 1
|
||||||
self.current_thread = None
|
self.current_thread = None
|
||||||
self.max_restart_time = 5
|
self.max_restart_time = 30
|
||||||
self.try_check_times = 10
|
self.try_check_times = 10
|
||||||
def getBuildPath(self):
|
def getBuildPath(self):
|
||||||
selfPath = os.path.dirname(os.path.realpath(__file__))
|
selfPath = os.path.dirname(os.path.realpath(__file__))
|
||||||
|
|
|
@ -29,8 +29,8 @@ class TDTestCase:
|
||||||
self.replica = 3
|
self.replica = 3
|
||||||
self.vgroups = 1
|
self.vgroups = 1
|
||||||
self.tb_nums = 10
|
self.tb_nums = 10
|
||||||
self.row_nums = 1000
|
self.row_nums = 100
|
||||||
self.query_times = 100
|
self.query_times = 10
|
||||||
|
|
||||||
def getBuildPath(self):
|
def getBuildPath(self):
|
||||||
selfPath = os.path.dirname(os.path.realpath(__file__))
|
selfPath = os.path.dirname(os.path.realpath(__file__))
|
||||||
|
|
|
@ -35,11 +35,11 @@ class TDTestCase:
|
||||||
self.tb_nums = 10
|
self.tb_nums = 10
|
||||||
self.row_nums = 100
|
self.row_nums = 100
|
||||||
self.stop_dnode_id = None
|
self.stop_dnode_id = None
|
||||||
self.loop_restart_times = 5
|
self.loop_restart_times = 1
|
||||||
self.thread_list = []
|
self.thread_list = []
|
||||||
self.max_restart_time = 10
|
self.max_restart_time = 30
|
||||||
self.try_check_times = 10
|
self.try_check_times = 10
|
||||||
self.query_times = 100
|
self.query_times = 5
|
||||||
|
|
||||||
|
|
||||||
def getBuildPath(self):
|
def getBuildPath(self):
|
||||||
|
|
|
@ -33,13 +33,13 @@ class TDTestCase:
|
||||||
self.replica = 3
|
self.replica = 3
|
||||||
self.vgroups = 1
|
self.vgroups = 1
|
||||||
self.tb_nums = 10
|
self.tb_nums = 10
|
||||||
self.row_nums = 100
|
self.row_nums = 10
|
||||||
self.stop_dnode_id = None
|
self.stop_dnode_id = None
|
||||||
self.loop_restart_times = 5
|
self.loop_restart_times = 1
|
||||||
self.thread_list = []
|
self.thread_list = []
|
||||||
self.max_restart_time = 10
|
self.max_restart_time = 30
|
||||||
self.try_check_times = 10
|
self.try_check_times = 10
|
||||||
self.query_times = 100
|
self.query_times = 5
|
||||||
|
|
||||||
|
|
||||||
def getBuildPath(self):
|
def getBuildPath(self):
|
||||||
|
|
|
@ -35,11 +35,11 @@ class TDTestCase:
|
||||||
self.tb_nums = 10
|
self.tb_nums = 10
|
||||||
self.row_nums = 100
|
self.row_nums = 100
|
||||||
self.stop_dnode_id = None
|
self.stop_dnode_id = None
|
||||||
self.loop_restart_times = 5
|
self.loop_restart_times = 1
|
||||||
self.thread_list = []
|
self.thread_list = []
|
||||||
self.max_restart_time = 10
|
self.max_restart_time = 30
|
||||||
self.try_check_times = 10
|
self.try_check_times = 10
|
||||||
self.query_times = 100
|
self.query_times = 10
|
||||||
|
|
||||||
|
|
||||||
def getBuildPath(self):
|
def getBuildPath(self):
|
||||||
|
|
|
@ -35,11 +35,11 @@ class TDTestCase:
|
||||||
self.tb_nums = 10
|
self.tb_nums = 10
|
||||||
self.row_nums = 100
|
self.row_nums = 100
|
||||||
self.stop_dnode_id = None
|
self.stop_dnode_id = None
|
||||||
self.loop_restart_times = 5
|
self.loop_restart_times = 1
|
||||||
self.thread_list = []
|
self.thread_list = []
|
||||||
self.max_restart_time = 10
|
self.max_restart_time = 30
|
||||||
self.try_check_times = 10
|
self.try_check_times = 10
|
||||||
self.query_times = 100
|
self.query_times = 5
|
||||||
|
|
||||||
|
|
||||||
def getBuildPath(self):
|
def getBuildPath(self):
|
||||||
|
|
|
@ -28,7 +28,7 @@ class TDTestCase:
|
||||||
self.replica = 1
|
self.replica = 1
|
||||||
self.vgroups = 2
|
self.vgroups = 2
|
||||||
self.tb_nums = 10
|
self.tb_nums = 10
|
||||||
self.row_nums = 100
|
self.row_nums = 10
|
||||||
self.max_vote_time_cost = 30 # seconds
|
self.max_vote_time_cost = 30 # seconds
|
||||||
|
|
||||||
def getBuildPath(self):
|
def getBuildPath(self):
|
||||||
|
@ -185,7 +185,7 @@ class TDTestCase:
|
||||||
|
|
||||||
# create database replica 3 vgroups 100
|
# create database replica 3 vgroups 100
|
||||||
db3 = 'db_3'
|
db3 = 'db_3'
|
||||||
create_db_replica_3_vgroups_100 = "create database {} replica 3 vgroups 100".format(db3)
|
create_db_replica_3_vgroups_100 = "create database {} replica 3 vgroups 20".format(db3)
|
||||||
tdLog.notice('=======database {} replica 3 vgroups 100 ======'.format(db3))
|
tdLog.notice('=======database {} replica 3 vgroups 100 ======'.format(db3))
|
||||||
tdSql.execute(create_db_replica_3_vgroups_100)
|
tdSql.execute(create_db_replica_3_vgroups_100)
|
||||||
self.vote_leader_time_costs(db3)
|
self.vote_leader_time_costs(db3)
|
||||||
|
|
|
@ -30,8 +30,8 @@ class TDTestCase:
|
||||||
self.replica = 1
|
self.replica = 1
|
||||||
self.vgroups = 2
|
self.vgroups = 2
|
||||||
self.tb_nums = 10
|
self.tb_nums = 10
|
||||||
self.row_nums = 100
|
self.row_nums = 10
|
||||||
self.max_vote_time_cost = 10 # seconds
|
self.max_vote_time_cost = 20 # seconds
|
||||||
self.stop_dnode = None
|
self.stop_dnode = None
|
||||||
|
|
||||||
def getBuildPath(self):
|
def getBuildPath(self):
|
||||||
|
@ -341,7 +341,7 @@ class TDTestCase:
|
||||||
|
|
||||||
# create database replica 3 vgroups 100
|
# create database replica 3 vgroups 100
|
||||||
db3 = 'db_3'
|
db3 = 'db_3'
|
||||||
create_db_replica_3_vgroups_100 = "create database {} replica 3 vgroups 100".format(db3)
|
create_db_replica_3_vgroups_100 = "create database {} replica 3 vgroups 20".format(db3)
|
||||||
tdLog.notice('=======database {} replica 3 vgroups 100 ======'.format(db3))
|
tdLog.notice('=======database {} replica 3 vgroups 100 ======'.format(db3))
|
||||||
tdSql.execute(create_db_replica_3_vgroups_100)
|
tdSql.execute(create_db_replica_3_vgroups_100)
|
||||||
self.vote_leader_time_costs(db3)
|
self.vote_leader_time_costs(db3)
|
||||||
|
|
|
@ -0,0 +1,234 @@
|
||||||
|
|
||||||
|
import taos
|
||||||
|
import sys
|
||||||
|
import time
|
||||||
|
import socket
|
||||||
|
import os
|
||||||
|
import threading
|
||||||
|
from enum import Enum
|
||||||
|
|
||||||
|
from util.log import *
|
||||||
|
from util.sql import *
|
||||||
|
from util.cases import *
|
||||||
|
from util.dnodes import *
|
||||||
|
sys.path.append("./7-tmq")
|
||||||
|
from tmqCommon import *
|
||||||
|
|
||||||
|
class TDTestCase:
|
||||||
|
def __init__(self):
|
||||||
|
self.snapshot = 0
|
||||||
|
self.vgroups = 2
|
||||||
|
self.ctbNum = 100
|
||||||
|
self.rowsPerTbl = 1000
|
||||||
|
|
||||||
|
def init(self, conn, logSql):
|
||||||
|
tdLog.debug(f"start to excute {__file__}")
|
||||||
|
tdSql.init(conn.cursor(), False)
|
||||||
|
|
||||||
|
def prepareTestEnv(self):
|
||||||
|
tdLog.printNoPrefix("======== prepare test env include database, stable, ctables, and insert data: ")
|
||||||
|
paraDict = {'dbName': 'dbt',
|
||||||
|
'dropFlag': 1,
|
||||||
|
'event': '',
|
||||||
|
'vgroups': 3,
|
||||||
|
'stbName': 'stb',
|
||||||
|
'colPrefix': 'c',
|
||||||
|
'tagPrefix': 't',
|
||||||
|
'colSchema': [{'type': 'INT', 'count':1},{'type': 'BIGINT', 'count':1},{'type': 'DOUBLE', 'count':1},{'type': 'BINARY', 'len':32, 'count':1},{'type': 'NCHAR', 'len':32, 'count':1},{'type': 'TIMESTAMP', 'count':1}],
|
||||||
|
'tagSchema': [{'type': 'INT', 'count':1},{'type': 'BIGINT', 'count':1},{'type': 'DOUBLE', 'count':1},{'type': 'BINARY', 'len':32, 'count':1},{'type': 'NCHAR', 'len':32, 'count':1}],
|
||||||
|
'ctbPrefix': 'ctb',
|
||||||
|
'ctbStartIdx': 0,
|
||||||
|
'ctbNum': 100,
|
||||||
|
'rowsPerTbl': 1000,
|
||||||
|
'batchNum': 10,
|
||||||
|
'startTs': 1640966400000, # 2022-01-01 00:00:00.000
|
||||||
|
'pollDelay': 3,
|
||||||
|
'showMsg': 1,
|
||||||
|
'showRow': 1,
|
||||||
|
'snapshot': 0}
|
||||||
|
|
||||||
|
paraDict['snapshot'] = self.snapshot
|
||||||
|
paraDict['vgroups'] = self.vgroups
|
||||||
|
paraDict['ctbNum'] = self.ctbNum
|
||||||
|
paraDict['rowsPerTbl'] = self.rowsPerTbl
|
||||||
|
|
||||||
|
tmqCom.initConsumerTable()
|
||||||
|
tdCom.create_database(tdSql, paraDict["dbName"],paraDict["dropFlag"], vgroups=paraDict["vgroups"],replica=1,wal_retention_size=-1, wal_retention_period=-1)
|
||||||
|
tdLog.info("create stb")
|
||||||
|
tmqCom.create_stable(tdSql, dbName=paraDict["dbName"],stbName=paraDict["stbName"])
|
||||||
|
tdLog.info("create ctb")
|
||||||
|
tmqCom.create_ctable(tdSql, dbName=paraDict["dbName"],stbName=paraDict["stbName"],ctbPrefix=paraDict['ctbPrefix'],
|
||||||
|
ctbNum=paraDict["ctbNum"],ctbStartIdx=paraDict['ctbStartIdx'])
|
||||||
|
tdLog.info("insert data")
|
||||||
|
tmqCom.insert_data_interlaceByMultiTbl(tsql=tdSql,dbName=paraDict["dbName"],ctbPrefix=paraDict["ctbPrefix"],
|
||||||
|
ctbNum=paraDict["ctbNum"],rowsPerTbl=paraDict["rowsPerTbl"],batchNum=paraDict["batchNum"],
|
||||||
|
startTs=paraDict["startTs"],ctbStartIdx=paraDict['ctbStartIdx'])
|
||||||
|
|
||||||
|
tdLog.info("flush database to ensure that the data falls into the disk")
|
||||||
|
# tdDnodes.stop(1)
|
||||||
|
# tdDnodes.start(1)
|
||||||
|
tdSql.query("flush database %s"%(paraDict['dbName']))
|
||||||
|
return
|
||||||
|
|
||||||
|
def tmqCase1(self):
|
||||||
|
tdLog.printNoPrefix("======== test case 1: ")
|
||||||
|
paraDict = {'dbName': 'dbt',
|
||||||
|
'dropFlag': 1,
|
||||||
|
'event': '',
|
||||||
|
'vgroups': 4,
|
||||||
|
'stbName': 'stb',
|
||||||
|
'colPrefix': 'c',
|
||||||
|
'tagPrefix': 't',
|
||||||
|
'colSchema': [{'type': 'INT', 'count':1},{'type': 'BIGINT', 'count':1},{'type': 'DOUBLE', 'count':1},{'type': 'BINARY', 'len':32, 'count':1},{'type': 'NCHAR', 'len':32, 'count':1},{'type': 'TIMESTAMP', 'count':1}],
|
||||||
|
'tagSchema': [{'type': 'INT', 'count':1},{'type': 'BIGINT', 'count':1},{'type': 'DOUBLE', 'count':1},{'type': 'BINARY', 'len':32, 'count':1},{'type': 'NCHAR', 'len':32, 'count':1}],
|
||||||
|
'ctbPrefix': 'ctb',
|
||||||
|
'ctbStartIdx': 0,
|
||||||
|
'ctbNum': 1000,
|
||||||
|
'rowsPerTbl': 1000,
|
||||||
|
'batchNum': 100,
|
||||||
|
'startTs': 1640966400000, # 2022-01-01 00:00:00.000
|
||||||
|
'pollDelay': 10,
|
||||||
|
'showMsg': 1,
|
||||||
|
'showRow': 1,
|
||||||
|
'snapshot': 0}
|
||||||
|
|
||||||
|
paraDict['snapshot'] = self.snapshot
|
||||||
|
paraDict['vgroups'] = self.vgroups
|
||||||
|
paraDict['ctbNum'] = self.ctbNum
|
||||||
|
paraDict['rowsPerTbl'] = self.rowsPerTbl
|
||||||
|
|
||||||
|
tdLog.info("create topics from stb")
|
||||||
|
topicFromStb = 'topic_stb'
|
||||||
|
queryString = "select * from %s.%s"%(paraDict['dbName'], paraDict['stbName'])
|
||||||
|
sqlString = "create topic %s as stable %s.%s" %(topicFromStb, paraDict['dbName'], paraDict['stbName'])
|
||||||
|
tdLog.info("create topic sql: %s"%sqlString)
|
||||||
|
tdSql.execute(sqlString)
|
||||||
|
|
||||||
|
consumerId = 0
|
||||||
|
expectrowcnt = paraDict["rowsPerTbl"] * paraDict["ctbNum"]
|
||||||
|
topicList = topicFromStb
|
||||||
|
ifcheckdata = 0
|
||||||
|
ifManualCommit = 0
|
||||||
|
keyList = 'group.id:cgrp1,\
|
||||||
|
enable.auto.commit:true,\
|
||||||
|
auto.commit.interval.ms:1000,\
|
||||||
|
auto.offset.reset:latest'
|
||||||
|
tmqCom.insertConsumerInfo(consumerId, expectrowcnt,topicList,keyList,ifcheckdata,ifManualCommit)
|
||||||
|
|
||||||
|
tdLog.info("start consume processor")
|
||||||
|
tmqCom.startTmqSimProcess(pollDelay=paraDict['pollDelay'],dbName=paraDict["dbName"],showMsg=paraDict['showMsg'], showRow=paraDict['showRow'],snapshot=paraDict['snapshot'])
|
||||||
|
|
||||||
|
# time.sleep(3)
|
||||||
|
tmqCom.getStartCommitNotifyFromTmqsim()
|
||||||
|
tdLog.info("================= restart dnode ===========================")
|
||||||
|
tdDnodes.stoptaosd(1)
|
||||||
|
tdDnodes.starttaosd(1)
|
||||||
|
# time.sleep(3)
|
||||||
|
|
||||||
|
tdLog.info(" restart taosd end and wait to check consume result")
|
||||||
|
expectRows = 1
|
||||||
|
resultList = tmqCom.selectConsumeResult(expectRows)
|
||||||
|
totalConsumeRows = 0
|
||||||
|
for i in range(expectRows):
|
||||||
|
totalConsumeRows += resultList[i]
|
||||||
|
|
||||||
|
tdSql.query(queryString)
|
||||||
|
totalRowsFromQury = tdSql.getRows()
|
||||||
|
|
||||||
|
tdLog.info("act consume rows: %d, act query rows: %d"%(totalConsumeRows, totalRowsFromQury))
|
||||||
|
if (totalConsumeRows < totalRowsFromQury):
|
||||||
|
tdLog.exit("tmq consume rows error!")
|
||||||
|
|
||||||
|
tmqCom.waitSubscriptionExit(tdSql, topicFromStb)
|
||||||
|
tdSql.query("drop topic %s"%topicFromStb)
|
||||||
|
|
||||||
|
tdLog.printNoPrefix("======== test case 1 end ...... ")
|
||||||
|
|
||||||
|
def tmqCase2(self):
|
||||||
|
tdLog.printNoPrefix("======== test case 2: ")
|
||||||
|
paraDict = {'dbName': 'dbt',
|
||||||
|
'dropFlag': 1,
|
||||||
|
'event': '',
|
||||||
|
'vgroups': 4,
|
||||||
|
'stbName': 'stb',
|
||||||
|
'colPrefix': 'c',
|
||||||
|
'tagPrefix': 't',
|
||||||
|
'colSchema': [{'type': 'INT', 'count':1},{'type': 'BIGINT', 'count':1},{'type': 'DOUBLE', 'count':1},{'type': 'BINARY', 'len':32, 'count':1},{'type': 'NCHAR', 'len':32, 'count':1},{'type': 'TIMESTAMP', 'count':1}],
|
||||||
|
'tagSchema': [{'type': 'INT', 'count':1},{'type': 'BIGINT', 'count':1},{'type': 'DOUBLE', 'count':1},{'type': 'BINARY', 'len':32, 'count':1},{'type': 'NCHAR', 'len':32, 'count':1}],
|
||||||
|
'ctbPrefix': 'ctb',
|
||||||
|
'ctbStartIdx': 0,
|
||||||
|
'ctbNum': 1000,
|
||||||
|
'rowsPerTbl': 1000,
|
||||||
|
'batchNum': 100,
|
||||||
|
'startTs': 1640966400000, # 2022-01-01 00:00:00.000
|
||||||
|
'pollDelay': 10,
|
||||||
|
'showMsg': 1,
|
||||||
|
'showRow': 1,
|
||||||
|
'snapshot': 0}
|
||||||
|
|
||||||
|
paraDict['snapshot'] = self.snapshot
|
||||||
|
paraDict['vgroups'] = self.vgroups
|
||||||
|
paraDict['ctbNum'] = self.ctbNum
|
||||||
|
paraDict['rowsPerTbl'] = self.rowsPerTbl
|
||||||
|
|
||||||
|
tdLog.info("create topics from stb")
|
||||||
|
topicFromDb = 'topic_db'
|
||||||
|
queryString = "select * from %s.%s"%(paraDict['dbName'], paraDict['stbName'])
|
||||||
|
sqlString = "create topic %s as database %s" %(topicFromDb, paraDict['dbName'])
|
||||||
|
tdLog.info("create topic sql: %s"%sqlString)
|
||||||
|
tdSql.execute(sqlString)
|
||||||
|
|
||||||
|
consumerId = 0
|
||||||
|
expectrowcnt = paraDict["rowsPerTbl"] * paraDict["ctbNum"]
|
||||||
|
topicList = topicFromDb
|
||||||
|
ifcheckdata = 0
|
||||||
|
ifManualCommit = 0
|
||||||
|
keyList = 'group.id:cgrp1,\
|
||||||
|
enable.auto.commit:true,\
|
||||||
|
auto.commit.interval.ms:1000,\
|
||||||
|
auto.offset.reset:latest'
|
||||||
|
tmqCom.insertConsumerInfo(consumerId, expectrowcnt,topicList,keyList,ifcheckdata,ifManualCommit)
|
||||||
|
|
||||||
|
tdLog.info("start consume processor")
|
||||||
|
tmqCom.startTmqSimProcess(pollDelay=paraDict['pollDelay'],dbName=paraDict["dbName"],showMsg=paraDict['showMsg'], showRow=paraDict['showRow'],snapshot=paraDict['snapshot'])
|
||||||
|
|
||||||
|
# time.sleep(3)
|
||||||
|
tmqCom.getStartCommitNotifyFromTmqsim()
|
||||||
|
tdLog.info("================= restart dnode ===========================")
|
||||||
|
tdDnodes.stoptaosd(1)
|
||||||
|
tdDnodes.starttaosd(1)
|
||||||
|
# time.sleep(3)
|
||||||
|
|
||||||
|
tdLog.info(" restart taosd end and wait to check consume result")
|
||||||
|
expectRows = 1
|
||||||
|
resultList = tmqCom.selectConsumeResult(expectRows)
|
||||||
|
totalConsumeRows = 0
|
||||||
|
for i in range(expectRows):
|
||||||
|
totalConsumeRows += resultList[i]
|
||||||
|
|
||||||
|
tdSql.query(queryString)
|
||||||
|
totalRowsFromQury = tdSql.getRows()
|
||||||
|
|
||||||
|
tdLog.info("act consume rows: %d, act query rows: %d"%(totalConsumeRows, totalRowsFromQury))
|
||||||
|
if (totalConsumeRows < totalRowsFromQury):
|
||||||
|
tdLog.exit("tmq consume rows error!")
|
||||||
|
|
||||||
|
tmqCom.waitSubscriptionExit(tdSql, topicFromDb)
|
||||||
|
tdSql.query("drop topic %s"%topicFromDb)
|
||||||
|
|
||||||
|
tdLog.printNoPrefix("======== test case 2 end ...... ")
|
||||||
|
|
||||||
|
def run(self):
|
||||||
|
# tdSql.prepare()
|
||||||
|
self.prepareTestEnv()
|
||||||
|
self.tmqCase1()
|
||||||
|
self.tmqCase2()
|
||||||
|
|
||||||
|
def stop(self):
|
||||||
|
tdSql.close()
|
||||||
|
tdLog.success(f"{__file__} successfully executed")
|
||||||
|
|
||||||
|
event = threading.Event()
|
||||||
|
|
||||||
|
tdCases.addLinux(__file__, TDTestCase())
|
||||||
|
tdCases.addWindows(__file__, TDTestCase())
|
|
@ -207,6 +207,7 @@ python3 ./test.py -f 2-query/varchar.py -R
|
||||||
|
|
||||||
|
|
||||||
python3 ./test.py -f 1-insert/update_data.py
|
python3 ./test.py -f 1-insert/update_data.py
|
||||||
|
python3 ./test.py -f 1-insert/tb_100w_data_order.py
|
||||||
|
|
||||||
python3 ./test.py -f 1-insert/delete_data.py
|
python3 ./test.py -f 1-insert/delete_data.py
|
||||||
python3 ./test.py -f 1-insert/keep_expired.py
|
python3 ./test.py -f 1-insert/keep_expired.py
|
||||||
|
@ -262,25 +263,28 @@ python3 ./test.py -f 6-cluster/5dnode3mnodeStop2Follower.py -N 5 -M 3
|
||||||
python3 test.py -f 6-cluster/vnode/4dnode1mnode_basic_createDb_replica1.py -N 4 -M 1
|
python3 test.py -f 6-cluster/vnode/4dnode1mnode_basic_createDb_replica1.py -N 4 -M 1
|
||||||
python3 test.py -f 6-cluster/vnode/4dnode1mnode_basic_replica1_insertdatas.py -N 4 -M 1
|
python3 test.py -f 6-cluster/vnode/4dnode1mnode_basic_replica1_insertdatas.py -N 4 -M 1
|
||||||
python3 test.py -f 6-cluster/vnode/4dnode1mnode_basic_replica1_insertdatas_querys.py -N 4 -M 1
|
python3 test.py -f 6-cluster/vnode/4dnode1mnode_basic_replica1_insertdatas_querys.py -N 4 -M 1
|
||||||
# python3 test.py -f 6-cluster/vnode/4dnode1mnode_basic_replica3_insertdatas_force_stop_all_dnodes.py -N 4 -M 1
|
python3 test.py -f 6-cluster/vnode/4dnode1mnode_basic_replica3_insertdatas_force_stop_all_dnodes.py -N 4 -M 1
|
||||||
python3 test.py -f 6-cluster/vnode/4dnode1mnode_basic_replica3_insertdatas.py -N 4 -M 1
|
python3 test.py -f 6-cluster/vnode/4dnode1mnode_basic_replica3_insertdatas.py -N 4 -M 1
|
||||||
# python3 test.py -f 6-cluster/vnode/4dnode1mnode_basic_replica3_insertdatas_querys_loop_restart_all_vnode.py -N 4 -M 1
|
python3 test.py -f 6-cluster/vnode/4dnode1mnode_basic_replica3_insertdatas_querys_loop_restart_all_vnode.py -N 4 -M 1
|
||||||
# python3 test.py -f 6-cluster/vnode/4dnode1mnode_basic_replica3_insertdatas_querys_loop_restart_follower.py -N 4 -M 1
|
python3 test.py -f 6-cluster/vnode/4dnode1mnode_basic_replica3_insertdatas_querys_loop_restart_follower.py -N 4 -M 1
|
||||||
# python3 test.py -f 6-cluster/vnode/4dnode1mnode_basic_replica3_insertdatas_querys_loop_restart_leader.py -N 4 -M 1
|
python3 test.py -f 6-cluster/vnode/4dnode1mnode_basic_replica3_insertdatas_querys_loop_restart_leader.py -N 4 -M 1
|
||||||
python3 test.py -f 6-cluster/vnode/4dnode1mnode_basic_replica3_insertdatas_querys.py -N 4 -M 1
|
python3 test.py -f 6-cluster/vnode/4dnode1mnode_basic_replica3_insertdatas_querys.py -N 4 -M 1
|
||||||
# python3 test.py -f 6-cluster/vnode/4dnode1mnode_basic_replica3_insertdatas_stop_all_dnodes.py -N 4 -M 1
|
python3 test.py -f 6-cluster/vnode/4dnode1mnode_basic_replica3_insertdatas_stop_all_dnodes.py -N 4 -M 1
|
||||||
# python3 test.py -f 6-cluster/vnode/4dnode1mnode_basic_replica3_insertdatas_stop_follower_sync.py -N 4 -M 1
|
|
||||||
|
|
||||||
|
python3 test.py -f 6-cluster/vnode/4dnode1mnode_basic_replica3_insertdatas_stop_follower_sync.py -N 4 -M 1
|
||||||
# python3 test.py -f 6-cluster/vnode/4dnode1mnode_basic_replica3_insertdatas_stop_follower_unsync_force_stop.py -N 4 -M 1
|
# python3 test.py -f 6-cluster/vnode/4dnode1mnode_basic_replica3_insertdatas_stop_follower_unsync_force_stop.py -N 4 -M 1
|
||||||
# python3 test.py -f 6-cluster/vnode/4dnode1mnode_basic_replica3_insertdatas_stop_follower_unsync.py -N 4 -M 1
|
# python3 test.py -f 6-cluster/vnode/4dnode1mnode_basic_replica3_insertdatas_stop_follower_unsync.py -N 4 -M 1
|
||||||
# python3 test.py -f 6-cluster/vnode/4dnode1mnode_basic_replica3_insertdatas_stop_leader_forece_stop.py -N 4 -M 1
|
python3 test.py -f 6-cluster/vnode/4dnode1mnode_basic_replica3_insertdatas_stop_leader_forece_stop.py -N 4 -M 1
|
||||||
python3 test.py -f 6-cluster/vnode/4dnode1mnode_basic_replica3_insertdatas_stop_leader.py -N 4 -M 1
|
# python3 test.py -f 6-cluster/vnode/4dnode1mnode_basic_replica3_insertdatas_stop_leader.py -N 4 -M 1
|
||||||
# python3 test.py -f 6-cluster/vnode/4dnode1mnode_basic_replica3_mnode3_insertdatas_querys.py -N 4 -M 1
|
# python3 test.py -f 6-cluster/vnode/4dnode1mnode_basic_replica3_mnode3_insertdatas_querys.py -N 4 -M 1
|
||||||
# python3 test.py -f 6-cluster/vnode/4dnode1mnode_basic_replica3_querydatas_stop_follower_force_stop.py -N 4 -M 1
|
python3 test.py -f 6-cluster/vnode/4dnode1mnode_basic_replica3_querydatas_stop_follower_force_stop.py -N 4 -M 1
|
||||||
# python3 test.py -f 6-cluster/vnode/4dnode1mnode_basic_replica3_querydatas_stop_follower.py -N 4 -M 1
|
python3 test.py -f 6-cluster/vnode/4dnode1mnode_basic_replica3_querydatas_stop_follower.py -N 4 -M 1
|
||||||
# python3 test.py -f 6-cluster/vnode/4dnode1mnode_basic_replica3_querydatas_stop_leader_force_stop.py -N 4 -M 1
|
# python3 test.py -f 6-cluster/vnode/4dnode1mnode_basic_replica3_querydatas_stop_leader_force_stop.py -N 4 -M 1
|
||||||
# python3 test.py -f 6-cluster/vnode/4dnode1mnode_basic_replica3_querydatas_stop_leader.py -N 4 -M 1
|
python3 test.py -f 6-cluster/vnode/4dnode1mnode_basic_replica3_querydatas_stop_leader.py -N 4 -M 1
|
||||||
python3 test.py -f 6-cluster/vnode/4dnode1mnode_basic_replica3_vgroups.py -N 4 -M 1
|
python3 test.py -f 6-cluster/vnode/4dnode1mnode_basic_replica3_vgroups.py -N 4 -M 1
|
||||||
# python3 test.py -f 6-cluster/vnode/4dnode1mnode_basic_replica3_vgroups_stopOne.py -N 4 -M 1
|
python3 test.py -f 6-cluster/vnode/4dnode1mnode_basic_replica3_vgroups_stopOne.py -N 4 -M 1
|
||||||
|
|
||||||
|
|
||||||
python3 ./test.py -f 7-tmq/create_wrong_topic.py
|
python3 ./test.py -f 7-tmq/create_wrong_topic.py
|
||||||
python3 ./test.py -f 7-tmq/dropDbR3ConflictTransaction.py -N 3
|
python3 ./test.py -f 7-tmq/dropDbR3ConflictTransaction.py -N 3
|
||||||
|
@ -593,7 +597,7 @@ python3 ./test.py -f 2-query/arccos.py -Q 4
|
||||||
python3 ./test.py -f 2-query/arctan.py -Q 4
|
python3 ./test.py -f 2-query/arctan.py -Q 4
|
||||||
python3 ./test.py -f 2-query/query_cols_tags_and_or.py -Q 4
|
python3 ./test.py -f 2-query/query_cols_tags_and_or.py -Q 4
|
||||||
|
|
||||||
#python3 ./test.py -f 2-query/nestedQuery.py -Q 4
|
python3 ./test.py -f 2-query/nestedQuery.py -Q 4
|
||||||
python3 ./test.py -f 2-query/nestedQuery_str.py -Q 4
|
python3 ./test.py -f 2-query/nestedQuery_str.py -Q 4
|
||||||
python3 ./test.py -f 2-query/nestedQuery_math.py -Q 4
|
python3 ./test.py -f 2-query/nestedQuery_math.py -Q 4
|
||||||
python3 ./test.py -f 2-query/nestedQuery_time.py -Q 4
|
python3 ./test.py -f 2-query/nestedQuery_time.py -Q 4
|
||||||
|
|
|
@ -3,29 +3,11 @@ IF (TD_WEBSOCKET)
|
||||||
SET(websocket_lib_file "libtaosws.so")
|
SET(websocket_lib_file "libtaosws.so")
|
||||||
ELSEIF (TD_DARWIN)
|
ELSEIF (TD_DARWIN)
|
||||||
SET(websocket_lib_file "libtaosws.dylib")
|
SET(websocket_lib_file "libtaosws.dylib")
|
||||||
|
ELSEIF (TD_WINDOWS)
|
||||||
|
SET(websocket_lib_file "{taosws.dll,taosws.dll.lib}")
|
||||||
ENDIF ()
|
ENDIF ()
|
||||||
MESSAGE("${Green} use libtaos-ws${ColourReset}")
|
MESSAGE("${Green} use libtaos-ws${ColourReset}")
|
||||||
IF (EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/taosws-rs/target/release/${websocket_lib_file}" OR "${CMAKE_CURRENT_SOURCE_DIR}/taosws-rs/target/release/${websocket_lib_file}" IS_NEWER_THAN "${CMAKE_SOURCE_DIR}/.git/modules/tools/taosws-rs/FETCH_HEAD")
|
|
||||||
include(ExternalProject)
|
|
||||||
ExternalProject_Add(taosws-rs
|
|
||||||
PREFIX "taosws-rs"
|
|
||||||
SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/taosws-rs
|
|
||||||
BUILD_ALWAYS off
|
|
||||||
DEPENDS taos
|
|
||||||
BUILD_IN_SOURCE 1
|
|
||||||
CONFIGURE_COMMAND cmake -E echo "taosws-rs no need cmake to config"
|
|
||||||
PATCH_COMMAND
|
|
||||||
COMMAND git clean -f -d
|
|
||||||
BUILD_COMMAND
|
|
||||||
COMMAND cargo update
|
|
||||||
COMMAND cargo build --release -p taos-ws-sys --features native-tls-vendored
|
|
||||||
COMMAND ./taos-ws-sys/ci/package.sh
|
|
||||||
INSTALL_COMMAND
|
|
||||||
COMMAND cmake -E copy target/libtaosws/${websocket_lib_file} ${CMAKE_BINARY_DIR}/build/lib
|
|
||||||
COMMAND cmake -E make_directory ${CMAKE_BINARY_DIR}/build/include
|
|
||||||
COMMAND cmake -E copy target/libtaosws/taosws.h ${CMAKE_BINARY_DIR}/build/include
|
|
||||||
)
|
|
||||||
ELSE()
|
|
||||||
include(ExternalProject)
|
include(ExternalProject)
|
||||||
ExternalProject_Add(taosws-rs
|
ExternalProject_Add(taosws-rs
|
||||||
PREFIX "taosws-rs"
|
PREFIX "taosws-rs"
|
||||||
|
@ -39,13 +21,11 @@ IF (TD_WEBSOCKET)
|
||||||
BUILD_COMMAND
|
BUILD_COMMAND
|
||||||
COMMAND cargo update
|
COMMAND cargo update
|
||||||
COMMAND cargo build --release -p taos-ws-sys --features native-tls-vendored
|
COMMAND cargo build --release -p taos-ws-sys --features native-tls-vendored
|
||||||
COMMAND ./taos-ws-sys/ci/package.sh
|
|
||||||
INSTALL_COMMAND
|
INSTALL_COMMAND
|
||||||
COMMAND cmake -E copy target/libtaosws/${websocket_lib_file} ${CMAKE_BINARY_DIR}/build/lib
|
COMMAND cp target/release/${websocket_lib_file} ${CMAKE_BINARY_DIR}/build/lib
|
||||||
COMMAND cmake -E make_directory ${CMAKE_BINARY_DIR}/build/include
|
COMMAND cmake -E make_directory ${CMAKE_BINARY_DIR}/build/include
|
||||||
COMMAND cmake -E copy target/libtaosws/taosws.h ${CMAKE_BINARY_DIR}/build/include
|
COMMAND cmake -E copy target/release/taosws.h ${CMAKE_BINARY_DIR}/build/include
|
||||||
)
|
)
|
||||||
ENDIF ()
|
|
||||||
ENDIF ()
|
ENDIF ()
|
||||||
|
|
||||||
IF (TD_TAOS_TOOLS)
|
IF (TD_TAOS_TOOLS)
|
||||||
|
|
|
@ -10,6 +10,10 @@ ELSEIF (TD_DARWIN AND TD_WEBSOCKET)
|
||||||
ADD_DEFINITIONS(-DWEBSOCKET -I${CMAKE_BINARY_DIR}/build/include)
|
ADD_DEFINITIONS(-DWEBSOCKET -I${CMAKE_BINARY_DIR}/build/include)
|
||||||
SET(LINK_WEBSOCKET "${CMAKE_BINARY_DIR}/build/lib/libtaosws.dylib")
|
SET(LINK_WEBSOCKET "${CMAKE_BINARY_DIR}/build/lib/libtaosws.dylib")
|
||||||
ADD_DEPENDENCIES(shell taosws-rs)
|
ADD_DEPENDENCIES(shell taosws-rs)
|
||||||
|
ELSEIF (TD_WINDOWS AND TD_WEBSOCKET)
|
||||||
|
ADD_DEFINITIONS(-DWEBSOCKET -I${CMAKE_BINARY_DIR}/build/include)
|
||||||
|
SET(LINK_WEBSOCKET "${CMAKE_BINARY_DIR}/build/lib/taosws.dll.lib")
|
||||||
|
ADD_DEPENDENCIES(shell taosws-rs)
|
||||||
ELSE ()
|
ELSE ()
|
||||||
SET(LINK_WEBSOCKET "")
|
SET(LINK_WEBSOCKET "")
|
||||||
ENDIF ()
|
ENDIF ()
|
||||||
|
|
Loading…
Reference in New Issue