Merge branch '3.0' into feat/TD-22746
This commit is contained in:
commit
f5ebc17fae
|
@ -119,6 +119,9 @@ ELSE ()
|
||||||
SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Werror -Werror=return-type -fPIC -gdwarf-2 -fsanitize=address -fsanitize=undefined -fsanitize-recover=all -fsanitize=float-divide-by-zero -fsanitize=float-cast-overflow -fno-sanitize=shift-base -fno-sanitize=alignment -g3 -Wformat=0")
|
SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Werror -Werror=return-type -fPIC -gdwarf-2 -fsanitize=address -fsanitize=undefined -fsanitize-recover=all -fsanitize=float-divide-by-zero -fsanitize=float-cast-overflow -fno-sanitize=shift-base -fno-sanitize=alignment -g3 -Wformat=0")
|
||||||
SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-literal-suffix -Werror=return-type -fPIC -gdwarf-2 -fsanitize=address -fsanitize=undefined -fsanitize-recover=all -fsanitize=float-divide-by-zero -fsanitize=float-cast-overflow -fno-sanitize=shift-base -fno-sanitize=alignment -g3 -Wformat=0")
|
SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-literal-suffix -Werror=return-type -fPIC -gdwarf-2 -fsanitize=address -fsanitize=undefined -fsanitize-recover=all -fsanitize=float-divide-by-zero -fsanitize=float-cast-overflow -fno-sanitize=shift-base -fno-sanitize=alignment -g3 -Wformat=0")
|
||||||
MESSAGE(STATUS "Compile with Address Sanitizer!")
|
MESSAGE(STATUS "Compile with Address Sanitizer!")
|
||||||
|
ELSEIF (${BUILD_RELEASE})
|
||||||
|
SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Werror -Werror=return-type -fPIC -O3 -Wformat=2 -Wno-format-nonliteral -Wno-format-truncation -Wno-format-y2k")
|
||||||
|
SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Werror -Wno-reserved-user-defined-literal -Wno-literal-suffix -Werror=return-type -fPIC -O3 -Wformat=2 -Wno-format-nonliteral -Wno-format-truncation -Wno-format-y2k")
|
||||||
ELSE ()
|
ELSE ()
|
||||||
SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Werror -Werror=return-type -fPIC -gdwarf-2 -g3 -Wformat=2 -Wno-format-nonliteral -Wno-format-truncation -Wno-format-y2k")
|
SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Werror -Werror=return-type -fPIC -gdwarf-2 -g3 -Wformat=2 -Wno-format-nonliteral -Wno-format-truncation -Wno-format-y2k")
|
||||||
SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-reserved-user-defined-literal -Wno-literal-suffix -Werror=return-type -fPIC -gdwarf-2 -g3 -Wformat=2 -Wno-format-nonliteral -Wno-format-truncation -Wno-format-y2k")
|
SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-reserved-user-defined-literal -Wno-literal-suffix -Werror=return-type -fPIC -gdwarf-2 -g3 -Wformat=2 -Wno-format-nonliteral -Wno-format-truncation -Wno-format-y2k")
|
||||||
|
|
|
@ -171,3 +171,8 @@ option(
|
||||||
ON
|
ON
|
||||||
)
|
)
|
||||||
|
|
||||||
|
option(
|
||||||
|
BUILD_RELEASE
|
||||||
|
"If build release version"
|
||||||
|
OFF
|
||||||
|
)
|
||||||
|
|
|
@ -1,8 +1,8 @@
|
||||||
|
|
||||||
# rocksdb
|
# rocksdb
|
||||||
ExternalProject_Add(rocksdb
|
ExternalProject_Add(rocksdb
|
||||||
GIT_REPOSITORY https://github.com/taosdata-contrib/rocksdb.git
|
GIT_REPOSITORY https://github.com/facebook/rocksdb.git
|
||||||
GIT_TAG v6.23.3
|
GIT_TAG v8.1.1
|
||||||
SOURCE_DIR "${TD_CONTRIB_DIR}/rocksdb"
|
SOURCE_DIR "${TD_CONTRIB_DIR}/rocksdb"
|
||||||
CONFIGURE_COMMAND ""
|
CONFIGURE_COMMAND ""
|
||||||
BUILD_COMMAND ""
|
BUILD_COMMAND ""
|
||||||
|
|
|
@ -310,6 +310,7 @@ DLL_EXPORT void tmq_conf_set_auto_commit_cb(tmq_conf_t *conf, tmq_comm
|
||||||
DLL_EXPORT const char *tmq_get_topic_name(TAOS_RES *res);
|
DLL_EXPORT const char *tmq_get_topic_name(TAOS_RES *res);
|
||||||
DLL_EXPORT const char *tmq_get_db_name(TAOS_RES *res);
|
DLL_EXPORT const char *tmq_get_db_name(TAOS_RES *res);
|
||||||
DLL_EXPORT int32_t tmq_get_vgroup_id(TAOS_RES *res);
|
DLL_EXPORT int32_t tmq_get_vgroup_id(TAOS_RES *res);
|
||||||
|
DLL_EXPORT int64_t tmq_get_vgroup_offset(TAOS_RES* res);
|
||||||
|
|
||||||
/* ------------------------------ TAOSX -----------------------------------*/
|
/* ------------------------------ TAOSX -----------------------------------*/
|
||||||
// note: following apis are unstable
|
// note: following apis are unstable
|
||||||
|
|
|
@ -952,6 +952,9 @@ int32_t tSerializeSVDropTtlTableReq(void* buf, int32_t bufLen, SVDropTtlTableReq
|
||||||
int32_t tDeserializeSVDropTtlTableReq(void* buf, int32_t bufLen, SVDropTtlTableReq* pReq);
|
int32_t tDeserializeSVDropTtlTableReq(void* buf, int32_t bufLen, SVDropTtlTableReq* pReq);
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
|
char db[TSDB_DB_FNAME_LEN];
|
||||||
|
int64_t dbId;
|
||||||
|
int32_t cfgVersion;
|
||||||
int32_t numOfVgroups;
|
int32_t numOfVgroups;
|
||||||
int32_t numOfStables;
|
int32_t numOfStables;
|
||||||
int32_t buffer;
|
int32_t buffer;
|
||||||
|
@ -984,8 +987,13 @@ typedef struct {
|
||||||
int16_t sstTrigger;
|
int16_t sstTrigger;
|
||||||
} SDbCfgRsp;
|
} SDbCfgRsp;
|
||||||
|
|
||||||
|
typedef SDbCfgRsp SDbCfgInfo;
|
||||||
|
|
||||||
|
int32_t tSerializeSDbCfgRspImpl(SEncoder *encoder, const SDbCfgRsp *pRsp);
|
||||||
int32_t tSerializeSDbCfgRsp(void* buf, int32_t bufLen, const SDbCfgRsp* pRsp);
|
int32_t tSerializeSDbCfgRsp(void* buf, int32_t bufLen, const SDbCfgRsp* pRsp);
|
||||||
int32_t tDeserializeSDbCfgRsp(void* buf, int32_t bufLen, SDbCfgRsp* pRsp);
|
int32_t tDeserializeSDbCfgRsp(void* buf, int32_t bufLen, SDbCfgRsp* pRsp);
|
||||||
|
int32_t tDeserializeSDbCfgRspImpl(SDecoder* decoder, SDbCfgRsp *pRsp);
|
||||||
|
void tFreeSDbCfgRsp(SDbCfgRsp *pRsp);
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
int32_t rowNum;
|
int32_t rowNum;
|
||||||
|
@ -1042,12 +1050,17 @@ int32_t tDeserializeSDnodeListRsp(void* buf, int32_t bufLen, SDnodeListRsp* pRsp
|
||||||
void tFreeSDnodeListRsp(SDnodeListRsp* pRsp);
|
void tFreeSDnodeListRsp(SDnodeListRsp* pRsp);
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
SArray* pArray; // Array of SUseDbRsp
|
SUseDbRsp *useDbRsp;
|
||||||
} SUseDbBatchRsp;
|
SDbCfgRsp *cfgRsp;
|
||||||
|
} SDbHbRsp;
|
||||||
|
|
||||||
int32_t tSerializeSUseDbBatchRsp(void* buf, int32_t bufLen, SUseDbBatchRsp* pRsp);
|
typedef struct {
|
||||||
int32_t tDeserializeSUseDbBatchRsp(void* buf, int32_t bufLen, SUseDbBatchRsp* pRsp);
|
SArray* pArray; // Array of SDbHbRsp
|
||||||
void tFreeSUseDbBatchRsp(SUseDbBatchRsp* pRsp);
|
} SDbHbBatchRsp;
|
||||||
|
|
||||||
|
int32_t tSerializeSDbHbBatchRsp(void* buf, int32_t bufLen, SDbHbBatchRsp* pRsp);
|
||||||
|
int32_t tDeserializeSDbHbBatchRsp(void* buf, int32_t bufLen, SDbHbBatchRsp* pRsp);
|
||||||
|
void tFreeSDbHbBatchRsp(SDbHbBatchRsp* pRsp);
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
SArray* pArray; // Array of SGetUserAuthRsp
|
SArray* pArray; // Array of SGetUserAuthRsp
|
||||||
|
|
|
@ -129,13 +129,14 @@ typedef struct SSTableVersion {
|
||||||
int32_t smaVer;
|
int32_t smaVer;
|
||||||
} SSTableVersion;
|
} SSTableVersion;
|
||||||
|
|
||||||
typedef struct SDbVgVersion {
|
typedef struct SDbCacheInfo {
|
||||||
char dbFName[TSDB_DB_FNAME_LEN];
|
char dbFName[TSDB_DB_FNAME_LEN];
|
||||||
int64_t dbId;
|
int64_t dbId;
|
||||||
int32_t vgVersion;
|
int32_t vgVersion;
|
||||||
|
int32_t cfgVersion;
|
||||||
int32_t numOfTable; // unit is TSDB_TABLE_NUM_UNIT
|
int32_t numOfTable; // unit is TSDB_TABLE_NUM_UNIT
|
||||||
int64_t stateTs;
|
int64_t stateTs;
|
||||||
} SDbVgVersion;
|
} SDbCacheInfo;
|
||||||
|
|
||||||
typedef struct STbSVersion {
|
typedef struct STbSVersion {
|
||||||
char* tbFName;
|
char* tbFName;
|
||||||
|
@ -148,7 +149,6 @@ typedef struct SUserAuthVersion {
|
||||||
int32_t version;
|
int32_t version;
|
||||||
} SUserAuthVersion;
|
} SUserAuthVersion;
|
||||||
|
|
||||||
typedef SDbCfgRsp SDbCfgInfo;
|
|
||||||
typedef SUserIndexRsp SIndexInfo;
|
typedef SUserIndexRsp SIndexInfo;
|
||||||
|
|
||||||
typedef void (*catalogCallback)(SMetaData* pResult, void* param, int32_t code);
|
typedef void (*catalogCallback)(SMetaData* pResult, void* param, int32_t code);
|
||||||
|
@ -180,6 +180,8 @@ int32_t catalogGetDBVgInfo(SCatalog* pCtg, SRequestConnInfo* pConn, const char*
|
||||||
|
|
||||||
int32_t catalogUpdateDBVgInfo(SCatalog* pCatalog, const char* dbName, uint64_t dbId, SDBVgInfo* dbInfo);
|
int32_t catalogUpdateDBVgInfo(SCatalog* pCatalog, const char* dbName, uint64_t dbId, SDBVgInfo* dbInfo);
|
||||||
|
|
||||||
|
int32_t catalogUpdateDbCfg(SCatalog* pCtg, const char* dbFName, uint64_t dbId, SDbCfgInfo* cfgInfo);
|
||||||
|
|
||||||
int32_t catalogRemoveDB(SCatalog* pCatalog, const char* dbName, uint64_t dbId);
|
int32_t catalogRemoveDB(SCatalog* pCatalog, const char* dbName, uint64_t dbId);
|
||||||
|
|
||||||
int32_t catalogRemoveTableMeta(SCatalog* pCtg, SName* pTableName);
|
int32_t catalogRemoveTableMeta(SCatalog* pCtg, SName* pTableName);
|
||||||
|
@ -304,7 +306,7 @@ int32_t catalogGetDnodeList(SCatalog* pCatalog, SRequestConnInfo* pConn, SArray*
|
||||||
|
|
||||||
int32_t catalogGetExpiredSTables(SCatalog* pCatalog, SSTableVersion** stables, uint32_t* num);
|
int32_t catalogGetExpiredSTables(SCatalog* pCatalog, SSTableVersion** stables, uint32_t* num);
|
||||||
|
|
||||||
int32_t catalogGetExpiredDBs(SCatalog* pCatalog, SDbVgVersion** dbs, uint32_t* num);
|
int32_t catalogGetExpiredDBs(SCatalog* pCatalog, SDbCacheInfo** dbs, uint32_t* num);
|
||||||
|
|
||||||
int32_t catalogGetExpiredUsers(SCatalog* pCtg, SUserAuthVersion** users, uint32_t* num);
|
int32_t catalogGetExpiredUsers(SCatalog* pCtg, SUserAuthVersion** users, uint32_t* num);
|
||||||
|
|
||||||
|
|
|
@ -230,6 +230,7 @@ typedef enum EFuncDataRequired {
|
||||||
FUNC_DATA_REQUIRED_SMA_LOAD,
|
FUNC_DATA_REQUIRED_SMA_LOAD,
|
||||||
FUNC_DATA_REQUIRED_NOT_LOAD,
|
FUNC_DATA_REQUIRED_NOT_LOAD,
|
||||||
FUNC_DATA_REQUIRED_FILTEROUT,
|
FUNC_DATA_REQUIRED_FILTEROUT,
|
||||||
|
FUNC_DATA_REQUIRED_ALL_FILTEROUT,
|
||||||
} EFuncDataRequired;
|
} EFuncDataRequired;
|
||||||
|
|
||||||
EFuncDataRequired fmFuncDataRequired(SFunctionNode* pFunc, STimeWindow* pTimeWindow);
|
EFuncDataRequired fmFuncDataRequired(SFunctionNode* pFunc, STimeWindow* pTimeWindow);
|
||||||
|
|
|
@ -313,6 +313,7 @@ void nodesDestroyAllocator(int64_t allocatorId);
|
||||||
|
|
||||||
SNode* nodesMakeNode(ENodeType type);
|
SNode* nodesMakeNode(ENodeType type);
|
||||||
void nodesDestroyNode(SNode* pNode);
|
void nodesDestroyNode(SNode* pNode);
|
||||||
|
void nodesFree(void* p);
|
||||||
|
|
||||||
SNodeList* nodesMakeList();
|
SNodeList* nodesMakeList();
|
||||||
int32_t nodesListAppend(SNodeList* pList, SNode* pNode);
|
int32_t nodesListAppend(SNodeList* pList, SNode* pNode);
|
||||||
|
|
|
@ -256,6 +256,7 @@ int32_t cloneTableMeta(STableMeta* pSrc, STableMeta** pDst);
|
||||||
int32_t cloneDbVgInfo(SDBVgInfo* pSrc, SDBVgInfo** pDst);
|
int32_t cloneDbVgInfo(SDBVgInfo* pSrc, SDBVgInfo** pDst);
|
||||||
int32_t cloneSVreateTbReq(SVCreateTbReq* pSrc, SVCreateTbReq** pDst);
|
int32_t cloneSVreateTbReq(SVCreateTbReq* pSrc, SVCreateTbReq** pDst);
|
||||||
void freeVgInfo(SDBVgInfo* vgInfo);
|
void freeVgInfo(SDBVgInfo* vgInfo);
|
||||||
|
void freeDbCfgInfo(SDbCfgInfo *pInfo);
|
||||||
|
|
||||||
extern int32_t (*queryBuildMsg[TDMT_MAX])(void* input, char** msg, int32_t msgSize, int32_t* msgLen,
|
extern int32_t (*queryBuildMsg[TDMT_MAX])(void* input, char** msg, int32_t msgSize, int32_t* msgLen,
|
||||||
void* (*mallocFp)(int64_t));
|
void* (*mallocFp)(int64_t));
|
||||||
|
|
|
@ -134,7 +134,6 @@ typedef struct {
|
||||||
typedef struct {
|
typedef struct {
|
||||||
int8_t type;
|
int8_t type;
|
||||||
int64_t ver;
|
int64_t ver;
|
||||||
int32_t* dataRef;
|
|
||||||
SSDataBlock* pBlock;
|
SSDataBlock* pBlock;
|
||||||
} SStreamRefDataBlock;
|
} SStreamRefDataBlock;
|
||||||
|
|
||||||
|
|
|
@ -135,6 +135,7 @@ typedef struct {
|
||||||
int8_t scanUncommited;
|
int8_t scanUncommited;
|
||||||
int8_t scanNotApplied;
|
int8_t scanNotApplied;
|
||||||
int8_t scanMeta;
|
int8_t scanMeta;
|
||||||
|
int8_t deleteMsg;
|
||||||
int8_t enableRef;
|
int8_t enableRef;
|
||||||
} SWalFilterCond;
|
} SWalFilterCond;
|
||||||
|
|
||||||
|
@ -212,8 +213,7 @@ SWalRef *walRefCommittedVer(SWal *);
|
||||||
|
|
||||||
SWalRef *walOpenRef(SWal *);
|
SWalRef *walOpenRef(SWal *);
|
||||||
void walCloseRef(SWal *pWal, int64_t refId);
|
void walCloseRef(SWal *pWal, int64_t refId);
|
||||||
int32_t walRefVer(SWalRef *, int64_t ver);
|
int32_t walSetRefVer(SWalRef *, int64_t ver);
|
||||||
void walUnrefVer(SWalRef *);
|
|
||||||
|
|
||||||
// helper function for raft
|
// helper function for raft
|
||||||
bool walLogExist(SWal *, int64_t ver);
|
bool walLogExist(SWal *, int64_t ver);
|
||||||
|
|
|
@ -25,6 +25,7 @@ extern "C" {
|
||||||
// clang-format off
|
// clang-format off
|
||||||
#define tscFatal(...) do { if (cDebugFlag & DEBUG_FATAL) { taosPrintLog("TSC FATAL ", DEBUG_FATAL, cDebugFlag, __VA_ARGS__); }} while(0)
|
#define tscFatal(...) do { if (cDebugFlag & DEBUG_FATAL) { taosPrintLog("TSC FATAL ", DEBUG_FATAL, cDebugFlag, __VA_ARGS__); }} while(0)
|
||||||
#define tscError(...) do { if (cDebugFlag & DEBUG_ERROR) { taosPrintLog("TSC ERROR ", DEBUG_ERROR, cDebugFlag, __VA_ARGS__); }} while(0)
|
#define tscError(...) do { if (cDebugFlag & DEBUG_ERROR) { taosPrintLog("TSC ERROR ", DEBUG_ERROR, cDebugFlag, __VA_ARGS__); }} while(0)
|
||||||
|
#define tscErrorL(...) do { if (cDebugFlag & DEBUG_ERROR) { taosPrintLongString("TSC ERROR ", DEBUG_ERROR, cDebugFlag, __VA_ARGS__); }} while(0)
|
||||||
#define tscWarn(...) do { if (cDebugFlag & DEBUG_WARN) { taosPrintLog("TSC WARN ", DEBUG_WARN, cDebugFlag, __VA_ARGS__); }} while(0)
|
#define tscWarn(...) do { if (cDebugFlag & DEBUG_WARN) { taosPrintLog("TSC WARN ", DEBUG_WARN, cDebugFlag, __VA_ARGS__); }} while(0)
|
||||||
#define tscWarnL(...) do { if (cDebugFlag & DEBUG_WARN) { taosPrintLongString("TSC WARN ", DEBUG_WARN, cDebugFlag, __VA_ARGS__); }} while(0)
|
#define tscWarnL(...) do { if (cDebugFlag & DEBUG_WARN) { taosPrintLongString("TSC WARN ", DEBUG_WARN, cDebugFlag, __VA_ARGS__); }} while(0)
|
||||||
#define tscInfo(...) do { if (cDebugFlag & DEBUG_INFO) { taosPrintLog("TSC ", DEBUG_INFO, cDebugFlag, __VA_ARGS__); }} while(0)
|
#define tscInfo(...) do { if (cDebugFlag & DEBUG_INFO) { taosPrintLog("TSC ", DEBUG_INFO, cDebugFlag, __VA_ARGS__); }} while(0)
|
||||||
|
@ -32,6 +33,8 @@ extern "C" {
|
||||||
#define tscTrace(...) do { if (cDebugFlag & DEBUG_TRACE) { taosPrintLog("TSC ", DEBUG_TRACE, cDebugFlag, __VA_ARGS__); }} while(0)
|
#define tscTrace(...) do { if (cDebugFlag & DEBUG_TRACE) { taosPrintLog("TSC ", DEBUG_TRACE, cDebugFlag, __VA_ARGS__); }} while(0)
|
||||||
#define tscDebugL(...) do { if (cDebugFlag & DEBUG_DEBUG) { taosPrintLongString("TSC ", DEBUG_DEBUG, cDebugFlag, __VA_ARGS__); }} while(0)
|
#define tscDebugL(...) do { if (cDebugFlag & DEBUG_DEBUG) { taosPrintLongString("TSC ", DEBUG_DEBUG, cDebugFlag, __VA_ARGS__); }} while(0)
|
||||||
#define tscPerf(...) do { if (cDebugFlag & DEBUG_INFO) { taosPrintLog("TSC ", 0, cDebugFlag, __VA_ARGS__); }} while(0)
|
#define tscPerf(...) do { if (cDebugFlag & DEBUG_INFO) { taosPrintLog("TSC ", 0, cDebugFlag, __VA_ARGS__); }} while(0)
|
||||||
|
#define tscLog(...) do { taosPrintLog("TSC ", 0, DEBUG_FILE, __VA_ARGS__); } while(0)
|
||||||
|
#define tscLogL(...) do { taosPrintLongString("TSC ", 0, DEBUG_FILE, __VA_ARGS__); } while(0)
|
||||||
// clang-format on
|
// clang-format on
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
|
|
|
@ -110,7 +110,7 @@ static void deregisterRequest(SRequestObj *pRequest) {
|
||||||
if (duration >= (tsSlowLogThreshold * 1000000UL)) {
|
if (duration >= (tsSlowLogThreshold * 1000000UL)) {
|
||||||
atomic_add_fetch_64((int64_t *)&pActivity->numOfSlowQueries, 1);
|
atomic_add_fetch_64((int64_t *)&pActivity->numOfSlowQueries, 1);
|
||||||
if (tsSlowLogScope & reqType) {
|
if (tsSlowLogScope & reqType) {
|
||||||
taosPrintSlowLog("PID:%d, Conn:%u, QID:0x%" PRIx64 ", Start:%" PRId64 ", Duration:%" PRId64 "us, SQL:%s",
|
taosPrintSlowLog("PID:%d, Conn:%u, QID:0x%" PRIx64 ", Start:%" PRId64 ", Duration:%" PRId64 "us, SQL:%s",
|
||||||
taosGetPId(), pTscObj->connId, pRequest->requestId, pRequest->metric.start, duration, pRequest->sqlstr);
|
taosGetPId(), pTscObj->connId, pRequest->requestId, pRequest->metric.start, duration, pRequest->sqlstr);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -449,6 +449,7 @@ static void *tscCrashReportThreadFp(void *param) {
|
||||||
tscError("failed to send crash report");
|
tscError("failed to send crash report");
|
||||||
if (pFile) {
|
if (pFile) {
|
||||||
taosReleaseCrashLogFile(pFile, false);
|
taosReleaseCrashLogFile(pFile, false);
|
||||||
|
pFile = NULL;
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
@ -468,6 +469,7 @@ static void *tscCrashReportThreadFp(void *param) {
|
||||||
|
|
||||||
if (pFile) {
|
if (pFile) {
|
||||||
taosReleaseCrashLogFile(pFile, truncateFile);
|
taosReleaseCrashLogFile(pFile, truncateFile);
|
||||||
|
pFile = NULL;
|
||||||
truncateFile = false;
|
truncateFile = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -24,6 +24,8 @@ typedef struct {
|
||||||
struct {
|
struct {
|
||||||
int64_t clusterId;
|
int64_t clusterId;
|
||||||
int32_t passKeyCnt;
|
int32_t passKeyCnt;
|
||||||
|
int32_t passVer;
|
||||||
|
int32_t reqCnt;
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
} SHbParam;
|
} SHbParam;
|
||||||
|
@ -149,48 +151,52 @@ _return:
|
||||||
static int32_t hbProcessDBInfoRsp(void *value, int32_t valueLen, struct SCatalog *pCatalog) {
|
static int32_t hbProcessDBInfoRsp(void *value, int32_t valueLen, struct SCatalog *pCatalog) {
|
||||||
int32_t code = 0;
|
int32_t code = 0;
|
||||||
|
|
||||||
SUseDbBatchRsp batchUseRsp = {0};
|
SDbHbBatchRsp batchRsp = {0};
|
||||||
if (tDeserializeSUseDbBatchRsp(value, valueLen, &batchUseRsp) != 0) {
|
if (tDeserializeSDbHbBatchRsp(value, valueLen, &batchRsp) != 0) {
|
||||||
terrno = TSDB_CODE_INVALID_MSG;
|
terrno = TSDB_CODE_INVALID_MSG;
|
||||||
return -1;
|
code = terrno;
|
||||||
|
goto _return;
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t numOfBatchs = taosArrayGetSize(batchUseRsp.pArray);
|
int32_t numOfBatchs = taosArrayGetSize(batchRsp.pArray);
|
||||||
for (int32_t i = 0; i < numOfBatchs; ++i) {
|
for (int32_t i = 0; i < numOfBatchs; ++i) {
|
||||||
SUseDbRsp *rsp = taosArrayGet(batchUseRsp.pArray, i);
|
SDbHbRsp *rsp = taosArrayGet(batchRsp.pArray, i);
|
||||||
tscDebug("hb db rsp, db:%s, vgVersion:%d, stateTs:%" PRId64 ", uid:%" PRIx64, rsp->db, rsp->vgVersion, rsp->stateTs,
|
if (rsp->useDbRsp) {
|
||||||
rsp->uid);
|
tscDebug("hb use db rsp, db:%s, vgVersion:%d, stateTs:%" PRId64 ", uid:%" PRIx64,
|
||||||
|
rsp->useDbRsp->db, rsp->useDbRsp->vgVersion, rsp->useDbRsp->stateTs, rsp->useDbRsp->uid);
|
||||||
|
|
||||||
if (rsp->vgVersion < 0) {
|
if (rsp->useDbRsp->vgVersion < 0) {
|
||||||
code = catalogRemoveDB(pCatalog, rsp->db, rsp->uid);
|
code = catalogRemoveDB(pCatalog, rsp->useDbRsp->db, rsp->useDbRsp->uid);
|
||||||
} else {
|
} else {
|
||||||
SDBVgInfo *vgInfo = NULL;
|
SDBVgInfo *vgInfo = NULL;
|
||||||
code = hbGenerateVgInfoFromRsp(&vgInfo, rsp);
|
code = hbGenerateVgInfoFromRsp(&vgInfo, rsp->useDbRsp);
|
||||||
if (TSDB_CODE_SUCCESS != code) {
|
|
||||||
goto _return;
|
|
||||||
}
|
|
||||||
|
|
||||||
catalogUpdateDBVgInfo(pCatalog, rsp->db, rsp->uid, vgInfo);
|
|
||||||
|
|
||||||
if (IS_SYS_DBNAME(rsp->db)) {
|
|
||||||
code = hbGenerateVgInfoFromRsp(&vgInfo, rsp);
|
|
||||||
if (TSDB_CODE_SUCCESS != code) {
|
if (TSDB_CODE_SUCCESS != code) {
|
||||||
goto _return;
|
goto _return;
|
||||||
}
|
}
|
||||||
|
|
||||||
catalogUpdateDBVgInfo(pCatalog, (rsp->db[0] == 'i') ? TSDB_PERFORMANCE_SCHEMA_DB : TSDB_INFORMATION_SCHEMA_DB,
|
catalogUpdateDBVgInfo(pCatalog, rsp->useDbRsp->db, rsp->useDbRsp->uid, vgInfo);
|
||||||
rsp->uid, vgInfo);
|
|
||||||
|
if (IS_SYS_DBNAME(rsp->useDbRsp->db)) {
|
||||||
|
code = hbGenerateVgInfoFromRsp(&vgInfo, rsp->useDbRsp);
|
||||||
|
if (TSDB_CODE_SUCCESS != code) {
|
||||||
|
goto _return;
|
||||||
|
}
|
||||||
|
|
||||||
|
catalogUpdateDBVgInfo(pCatalog, (rsp->useDbRsp->db[0] == 'i') ? TSDB_PERFORMANCE_SCHEMA_DB : TSDB_INFORMATION_SCHEMA_DB, rsp->useDbRsp->uid, vgInfo);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (code) {
|
if (rsp->cfgRsp) {
|
||||||
goto _return;
|
tscDebug("hb db cfg rsp, db:%s, cfgVersion:%d", rsp->cfgRsp->db, rsp->cfgRsp->cfgVersion);
|
||||||
|
catalogUpdateDbCfg(pCatalog, rsp->cfgRsp->db, rsp->cfgRsp->dbId, rsp->cfgRsp);
|
||||||
|
rsp->cfgRsp = NULL;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
_return:
|
_return:
|
||||||
|
|
||||||
tFreeSUseDbBatchRsp(&batchUseRsp);
|
tFreeSDbHbBatchRsp(&batchRsp);
|
||||||
return code;
|
return code;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -536,14 +542,20 @@ int32_t hbGetQueryBasicInfo(SClientHbKey *connKey, SClientHbReq *req) {
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int32_t hbGetUserBasicInfo(SClientHbKey *connKey, SClientHbReq *req) {
|
static int32_t hbGetUserBasicInfo(SClientHbKey *connKey, SHbParam *param, SClientHbReq *req) {
|
||||||
STscObj *pTscObj = (STscObj *)acquireTscObj(connKey->tscRid);
|
STscObj *pTscObj = (STscObj *)acquireTscObj(connKey->tscRid);
|
||||||
if (!pTscObj) {
|
if (!pTscObj) {
|
||||||
tscWarn("tscObj rid %" PRIx64 " not exist", connKey->tscRid);
|
tscWarn("tscObj rid %" PRIx64 " not exist", connKey->tscRid);
|
||||||
return TSDB_CODE_APP_ERROR;
|
return TSDB_CODE_APP_ERROR;
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t code = 0;
|
int32_t code = 0;
|
||||||
|
|
||||||
|
if (param && (param->passVer != INT32_MIN) && (param->passVer <= pTscObj->passInfo.ver)) {
|
||||||
|
tscDebug("hb got user basic info, no need since passVer %d <= %d", param->passVer, pTscObj->passInfo.ver);
|
||||||
|
goto _return;
|
||||||
|
}
|
||||||
|
|
||||||
SUserPassVersion *user = taosMemoryMalloc(sizeof(SUserPassVersion));
|
SUserPassVersion *user = taosMemoryMalloc(sizeof(SUserPassVersion));
|
||||||
if (!user) {
|
if (!user) {
|
||||||
code = TSDB_CODE_OUT_OF_MEMORY;
|
code = TSDB_CODE_OUT_OF_MEMORY;
|
||||||
|
@ -570,6 +582,11 @@ static int32_t hbGetUserBasicInfo(SClientHbKey *connKey, SClientHbReq *req) {
|
||||||
goto _return;
|
goto _return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// assign the passVer
|
||||||
|
if (param) {
|
||||||
|
param->passVer = pTscObj->passInfo.ver;
|
||||||
|
}
|
||||||
|
|
||||||
_return:
|
_return:
|
||||||
releaseTscObj(connKey->tscRid);
|
releaseTscObj(connKey->tscRid);
|
||||||
if (code) {
|
if (code) {
|
||||||
|
@ -617,7 +634,7 @@ int32_t hbGetExpiredUserInfo(SClientHbKey *connKey, struct SCatalog *pCatalog, S
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t hbGetExpiredDBInfo(SClientHbKey *connKey, struct SCatalog *pCatalog, SClientHbReq *req) {
|
int32_t hbGetExpiredDBInfo(SClientHbKey *connKey, struct SCatalog *pCatalog, SClientHbReq *req) {
|
||||||
SDbVgVersion *dbs = NULL;
|
SDbCacheInfo *dbs = NULL;
|
||||||
uint32_t dbNum = 0;
|
uint32_t dbNum = 0;
|
||||||
int32_t code = 0;
|
int32_t code = 0;
|
||||||
|
|
||||||
|
@ -632,19 +649,20 @@ int32_t hbGetExpiredDBInfo(SClientHbKey *connKey, struct SCatalog *pCatalog, SCl
|
||||||
}
|
}
|
||||||
|
|
||||||
for (int32_t i = 0; i < dbNum; ++i) {
|
for (int32_t i = 0; i < dbNum; ++i) {
|
||||||
SDbVgVersion *db = &dbs[i];
|
SDbCacheInfo *db = &dbs[i];
|
||||||
tscDebug("the %dth expired dbFName:%s, dbId:%" PRId64 ", vgVersion:%d, numOfTable:%d, startTs:%" PRId64, i,
|
tscDebug("the %dth expired dbFName:%s, dbId:%" PRId64 ", vgVersion:%d, cfgVersion:%d, numOfTable:%d, startTs:%" PRId64,
|
||||||
db->dbFName, db->dbId, db->vgVersion, db->numOfTable, db->stateTs);
|
i, db->dbFName, db->dbId, db->vgVersion, db->cfgVersion, db->numOfTable, db->stateTs);
|
||||||
|
|
||||||
db->dbId = htobe64(db->dbId);
|
db->dbId = htobe64(db->dbId);
|
||||||
db->vgVersion = htonl(db->vgVersion);
|
db->vgVersion = htonl(db->vgVersion);
|
||||||
|
db->cfgVersion = htonl(db->cfgVersion);
|
||||||
db->numOfTable = htonl(db->numOfTable);
|
db->numOfTable = htonl(db->numOfTable);
|
||||||
db->stateTs = htobe64(db->stateTs);
|
db->stateTs = htobe64(db->stateTs);
|
||||||
}
|
}
|
||||||
|
|
||||||
SKv kv = {
|
SKv kv = {
|
||||||
.key = HEARTBEAT_KEY_DBINFO,
|
.key = HEARTBEAT_KEY_DBINFO,
|
||||||
.valueLen = sizeof(SDbVgVersion) * dbNum,
|
.valueLen = sizeof(SDbCacheInfo) * dbNum,
|
||||||
.value = dbs,
|
.value = dbs,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -714,13 +732,16 @@ int32_t hbGetAppInfo(int64_t clusterId, SClientHbReq *req) {
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t hbQueryHbReqHandle(SClientHbKey *connKey, void *param, SClientHbReq *req) {
|
int32_t hbQueryHbReqHandle(SClientHbKey *connKey, void *param, SClientHbReq *req) {
|
||||||
SHbParam *hbParam = (SHbParam *)param;
|
int32_t code = 0;
|
||||||
struct SCatalog *pCatalog = NULL;
|
SHbParam *hbParam = (SHbParam *)param;
|
||||||
|
SCatalog *pCatalog = NULL;
|
||||||
|
|
||||||
int32_t code = catalogGetHandle(hbParam->clusterId, &pCatalog);
|
if (hbParam->reqCnt == 0) {
|
||||||
if (code != TSDB_CODE_SUCCESS) {
|
code = catalogGetHandle(hbParam->clusterId, &pCatalog);
|
||||||
tscWarn("catalogGetHandle failed, clusterId:%" PRIx64 ", error:%s", hbParam->clusterId, tstrerror(code));
|
if (code != TSDB_CODE_SUCCESS) {
|
||||||
return code;
|
tscWarn("catalogGetHandle failed, clusterId:%" PRIx64 ", error:%s", hbParam->clusterId, tstrerror(code));
|
||||||
|
return code;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
hbGetAppInfo(hbParam->clusterId, req);
|
hbGetAppInfo(hbParam->clusterId, req);
|
||||||
|
@ -728,23 +749,27 @@ int32_t hbQueryHbReqHandle(SClientHbKey *connKey, void *param, SClientHbReq *req
|
||||||
hbGetQueryBasicInfo(connKey, req);
|
hbGetQueryBasicInfo(connKey, req);
|
||||||
|
|
||||||
if (hbParam->passKeyCnt > 0) {
|
if (hbParam->passKeyCnt > 0) {
|
||||||
hbGetUserBasicInfo(connKey, req);
|
hbGetUserBasicInfo(connKey, hbParam, req);
|
||||||
}
|
}
|
||||||
|
|
||||||
code = hbGetExpiredUserInfo(connKey, pCatalog, req);
|
if (hbParam->reqCnt == 0) {
|
||||||
if (TSDB_CODE_SUCCESS != code) {
|
code = hbGetExpiredUserInfo(connKey, pCatalog, req);
|
||||||
return code;
|
if (TSDB_CODE_SUCCESS != code) {
|
||||||
|
return code;
|
||||||
|
}
|
||||||
|
|
||||||
|
code = hbGetExpiredDBInfo(connKey, pCatalog, req);
|
||||||
|
if (TSDB_CODE_SUCCESS != code) {
|
||||||
|
return code;
|
||||||
|
}
|
||||||
|
|
||||||
|
code = hbGetExpiredStbInfo(connKey, pCatalog, req);
|
||||||
|
if (TSDB_CODE_SUCCESS != code) {
|
||||||
|
return code;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
code = hbGetExpiredDBInfo(connKey, pCatalog, req);
|
++hbParam->reqCnt; // success to get catalog info
|
||||||
if (TSDB_CODE_SUCCESS != code) {
|
|
||||||
return code;
|
|
||||||
}
|
|
||||||
|
|
||||||
code = hbGetExpiredStbInfo(connKey, pCatalog, req);
|
|
||||||
if (TSDB_CODE_SUCCESS != code) {
|
|
||||||
return code;
|
|
||||||
}
|
|
||||||
|
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
|
@ -766,55 +791,47 @@ SClientHbBatchReq *hbGatherAllInfo(SAppHbMgr *pAppHbMgr) {
|
||||||
}
|
}
|
||||||
int32_t connKeyCnt = atomic_load_32(&pAppHbMgr->connKeyCnt);
|
int32_t connKeyCnt = atomic_load_32(&pAppHbMgr->connKeyCnt);
|
||||||
pBatchReq->reqs = taosArrayInit(connKeyCnt, sizeof(SClientHbReq));
|
pBatchReq->reqs = taosArrayInit(connKeyCnt, sizeof(SClientHbReq));
|
||||||
|
if (!pBatchReq->reqs) {
|
||||||
int64_t rid = -1;
|
|
||||||
int32_t code = 0;
|
|
||||||
|
|
||||||
void *pIter = taosHashIterate(pAppHbMgr->activeInfo, NULL);
|
|
||||||
|
|
||||||
SClientHbReq *pOneReq = pIter;
|
|
||||||
SClientHbKey *connKey = pOneReq ? &pOneReq->connKey : NULL;
|
|
||||||
if (connKey != NULL) rid = connKey->tscRid;
|
|
||||||
|
|
||||||
STscObj *pTscObj = (STscObj *)acquireTscObj(rid);
|
|
||||||
if (pTscObj == NULL) {
|
|
||||||
tFreeClientHbBatchReq(pBatchReq);
|
tFreeClientHbBatchReq(pBatchReq);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
while (pIter != NULL) {
|
void *pIter = NULL;
|
||||||
|
SHbParam param = {0};
|
||||||
|
while ((pIter = taosHashIterate(pAppHbMgr->activeInfo, pIter))) {
|
||||||
|
SClientHbReq *pOneReq = pIter;
|
||||||
|
SClientHbKey *connKey = &pOneReq->connKey;
|
||||||
|
STscObj *pTscObj = (STscObj *)acquireTscObj(connKey->tscRid);
|
||||||
|
|
||||||
|
if (!pTscObj) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
pOneReq = taosArrayPush(pBatchReq->reqs, pOneReq);
|
pOneReq = taosArrayPush(pBatchReq->reqs, pOneReq);
|
||||||
SHbParam param;
|
|
||||||
switch (pOneReq->connKey.connType) {
|
switch (connKey->connType) {
|
||||||
case CONN_TYPE__QUERY: {
|
case CONN_TYPE__QUERY: {
|
||||||
param.clusterId = pOneReq->clusterId;
|
if (param.clusterId == 0) {
|
||||||
|
// init
|
||||||
|
param.clusterId = pOneReq->clusterId;
|
||||||
|
param.passVer = INT32_MIN;
|
||||||
|
}
|
||||||
param.passKeyCnt = atomic_load_32(&pAppHbMgr->passKeyCnt);
|
param.passKeyCnt = atomic_load_32(&pAppHbMgr->passKeyCnt);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
if (clientHbMgr.reqHandle[pOneReq->connKey.connType]) {
|
if (clientHbMgr.reqHandle[connKey->connType]) {
|
||||||
code = (*clientHbMgr.reqHandle[pOneReq->connKey.connType])(&pOneReq->connKey, ¶m, pOneReq);
|
int32_t code = (*clientHbMgr.reqHandle[connKey->connType])(connKey, ¶m, pOneReq);
|
||||||
if (code) {
|
if (code) {
|
||||||
tscWarn("hbGatherAllInfo failed since %s, tscRid:%" PRIi64 ", connType:%" PRIi8, tstrerror(code),
|
tscWarn("hbGatherAllInfo failed since %s, tscRid:%" PRIi64 ", connType:%" PRIi8, tstrerror(code),
|
||||||
pOneReq->connKey.tscRid, pOneReq->connKey.connType);
|
connKey->tscRid, connKey->connType);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
break;
|
|
||||||
|
|
||||||
#if 0
|
releaseTscObj(connKey->tscRid);
|
||||||
if (code) {
|
|
||||||
pIter = taosHashIterate(pAppHbMgr->activeInfo, pIter);
|
|
||||||
pOneReq = pIter;
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
pIter = taosHashIterate(pAppHbMgr->activeInfo, pIter);
|
|
||||||
pOneReq = pIter;
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
releaseTscObj(rid);
|
|
||||||
|
|
||||||
return pBatchReq;
|
return pBatchReq;
|
||||||
}
|
}
|
||||||
|
@ -885,7 +902,6 @@ static void *hbThreadFunc(void *param) {
|
||||||
hbGatherAppInfo();
|
hbGatherAppInfo();
|
||||||
}
|
}
|
||||||
|
|
||||||
SArray *mgr = taosArrayInit(sz, sizeof(void *));
|
|
||||||
for (int i = 0; i < sz; i++) {
|
for (int i = 0; i < sz; i++) {
|
||||||
SAppHbMgr *pAppHbMgr = taosArrayGetP(clientHbMgr.appHbMgrs, i);
|
SAppHbMgr *pAppHbMgr = taosArrayGetP(clientHbMgr.appHbMgrs, i);
|
||||||
if (pAppHbMgr == NULL) {
|
if (pAppHbMgr == NULL) {
|
||||||
|
@ -894,7 +910,6 @@ static void *hbThreadFunc(void *param) {
|
||||||
|
|
||||||
int32_t connCnt = atomic_load_32(&pAppHbMgr->connKeyCnt);
|
int32_t connCnt = atomic_load_32(&pAppHbMgr->connKeyCnt);
|
||||||
if (connCnt == 0) {
|
if (connCnt == 0) {
|
||||||
taosArrayPush(mgr, &pAppHbMgr);
|
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
SClientHbBatchReq *pReq = hbGatherAllInfo(pAppHbMgr);
|
SClientHbBatchReq *pReq = hbGatherAllInfo(pAppHbMgr);
|
||||||
|
@ -908,7 +923,6 @@ static void *hbThreadFunc(void *param) {
|
||||||
terrno = TSDB_CODE_OUT_OF_MEMORY;
|
terrno = TSDB_CODE_OUT_OF_MEMORY;
|
||||||
tFreeClientHbBatchReq(pReq);
|
tFreeClientHbBatchReq(pReq);
|
||||||
// hbClearReqInfo(pAppHbMgr);
|
// hbClearReqInfo(pAppHbMgr);
|
||||||
taosArrayPush(mgr, &pAppHbMgr);
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -920,7 +934,6 @@ static void *hbThreadFunc(void *param) {
|
||||||
tFreeClientHbBatchReq(pReq);
|
tFreeClientHbBatchReq(pReq);
|
||||||
// hbClearReqInfo(pAppHbMgr);
|
// hbClearReqInfo(pAppHbMgr);
|
||||||
taosMemoryFree(buf);
|
taosMemoryFree(buf);
|
||||||
taosArrayPush(mgr, &pAppHbMgr);
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
pInfo->fp = hbAsyncCallBack;
|
pInfo->fp = hbAsyncCallBack;
|
||||||
|
@ -941,12 +954,8 @@ static void *hbThreadFunc(void *param) {
|
||||||
// hbClearReqInfo(pAppHbMgr);
|
// hbClearReqInfo(pAppHbMgr);
|
||||||
|
|
||||||
atomic_add_fetch_32(&pAppHbMgr->reportCnt, 1);
|
atomic_add_fetch_32(&pAppHbMgr->reportCnt, 1);
|
||||||
taosArrayPush(mgr, &pAppHbMgr);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
taosArrayDestroy(clientHbMgr.appHbMgrs);
|
|
||||||
clientHbMgr.appHbMgrs = mgr;
|
|
||||||
|
|
||||||
taosThreadMutexUnlock(&clientHbMgr.lock);
|
taosThreadMutexUnlock(&clientHbMgr.lock);
|
||||||
|
|
||||||
taosMsleep(HEARTBEAT_INTERVAL);
|
taosMsleep(HEARTBEAT_INTERVAL);
|
||||||
|
|
|
@ -147,8 +147,9 @@ typedef struct {
|
||||||
int32_t vgId;
|
int32_t vgId;
|
||||||
int32_t vgStatus;
|
int32_t vgStatus;
|
||||||
int32_t vgSkipCnt; // here used to mark the slow vgroups
|
int32_t vgSkipCnt; // here used to mark the slow vgroups
|
||||||
bool receiveInfo;
|
bool receivedInfoFromVnode;// has already received info from vnode
|
||||||
int64_t emptyBlockReceiveTs; // once empty block is received, idle for ignoreCnt then start to poll data
|
int64_t emptyBlockReceiveTs; // once empty block is received, idle for ignoreCnt then start to poll data
|
||||||
|
bool seekUpdated; // offset is updated by seek operator, therefore, not update by vnode rsp.
|
||||||
SEpSet epSet;
|
SEpSet epSet;
|
||||||
} SMqClientVg;
|
} SMqClientVg;
|
||||||
|
|
||||||
|
@ -1429,6 +1430,9 @@ static void initClientTopicFromRsp(SMqClientTopic* pTopic, SMqSubTopicEp* pTopic
|
||||||
clientVg.offsetInfo.committedOffset = offsetNew;
|
clientVg.offsetInfo.committedOffset = offsetNew;
|
||||||
clientVg.offsetInfo.walVerBegin = -1;
|
clientVg.offsetInfo.walVerBegin = -1;
|
||||||
clientVg.offsetInfo.walVerEnd = -1;
|
clientVg.offsetInfo.walVerEnd = -1;
|
||||||
|
clientVg.seekUpdated = false;
|
||||||
|
clientVg.receivedInfoFromVnode = false;
|
||||||
|
|
||||||
taosArrayPush(pTopic->vgs, &clientVg);
|
taosArrayPush(pTopic->vgs, &clientVg);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1704,6 +1708,7 @@ static int32_t doTmqPollImpl(tmq_t* pTmq, SMqClientTopic* pTopic, SMqClientVg* p
|
||||||
asyncSendMsgToServer(pTmq->pTscObj->pAppInfo->pTransporter, &pVg->epSet, &transporterId, sendInfo);
|
asyncSendMsgToServer(pTmq->pTscObj->pAppInfo->pTransporter, &pVg->epSet, &transporterId, sendInfo);
|
||||||
|
|
||||||
pVg->pollCnt++;
|
pVg->pollCnt++;
|
||||||
|
pVg->seekUpdated = false; // reset this flag.
|
||||||
pTmq->pollCnt++;
|
pTmq->pollCnt++;
|
||||||
|
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
|
@ -1806,8 +1811,11 @@ static void* tmqHandleAllRsp(tmq_t* tmq, int64_t timeout, bool pollIfReset) {
|
||||||
pVg->epSet = *pollRspWrapper->pEpset;
|
pVg->epSet = *pollRspWrapper->pEpset;
|
||||||
}
|
}
|
||||||
|
|
||||||
// update the local offset value only for the returned values.
|
// update the local offset value only for the returned values, only when the local offset is NOT updated
|
||||||
pVg->offsetInfo.currentOffset = pDataRsp->rspOffset;
|
// by tmq_offset_seek function
|
||||||
|
if (!pVg->seekUpdated) {
|
||||||
|
pVg->offsetInfo.currentOffset = pDataRsp->rspOffset;
|
||||||
|
}
|
||||||
|
|
||||||
// update the status
|
// update the status
|
||||||
atomic_store_32(&pVg->vgStatus, TMQ_VG_STATUS__IDLE);
|
atomic_store_32(&pVg->vgStatus, TMQ_VG_STATUS__IDLE);
|
||||||
|
@ -1815,7 +1823,7 @@ static void* tmqHandleAllRsp(tmq_t* tmq, int64_t timeout, bool pollIfReset) {
|
||||||
// update the valid wal version range
|
// update the valid wal version range
|
||||||
pVg->offsetInfo.walVerBegin = pDataRsp->head.walsver;
|
pVg->offsetInfo.walVerBegin = pDataRsp->head.walsver;
|
||||||
pVg->offsetInfo.walVerEnd = pDataRsp->head.walever;
|
pVg->offsetInfo.walVerEnd = pDataRsp->head.walever;
|
||||||
pVg->receiveInfo = true;
|
pVg->receivedInfoFromVnode = true;
|
||||||
|
|
||||||
char buf[80];
|
char buf[80];
|
||||||
tFormatOffset(buf, 80, &pDataRsp->rspOffset);
|
tFormatOffset(buf, 80, &pDataRsp->rspOffset);
|
||||||
|
@ -1853,9 +1861,10 @@ static void* tmqHandleAllRsp(tmq_t* tmq, int64_t timeout, bool pollIfReset) {
|
||||||
|
|
||||||
if (pollRspWrapper->metaRsp.head.epoch == consumerEpoch) {
|
if (pollRspWrapper->metaRsp.head.epoch == consumerEpoch) {
|
||||||
SMqClientVg* pVg = pollRspWrapper->vgHandle;
|
SMqClientVg* pVg = pollRspWrapper->vgHandle;
|
||||||
if(pollRspWrapper->metaRsp.rspOffset.type != 0){ // if offset is validate
|
if (!pVg->seekUpdated) {
|
||||||
pVg->offsetInfo.currentOffset = pollRspWrapper->metaRsp.rspOffset;
|
pVg->offsetInfo.currentOffset = pollRspWrapper->metaRsp.rspOffset;
|
||||||
}
|
}
|
||||||
|
|
||||||
atomic_store_32(&pVg->vgStatus, TMQ_VG_STATUS__IDLE);
|
atomic_store_32(&pVg->vgStatus, TMQ_VG_STATUS__IDLE);
|
||||||
// build rsp
|
// build rsp
|
||||||
SMqMetaRspObj* pRsp = tmqBuildMetaRspFromWrapper(pollRspWrapper);
|
SMqMetaRspObj* pRsp = tmqBuildMetaRspFromWrapper(pollRspWrapper);
|
||||||
|
@ -1873,9 +1882,10 @@ static void* tmqHandleAllRsp(tmq_t* tmq, int64_t timeout, bool pollIfReset) {
|
||||||
|
|
||||||
if (pollRspWrapper->taosxRsp.head.epoch == consumerEpoch) {
|
if (pollRspWrapper->taosxRsp.head.epoch == consumerEpoch) {
|
||||||
SMqClientVg* pVg = pollRspWrapper->vgHandle;
|
SMqClientVg* pVg = pollRspWrapper->vgHandle;
|
||||||
if(pollRspWrapper->taosxRsp.rspOffset.type != 0){ // if offset is validate
|
if (!pVg->seekUpdated) { // if offset is validate
|
||||||
pVg->offsetInfo.currentOffset = pollRspWrapper->taosxRsp.rspOffset;
|
pVg->offsetInfo.currentOffset = pollRspWrapper->taosxRsp.rspOffset;
|
||||||
}
|
}
|
||||||
|
|
||||||
atomic_store_32(&pVg->vgStatus, TMQ_VG_STATUS__IDLE);
|
atomic_store_32(&pVg->vgStatus, TMQ_VG_STATUS__IDLE);
|
||||||
|
|
||||||
if (pollRspWrapper->taosxRsp.blockNum == 0) {
|
if (pollRspWrapper->taosxRsp.blockNum == 0) {
|
||||||
|
@ -2109,6 +2119,29 @@ int32_t tmq_get_vgroup_id(TAOS_RES* res) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int64_t tmq_get_vgroup_offset(TAOS_RES* res) {
|
||||||
|
if (TD_RES_TMQ(res)) {
|
||||||
|
SMqRspObj* pRspObj = (SMqRspObj*) res;
|
||||||
|
STqOffsetVal* pOffset = &pRspObj->rsp.rspOffset;
|
||||||
|
if (pOffset->type == TMQ_OFFSET__LOG) {
|
||||||
|
return pRspObj->rsp.rspOffset.version;
|
||||||
|
}
|
||||||
|
} else if (TD_RES_TMQ_META(res)) {
|
||||||
|
SMqMetaRspObj* pRspObj = (SMqMetaRspObj*)res;
|
||||||
|
if (pRspObj->metaRsp.rspOffset.type == TMQ_OFFSET__LOG) {
|
||||||
|
return pRspObj->metaRsp.rspOffset.version;
|
||||||
|
}
|
||||||
|
} else if (TD_RES_TMQ_METADATA(res)) {
|
||||||
|
SMqTaosxRspObj* pRspObj = (SMqTaosxRspObj*) res;
|
||||||
|
if (pRspObj->rsp.rspOffset.type == TMQ_OFFSET__LOG) {
|
||||||
|
return pRspObj->rsp.rspOffset.version;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// data from tsdb, no valid offset info
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
const char* tmq_get_table_name(TAOS_RES* res) {
|
const char* tmq_get_table_name(TAOS_RES* res) {
|
||||||
if (TD_RES_TMQ(res)) {
|
if (TD_RES_TMQ(res)) {
|
||||||
SMqRspObj* pRspObj = (SMqRspObj*)res;
|
SMqRspObj* pRspObj = (SMqRspObj*)res;
|
||||||
|
@ -2410,7 +2443,7 @@ int32_t tmq_get_topic_assignment(tmq_t* tmq, const char* pTopicName, tmq_topic_a
|
||||||
|
|
||||||
for (int32_t j = 0; j < (*numOfAssignment); ++j) {
|
for (int32_t j = 0; j < (*numOfAssignment); ++j) {
|
||||||
SMqClientVg* pClientVg = taosArrayGet(pTopic->vgs, j);
|
SMqClientVg* pClientVg = taosArrayGet(pTopic->vgs, j);
|
||||||
if (!pClientVg->receiveInfo) {
|
if (!pClientVg->receivedInfoFromVnode) {
|
||||||
needFetch = true;
|
needFetch = true;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -2600,6 +2633,7 @@ int32_t tmq_offset_seek(tmq_t* tmq, const char* pTopicName, int32_t vgId, int64_
|
||||||
if (pOffsetInfo->currentOffset.type == TMQ_OFFSET__LOG) {
|
if (pOffsetInfo->currentOffset.type == TMQ_OFFSET__LOG) {
|
||||||
pOffsetInfo->currentOffset.version = offset;
|
pOffsetInfo->currentOffset.version = offset;
|
||||||
pOffsetInfo->committedOffset.version = INT64_MIN;
|
pOffsetInfo->committedOffset.version = INT64_MIN;
|
||||||
|
pVg->seekUpdated = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
SMqRspObj rspObj = {.resType = RES_TYPE__TMQ, .vgId = pVg->vgId};
|
SMqRspObj rspObj = {.resType = RES_TYPE__TMQ, .vgId = pVg->vgId};
|
||||||
|
|
|
@ -2805,7 +2805,26 @@ int32_t tSerializeSUseDbRsp(void *buf, int32_t bufLen, const SUseDbRsp *pRsp) {
|
||||||
return tlen;
|
return tlen;
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t tSerializeSUseDbBatchRsp(void *buf, int32_t bufLen, SUseDbBatchRsp *pRsp) {
|
int32_t tSerializeSDbHbRspImp(SEncoder *pEncoder, const SDbHbRsp *pRsp) {
|
||||||
|
if (pRsp->useDbRsp) {
|
||||||
|
if (tEncodeI8(pEncoder, 1) < 0) return -1;
|
||||||
|
if (tSerializeSUseDbRspImp(pEncoder, pRsp->useDbRsp) < 0) return -1;
|
||||||
|
} else {
|
||||||
|
if (tEncodeI8(pEncoder, 0) < 0) return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (pRsp->cfgRsp) {
|
||||||
|
if (tEncodeI8(pEncoder, 1) < 0) return -1;
|
||||||
|
if (tSerializeSDbCfgRspImpl(pEncoder, pRsp->cfgRsp) < 0) return -1;
|
||||||
|
} else {
|
||||||
|
if (tEncodeI8(pEncoder, 0) < 0) return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int32_t tSerializeSDbHbBatchRsp(void *buf, int32_t bufLen, SDbHbBatchRsp *pRsp) {
|
||||||
SEncoder encoder = {0};
|
SEncoder encoder = {0};
|
||||||
tEncoderInit(&encoder, buf, bufLen);
|
tEncoderInit(&encoder, buf, bufLen);
|
||||||
|
|
||||||
|
@ -2814,8 +2833,8 @@ int32_t tSerializeSUseDbBatchRsp(void *buf, int32_t bufLen, SUseDbBatchRsp *pRsp
|
||||||
int32_t numOfBatch = taosArrayGetSize(pRsp->pArray);
|
int32_t numOfBatch = taosArrayGetSize(pRsp->pArray);
|
||||||
if (tEncodeI32(&encoder, numOfBatch) < 0) return -1;
|
if (tEncodeI32(&encoder, numOfBatch) < 0) return -1;
|
||||||
for (int32_t i = 0; i < numOfBatch; ++i) {
|
for (int32_t i = 0; i < numOfBatch; ++i) {
|
||||||
SUseDbRsp *pUsedbRsp = taosArrayGet(pRsp->pArray, i);
|
SDbHbRsp *pDbRsp = taosArrayGet(pRsp->pArray, i);
|
||||||
if (tSerializeSUseDbRspImp(&encoder, pUsedbRsp) < 0) return -1;
|
if (tSerializeSDbHbRspImp(&encoder, pDbRsp) < 0) return -1;
|
||||||
}
|
}
|
||||||
tEndEncode(&encoder);
|
tEndEncode(&encoder);
|
||||||
|
|
||||||
|
@ -2868,7 +2887,25 @@ int32_t tDeserializeSUseDbRsp(void *buf, int32_t bufLen, SUseDbRsp *pRsp) {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t tDeserializeSUseDbBatchRsp(void *buf, int32_t bufLen, SUseDbBatchRsp *pRsp) {
|
int32_t tDeserializeSDbHbRspImp(SDecoder* decoder, SDbHbRsp* pRsp) {
|
||||||
|
int8_t flag = 0;
|
||||||
|
if (tDecodeI8(decoder, &flag) < 0) return -1;
|
||||||
|
if (flag) {
|
||||||
|
pRsp->useDbRsp = taosMemoryCalloc(1, sizeof(SUseDbRsp));
|
||||||
|
if (NULL == pRsp->useDbRsp) return -1;
|
||||||
|
if (tDeserializeSUseDbRspImp(decoder, pRsp->useDbRsp) < 0) return -1;
|
||||||
|
}
|
||||||
|
if (tDecodeI8(decoder, &flag) < 0) return -1;
|
||||||
|
if (flag) {
|
||||||
|
pRsp->cfgRsp = taosMemoryCalloc(1, sizeof(SDbCfgRsp));
|
||||||
|
if (NULL == pRsp->cfgRsp) return -1;
|
||||||
|
if (tDeserializeSDbCfgRspImpl(decoder, pRsp->cfgRsp) < 0) return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int32_t tDeserializeSDbHbBatchRsp(void *buf, int32_t bufLen, SDbHbBatchRsp *pRsp) {
|
||||||
SDecoder decoder = {0};
|
SDecoder decoder = {0};
|
||||||
tDecoderInit(&decoder, buf, bufLen);
|
tDecoderInit(&decoder, buf, bufLen);
|
||||||
|
|
||||||
|
@ -2877,19 +2914,19 @@ int32_t tDeserializeSUseDbBatchRsp(void *buf, int32_t bufLen, SUseDbBatchRsp *pR
|
||||||
int32_t numOfBatch = taosArrayGetSize(pRsp->pArray);
|
int32_t numOfBatch = taosArrayGetSize(pRsp->pArray);
|
||||||
if (tDecodeI32(&decoder, &numOfBatch) < 0) return -1;
|
if (tDecodeI32(&decoder, &numOfBatch) < 0) return -1;
|
||||||
|
|
||||||
pRsp->pArray = taosArrayInit(numOfBatch, sizeof(SUseDbRsp));
|
pRsp->pArray = taosArrayInit(numOfBatch, sizeof(SDbHbRsp));
|
||||||
if (pRsp->pArray == NULL) {
|
if (pRsp->pArray == NULL) {
|
||||||
terrno = TSDB_CODE_OUT_OF_MEMORY;
|
terrno = TSDB_CODE_OUT_OF_MEMORY;
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
for (int32_t i = 0; i < numOfBatch; ++i) {
|
for (int32_t i = 0; i < numOfBatch; ++i) {
|
||||||
SUseDbRsp usedbRsp = {0};
|
SDbHbRsp rsp = {0};
|
||||||
if (tDeserializeSUseDbRspImp(&decoder, &usedbRsp) < 0) {
|
if (tDeserializeSDbHbRspImp(&decoder, &rsp) < 0) {
|
||||||
tDecoderClear(&decoder);
|
tDecoderClear(&decoder);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
taosArrayPush(pRsp->pArray, &usedbRsp);
|
taosArrayPush(pRsp->pArray, &rsp);
|
||||||
}
|
}
|
||||||
tEndDecode(&decoder);
|
tEndDecode(&decoder);
|
||||||
|
|
||||||
|
@ -2899,11 +2936,27 @@ int32_t tDeserializeSUseDbBatchRsp(void *buf, int32_t bufLen, SUseDbBatchRsp *pR
|
||||||
|
|
||||||
void tFreeSUsedbRsp(SUseDbRsp *pRsp) { taosArrayDestroy(pRsp->pVgroupInfos); }
|
void tFreeSUsedbRsp(SUseDbRsp *pRsp) { taosArrayDestroy(pRsp->pVgroupInfos); }
|
||||||
|
|
||||||
void tFreeSUseDbBatchRsp(SUseDbBatchRsp *pRsp) {
|
void tFreeSDbHbRsp(SDbHbRsp *pDbRsp) {
|
||||||
|
if (NULL == pDbRsp) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (pDbRsp->useDbRsp) {
|
||||||
|
tFreeSUsedbRsp(pDbRsp->useDbRsp);
|
||||||
|
taosMemoryFree(pDbRsp->useDbRsp);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (pDbRsp->cfgRsp) {
|
||||||
|
tFreeSDbCfgRsp(pDbRsp->cfgRsp);
|
||||||
|
taosMemoryFree(pDbRsp->cfgRsp);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void tFreeSDbHbBatchRsp(SDbHbBatchRsp *pRsp) {
|
||||||
int32_t numOfBatch = taosArrayGetSize(pRsp->pArray);
|
int32_t numOfBatch = taosArrayGetSize(pRsp->pArray);
|
||||||
for (int32_t i = 0; i < numOfBatch; ++i) {
|
for (int32_t i = 0; i < numOfBatch; ++i) {
|
||||||
SUseDbRsp *pUsedbRsp = taosArrayGet(pRsp->pArray, i);
|
SDbHbRsp *pDbRsp = taosArrayGet(pRsp->pArray, i);
|
||||||
tFreeSUsedbRsp(pUsedbRsp);
|
tFreeSDbHbRsp(pDbRsp);
|
||||||
}
|
}
|
||||||
|
|
||||||
taosArrayDestroy(pRsp->pArray);
|
taosArrayDestroy(pRsp->pArray);
|
||||||
|
@ -3119,85 +3172,93 @@ int32_t tDeserializeSVDropTtlTableReq(void *buf, int32_t bufLen, SVDropTtlTableR
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int32_t tSerializeSDbCfgRspImpl(SEncoder *encoder, const SDbCfgRsp *pRsp) {
|
||||||
|
if (tEncodeCStr(encoder, pRsp->db) < 0) return -1;
|
||||||
|
if (tEncodeI64(encoder, pRsp->dbId) < 0) return -1;
|
||||||
|
if (tEncodeI32(encoder, pRsp->cfgVersion) < 0) return -1;
|
||||||
|
if (tEncodeI32(encoder, pRsp->numOfVgroups) < 0) return -1;
|
||||||
|
if (tEncodeI32(encoder, pRsp->numOfStables) < 0) return -1;
|
||||||
|
if (tEncodeI32(encoder, pRsp->buffer) < 0) return -1;
|
||||||
|
if (tEncodeI32(encoder, pRsp->cacheSize) < 0) return -1;
|
||||||
|
if (tEncodeI32(encoder, pRsp->pageSize) < 0) return -1;
|
||||||
|
if (tEncodeI32(encoder, pRsp->pages) < 0) return -1;
|
||||||
|
if (tEncodeI32(encoder, pRsp->daysPerFile) < 0) return -1;
|
||||||
|
if (tEncodeI32(encoder, pRsp->daysToKeep0) < 0) return -1;
|
||||||
|
if (tEncodeI32(encoder, pRsp->daysToKeep1) < 0) return -1;
|
||||||
|
if (tEncodeI32(encoder, pRsp->daysToKeep2) < 0) return -1;
|
||||||
|
if (tEncodeI32(encoder, pRsp->minRows) < 0) return -1;
|
||||||
|
if (tEncodeI32(encoder, pRsp->maxRows) < 0) return -1;
|
||||||
|
if (tEncodeI32(encoder, pRsp->walFsyncPeriod) < 0) return -1;
|
||||||
|
if (tEncodeI16(encoder, pRsp->hashPrefix) < 0) return -1;
|
||||||
|
if (tEncodeI16(encoder, pRsp->hashSuffix) < 0) return -1;
|
||||||
|
if (tEncodeI8(encoder, pRsp->walLevel) < 0) return -1;
|
||||||
|
if (tEncodeI8(encoder, pRsp->precision) < 0) return -1;
|
||||||
|
if (tEncodeI8(encoder, pRsp->compression) < 0) return -1;
|
||||||
|
if (tEncodeI8(encoder, pRsp->replications) < 0) return -1;
|
||||||
|
if (tEncodeI8(encoder, pRsp->strict) < 0) return -1;
|
||||||
|
if (tEncodeI8(encoder, pRsp->cacheLast) < 0) return -1;
|
||||||
|
if (tEncodeI32(encoder, pRsp->tsdbPageSize) < 0) return -1;
|
||||||
|
if (tEncodeI32(encoder, pRsp->walRetentionPeriod) < 0) return -1;
|
||||||
|
if (tEncodeI32(encoder, pRsp->walRollPeriod) < 0) return -1;
|
||||||
|
if (tEncodeI64(encoder, pRsp->walRetentionSize) < 0) return -1;
|
||||||
|
if (tEncodeI64(encoder, pRsp->walSegmentSize) < 0) return -1;
|
||||||
|
if (tEncodeI32(encoder, pRsp->numOfRetensions) < 0) return -1;
|
||||||
|
for (int32_t i = 0; i < pRsp->numOfRetensions; ++i) {
|
||||||
|
SRetention *pRetension = taosArrayGet(pRsp->pRetensions, i);
|
||||||
|
if (tEncodeI64(encoder, pRetension->freq) < 0) return -1;
|
||||||
|
if (tEncodeI64(encoder, pRetension->keep) < 0) return -1;
|
||||||
|
if (tEncodeI8(encoder, pRetension->freqUnit) < 0) return -1;
|
||||||
|
if (tEncodeI8(encoder, pRetension->keepUnit) < 0) return -1;
|
||||||
|
}
|
||||||
|
if (tEncodeI8(encoder, pRsp->schemaless) < 0) return -1;
|
||||||
|
if (tEncodeI16(encoder, pRsp->sstTrigger) < 0) return -1;
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
int32_t tSerializeSDbCfgRsp(void *buf, int32_t bufLen, const SDbCfgRsp *pRsp) {
|
int32_t tSerializeSDbCfgRsp(void *buf, int32_t bufLen, const SDbCfgRsp *pRsp) {
|
||||||
SEncoder encoder = {0};
|
SEncoder encoder = {0};
|
||||||
tEncoderInit(&encoder, buf, bufLen);
|
tEncoderInit(&encoder, buf, bufLen);
|
||||||
|
|
||||||
if (tStartEncode(&encoder) < 0) return -1;
|
if (tStartEncode(&encoder) < 0) return -1;
|
||||||
if (tEncodeI32(&encoder, pRsp->numOfVgroups) < 0) return -1;
|
tSerializeSDbCfgRspImpl(&encoder, pRsp);
|
||||||
if (tEncodeI32(&encoder, pRsp->numOfStables) < 0) return -1;
|
|
||||||
if (tEncodeI32(&encoder, pRsp->buffer) < 0) return -1;
|
|
||||||
if (tEncodeI32(&encoder, pRsp->cacheSize) < 0) return -1;
|
|
||||||
if (tEncodeI32(&encoder, pRsp->pageSize) < 0) return -1;
|
|
||||||
if (tEncodeI32(&encoder, pRsp->pages) < 0) return -1;
|
|
||||||
if (tEncodeI32(&encoder, pRsp->daysPerFile) < 0) return -1;
|
|
||||||
if (tEncodeI32(&encoder, pRsp->daysToKeep0) < 0) return -1;
|
|
||||||
if (tEncodeI32(&encoder, pRsp->daysToKeep1) < 0) return -1;
|
|
||||||
if (tEncodeI32(&encoder, pRsp->daysToKeep2) < 0) return -1;
|
|
||||||
if (tEncodeI32(&encoder, pRsp->minRows) < 0) return -1;
|
|
||||||
if (tEncodeI32(&encoder, pRsp->maxRows) < 0) return -1;
|
|
||||||
if (tEncodeI32(&encoder, pRsp->walFsyncPeriod) < 0) return -1;
|
|
||||||
if (tEncodeI16(&encoder, pRsp->hashPrefix) < 0) return -1;
|
|
||||||
if (tEncodeI16(&encoder, pRsp->hashSuffix) < 0) return -1;
|
|
||||||
if (tEncodeI8(&encoder, pRsp->walLevel) < 0) return -1;
|
|
||||||
if (tEncodeI8(&encoder, pRsp->precision) < 0) return -1;
|
|
||||||
if (tEncodeI8(&encoder, pRsp->compression) < 0) return -1;
|
|
||||||
if (tEncodeI8(&encoder, pRsp->replications) < 0) return -1;
|
|
||||||
if (tEncodeI8(&encoder, pRsp->strict) < 0) return -1;
|
|
||||||
if (tEncodeI8(&encoder, pRsp->cacheLast) < 0) return -1;
|
|
||||||
if (tEncodeI32(&encoder, pRsp->tsdbPageSize) < 0) return -1;
|
|
||||||
if (tEncodeI32(&encoder, pRsp->walRetentionPeriod) < 0) return -1;
|
|
||||||
if (tEncodeI32(&encoder, pRsp->walRollPeriod) < 0) return -1;
|
|
||||||
if (tEncodeI64(&encoder, pRsp->walRetentionSize) < 0) return -1;
|
|
||||||
if (tEncodeI64(&encoder, pRsp->walSegmentSize) < 0) return -1;
|
|
||||||
if (tEncodeI32(&encoder, pRsp->numOfRetensions) < 0) return -1;
|
|
||||||
for (int32_t i = 0; i < pRsp->numOfRetensions; ++i) {
|
|
||||||
SRetention *pRetension = taosArrayGet(pRsp->pRetensions, i);
|
|
||||||
if (tEncodeI64(&encoder, pRetension->freq) < 0) return -1;
|
|
||||||
if (tEncodeI64(&encoder, pRetension->keep) < 0) return -1;
|
|
||||||
if (tEncodeI8(&encoder, pRetension->freqUnit) < 0) return -1;
|
|
||||||
if (tEncodeI8(&encoder, pRetension->keepUnit) < 0) return -1;
|
|
||||||
}
|
|
||||||
if (tEncodeI8(&encoder, pRsp->schemaless) < 0) return -1;
|
|
||||||
if (tEncodeI16(&encoder, pRsp->sstTrigger) < 0) return -1;
|
|
||||||
tEndEncode(&encoder);
|
tEndEncode(&encoder);
|
||||||
int32_t tlen = encoder.pos;
|
int32_t tlen = encoder.pos;
|
||||||
tEncoderClear(&encoder);
|
tEncoderClear(&encoder);
|
||||||
return tlen;
|
return tlen;
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t tDeserializeSDbCfgRsp(void *buf, int32_t bufLen, SDbCfgRsp *pRsp) {
|
int32_t tDeserializeSDbCfgRspImpl(SDecoder* decoder, SDbCfgRsp *pRsp) {
|
||||||
SDecoder decoder = {0};
|
if (tDecodeCStrTo(decoder, pRsp->db) < 0) return -1;
|
||||||
tDecoderInit(&decoder, buf, bufLen);
|
if (tDecodeI64(decoder, &pRsp->dbId) < 0) return -1;
|
||||||
|
if (tDecodeI32(decoder, &pRsp->cfgVersion) < 0) return -1;
|
||||||
if (tStartDecode(&decoder) < 0) return -1;
|
if (tDecodeI32(decoder, &pRsp->numOfVgroups) < 0) return -1;
|
||||||
if (tDecodeI32(&decoder, &pRsp->numOfVgroups) < 0) return -1;
|
if (tDecodeI32(decoder, &pRsp->numOfStables) < 0) return -1;
|
||||||
if (tDecodeI32(&decoder, &pRsp->numOfStables) < 0) return -1;
|
if (tDecodeI32(decoder, &pRsp->buffer) < 0) return -1;
|
||||||
if (tDecodeI32(&decoder, &pRsp->buffer) < 0) return -1;
|
if (tDecodeI32(decoder, &pRsp->cacheSize) < 0) return -1;
|
||||||
if (tDecodeI32(&decoder, &pRsp->cacheSize) < 0) return -1;
|
if (tDecodeI32(decoder, &pRsp->pageSize) < 0) return -1;
|
||||||
if (tDecodeI32(&decoder, &pRsp->pageSize) < 0) return -1;
|
if (tDecodeI32(decoder, &pRsp->pages) < 0) return -1;
|
||||||
if (tDecodeI32(&decoder, &pRsp->pages) < 0) return -1;
|
if (tDecodeI32(decoder, &pRsp->daysPerFile) < 0) return -1;
|
||||||
if (tDecodeI32(&decoder, &pRsp->daysPerFile) < 0) return -1;
|
if (tDecodeI32(decoder, &pRsp->daysToKeep0) < 0) return -1;
|
||||||
if (tDecodeI32(&decoder, &pRsp->daysToKeep0) < 0) return -1;
|
if (tDecodeI32(decoder, &pRsp->daysToKeep1) < 0) return -1;
|
||||||
if (tDecodeI32(&decoder, &pRsp->daysToKeep1) < 0) return -1;
|
if (tDecodeI32(decoder, &pRsp->daysToKeep2) < 0) return -1;
|
||||||
if (tDecodeI32(&decoder, &pRsp->daysToKeep2) < 0) return -1;
|
if (tDecodeI32(decoder, &pRsp->minRows) < 0) return -1;
|
||||||
if (tDecodeI32(&decoder, &pRsp->minRows) < 0) return -1;
|
if (tDecodeI32(decoder, &pRsp->maxRows) < 0) return -1;
|
||||||
if (tDecodeI32(&decoder, &pRsp->maxRows) < 0) return -1;
|
if (tDecodeI32(decoder, &pRsp->walFsyncPeriod) < 0) return -1;
|
||||||
if (tDecodeI32(&decoder, &pRsp->walFsyncPeriod) < 0) return -1;
|
if (tDecodeI16(decoder, &pRsp->hashPrefix) < 0) return -1;
|
||||||
if (tDecodeI16(&decoder, &pRsp->hashPrefix) < 0) return -1;
|
if (tDecodeI16(decoder, &pRsp->hashSuffix) < 0) return -1;
|
||||||
if (tDecodeI16(&decoder, &pRsp->hashSuffix) < 0) return -1;
|
if (tDecodeI8(decoder, &pRsp->walLevel) < 0) return -1;
|
||||||
if (tDecodeI8(&decoder, &pRsp->walLevel) < 0) return -1;
|
if (tDecodeI8(decoder, &pRsp->precision) < 0) return -1;
|
||||||
if (tDecodeI8(&decoder, &pRsp->precision) < 0) return -1;
|
if (tDecodeI8(decoder, &pRsp->compression) < 0) return -1;
|
||||||
if (tDecodeI8(&decoder, &pRsp->compression) < 0) return -1;
|
if (tDecodeI8(decoder, &pRsp->replications) < 0) return -1;
|
||||||
if (tDecodeI8(&decoder, &pRsp->replications) < 0) return -1;
|
if (tDecodeI8(decoder, &pRsp->strict) < 0) return -1;
|
||||||
if (tDecodeI8(&decoder, &pRsp->strict) < 0) return -1;
|
if (tDecodeI8(decoder, &pRsp->cacheLast) < 0) return -1;
|
||||||
if (tDecodeI8(&decoder, &pRsp->cacheLast) < 0) return -1;
|
if (tDecodeI32(decoder, &pRsp->tsdbPageSize) < 0) return -1;
|
||||||
if (tDecodeI32(&decoder, &pRsp->tsdbPageSize) < 0) return -1;
|
if (tDecodeI32(decoder, &pRsp->walRetentionPeriod) < 0) return -1;
|
||||||
if (tDecodeI32(&decoder, &pRsp->walRetentionPeriod) < 0) return -1;
|
if (tDecodeI32(decoder, &pRsp->walRollPeriod) < 0) return -1;
|
||||||
if (tDecodeI32(&decoder, &pRsp->walRollPeriod) < 0) return -1;
|
if (tDecodeI64(decoder, &pRsp->walRetentionSize) < 0) return -1;
|
||||||
if (tDecodeI64(&decoder, &pRsp->walRetentionSize) < 0) return -1;
|
if (tDecodeI64(decoder, &pRsp->walSegmentSize) < 0) return -1;
|
||||||
if (tDecodeI64(&decoder, &pRsp->walSegmentSize) < 0) return -1;
|
if (tDecodeI32(decoder, &pRsp->numOfRetensions) < 0) return -1;
|
||||||
if (tDecodeI32(&decoder, &pRsp->numOfRetensions) < 0) return -1;
|
|
||||||
if (pRsp->numOfRetensions > 0) {
|
if (pRsp->numOfRetensions > 0) {
|
||||||
pRsp->pRetensions = taosArrayInit(pRsp->numOfRetensions, sizeof(SRetention));
|
pRsp->pRetensions = taosArrayInit(pRsp->numOfRetensions, sizeof(SRetention));
|
||||||
if (pRsp->pRetensions == NULL) {
|
if (pRsp->pRetensions == NULL) {
|
||||||
|
@ -3208,23 +3269,41 @@ int32_t tDeserializeSDbCfgRsp(void *buf, int32_t bufLen, SDbCfgRsp *pRsp) {
|
||||||
|
|
||||||
for (int32_t i = 0; i < pRsp->numOfRetensions; ++i) {
|
for (int32_t i = 0; i < pRsp->numOfRetensions; ++i) {
|
||||||
SRetention rentension = {0};
|
SRetention rentension = {0};
|
||||||
if (tDecodeI64(&decoder, &rentension.freq) < 0) return -1;
|
if (tDecodeI64(decoder, &rentension.freq) < 0) return -1;
|
||||||
if (tDecodeI64(&decoder, &rentension.keep) < 0) return -1;
|
if (tDecodeI64(decoder, &rentension.keep) < 0) return -1;
|
||||||
if (tDecodeI8(&decoder, &rentension.freqUnit) < 0) return -1;
|
if (tDecodeI8(decoder, &rentension.freqUnit) < 0) return -1;
|
||||||
if (tDecodeI8(&decoder, &rentension.keepUnit) < 0) return -1;
|
if (tDecodeI8(decoder, &rentension.keepUnit) < 0) return -1;
|
||||||
if (taosArrayPush(pRsp->pRetensions, &rentension) == NULL) {
|
if (taosArrayPush(pRsp->pRetensions, &rentension) == NULL) {
|
||||||
terrno = TSDB_CODE_OUT_OF_MEMORY;
|
terrno = TSDB_CODE_OUT_OF_MEMORY;
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (tDecodeI8(&decoder, &pRsp->schemaless) < 0) return -1;
|
if (tDecodeI8(decoder, &pRsp->schemaless) < 0) return -1;
|
||||||
if (tDecodeI16(&decoder, &pRsp->sstTrigger) < 0) return -1;
|
if (tDecodeI16(decoder, &pRsp->sstTrigger) < 0) return -1;
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int32_t tDeserializeSDbCfgRsp(void *buf, int32_t bufLen, SDbCfgRsp *pRsp) {
|
||||||
|
SDecoder decoder = {0};
|
||||||
|
tDecoderInit(&decoder, buf, bufLen);
|
||||||
|
|
||||||
|
if (tStartDecode(&decoder) < 0) return -1;
|
||||||
|
if (tDeserializeSDbCfgRspImpl(&decoder, pRsp) < 0) return -1;
|
||||||
tEndDecode(&decoder);
|
tEndDecode(&decoder);
|
||||||
|
|
||||||
tDecoderClear(&decoder);
|
tDecoderClear(&decoder);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void tFreeSDbCfgRsp(SDbCfgRsp *pRsp) {
|
||||||
|
if (NULL == pRsp) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
taosArrayDestroy(pRsp->pRetensions);
|
||||||
|
}
|
||||||
|
|
||||||
int32_t tSerializeSUserIndexReq(void *buf, int32_t bufLen, SUserIndexReq *pReq) {
|
int32_t tSerializeSUserIndexReq(void *buf, int32_t bufLen, SUserIndexReq *pReq) {
|
||||||
SEncoder encoder = {0};
|
SEncoder encoder = {0};
|
||||||
tEncoderInit(&encoder, buf, bufLen);
|
tEncoderInit(&encoder, buf, bufLen);
|
||||||
|
|
|
@ -87,6 +87,18 @@ static void dmStopDnode(int signum, void *sigInfo, void *context) {
|
||||||
}
|
}
|
||||||
|
|
||||||
void dmLogCrash(int signum, void *sigInfo, void *context) {
|
void dmLogCrash(int signum, void *sigInfo, void *context) {
|
||||||
|
// taosIgnSignal(SIGTERM);
|
||||||
|
// taosIgnSignal(SIGHUP);
|
||||||
|
// taosIgnSignal(SIGINT);
|
||||||
|
// taosIgnSignal(SIGBREAK);
|
||||||
|
|
||||||
|
#ifndef WINDOWS
|
||||||
|
taosIgnSignal(SIGBUS);
|
||||||
|
#endif
|
||||||
|
taosIgnSignal(SIGABRT);
|
||||||
|
taosIgnSignal(SIGFPE);
|
||||||
|
taosIgnSignal(SIGSEGV);
|
||||||
|
|
||||||
char *pMsg = NULL;
|
char *pMsg = NULL;
|
||||||
const char *flags = "UTL FATAL ";
|
const char *flags = "UTL FATAL ";
|
||||||
ELogLevel level = DEBUG_FATAL;
|
ELogLevel level = DEBUG_FATAL;
|
||||||
|
|
|
@ -91,6 +91,7 @@ static void *dmCrashReportThreadFp(void *param) {
|
||||||
dError("failed to send crash report");
|
dError("failed to send crash report");
|
||||||
if (pFile) {
|
if (pFile) {
|
||||||
taosReleaseCrashLogFile(pFile, false);
|
taosReleaseCrashLogFile(pFile, false);
|
||||||
|
pFile = NULL;
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
@ -110,6 +111,7 @@ static void *dmCrashReportThreadFp(void *param) {
|
||||||
|
|
||||||
if (pFile) {
|
if (pFile) {
|
||||||
taosReleaseCrashLogFile(pFile, truncateFile);
|
taosReleaseCrashLogFile(pFile, truncateFile);
|
||||||
|
pFile = NULL;
|
||||||
truncateFile = false;
|
truncateFile = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -120,6 +120,11 @@ int32_t mmPutMsgToReadQueue(SMnodeMgmt *pMgmt, SRpcMsg *pMsg) {
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t mmPutMsgToQueryQueue(SMnodeMgmt *pMgmt, SRpcMsg *pMsg) {
|
int32_t mmPutMsgToQueryQueue(SMnodeMgmt *pMgmt, SRpcMsg *pMsg) {
|
||||||
|
if (NULL == pMgmt->pMnode) {
|
||||||
|
const STraceId *trace = &pMsg->info.traceId;
|
||||||
|
dGError("msg:%p, stop to pre-process in mnode since mnode is NULL, type:%s", pMsg, TMSG_INFO(pMsg->msgType));
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
pMsg->info.node = pMgmt->pMnode;
|
pMsg->info.node = pMgmt->pMnode;
|
||||||
if (mndPreProcessQueryMsg(pMsg) != 0) {
|
if (mndPreProcessQueryMsg(pMsg) != 0) {
|
||||||
const STraceId *trace = &pMsg->info.traceId;
|
const STraceId *trace = &pMsg->info.traceId;
|
||||||
|
|
|
@ -26,7 +26,7 @@ int32_t mndInitDb(SMnode *pMnode);
|
||||||
void mndCleanupDb(SMnode *pMnode);
|
void mndCleanupDb(SMnode *pMnode);
|
||||||
SDbObj *mndAcquireDb(SMnode *pMnode, const char *db);
|
SDbObj *mndAcquireDb(SMnode *pMnode, const char *db);
|
||||||
void mndReleaseDb(SMnode *pMnode, SDbObj *pDb);
|
void mndReleaseDb(SMnode *pMnode, SDbObj *pDb);
|
||||||
int32_t mndValidateDbInfo(SMnode *pMnode, SDbVgVersion *pDbs, int32_t numOfDbs, void **ppRsp, int32_t *pRspLen);
|
int32_t mndValidateDbInfo(SMnode *pMnode, SDbCacheInfo *pDbs, int32_t numOfDbs, void **ppRsp, int32_t *pRspLen);
|
||||||
int32_t mndExtractDbInfo(SMnode *pMnode, SDbObj *pDb, SUseDbRsp *pRsp, const SUseDbReq *pReq);
|
int32_t mndExtractDbInfo(SMnode *pMnode, SDbObj *pDb, SUseDbRsp *pRsp, const SUseDbReq *pReq);
|
||||||
bool mndIsDbReady(SMnode *pMnode, SDbObj *pDb);
|
bool mndIsDbReady(SMnode *pMnode, SDbObj *pDb);
|
||||||
|
|
||||||
|
|
|
@ -898,6 +898,42 @@ _OVER:
|
||||||
return code;
|
return code;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void mndDumpDbCfgInfo(SDbCfgRsp *cfgRsp, SDbObj *pDb) {
|
||||||
|
strcpy(cfgRsp->db, pDb->name);
|
||||||
|
cfgRsp->dbId = pDb->uid;
|
||||||
|
cfgRsp->cfgVersion = pDb->cfgVersion;
|
||||||
|
cfgRsp->numOfVgroups = pDb->cfg.numOfVgroups;
|
||||||
|
cfgRsp->numOfStables = pDb->cfg.numOfStables;
|
||||||
|
cfgRsp->buffer = pDb->cfg.buffer;
|
||||||
|
cfgRsp->cacheSize = pDb->cfg.cacheLastSize;
|
||||||
|
cfgRsp->pageSize = pDb->cfg.pageSize;
|
||||||
|
cfgRsp->pages = pDb->cfg.pages;
|
||||||
|
cfgRsp->daysPerFile = pDb->cfg.daysPerFile;
|
||||||
|
cfgRsp->daysToKeep0 = pDb->cfg.daysToKeep0;
|
||||||
|
cfgRsp->daysToKeep1 = pDb->cfg.daysToKeep1;
|
||||||
|
cfgRsp->daysToKeep2 = pDb->cfg.daysToKeep2;
|
||||||
|
cfgRsp->minRows = pDb->cfg.minRows;
|
||||||
|
cfgRsp->maxRows = pDb->cfg.maxRows;
|
||||||
|
cfgRsp->walFsyncPeriod = pDb->cfg.walFsyncPeriod;
|
||||||
|
cfgRsp->hashPrefix = pDb->cfg.hashPrefix;
|
||||||
|
cfgRsp->hashSuffix = pDb->cfg.hashSuffix;
|
||||||
|
cfgRsp->walLevel = pDb->cfg.walLevel;
|
||||||
|
cfgRsp->precision = pDb->cfg.precision;
|
||||||
|
cfgRsp->compression = pDb->cfg.compression;
|
||||||
|
cfgRsp->replications = pDb->cfg.replications;
|
||||||
|
cfgRsp->strict = pDb->cfg.strict;
|
||||||
|
cfgRsp->cacheLast = pDb->cfg.cacheLast;
|
||||||
|
cfgRsp->tsdbPageSize = pDb->cfg.tsdbPageSize;
|
||||||
|
cfgRsp->walRetentionPeriod = pDb->cfg.walRetentionPeriod;
|
||||||
|
cfgRsp->walRollPeriod = pDb->cfg.walRollPeriod;
|
||||||
|
cfgRsp->walRetentionSize = pDb->cfg.walRetentionSize;
|
||||||
|
cfgRsp->walSegmentSize = pDb->cfg.walSegmentSize;
|
||||||
|
cfgRsp->numOfRetensions = pDb->cfg.numOfRetensions;
|
||||||
|
cfgRsp->pRetensions = pDb->cfg.pRetensions;
|
||||||
|
cfgRsp->schemaless = pDb->cfg.schemaless;
|
||||||
|
cfgRsp->sstTrigger = pDb->cfg.sstTrigger;
|
||||||
|
}
|
||||||
|
|
||||||
static int32_t mndProcessGetDbCfgReq(SRpcMsg *pReq) {
|
static int32_t mndProcessGetDbCfgReq(SRpcMsg *pReq) {
|
||||||
SMnode *pMnode = pReq->info.node;
|
SMnode *pMnode = pReq->info.node;
|
||||||
int32_t code = -1;
|
int32_t code = -1;
|
||||||
|
@ -910,41 +946,15 @@ static int32_t mndProcessGetDbCfgReq(SRpcMsg *pReq) {
|
||||||
goto _OVER;
|
goto _OVER;
|
||||||
}
|
}
|
||||||
|
|
||||||
pDb = mndAcquireDb(pMnode, cfgReq.db);
|
if (strcasecmp(cfgReq.db, TSDB_INFORMATION_SCHEMA_DB) && strcasecmp(cfgReq.db, TSDB_PERFORMANCE_SCHEMA_DB)) {
|
||||||
if (pDb == NULL) {
|
pDb = mndAcquireDb(pMnode, cfgReq.db);
|
||||||
goto _OVER;
|
if (pDb == NULL) {
|
||||||
}
|
goto _OVER;
|
||||||
|
}
|
||||||
|
|
||||||
cfgRsp.numOfVgroups = pDb->cfg.numOfVgroups;
|
mndDumpDbCfgInfo(&cfgRsp, pDb);
|
||||||
cfgRsp.numOfStables = pDb->cfg.numOfStables;
|
}
|
||||||
cfgRsp.buffer = pDb->cfg.buffer;
|
|
||||||
cfgRsp.cacheSize = pDb->cfg.cacheLastSize;
|
|
||||||
cfgRsp.pageSize = pDb->cfg.pageSize;
|
|
||||||
cfgRsp.pages = pDb->cfg.pages;
|
|
||||||
cfgRsp.daysPerFile = pDb->cfg.daysPerFile;
|
|
||||||
cfgRsp.daysToKeep0 = pDb->cfg.daysToKeep0;
|
|
||||||
cfgRsp.daysToKeep1 = pDb->cfg.daysToKeep1;
|
|
||||||
cfgRsp.daysToKeep2 = pDb->cfg.daysToKeep2;
|
|
||||||
cfgRsp.minRows = pDb->cfg.minRows;
|
|
||||||
cfgRsp.maxRows = pDb->cfg.maxRows;
|
|
||||||
cfgRsp.walFsyncPeriod = pDb->cfg.walFsyncPeriod;
|
|
||||||
cfgRsp.hashPrefix = pDb->cfg.hashPrefix;
|
|
||||||
cfgRsp.hashSuffix = pDb->cfg.hashSuffix;
|
|
||||||
cfgRsp.walLevel = pDb->cfg.walLevel;
|
|
||||||
cfgRsp.precision = pDb->cfg.precision;
|
|
||||||
cfgRsp.compression = pDb->cfg.compression;
|
|
||||||
cfgRsp.replications = pDb->cfg.replications;
|
|
||||||
cfgRsp.strict = pDb->cfg.strict;
|
|
||||||
cfgRsp.cacheLast = pDb->cfg.cacheLast;
|
|
||||||
cfgRsp.tsdbPageSize = pDb->cfg.tsdbPageSize;
|
|
||||||
cfgRsp.walRetentionPeriod = pDb->cfg.walRetentionPeriod;
|
|
||||||
cfgRsp.walRollPeriod = pDb->cfg.walRollPeriod;
|
|
||||||
cfgRsp.walRetentionSize = pDb->cfg.walRetentionSize;
|
|
||||||
cfgRsp.walSegmentSize = pDb->cfg.walSegmentSize;
|
|
||||||
cfgRsp.numOfRetensions = pDb->cfg.numOfRetensions;
|
|
||||||
cfgRsp.pRetensions = pDb->cfg.pRetensions;
|
|
||||||
cfgRsp.schemaless = pDb->cfg.schemaless;
|
|
||||||
cfgRsp.sstTrigger = pDb->cfg.sstTrigger;
|
|
||||||
int32_t contLen = tSerializeSDbCfgRsp(NULL, 0, &cfgRsp);
|
int32_t contLen = tSerializeSDbCfgRsp(NULL, 0, &cfgRsp);
|
||||||
void *pRsp = rpcMallocCont(contLen);
|
void *pRsp = rpcMallocCont(contLen);
|
||||||
if (pRsp == NULL) {
|
if (pRsp == NULL) {
|
||||||
|
@ -1341,103 +1351,119 @@ _OVER:
|
||||||
return code;
|
return code;
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t mndValidateDbInfo(SMnode *pMnode, SDbVgVersion *pDbs, int32_t numOfDbs, void **ppRsp, int32_t *pRspLen) {
|
int32_t mndValidateDbInfo(SMnode *pMnode, SDbCacheInfo *pDbs, int32_t numOfDbs, void **ppRsp, int32_t *pRspLen) {
|
||||||
SUseDbBatchRsp batchUseRsp = {0};
|
SDbHbBatchRsp batchRsp = {0};
|
||||||
batchUseRsp.pArray = taosArrayInit(numOfDbs, sizeof(SUseDbRsp));
|
batchRsp.pArray = taosArrayInit(numOfDbs, sizeof(SDbHbRsp));
|
||||||
if (batchUseRsp.pArray == NULL) {
|
if (batchRsp.pArray == NULL) {
|
||||||
terrno = TSDB_CODE_OUT_OF_MEMORY;
|
terrno = TSDB_CODE_OUT_OF_MEMORY;
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
for (int32_t i = 0; i < numOfDbs; ++i) {
|
for (int32_t i = 0; i < numOfDbs; ++i) {
|
||||||
SDbVgVersion *pDbVgVersion = &pDbs[i];
|
SDbCacheInfo *pDbCacheInfo = &pDbs[i];
|
||||||
pDbVgVersion->dbId = be64toh(pDbVgVersion->dbId);
|
pDbCacheInfo->dbId = be64toh(pDbCacheInfo->dbId);
|
||||||
pDbVgVersion->vgVersion = htonl(pDbVgVersion->vgVersion);
|
pDbCacheInfo->vgVersion = htonl(pDbCacheInfo->vgVersion);
|
||||||
pDbVgVersion->numOfTable = htonl(pDbVgVersion->numOfTable);
|
pDbCacheInfo->cfgVersion = htonl(pDbCacheInfo->cfgVersion);
|
||||||
pDbVgVersion->stateTs = be64toh(pDbVgVersion->stateTs);
|
pDbCacheInfo->numOfTable = htonl(pDbCacheInfo->numOfTable);
|
||||||
|
pDbCacheInfo->stateTs = be64toh(pDbCacheInfo->stateTs);
|
||||||
|
|
||||||
SUseDbRsp usedbRsp = {0};
|
SDbHbRsp rsp = {0};
|
||||||
|
|
||||||
if ((0 == strcasecmp(pDbVgVersion->dbFName, TSDB_INFORMATION_SCHEMA_DB) ||
|
if ((0 == strcasecmp(pDbCacheInfo->dbFName, TSDB_INFORMATION_SCHEMA_DB) ||
|
||||||
(0 == strcasecmp(pDbVgVersion->dbFName, TSDB_PERFORMANCE_SCHEMA_DB)))) {
|
(0 == strcasecmp(pDbCacheInfo->dbFName, TSDB_PERFORMANCE_SCHEMA_DB)))) {
|
||||||
memcpy(usedbRsp.db, pDbVgVersion->dbFName, TSDB_DB_FNAME_LEN);
|
|
||||||
int32_t vgVersion = mndGetGlobalVgroupVersion(pMnode);
|
int32_t vgVersion = mndGetGlobalVgroupVersion(pMnode);
|
||||||
if (pDbVgVersion->vgVersion < vgVersion) {
|
if (pDbCacheInfo->vgVersion >= vgVersion) {
|
||||||
usedbRsp.pVgroupInfos = taosArrayInit(10, sizeof(SVgroupInfo));
|
continue;
|
||||||
|
|
||||||
mndBuildDBVgroupInfo(NULL, pMnode, usedbRsp.pVgroupInfos);
|
|
||||||
usedbRsp.vgVersion = vgVersion++;
|
|
||||||
} else {
|
|
||||||
usedbRsp.vgVersion = pDbVgVersion->vgVersion;
|
|
||||||
}
|
}
|
||||||
usedbRsp.vgNum = taosArrayGetSize(usedbRsp.pVgroupInfos);
|
|
||||||
|
rsp.useDbRsp = taosMemoryCalloc(1, sizeof(SUseDbRsp));
|
||||||
|
memcpy(rsp.useDbRsp->db, pDbCacheInfo->dbFName, TSDB_DB_FNAME_LEN);
|
||||||
|
rsp.useDbRsp->pVgroupInfos = taosArrayInit(10, sizeof(SVgroupInfo));
|
||||||
|
|
||||||
taosArrayPush(batchUseRsp.pArray, &usedbRsp);
|
mndBuildDBVgroupInfo(NULL, pMnode, rsp.useDbRsp->pVgroupInfos);
|
||||||
|
rsp.useDbRsp->vgVersion = vgVersion++;
|
||||||
|
|
||||||
|
rsp.useDbRsp->vgNum = taosArrayGetSize(rsp.useDbRsp->pVgroupInfos);
|
||||||
|
|
||||||
|
taosArrayPush(batchRsp.pArray, &rsp);
|
||||||
|
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
SDbObj *pDb = mndAcquireDb(pMnode, pDbVgVersion->dbFName);
|
SDbObj *pDb = mndAcquireDb(pMnode, pDbCacheInfo->dbFName);
|
||||||
if (pDb == NULL) {
|
if (pDb == NULL) {
|
||||||
mTrace("db:%s, no exist", pDbVgVersion->dbFName);
|
mTrace("db:%s, no exist", pDbCacheInfo->dbFName);
|
||||||
memcpy(usedbRsp.db, pDbVgVersion->dbFName, TSDB_DB_FNAME_LEN);
|
rsp.useDbRsp = taosMemoryCalloc(1, sizeof(SUseDbRsp));
|
||||||
usedbRsp.uid = pDbVgVersion->dbId;
|
memcpy(rsp.useDbRsp->db, pDbCacheInfo->dbFName, TSDB_DB_FNAME_LEN);
|
||||||
usedbRsp.vgVersion = -1;
|
rsp.useDbRsp->uid = pDbCacheInfo->dbId;
|
||||||
taosArrayPush(batchUseRsp.pArray, &usedbRsp);
|
rsp.useDbRsp->vgVersion = -1;
|
||||||
|
taosArrayPush(batchRsp.pArray, &rsp);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t numOfTable = mndGetDBTableNum(pDb, pMnode);
|
int32_t numOfTable = mndGetDBTableNum(pDb, pMnode);
|
||||||
|
|
||||||
if (pDbVgVersion->vgVersion >= pDb->vgVersion && numOfTable == pDbVgVersion->numOfTable &&
|
if (pDbCacheInfo->vgVersion >= pDb->vgVersion &&
|
||||||
pDbVgVersion->stateTs == pDb->stateTs) {
|
pDbCacheInfo->cfgVersion >= pDb->cfgVersion &&
|
||||||
mTrace("db:%s, valid dbinfo, vgVersion:%d stateTs:%" PRId64
|
numOfTable == pDbCacheInfo->numOfTable &&
|
||||||
" numOfTables:%d, not changed vgVersion:%d stateTs:%" PRId64 " numOfTables:%d",
|
pDbCacheInfo->stateTs == pDb->stateTs) {
|
||||||
pDbVgVersion->dbFName, pDbVgVersion->vgVersion, pDbVgVersion->stateTs, pDbVgVersion->numOfTable,
|
mTrace("db:%s, valid dbinfo, vgVersion:%d cfgVersion:%d stateTs:%" PRId64
|
||||||
pDb->vgVersion, pDb->stateTs, numOfTable);
|
" numOfTables:%d, not changed vgVersion:%d cfgVersion:%d stateTs:%" PRId64 " numOfTables:%d",
|
||||||
|
pDbCacheInfo->dbFName, pDbCacheInfo->vgVersion, pDbCacheInfo->cfgVersion, pDbCacheInfo->stateTs, pDbCacheInfo->numOfTable,
|
||||||
|
pDb->vgVersion, pDb->cfgVersion, pDb->stateTs, numOfTable);
|
||||||
mndReleaseDb(pMnode, pDb);
|
mndReleaseDb(pMnode, pDb);
|
||||||
continue;
|
continue;
|
||||||
} else {
|
} else {
|
||||||
mInfo("db:%s, valid dbinfo, vgVersion:%d stateTs:%" PRId64
|
mInfo("db:%s, valid dbinfo, vgVersion:%d cfgVersion:%d stateTs:%" PRId64
|
||||||
" numOfTables:%d, changed to vgVersion:%d stateTs:%" PRId64 " numOfTables:%d",
|
" numOfTables:%d, changed to vgVersion:%d cfgVersion:%d stateTs:%" PRId64 " numOfTables:%d",
|
||||||
pDbVgVersion->dbFName, pDbVgVersion->vgVersion, pDbVgVersion->stateTs, pDbVgVersion->numOfTable,
|
pDbCacheInfo->dbFName, pDbCacheInfo->vgVersion, pDbCacheInfo->cfgVersion, pDbCacheInfo->stateTs, pDbCacheInfo->numOfTable,
|
||||||
pDb->vgVersion, pDb->stateTs, numOfTable);
|
pDb->vgVersion, pDb->cfgVersion, pDb->stateTs, numOfTable);
|
||||||
}
|
}
|
||||||
|
|
||||||
usedbRsp.pVgroupInfos = taosArrayInit(pDb->cfg.numOfVgroups, sizeof(SVgroupInfo));
|
if (pDbCacheInfo->cfgVersion < pDb->cfgVersion) {
|
||||||
if (usedbRsp.pVgroupInfos == NULL) {
|
rsp.cfgRsp = taosMemoryCalloc(1, sizeof(SDbCfgRsp));
|
||||||
mndReleaseDb(pMnode, pDb);
|
mndDumpDbCfgInfo(rsp.cfgRsp, pDb);
|
||||||
mError("db:%s, failed to malloc usedb response", pDb->name);
|
|
||||||
continue;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
mndBuildDBVgroupInfo(pDb, pMnode, usedbRsp.pVgroupInfos);
|
if (pDbCacheInfo->vgVersion < pDb->vgVersion ||
|
||||||
memcpy(usedbRsp.db, pDb->name, TSDB_DB_FNAME_LEN);
|
numOfTable != pDbCacheInfo->numOfTable ||
|
||||||
usedbRsp.uid = pDb->uid;
|
pDbCacheInfo->stateTs != pDb->stateTs) {
|
||||||
usedbRsp.vgVersion = pDb->vgVersion;
|
rsp.useDbRsp = taosMemoryCalloc(1, sizeof(SUseDbRsp));
|
||||||
usedbRsp.stateTs = pDb->stateTs;
|
rsp.useDbRsp->pVgroupInfos = taosArrayInit(pDb->cfg.numOfVgroups, sizeof(SVgroupInfo));
|
||||||
usedbRsp.vgNum = (int32_t)taosArrayGetSize(usedbRsp.pVgroupInfos);
|
if (rsp.useDbRsp->pVgroupInfos == NULL) {
|
||||||
usedbRsp.hashMethod = pDb->cfg.hashMethod;
|
mndReleaseDb(pMnode, pDb);
|
||||||
usedbRsp.hashPrefix = pDb->cfg.hashPrefix;
|
mError("db:%s, failed to malloc usedb response", pDb->name);
|
||||||
usedbRsp.hashSuffix = pDb->cfg.hashSuffix;
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
taosArrayPush(batchUseRsp.pArray, &usedbRsp);
|
mndBuildDBVgroupInfo(pDb, pMnode, rsp.useDbRsp->pVgroupInfos);
|
||||||
|
memcpy(rsp.useDbRsp->db, pDb->name, TSDB_DB_FNAME_LEN);
|
||||||
|
rsp.useDbRsp->uid = pDb->uid;
|
||||||
|
rsp.useDbRsp->vgVersion = pDb->vgVersion;
|
||||||
|
rsp.useDbRsp->stateTs = pDb->stateTs;
|
||||||
|
rsp.useDbRsp->vgNum = (int32_t)taosArrayGetSize(rsp.useDbRsp->pVgroupInfos);
|
||||||
|
rsp.useDbRsp->hashMethod = pDb->cfg.hashMethod;
|
||||||
|
rsp.useDbRsp->hashPrefix = pDb->cfg.hashPrefix;
|
||||||
|
rsp.useDbRsp->hashSuffix = pDb->cfg.hashSuffix;
|
||||||
|
}
|
||||||
|
|
||||||
|
taosArrayPush(batchRsp.pArray, &rsp);
|
||||||
mndReleaseDb(pMnode, pDb);
|
mndReleaseDb(pMnode, pDb);
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t rspLen = tSerializeSUseDbBatchRsp(NULL, 0, &batchUseRsp);
|
int32_t rspLen = tSerializeSDbHbBatchRsp(NULL, 0, &batchRsp);
|
||||||
void *pRsp = taosMemoryMalloc(rspLen);
|
void *pRsp = taosMemoryMalloc(rspLen);
|
||||||
if (pRsp == NULL) {
|
if (pRsp == NULL) {
|
||||||
terrno = TSDB_CODE_OUT_OF_MEMORY;
|
terrno = TSDB_CODE_OUT_OF_MEMORY;
|
||||||
tFreeSUseDbBatchRsp(&batchUseRsp);
|
tFreeSDbHbBatchRsp(&batchRsp);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
tSerializeSUseDbBatchRsp(pRsp, rspLen, &batchUseRsp);
|
tSerializeSDbHbBatchRsp(pRsp, rspLen, &batchRsp);
|
||||||
|
|
||||||
*ppRsp = pRsp;
|
*ppRsp = pRsp;
|
||||||
*pRspLen = rspLen;
|
*pRspLen = rspLen;
|
||||||
|
|
||||||
tFreeSUseDbBatchRsp(&batchUseRsp);
|
tFreeSDbHbBatchRsp(&batchRsp);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -534,7 +534,7 @@ static int32_t mndProcessQueryHeartBeat(SMnode *pMnode, SRpcMsg *pMsg, SClientHb
|
||||||
case HEARTBEAT_KEY_DBINFO: {
|
case HEARTBEAT_KEY_DBINFO: {
|
||||||
void *rspMsg = NULL;
|
void *rspMsg = NULL;
|
||||||
int32_t rspLen = 0;
|
int32_t rspLen = 0;
|
||||||
mndValidateDbInfo(pMnode, kv->value, kv->valueLen / sizeof(SDbVgVersion), &rspMsg, &rspLen);
|
mndValidateDbInfo(pMnode, kv->value, kv->valueLen / sizeof(SDbCacheInfo), &rspMsg, &rspLen);
|
||||||
if (rspMsg && rspLen > 0) {
|
if (rspMsg && rspLen > 0) {
|
||||||
SKv kv1 = {.key = HEARTBEAT_KEY_DBINFO, .valueLen = rspLen, .value = rspMsg};
|
SKv kv1 = {.key = HEARTBEAT_KEY_DBINFO, .valueLen = rspLen, .value = rspMsg};
|
||||||
taosArrayPush(hbRsp.info, &kv1);
|
taosArrayPush(hbRsp.info, &kv1);
|
||||||
|
|
|
@ -2742,7 +2742,7 @@ void mndExtractTbNameFromStbFullName(const char *stbFullName, char *dst, int32_t
|
||||||
// varDataSetLen(stbName, strlen(&stbName[VARSTR_HEADER_SIZE]));
|
// varDataSetLen(stbName, strlen(&stbName[VARSTR_HEADER_SIZE]));
|
||||||
//
|
//
|
||||||
// SColumnInfoData *pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
|
// SColumnInfoData *pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
|
||||||
// colDataAppend(pColInfo, numOfRows, (const char *)stbName, false);
|
// colDataSetVal(pColInfo, numOfRows, (const char *)stbName, false);
|
||||||
//
|
//
|
||||||
// char db[TSDB_DB_NAME_LEN + VARSTR_HEADER_SIZE] = {0};
|
// char db[TSDB_DB_NAME_LEN + VARSTR_HEADER_SIZE] = {0};
|
||||||
// tNameFromString(&name, pStb->db, T_NAME_ACCT | T_NAME_DB);
|
// tNameFromString(&name, pStb->db, T_NAME_ACCT | T_NAME_DB);
|
||||||
|
@ -2750,29 +2750,29 @@ void mndExtractTbNameFromStbFullName(const char *stbFullName, char *dst, int32_t
|
||||||
// varDataSetLen(db, strlen(varDataVal(db)));
|
// varDataSetLen(db, strlen(varDataVal(db)));
|
||||||
//
|
//
|
||||||
// pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
|
// pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
|
||||||
// colDataAppend(pColInfo, numOfRows, (const char *)db, false);
|
// colDataSetVal(pColInfo, numOfRows, (const char *)db, false);
|
||||||
//
|
//
|
||||||
// pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
|
// pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
|
||||||
// colDataAppend(pColInfo, numOfRows, (const char *)&pStb->createdTime, false);
|
// colDataSetVal(pColInfo, numOfRows, (const char *)&pStb->createdTime, false);
|
||||||
//
|
//
|
||||||
// pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
|
// pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
|
||||||
// colDataAppend(pColInfo, numOfRows, (const char *)&pStb->numOfColumns, false);
|
// colDataSetVal(pColInfo, numOfRows, (const char *)&pStb->numOfColumns, false);
|
||||||
//
|
//
|
||||||
// pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
|
// pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
|
||||||
// colDataAppend(pColInfo, numOfRows, (const char *)&pStb->numOfTags, false);
|
// colDataSetVal(pColInfo, numOfRows, (const char *)&pStb->numOfTags, false);
|
||||||
//
|
//
|
||||||
// pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
|
// pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
|
||||||
// colDataAppend(pColInfo, numOfRows, (const char *)&pStb->updateTime, false); // number of tables
|
// colDataSetVal(pColInfo, numOfRows, (const char *)&pStb->updateTime, false); // number of tables
|
||||||
//
|
//
|
||||||
// pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
|
// pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
|
||||||
// if (pStb->commentLen > 0) {
|
// if (pStb->commentLen > 0) {
|
||||||
// char comment[TSDB_TB_COMMENT_LEN + VARSTR_HEADER_SIZE] = {0};
|
// char comment[TSDB_TB_COMMENT_LEN + VARSTR_HEADER_SIZE] = {0};
|
||||||
// STR_TO_VARSTR(comment, pStb->comment);
|
// STR_TO_VARSTR(comment, pStb->comment);
|
||||||
// colDataAppend(pColInfo, numOfRows, comment, false);
|
// colDataSetVal(pColInfo, numOfRows, comment, false);
|
||||||
// } else if (pStb->commentLen == 0) {
|
// } else if (pStb->commentLen == 0) {
|
||||||
// char comment[VARSTR_HEADER_SIZE + VARSTR_HEADER_SIZE] = {0};
|
// char comment[VARSTR_HEADER_SIZE + VARSTR_HEADER_SIZE] = {0};
|
||||||
// STR_TO_VARSTR(comment, "");
|
// STR_TO_VARSTR(comment, "");
|
||||||
// colDataAppend(pColInfo, numOfRows, comment, false);
|
// colDataSetVal(pColInfo, numOfRows, comment, false);
|
||||||
// } else {
|
// } else {
|
||||||
// colDataSetNULL(pColInfo, numOfRows);
|
// colDataSetNULL(pColInfo, numOfRows);
|
||||||
// }
|
// }
|
||||||
|
@ -2782,14 +2782,14 @@ void mndExtractTbNameFromStbFullName(const char *stbFullName, char *dst, int32_t
|
||||||
// varDataSetLen(watermark, strlen(varDataVal(watermark)));
|
// varDataSetLen(watermark, strlen(varDataVal(watermark)));
|
||||||
//
|
//
|
||||||
// pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
|
// pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
|
||||||
// colDataAppend(pColInfo, numOfRows, (const char *)watermark, false);
|
// colDataSetVal(pColInfo, numOfRows, (const char *)watermark, false);
|
||||||
//
|
//
|
||||||
// char maxDelay[64 + VARSTR_HEADER_SIZE] = {0};
|
// char maxDelay[64 + VARSTR_HEADER_SIZE] = {0};
|
||||||
// sprintf(varDataVal(maxDelay), "%" PRId64 "a,%" PRId64 "a", pStb->maxdelay[0], pStb->maxdelay[1]);
|
// sprintf(varDataVal(maxDelay), "%" PRId64 "a,%" PRId64 "a", pStb->maxdelay[0], pStb->maxdelay[1]);
|
||||||
// varDataSetLen(maxDelay, strlen(varDataVal(maxDelay)));
|
// varDataSetLen(maxDelay, strlen(varDataVal(maxDelay)));
|
||||||
//
|
//
|
||||||
// pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
|
// pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
|
||||||
// colDataAppend(pColInfo, numOfRows, (const char *)maxDelay, false);
|
// colDataSetVal(pColInfo, numOfRows, (const char *)maxDelay, false);
|
||||||
//
|
//
|
||||||
// char rollup[160 + VARSTR_HEADER_SIZE] = {0};
|
// char rollup[160 + VARSTR_HEADER_SIZE] = {0};
|
||||||
// int32_t rollupNum = (int32_t)taosArrayGetSize(pStb->pFuncs);
|
// int32_t rollupNum = (int32_t)taosArrayGetSize(pStb->pFuncs);
|
||||||
|
@ -2808,7 +2808,7 @@ void mndExtractTbNameFromStbFullName(const char *stbFullName, char *dst, int32_t
|
||||||
// varDataSetLen(rollup, strlen(varDataVal(rollup)));
|
// varDataSetLen(rollup, strlen(varDataVal(rollup)));
|
||||||
//
|
//
|
||||||
// pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
|
// pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
|
||||||
// colDataAppend(pColInfo, numOfRows, (const char *)rollup, false);
|
// colDataSetVal(pColInfo, numOfRows, (const char *)rollup, false);
|
||||||
//
|
//
|
||||||
// numOfRows++;
|
// numOfRows++;
|
||||||
// sdbRelease(pSdb, pStb);
|
// sdbRelease(pSdb, pStb);
|
||||||
|
@ -3067,20 +3067,20 @@ static int32_t buildDbColsInfoBlock(const SSDataBlock *p, const SSysTableMeta *p
|
||||||
for (int32_t j = 0; j < pm->colNum; j++) {
|
for (int32_t j = 0; j < pm->colNum; j++) {
|
||||||
// table name
|
// table name
|
||||||
SColumnInfoData *pColInfoData = taosArrayGet(p->pDataBlock, 0);
|
SColumnInfoData *pColInfoData = taosArrayGet(p->pDataBlock, 0);
|
||||||
colDataAppend(pColInfoData, numOfRows, tName, false);
|
colDataSetVal(pColInfoData, numOfRows, tName, false);
|
||||||
|
|
||||||
// database name
|
// database name
|
||||||
pColInfoData = taosArrayGet(p->pDataBlock, 1);
|
pColInfoData = taosArrayGet(p->pDataBlock, 1);
|
||||||
colDataAppend(pColInfoData, numOfRows, dName, false);
|
colDataSetVal(pColInfoData, numOfRows, dName, false);
|
||||||
|
|
||||||
pColInfoData = taosArrayGet(p->pDataBlock, 2);
|
pColInfoData = taosArrayGet(p->pDataBlock, 2);
|
||||||
colDataAppend(pColInfoData, numOfRows, typeName, false);
|
colDataSetVal(pColInfoData, numOfRows, typeName, false);
|
||||||
|
|
||||||
// col name
|
// col name
|
||||||
char colName[TSDB_COL_NAME_LEN + VARSTR_HEADER_SIZE] = {0};
|
char colName[TSDB_COL_NAME_LEN + VARSTR_HEADER_SIZE] = {0};
|
||||||
STR_TO_VARSTR(colName, pm->schema[j].name);
|
STR_TO_VARSTR(colName, pm->schema[j].name);
|
||||||
pColInfoData = taosArrayGet(p->pDataBlock, 3);
|
pColInfoData = taosArrayGet(p->pDataBlock, 3);
|
||||||
colDataAppend(pColInfoData, numOfRows, colName, false);
|
colDataSetVal(pColInfoData, numOfRows, colName, false);
|
||||||
|
|
||||||
// col type
|
// col type
|
||||||
int8_t colType = pm->schema[j].type;
|
int8_t colType = pm->schema[j].type;
|
||||||
|
@ -3095,10 +3095,10 @@ static int32_t buildDbColsInfoBlock(const SSDataBlock *p, const SSysTableMeta *p
|
||||||
(int32_t)((pm->schema[j].bytes - VARSTR_HEADER_SIZE) / TSDB_NCHAR_SIZE));
|
(int32_t)((pm->schema[j].bytes - VARSTR_HEADER_SIZE) / TSDB_NCHAR_SIZE));
|
||||||
}
|
}
|
||||||
varDataSetLen(colTypeStr, colTypeLen);
|
varDataSetLen(colTypeStr, colTypeLen);
|
||||||
colDataAppend(pColInfoData, numOfRows, (char *)colTypeStr, false);
|
colDataSetVal(pColInfoData, numOfRows, (char *)colTypeStr, false);
|
||||||
|
|
||||||
pColInfoData = taosArrayGet(p->pDataBlock, 5);
|
pColInfoData = taosArrayGet(p->pDataBlock, 5);
|
||||||
colDataAppend(pColInfoData, numOfRows, (const char *)&pm->schema[j].bytes, false);
|
colDataSetVal(pColInfoData, numOfRows, (const char *)&pm->schema[j].bytes, false);
|
||||||
for (int32_t k = 6; k <= 8; ++k) {
|
for (int32_t k = 6; k <= 8; ++k) {
|
||||||
pColInfoData = taosArrayGet(p->pDataBlock, k);
|
pColInfoData = taosArrayGet(p->pDataBlock, k);
|
||||||
colDataSetNULL(pColInfoData, numOfRows);
|
colDataSetNULL(pColInfoData, numOfRows);
|
||||||
|
@ -3192,19 +3192,19 @@ static int32_t mndRetrieveStbCol(SRpcMsg *pReq, SShowObj *pShow, SSDataBlock *pB
|
||||||
for (int i = 0; i < pStb->numOfColumns; i++) {
|
for (int i = 0; i < pStb->numOfColumns; i++) {
|
||||||
int32_t cols = 0;
|
int32_t cols = 0;
|
||||||
SColumnInfoData *pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
|
SColumnInfoData *pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
|
||||||
colDataAppend(pColInfo, numOfRows, (const char *)stbName, false);
|
colDataSetVal(pColInfo, numOfRows, (const char *)stbName, false);
|
||||||
|
|
||||||
pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
|
pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
|
||||||
colDataAppend(pColInfo, numOfRows, (const char *)db, false);
|
colDataSetVal(pColInfo, numOfRows, (const char *)db, false);
|
||||||
|
|
||||||
pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
|
pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
|
||||||
colDataAppend(pColInfo, numOfRows, typeName, false);
|
colDataSetVal(pColInfo, numOfRows, typeName, false);
|
||||||
|
|
||||||
// col name
|
// col name
|
||||||
char colName[TSDB_COL_NAME_LEN + VARSTR_HEADER_SIZE] = {0};
|
char colName[TSDB_COL_NAME_LEN + VARSTR_HEADER_SIZE] = {0};
|
||||||
STR_TO_VARSTR(colName, pStb->pColumns[i].name);
|
STR_TO_VARSTR(colName, pStb->pColumns[i].name);
|
||||||
pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
|
pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
|
||||||
colDataAppend(pColInfo, numOfRows, colName, false);
|
colDataSetVal(pColInfo, numOfRows, colName, false);
|
||||||
|
|
||||||
// col type
|
// col type
|
||||||
int8_t colType = pStb->pColumns[i].type;
|
int8_t colType = pStb->pColumns[i].type;
|
||||||
|
@ -3219,10 +3219,10 @@ static int32_t mndRetrieveStbCol(SRpcMsg *pReq, SShowObj *pShow, SSDataBlock *pB
|
||||||
(int32_t)((pStb->pColumns[i].bytes - VARSTR_HEADER_SIZE) / TSDB_NCHAR_SIZE));
|
(int32_t)((pStb->pColumns[i].bytes - VARSTR_HEADER_SIZE) / TSDB_NCHAR_SIZE));
|
||||||
}
|
}
|
||||||
varDataSetLen(colTypeStr, colTypeLen);
|
varDataSetLen(colTypeStr, colTypeLen);
|
||||||
colDataAppend(pColInfo, numOfRows, (char *)colTypeStr, false);
|
colDataSetVal(pColInfo, numOfRows, (char *)colTypeStr, false);
|
||||||
|
|
||||||
pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
|
pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
|
||||||
colDataAppend(pColInfo, numOfRows, (const char *)&pStb->pColumns[i].bytes, false);
|
colDataSetVal(pColInfo, numOfRows, (const char *)&pStb->pColumns[i].bytes, false);
|
||||||
while (cols < pShow->numOfColumns) {
|
while (cols < pShow->numOfColumns) {
|
||||||
pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
|
pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
|
||||||
colDataSetNULL(pColInfo, numOfRows);
|
colDataSetNULL(pColInfo, numOfRows);
|
||||||
|
|
|
@ -1306,7 +1306,7 @@ int32_t mndPauseAllStreamTasks(STrans *pTrans, SStreamObj *pStream) {
|
||||||
int32_t sz = taosArrayGetSize(pTasks);
|
int32_t sz = taosArrayGetSize(pTasks);
|
||||||
for (int32_t j = 0; j < sz; j++) {
|
for (int32_t j = 0; j < sz; j++) {
|
||||||
SStreamTask *pTask = taosArrayGetP(pTasks, j);
|
SStreamTask *pTask = taosArrayGetP(pTasks, j);
|
||||||
if (mndPauseStreamTask(pTrans, pTask) < 0) {
|
if (pTask->taskLevel == TASK_LEVEL__SOURCE && mndPauseStreamTask(pTrans, pTask) < 0) {
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1430,7 +1430,7 @@ int32_t mndResumeAllStreamTasks(STrans *pTrans, SStreamObj *pStream, int8_t igUn
|
||||||
int32_t sz = taosArrayGetSize(pTasks);
|
int32_t sz = taosArrayGetSize(pTasks);
|
||||||
for (int32_t j = 0; j < sz; j++) {
|
for (int32_t j = 0; j < sz; j++) {
|
||||||
SStreamTask *pTask = taosArrayGetP(pTasks, j);
|
SStreamTask *pTask = taosArrayGetP(pTasks, j);
|
||||||
if (mndResumeStreamTask(pTrans, pTask, igUntreated) < 0) {
|
if (pTask->taskLevel == TASK_LEVEL__SOURCE && mndResumeStreamTask(pTrans, pTask, igUntreated) < 0) {
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -125,6 +125,11 @@ int32_t metaUidFilterCachePut(SMeta *pMeta, uint64_t suid, const void *pKey, in
|
||||||
int32_t payloadLen, double selectivityRatio);
|
int32_t payloadLen, double selectivityRatio);
|
||||||
int32_t metaUidCacheClear(SMeta *pMeta, uint64_t suid);
|
int32_t metaUidCacheClear(SMeta *pMeta, uint64_t suid);
|
||||||
tb_uid_t metaGetTableEntryUidByName(SMeta *pMeta, const char *name);
|
tb_uid_t metaGetTableEntryUidByName(SMeta *pMeta, const char *name);
|
||||||
|
int32_t metaTbGroupCacheClear(SMeta* pMeta, uint64_t suid);
|
||||||
|
int32_t metaGetCachedTbGroup(SMeta* pMeta, tb_uid_t suid, const uint8_t* pKey, int32_t keyLen, SArray** pList);
|
||||||
|
int32_t metaPutTbGroupToCache(SMeta* pMeta, uint64_t suid, const void* pKey, int32_t keyLen, void* pPayload,
|
||||||
|
int32_t payloadLen);
|
||||||
|
|
||||||
int64_t metaGetTbNum(SMeta *pMeta);
|
int64_t metaGetTbNum(SMeta *pMeta);
|
||||||
int64_t metaGetNtbNum(SMeta *pMeta);
|
int64_t metaGetNtbNum(SMeta *pMeta);
|
||||||
typedef struct {
|
typedef struct {
|
||||||
|
@ -177,9 +182,9 @@ typedef struct STsdbReader STsdbReader;
|
||||||
#define CACHESCAN_RETRIEVE_LAST_ROW 0x4
|
#define CACHESCAN_RETRIEVE_LAST_ROW 0x4
|
||||||
#define CACHESCAN_RETRIEVE_LAST 0x8
|
#define CACHESCAN_RETRIEVE_LAST 0x8
|
||||||
|
|
||||||
int32_t tsdbSetTableList(STsdbReader *pReader, const void *pTableList, int32_t num);
|
int32_t tsdbReaderOpen(SVnode *pVnode, SQueryTableDataCond *pCond, void *pTableList, int32_t numOfTables,
|
||||||
int32_t tsdbReaderOpen(SVnode *pVnode, SQueryTableDataCond *pCond, void *pTableList, int32_t numOfTables,
|
SSDataBlock *pResBlock, STsdbReader **ppReader, const char *idstr, bool countOnly, SHashObj** pIgnoreTables);
|
||||||
SSDataBlock *pResBlock, STsdbReader **ppReader, const char *idstr, bool countOnly);
|
int32_t tsdbSetTableList(STsdbReader *pReader, const void *pTableList, int32_t num);
|
||||||
|
|
||||||
void tsdbReaderSetId(STsdbReader *pReader, const char *idstr);
|
void tsdbReaderSetId(STsdbReader *pReader, const char *idstr);
|
||||||
void tsdbReaderClose(STsdbReader *pReader);
|
void tsdbReaderClose(STsdbReader *pReader);
|
||||||
|
@ -197,6 +202,7 @@ int32_t tsdbSetTableList(STsdbReader *pReader, const void *pTableList, int3
|
||||||
void tsdbReaderSetId(STsdbReader *pReader, const char *idstr);
|
void tsdbReaderSetId(STsdbReader *pReader, const char *idstr);
|
||||||
void tsdbReaderSetCloseFlag(STsdbReader *pReader);
|
void tsdbReaderSetCloseFlag(STsdbReader *pReader);
|
||||||
|
|
||||||
|
int32_t tsdbReuseCacherowsReader(void* pReader, void* pTableIdList, int32_t numOfTables);
|
||||||
int32_t tsdbCacherowsReaderOpen(void *pVnode, int32_t type, void *pTableIdList, int32_t numOfTables, int32_t numOfCols,
|
int32_t tsdbCacherowsReaderOpen(void *pVnode, int32_t type, void *pTableIdList, int32_t numOfTables, int32_t numOfCols,
|
||||||
SArray *pCidList, int32_t *pSlotIds, uint64_t suid, void **pReader, const char *idstr);
|
SArray *pCidList, int32_t *pSlotIds, uint64_t suid, void **pReader, const char *idstr);
|
||||||
int32_t tsdbRetrieveCacheRows(void *pReader, SSDataBlock *pResBlock, const int32_t *slotIds, const int32_t *dstSlotIds,
|
int32_t tsdbRetrieveCacheRows(void *pReader, SSDataBlock *pResBlock, const int32_t *slotIds, const int32_t *dstSlotIds,
|
||||||
|
@ -264,7 +270,7 @@ int32_t tqSeekVer(STqReader *pReader, int64_t ver, const char *id);
|
||||||
int32_t tqNextBlockInWal(STqReader* pReader);
|
int32_t tqNextBlockInWal(STqReader* pReader);
|
||||||
bool tqNextBlockImpl(STqReader *pReader, const char* idstr);
|
bool tqNextBlockImpl(STqReader *pReader, const char* idstr);
|
||||||
|
|
||||||
int32_t extractSubmitMsgFromWal(SWalReader *pReader, SPackedData *pPackedData);
|
int32_t extractMsgFromWal(SWalReader* pReader, void** pItem, const char* id);
|
||||||
int32_t tqReaderSetSubmitMsg(STqReader *pReader, void *msgStr, int32_t msgLen, int64_t ver);
|
int32_t tqReaderSetSubmitMsg(STqReader *pReader, void *msgStr, int32_t msgLen, int64_t ver);
|
||||||
bool tqNextDataBlockFilterOut(STqReader *pReader, SHashObj *filterOutUids);
|
bool tqNextDataBlockFilterOut(STqReader *pReader, SHashObj *filterOutUids);
|
||||||
int32_t tqRetrieveDataBlock(STqReader *pReader, const char* idstr);
|
int32_t tqRetrieveDataBlock(STqReader *pReader, const char* idstr);
|
||||||
|
|
|
@ -46,23 +46,23 @@ typedef struct STqOffsetStore STqOffsetStore;
|
||||||
|
|
||||||
// tqPush
|
// tqPush
|
||||||
|
|
||||||
typedef struct {
|
//typedef struct {
|
||||||
// msg info
|
// // msg info
|
||||||
int64_t consumerId;
|
// int64_t consumerId;
|
||||||
int64_t reqOffset;
|
// int64_t reqOffset;
|
||||||
int64_t processedVer;
|
// int64_t processedVer;
|
||||||
int32_t epoch;
|
// int32_t epoch;
|
||||||
// rpc info
|
// // rpc info
|
||||||
int64_t reqId;
|
// int64_t reqId;
|
||||||
SRpcHandleInfo rpcInfo;
|
// SRpcHandleInfo rpcInfo;
|
||||||
tmr_h timerId;
|
// tmr_h timerId;
|
||||||
int8_t tmrStopped;
|
// int8_t tmrStopped;
|
||||||
// exec
|
// // exec
|
||||||
int8_t inputStatus;
|
// int8_t inputStatus;
|
||||||
int8_t execStatus;
|
// int8_t execStatus;
|
||||||
SStreamQueue inputQ;
|
// SStreamQueue inputQ;
|
||||||
SRWLatch lock;
|
// SRWLatch lock;
|
||||||
} STqPushHandle;
|
//} STqPushHandle;
|
||||||
|
|
||||||
// tqExec
|
// tqExec
|
||||||
|
|
||||||
|
@ -90,6 +90,11 @@ typedef struct {
|
||||||
int32_t numOfCols; // number of out pout column, temporarily used
|
int32_t numOfCols; // number of out pout column, temporarily used
|
||||||
} STqExecHandle;
|
} STqExecHandle;
|
||||||
|
|
||||||
|
typedef enum tq_handle_status{
|
||||||
|
TMQ_HANDLE_STATUS_IDLE = 0,
|
||||||
|
TMQ_HANDLE_STATUS_EXEC = 1,
|
||||||
|
}tq_handle_status;
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
char subKey[TSDB_SUBSCRIBE_KEY_LEN];
|
char subKey[TSDB_SUBSCRIBE_KEY_LEN];
|
||||||
int64_t consumerId;
|
int64_t consumerId;
|
||||||
|
@ -98,11 +103,11 @@ typedef struct {
|
||||||
int64_t snapshotVer;
|
int64_t snapshotVer;
|
||||||
SWalReader* pWalReader;
|
SWalReader* pWalReader;
|
||||||
SWalRef* pRef;
|
SWalRef* pRef;
|
||||||
STqPushHandle pushHandle; // push
|
// STqPushHandle pushHandle; // push
|
||||||
STqExecHandle execHandle; // exec
|
STqExecHandle execHandle; // exec
|
||||||
SRpcMsg* msg;
|
SRpcMsg* msg;
|
||||||
int32_t noDataPollCnt;
|
int32_t noDataPollCnt;
|
||||||
int8_t exec;
|
tq_handle_status status;
|
||||||
} STqHandle;
|
} STqHandle;
|
||||||
|
|
||||||
struct STQ {
|
struct STQ {
|
||||||
|
@ -177,13 +182,13 @@ int32_t tqExpandTask(STQ* pTq, SStreamTask* pTask, int64_t ver);
|
||||||
int32_t tqStreamTasksScanWal(STQ* pTq);
|
int32_t tqStreamTasksScanWal(STQ* pTq);
|
||||||
|
|
||||||
// tq util
|
// tq util
|
||||||
|
int32_t extractDelDataBlock(const void* pData, int32_t len, int64_t ver, SStreamRefDataBlock** pRefBlock);
|
||||||
char* createStreamTaskIdStr(int64_t streamId, int32_t taskId);
|
char* createStreamTaskIdStr(int64_t streamId, int32_t taskId);
|
||||||
int32_t tqAddInputBlockNLaunchTask(SStreamTask* pTask, SStreamQueueItem* pQueueItem, int64_t ver);
|
int32_t tqAddInputBlockNLaunchTask(SStreamTask* pTask, SStreamQueueItem* pQueueItem);
|
||||||
int32_t tqExtractDataForMq(STQ* pTq, STqHandle* pHandle, const SMqPollReq* pRequest, SRpcMsg* pMsg);
|
int32_t tqExtractDataForMq(STQ* pTq, STqHandle* pHandle, const SMqPollReq* pRequest, SRpcMsg* pMsg);
|
||||||
int32_t tqDoSendDataRsp(const SRpcHandleInfo* pRpcHandleInfo, const SMqDataRsp* pRsp, int32_t epoch, int64_t consumerId,
|
int32_t tqDoSendDataRsp(const SRpcHandleInfo* pRpcHandleInfo, const SMqDataRsp* pRsp, int32_t epoch, int64_t consumerId,
|
||||||
int32_t type, int64_t sver, int64_t ever);
|
int32_t type, int64_t sver, int64_t ever);
|
||||||
int32_t tqInitDataRsp(SMqDataRsp* pRsp, const SMqPollReq* pReq);
|
int32_t tqInitDataRsp(SMqDataRsp* pRsp, const SMqPollReq* pReq);
|
||||||
bool tqIsHandleExecuting(STqHandle* pHandle);
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -220,7 +220,7 @@ int32_t tqProcessTaskResumeReq(STQ* pTq, int64_t version, char* msg, int32_t msg
|
||||||
int32_t tqProcessStreamTaskCheckReq(STQ* pTq, SRpcMsg* pMsg);
|
int32_t tqProcessStreamTaskCheckReq(STQ* pTq, SRpcMsg* pMsg);
|
||||||
int32_t tqProcessStreamTaskCheckRsp(STQ* pTq, int64_t version, char* msg, int32_t msgLen);
|
int32_t tqProcessStreamTaskCheckRsp(STQ* pTq, int64_t version, char* msg, int32_t msgLen);
|
||||||
int32_t tqProcessSubmitReqForSubscribe(STQ* pTq);
|
int32_t tqProcessSubmitReqForSubscribe(STQ* pTq);
|
||||||
int32_t tqProcessDelReq(STQ* pTq, void* pReq, int32_t len, int64_t ver);
|
int32_t tqProcessDeleteDataReq(STQ* pTq, void* pReq, int32_t len, int64_t ver);
|
||||||
int32_t tqProcessTaskRunReq(STQ* pTq, SRpcMsg* pMsg);
|
int32_t tqProcessTaskRunReq(STQ* pTq, SRpcMsg* pMsg);
|
||||||
int32_t tqProcessTaskDispatchReq(STQ* pTq, SRpcMsg* pMsg, bool exec);
|
int32_t tqProcessTaskDispatchReq(STQ* pTq, SRpcMsg* pMsg, bool exec);
|
||||||
int32_t tqProcessTaskDispatchRsp(STQ* pTq, SRpcMsg* pMsg);
|
int32_t tqProcessTaskDispatchRsp(STQ* pTq, SRpcMsg* pMsg);
|
||||||
|
|
|
@ -59,6 +59,13 @@ struct SMetaCache {
|
||||||
SHashObj* pTableEntry;
|
SHashObj* pTableEntry;
|
||||||
SLRUCache* pUidResCache;
|
SLRUCache* pUidResCache;
|
||||||
} sTagFilterResCache;
|
} sTagFilterResCache;
|
||||||
|
|
||||||
|
struct STbGroupResCache {
|
||||||
|
TdThreadMutex lock;
|
||||||
|
uint32_t accTimes;
|
||||||
|
SHashObj* pTableEntry;
|
||||||
|
SLRUCache* pResCache;
|
||||||
|
} STbGroupResCache;
|
||||||
};
|
};
|
||||||
|
|
||||||
static void entryCacheClose(SMeta* pMeta) {
|
static void entryCacheClose(SMeta* pMeta) {
|
||||||
|
@ -144,6 +151,25 @@ int32_t metaCacheOpen(SMeta* pMeta) {
|
||||||
taosHashSetFreeFp(pCache->sTagFilterResCache.pTableEntry, freeCacheEntryFp);
|
taosHashSetFreeFp(pCache->sTagFilterResCache.pTableEntry, freeCacheEntryFp);
|
||||||
taosThreadMutexInit(&pCache->sTagFilterResCache.lock, NULL);
|
taosThreadMutexInit(&pCache->sTagFilterResCache.lock, NULL);
|
||||||
|
|
||||||
|
|
||||||
|
pCache->STbGroupResCache.pResCache = taosLRUCacheInit(5 * 1024 * 1024, -1, 0.5);
|
||||||
|
if (pCache->STbGroupResCache.pResCache == NULL) {
|
||||||
|
code = TSDB_CODE_OUT_OF_MEMORY;
|
||||||
|
goto _err2;
|
||||||
|
}
|
||||||
|
|
||||||
|
pCache->STbGroupResCache.accTimes = 0;
|
||||||
|
pCache->STbGroupResCache.pTableEntry =
|
||||||
|
taosHashInit(1024, taosGetDefaultHashFunction(TSDB_DATA_TYPE_VARCHAR), false, HASH_NO_LOCK);
|
||||||
|
if (pCache->STbGroupResCache.pTableEntry == NULL) {
|
||||||
|
code = TSDB_CODE_OUT_OF_MEMORY;
|
||||||
|
goto _err2;
|
||||||
|
}
|
||||||
|
|
||||||
|
taosHashSetFreeFp(pCache->STbGroupResCache.pTableEntry, freeCacheEntryFp);
|
||||||
|
taosThreadMutexInit(&pCache->STbGroupResCache.lock, NULL);
|
||||||
|
|
||||||
|
|
||||||
pMeta->pCache = pCache;
|
pMeta->pCache = pCache;
|
||||||
return code;
|
return code;
|
||||||
|
|
||||||
|
@ -165,6 +191,10 @@ void metaCacheClose(SMeta* pMeta) {
|
||||||
taosThreadMutexDestroy(&pMeta->pCache->sTagFilterResCache.lock);
|
taosThreadMutexDestroy(&pMeta->pCache->sTagFilterResCache.lock);
|
||||||
taosHashCleanup(pMeta->pCache->sTagFilterResCache.pTableEntry);
|
taosHashCleanup(pMeta->pCache->sTagFilterResCache.pTableEntry);
|
||||||
|
|
||||||
|
taosLRUCacheCleanup(pMeta->pCache->STbGroupResCache.pResCache);
|
||||||
|
taosThreadMutexDestroy(&pMeta->pCache->STbGroupResCache.lock);
|
||||||
|
taosHashCleanup(pMeta->pCache->STbGroupResCache.pTableEntry);
|
||||||
|
|
||||||
taosMemoryFree(pMeta->pCache);
|
taosMemoryFree(pMeta->pCache);
|
||||||
pMeta->pCache = NULL;
|
pMeta->pCache = NULL;
|
||||||
}
|
}
|
||||||
|
@ -520,7 +550,7 @@ int32_t metaGetCachedTableUidList(SMeta* pMeta, tb_uid_t suid, const uint8_t* pK
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void freePayload(const void* key, size_t keyLen, void* value) {
|
static void freeUidCachePayload(const void* key, size_t keyLen, void* value) {
|
||||||
if (value == NULL) {
|
if (value == NULL) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -626,7 +656,7 @@ int32_t metaUidFilterCachePut(SMeta* pMeta, uint64_t suid, const void* pKey, int
|
||||||
}
|
}
|
||||||
|
|
||||||
// add to cache.
|
// add to cache.
|
||||||
taosLRUCacheInsert(pCache, key, TAG_FILTER_RES_KEY_LEN, pPayload, payloadLen, freePayload, NULL,
|
taosLRUCacheInsert(pCache, key, TAG_FILTER_RES_KEY_LEN, pPayload, payloadLen, freeUidCachePayload, NULL,
|
||||||
TAOS_LRU_PRIORITY_LOW);
|
TAOS_LRU_PRIORITY_LOW);
|
||||||
_end:
|
_end:
|
||||||
taosThreadMutexUnlock(pLock);
|
taosThreadMutexUnlock(pLock);
|
||||||
|
@ -671,3 +701,180 @@ int32_t metaUidCacheClear(SMeta* pMeta, uint64_t suid) {
|
||||||
metaDebug("vgId:%d suid:%"PRId64" cached related tag filter uid list cleared", vgId, suid);
|
metaDebug("vgId:%d suid:%"PRId64" cached related tag filter uid list cleared", vgId, suid);
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int32_t metaGetCachedTbGroup(SMeta* pMeta, tb_uid_t suid, const uint8_t* pKey, int32_t keyLen, SArray** pList) {
|
||||||
|
int32_t vgId = TD_VID(pMeta->pVnode);
|
||||||
|
|
||||||
|
// generate the composed key for LRU cache
|
||||||
|
SLRUCache* pCache = pMeta->pCache->STbGroupResCache.pResCache;
|
||||||
|
SHashObj* pTableMap = pMeta->pCache->STbGroupResCache.pTableEntry;
|
||||||
|
TdThreadMutex* pLock = &pMeta->pCache->STbGroupResCache.lock;
|
||||||
|
|
||||||
|
*pList = NULL;
|
||||||
|
uint64_t key[4];
|
||||||
|
initCacheKey(key, pTableMap, suid, (const char*)pKey, keyLen);
|
||||||
|
|
||||||
|
taosThreadMutexLock(pLock);
|
||||||
|
pMeta->pCache->STbGroupResCache.accTimes += 1;
|
||||||
|
|
||||||
|
LRUHandle* pHandle = taosLRUCacheLookup(pCache, key, TAG_FILTER_RES_KEY_LEN);
|
||||||
|
if (pHandle == NULL) {
|
||||||
|
taosThreadMutexUnlock(pLock);
|
||||||
|
return TSDB_CODE_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
STagFilterResEntry** pEntry = taosHashGet(pTableMap, &suid, sizeof(uint64_t));
|
||||||
|
if (NULL == pEntry) {
|
||||||
|
metaDebug("suid %" PRIu64 " not in tb group cache", suid);
|
||||||
|
return TSDB_CODE_FAILED;
|
||||||
|
}
|
||||||
|
|
||||||
|
*pList = taosArrayDup(taosLRUCacheValue(pCache, pHandle), NULL);
|
||||||
|
|
||||||
|
(*pEntry)->hitTimes += 1;
|
||||||
|
|
||||||
|
uint32_t acc = pMeta->pCache->STbGroupResCache.accTimes;
|
||||||
|
if ((*pEntry)->hitTimes % 5000 == 0 && (*pEntry)->hitTimes > 0) {
|
||||||
|
metaInfo("vgId:%d tb group cache hit:%d, total acc:%d, rate:%.2f", vgId, (*pEntry)->hitTimes, acc, ((double)(*pEntry)->hitTimes) / acc);
|
||||||
|
}
|
||||||
|
|
||||||
|
taosLRUCacheRelease(pCache, pHandle, false);
|
||||||
|
|
||||||
|
// unlock meta
|
||||||
|
taosThreadMutexUnlock(pLock);
|
||||||
|
return TSDB_CODE_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static void freeTbGroupCachePayload(const void* key, size_t keyLen, void* value) {
|
||||||
|
if (value == NULL) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
const uint64_t* p = key;
|
||||||
|
if (keyLen != sizeof(int64_t) * 4) {
|
||||||
|
metaError("tb group key length is invalid, length:%d, expect:%d", (int32_t)keyLen, (int32_t)sizeof(uint64_t) * 2);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
SHashObj* pHashObj = (SHashObj*)p[0];
|
||||||
|
|
||||||
|
STagFilterResEntry** pEntry = taosHashGet(pHashObj, &p[1], sizeof(uint64_t));
|
||||||
|
|
||||||
|
if (pEntry != NULL && (*pEntry) != NULL) {
|
||||||
|
int64_t st = taosGetTimestampUs();
|
||||||
|
|
||||||
|
SListIter iter = {0};
|
||||||
|
tdListInitIter((SList*)&((*pEntry)->list), &iter, TD_LIST_FORWARD);
|
||||||
|
|
||||||
|
SListNode* pNode = NULL;
|
||||||
|
while ((pNode = tdListNext(&iter)) != NULL) {
|
||||||
|
uint64_t* digest = (uint64_t*)pNode->data;
|
||||||
|
if (digest[0] == p[2] && digest[1] == p[3]) {
|
||||||
|
void* tmp = tdListPopNode(&((*pEntry)->list), pNode);
|
||||||
|
taosMemoryFree(tmp);
|
||||||
|
|
||||||
|
double el = (taosGetTimestampUs() - st) / 1000.0;
|
||||||
|
metaDebug("clear one item in tb group cache, remain cached item:%d, elapsed time:%.2fms", listNEles(&((*pEntry)->list)),
|
||||||
|
el);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
taosArrayDestroy((SArray*)value);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int32_t metaPutTbGroupToCache(SMeta* pMeta, uint64_t suid, const void* pKey, int32_t keyLen, void* pPayload,
|
||||||
|
int32_t payloadLen) {
|
||||||
|
int32_t code = 0;
|
||||||
|
int32_t vgId = TD_VID(pMeta->pVnode);
|
||||||
|
|
||||||
|
if (payloadLen > tsTagFilterResCacheSize) {
|
||||||
|
metaDebug("vgId:%d, suid:%" PRIu64
|
||||||
|
" ignore to add to tb group cache, due to payload length %d greater than threshold %d",
|
||||||
|
vgId, suid, payloadLen, tsTagFilterResCacheSize);
|
||||||
|
taosArrayDestroy((SArray*)pPayload);
|
||||||
|
return TSDB_CODE_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
SLRUCache* pCache = pMeta->pCache->STbGroupResCache.pResCache;
|
||||||
|
SHashObj* pTableEntry = pMeta->pCache->STbGroupResCache.pTableEntry;
|
||||||
|
TdThreadMutex* pLock = &pMeta->pCache->STbGroupResCache.lock;
|
||||||
|
|
||||||
|
uint64_t key[4] = {0};
|
||||||
|
initCacheKey(key, pTableEntry, suid, pKey, keyLen);
|
||||||
|
|
||||||
|
taosThreadMutexLock(pLock);
|
||||||
|
STagFilterResEntry** pEntry = taosHashGet(pTableEntry, &suid, sizeof(uint64_t));
|
||||||
|
if (pEntry == NULL) {
|
||||||
|
code = addNewEntry(pTableEntry, pKey, keyLen, suid);
|
||||||
|
if (code != TSDB_CODE_SUCCESS) {
|
||||||
|
goto _end;
|
||||||
|
}
|
||||||
|
} else { // check if it exists or not
|
||||||
|
size_t size = listNEles(&(*pEntry)->list);
|
||||||
|
if (size == 0) {
|
||||||
|
tdListAppend(&(*pEntry)->list, pKey);
|
||||||
|
} else {
|
||||||
|
SListNode* pNode = listHead(&(*pEntry)->list);
|
||||||
|
uint64_t* p = (uint64_t*)pNode->data;
|
||||||
|
if (p[1] == ((uint64_t*)pKey)[1] && p[0] == ((uint64_t*)pKey)[0]) {
|
||||||
|
// we have already found the existed items, no need to added to cache anymore.
|
||||||
|
taosThreadMutexUnlock(pLock);
|
||||||
|
return TSDB_CODE_SUCCESS;
|
||||||
|
} else { // not equal, append it
|
||||||
|
tdListAppend(&(*pEntry)->list, pKey);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// add to cache.
|
||||||
|
taosLRUCacheInsert(pCache, key, TAG_FILTER_RES_KEY_LEN, pPayload, payloadLen, freeTbGroupCachePayload, NULL,
|
||||||
|
TAOS_LRU_PRIORITY_LOW);
|
||||||
|
_end:
|
||||||
|
taosThreadMutexUnlock(pLock);
|
||||||
|
metaDebug("vgId:%d, suid:%" PRIu64 " tb group added into cache, total:%d, tables:%d", vgId, suid,
|
||||||
|
(int32_t)taosLRUCacheGetUsage(pCache), taosHashGetSize(pTableEntry));
|
||||||
|
|
||||||
|
return code;
|
||||||
|
}
|
||||||
|
|
||||||
|
// remove the lru cache that are expired due to the tags value update, or creating, or dropping, of child tables
|
||||||
|
int32_t metaTbGroupCacheClear(SMeta* pMeta, uint64_t suid) {
|
||||||
|
uint64_t p[4] = {0};
|
||||||
|
int32_t vgId = TD_VID(pMeta->pVnode);
|
||||||
|
SHashObj* pEntryHashMap = pMeta->pCache->STbGroupResCache.pTableEntry;
|
||||||
|
|
||||||
|
uint64_t dummy[2] = {0};
|
||||||
|
initCacheKey(p, pEntryHashMap, suid, (char*) &dummy[0], 16);
|
||||||
|
|
||||||
|
TdThreadMutex* pLock = &pMeta->pCache->STbGroupResCache.lock;
|
||||||
|
taosThreadMutexLock(pLock);
|
||||||
|
|
||||||
|
STagFilterResEntry** pEntry = taosHashGet(pEntryHashMap, &suid, sizeof(uint64_t));
|
||||||
|
if (pEntry == NULL || listNEles(&(*pEntry)->list) == 0) {
|
||||||
|
taosThreadMutexUnlock(pLock);
|
||||||
|
return TSDB_CODE_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
(*pEntry)->hitTimes = 0;
|
||||||
|
|
||||||
|
SListIter iter = {0};
|
||||||
|
tdListInitIter(&(*pEntry)->list, &iter, TD_LIST_FORWARD);
|
||||||
|
|
||||||
|
SListNode* pNode = NULL;
|
||||||
|
while ((pNode = tdListNext(&iter)) != NULL) {
|
||||||
|
setMD5DigestInKey(p, pNode->data, 2 * sizeof(uint64_t));
|
||||||
|
taosLRUCacheErase(pMeta->pCache->STbGroupResCache.pResCache, p, TAG_FILTER_RES_KEY_LEN);
|
||||||
|
}
|
||||||
|
|
||||||
|
tdListEmpty(&(*pEntry)->list);
|
||||||
|
taosThreadMutexUnlock(pLock);
|
||||||
|
|
||||||
|
metaDebug("vgId:%d suid:%"PRId64" cached related tb group cleared", vgId, suid);
|
||||||
|
return TSDB_CODE_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -767,6 +767,7 @@ int metaCreateTable(SMeta *pMeta, int64_t version, SVCreateTbReq *pReq, STableMe
|
||||||
metaWLock(pMeta);
|
metaWLock(pMeta);
|
||||||
metaUpdateStbStats(pMeta, me.ctbEntry.suid, 1);
|
metaUpdateStbStats(pMeta, me.ctbEntry.suid, 1);
|
||||||
metaUidCacheClear(pMeta, me.ctbEntry.suid);
|
metaUidCacheClear(pMeta, me.ctbEntry.suid);
|
||||||
|
metaTbGroupCacheClear(pMeta, me.ctbEntry.suid);
|
||||||
metaULock(pMeta);
|
metaULock(pMeta);
|
||||||
} else {
|
} else {
|
||||||
me.ntbEntry.ctime = pReq->ctime;
|
me.ntbEntry.ctime = pReq->ctime;
|
||||||
|
@ -998,6 +999,7 @@ static int metaDropTableByUid(SMeta *pMeta, tb_uid_t uid, int *type) {
|
||||||
|
|
||||||
metaUpdateStbStats(pMeta, e.ctbEntry.suid, -1);
|
metaUpdateStbStats(pMeta, e.ctbEntry.suid, -1);
|
||||||
metaUidCacheClear(pMeta, e.ctbEntry.suid);
|
metaUidCacheClear(pMeta, e.ctbEntry.suid);
|
||||||
|
metaTbGroupCacheClear(pMeta, e.ctbEntry.suid);
|
||||||
} else if (e.type == TSDB_NORMAL_TABLE) {
|
} else if (e.type == TSDB_NORMAL_TABLE) {
|
||||||
// drop schema.db (todo)
|
// drop schema.db (todo)
|
||||||
|
|
||||||
|
@ -1009,6 +1011,7 @@ static int metaDropTableByUid(SMeta *pMeta, tb_uid_t uid, int *type) {
|
||||||
|
|
||||||
metaStatsCacheDrop(pMeta, uid);
|
metaStatsCacheDrop(pMeta, uid);
|
||||||
metaUidCacheClear(pMeta, uid);
|
metaUidCacheClear(pMeta, uid);
|
||||||
|
metaTbGroupCacheClear(pMeta, uid);
|
||||||
--pMeta->pVnode->config.vndStats.numOfSTables;
|
--pMeta->pVnode->config.vndStats.numOfSTables;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1429,6 +1432,7 @@ static int metaUpdateTableTagVal(SMeta *pMeta, int64_t version, SVAlterTbReq *pA
|
||||||
((STag *)(ctbEntry.ctbEntry.pTags))->len, pMeta->txn);
|
((STag *)(ctbEntry.ctbEntry.pTags))->len, pMeta->txn);
|
||||||
|
|
||||||
metaUidCacheClear(pMeta, ctbEntry.ctbEntry.suid);
|
metaUidCacheClear(pMeta, ctbEntry.ctbEntry.suid);
|
||||||
|
metaTbGroupCacheClear(pMeta, ctbEntry.ctbEntry.suid);
|
||||||
|
|
||||||
metaULock(pMeta);
|
metaULock(pMeta);
|
||||||
|
|
||||||
|
|
|
@ -22,6 +22,10 @@
|
||||||
|
|
||||||
static int32_t tqInitialize(STQ* pTq);
|
static int32_t tqInitialize(STQ* pTq);
|
||||||
|
|
||||||
|
static FORCE_INLINE bool tqIsHandleExec(STqHandle* pHandle) { return TMQ_HANDLE_STATUS_EXEC == pHandle->status; }
|
||||||
|
static FORCE_INLINE void tqSetHandleExec(STqHandle* pHandle) {pHandle->status = TMQ_HANDLE_STATUS_EXEC;}
|
||||||
|
static FORCE_INLINE void tqSetHandleIdle(STqHandle* pHandle) {pHandle->status = TMQ_HANDLE_STATUS_IDLE;}
|
||||||
|
|
||||||
int32_t tqInit() {
|
int32_t tqInit() {
|
||||||
int8_t old;
|
int8_t old;
|
||||||
while (1) {
|
while (1) {
|
||||||
|
@ -61,6 +65,7 @@ void tqCleanUp() {
|
||||||
static void destroyTqHandle(void* data) {
|
static void destroyTqHandle(void* data) {
|
||||||
STqHandle* pData = (STqHandle*)data;
|
STqHandle* pData = (STqHandle*)data;
|
||||||
qDestroyTask(pData->execHandle.task);
|
qDestroyTask(pData->execHandle.task);
|
||||||
|
|
||||||
if (pData->execHandle.subType == TOPIC_SUB_TYPE__COLUMN) {
|
if (pData->execHandle.subType == TOPIC_SUB_TYPE__COLUMN) {
|
||||||
taosMemoryFreeClear(pData->execHandle.execCol.qmsg);
|
taosMemoryFreeClear(pData->execHandle.execCol.qmsg);
|
||||||
} else if (pData->execHandle.subType == TOPIC_SUB_TYPE__DB) {
|
} else if (pData->execHandle.subType == TOPIC_SUB_TYPE__DB) {
|
||||||
|
@ -302,13 +307,6 @@ int32_t tqProcessOffsetCommitReq(STQ* pTq, int64_t sversion, char* msg, int32_t
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (pOffset->val.type == TMQ_OFFSET__LOG) {
|
|
||||||
STqHandle* pHandle = taosHashGet(pTq->pHandle, pOffset->subKey, strlen(pOffset->subKey));
|
|
||||||
if (pHandle && (walRefVer(pHandle->pRef, pOffset->val.version) < 0)) {
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -319,11 +317,15 @@ int32_t tqProcessSeekReq(STQ* pTq, int64_t sversion, char* msg, int32_t msgLen)
|
||||||
SDecoder decoder;
|
SDecoder decoder;
|
||||||
tDecoderInit(&decoder, (uint8_t*)msg, msgLen);
|
tDecoderInit(&decoder, (uint8_t*)msg, msgLen);
|
||||||
if (tDecodeMqVgOffset(&decoder, &vgOffset) < 0) {
|
if (tDecodeMqVgOffset(&decoder, &vgOffset) < 0) {
|
||||||
|
tqError("vgId:%d failed to decode seek msg", vgId);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
tDecoderClear(&decoder);
|
tDecoderClear(&decoder);
|
||||||
|
|
||||||
|
tqDebug("topic:%s, vgId:%d process offset seek by consumer:0x%" PRIx64 ", req offset:%" PRId64,
|
||||||
|
vgOffset.offset.subKey, vgId, vgOffset.consumerId, vgOffset.offset.val.version);
|
||||||
|
|
||||||
STqOffset* pOffset = &vgOffset.offset;
|
STqOffset* pOffset = &vgOffset.offset;
|
||||||
if (pOffset->val.type != TMQ_OFFSET__LOG) {
|
if (pOffset->val.type != TMQ_OFFSET__LOG) {
|
||||||
tqError("vgId:%d, subKey:%s invalid seek offset type:%d", vgId, pOffset->subKey, pOffset->val.type);
|
tqError("vgId:%d, subKey:%s invalid seek offset type:%d", vgId, pOffset->subKey, pOffset->val.type);
|
||||||
|
@ -385,6 +387,9 @@ int32_t tqProcessSeekReq(STQ* pTq, int64_t sversion, char* msg, int32_t msgLen)
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
tqDebug("topic:%s, vgId:%d consumer:0x%" PRIx64 " offset is update to:%" PRId64, vgOffset.offset.subKey, vgId,
|
||||||
|
vgOffset.consumerId, vgOffset.offset.val.version);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -427,41 +432,48 @@ int32_t tqProcessPollReq(STQ* pTq, SRpcMsg* pMsg) {
|
||||||
STqOffsetVal reqOffset = req.reqOffset;
|
STqOffsetVal reqOffset = req.reqOffset;
|
||||||
int32_t vgId = TD_VID(pTq->pVnode);
|
int32_t vgId = TD_VID(pTq->pVnode);
|
||||||
|
|
||||||
|
taosWLockLatch(&pTq->lock);
|
||||||
// 1. find handle
|
// 1. find handle
|
||||||
STqHandle* pHandle = taosHashGet(pTq->pHandle, req.subKey, strlen(req.subKey));
|
STqHandle* pHandle = taosHashGet(pTq->pHandle, req.subKey, strlen(req.subKey));
|
||||||
if (pHandle == NULL) {
|
if (pHandle == NULL) {
|
||||||
tqError("tmq poll: consumer:0x%" PRIx64 " vgId:%d subkey %s not found", consumerId, vgId, req.subKey);
|
tqError("tmq poll: consumer:0x%" PRIx64 " vgId:%d subkey %s not found", consumerId, vgId, req.subKey);
|
||||||
terrno = TSDB_CODE_INVALID_MSG;
|
terrno = TSDB_CODE_INVALID_MSG;
|
||||||
|
taosWUnLockLatch(&pTq->lock);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
while (tqIsHandleExec(pHandle)) {
|
||||||
|
tqDebug("tmq poll: consumer:0x%" PRIx64 "vgId:%d, topic:%s, subscription is executing, wait for 5ms and retry", consumerId, vgId, req.subKey);
|
||||||
|
taosMsleep(5);
|
||||||
|
}
|
||||||
|
|
||||||
// 2. check re-balance status
|
// 2. check re-balance status
|
||||||
taosRLockLatch(&pTq->lock);
|
|
||||||
if (pHandle->consumerId != consumerId) {
|
if (pHandle->consumerId != consumerId) {
|
||||||
tqDebug("ERROR tmq poll: consumer:0x%" PRIx64 " vgId:%d, subkey %s, mismatch for saved handle consumer:0x%" PRIx64,
|
tqDebug("ERROR tmq poll: consumer:0x%" PRIx64 " vgId:%d, subkey %s, mismatch for saved handle consumer:0x%" PRIx64,
|
||||||
consumerId, vgId, req.subKey, pHandle->consumerId);
|
consumerId, vgId, req.subKey, pHandle->consumerId);
|
||||||
terrno = TSDB_CODE_TMQ_CONSUMER_MISMATCH;
|
terrno = TSDB_CODE_TMQ_CONSUMER_MISMATCH;
|
||||||
taosRUnLockLatch(&pTq->lock);
|
taosWUnLockLatch(&pTq->lock);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
taosRUnLockLatch(&pTq->lock);
|
tqSetHandleExec(pHandle);
|
||||||
|
taosWUnLockLatch(&pTq->lock);
|
||||||
|
|
||||||
// 3. update the epoch value
|
// 3. update the epoch value
|
||||||
taosWLockLatch(&pTq->lock);
|
|
||||||
int32_t savedEpoch = pHandle->epoch;
|
int32_t savedEpoch = pHandle->epoch;
|
||||||
if (savedEpoch < reqEpoch) {
|
if (savedEpoch < reqEpoch) {
|
||||||
tqDebug("tmq poll: consumer:0x%" PRIx64 " epoch update from %d to %d by poll req", consumerId, savedEpoch,
|
tqDebug("tmq poll: consumer:0x%" PRIx64 " epoch update from %d to %d by poll req", consumerId, savedEpoch,
|
||||||
reqEpoch);
|
reqEpoch);
|
||||||
pHandle->epoch = reqEpoch;
|
pHandle->epoch = reqEpoch;
|
||||||
}
|
}
|
||||||
taosWUnLockLatch(&pTq->lock);
|
|
||||||
|
|
||||||
char buf[80];
|
char buf[80];
|
||||||
tFormatOffset(buf, 80, &reqOffset);
|
tFormatOffset(buf, 80, &reqOffset);
|
||||||
tqDebug("tmq poll: consumer:0x%" PRIx64 " (epoch %d), subkey %s, recv poll req vgId:%d, req:%s, reqId:0x%" PRIx64,
|
tqDebug("tmq poll: consumer:0x%" PRIx64 " (epoch %d), subkey %s, recv poll req vgId:%d, req:%s, reqId:0x%" PRIx64,
|
||||||
consumerId, req.epoch, pHandle->subKey, vgId, buf, req.reqId);
|
consumerId, req.epoch, pHandle->subKey, vgId, buf, req.reqId);
|
||||||
|
|
||||||
return tqExtractDataForMq(pTq, pHandle, &req, pMsg);
|
int code = tqExtractDataForMq(pTq, pHandle, &req, pMsg);
|
||||||
|
tqSetHandleIdle(pHandle);
|
||||||
|
return code;
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t tqProcessVgWalInfoReq(STQ* pTq, SRpcMsg* pMsg) {
|
int32_t tqProcessVgWalInfoReq(STQ* pTq, SRpcMsg* pMsg) {
|
||||||
|
@ -549,25 +561,19 @@ int32_t tqProcessDeleteSubReq(STQ* pTq, int64_t sversion, char* msg, int32_t msg
|
||||||
|
|
||||||
tqDebug("vgId:%d, tq process delete sub req %s", vgId, pReq->subKey);
|
tqDebug("vgId:%d, tq process delete sub req %s", vgId, pReq->subKey);
|
||||||
int32_t code = 0;
|
int32_t code = 0;
|
||||||
// taosWLockLatch(&pTq->lock);
|
|
||||||
// int32_t code = taosHashRemove(pTq->pPushMgr, pReq->subKey, strlen(pReq->subKey));
|
|
||||||
// if (code != 0) {
|
|
||||||
// tqDebug("vgId:%d, tq remove push handle %s", pTq->pVnode->config.vgId, pReq->subKey);
|
|
||||||
// }
|
|
||||||
// taosWUnLockLatch(&pTq->lock);
|
|
||||||
|
|
||||||
|
taosWLockLatch(&pTq->lock);
|
||||||
STqHandle* pHandle = taosHashGet(pTq->pHandle, pReq->subKey, strlen(pReq->subKey));
|
STqHandle* pHandle = taosHashGet(pTq->pHandle, pReq->subKey, strlen(pReq->subKey));
|
||||||
if (pHandle) {
|
if (pHandle) {
|
||||||
// walCloseRef(pHandle->pWalReader->pWal, pHandle->pRef->refId);
|
while (tqIsHandleExec(pHandle)) {
|
||||||
if (pHandle->pRef) {
|
|
||||||
walCloseRef(pTq->pVnode->pWal, pHandle->pRef->refId);
|
|
||||||
}
|
|
||||||
|
|
||||||
while (tqIsHandleExecuting(pHandle)) {
|
|
||||||
tqDebug("vgId:%d, topic:%s, subscription is executing, wait for 5ms and retry", vgId, pHandle->subKey);
|
tqDebug("vgId:%d, topic:%s, subscription is executing, wait for 5ms and retry", vgId, pHandle->subKey);
|
||||||
taosMsleep(5);
|
taosMsleep(5);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (pHandle->pRef) {
|
||||||
|
walCloseRef(pTq->pVnode->pWal, pHandle->pRef->refId);
|
||||||
|
}
|
||||||
|
|
||||||
code = taosHashRemove(pTq->pHandle, pReq->subKey, strlen(pReq->subKey));
|
code = taosHashRemove(pTq->pHandle, pReq->subKey, strlen(pReq->subKey));
|
||||||
if (code != 0) {
|
if (code != 0) {
|
||||||
tqError("cannot process tq delete req %s, since no such handle", pReq->subKey);
|
tqError("cannot process tq delete req %s, since no such handle", pReq->subKey);
|
||||||
|
@ -582,6 +588,8 @@ int32_t tqProcessDeleteSubReq(STQ* pTq, int64_t sversion, char* msg, int32_t msg
|
||||||
if (tqMetaDeleteHandle(pTq, pReq->subKey) < 0) {
|
if (tqMetaDeleteHandle(pTq, pReq->subKey) < 0) {
|
||||||
tqError("cannot process tq delete req %s, since no such offset in tdb", pReq->subKey);
|
tqError("cannot process tq delete req %s, since no such offset in tdb", pReq->subKey);
|
||||||
}
|
}
|
||||||
|
taosWUnLockLatch(&pTq->lock);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -628,6 +636,7 @@ int32_t tqProcessSubscribeReq(STQ* pTq, int64_t sversion, char* msg, int32_t msg
|
||||||
tqDebug("vgId:%d, tq process sub req:%s, Id:0x%" PRIx64 " -> Id:0x%" PRIx64, pVnode->config.vgId, req.subKey,
|
tqDebug("vgId:%d, tq process sub req:%s, Id:0x%" PRIx64 " -> Id:0x%" PRIx64, pVnode->config.vgId, req.subKey,
|
||||||
req.oldConsumerId, req.newConsumerId);
|
req.oldConsumerId, req.newConsumerId);
|
||||||
|
|
||||||
|
taosWLockLatch(&pTq->lock);
|
||||||
STqHandle* pHandle = taosHashGet(pTq->pHandle, req.subKey, strlen(req.subKey));
|
STqHandle* pHandle = taosHashGet(pTq->pHandle, req.subKey, strlen(req.subKey));
|
||||||
if (pHandle == NULL) {
|
if (pHandle == NULL) {
|
||||||
if (req.oldConsumerId != -1) {
|
if (req.oldConsumerId != -1) {
|
||||||
|
@ -679,7 +688,7 @@ int32_t tqProcessSubscribeReq(STQ* pTq, int64_t sversion, char* msg, int32_t msg
|
||||||
pHandle->execHandle.pTqReader = tqReaderOpen(pVnode);
|
pHandle->execHandle.pTqReader = tqReaderOpen(pVnode);
|
||||||
|
|
||||||
pHandle->execHandle.execDb.pFilterOutTbUid =
|
pHandle->execHandle.execDb.pFilterOutTbUid =
|
||||||
taosHashInit(64, taosGetDefaultHashFunction(TSDB_DATA_TYPE_BIGINT), false, HASH_NO_LOCK);
|
taosHashInit(64, taosGetDefaultHashFunction(TSDB_DATA_TYPE_BIGINT), false, HASH_ENTRY_LOCK);
|
||||||
buildSnapContext(handle.meta, handle.version, 0, pHandle->execHandle.subType, pHandle->fetchMeta,
|
buildSnapContext(handle.meta, handle.version, 0, pHandle->execHandle.subType, pHandle->fetchMeta,
|
||||||
(SSnapContext**)(&handle.sContext));
|
(SSnapContext**)(&handle.sContext));
|
||||||
|
|
||||||
|
@ -710,6 +719,11 @@ int32_t tqProcessSubscribeReq(STQ* pTq, int64_t sversion, char* msg, int32_t msg
|
||||||
ret = tqMetaSaveHandle(pTq, req.subKey, pHandle);
|
ret = tqMetaSaveHandle(pTq, req.subKey, pHandle);
|
||||||
goto end;
|
goto end;
|
||||||
} else {
|
} else {
|
||||||
|
while (tqIsHandleExec(pHandle)) {
|
||||||
|
tqDebug("sub req vgId:%d, topic:%s, subscription is executing, wait for 5ms and retry", vgId, pHandle->subKey);
|
||||||
|
taosMsleep(5);
|
||||||
|
}
|
||||||
|
|
||||||
if (pHandle->consumerId == req.newConsumerId) { // do nothing
|
if (pHandle->consumerId == req.newConsumerId) { // do nothing
|
||||||
tqInfo("vgId:%d consumer:0x%" PRIx64 " remains, no switch occurs", req.vgId, req.newConsumerId);
|
tqInfo("vgId:%d consumer:0x%" PRIx64 " remains, no switch occurs", req.vgId, req.newConsumerId);
|
||||||
atomic_add_fetch_32(&pHandle->epoch, 1);
|
atomic_add_fetch_32(&pHandle->epoch, 1);
|
||||||
|
@ -725,22 +739,17 @@ int32_t tqProcessSubscribeReq(STQ* pTq, int64_t sversion, char* msg, int32_t msg
|
||||||
if (pTaskInfo != NULL) {
|
if (pTaskInfo != NULL) {
|
||||||
qKillTask(pTaskInfo, TSDB_CODE_SUCCESS);
|
qKillTask(pTaskInfo, TSDB_CODE_SUCCESS);
|
||||||
}
|
}
|
||||||
|
|
||||||
taosWLockLatch(&pTq->lock);
|
|
||||||
// remove if it has been register in the push manager, and return one empty block to consumer
|
|
||||||
tqUnregisterPushHandle(pTq, pHandle);
|
|
||||||
|
|
||||||
|
|
||||||
if (pHandle->execHandle.subType == TOPIC_SUB_TYPE__COLUMN) {
|
if (pHandle->execHandle.subType == TOPIC_SUB_TYPE__COLUMN) {
|
||||||
qStreamCloseTsdbReader(pTaskInfo);
|
qStreamCloseTsdbReader(pTaskInfo);
|
||||||
}
|
}
|
||||||
|
// remove if it has been register in the push manager, and return one empty block to consumer
|
||||||
taosWUnLockLatch(&pTq->lock);
|
tqUnregisterPushHandle(pTq, pHandle);
|
||||||
ret = tqMetaSaveHandle(pTq, req.subKey, pHandle);
|
ret = tqMetaSaveHandle(pTq, req.subKey, pHandle);
|
||||||
goto end;
|
goto end;
|
||||||
}
|
}
|
||||||
|
|
||||||
end:
|
end:
|
||||||
|
taosWUnLockLatch(&pTq->lock);
|
||||||
taosMemoryFree(req.qmsg);
|
taosMemoryFree(req.qmsg);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
@ -828,7 +837,8 @@ int32_t tqExpandTask(STQ* pTq, SStreamTask* pTask, int64_t ver) {
|
||||||
}
|
}
|
||||||
|
|
||||||
if (pTask->taskLevel == TASK_LEVEL__SOURCE) {
|
if (pTask->taskLevel == TASK_LEVEL__SOURCE) {
|
||||||
pTask->exec.pWalReader = walOpenReader(pTq->pVnode->pWal, NULL);
|
SWalFilterCond cond = {.deleteMsg = 1};
|
||||||
|
pTask->exec.pWalReader = walOpenReader(pTq->pVnode->pWal, &cond);
|
||||||
}
|
}
|
||||||
|
|
||||||
streamSetupTrigger(pTask);
|
streamSetupTrigger(pTask);
|
||||||
|
@ -1032,7 +1042,7 @@ int32_t tqProcessTaskRecover1Req(STQ* pTq, SRpcMsg* pMsg) {
|
||||||
memcpy(serializedReq, &req, len);
|
memcpy(serializedReq, &req, len);
|
||||||
|
|
||||||
// dispatch msg
|
// dispatch msg
|
||||||
tqDebug("s-task:%s step 1 finished, send msg to start blocking recover stage(step 2)", pTask->id.idStr);
|
tqDebug("s-task:%s start recover block stage", pTask->id.idStr);
|
||||||
|
|
||||||
SRpcMsg rpcMsg = {
|
SRpcMsg rpcMsg = {
|
||||||
.code = 0, .contLen = len, .msgType = TDMT_VND_STREAM_RECOVER_BLOCKING_STAGE, .pCont = serializedReq};
|
.code = 0, .contLen = len, .msgType = TDMT_VND_STREAM_RECOVER_BLOCKING_STAGE, .pCont = serializedReq};
|
||||||
|
@ -1060,6 +1070,9 @@ int32_t tqProcessTaskRecover2Req(STQ* pTq, int64_t sversion, char* msg, int32_t
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
qDebug("s-task:%s set the start wal offset to be:%"PRId64, pTask->id.idStr, sversion);
|
||||||
|
walReaderSeekVer(pTask->exec.pWalReader, sversion);
|
||||||
|
|
||||||
if (atomic_load_8(&pTask->status.taskStatus) == TASK_STATUS__DROPPING) {
|
if (atomic_load_8(&pTask->status.taskStatus) == TASK_STATUS__DROPPING) {
|
||||||
streamMetaReleaseTask(pTq->pStreamMeta, pTask);
|
streamMetaReleaseTask(pTq->pStreamMeta, pTask);
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -1129,7 +1142,60 @@ int32_t tqProcessTaskRecoverFinishRsp(STQ* pTq, SRpcMsg* pMsg) {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t tqProcessDelReq(STQ* pTq, void* pReq, int32_t len, int64_t ver) {
|
int32_t extractDelDataBlock(const void* pData, int32_t len, int64_t ver, SStreamRefDataBlock** pRefBlock) {
|
||||||
|
SDecoder* pCoder = &(SDecoder){0};
|
||||||
|
SDeleteRes* pRes = &(SDeleteRes){0};
|
||||||
|
|
||||||
|
*pRefBlock = NULL;
|
||||||
|
|
||||||
|
pRes->uidList = taosArrayInit(0, sizeof(tb_uid_t));
|
||||||
|
if (pRes->uidList == NULL) {
|
||||||
|
return TSDB_CODE_OUT_OF_MEMORY;
|
||||||
|
}
|
||||||
|
|
||||||
|
tDecoderInit(pCoder, (uint8_t*)pData, len);
|
||||||
|
tDecodeDeleteRes(pCoder, pRes);
|
||||||
|
tDecoderClear(pCoder);
|
||||||
|
|
||||||
|
int32_t numOfTables = taosArrayGetSize(pRes->uidList);
|
||||||
|
if (numOfTables == 0 || pRes->affectedRows == 0) {
|
||||||
|
taosArrayDestroy(pRes->uidList);
|
||||||
|
return TSDB_CODE_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
SSDataBlock* pDelBlock = createSpecialDataBlock(STREAM_DELETE_DATA);
|
||||||
|
blockDataEnsureCapacity(pDelBlock, numOfTables);
|
||||||
|
pDelBlock->info.rows = numOfTables;
|
||||||
|
pDelBlock->info.version = ver;
|
||||||
|
|
||||||
|
for (int32_t i = 0; i < numOfTables; i++) {
|
||||||
|
// start key column
|
||||||
|
SColumnInfoData* pStartCol = taosArrayGet(pDelBlock->pDataBlock, START_TS_COLUMN_INDEX);
|
||||||
|
colDataSetVal(pStartCol, i, (const char*)&pRes->skey, false); // end key column
|
||||||
|
SColumnInfoData* pEndCol = taosArrayGet(pDelBlock->pDataBlock, END_TS_COLUMN_INDEX);
|
||||||
|
colDataSetVal(pEndCol, i, (const char*)&pRes->ekey, false);
|
||||||
|
// uid column
|
||||||
|
SColumnInfoData* pUidCol = taosArrayGet(pDelBlock->pDataBlock, UID_COLUMN_INDEX);
|
||||||
|
int64_t* pUid = taosArrayGet(pRes->uidList, i);
|
||||||
|
colDataSetVal(pUidCol, i, (const char*)pUid, false);
|
||||||
|
|
||||||
|
colDataSetNULL(taosArrayGet(pDelBlock->pDataBlock, GROUPID_COLUMN_INDEX), i);
|
||||||
|
colDataSetNULL(taosArrayGet(pDelBlock->pDataBlock, CALCULATE_START_TS_COLUMN_INDEX), i);
|
||||||
|
colDataSetNULL(taosArrayGet(pDelBlock->pDataBlock, CALCULATE_END_TS_COLUMN_INDEX), i);
|
||||||
|
}
|
||||||
|
|
||||||
|
taosArrayDestroy(pRes->uidList);
|
||||||
|
*pRefBlock = taosAllocateQitem(sizeof(SStreamRefDataBlock), DEF_QITEM, 0);
|
||||||
|
if (pRefBlock == NULL) {
|
||||||
|
return TSDB_CODE_OUT_OF_MEMORY;
|
||||||
|
}
|
||||||
|
|
||||||
|
(*pRefBlock)->type = STREAM_INPUT__REF_DATA_BLOCK;
|
||||||
|
(*pRefBlock)->pBlock = pDelBlock;
|
||||||
|
return TSDB_CODE_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
int32_t tqProcessDeleteDataReq(STQ* pTq, void* pReq, int32_t len, int64_t ver) {
|
||||||
bool failed = false;
|
bool failed = false;
|
||||||
SDecoder* pCoder = &(SDecoder){0};
|
SDecoder* pCoder = &(SDecoder){0};
|
||||||
SDeleteRes* pRes = &(SDeleteRes){0};
|
SDeleteRes* pRes = &(SDeleteRes){0};
|
||||||
|
@ -1149,6 +1215,7 @@ int32_t tqProcessDelReq(STQ* pTq, void* pReq, int32_t len, int64_t ver) {
|
||||||
taosArrayDestroy(pRes->uidList);
|
taosArrayDestroy(pRes->uidList);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
SSDataBlock* pDelBlock = createSpecialDataBlock(STREAM_DELETE_DATA);
|
SSDataBlock* pDelBlock = createSpecialDataBlock(STREAM_DELETE_DATA);
|
||||||
blockDataEnsureCapacity(pDelBlock, sz);
|
blockDataEnsureCapacity(pDelBlock, sz);
|
||||||
pDelBlock->info.rows = sz;
|
pDelBlock->info.rows = sz;
|
||||||
|
@ -1195,8 +1262,6 @@ int32_t tqProcessDelReq(STQ* pTq, void* pReq, int32_t len, int64_t ver) {
|
||||||
SStreamRefDataBlock* pRefBlock = taosAllocateQitem(sizeof(SStreamRefDataBlock), DEF_QITEM, 0);
|
SStreamRefDataBlock* pRefBlock = taosAllocateQitem(sizeof(SStreamRefDataBlock), DEF_QITEM, 0);
|
||||||
pRefBlock->type = STREAM_INPUT__REF_DATA_BLOCK;
|
pRefBlock->type = STREAM_INPUT__REF_DATA_BLOCK;
|
||||||
pRefBlock->pBlock = pDelBlock;
|
pRefBlock->pBlock = pDelBlock;
|
||||||
pRefBlock->dataRef = pRef;
|
|
||||||
atomic_add_fetch_32(pRefBlock->dataRef, 1);
|
|
||||||
|
|
||||||
if (tAppendDataToInputQueue(pTask, (SStreamQueueItem*)pRefBlock) < 0) {
|
if (tAppendDataToInputQueue(pTask, (SStreamQueueItem*)pRefBlock) < 0) {
|
||||||
atomic_sub_fetch_32(pRef, 1);
|
atomic_sub_fetch_32(pRef, 1);
|
||||||
|
@ -1375,6 +1440,7 @@ int32_t tqProcessTaskResumeReq(STQ* pTq, int64_t sversion, char* msg, int32_t ms
|
||||||
// no lock needs to secure the access of the version
|
// no lock needs to secure the access of the version
|
||||||
if (pReq->igUntreated) { // discard all the data when the stream task is suspended.
|
if (pReq->igUntreated) { // discard all the data when the stream task is suspended.
|
||||||
pTask->chkInfo.currentVer = sversion;
|
pTask->chkInfo.currentVer = sversion;
|
||||||
|
walReaderSeekVer(pTask->exec.pWalReader, sversion);
|
||||||
tqDebug("vgId:%d s-task:%s resume to normal from the latest version:%" PRId64 ", vnode ver:%" PRId64, pTq->pStreamMeta->vgId,
|
tqDebug("vgId:%d s-task:%s resume to normal from the latest version:%" PRId64 ", vnode ver:%" PRId64, pTq->pStreamMeta->vgId,
|
||||||
pTask->id.idStr, pTask->chkInfo.currentVer, sversion);
|
pTask->id.idStr, pTask->chkInfo.currentVer, sversion);
|
||||||
} else { // from the previous paused version and go on
|
} else { // from the previous paused version and go on
|
||||||
|
|
|
@ -54,7 +54,7 @@ int32_t tDecodeSTqHandle(SDecoder* pDecoder, STqHandle* pHandle) {
|
||||||
if (tDecodeCStrAlloc(pDecoder, &pHandle->execHandle.execCol.qmsg) < 0) return -1;
|
if (tDecodeCStrAlloc(pDecoder, &pHandle->execHandle.execCol.qmsg) < 0) return -1;
|
||||||
} else if (pHandle->execHandle.subType == TOPIC_SUB_TYPE__DB) {
|
} else if (pHandle->execHandle.subType == TOPIC_SUB_TYPE__DB) {
|
||||||
pHandle->execHandle.execDb.pFilterOutTbUid =
|
pHandle->execHandle.execDb.pFilterOutTbUid =
|
||||||
taosHashInit(64, taosGetDefaultHashFunction(TSDB_DATA_TYPE_BIGINT), false, HASH_NO_LOCK);
|
taosHashInit(64, taosGetDefaultHashFunction(TSDB_DATA_TYPE_BIGINT), false, HASH_ENTRY_LOCK);
|
||||||
int32_t size = 0;
|
int32_t size = 0;
|
||||||
if (tDecodeI32(pDecoder, &size) < 0) return -1;
|
if (tDecodeI32(pDecoder, &size) < 0) return -1;
|
||||||
for (int32_t i = 0; i < size; i++) {
|
for (int32_t i = 0; i < size; i++) {
|
||||||
|
@ -295,7 +295,7 @@ int32_t tqMetaRestoreHandle(STQ* pTq) {
|
||||||
code = -1;
|
code = -1;
|
||||||
goto end;
|
goto end;
|
||||||
}
|
}
|
||||||
walRefVer(handle.pRef, handle.snapshotVer);
|
walSetRefVer(handle.pRef, handle.snapshotVer);
|
||||||
|
|
||||||
SReadHandle reader = {
|
SReadHandle reader = {
|
||||||
.meta = pTq->pVnode->pMeta,
|
.meta = pTq->pVnode->pMeta,
|
||||||
|
@ -352,7 +352,9 @@ int32_t tqMetaRestoreHandle(STQ* pTq) {
|
||||||
handle.execHandle.task = qCreateQueueExecTaskInfo(NULL, &reader, vgId, NULL, 0);
|
handle.execHandle.task = qCreateQueueExecTaskInfo(NULL, &reader, vgId, NULL, 0);
|
||||||
}
|
}
|
||||||
tqDebug("tq restore %s consumer %" PRId64 " vgId:%d", handle.subKey, handle.consumerId, vgId);
|
tqDebug("tq restore %s consumer %" PRId64 " vgId:%d", handle.subKey, handle.consumerId, vgId);
|
||||||
|
taosWLockLatch(&pTq->lock);
|
||||||
taosHashPut(pTq->pHandle, pKey, kLen, &handle, sizeof(STqHandle));
|
taosHashPut(pTq->pHandle, pKey, kLen, &handle, sizeof(STqHandle));
|
||||||
|
taosWUnLockLatch(&pTq->lock);
|
||||||
}
|
}
|
||||||
|
|
||||||
end:
|
end:
|
||||||
|
|
|
@ -78,13 +78,15 @@ int32_t tqOffsetRestoreFromFile(STqOffsetStore* pStore, const char* fname) {
|
||||||
|
|
||||||
// todo remove this
|
// todo remove this
|
||||||
if (offset.val.type == TMQ_OFFSET__LOG) {
|
if (offset.val.type == TMQ_OFFSET__LOG) {
|
||||||
|
taosWLockLatch(&pStore->pTq->lock);
|
||||||
STqHandle* pHandle = taosHashGet(pStore->pTq->pHandle, offset.subKey, strlen(offset.subKey));
|
STqHandle* pHandle = taosHashGet(pStore->pTq->pHandle, offset.subKey, strlen(offset.subKey));
|
||||||
if (pHandle) {
|
if (pHandle) {
|
||||||
if (walRefVer(pHandle->pRef, offset.val.version) < 0) {
|
if (walSetRefVer(pHandle->pRef, offset.val.version) < 0) {
|
||||||
// tqError("vgId: %d, tq handle %s ref ver %" PRId64 "error", pStore->pTq->pVnode->config.vgId, pHandle->subKey,
|
// tqError("vgId: %d, tq handle %s ref ver %" PRId64 "error", pStore->pTq->pVnode->config.vgId, pHandle->subKey,
|
||||||
// offset.val.version);
|
// offset.val.version);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
taosWUnLockLatch(&pStore->pTq->lock);
|
||||||
}
|
}
|
||||||
|
|
||||||
taosMemoryFree(pMemBuf);
|
taosMemoryFree(pMemBuf);
|
||||||
|
|
|
@ -34,12 +34,12 @@ int32_t tqPushMsg(STQ* pTq, void* msg, int32_t msgLen, tmsg_t msgType, int64_t v
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (msgType == TDMT_VND_SUBMIT) {
|
if (msgType == TDMT_VND_SUBMIT || msgType == TDMT_VND_DELETE) {
|
||||||
tqStartStreamTasks(pTq);
|
tqStartStreamTasks(pTq);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (msgType == TDMT_VND_DELETE) {
|
if (msgType == TDMT_VND_DELETE) {
|
||||||
tqProcessDelReq(pTq, POINTER_SHIFT(msg, sizeof(SMsgHead)), msgLen - sizeof(SMsgHead), ver);
|
// tqProcessDeleteDataReq(pTq, POINTER_SHIFT(msg, sizeof(SMsgHead)), msgLen - sizeof(SMsgHead), ver);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -302,25 +302,44 @@ int32_t tqSeekVer(STqReader* pReader, int64_t ver, const char* id) {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t extractSubmitMsgFromWal(SWalReader* pReader, SPackedData* pPackedData) {
|
int32_t extractMsgFromWal(SWalReader* pReader, void** pItem, const char* id) {
|
||||||
if (walNextValidMsg(pReader) < 0) {
|
int32_t code = walNextValidMsg(pReader);
|
||||||
return -1;
|
if (code != TSDB_CODE_SUCCESS) {
|
||||||
|
return code;
|
||||||
}
|
}
|
||||||
|
|
||||||
void* pBody = POINTER_SHIFT(pReader->pHead->head.body, sizeof(SSubmitReq2Msg));
|
|
||||||
int32_t len = pReader->pHead->head.bodyLen - sizeof(SSubmitReq2Msg);
|
|
||||||
int64_t ver = pReader->pHead->head.version;
|
int64_t ver = pReader->pHead->head.version;
|
||||||
|
|
||||||
void* data = taosMemoryMalloc(len);
|
if (pReader->pHead->head.msgType == TDMT_VND_SUBMIT) {
|
||||||
if (data == NULL) {
|
void* pBody = POINTER_SHIFT(pReader->pHead->head.body, sizeof(SSubmitReq2Msg));
|
||||||
// todo: for all stream in this vnode, keep this offset in the offset files, and wait for a moment, and then retry
|
int32_t len = pReader->pHead->head.bodyLen - sizeof(SSubmitReq2Msg);
|
||||||
terrno = TSDB_CODE_OUT_OF_MEMORY;
|
|
||||||
tqError("vgId:%d, failed to copy submit data for stream processing, since out of memory", 0);
|
void* data = taosMemoryMalloc(len);
|
||||||
return -1;
|
if (data == NULL) {
|
||||||
|
// todo: for all stream in this vnode, keep this offset in the offset files, and wait for a moment, and then retry
|
||||||
|
terrno = TSDB_CODE_OUT_OF_MEMORY;
|
||||||
|
tqError("vgId:%d, failed to copy submit data for stream processing, since out of memory", 0);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
memcpy(data, pBody, len);
|
||||||
|
SPackedData data1 = (SPackedData){.ver = ver, .msgLen = len, .msgStr = data};
|
||||||
|
|
||||||
|
*pItem = (SStreamQueueItem*)streamDataSubmitNew(data1, STREAM_INPUT__DATA_SUBMIT);
|
||||||
|
if (*pItem == NULL) {
|
||||||
|
terrno = TSDB_CODE_OUT_OF_MEMORY;
|
||||||
|
tqError("%s failed to create data submit for stream since out of memory", id);
|
||||||
|
return terrno;
|
||||||
|
}
|
||||||
|
} else if (pReader->pHead->head.msgType == TDMT_VND_DELETE) {
|
||||||
|
void* pBody = POINTER_SHIFT(pReader->pHead->head.body, sizeof(SMsgHead));
|
||||||
|
int32_t len = pReader->pHead->head.bodyLen - sizeof(SMsgHead);
|
||||||
|
|
||||||
|
extractDelDataBlock(pBody, len, ver, (SStreamRefDataBlock**)pItem);
|
||||||
|
} else {
|
||||||
|
ASSERT(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
memcpy(data, pBody, len);
|
|
||||||
*pPackedData = (SPackedData){.ver = ver, .msgLen = len, .msgStr = data};
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -503,9 +522,76 @@ int32_t tqMaskBlock(SSchemaWrapper* pDst, SSDataBlock* pBlock, const SSchemaWrap
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t tqRetrieveDataBlock(STqReader* pReader, const char* idstr) {
|
static int32_t buildResSDataBlock(SSDataBlock* pBlock, SSchemaWrapper* pSchema, const SArray* pColIdList) {
|
||||||
tqDebug("tq reader retrieve data block %p, index:%d/%d, %s", pReader->msg.msgStr, pReader->nextBlk,
|
if (blockDataGetNumOfCols(pBlock) > 0) {
|
||||||
(int32_t)taosArrayGetSize(pReader->submit.aSubmitTbData), idstr);
|
return TSDB_CODE_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
int32_t numOfCols = taosArrayGetSize(pColIdList);
|
||||||
|
|
||||||
|
if (numOfCols == 0) { // all columns are required
|
||||||
|
for (int32_t i = 0; i < pSchema->nCols; ++i) {
|
||||||
|
SSchema* pColSchema = &pSchema->pSchema[i];
|
||||||
|
SColumnInfoData colInfo = createColumnInfoData(pColSchema->type, pColSchema->bytes, pColSchema->colId);
|
||||||
|
|
||||||
|
int32_t code = blockDataAppendColInfo(pBlock, &colInfo);
|
||||||
|
if (code != TSDB_CODE_SUCCESS) {
|
||||||
|
blockDataFreeRes(pBlock);
|
||||||
|
return TSDB_CODE_OUT_OF_MEMORY;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if (numOfCols > pSchema->nCols) {
|
||||||
|
numOfCols = pSchema->nCols;
|
||||||
|
}
|
||||||
|
|
||||||
|
int32_t i = 0;
|
||||||
|
int32_t j = 0;
|
||||||
|
while (i < pSchema->nCols && j < numOfCols) {
|
||||||
|
SSchema* pColSchema = &pSchema->pSchema[i];
|
||||||
|
col_id_t colIdSchema = pColSchema->colId;
|
||||||
|
|
||||||
|
col_id_t colIdNeed = *(col_id_t*)taosArrayGet(pColIdList, j);
|
||||||
|
if (colIdSchema < colIdNeed) {
|
||||||
|
i++;
|
||||||
|
} else if (colIdSchema > colIdNeed) {
|
||||||
|
j++;
|
||||||
|
} else {
|
||||||
|
SColumnInfoData colInfo = createColumnInfoData(pColSchema->type, pColSchema->bytes, pColSchema->colId);
|
||||||
|
int32_t code = blockDataAppendColInfo(pBlock, &colInfo);
|
||||||
|
if (code != TSDB_CODE_SUCCESS) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
i++;
|
||||||
|
j++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return TSDB_CODE_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int32_t doSetVal(SColumnInfoData* pColumnInfoData, int32_t rowIndex, SColVal* pColVal) {
|
||||||
|
int32_t code = TSDB_CODE_SUCCESS;
|
||||||
|
|
||||||
|
if (IS_STR_DATA_TYPE(pColVal->type)) {
|
||||||
|
char val[65535 + 2] = {0};
|
||||||
|
if (pColVal->value.pData != NULL) {
|
||||||
|
memcpy(varDataVal(val), pColVal->value.pData, pColVal->value.nData);
|
||||||
|
varDataSetLen(val, pColVal->value.nData);
|
||||||
|
code = colDataSetVal(pColumnInfoData, rowIndex, val, !COL_VAL_IS_VALUE(pColVal));
|
||||||
|
} else {
|
||||||
|
colDataSetNULL(pColumnInfoData, rowIndex);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
code = colDataSetVal(pColumnInfoData, rowIndex, (void*)&pColVal->value.val, !COL_VAL_IS_VALUE(pColVal));
|
||||||
|
}
|
||||||
|
|
||||||
|
return code;
|
||||||
|
}
|
||||||
|
|
||||||
|
int32_t tqRetrieveDataBlock(STqReader* pReader, const char* id) {
|
||||||
|
tqDebug("tq reader retrieve data block %p, index:%d", pReader->msg.msgStr, pReader->nextBlk);
|
||||||
|
|
||||||
SSubmitTbData* pSubmitTbData = taosArrayGet(pReader->submit.aSubmitTbData, pReader->nextBlk++);
|
SSubmitTbData* pSubmitTbData = taosArrayGet(pReader->submit.aSubmitTbData, pReader->nextBlk++);
|
||||||
|
|
||||||
|
@ -538,53 +624,11 @@ int32_t tqRetrieveDataBlock(STqReader* pReader, const char* idstr) {
|
||||||
pReader->cachedSchemaSuid = suid;
|
pReader->cachedSchemaSuid = suid;
|
||||||
pReader->cachedSchemaVer = sversion;
|
pReader->cachedSchemaVer = sversion;
|
||||||
|
|
||||||
SSchemaWrapper* pSchemaWrapper = pReader->pSchemaWrapper;
|
ASSERT(pReader->cachedSchemaVer == pReader->pSchemaWrapper->version);
|
||||||
if (blockDataGetNumOfCols(pBlock) > 0) {
|
if (blockDataGetNumOfCols(pBlock) == 0) {
|
||||||
blockDataDestroy(pReader->pResBlock);
|
int32_t code = buildResSDataBlock(pReader->pResBlock, pReader->pSchemaWrapper, pReader->pColIdList);
|
||||||
pReader->pResBlock = createDataBlock();
|
if (code != TSDB_CODE_SUCCESS) {
|
||||||
pBlock = pReader->pResBlock;
|
return code;
|
||||||
|
|
||||||
pBlock->info.id.uid = uid;
|
|
||||||
pBlock->info.version = pReader->msg.ver;
|
|
||||||
}
|
|
||||||
|
|
||||||
int32_t numOfCols = taosArrayGetSize(pReader->pColIdList);
|
|
||||||
if (numOfCols == 0) { // all columns are required
|
|
||||||
for (int32_t i = 0; i < pSchemaWrapper->nCols; ++i) {
|
|
||||||
SSchema* pColSchema = &pSchemaWrapper->pSchema[i];
|
|
||||||
SColumnInfoData colInfo = createColumnInfoData(pColSchema->type, pColSchema->bytes, pColSchema->colId);
|
|
||||||
|
|
||||||
int32_t code = blockDataAppendColInfo(pBlock, &colInfo);
|
|
||||||
if (code != TSDB_CODE_SUCCESS) {
|
|
||||||
blockDataFreeRes(pBlock);
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
if (numOfCols > pSchemaWrapper->nCols) {
|
|
||||||
numOfCols = pSchemaWrapper->nCols;
|
|
||||||
}
|
|
||||||
|
|
||||||
int32_t i = 0;
|
|
||||||
int32_t j = 0;
|
|
||||||
while (i < pSchemaWrapper->nCols && j < numOfCols) {
|
|
||||||
SSchema* pColSchema = &pSchemaWrapper->pSchema[i];
|
|
||||||
col_id_t colIdSchema = pColSchema->colId;
|
|
||||||
|
|
||||||
col_id_t colIdNeed = *(col_id_t*)taosArrayGet(pReader->pColIdList, j);
|
|
||||||
if (colIdSchema < colIdNeed) {
|
|
||||||
i++;
|
|
||||||
} else if (colIdSchema > colIdNeed) {
|
|
||||||
j++;
|
|
||||||
} else {
|
|
||||||
SColumnInfoData colInfo = createColumnInfoData(pColSchema->type, pColSchema->bytes, pColSchema->colId);
|
|
||||||
int32_t code = blockDataAppendColInfo(pBlock, &colInfo);
|
|
||||||
if (code != TSDB_CODE_SUCCESS) {
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
i++;
|
|
||||||
j++;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -632,30 +676,15 @@ int32_t tqRetrieveDataBlock(STqReader* pReader, const char* idstr) {
|
||||||
} else if (pCol->cid == pColData->info.colId) {
|
} else if (pCol->cid == pColData->info.colId) {
|
||||||
for (int32_t i = 0; i < pCol->nVal; i++) {
|
for (int32_t i = 0; i < pCol->nVal; i++) {
|
||||||
tColDataGetValue(pCol, i, &colVal);
|
tColDataGetValue(pCol, i, &colVal);
|
||||||
if (IS_STR_DATA_TYPE(colVal.type)) {
|
int32_t code = doSetVal(pColData, i, &colVal);
|
||||||
if (colVal.value.pData != NULL) {
|
if (code != TSDB_CODE_SUCCESS) {
|
||||||
char val[65535 + 2] = {0};
|
return code;
|
||||||
memcpy(varDataVal(val), colVal.value.pData, colVal.value.nData);
|
|
||||||
varDataSetLen(val, colVal.value.nData);
|
|
||||||
if (colDataAppend(pColData, i, val, !COL_VAL_IS_VALUE(&colVal)) < 0) {
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
colDataSetNULL(pColData, i);
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
if (colDataAppend(pColData, i, (void*)&colVal.value.val, !COL_VAL_IS_VALUE(&colVal)) < 0) {
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
sourceIdx++;
|
sourceIdx++;
|
||||||
targetIdx++;
|
targetIdx++;
|
||||||
} else {
|
} else {
|
||||||
for (int32_t i = 0; i < pCol->nVal; i++) {
|
colDataSetNNULL(pColData, 0, pCol->nVal);
|
||||||
colDataSetNULL(pColData, i);
|
|
||||||
}
|
|
||||||
|
|
||||||
targetIdx++;
|
targetIdx++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -679,21 +708,9 @@ int32_t tqRetrieveDataBlock(STqReader* pReader, const char* idstr) {
|
||||||
sourceIdx++;
|
sourceIdx++;
|
||||||
continue;
|
continue;
|
||||||
} else if (colVal.cid == pColData->info.colId) {
|
} else if (colVal.cid == pColData->info.colId) {
|
||||||
if (IS_STR_DATA_TYPE(colVal.type)) {
|
int32_t code = doSetVal(pColData, i, &colVal);
|
||||||
if (colVal.value.pData != NULL) {
|
if (code != TSDB_CODE_SUCCESS) {
|
||||||
char val[65535 + 2] = {0};
|
return code;
|
||||||
memcpy(varDataVal(val), colVal.value.pData, colVal.value.nData);
|
|
||||||
varDataSetLen(val, colVal.value.nData);
|
|
||||||
if (colDataAppend(pColData, i, val, !COL_VAL_IS_VALUE(&colVal)) < 0) {
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
colDataSetNULL(pColData, i);
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
if (colDataAppend(pColData, i, (void*)&colVal.value.val, !COL_VAL_IS_VALUE(&colVal)) < 0) {
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
sourceIdx++;
|
sourceIdx++;
|
||||||
|
@ -831,14 +848,14 @@ int32_t tqRetrieveTaosxBlock(STqReader* pReader, SArray* blocks, SArray* schemas
|
||||||
char val[65535 + 2];
|
char val[65535 + 2];
|
||||||
memcpy(varDataVal(val), colVal.value.pData, colVal.value.nData);
|
memcpy(varDataVal(val), colVal.value.pData, colVal.value.nData);
|
||||||
varDataSetLen(val, colVal.value.nData);
|
varDataSetLen(val, colVal.value.nData);
|
||||||
if (colDataAppend(pColData, curRow - lastRow, val, !COL_VAL_IS_VALUE(&colVal)) < 0) {
|
if (colDataSetVal(pColData, curRow - lastRow, val, !COL_VAL_IS_VALUE(&colVal)) < 0) {
|
||||||
goto FAIL;
|
goto FAIL;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
colDataSetNULL(pColData, curRow - lastRow);
|
colDataSetNULL(pColData, curRow - lastRow);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
if (colDataAppend(pColData, curRow - lastRow, (void*)&colVal.value.val, !COL_VAL_IS_VALUE(&colVal)) < 0) {
|
if (colDataSetVal(pColData, curRow - lastRow, (void*)&colVal.value.val, !COL_VAL_IS_VALUE(&colVal)) < 0) {
|
||||||
goto FAIL;
|
goto FAIL;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -928,14 +945,14 @@ int32_t tqRetrieveTaosxBlock(STqReader* pReader, SArray* blocks, SArray* schemas
|
||||||
char val[65535 + 2];
|
char val[65535 + 2];
|
||||||
memcpy(varDataVal(val), colVal.value.pData, colVal.value.nData);
|
memcpy(varDataVal(val), colVal.value.pData, colVal.value.nData);
|
||||||
varDataSetLen(val, colVal.value.nData);
|
varDataSetLen(val, colVal.value.nData);
|
||||||
if (colDataAppend(pColData, curRow - lastRow, val, !COL_VAL_IS_VALUE(&colVal)) < 0) {
|
if (colDataSetVal(pColData, curRow - lastRow, val, !COL_VAL_IS_VALUE(&colVal)) < 0) {
|
||||||
goto FAIL;
|
goto FAIL;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
colDataSetNULL(pColData, curRow - lastRow);
|
colDataSetNULL(pColData, curRow - lastRow);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
if (colDataAppend(pColData, curRow - lastRow, (void*)&colVal.value.val, !COL_VAL_IS_VALUE(&colVal)) < 0) {
|
if (colDataSetVal(pColData, curRow - lastRow, (void*)&colVal.value.val, !COL_VAL_IS_VALUE(&colVal)) < 0) {
|
||||||
goto FAIL;
|
goto FAIL;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1015,6 +1032,7 @@ int32_t tqUpdateTbUidList(STQ* pTq, const SArray* tbUidList, bool isAdd) {
|
||||||
int32_t vgId = TD_VID(pTq->pVnode);
|
int32_t vgId = TD_VID(pTq->pVnode);
|
||||||
|
|
||||||
// update the table list for each consumer handle
|
// update the table list for each consumer handle
|
||||||
|
taosWLockLatch(&pTq->lock);
|
||||||
while (1) {
|
while (1) {
|
||||||
pIter = taosHashIterate(pTq->pHandle, pIter);
|
pIter = taosHashIterate(pTq->pHandle, pIter);
|
||||||
if (pIter == NULL) {
|
if (pIter == NULL) {
|
||||||
|
@ -1071,6 +1089,7 @@ int32_t tqUpdateTbUidList(STQ* pTq, const SArray* tbUidList, bool isAdd) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
taosWUnLockLatch(&pTq->lock);
|
||||||
|
|
||||||
// update the table list handle for each stream scanner/wal reader
|
// update the table list handle for each stream scanner/wal reader
|
||||||
taosWLockLatch(&pTq->pStreamMeta->lock);
|
taosWLockLatch(&pTq->pStreamMeta->lock);
|
||||||
|
|
|
@ -120,13 +120,11 @@ int32_t createStreamRunReq(SStreamMeta* pStreamMeta, bool* pScanIdle) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// append the data for the stream
|
// append the data for the stream
|
||||||
tqDebug("vgId:%d s-task:%s wal reader seek to ver:%" PRId64, vgId, pTask->id.idStr, pTask->chkInfo.currentVer);
|
tqDebug("vgId:%d s-task:%s wal reader seek to ver:%" PRId64, vgId, pTask->id.idStr, pTask->chkInfo.currentVer);
|
||||||
} else {
|
} else {
|
||||||
int64_t currentVer = walReaderGetCurrentVer(pTask->exec.pWalReader);
|
int64_t currentVer = walReaderGetCurrentVer(pTask->exec.pWalReader);
|
||||||
if (currentVer != pTask->chkInfo.currentVer) {
|
if (currentVer == -1) {
|
||||||
int32_t code = walReaderSeekVer(pTask->exec.pWalReader, pTask->chkInfo.currentVer);
|
int32_t code = walReaderSeekVer(pTask->exec.pWalReader, pTask->chkInfo.currentVer);
|
||||||
if (code != TSDB_CODE_SUCCESS) { // no data in wal, quit
|
if (code != TSDB_CODE_SUCCESS) { // no data in wal, quit
|
||||||
streamMetaReleaseTask(pStreamMeta, pTask);
|
streamMetaReleaseTask(pStreamMeta, pTask);
|
||||||
|
@ -134,28 +132,27 @@ int32_t createStreamRunReq(SStreamMeta* pStreamMeta, bool* pScanIdle) {
|
||||||
}
|
}
|
||||||
|
|
||||||
// append the data for the stream
|
// append the data for the stream
|
||||||
tqDebug("vgId:%d s-task:%s wal reader seek to ver:%" PRId64, vgId, pTask->id.idStr, pTask->chkInfo.currentVer);
|
tqDebug("vgId:%d s-task:%s wal reader initial seek to ver:%" PRId64, vgId, pTask->id.idStr, pTask->chkInfo.currentVer);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
SPackedData packData = {0};
|
// append the data for the stream
|
||||||
int32_t code = extractSubmitMsgFromWal(pTask->exec.pWalReader, &packData);
|
SStreamQueueItem* pItem = NULL;
|
||||||
|
int32_t code = extractMsgFromWal(pTask->exec.pWalReader, (void**) &pItem, pTask->id.idStr);
|
||||||
if (code != TSDB_CODE_SUCCESS) { // failed, continue
|
if (code != TSDB_CODE_SUCCESS) { // failed, continue
|
||||||
streamMetaReleaseTask(pStreamMeta, pTask);
|
streamMetaReleaseTask(pStreamMeta, pTask);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
SStreamDataSubmit2* p = streamDataSubmitNew(packData, STREAM_INPUT__DATA_SUBMIT);
|
// delete ignore
|
||||||
if (p == NULL) {
|
if (pItem == NULL) {
|
||||||
terrno = TSDB_CODE_OUT_OF_MEMORY;
|
|
||||||
tqError("%s failed to create data submit for stream since out of memory", pTask->id.idStr);
|
|
||||||
streamMetaReleaseTask(pStreamMeta, pTask);
|
streamMetaReleaseTask(pStreamMeta, pTask);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
noNewDataInWal = false;
|
noNewDataInWal = false;
|
||||||
|
|
||||||
code = tqAddInputBlockNLaunchTask(pTask, (SStreamQueueItem*)p, packData.ver);
|
code = tqAddInputBlockNLaunchTask(pTask, pItem);
|
||||||
if (code == TSDB_CODE_SUCCESS) {
|
if (code == TSDB_CODE_SUCCESS) {
|
||||||
pTask->chkInfo.currentVer = walReaderGetCurrentVer(pTask->exec.pWalReader);
|
pTask->chkInfo.currentVer = walReaderGetCurrentVer(pTask->exec.pWalReader);
|
||||||
tqDebug("s-task:%s set the ver:%" PRId64 " from WALReader after extract block from WAL", pTask->id.idStr,
|
tqDebug("s-task:%s set the ver:%" PRId64 " from WALReader after extract block from WAL", pTask->id.idStr,
|
||||||
|
@ -164,8 +161,7 @@ int32_t createStreamRunReq(SStreamMeta* pStreamMeta, bool* pScanIdle) {
|
||||||
tqError("s-task:%s append input queue failed, ver:%" PRId64, pTask->id.idStr, pTask->chkInfo.currentVer);
|
tqError("s-task:%s append input queue failed, ver:%" PRId64, pTask->id.idStr, pTask->chkInfo.currentVer);
|
||||||
}
|
}
|
||||||
|
|
||||||
streamDataSubmitDestroy(p);
|
|
||||||
taosFreeQitem(p);
|
|
||||||
streamMetaReleaseTask(pStreamMeta, pTask);
|
streamMetaReleaseTask(pStreamMeta, pTask);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -82,6 +82,7 @@ int32_t tqScanData(STQ* pTq, const STqHandle* pHandle, SMqDataRsp* pRsp, STqOffs
|
||||||
SSDataBlock* pDataBlock = NULL;
|
SSDataBlock* pDataBlock = NULL;
|
||||||
uint64_t ts = 0;
|
uint64_t ts = 0;
|
||||||
qStreamSetOpen(task);
|
qStreamSetOpen(task);
|
||||||
|
|
||||||
tqDebug("consumer:0x%" PRIx64 " vgId:%d, tmq one task start execute", pHandle->consumerId, vgId);
|
tqDebug("consumer:0x%" PRIx64 " vgId:%d, tmq one task start execute", pHandle->consumerId, vgId);
|
||||||
if (qExecTask(task, &pDataBlock, &ts) != TSDB_CODE_SUCCESS) {
|
if (qExecTask(task, &pDataBlock, &ts) != TSDB_CODE_SUCCESS) {
|
||||||
tqError("consumer:0x%" PRIx64 " vgId:%d, task exec error since %s", pHandle->consumerId, vgId, terrstr());
|
tqError("consumer:0x%" PRIx64 " vgId:%d, task exec error since %s", pHandle->consumerId, vgId, terrstr());
|
||||||
|
|
|
@ -26,10 +26,10 @@ char* createStreamTaskIdStr(int64_t streamId, int32_t taskId) {
|
||||||
return taosStrdup(buf);
|
return taosStrdup(buf);
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t tqAddInputBlockNLaunchTask(SStreamTask* pTask, SStreamQueueItem* pQueueItem, int64_t ver) {
|
int32_t tqAddInputBlockNLaunchTask(SStreamTask* pTask, SStreamQueueItem* pQueueItem) {
|
||||||
int32_t code = tAppendDataToInputQueue(pTask, pQueueItem);
|
int32_t code = tAppendDataToInputQueue(pTask, pQueueItem);
|
||||||
if (code < 0) {
|
if (code < 0) {
|
||||||
tqError("s-task:%s failed to put into queue, too many, next start ver:%" PRId64, pTask->id.idStr, ver);
|
tqError("s-task:%s failed to put into queue, too many", pTask->id.idStr);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -162,8 +162,6 @@ static int32_t extractResetOffsetVal(STqOffsetVal* pOffsetVal, STQ* pTq, STqHand
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool tqIsHandleExecuting(STqHandle* pHandle) { return 1 == atomic_load_8(&pHandle->exec); }
|
|
||||||
|
|
||||||
static int32_t extractDataAndRspForNormalSubscribe(STQ* pTq, STqHandle* pHandle, const SMqPollReq* pRequest,
|
static int32_t extractDataAndRspForNormalSubscribe(STQ* pTq, STqHandle* pHandle, const SMqPollReq* pRequest,
|
||||||
SRpcMsg* pMsg, STqOffsetVal* pOffset) {
|
SRpcMsg* pMsg, STqOffsetVal* pOffset) {
|
||||||
uint64_t consumerId = pRequest->consumerId;
|
uint64_t consumerId = pRequest->consumerId;
|
||||||
|
@ -172,20 +170,6 @@ static int32_t extractDataAndRspForNormalSubscribe(STQ* pTq, STqHandle* pHandle,
|
||||||
|
|
||||||
SMqDataRsp dataRsp = {0};
|
SMqDataRsp dataRsp = {0};
|
||||||
tqInitDataRsp(&dataRsp, pRequest);
|
tqInitDataRsp(&dataRsp, pRequest);
|
||||||
// qTaskInfo_t task = pHandle->execHandle.task;
|
|
||||||
// if (qTaskIsExecuting(task)) {
|
|
||||||
// code = tqSendDataRsp(pHandle, pMsg, pRequest, &dataRsp, TMQ_MSG_TYPE__POLL_RSP, vgId);
|
|
||||||
// tDeleteMqDataRsp(&dataRsp);
|
|
||||||
// return code;
|
|
||||||
// }
|
|
||||||
|
|
||||||
// todo add more status check to avoid race condition
|
|
||||||
while (tqIsHandleExecuting(pHandle)) {
|
|
||||||
tqDebug("vgId:%d, topic:%s, subscription is executing, wait for 5ms and retry", vgId, pHandle->subKey);
|
|
||||||
taosMsleep(5);
|
|
||||||
}
|
|
||||||
|
|
||||||
atomic_store_8(&pHandle->exec, 1);
|
|
||||||
|
|
||||||
qSetTaskId(pHandle->execHandle.task, consumerId, pRequest->reqId);
|
qSetTaskId(pHandle->execHandle.task, consumerId, pRequest->reqId);
|
||||||
code = tqScanData(pTq, pHandle, &dataRsp, pOffset);
|
code = tqScanData(pTq, pHandle, &dataRsp, pOffset);
|
||||||
|
@ -203,7 +187,6 @@ static int32_t extractDataAndRspForNormalSubscribe(STQ* pTq, STqHandle* pHandle,
|
||||||
code = tqRegisterPushHandle(pTq, pHandle, pMsg);
|
code = tqRegisterPushHandle(pTq, pHandle, pMsg);
|
||||||
taosWUnLockLatch(&pTq->lock);
|
taosWUnLockLatch(&pTq->lock);
|
||||||
tDeleteMqDataRsp(&dataRsp);
|
tDeleteMqDataRsp(&dataRsp);
|
||||||
atomic_store_8(&pHandle->exec, 0);
|
|
||||||
return code;
|
return code;
|
||||||
} else {
|
} else {
|
||||||
pHandle->noDataPollCnt++;
|
pHandle->noDataPollCnt++;
|
||||||
|
@ -222,7 +205,6 @@ static int32_t extractDataAndRspForNormalSubscribe(STQ* pTq, STqHandle* pHandle,
|
||||||
tDeleteMqDataRsp(&dataRsp);
|
tDeleteMqDataRsp(&dataRsp);
|
||||||
}
|
}
|
||||||
|
|
||||||
atomic_store_8(&pHandle->exec, 0);
|
|
||||||
return code;
|
return code;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -233,19 +215,6 @@ static int32_t extractDataAndRspForDbStbSubscribe(STQ* pTq, STqHandle* pHandle,
|
||||||
SMqMetaRsp metaRsp = {0};
|
SMqMetaRsp metaRsp = {0};
|
||||||
STaosxRsp taosxRsp = {0};
|
STaosxRsp taosxRsp = {0};
|
||||||
tqInitTaosxRsp(&taosxRsp, pRequest);
|
tqInitTaosxRsp(&taosxRsp, pRequest);
|
||||||
// qTaskInfo_t task = pHandle->execHandle.task;
|
|
||||||
// if(qTaskIsExecuting(task)){
|
|
||||||
// code = tqSendDataRsp(pHandle, pMsg, pRequest, (SMqDataRsp*)&taosxRsp, TMQ_MSG_TYPE__TAOSX_RSP, vgId);
|
|
||||||
// tDeleteSTaosxRsp(&taosxRsp);
|
|
||||||
// return code;
|
|
||||||
// }
|
|
||||||
|
|
||||||
while (tqIsHandleExecuting(pHandle)) {
|
|
||||||
tqDebug("vgId:%d, topic:%s, subscription is executing, wait for 5ms and retry", vgId, pHandle->subKey);
|
|
||||||
taosMsleep(5);
|
|
||||||
}
|
|
||||||
|
|
||||||
atomic_store_8(&pHandle->exec, 1);
|
|
||||||
|
|
||||||
if (offset->type != TMQ_OFFSET__LOG) {
|
if (offset->type != TMQ_OFFSET__LOG) {
|
||||||
if (tqScanTaosx(pTq, pHandle, &taosxRsp, &metaRsp, offset) < 0) {
|
if (tqScanTaosx(pTq, pHandle, &taosxRsp, &metaRsp, offset) < 0) {
|
||||||
|
@ -255,18 +224,22 @@ static int32_t extractDataAndRspForDbStbSubscribe(STQ* pTq, STqHandle* pHandle,
|
||||||
|
|
||||||
if (metaRsp.metaRspLen > 0) {
|
if (metaRsp.metaRspLen > 0) {
|
||||||
code = tqSendMetaPollRsp(pHandle, pMsg, pRequest, &metaRsp, vgId);
|
code = tqSendMetaPollRsp(pHandle, pMsg, pRequest, &metaRsp, vgId);
|
||||||
tqDebug("tmq poll: consumer:0x%" PRIx64 " subkey:%s vgId:%d, send meta offset type:%d,uid:%" PRId64 ",ts:%" PRId64,
|
tqDebug("tmq poll: consumer:0x%" PRIx64 " subkey:%s vgId:%d, send meta offset type:%d,uid:%" PRId64
|
||||||
pRequest->consumerId, pHandle->subKey, vgId, metaRsp.rspOffset.type, metaRsp.rspOffset.uid, metaRsp.rspOffset.ts);
|
",ts:%" PRId64,
|
||||||
|
pRequest->consumerId, pHandle->subKey, vgId, metaRsp.rspOffset.type, metaRsp.rspOffset.uid,
|
||||||
|
metaRsp.rspOffset.ts);
|
||||||
taosMemoryFree(metaRsp.metaRsp);
|
taosMemoryFree(metaRsp.metaRsp);
|
||||||
goto end;
|
goto end;
|
||||||
}
|
}
|
||||||
|
|
||||||
tqDebug("taosx poll: consumer:0x%" PRIx64 " subkey:%s vgId:%d, send data blockNum:%d, offset type:%d,uid:%" PRId64
|
tqDebug("taosx poll: consumer:0x%" PRIx64 " subkey:%s vgId:%d, send data blockNum:%d, offset type:%d,uid:%" PRId64
|
||||||
",ts:%" PRId64,pRequest->consumerId, pHandle->subKey, vgId, taosxRsp.blockNum, taosxRsp.rspOffset.type, taosxRsp.rspOffset.uid,taosxRsp.rspOffset.ts);
|
",ts:%" PRId64,
|
||||||
|
pRequest->consumerId, pHandle->subKey, vgId, taosxRsp.blockNum, taosxRsp.rspOffset.type,
|
||||||
|
taosxRsp.rspOffset.uid, taosxRsp.rspOffset.ts);
|
||||||
if (taosxRsp.blockNum > 0) {
|
if (taosxRsp.blockNum > 0) {
|
||||||
code = tqSendDataRsp(pHandle, pMsg, pRequest, (SMqDataRsp*)&taosxRsp, TMQ_MSG_TYPE__TAOSX_RSP, vgId);
|
code = tqSendDataRsp(pHandle, pMsg, pRequest, (SMqDataRsp*)&taosxRsp, TMQ_MSG_TYPE__TAOSX_RSP, vgId);
|
||||||
goto end;
|
goto end;
|
||||||
}else {
|
} else {
|
||||||
*offset = taosxRsp.rspOffset;
|
*offset = taosxRsp.rspOffset;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -343,7 +316,6 @@ static int32_t extractDataAndRspForDbStbSubscribe(STQ* pTq, STqHandle* pHandle,
|
||||||
}
|
}
|
||||||
|
|
||||||
end:
|
end:
|
||||||
atomic_store_8(&pHandle->exec, 0);
|
|
||||||
|
|
||||||
tDeleteSTaosxRsp(&taosxRsp);
|
tDeleteSTaosxRsp(&taosxRsp);
|
||||||
taosMemoryFreeClear(pCkHead);
|
taosMemoryFreeClear(pCkHead);
|
||||||
|
|
|
@ -120,6 +120,18 @@ static int32_t setTableSchema(SCacheRowsReader* p, uint64_t suid, const char* id
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int32_t tsdbReuseCacherowsReader(void* reader, void* pTableIdList, int32_t numOfTables) {
|
||||||
|
SCacheRowsReader* pReader = (SCacheRowsReader*)reader;
|
||||||
|
|
||||||
|
pReader->pTableList = pTableIdList;
|
||||||
|
pReader->numOfTables = numOfTables;
|
||||||
|
pReader->lastTs = INT64_MIN;
|
||||||
|
|
||||||
|
resetLastBlockLoadInfo(pReader->pLoadInfo);
|
||||||
|
|
||||||
|
return TSDB_CODE_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
int32_t tsdbCacherowsReaderOpen(void* pVnode, int32_t type, void* pTableIdList, int32_t numOfTables, int32_t numOfCols,
|
int32_t tsdbCacherowsReaderOpen(void* pVnode, int32_t type, void* pTableIdList, int32_t numOfTables, int32_t numOfCols,
|
||||||
SArray* pCidList, int32_t* pSlotIds, uint64_t suid, void** pReader, const char* idstr) {
|
SArray* pCidList, int32_t* pSlotIds, uint64_t suid, void** pReader, const char* idstr) {
|
||||||
*pReader = NULL;
|
*pReader = NULL;
|
||||||
|
|
|
@ -210,6 +210,7 @@ struct STsdbReader {
|
||||||
SBlockLoadSuppInfo suppInfo;
|
SBlockLoadSuppInfo suppInfo;
|
||||||
STsdbReadSnap* pReadSnap;
|
STsdbReadSnap* pReadSnap;
|
||||||
SIOCostSummary cost;
|
SIOCostSummary cost;
|
||||||
|
SHashObj** pIgnoreTables;
|
||||||
STSchema* pSchema; // the newest version schema
|
STSchema* pSchema; // the newest version schema
|
||||||
SSHashObj* pSchemaMap; // keep the retrieved schema info, to avoid the overhead by repeatly load schema
|
SSHashObj* pSchemaMap; // keep the retrieved schema info, to avoid the overhead by repeatly load schema
|
||||||
SDataFReader* pFileReader; // the file reader
|
SDataFReader* pFileReader; // the file reader
|
||||||
|
@ -2785,15 +2786,21 @@ static int32_t buildComposedDataBlock(STsdbReader* pReader) {
|
||||||
int64_t st = taosGetTimestampUs();
|
int64_t st = taosGetTimestampUs();
|
||||||
int32_t step = asc ? 1 : -1;
|
int32_t step = asc ? 1 : -1;
|
||||||
double el = 0;
|
double el = 0;
|
||||||
|
SDataBlk* pBlock = getCurrentBlock(&pReader->status.blockIter);
|
||||||
|
SFileBlockDumpInfo* pDumpInfo = &pReader->status.fBlockDumpInfo;
|
||||||
|
|
||||||
STableBlockScanInfo* pBlockScanInfo = NULL;
|
STableBlockScanInfo* pBlockScanInfo = NULL;
|
||||||
if (pBlockInfo != NULL) {
|
if (pBlockInfo != NULL) {
|
||||||
|
if (pReader->pIgnoreTables && taosHashGet(*pReader->pIgnoreTables, &pBlockInfo->uid, sizeof(pBlockInfo->uid))) {
|
||||||
|
setBlockAllDumped(pDumpInfo, pBlock->maxKey.ts, pReader->order);
|
||||||
|
return code;
|
||||||
|
}
|
||||||
|
|
||||||
pBlockScanInfo = getTableBlockScanInfo(pReader->status.pTableMap, pBlockInfo->uid, pReader->idStr);
|
pBlockScanInfo = getTableBlockScanInfo(pReader->status.pTableMap, pBlockInfo->uid, pReader->idStr);
|
||||||
if (pBlockScanInfo == NULL) {
|
if (pBlockScanInfo == NULL) {
|
||||||
goto _end;
|
goto _end;
|
||||||
}
|
}
|
||||||
|
|
||||||
SDataBlk* pBlock = getCurrentBlock(&pReader->status.blockIter);
|
|
||||||
TSDBKEY keyInBuf = getCurrentKeyInBuf(pBlockScanInfo, pReader);
|
TSDBKEY keyInBuf = getCurrentKeyInBuf(pBlockScanInfo, pReader);
|
||||||
|
|
||||||
// it is a clean block, load it directly
|
// it is a clean block, load it directly
|
||||||
|
@ -2812,9 +2819,12 @@ static int32_t buildComposedDataBlock(STsdbReader* pReader) {
|
||||||
}
|
}
|
||||||
} else { // file blocks not exist
|
} else { // file blocks not exist
|
||||||
pBlockScanInfo = *pReader->status.pTableIter;
|
pBlockScanInfo = *pReader->status.pTableIter;
|
||||||
|
if (pReader->pIgnoreTables && taosHashGet(*pReader->pIgnoreTables, &pBlockScanInfo->uid, sizeof(pBlockScanInfo->uid))) {
|
||||||
|
setBlockAllDumped(pDumpInfo, pBlock->maxKey.ts, pReader->order);
|
||||||
|
return code;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
SFileBlockDumpInfo* pDumpInfo = &pReader->status.fBlockDumpInfo;
|
|
||||||
SBlockData* pBlockData = &pReader->status.fileBlockData;
|
SBlockData* pBlockData = &pReader->status.fileBlockData;
|
||||||
|
|
||||||
while (1) {
|
while (1) {
|
||||||
|
@ -3101,6 +3111,14 @@ static int32_t doLoadLastBlockSequentially(STsdbReader* pReader) {
|
||||||
|
|
||||||
// load the last data block of current table
|
// load the last data block of current table
|
||||||
STableBlockScanInfo* pScanInfo = *(STableBlockScanInfo**)pStatus->pTableIter;
|
STableBlockScanInfo* pScanInfo = *(STableBlockScanInfo**)pStatus->pTableIter;
|
||||||
|
if (pReader->pIgnoreTables && taosHashGet(*pReader->pIgnoreTables, &pScanInfo->uid, sizeof(pScanInfo->uid))) {
|
||||||
|
bool hasNexTable = moveToNextTable(pUidList, pStatus);
|
||||||
|
if (!hasNexTable) {
|
||||||
|
return TSDB_CODE_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
// reset the index in last block when handing a new file
|
// reset the index in last block when handing a new file
|
||||||
doCleanupTableScanInfo(pScanInfo);
|
doCleanupTableScanInfo(pScanInfo);
|
||||||
|
@ -3156,13 +3174,18 @@ static int32_t doLoadLastBlockSequentially(STsdbReader* pReader) {
|
||||||
|
|
||||||
static int32_t doBuildDataBlock(STsdbReader* pReader) {
|
static int32_t doBuildDataBlock(STsdbReader* pReader) {
|
||||||
int32_t code = TSDB_CODE_SUCCESS;
|
int32_t code = TSDB_CODE_SUCCESS;
|
||||||
SDataBlk* pBlock = NULL;
|
|
||||||
|
|
||||||
SReaderStatus* pStatus = &pReader->status;
|
SReaderStatus* pStatus = &pReader->status;
|
||||||
SDataBlockIter* pBlockIter = &pStatus->blockIter;
|
SDataBlockIter* pBlockIter = &pStatus->blockIter;
|
||||||
STableBlockScanInfo* pScanInfo = NULL;
|
STableBlockScanInfo* pScanInfo = NULL;
|
||||||
SFileDataBlockInfo* pBlockInfo = getCurrentBlockInfo(pBlockIter);
|
SFileDataBlockInfo* pBlockInfo = getCurrentBlockInfo(pBlockIter);
|
||||||
SLastBlockReader* pLastBlockReader = pReader->status.fileIter.pLastBlockReader;
|
SLastBlockReader* pLastBlockReader = pReader->status.fileIter.pLastBlockReader;
|
||||||
|
SDataBlk* pBlock = getCurrentBlock(pBlockIter);
|
||||||
|
|
||||||
|
if (pReader->pIgnoreTables && taosHashGet(*pReader->pIgnoreTables, &pBlockInfo->uid, sizeof(pBlockInfo->uid))) {
|
||||||
|
setBlockAllDumped(&pStatus->fBlockDumpInfo, pBlock->maxKey.ts, pReader->order);
|
||||||
|
return code;
|
||||||
|
}
|
||||||
|
|
||||||
if (pReader->code != TSDB_CODE_SUCCESS) {
|
if (pReader->code != TSDB_CODE_SUCCESS) {
|
||||||
return pReader->code;
|
return pReader->code;
|
||||||
|
@ -3173,7 +3196,6 @@ static int32_t doBuildDataBlock(STsdbReader* pReader) {
|
||||||
return terrno;
|
return terrno;
|
||||||
}
|
}
|
||||||
|
|
||||||
pBlock = getCurrentBlock(pBlockIter);
|
|
||||||
|
|
||||||
initLastBlockReader(pLastBlockReader, pScanInfo, pReader);
|
initLastBlockReader(pLastBlockReader, pScanInfo, pReader);
|
||||||
TSDBKEY keyInBuf = getCurrentKeyInBuf(pScanInfo, pReader);
|
TSDBKEY keyInBuf = getCurrentKeyInBuf(pScanInfo, pReader);
|
||||||
|
@ -3406,6 +3428,13 @@ static int32_t buildBlockFromBufferSequentially(STsdbReader* pReader) {
|
||||||
}
|
}
|
||||||
|
|
||||||
STableBlockScanInfo** pBlockScanInfo = pStatus->pTableIter;
|
STableBlockScanInfo** pBlockScanInfo = pStatus->pTableIter;
|
||||||
|
if (pReader->pIgnoreTables && taosHashGet(*pReader->pIgnoreTables, &(*pBlockScanInfo)->uid, sizeof((*pBlockScanInfo)->uid))) {
|
||||||
|
bool hasNexTable = moveToNextTable(pUidList, pStatus);
|
||||||
|
if (!hasNexTable) {
|
||||||
|
return TSDB_CODE_SUCCESS;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
initMemDataIterator(*pBlockScanInfo, pReader);
|
initMemDataIterator(*pBlockScanInfo, pReader);
|
||||||
|
|
||||||
int64_t endKey = (ASCENDING_TRAVERSE(pReader->order)) ? INT64_MAX : INT64_MIN;
|
int64_t endKey = (ASCENDING_TRAVERSE(pReader->order)) ? INT64_MAX : INT64_MIN;
|
||||||
|
@ -4360,7 +4389,7 @@ static void freeSchemaFunc(void* param) {
|
||||||
|
|
||||||
// ====================================== EXPOSED APIs ======================================
|
// ====================================== EXPOSED APIs ======================================
|
||||||
int32_t tsdbReaderOpen(SVnode* pVnode, SQueryTableDataCond* pCond, void* pTableList, int32_t numOfTables,
|
int32_t tsdbReaderOpen(SVnode* pVnode, SQueryTableDataCond* pCond, void* pTableList, int32_t numOfTables,
|
||||||
SSDataBlock* pResBlock, STsdbReader** ppReader, const char* idstr, bool countOnly) {
|
SSDataBlock* pResBlock, STsdbReader** ppReader, const char* idstr, bool countOnly, SHashObj** pIgnoreTables) {
|
||||||
STimeWindow window = pCond->twindows;
|
STimeWindow window = pCond->twindows;
|
||||||
|
|
||||||
int32_t capacity = pVnode->config.tsdbCfg.maxRows;
|
int32_t capacity = pVnode->config.tsdbCfg.maxRows;
|
||||||
|
@ -4470,6 +4499,8 @@ int32_t tsdbReaderOpen(SVnode* pVnode, SQueryTableDataCond* pCond, void* pTableL
|
||||||
pReader->readMode = READ_MODE_COUNT_ONLY;
|
pReader->readMode = READ_MODE_COUNT_ONLY;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pReader->pIgnoreTables = pIgnoreTables;
|
||||||
|
|
||||||
tsdbDebug("%p total numOfTable:%d in this query %s", pReader, numOfTables, pReader->idStr);
|
tsdbDebug("%p total numOfTable:%d in this query %s", pReader, numOfTables, pReader->idStr);
|
||||||
return code;
|
return code;
|
||||||
|
|
||||||
|
|
|
@ -86,6 +86,7 @@ enum {
|
||||||
|
|
||||||
enum {
|
enum {
|
||||||
CTG_OP_UPDATE_VGROUP = 0,
|
CTG_OP_UPDATE_VGROUP = 0,
|
||||||
|
CTG_OP_UPDATE_DB_CFG,
|
||||||
CTG_OP_UPDATE_TB_META,
|
CTG_OP_UPDATE_TB_META,
|
||||||
CTG_OP_DROP_DB_CACHE,
|
CTG_OP_DROP_DB_CACHE,
|
||||||
CTG_OP_DROP_DB_VGROUP,
|
CTG_OP_DROP_DB_VGROUP,
|
||||||
|
@ -253,21 +254,27 @@ typedef struct SCtgVgCache {
|
||||||
SDBVgInfo* vgInfo;
|
SDBVgInfo* vgInfo;
|
||||||
} SCtgVgCache;
|
} SCtgVgCache;
|
||||||
|
|
||||||
|
typedef struct SCtgCfgCache {
|
||||||
|
SRWLatch cfgLock;
|
||||||
|
SDbCfgInfo* cfgInfo;
|
||||||
|
} SCtgCfgCache;
|
||||||
|
|
||||||
typedef struct SCtgDBCache {
|
typedef struct SCtgDBCache {
|
||||||
SRWLatch dbLock; // RC between destroy tbCache/stbCache and all reads
|
SRWLatch dbLock; // RC between destroy tbCache/stbCache and all reads
|
||||||
uint64_t dbId;
|
uint64_t dbId;
|
||||||
int8_t deleted;
|
int8_t deleted;
|
||||||
SCtgVgCache vgCache;
|
SCtgVgCache vgCache;
|
||||||
SHashObj* tbCache; // key:tbname, value:SCtgTbCache
|
SCtgCfgCache cfgCache;
|
||||||
SHashObj* stbCache; // key:suid, value:char*
|
SHashObj* tbCache; // key:tbname, value:SCtgTbCache
|
||||||
uint64_t dbCacheNum[CTG_CI_MAX_VALUE];
|
SHashObj* stbCache; // key:suid, value:char*
|
||||||
uint64_t dbCacheSize;
|
uint64_t dbCacheNum[CTG_CI_MAX_VALUE];
|
||||||
|
uint64_t dbCacheSize;
|
||||||
} SCtgDBCache;
|
} SCtgDBCache;
|
||||||
|
|
||||||
typedef struct SCtgRentSlot {
|
typedef struct SCtgRentSlot {
|
||||||
SRWLatch lock;
|
SRWLatch lock;
|
||||||
bool needSort;
|
bool needSort;
|
||||||
SArray* meta; // element is SDbVgVersion or SSTableVersion
|
SArray* meta; // element is SDbCacheInfo or SSTableVersion
|
||||||
} SCtgRentSlot;
|
} SCtgRentSlot;
|
||||||
|
|
||||||
typedef struct SCtgRentMgmt {
|
typedef struct SCtgRentMgmt {
|
||||||
|
@ -435,6 +442,13 @@ typedef struct SCtgUpdateVgMsg {
|
||||||
SDBVgInfo* dbInfo;
|
SDBVgInfo* dbInfo;
|
||||||
} SCtgUpdateVgMsg;
|
} SCtgUpdateVgMsg;
|
||||||
|
|
||||||
|
typedef struct SCtgUpdateDbCfgMsg {
|
||||||
|
SCatalog* pCtg;
|
||||||
|
char dbFName[TSDB_DB_FNAME_LEN];
|
||||||
|
uint64_t dbId;
|
||||||
|
SDbCfgInfo* cfgInfo;
|
||||||
|
} SCtgUpdateDbCfgMsg;
|
||||||
|
|
||||||
typedef struct SCtgUpdateTbMetaMsg {
|
typedef struct SCtgUpdateTbMetaMsg {
|
||||||
SCatalog* pCtg;
|
SCatalog* pCtg;
|
||||||
STableMetaOutput* pMeta;
|
STableMetaOutput* pMeta;
|
||||||
|
@ -847,8 +861,10 @@ int32_t ctgRemoveTbMetaFromCache(SCatalog* pCtg, SName* pTableName, bool syncReq
|
||||||
int32_t ctgGetTbMetaFromCache(SCatalog* pCtg, SCtgTbMetaCtx* ctx, STableMeta** pTableMeta);
|
int32_t ctgGetTbMetaFromCache(SCatalog* pCtg, SCtgTbMetaCtx* ctx, STableMeta** pTableMeta);
|
||||||
int32_t ctgGetTbMetasFromCache(SCatalog* pCtg, SRequestConnInfo* pConn, SCtgTbMetasCtx* ctx, int32_t dbIdx,
|
int32_t ctgGetTbMetasFromCache(SCatalog* pCtg, SRequestConnInfo* pConn, SCtgTbMetasCtx* ctx, int32_t dbIdx,
|
||||||
int32_t* fetchIdx, int32_t baseResIdx, SArray* pList);
|
int32_t* fetchIdx, int32_t baseResIdx, SArray* pList);
|
||||||
|
void* ctgCloneDbCfgInfo(void* pSrc);
|
||||||
|
|
||||||
int32_t ctgOpUpdateVgroup(SCtgCacheOperation* action);
|
int32_t ctgOpUpdateVgroup(SCtgCacheOperation* action);
|
||||||
|
int32_t ctgOpUpdateDbCfg(SCtgCacheOperation *operation);
|
||||||
int32_t ctgOpUpdateTbMeta(SCtgCacheOperation* action);
|
int32_t ctgOpUpdateTbMeta(SCtgCacheOperation* action);
|
||||||
int32_t ctgOpDropDbCache(SCtgCacheOperation* action);
|
int32_t ctgOpDropDbCache(SCtgCacheOperation* action);
|
||||||
int32_t ctgOpDropDbVgroup(SCtgCacheOperation* action);
|
int32_t ctgOpDropDbVgroup(SCtgCacheOperation* action);
|
||||||
|
@ -870,6 +886,7 @@ int32_t ctgDropStbMetaEnqueue(SCatalog* pCtg, const char* dbFName, int64_t dbId,
|
||||||
bool syncReq);
|
bool syncReq);
|
||||||
int32_t ctgDropTbMetaEnqueue(SCatalog* pCtg, const char* dbFName, int64_t dbId, const char* tbName, bool syncReq);
|
int32_t ctgDropTbMetaEnqueue(SCatalog* pCtg, const char* dbFName, int64_t dbId, const char* tbName, bool syncReq);
|
||||||
int32_t ctgUpdateVgroupEnqueue(SCatalog* pCtg, const char* dbFName, int64_t dbId, SDBVgInfo* dbInfo, bool syncReq);
|
int32_t ctgUpdateVgroupEnqueue(SCatalog* pCtg, const char* dbFName, int64_t dbId, SDBVgInfo* dbInfo, bool syncReq);
|
||||||
|
int32_t ctgUpdateDbCfgEnqueue(SCatalog *pCtg, const char *dbFName, int64_t dbId, SDbCfgInfo *cfgInfo, bool syncOp);
|
||||||
int32_t ctgUpdateTbMetaEnqueue(SCatalog* pCtg, STableMetaOutput* output, bool syncReq);
|
int32_t ctgUpdateTbMetaEnqueue(SCatalog* pCtg, STableMetaOutput* output, bool syncReq);
|
||||||
int32_t ctgUpdateUserEnqueue(SCatalog* pCtg, SGetUserAuthRsp* pAuth, bool syncReq);
|
int32_t ctgUpdateUserEnqueue(SCatalog* pCtg, SGetUserAuthRsp* pAuth, bool syncReq);
|
||||||
int32_t ctgUpdateVgEpsetEnqueue(SCatalog* pCtg, char* dbFName, int32_t vgId, SEpSet* pEpSet);
|
int32_t ctgUpdateVgEpsetEnqueue(SCatalog* pCtg, char* dbFName, int32_t vgId, SEpSet* pEpSet);
|
||||||
|
@ -941,9 +958,9 @@ int32_t ctgGetVgIdsFromHashValue(SCatalog* pCtg, SDBVgInfo* dbInfo, char* dbFNam
|
||||||
void ctgResetTbMetaTask(SCtgTask* pTask);
|
void ctgResetTbMetaTask(SCtgTask* pTask);
|
||||||
void ctgFreeDbCache(SCtgDBCache* dbCache);
|
void ctgFreeDbCache(SCtgDBCache* dbCache);
|
||||||
int32_t ctgStbVersionSortCompare(const void* key1, const void* key2);
|
int32_t ctgStbVersionSortCompare(const void* key1, const void* key2);
|
||||||
int32_t ctgDbVgVersionSortCompare(const void* key1, const void* key2);
|
int32_t ctgDbCacheInfoSortCompare(const void* key1, const void* key2);
|
||||||
int32_t ctgStbVersionSearchCompare(const void* key1, const void* key2);
|
int32_t ctgStbVersionSearchCompare(const void* key1, const void* key2);
|
||||||
int32_t ctgDbVgVersionSearchCompare(const void* key1, const void* key2);
|
int32_t ctgDbCacheInfoSearchCompare(const void* key1, const void* key2);
|
||||||
void ctgFreeSTableMetaOutput(STableMetaOutput* pOutput);
|
void ctgFreeSTableMetaOutput(STableMetaOutput* pOutput);
|
||||||
int32_t ctgUpdateMsgCtx(SCtgMsgCtx* pCtx, int32_t reqType, void* out, char* target);
|
int32_t ctgUpdateMsgCtx(SCtgMsgCtx* pCtx, int32_t reqType, void* out, char* target);
|
||||||
int32_t ctgAddMsgCtx(SArray* pCtxs, int32_t reqType, void* out, char* target);
|
int32_t ctgAddMsgCtx(SArray* pCtxs, int32_t reqType, void* out, char* target);
|
||||||
|
@ -964,6 +981,9 @@ SName* ctgGetFetchName(SArray* pNames, SCtgFetch* pFetch);
|
||||||
int32_t ctgdGetOneHandle(SCatalog** pHandle);
|
int32_t ctgdGetOneHandle(SCatalog** pHandle);
|
||||||
int ctgVgInfoComp(const void* lp, const void* rp);
|
int ctgVgInfoComp(const void* lp, const void* rp);
|
||||||
int32_t ctgMakeVgArray(SDBVgInfo* dbInfo);
|
int32_t ctgMakeVgArray(SDBVgInfo* dbInfo);
|
||||||
|
int32_t ctgChkSetAuthRes(SCatalog *pCtg, SCtgAuthReq *req, SCtgAuthRsp* res);
|
||||||
|
int32_t ctgReadDBCfgFromCache(SCatalog *pCtg, const char* dbFName, SDbCfgInfo* pDbCfg);
|
||||||
|
|
||||||
int32_t ctgAcquireVgMetaFromCache(SCatalog* pCtg, const char* dbFName, const char* tbName, SCtgDBCache** pDb,
|
int32_t ctgAcquireVgMetaFromCache(SCatalog* pCtg, const char* dbFName, const char* tbName, SCtgDBCache** pDb,
|
||||||
SCtgTbCache** pTb);
|
SCtgTbCache** pTb);
|
||||||
int32_t ctgCopyTbMeta(SCatalog* pCtg, SCtgTbMetaCtx* ctx, SCtgDBCache** pDb, SCtgTbCache** pTb, STableMeta** pTableMeta,
|
int32_t ctgCopyTbMeta(SCatalog* pCtg, SCtgTbMetaCtx* ctx, SCtgDBCache** pDb, SCtgTbCache** pTb, STableMeta** pTableMeta,
|
||||||
|
|
|
@ -698,6 +698,22 @@ _return:
|
||||||
CTG_API_NLEAVE();
|
CTG_API_NLEAVE();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int32_t ctgGetDBCfg(SCatalog* pCtg, SRequestConnInfo* pConn, const char* dbFName, SDbCfgInfo* pDbCfg) {
|
||||||
|
CTG_ERR_RET(ctgReadDBCfgFromCache(pCtg, dbFName, pDbCfg));
|
||||||
|
|
||||||
|
if (pDbCfg->cfgVersion < 0) {
|
||||||
|
CTG_ERR_RET(ctgGetDBCfgFromMnode(pCtg, pConn, dbFName, pDbCfg, NULL));
|
||||||
|
SDbCfgInfo *pCfg = ctgCloneDbCfgInfo(pDbCfg);
|
||||||
|
if (NULL == pCfg) {
|
||||||
|
return TSDB_CODE_OUT_OF_MEMORY;
|
||||||
|
}
|
||||||
|
|
||||||
|
CTG_ERR_RET(ctgUpdateDbCfgEnqueue(pCtg, dbFName, pDbCfg->dbId, pCfg, false));
|
||||||
|
}
|
||||||
|
|
||||||
|
return TSDB_CODE_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
int32_t catalogInit(SCatalogCfg* cfg) {
|
int32_t catalogInit(SCatalogCfg* cfg) {
|
||||||
if (gCtgMgmt.pCluster) {
|
if (gCtgMgmt.pCluster) {
|
||||||
|
@ -1001,6 +1017,23 @@ _return:
|
||||||
CTG_API_LEAVE(code);
|
CTG_API_LEAVE(code);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int32_t catalogUpdateDbCfg(SCatalog* pCtg, const char* dbFName, uint64_t dbId, SDbCfgInfo* cfgInfo) {
|
||||||
|
CTG_API_ENTER();
|
||||||
|
|
||||||
|
int32_t code = 0;
|
||||||
|
|
||||||
|
if (NULL == pCtg || NULL == dbFName || NULL == cfgInfo) {
|
||||||
|
freeDbCfgInfo(cfgInfo);
|
||||||
|
CTG_ERR_JRET(TSDB_CODE_CTG_INVALID_INPUT);
|
||||||
|
}
|
||||||
|
|
||||||
|
code = ctgUpdateDbCfgEnqueue(pCtg, dbFName, dbId, cfgInfo, false);
|
||||||
|
|
||||||
|
_return:
|
||||||
|
|
||||||
|
CTG_API_LEAVE(code);
|
||||||
|
}
|
||||||
|
|
||||||
int32_t catalogRemoveDB(SCatalog* pCtg, const char* dbFName, uint64_t dbId) {
|
int32_t catalogRemoveDB(SCatalog* pCtg, const char* dbFName, uint64_t dbId) {
|
||||||
CTG_API_ENTER();
|
CTG_API_ENTER();
|
||||||
|
|
||||||
|
@ -1430,14 +1463,14 @@ int32_t catalogGetExpiredSTables(SCatalog* pCtg, SSTableVersion** stables, uint3
|
||||||
CTG_API_LEAVE(ctgMetaRentGet(&pCtg->stbRent, (void**)stables, num, sizeof(SSTableVersion)));
|
CTG_API_LEAVE(ctgMetaRentGet(&pCtg->stbRent, (void**)stables, num, sizeof(SSTableVersion)));
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t catalogGetExpiredDBs(SCatalog* pCtg, SDbVgVersion** dbs, uint32_t* num) {
|
int32_t catalogGetExpiredDBs(SCatalog* pCtg, SDbCacheInfo** dbs, uint32_t* num) {
|
||||||
CTG_API_ENTER();
|
CTG_API_ENTER();
|
||||||
|
|
||||||
if (NULL == pCtg || NULL == dbs || NULL == num) {
|
if (NULL == pCtg || NULL == dbs || NULL == num) {
|
||||||
CTG_API_LEAVE(TSDB_CODE_CTG_INVALID_INPUT);
|
CTG_API_LEAVE(TSDB_CODE_CTG_INVALID_INPUT);
|
||||||
}
|
}
|
||||||
|
|
||||||
CTG_API_LEAVE(ctgMetaRentGet(&pCtg->dbRent, (void**)dbs, num, sizeof(SDbVgVersion)));
|
CTG_API_LEAVE(ctgMetaRentGet(&pCtg->dbRent, (void**)dbs, num, sizeof(SDbCacheInfo)));
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t catalogGetExpiredUsers(SCatalog* pCtg, SUserAuthVersion** users, uint32_t* num) {
|
int32_t catalogGetExpiredUsers(SCatalog* pCtg, SUserAuthVersion** users, uint32_t* num) {
|
||||||
|
@ -1485,9 +1518,7 @@ int32_t catalogGetDBCfg(SCatalog* pCtg, SRequestConnInfo* pConn, const char* dbF
|
||||||
CTG_API_LEAVE(TSDB_CODE_CTG_INVALID_INPUT);
|
CTG_API_LEAVE(TSDB_CODE_CTG_INVALID_INPUT);
|
||||||
}
|
}
|
||||||
|
|
||||||
CTG_CACHE_NHIT_INC(CTG_CI_DB_CFG, 1);
|
CTG_API_LEAVE(ctgGetDBCfg(pCtg, pConn, dbFName, pDbCfg));
|
||||||
|
|
||||||
CTG_API_LEAVE(ctgGetDBCfgFromMnode(pCtg, pConn, dbFName, pDbCfg, NULL));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t catalogGetIndexMeta(SCatalog* pCtg, SRequestConnInfo* pConn, const char* indexName, SIndexInfo* pInfo) {
|
int32_t catalogGetIndexMeta(SCatalog* pCtg, SRequestConnInfo* pConn, const char* indexName, SIndexInfo* pInfo) {
|
||||||
|
|
|
@ -1587,7 +1587,6 @@ int32_t ctgHandleGetTbIndexRsp(SCtgTaskReq* tReq, int32_t reqType, const SDataBu
|
||||||
CTG_ERR_JRET(ctgCloneTableIndex(pOut->pIndex, &pInfo));
|
CTG_ERR_JRET(ctgCloneTableIndex(pOut->pIndex, &pInfo));
|
||||||
pTask->res = pInfo;
|
pTask->res = pInfo;
|
||||||
|
|
||||||
SCtgTbIndexCtx* ctx = pTask->taskCtx;
|
|
||||||
CTG_ERR_JRET(ctgUpdateTbIndexEnqueue(pTask->pJob->pCtg, (STableIndex**)&pTask->msgCtx.out, false));
|
CTG_ERR_JRET(ctgUpdateTbIndexEnqueue(pTask->pJob->pCtg, (STableIndex**)&pTask->msgCtx.out, false));
|
||||||
|
|
||||||
_return:
|
_return:
|
||||||
|
@ -1660,8 +1659,14 @@ _return:
|
||||||
int32_t ctgHandleGetDbCfgRsp(SCtgTaskReq* tReq, int32_t reqType, const SDataBuf* pMsg, int32_t rspCode) {
|
int32_t ctgHandleGetDbCfgRsp(SCtgTaskReq* tReq, int32_t reqType, const SDataBuf* pMsg, int32_t rspCode) {
|
||||||
int32_t code = 0;
|
int32_t code = 0;
|
||||||
SCtgTask* pTask = tReq->pTask;
|
SCtgTask* pTask = tReq->pTask;
|
||||||
|
SCtgDbCfgCtx* ctx = pTask->taskCtx;
|
||||||
|
|
||||||
CTG_ERR_JRET(ctgProcessRspMsg(pTask->msgCtx.out, reqType, pMsg->pData, pMsg->len, rspCode, pTask->msgCtx.target));
|
CTG_ERR_JRET(ctgProcessRspMsg(pTask->msgCtx.out, reqType, pMsg->pData, pMsg->len, rspCode, pTask->msgCtx.target));
|
||||||
|
|
||||||
|
SDbCfgInfo* pCfg = ctgCloneDbCfgInfo(pTask->msgCtx.out);
|
||||||
|
|
||||||
|
CTG_ERR_RET(ctgUpdateDbCfgEnqueue(pTask->pJob->pCtg, ctx->dbFName, pCfg->dbId, pCfg, false));
|
||||||
|
|
||||||
TSWAP(pTask->res, pTask->msgCtx.out);
|
TSWAP(pTask->res, pTask->msgCtx.out);
|
||||||
|
|
||||||
_return:
|
_return:
|
||||||
|
@ -2195,13 +2200,24 @@ int32_t ctgLaunchGetDbCfgTask(SCtgTask* pTask) {
|
||||||
SCtgDbCfgCtx* pCtx = (SCtgDbCfgCtx*)pTask->taskCtx;
|
SCtgDbCfgCtx* pCtx = (SCtgDbCfgCtx*)pTask->taskCtx;
|
||||||
SCtgJob* pJob = pTask->pJob;
|
SCtgJob* pJob = pTask->pJob;
|
||||||
SCtgMsgCtx* pMsgCtx = CTG_GET_TASK_MSGCTX(pTask, -1);
|
SCtgMsgCtx* pMsgCtx = CTG_GET_TASK_MSGCTX(pTask, -1);
|
||||||
|
SDbCfgInfo cfgInfo;
|
||||||
if (NULL == pMsgCtx->pBatchs) {
|
if (NULL == pMsgCtx->pBatchs) {
|
||||||
pMsgCtx->pBatchs = pJob->pBatchs;
|
pMsgCtx->pBatchs = pJob->pBatchs;
|
||||||
}
|
}
|
||||||
|
|
||||||
CTG_CACHE_NHIT_INC(CTG_CI_DB_CFG, 1);
|
CTG_ERR_RET(ctgReadDBCfgFromCache(pCtg, pCtx->dbFName, &cfgInfo));
|
||||||
|
|
||||||
CTG_ERR_RET(ctgGetDBCfgFromMnode(pCtg, pConn, pCtx->dbFName, NULL, pTask));
|
if (cfgInfo.cfgVersion < 0) {
|
||||||
|
CTG_ERR_RET(ctgGetDBCfgFromMnode(pCtg, pConn, pCtx->dbFName, NULL, pTask));
|
||||||
|
} else {
|
||||||
|
pTask->res = taosMemoryCalloc(1, sizeof(SDbCfgInfo));
|
||||||
|
if (NULL == pTask->res) {
|
||||||
|
CTG_ERR_RET(TSDB_CODE_OUT_OF_MEMORY);
|
||||||
|
}
|
||||||
|
|
||||||
|
memcpy(pTask->res, &cfgInfo, sizeof(cfgInfo));
|
||||||
|
CTG_ERR_RET(ctgHandleTaskEnd(pTask, 0));
|
||||||
|
}
|
||||||
|
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
|
@ -20,6 +20,7 @@
|
||||||
#include "trpc.h"
|
#include "trpc.h"
|
||||||
|
|
||||||
SCtgOperation gCtgCacheOperation[CTG_OP_MAX] = {{CTG_OP_UPDATE_VGROUP, "update vgInfo", ctgOpUpdateVgroup},
|
SCtgOperation gCtgCacheOperation[CTG_OP_MAX] = {{CTG_OP_UPDATE_VGROUP, "update vgInfo", ctgOpUpdateVgroup},
|
||||||
|
{CTG_OP_UPDATE_DB_CFG, "update dbCfg", ctgOpUpdateDbCfg},
|
||||||
{CTG_OP_UPDATE_TB_META, "update tbMeta", ctgOpUpdateTbMeta},
|
{CTG_OP_UPDATE_TB_META, "update tbMeta", ctgOpUpdateTbMeta},
|
||||||
{CTG_OP_DROP_DB_CACHE, "drop DB", ctgOpDropDbCache},
|
{CTG_OP_DROP_DB_CACHE, "drop DB", ctgOpDropDbCache},
|
||||||
{CTG_OP_DROP_DB_VGROUP, "drop DBVgroup", ctgOpDropDbVgroup},
|
{CTG_OP_DROP_DB_VGROUP, "drop DBVgroup", ctgOpDropDbVgroup},
|
||||||
|
@ -90,10 +91,15 @@ int32_t ctgWLockVgInfo(SCatalog *pCtg, SCtgDBCache *dbCache) {
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
void ctgRUnlockVgInfo(SCtgDBCache *dbCache) { CTG_UNLOCK(CTG_READ, &dbCache->vgCache.vgLock); }
|
void ctgRLockDbCfgInfo(SCtgDBCache *dbCache) { CTG_LOCK(CTG_READ, &dbCache->cfgCache.cfgLock); }
|
||||||
|
void ctgWLockDbCfgInfo(SCtgDBCache *dbCache) { CTG_LOCK(CTG_WRITE, &dbCache->cfgCache.cfgLock); }
|
||||||
|
|
||||||
|
void ctgRUnlockVgInfo(SCtgDBCache *dbCache) { CTG_UNLOCK(CTG_READ, &dbCache->vgCache.vgLock); }
|
||||||
void ctgWUnlockVgInfo(SCtgDBCache *dbCache) { CTG_UNLOCK(CTG_WRITE, &dbCache->vgCache.vgLock); }
|
void ctgWUnlockVgInfo(SCtgDBCache *dbCache) { CTG_UNLOCK(CTG_WRITE, &dbCache->vgCache.vgLock); }
|
||||||
|
|
||||||
|
void ctgRUnlockDbCfgInfo(SCtgDBCache *dbCache) { CTG_UNLOCK(CTG_READ, &dbCache->cfgCache.cfgLock); }
|
||||||
|
void ctgWUnlockDbCfgInfo(SCtgDBCache *dbCache) { CTG_UNLOCK(CTG_WRITE, &dbCache->cfgCache.cfgLock); }
|
||||||
|
|
||||||
void ctgReleaseDBCache(SCatalog *pCtg, SCtgDBCache *dbCache) {
|
void ctgReleaseDBCache(SCatalog *pCtg, SCtgDBCache *dbCache) {
|
||||||
CTG_UNLOCK(CTG_READ, &dbCache->dbLock);
|
CTG_UNLOCK(CTG_READ, &dbCache->dbLock);
|
||||||
taosHashRelease(pCtg->dbCache, dbCache);
|
taosHashRelease(pCtg->dbCache, dbCache);
|
||||||
|
@ -704,6 +710,43 @@ _return:
|
||||||
CTG_RET(code);
|
CTG_RET(code);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int32_t ctgReadDBCfgFromCache(SCatalog *pCtg, const char* dbFName, SDbCfgInfo* pDbCfg) {
|
||||||
|
int32_t code = 0;
|
||||||
|
SCtgDBCache *dbCache = NULL;
|
||||||
|
ctgAcquireDBCache(pCtg, dbFName, &dbCache);
|
||||||
|
if (NULL == dbCache) {
|
||||||
|
ctgDebug("db %s not in cache", dbFName);
|
||||||
|
pDbCfg->cfgVersion = -1;
|
||||||
|
CTG_CACHE_NHIT_INC(CTG_CI_DB_CFG, 1);
|
||||||
|
return TSDB_CODE_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
CTG_LOCK(CTG_READ, &dbCache->cfgCache.cfgLock);
|
||||||
|
|
||||||
|
if (dbCache->cfgCache.cfgInfo) {
|
||||||
|
SDbCfgInfo *pInfo = ctgCloneDbCfgInfo(dbCache->cfgCache.cfgInfo);
|
||||||
|
if (NULL == pInfo) {
|
||||||
|
CTG_ERR_JRET(TSDB_CODE_OUT_OF_MEMORY);
|
||||||
|
}
|
||||||
|
|
||||||
|
memcpy(pDbCfg, pInfo, sizeof(*pInfo));
|
||||||
|
taosMemoryFree(pInfo);
|
||||||
|
CTG_CACHE_HIT_INC(CTG_CI_DB_CFG, 1);
|
||||||
|
} else {
|
||||||
|
pDbCfg->cfgVersion = -1;
|
||||||
|
CTG_CACHE_NHIT_INC(CTG_CI_DB_CFG, 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
_return:
|
||||||
|
|
||||||
|
if (dbCache) {
|
||||||
|
CTG_UNLOCK(CTG_READ, &dbCache->cfgCache.cfgLock);
|
||||||
|
ctgReleaseDBCache(pCtg, dbCache);
|
||||||
|
}
|
||||||
|
|
||||||
|
return code;
|
||||||
|
}
|
||||||
|
|
||||||
int32_t ctgGetCachedStbNameFromSuid(SCatalog* pCtg, char* dbFName, uint64_t suid, char **stbName) {
|
int32_t ctgGetCachedStbNameFromSuid(SCatalog* pCtg, char* dbFName, uint64_t suid, char **stbName) {
|
||||||
*stbName = NULL;
|
*stbName = NULL;
|
||||||
|
|
||||||
|
@ -727,6 +770,7 @@ int32_t ctgGetCachedStbNameFromSuid(SCatalog* pCtg, char* dbFName, uint64_t suid
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
int32_t ctgChkAuthFromCache(SCatalog *pCtg, SUserAuthInfo *pReq, bool *inCache, SCtgAuthRsp *pRes) {
|
int32_t ctgChkAuthFromCache(SCatalog *pCtg, SUserAuthInfo *pReq, bool *inCache, SCtgAuthRsp *pRes) {
|
||||||
int32_t code = 0;
|
int32_t code = 0;
|
||||||
if (IS_SYS_DBNAME(pReq->tbName.dbname)) {
|
if (IS_SYS_DBNAME(pReq->tbName.dbname)) {
|
||||||
|
@ -1007,6 +1051,44 @@ _return:
|
||||||
CTG_RET(code);
|
CTG_RET(code);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int32_t ctgUpdateDbCfgEnqueue(SCatalog *pCtg, const char *dbFName, int64_t dbId, SDbCfgInfo *cfgInfo, bool syncOp) {
|
||||||
|
int32_t code = 0;
|
||||||
|
SCtgCacheOperation *op = taosMemoryCalloc(1, sizeof(SCtgCacheOperation));
|
||||||
|
op->opId = CTG_OP_UPDATE_DB_CFG;
|
||||||
|
op->syncOp = syncOp;
|
||||||
|
|
||||||
|
SCtgUpdateDbCfgMsg *msg = taosMemoryMalloc(sizeof(SCtgUpdateDbCfgMsg));
|
||||||
|
if (NULL == msg) {
|
||||||
|
ctgError("malloc %d failed", (int32_t)sizeof(SCtgUpdateDbCfgMsg));
|
||||||
|
taosMemoryFree(op);
|
||||||
|
freeDbCfgInfo(cfgInfo);
|
||||||
|
CTG_ERR_RET(TSDB_CODE_OUT_OF_MEMORY);
|
||||||
|
}
|
||||||
|
|
||||||
|
char *p = strchr(dbFName, '.');
|
||||||
|
if (p && IS_SYS_DBNAME(p + 1)) {
|
||||||
|
dbFName = p + 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
tstrncpy(msg->dbFName, dbFName, sizeof(msg->dbFName));
|
||||||
|
msg->pCtg = pCtg;
|
||||||
|
msg->dbId = dbId;
|
||||||
|
msg->cfgInfo = cfgInfo;
|
||||||
|
|
||||||
|
op->data = msg;
|
||||||
|
|
||||||
|
CTG_ERR_JRET(ctgEnqueue(pCtg, op));
|
||||||
|
|
||||||
|
return TSDB_CODE_SUCCESS;
|
||||||
|
|
||||||
|
_return:
|
||||||
|
|
||||||
|
freeDbCfgInfo(cfgInfo);
|
||||||
|
CTG_RET(code);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
int32_t ctgUpdateTbMetaEnqueue(SCatalog *pCtg, STableMetaOutput *output, bool syncOp) {
|
int32_t ctgUpdateTbMetaEnqueue(SCatalog *pCtg, STableMetaOutput *output, bool syncOp) {
|
||||||
int32_t code = 0;
|
int32_t code = 0;
|
||||||
SCtgCacheOperation *op = taosMemoryCalloc(1, sizeof(SCtgCacheOperation));
|
SCtgCacheOperation *op = taosMemoryCalloc(1, sizeof(SCtgCacheOperation));
|
||||||
|
@ -1426,15 +1508,15 @@ int32_t ctgAddNewDBCache(SCatalog *pCtg, const char *dbFName, uint64_t dbId) {
|
||||||
|
|
||||||
CTG_CACHE_NUM_INC(CTG_CI_DB, 1);
|
CTG_CACHE_NUM_INC(CTG_CI_DB, 1);
|
||||||
|
|
||||||
SDbVgVersion vgVersion = {.dbId = newDBCache.dbId, .vgVersion = -1, .stateTs = 0};
|
SDbCacheInfo dbCacheInfo = {.dbId = newDBCache.dbId, .vgVersion = -1, .stateTs = 0, .cfgVersion = -1};
|
||||||
tstrncpy(vgVersion.dbFName, dbFName, sizeof(vgVersion.dbFName));
|
tstrncpy(dbCacheInfo.dbFName, dbFName, sizeof(dbCacheInfo.dbFName));
|
||||||
|
|
||||||
ctgDebug("db added to cache, dbFName:%s, dbId:0x%" PRIx64, dbFName, dbId);
|
ctgDebug("db added to cache, dbFName:%s, dbId:0x%" PRIx64, dbFName, dbId);
|
||||||
|
|
||||||
if (!IS_SYS_DBNAME(dbFName)) {
|
if (!IS_SYS_DBNAME(dbFName)) {
|
||||||
CTG_ERR_RET(ctgMetaRentAdd(&pCtg->dbRent, &vgVersion, dbId, sizeof(SDbVgVersion)));
|
CTG_ERR_RET(ctgMetaRentAdd(&pCtg->dbRent, &dbCacheInfo, dbId, sizeof(SDbCacheInfo)));
|
||||||
|
|
||||||
ctgDebug("db added to rent, dbFName:%s, vgVersion:%d, dbId:0x%" PRIx64, dbFName, vgVersion.vgVersion, dbId);
|
ctgDebug("db added to rent, dbFName:%s, vgVersion:%d, dbId:0x%" PRIx64, dbFName, dbCacheInfo.vgVersion, dbId);
|
||||||
}
|
}
|
||||||
|
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
|
@ -1478,7 +1560,7 @@ int32_t ctgRemoveDBFromCache(SCatalog *pCtg, SCtgDBCache *dbCache, const char *d
|
||||||
|
|
||||||
CTG_UNLOCK(CTG_WRITE, &dbCache->dbLock);
|
CTG_UNLOCK(CTG_WRITE, &dbCache->dbLock);
|
||||||
|
|
||||||
CTG_ERR_RET(ctgMetaRentRemove(&pCtg->dbRent, dbId, ctgDbVgVersionSortCompare, ctgDbVgVersionSearchCompare));
|
CTG_ERR_RET(ctgMetaRentRemove(&pCtg->dbRent, dbId, ctgDbCacheInfoSortCompare, ctgDbCacheInfoSearchCompare));
|
||||||
ctgDebug("db removed from rent, dbFName:%s, dbId:0x%" PRIx64, dbFName, dbId);
|
ctgDebug("db removed from rent, dbFName:%s, dbId:0x%" PRIx64, dbFName, dbId);
|
||||||
|
|
||||||
if (taosHashRemove(pCtg->dbCache, dbFName, strlen(dbFName))) {
|
if (taosHashRemove(pCtg->dbCache, dbFName, strlen(dbFName))) {
|
||||||
|
@ -1791,8 +1873,8 @@ int32_t ctgOpUpdateVgroup(SCtgCacheOperation *operation) {
|
||||||
}
|
}
|
||||||
|
|
||||||
bool newAdded = false;
|
bool newAdded = false;
|
||||||
SDbVgVersion vgVersion = {
|
SDbCacheInfo dbCacheInfo = {
|
||||||
.dbId = msg->dbId, .vgVersion = dbInfo->vgVersion, .numOfTable = dbInfo->numOfTable, .stateTs = dbInfo->stateTs};
|
.dbId = msg->dbId, .vgVersion = dbInfo->vgVersion, .cfgVersion = -1, .numOfTable = dbInfo->numOfTable, .stateTs = dbInfo->stateTs};
|
||||||
|
|
||||||
SCtgDBCache *dbCache = NULL;
|
SCtgDBCache *dbCache = NULL;
|
||||||
CTG_ERR_JRET(ctgGetAddDBCache(msg->pCtg, dbFName, msg->dbId, &dbCache));
|
CTG_ERR_JRET(ctgGetAddDBCache(msg->pCtg, dbFName, msg->dbId, &dbCache));
|
||||||
|
@ -1834,12 +1916,16 @@ int32_t ctgOpUpdateVgroup(SCtgCacheOperation *operation) {
|
||||||
CTG_DB_NUM_RESET(CTG_CI_DB_VGROUP);
|
CTG_DB_NUM_RESET(CTG_CI_DB_VGROUP);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (dbCache->cfgCache.cfgInfo) {
|
||||||
|
dbCacheInfo.cfgVersion = dbCache->cfgCache.cfgInfo->cfgVersion;
|
||||||
|
}
|
||||||
|
|
||||||
vgCache->vgInfo = dbInfo;
|
vgCache->vgInfo = dbInfo;
|
||||||
msg->dbInfo = NULL;
|
msg->dbInfo = NULL;
|
||||||
CTG_DB_NUM_SET(CTG_CI_DB_VGROUP);
|
CTG_DB_NUM_SET(CTG_CI_DB_VGROUP);
|
||||||
|
|
||||||
ctgDebug("db vgInfo updated, dbFName:%s, vgVer:%d, stateTs:%" PRId64 ", dbId:0x%" PRIx64, dbFName,
|
ctgDebug("db vgInfo updated, dbFName:%s, vgVer:%d, stateTs:%" PRId64 ", dbId:0x%" PRIx64, dbFName,
|
||||||
vgVersion.vgVersion, vgVersion.stateTs, vgVersion.dbId);
|
dbCacheInfo.vgVersion, dbCacheInfo.stateTs, dbCacheInfo.dbId);
|
||||||
|
|
||||||
ctgWUnlockVgInfo(dbCache);
|
ctgWUnlockVgInfo(dbCache);
|
||||||
|
|
||||||
|
@ -1850,9 +1936,9 @@ int32_t ctgOpUpdateVgroup(SCtgCacheOperation *operation) {
|
||||||
dbCache = NULL;
|
dbCache = NULL;
|
||||||
|
|
||||||
// if (!IS_SYS_DBNAME(dbFName)) {
|
// if (!IS_SYS_DBNAME(dbFName)) {
|
||||||
tstrncpy(vgVersion.dbFName, dbFName, sizeof(vgVersion.dbFName));
|
tstrncpy(dbCacheInfo.dbFName, dbFName, sizeof(dbCacheInfo.dbFName));
|
||||||
CTG_ERR_JRET(ctgMetaRentUpdate(&msg->pCtg->dbRent, &vgVersion, vgVersion.dbId, sizeof(SDbVgVersion),
|
CTG_ERR_JRET(ctgMetaRentUpdate(&msg->pCtg->dbRent, &dbCacheInfo, dbCacheInfo.dbId, sizeof(SDbCacheInfo),
|
||||||
ctgDbVgVersionSortCompare, ctgDbVgVersionSearchCompare));
|
ctgDbCacheInfoSortCompare, ctgDbCacheInfoSearchCompare));
|
||||||
//}
|
//}
|
||||||
|
|
||||||
_return:
|
_return:
|
||||||
|
@ -1863,6 +1949,67 @@ _return:
|
||||||
CTG_RET(code);
|
CTG_RET(code);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int32_t ctgOpUpdateDbCfg(SCtgCacheOperation *operation) {
|
||||||
|
int32_t code = 0;
|
||||||
|
SCtgUpdateDbCfgMsg *msg = operation->data;
|
||||||
|
SDbCfgInfo *cfgInfo = msg->cfgInfo;
|
||||||
|
char *dbFName = msg->dbFName;
|
||||||
|
SCatalog *pCtg = msg->pCtg;
|
||||||
|
|
||||||
|
if (pCtg->stopUpdate || NULL == cfgInfo) {
|
||||||
|
goto _return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (cfgInfo->cfgVersion < 0) {
|
||||||
|
ctgDebug("invalid db cfgInfo, dbFName:%s, cfgVersion:%d", dbFName, cfgInfo->cfgVersion);
|
||||||
|
CTG_ERR_JRET(TSDB_CODE_APP_ERROR);
|
||||||
|
}
|
||||||
|
|
||||||
|
SCtgDBCache *dbCache = NULL;
|
||||||
|
CTG_ERR_JRET(ctgGetAddDBCache(msg->pCtg, dbFName, msg->dbId, &dbCache));
|
||||||
|
if (NULL == dbCache) {
|
||||||
|
ctgInfo("conflict db update, ignore this update, dbFName:%s, dbId:0x%" PRIx64, dbFName, msg->dbId);
|
||||||
|
CTG_ERR_JRET(TSDB_CODE_CTG_INTERNAL_ERROR);
|
||||||
|
}
|
||||||
|
|
||||||
|
SDbCacheInfo cacheInfo = {0};
|
||||||
|
cacheInfo.dbId = dbCache->dbId;
|
||||||
|
tstrncpy(cacheInfo.dbFName, dbFName, sizeof(cacheInfo.dbFName));
|
||||||
|
cacheInfo.cfgVersion = cfgInfo->cfgVersion;
|
||||||
|
|
||||||
|
SCtgVgCache *vgCache = &dbCache->vgCache;
|
||||||
|
if (vgCache->vgInfo) {
|
||||||
|
cacheInfo.vgVersion = vgCache->vgInfo->vgVersion;
|
||||||
|
cacheInfo.numOfTable = vgCache->vgInfo->numOfTable;
|
||||||
|
cacheInfo.stateTs = vgCache->vgInfo->stateTs;
|
||||||
|
} else {
|
||||||
|
cacheInfo.vgVersion = -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
ctgWLockDbCfgInfo(dbCache);
|
||||||
|
|
||||||
|
freeDbCfgInfo(dbCache->cfgCache.cfgInfo);
|
||||||
|
dbCache->cfgCache.cfgInfo = cfgInfo;
|
||||||
|
cfgInfo = NULL;
|
||||||
|
|
||||||
|
ctgWUnlockDbCfgInfo(dbCache);
|
||||||
|
|
||||||
|
ctgDebug("db cfgInfo updated, dbFName:%s, cfgVer:%d", dbFName, dbCache->cfgCache.cfgInfo->cfgVersion);
|
||||||
|
|
||||||
|
// if (!IS_SYS_DBNAME(dbFName)) {
|
||||||
|
CTG_ERR_JRET(ctgMetaRentUpdate(&msg->pCtg->dbRent, &cacheInfo, cacheInfo.dbId, sizeof(SDbCacheInfo),
|
||||||
|
ctgDbCacheInfoSortCompare, ctgDbCacheInfoSearchCompare));
|
||||||
|
//}
|
||||||
|
|
||||||
|
_return:
|
||||||
|
|
||||||
|
freeDbCfgInfo(cfgInfo);
|
||||||
|
taosMemoryFreeClear(msg);
|
||||||
|
|
||||||
|
CTG_RET(code);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
int32_t ctgOpDropDbCache(SCtgCacheOperation *operation) {
|
int32_t ctgOpDropDbCache(SCtgCacheOperation *operation) {
|
||||||
int32_t code = 0;
|
int32_t code = 0;
|
||||||
SCtgDropDBMsg *msg = operation->data;
|
SCtgDropDBMsg *msg = operation->data;
|
||||||
|
@ -2124,27 +2271,19 @@ int32_t ctgOpUpdateUser(SCtgCacheOperation *operation) {
|
||||||
CTG_LOCK(CTG_WRITE, &pUser->lock);
|
CTG_LOCK(CTG_WRITE, &pUser->lock);
|
||||||
|
|
||||||
taosHashCleanup(pUser->userAuth.createdDbs);
|
taosHashCleanup(pUser->userAuth.createdDbs);
|
||||||
pUser->userAuth.createdDbs = msg->userAuth.createdDbs;
|
|
||||||
msg->userAuth.createdDbs = NULL;
|
|
||||||
|
|
||||||
taosHashCleanup(pUser->userAuth.readDbs);
|
taosHashCleanup(pUser->userAuth.readDbs);
|
||||||
pUser->userAuth.readDbs = msg->userAuth.readDbs;
|
|
||||||
msg->userAuth.readDbs = NULL;
|
|
||||||
|
|
||||||
taosHashCleanup(pUser->userAuth.writeDbs);
|
taosHashCleanup(pUser->userAuth.writeDbs);
|
||||||
pUser->userAuth.writeDbs = msg->userAuth.writeDbs;
|
|
||||||
msg->userAuth.writeDbs = NULL;
|
|
||||||
|
|
||||||
taosHashCleanup(pUser->userAuth.readTbs);
|
taosHashCleanup(pUser->userAuth.readTbs);
|
||||||
pUser->userAuth.readTbs = msg->userAuth.readTbs;
|
|
||||||
msg->userAuth.readTbs = NULL;
|
|
||||||
|
|
||||||
taosHashCleanup(pUser->userAuth.writeTbs);
|
taosHashCleanup(pUser->userAuth.writeTbs);
|
||||||
pUser->userAuth.writeTbs = msg->userAuth.writeTbs;
|
|
||||||
msg->userAuth.writeTbs = NULL;
|
|
||||||
|
|
||||||
taosHashCleanup(pUser->userAuth.useDbs);
|
taosHashCleanup(pUser->userAuth.useDbs);
|
||||||
pUser->userAuth.useDbs = msg->userAuth.useDbs;
|
|
||||||
|
memcpy(&pUser->userAuth, &msg->userAuth, sizeof(msg->userAuth));
|
||||||
|
|
||||||
|
msg->userAuth.createdDbs = NULL;
|
||||||
|
msg->userAuth.readDbs = NULL;
|
||||||
|
msg->userAuth.writeDbs = NULL;
|
||||||
|
msg->userAuth.readTbs = NULL;
|
||||||
|
msg->userAuth.writeTbs = NULL;
|
||||||
msg->userAuth.useDbs = NULL;
|
msg->userAuth.useDbs = NULL;
|
||||||
|
|
||||||
CTG_UNLOCK(CTG_WRITE, &pUser->lock);
|
CTG_UNLOCK(CTG_WRITE, &pUser->lock);
|
||||||
|
|
|
@ -501,6 +501,25 @@ void ctgdShowDBCache(SCatalog *pCtg, SHashObj *dbHash) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (dbCache->cfgCache.cfgInfo) {
|
||||||
|
SDbCfgInfo *pCfg = dbCache->cfgCache.cfgInfo;
|
||||||
|
ctgDebug("[%d] db [%.*s][0x%" PRIx64
|
||||||
|
"] %s: cfgVersion:%d, numOfVgroups:%d, numOfStables:%d, buffer:%d, cacheSize:%d, pageSize:%d, pages:%d"
|
||||||
|
", daysPerFile:%d, daysToKeep0:%d, daysToKeep1:%d, daysToKeep2:%d, minRows:%d, maxRows:%d, walFsyncPeriod:%d"
|
||||||
|
", hashPrefix:%d, hashSuffix:%d, walLevel:%d, precision:%d, compression:%d, replications:%d, strict:%d"
|
||||||
|
", cacheLast:%d, tsdbPageSize:%d, walRetentionPeriod:%d, walRollPeriod:%d, walRetentionSize:%" PRId64 ""
|
||||||
|
", walSegmentSize:%" PRId64 ", numOfRetensions:%d, schemaless:%d, sstTrigger:%d",
|
||||||
|
i, (int32_t)len, dbFName, dbCache->dbId, dbCache->deleted ? "deleted" : "",
|
||||||
|
pCfg->cfgVersion, pCfg->numOfVgroups, pCfg->numOfStables, pCfg->buffer,
|
||||||
|
pCfg->cacheSize, pCfg->pageSize, pCfg->pages, pCfg->daysPerFile, pCfg->daysToKeep0,
|
||||||
|
pCfg->daysToKeep1, pCfg->daysToKeep2, pCfg->minRows, pCfg->maxRows, pCfg->walFsyncPeriod,
|
||||||
|
pCfg->hashPrefix, pCfg->hashSuffix, pCfg->walLevel, pCfg->precision, pCfg->compression,
|
||||||
|
pCfg->replications, pCfg->strict, pCfg->cacheLast, pCfg->tsdbPageSize, pCfg->walRetentionPeriod,
|
||||||
|
pCfg->walRollPeriod, pCfg->walRetentionSize, pCfg->walSegmentSize, pCfg->numOfRetensions,
|
||||||
|
pCfg->schemaless, pCfg->sstTrigger);
|
||||||
|
}
|
||||||
|
|
||||||
|
++i;
|
||||||
pIter = taosHashIterate(dbHash, pIter);
|
pIter = taosHashIterate(dbHash, pIter);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -251,6 +251,7 @@ void ctgFreeTbCache(SCtgDBCache* dbCache) {
|
||||||
}
|
}
|
||||||
|
|
||||||
void ctgFreeVgInfoCache(SCtgDBCache* dbCache) { freeVgInfo(dbCache->vgCache.vgInfo); }
|
void ctgFreeVgInfoCache(SCtgDBCache* dbCache) { freeVgInfo(dbCache->vgCache.vgInfo); }
|
||||||
|
void ctgFreeCfgInfoCache(SCtgDBCache* dbCache) { freeDbCfgInfo(dbCache->cfgCache.cfgInfo); }
|
||||||
|
|
||||||
void ctgFreeDbCache(SCtgDBCache* dbCache) {
|
void ctgFreeDbCache(SCtgDBCache* dbCache) {
|
||||||
if (NULL == dbCache) {
|
if (NULL == dbCache) {
|
||||||
|
@ -258,6 +259,7 @@ void ctgFreeDbCache(SCtgDBCache* dbCache) {
|
||||||
}
|
}
|
||||||
|
|
||||||
ctgFreeVgInfoCache(dbCache);
|
ctgFreeVgInfoCache(dbCache);
|
||||||
|
ctgFreeCfgInfoCache(dbCache);
|
||||||
ctgFreeStbMetaCache(dbCache);
|
ctgFreeStbMetaCache(dbCache);
|
||||||
ctgFreeTbCache(dbCache);
|
ctgFreeTbCache(dbCache);
|
||||||
}
|
}
|
||||||
|
@ -1153,10 +1155,10 @@ int32_t ctgStbVersionSearchCompare(const void* key1, const void* key2) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t ctgDbVgVersionSearchCompare(const void* key1, const void* key2) {
|
int32_t ctgDbCacheInfoSearchCompare(const void* key1, const void* key2) {
|
||||||
if (*(int64_t*)key1 < ((SDbVgVersion*)key2)->dbId) {
|
if (*(int64_t*)key1 < ((SDbCacheInfo*)key2)->dbId) {
|
||||||
return -1;
|
return -1;
|
||||||
} else if (*(int64_t*)key1 > ((SDbVgVersion*)key2)->dbId) {
|
} else if (*(int64_t*)key1 > ((SDbCacheInfo*)key2)->dbId) {
|
||||||
return 1;
|
return 1;
|
||||||
} else {
|
} else {
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -1173,10 +1175,10 @@ int32_t ctgStbVersionSortCompare(const void* key1, const void* key2) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t ctgDbVgVersionSortCompare(const void* key1, const void* key2) {
|
int32_t ctgDbCacheInfoSortCompare(const void* key1, const void* key2) {
|
||||||
if (((SDbVgVersion*)key1)->dbId < ((SDbVgVersion*)key2)->dbId) {
|
if (((SDbCacheInfo*)key1)->dbId < ((SDbCacheInfo*)key2)->dbId) {
|
||||||
return -1;
|
return -1;
|
||||||
} else if (((SDbVgVersion*)key1)->dbId > ((SDbVgVersion*)key2)->dbId) {
|
} else if (((SDbCacheInfo*)key1)->dbId > ((SDbCacheInfo*)key2)->dbId) {
|
||||||
return 1;
|
return 1;
|
||||||
} else {
|
} else {
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -1347,16 +1349,20 @@ static void* ctgCloneDbVgroup(void* pSrc) { return taosArrayDup((const SArray*)p
|
||||||
|
|
||||||
static void ctgFreeDbVgroup(void* p) { taosArrayDestroy((SArray*)((SMetaRes*)p)->pRes); }
|
static void ctgFreeDbVgroup(void* p) { taosArrayDestroy((SArray*)((SMetaRes*)p)->pRes); }
|
||||||
|
|
||||||
static void* ctgCloneDbCfgInfo(void* pSrc) {
|
void* ctgCloneDbCfgInfo(void* pSrc) {
|
||||||
SDbCfgInfo* pDst = taosMemoryMalloc(sizeof(SDbCfgInfo));
|
SDbCfgInfo* pDst = taosMemoryMalloc(sizeof(SDbCfgInfo));
|
||||||
if (NULL == pDst) {
|
if (NULL == pDst) {
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
memcpy(pDst, pSrc, sizeof(SDbCfgInfo));
|
memcpy(pDst, pSrc, sizeof(SDbCfgInfo));
|
||||||
|
pDst->pRetensions = taosArrayDup(((SDbCfgInfo *)pSrc)->pRetensions, NULL);
|
||||||
return pDst;
|
return pDst;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void ctgFreeDbCfgInfo(void* p) { taosMemoryFree(((SMetaRes*)p)->pRes); }
|
static void ctgFreeDbCfgInfo(void* p) {
|
||||||
|
SDbCfgInfo* pDst = (SDbCfgInfo *)((SMetaRes*)p)->pRes;
|
||||||
|
freeDbCfgInfo(pDst);
|
||||||
|
}
|
||||||
|
|
||||||
static void* ctgCloneDbInfo(void* pSrc) {
|
static void* ctgCloneDbInfo(void* pSrc) {
|
||||||
SDbInfo* pDst = taosMemoryMalloc(sizeof(SDbInfo));
|
SDbInfo* pDst = taosMemoryMalloc(sizeof(SDbInfo));
|
||||||
|
|
|
@ -1331,7 +1331,7 @@ TEST(tableMeta, normalTable) {
|
||||||
ASSERT_EQ(tableMeta->tableInfo.precision, 1);
|
ASSERT_EQ(tableMeta->tableInfo.precision, 1);
|
||||||
ASSERT_EQ(tableMeta->tableInfo.rowSize, 12);
|
ASSERT_EQ(tableMeta->tableInfo.rowSize, 12);
|
||||||
|
|
||||||
SDbVgVersion *dbs = NULL;
|
SDbCacheInfo *dbs = NULL;
|
||||||
SSTableVersion *stb = NULL;
|
SSTableVersion *stb = NULL;
|
||||||
uint32_t dbNum = 0, stbNum = 0, allDbNum = 0, allStbNum = 0;
|
uint32_t dbNum = 0, stbNum = 0, allDbNum = 0, allStbNum = 0;
|
||||||
int32_t i = 0;
|
int32_t i = 0;
|
||||||
|
@ -1443,7 +1443,7 @@ TEST(tableMeta, childTableCase) {
|
||||||
|
|
||||||
taosMemoryFree(tableMeta);
|
taosMemoryFree(tableMeta);
|
||||||
|
|
||||||
SDbVgVersion *dbs = NULL;
|
SDbCacheInfo *dbs = NULL;
|
||||||
SSTableVersion *stb = NULL;
|
SSTableVersion *stb = NULL;
|
||||||
uint32_t dbNum = 0, stbNum = 0, allDbNum = 0, allStbNum = 0;
|
uint32_t dbNum = 0, stbNum = 0, allDbNum = 0, allStbNum = 0;
|
||||||
int32_t i = 0;
|
int32_t i = 0;
|
||||||
|
@ -1584,7 +1584,7 @@ TEST(tableMeta, superTableCase) {
|
||||||
|
|
||||||
taosMemoryFree(tableMeta);
|
taosMemoryFree(tableMeta);
|
||||||
|
|
||||||
SDbVgVersion *dbs = NULL;
|
SDbCacheInfo *dbs = NULL;
|
||||||
SSTableVersion *stb = NULL;
|
SSTableVersion *stb = NULL;
|
||||||
uint32_t dbNum = 0, stbNum = 0, allDbNum = 0, allStbNum = 0;
|
uint32_t dbNum = 0, stbNum = 0, allDbNum = 0, allStbNum = 0;
|
||||||
int32_t i = 0;
|
int32_t i = 0;
|
||||||
|
@ -2682,7 +2682,7 @@ TEST(rentTest, allRent) {
|
||||||
SDBVgInfo dbVgroup = {0};
|
SDBVgInfo dbVgroup = {0};
|
||||||
SArray *vgList = NULL;
|
SArray *vgList = NULL;
|
||||||
ctgTestStop = false;
|
ctgTestStop = false;
|
||||||
SDbVgVersion *dbs = NULL;
|
SDbCacheInfo *dbs = NULL;
|
||||||
SSTableVersion *stable = NULL;
|
SSTableVersion *stable = NULL;
|
||||||
uint32_t num = 0;
|
uint32_t num = 0;
|
||||||
|
|
||||||
|
|
|
@ -86,8 +86,25 @@ typedef struct SColMatchInfo {
|
||||||
int32_t matchType; // determinate the source according to col id or slot id
|
int32_t matchType; // determinate the source according to col id or slot id
|
||||||
} SColMatchInfo;
|
} SColMatchInfo;
|
||||||
|
|
||||||
typedef struct SExecTaskInfo SExecTaskInfo;
|
typedef struct SExecTaskInfo SExecTaskInfo;
|
||||||
typedef struct STableListInfo STableListInfo;
|
|
||||||
|
typedef struct STableListIdInfo {
|
||||||
|
uint64_t suid;
|
||||||
|
uint64_t uid;
|
||||||
|
int32_t tableType;
|
||||||
|
} STableListIdInfo;
|
||||||
|
|
||||||
|
// If the numOfOutputGroups is 1, the data blocks that belongs to different groups will be provided randomly
|
||||||
|
// The numOfOutputGroups is specified by physical plan. and will not be affect by numOfGroups
|
||||||
|
typedef struct STableListInfo {
|
||||||
|
bool oneTableForEachGroup;
|
||||||
|
int32_t numOfOuputGroups; // the data block will be generated one by one
|
||||||
|
int32_t* groupOffset; // keep the offset value for each group in the tableList
|
||||||
|
SArray* pTableList;
|
||||||
|
SHashObj* map; // speedup acquire the tableQueryInfo by table uid
|
||||||
|
STableListIdInfo idInfo; // this maybe the super table or ordinary table
|
||||||
|
} STableListInfo;
|
||||||
|
|
||||||
struct SqlFunctionCtx;
|
struct SqlFunctionCtx;
|
||||||
|
|
||||||
int32_t createScanTableListInfo(SScanPhysiNode* pScanNode, SNodeList* pGroupTags, bool groupSort, SReadHandle* pHandle,
|
int32_t createScanTableListInfo(SScanPhysiNode* pScanNode, SNodeList* pGroupTags, bool groupSort, SReadHandle* pHandle,
|
||||||
|
|
|
@ -213,6 +213,7 @@ typedef struct STableScanInfo {
|
||||||
SScanInfo scanInfo;
|
SScanInfo scanInfo;
|
||||||
int32_t scanTimes;
|
int32_t scanTimes;
|
||||||
SSDataBlock* pResBlock;
|
SSDataBlock* pResBlock;
|
||||||
|
SHashObj* pIgnoreTables;
|
||||||
SSampleExecInfo sample; // sample execution info
|
SSampleExecInfo sample; // sample execution info
|
||||||
int32_t currentGroupId;
|
int32_t currentGroupId;
|
||||||
int32_t currentTable;
|
int32_t currentTable;
|
||||||
|
|
|
@ -238,13 +238,17 @@ SSDataBlock* doScanCache(SOperatorInfo* pOperator) {
|
||||||
T_LONG_JMP(pTaskInfo->env, code);
|
T_LONG_JMP(pTaskInfo->env, code);
|
||||||
}
|
}
|
||||||
|
|
||||||
code = tsdbCacherowsReaderOpen(pInfo->readHandle.vnode, pInfo->retrieveType, pList, num,
|
if (NULL == pInfo->pLastrowReader) {
|
||||||
taosArrayGetSize(pInfo->matchInfo.pList), pInfo->pCidList, pInfo->pSlotIds, suid,
|
code = tsdbCacherowsReaderOpen(pInfo->readHandle.vnode, pInfo->retrieveType, pList, num,
|
||||||
&pInfo->pLastrowReader, pTaskInfo->id.str);
|
taosArrayGetSize(pInfo->matchInfo.pList), pInfo->pCidList, pInfo->pSlotIds, suid, &pInfo->pLastrowReader,
|
||||||
if (code != TSDB_CODE_SUCCESS) {
|
pTaskInfo->id.str);
|
||||||
pInfo->currentGroupIndex += 1;
|
if (code != TSDB_CODE_SUCCESS) {
|
||||||
taosArrayClear(pInfo->pUidList);
|
pInfo->currentGroupIndex += 1;
|
||||||
continue;
|
taosArrayClear(pInfo->pUidList);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
tsdbReuseCacherowsReader(pInfo->pLastrowReader, pList, num);
|
||||||
}
|
}
|
||||||
|
|
||||||
taosArrayClear(pInfo->pUidList);
|
taosArrayClear(pInfo->pUidList);
|
||||||
|
@ -276,13 +280,14 @@ SSDataBlock* doScanCache(SOperatorInfo* pOperator) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pInfo->pLastrowReader = tsdbCacherowsReaderClose(pInfo->pLastrowReader);
|
//pInfo->pLastrowReader = tsdbCacherowsReaderClose(pInfo->pLastrowReader);
|
||||||
return pInfo->pRes;
|
return pInfo->pRes;
|
||||||
} else {
|
} else {
|
||||||
pInfo->pLastrowReader = tsdbCacherowsReaderClose(pInfo->pLastrowReader);
|
//pInfo->pLastrowReader = tsdbCacherowsReaderClose(pInfo->pLastrowReader);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pInfo->pLastrowReader = tsdbCacherowsReaderClose(pInfo->pLastrowReader);
|
||||||
setOperatorCompleted(pOperator);
|
setOperatorCompleted(pOperator);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
|
@ -198,9 +198,6 @@ static int32_t getDataBlock(SDataSinkHandle* pHandle, SOutputData* pOutput) {
|
||||||
pOutput->numOfCols = pEntry->numOfCols;
|
pOutput->numOfCols = pEntry->numOfCols;
|
||||||
pOutput->compressed = pEntry->compressed;
|
pOutput->compressed = pEntry->compressed;
|
||||||
|
|
||||||
// ASSERT(pEntry->numOfRows == *(int32_t*)(pEntry->data + 8));
|
|
||||||
// ASSERT(pEntry->numOfCols == *(int32_t*)(pEntry->data + 8 + 4));
|
|
||||||
|
|
||||||
atomic_sub_fetch_64(&pDispatcher->cachedSize, pEntry->dataLen);
|
atomic_sub_fetch_64(&pDispatcher->cachedSize, pEntry->dataLen);
|
||||||
atomic_sub_fetch_64(&gDataSinkStat.cachedSize, pEntry->dataLen);
|
atomic_sub_fetch_64(&gDataSinkStat.cachedSize, pEntry->dataLen);
|
||||||
|
|
||||||
|
|
|
@ -28,23 +28,6 @@
|
||||||
#include "querytask.h"
|
#include "querytask.h"
|
||||||
#include "tcompression.h"
|
#include "tcompression.h"
|
||||||
|
|
||||||
typedef struct STableListIdInfo {
|
|
||||||
uint64_t suid;
|
|
||||||
uint64_t uid;
|
|
||||||
int32_t tableType;
|
|
||||||
} STableListIdInfo;
|
|
||||||
|
|
||||||
// If the numOfOutputGroups is 1, the data blocks that belongs to different groups will be provided randomly
|
|
||||||
// The numOfOutputGroups is specified by physical plan. and will not be affect by numOfGroups
|
|
||||||
struct STableListInfo {
|
|
||||||
bool oneTableForEachGroup;
|
|
||||||
int32_t numOfOuputGroups; // the data block will be generated one by one
|
|
||||||
int32_t* groupOffset; // keep the offset value for each group in the tableList
|
|
||||||
SArray* pTableList;
|
|
||||||
SHashObj* map; // speedup acquire the tableQueryInfo by table uid
|
|
||||||
STableListIdInfo idInfo; // this maybe the super table or ordinary table
|
|
||||||
};
|
|
||||||
|
|
||||||
typedef struct tagFilterAssist {
|
typedef struct tagFilterAssist {
|
||||||
SHashObj* colHash;
|
SHashObj* colHash;
|
||||||
int32_t index;
|
int32_t index;
|
||||||
|
@ -62,7 +45,7 @@ static int32_t optimizeTbnameInCond(void* metaHandle, int64_t suid, SArra
|
||||||
static int32_t optimizeTbnameInCondImpl(void* metaHandle, SArray* list, SNode* pTagCond);
|
static int32_t optimizeTbnameInCondImpl(void* metaHandle, SArray* list, SNode* pTagCond);
|
||||||
|
|
||||||
static int32_t getTableList(void* metaHandle, void* pVnode, SScanPhysiNode* pScanNode, SNode* pTagCond,
|
static int32_t getTableList(void* metaHandle, void* pVnode, SScanPhysiNode* pScanNode, SNode* pTagCond,
|
||||||
SNode* pTagIndexCond, STableListInfo* pListInfo, const char* idstr);
|
SNode* pTagIndexCond, STableListInfo* pListInfo, uint8_t* digest, const char* idstr);
|
||||||
static SSDataBlock* createTagValBlockForFilter(SArray* pColList, int32_t numOfTables, SArray* pUidTagList,
|
static SSDataBlock* createTagValBlockForFilter(SArray* pColList, int32_t numOfTables, SArray* pUidTagList,
|
||||||
void* metaHandle);
|
void* metaHandle);
|
||||||
|
|
||||||
|
@ -436,12 +419,49 @@ void freeItem(void* p) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t getColInfoResultForGroupby(void* metaHandle, SNodeList* group, STableListInfo* pTableListInfo) {
|
static void genTagFilterDigest(const SNode* pTagCond, T_MD5_CTX* pContext) {
|
||||||
|
if (pTagCond == NULL) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
char* payload = NULL;
|
||||||
|
int32_t len = 0;
|
||||||
|
nodesNodeToMsg(pTagCond, &payload, &len);
|
||||||
|
|
||||||
|
tMD5Init(pContext);
|
||||||
|
tMD5Update(pContext, (uint8_t*)payload, (uint32_t)len);
|
||||||
|
tMD5Final(pContext);
|
||||||
|
|
||||||
|
taosMemoryFree(payload);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static void genTbGroupDigest(const SNode* pGroup, uint8_t* filterDigest, T_MD5_CTX* pContext) {
|
||||||
|
char* payload = NULL;
|
||||||
|
int32_t len = 0;
|
||||||
|
nodesNodeToMsg(pGroup, &payload, &len);
|
||||||
|
if (filterDigest[0]) {
|
||||||
|
payload = taosMemoryRealloc(payload, len + tListLen(pContext->digest));
|
||||||
|
memcpy(payload + len, filterDigest + 1, tListLen(pContext->digest));
|
||||||
|
len += tListLen(pContext->digest);
|
||||||
|
}
|
||||||
|
|
||||||
|
tMD5Init(pContext);
|
||||||
|
tMD5Update(pContext, (uint8_t*)payload, (uint32_t)len);
|
||||||
|
tMD5Final(pContext);
|
||||||
|
|
||||||
|
taosMemoryFree(payload);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int32_t getColInfoResultForGroupby(void* metaHandle, SNodeList* group, STableListInfo* pTableListInfo, uint8_t *digest) {
|
||||||
int32_t code = TSDB_CODE_SUCCESS;
|
int32_t code = TSDB_CODE_SUCCESS;
|
||||||
SArray* pBlockList = NULL;
|
SArray* pBlockList = NULL;
|
||||||
SSDataBlock* pResBlock = NULL;
|
SSDataBlock* pResBlock = NULL;
|
||||||
void* keyBuf = NULL;
|
void* keyBuf = NULL;
|
||||||
SArray* groupData = NULL;
|
SArray* groupData = NULL;
|
||||||
|
SArray* pUidTagList = NULL;
|
||||||
|
SArray* tableList = NULL;
|
||||||
|
|
||||||
int32_t rows = taosArrayGetSize(pTableListInfo->pTableList);
|
int32_t rows = taosArrayGetSize(pTableListInfo->pTableList);
|
||||||
if (rows == 0) {
|
if (rows == 0) {
|
||||||
|
@ -468,7 +488,23 @@ int32_t getColInfoResultForGroupby(void* metaHandle, SNodeList* group, STableLis
|
||||||
REPLACE_NODE(pNode);
|
REPLACE_NODE(pNode);
|
||||||
}
|
}
|
||||||
|
|
||||||
SArray* pUidTagList = taosArrayInit(8, sizeof(STUidTagInfo));
|
T_MD5_CTX context = {0};
|
||||||
|
if (tsTagFilterCache) {
|
||||||
|
SNodeListNode* listNode = (SNodeListNode*)nodesMakeNode(QUERY_NODE_NODE_LIST);
|
||||||
|
listNode->pNodeList = group;
|
||||||
|
genTbGroupDigest((SNode *)listNode, digest, &context);
|
||||||
|
nodesFree(listNode);
|
||||||
|
|
||||||
|
metaGetCachedTbGroup(metaHandle, pTableListInfo->idInfo.suid, context.digest, tListLen(context.digest), &tableList);
|
||||||
|
if (tableList) {
|
||||||
|
taosArrayDestroy(pTableListInfo->pTableList);
|
||||||
|
pTableListInfo->pTableList = tableList;
|
||||||
|
qDebug("retrieve tb group list from cache, numOfTables:%d", (int32_t)taosArrayGetSize(pTableListInfo->pTableList));
|
||||||
|
goto end;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pUidTagList = taosArrayInit(8, sizeof(STUidTagInfo));
|
||||||
for (int32_t i = 0; i < rows; ++i) {
|
for (int32_t i = 0; i < rows; ++i) {
|
||||||
STableKeyInfo* pkeyInfo = taosArrayGet(pTableListInfo->pTableList, i);
|
STableKeyInfo* pkeyInfo = taosArrayGet(pTableListInfo->pTableList, i);
|
||||||
STUidTagInfo info = {.uid = pkeyInfo->uid};
|
STUidTagInfo info = {.uid = pkeyInfo->uid};
|
||||||
|
@ -594,6 +630,11 @@ int32_t getColInfoResultForGroupby(void* metaHandle, SNodeList* group, STableLis
|
||||||
info->groupId = calcGroupId(keyBuf, len);
|
info->groupId = calcGroupId(keyBuf, len);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (tsTagFilterCache) {
|
||||||
|
tableList = taosArrayDup(pTableListInfo->pTableList, NULL);
|
||||||
|
metaPutTbGroupToCache(metaHandle, pTableListInfo->idInfo.suid, context.digest, tListLen(context.digest), tableList, taosArrayGetSize(tableList) * sizeof(STableKeyInfo));
|
||||||
|
}
|
||||||
|
|
||||||
// int64_t st2 = taosGetTimestampUs();
|
// int64_t st2 = taosGetTimestampUs();
|
||||||
// qDebug("calculate tag block rows:%d, cost:%ld us", rows, st2-st1);
|
// qDebug("calculate tag block rows:%d, cost:%ld us", rows, st2-st1);
|
||||||
|
|
||||||
|
@ -798,21 +839,6 @@ static int32_t optimizeTbnameInCondImpl(void* metaHandle, SArray* pExistedUidLis
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void genTagFilterDigest(const SNode* pTagCond, T_MD5_CTX* pContext) {
|
|
||||||
if (pTagCond == NULL) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
char* payload = NULL;
|
|
||||||
int32_t len = 0;
|
|
||||||
nodesNodeToMsg(pTagCond, &payload, &len);
|
|
||||||
|
|
||||||
tMD5Init(pContext);
|
|
||||||
tMD5Update(pContext, (uint8_t*)payload, (uint32_t)len);
|
|
||||||
tMD5Final(pContext);
|
|
||||||
|
|
||||||
taosMemoryFree(payload);
|
|
||||||
}
|
|
||||||
|
|
||||||
static SSDataBlock* createTagValBlockForFilter(SArray* pColList, int32_t numOfTables, SArray* pUidTagList,
|
static SSDataBlock* createTagValBlockForFilter(SArray* pColList, int32_t numOfTables, SArray* pUidTagList,
|
||||||
void* metaHandle) {
|
void* metaHandle) {
|
||||||
|
@ -1027,7 +1053,7 @@ end:
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t getTableList(void* metaHandle, void* pVnode, SScanPhysiNode* pScanNode, SNode* pTagCond, SNode* pTagIndexCond,
|
int32_t getTableList(void* metaHandle, void* pVnode, SScanPhysiNode* pScanNode, SNode* pTagCond, SNode* pTagIndexCond,
|
||||||
STableListInfo* pListInfo, const char* idstr) {
|
STableListInfo* pListInfo, uint8_t* digest, const char* idstr) {
|
||||||
int32_t code = TSDB_CODE_SUCCESS;
|
int32_t code = TSDB_CODE_SUCCESS;
|
||||||
size_t numOfTables = 0;
|
size_t numOfTables = 0;
|
||||||
|
|
||||||
|
@ -1057,6 +1083,8 @@ int32_t getTableList(void* metaHandle, void* pVnode, SScanPhysiNode* pScanNode,
|
||||||
metaGetCachedTableUidList(metaHandle, pScanNode->suid, context.digest, tListLen(context.digest), pUidList,
|
metaGetCachedTableUidList(metaHandle, pScanNode->suid, context.digest, tListLen(context.digest), pUidList,
|
||||||
&acquired);
|
&acquired);
|
||||||
if (acquired) {
|
if (acquired) {
|
||||||
|
digest[0] = 1;
|
||||||
|
memcpy(digest + 1, context.digest, tListLen(context.digest));
|
||||||
qDebug("retrieve table uid list from cache, numOfTables:%d", (int32_t)taosArrayGetSize(pUidList));
|
qDebug("retrieve table uid list from cache, numOfTables:%d", (int32_t)taosArrayGetSize(pUidList));
|
||||||
goto _end;
|
goto _end;
|
||||||
}
|
}
|
||||||
|
@ -1100,6 +1128,8 @@ int32_t getTableList(void* metaHandle, void* pVnode, SScanPhysiNode* pScanNode,
|
||||||
}
|
}
|
||||||
|
|
||||||
metaUidFilterCachePut(metaHandle, pScanNode->suid, context.digest, tListLen(context.digest), pPayload, size, 1);
|
metaUidFilterCachePut(metaHandle, pScanNode->suid, context.digest, tListLen(context.digest), pPayload, size, 1);
|
||||||
|
digest[0] = 1;
|
||||||
|
memcpy(digest + 1, context.digest, tListLen(context.digest));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2003,8 +2033,8 @@ static int32_t sortTableGroup(STableListInfo* pTableListInfo) {
|
||||||
return TDB_CODE_SUCCESS;
|
return TDB_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t buildGroupIdMapForAllTables(STableListInfo* pTableListInfo, SReadHandle* pHandle, SNodeList* group,
|
int32_t buildGroupIdMapForAllTables(STableListInfo* pTableListInfo, SReadHandle* pHandle, SScanPhysiNode* pScanNode, SNodeList* group,
|
||||||
bool groupSort) {
|
bool groupSort, uint8_t *digest) {
|
||||||
int32_t code = TSDB_CODE_SUCCESS;
|
int32_t code = TSDB_CODE_SUCCESS;
|
||||||
|
|
||||||
bool groupByTbname = groupbyTbname(group);
|
bool groupByTbname = groupbyTbname(group);
|
||||||
|
@ -2024,7 +2054,7 @@ int32_t buildGroupIdMapForAllTables(STableListInfo* pTableListInfo, SReadHandle*
|
||||||
pTableListInfo->numOfOuputGroups = 1;
|
pTableListInfo->numOfOuputGroups = 1;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
code = getColInfoResultForGroupby(pHandle->meta, group, pTableListInfo);
|
code = getColInfoResultForGroupby(pHandle->meta, group, pTableListInfo, digest);
|
||||||
if (code != TSDB_CODE_SUCCESS) {
|
if (code != TSDB_CODE_SUCCESS) {
|
||||||
return code;
|
return code;
|
||||||
}
|
}
|
||||||
|
@ -2055,7 +2085,8 @@ int32_t createScanTableListInfo(SScanPhysiNode* pScanNode, SNodeList* pGroupTags
|
||||||
return TSDB_CODE_INVALID_PARA;
|
return TSDB_CODE_INVALID_PARA;
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t code = getTableList(pHandle->meta, pHandle->vnode, pScanNode, pTagCond, pTagIndexCond, pTableListInfo, idStr);
|
uint8_t digest[17] = {0};
|
||||||
|
int32_t code = getTableList(pHandle->meta, pHandle->vnode, pScanNode, pTagCond, pTagIndexCond, pTableListInfo, digest, idStr);
|
||||||
if (code != TSDB_CODE_SUCCESS) {
|
if (code != TSDB_CODE_SUCCESS) {
|
||||||
qError("failed to getTableList, code: %s", tstrerror(code));
|
qError("failed to getTableList, code: %s", tstrerror(code));
|
||||||
return code;
|
return code;
|
||||||
|
@ -2073,7 +2104,7 @@ int32_t createScanTableListInfo(SScanPhysiNode* pScanNode, SNodeList* pGroupTags
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
code = buildGroupIdMapForAllTables(pTableListInfo, pHandle, pGroupTags, groupSort);
|
code = buildGroupIdMapForAllTables(pTableListInfo, pHandle, pScanNode, pGroupTags, groupSort, digest);
|
||||||
if (code != TSDB_CODE_SUCCESS) {
|
if (code != TSDB_CODE_SUCCESS) {
|
||||||
return code;
|
return code;
|
||||||
}
|
}
|
||||||
|
|
|
@ -1060,7 +1060,10 @@ void qStreamSetOpen(qTaskInfo_t tinfo) {
|
||||||
|
|
||||||
void verifyOffset(void *pWalReader, STqOffsetVal* pOffset){
|
void verifyOffset(void *pWalReader, STqOffsetVal* pOffset){
|
||||||
// if offset version is small than first version , let's seek to first version
|
// if offset version is small than first version , let's seek to first version
|
||||||
|
taosThreadMutexLock(&((SWalReader*)pWalReader)->pWal->mutex);
|
||||||
int64_t firstVer = walGetFirstVer(((SWalReader*)pWalReader)->pWal);
|
int64_t firstVer = walGetFirstVer(((SWalReader*)pWalReader)->pWal);
|
||||||
|
taosThreadMutexUnlock(&((SWalReader*)pWalReader)->pWal->mutex);
|
||||||
|
|
||||||
if (pOffset->version + 1 < firstVer){
|
if (pOffset->version + 1 < firstVer){
|
||||||
pOffset->version = firstVer - 1;
|
pOffset->version = firstVer - 1;
|
||||||
}
|
}
|
||||||
|
@ -1150,7 +1153,7 @@ int32_t qStreamPrepareScan(qTaskInfo_t tinfo, STqOffsetVal* pOffset, int8_t subT
|
||||||
|
|
||||||
if (pScanBaseInfo->dataReader == NULL) {
|
if (pScanBaseInfo->dataReader == NULL) {
|
||||||
int32_t code = tsdbReaderOpen(pScanBaseInfo->readHandle.vnode, &pScanBaseInfo->cond, &keyInfo, 1,
|
int32_t code = tsdbReaderOpen(pScanBaseInfo->readHandle.vnode, &pScanBaseInfo->cond, &keyInfo, 1,
|
||||||
pScanInfo->pResBlock, &pScanBaseInfo->dataReader, id, false);
|
pScanInfo->pResBlock, &pScanBaseInfo->dataReader, id, false, NULL);
|
||||||
if (code != TSDB_CODE_SUCCESS) {
|
if (code != TSDB_CODE_SUCCESS) {
|
||||||
qError("prepare read tsdb snapshot failed, uid:%" PRId64 ", code:%s %s", pOffset->uid, tstrerror(code), id);
|
qError("prepare read tsdb snapshot failed, uid:%" PRId64 ", code:%s %s", pOffset->uid, tstrerror(code), id);
|
||||||
terrno = code;
|
terrno = code;
|
||||||
|
@ -1209,7 +1212,7 @@ int32_t qStreamPrepareScan(qTaskInfo_t tinfo, STqOffsetVal* pOffset, int8_t subT
|
||||||
int32_t size = tableListGetSize(pTableListInfo);
|
int32_t size = tableListGetSize(pTableListInfo);
|
||||||
|
|
||||||
tsdbReaderOpen(pInfo->vnode, &pTaskInfo->streamInfo.tableCond, pList, size, NULL, &pInfo->dataReader, NULL,
|
tsdbReaderOpen(pInfo->vnode, &pTaskInfo->streamInfo.tableCond, pList, size, NULL, &pInfo->dataReader, NULL,
|
||||||
false);
|
false, NULL);
|
||||||
|
|
||||||
cleanupQueryTableDataCond(&pTaskInfo->streamInfo.tableCond);
|
cleanupQueryTableDataCond(&pTaskInfo->streamInfo.tableCond);
|
||||||
strcpy(pTaskInfo->streamInfo.tbName, mtInfo.tbName);
|
strcpy(pTaskInfo->streamInfo.tbName, mtInfo.tbName);
|
||||||
|
|
|
@ -82,7 +82,7 @@ static void extractQualifiedTupleByFilterResult(SSDataBlock* pBlock, const SC
|
||||||
static int32_t doSetInputDataBlock(SExprSupp* pExprSup, SSDataBlock* pBlock, int32_t order, int32_t scanFlag,
|
static int32_t doSetInputDataBlock(SExprSupp* pExprSup, SSDataBlock* pBlock, int32_t order, int32_t scanFlag,
|
||||||
bool createDummyCol);
|
bool createDummyCol);
|
||||||
static int32_t doCopyToSDataBlock(SExecTaskInfo* pTaskInfo, SSDataBlock* pBlock, SExprSupp* pSup, SDiskbasedBuf* pBuf,
|
static int32_t doCopyToSDataBlock(SExecTaskInfo* pTaskInfo, SSDataBlock* pBlock, SExprSupp* pSup, SDiskbasedBuf* pBuf,
|
||||||
SGroupResInfo* pGroupResInfo, int32_t threshold);
|
SGroupResInfo* pGroupResInfo, int32_t threshold, bool ignoreGroup);
|
||||||
|
|
||||||
SResultRow* getNewResultRow(SDiskbasedBuf* pResultBuf, int32_t* currentPageId, int32_t interBufSize) {
|
SResultRow* getNewResultRow(SDiskbasedBuf* pResultBuf, int32_t* currentPageId, int32_t interBufSize) {
|
||||||
SFilePage* pData = NULL;
|
SFilePage* pData = NULL;
|
||||||
|
@ -777,7 +777,7 @@ int32_t finalizeResultRows(SDiskbasedBuf* pBuf, SResultRowPosition* resultRowPos
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t doCopyToSDataBlock(SExecTaskInfo* pTaskInfo, SSDataBlock* pBlock, SExprSupp* pSup, SDiskbasedBuf* pBuf,
|
int32_t doCopyToSDataBlock(SExecTaskInfo* pTaskInfo, SSDataBlock* pBlock, SExprSupp* pSup, SDiskbasedBuf* pBuf,
|
||||||
SGroupResInfo* pGroupResInfo, int32_t threshold) {
|
SGroupResInfo* pGroupResInfo, int32_t threshold, bool ignoreGroup) {
|
||||||
SExprInfo* pExprInfo = pSup->pExprInfo;
|
SExprInfo* pExprInfo = pSup->pExprInfo;
|
||||||
int32_t numOfExprs = pSup->numOfExprs;
|
int32_t numOfExprs = pSup->numOfExprs;
|
||||||
int32_t* rowEntryOffset = pSup->rowEntryInfoOffset;
|
int32_t* rowEntryOffset = pSup->rowEntryInfoOffset;
|
||||||
|
@ -804,20 +804,23 @@ int32_t doCopyToSDataBlock(SExecTaskInfo* pTaskInfo, SSDataBlock* pBlock, SExprS
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (pBlock->info.id.groupId == 0) {
|
if (!ignoreGroup) {
|
||||||
pBlock->info.id.groupId = pPos->groupId;
|
if (pBlock->info.id.groupId == 0) {
|
||||||
} else {
|
pBlock->info.id.groupId = pPos->groupId;
|
||||||
// current value belongs to different group, it can't be packed into one datablock
|
} else {
|
||||||
if (pBlock->info.id.groupId != pPos->groupId) {
|
// current value belongs to different group, it can't be packed into one datablock
|
||||||
releaseBufPage(pBuf, page);
|
if (pBlock->info.id.groupId != pPos->groupId) {
|
||||||
break;
|
releaseBufPage(pBuf, page);
|
||||||
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (pBlock->info.rows + pRow->numOfRows > pBlock->info.capacity) {
|
if (pBlock->info.rows + pRow->numOfRows > pBlock->info.capacity) {
|
||||||
blockDataEnsureCapacity(pBlock, pBlock->info.rows + pRow->numOfRows);
|
uint32_t newSize = pBlock->info.rows + pRow->numOfRows + (numOfRows - i) > 1 ? 1 : 0;
|
||||||
qDebug("datablock capacity not sufficient, expand to required:%" PRId64 ", current capacity:%d, %s",
|
blockDataEnsureCapacity(pBlock, newSize);
|
||||||
(pRow->numOfRows + pBlock->info.rows), pBlock->info.capacity, GET_TASKID(pTaskInfo));
|
qDebug("datablock capacity not sufficient, expand to required:%d, current capacity:%d, %s",
|
||||||
|
newSize, pBlock->info.capacity, GET_TASKID(pTaskInfo));
|
||||||
// todo set the pOperator->resultInfo size
|
// todo set the pOperator->resultInfo size
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -854,7 +857,7 @@ void doBuildStreamResBlock(SOperatorInfo* pOperator, SOptrBasicInfo* pbInfo, SGr
|
||||||
// clear the existed group id
|
// clear the existed group id
|
||||||
pBlock->info.id.groupId = 0;
|
pBlock->info.id.groupId = 0;
|
||||||
ASSERT(!pbInfo->mergeResultBlock);
|
ASSERT(!pbInfo->mergeResultBlock);
|
||||||
doCopyToSDataBlock(pTaskInfo, pBlock, &pOperator->exprSupp, pBuf, pGroupResInfo, pOperator->resultInfo.threshold);
|
doCopyToSDataBlock(pTaskInfo, pBlock, &pOperator->exprSupp, pBuf, pGroupResInfo, pOperator->resultInfo.threshold, false);
|
||||||
|
|
||||||
void* tbname = NULL;
|
void* tbname = NULL;
|
||||||
if (streamStateGetParName(pTaskInfo->streamInfo.pState, pBlock->info.id.groupId, &tbname) < 0) {
|
if (streamStateGetParName(pTaskInfo->streamInfo.pState, pBlock->info.id.groupId, &tbname) < 0) {
|
||||||
|
@ -881,10 +884,10 @@ void doBuildResultDatablock(SOperatorInfo* pOperator, SOptrBasicInfo* pbInfo, SG
|
||||||
// clear the existed group id
|
// clear the existed group id
|
||||||
pBlock->info.id.groupId = 0;
|
pBlock->info.id.groupId = 0;
|
||||||
if (!pbInfo->mergeResultBlock) {
|
if (!pbInfo->mergeResultBlock) {
|
||||||
doCopyToSDataBlock(pTaskInfo, pBlock, &pOperator->exprSupp, pBuf, pGroupResInfo, pOperator->resultInfo.threshold);
|
doCopyToSDataBlock(pTaskInfo, pBlock, &pOperator->exprSupp, pBuf, pGroupResInfo, pOperator->resultInfo.threshold, false);
|
||||||
} else {
|
} else {
|
||||||
while (hasRemainResults(pGroupResInfo)) {
|
while (hasRemainResults(pGroupResInfo)) {
|
||||||
doCopyToSDataBlock(pTaskInfo, pBlock, &pOperator->exprSupp, pBuf, pGroupResInfo, pOperator->resultInfo.threshold);
|
doCopyToSDataBlock(pTaskInfo, pBlock, &pOperator->exprSupp, pBuf, pGroupResInfo, pOperator->resultInfo.threshold, true);
|
||||||
if (pBlock->info.rows >= pOperator->resultInfo.threshold) {
|
if (pBlock->info.rows >= pOperator->resultInfo.threshold) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
|
@ -195,9 +195,24 @@ static SResultRow* getTableGroupOutputBuf(SOperatorInfo* pOperator, uint64_t gro
|
||||||
return (SResultRow*)((char*)(*pPage) + p1->offset);
|
return (SResultRow*)((char*)(*pPage) + p1->offset);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int32_t insertTableToScanIgnoreList(STableScanInfo* pTableScanInfo, uint64_t uid) {
|
||||||
|
if (NULL == pTableScanInfo->pIgnoreTables) {
|
||||||
|
int32_t tableNum = taosArrayGetSize(pTableScanInfo->base.pTableListInfo->pTableList);
|
||||||
|
pTableScanInfo->pIgnoreTables = taosHashInit(tableNum, taosGetDefaultHashFunction(TSDB_DATA_TYPE_BIGINT), true, HASH_NO_LOCK);
|
||||||
|
if (NULL == pTableScanInfo->pIgnoreTables) {
|
||||||
|
return TSDB_CODE_OUT_OF_MEMORY;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
taosHashPut(pTableScanInfo->pIgnoreTables, &uid, sizeof(uid), &pTableScanInfo->scanTimes, sizeof(pTableScanInfo->scanTimes));
|
||||||
|
|
||||||
|
return TSDB_CODE_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
static int32_t doDynamicPruneDataBlock(SOperatorInfo* pOperator, SDataBlockInfo* pBlockInfo, uint32_t* status) {
|
static int32_t doDynamicPruneDataBlock(SOperatorInfo* pOperator, SDataBlockInfo* pBlockInfo, uint32_t* status) {
|
||||||
STableScanInfo* pTableScanInfo = pOperator->info;
|
STableScanInfo* pTableScanInfo = pOperator->info;
|
||||||
|
int32_t code = TSDB_CODE_SUCCESS;
|
||||||
|
|
||||||
if (pTableScanInfo->base.pdInfo.pExprSup == NULL) {
|
if (pTableScanInfo->base.pdInfo.pExprSup == NULL) {
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
|
@ -229,9 +244,10 @@ static int32_t doDynamicPruneDataBlock(SOperatorInfo* pOperator, SDataBlockInfo*
|
||||||
|
|
||||||
if (notLoadBlock) {
|
if (notLoadBlock) {
|
||||||
*status = FUNC_DATA_REQUIRED_NOT_LOAD;
|
*status = FUNC_DATA_REQUIRED_NOT_LOAD;
|
||||||
|
code = insertTableToScanIgnoreList(pTableScanInfo, pBlockInfo->id.uid);
|
||||||
}
|
}
|
||||||
|
|
||||||
return TSDB_CODE_SUCCESS;
|
return code;
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool doFilterByBlockSMA(SFilterInfo* pFilterInfo, SColumnDataAgg** pColsAgg, int32_t numOfCols,
|
static bool doFilterByBlockSMA(SFilterInfo* pFilterInfo, SColumnDataAgg** pColsAgg, int32_t numOfCols,
|
||||||
|
@ -383,7 +399,13 @@ static int32_t loadDataBlock(SOperatorInfo* pOperator, STableScanBase* pTableSca
|
||||||
GET_TASKID(pTaskInfo), pBlockInfo->window.skey, pBlockInfo->window.ekey, pBlockInfo->rows);
|
GET_TASKID(pTaskInfo), pBlockInfo->window.skey, pBlockInfo->window.ekey, pBlockInfo->rows);
|
||||||
pCost->skipBlocks += 1;
|
pCost->skipBlocks += 1;
|
||||||
tsdbReleaseDataBlock(pTableScanInfo->dataReader);
|
tsdbReleaseDataBlock(pTableScanInfo->dataReader);
|
||||||
*status = FUNC_DATA_REQUIRED_FILTEROUT;
|
|
||||||
|
STableScanInfo* pTableScanInfo = pOperator->info;
|
||||||
|
if (taosHashGetSize(pTableScanInfo->pIgnoreTables) == taosArrayGetSize(pTableScanInfo->base.pTableListInfo->pTableList)) {
|
||||||
|
*status = FUNC_DATA_REQUIRED_ALL_FILTEROUT;
|
||||||
|
} else {
|
||||||
|
*status = FUNC_DATA_REQUIRED_FILTEROUT;
|
||||||
|
}
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -698,6 +720,10 @@ static SSDataBlock* doTableScanImpl(SOperatorInfo* pOperator) {
|
||||||
T_LONG_JMP(pTaskInfo->env, code);
|
T_LONG_JMP(pTaskInfo->env, code);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (status == FUNC_DATA_REQUIRED_ALL_FILTEROUT) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
// current block is filter out according to filter condition, continue load the next block
|
// current block is filter out according to filter condition, continue load the next block
|
||||||
if (status == FUNC_DATA_REQUIRED_FILTEROUT || pBlock->info.rows == 0) {
|
if (status == FUNC_DATA_REQUIRED_FILTEROUT || pBlock->info.rows == 0) {
|
||||||
continue;
|
continue;
|
||||||
|
@ -737,6 +763,7 @@ static SSDataBlock* doGroupedTableScan(SOperatorInfo* pOperator) {
|
||||||
}
|
}
|
||||||
|
|
||||||
pTableScanInfo->scanTimes += 1;
|
pTableScanInfo->scanTimes += 1;
|
||||||
|
taosHashClear(pTableScanInfo->pIgnoreTables);
|
||||||
|
|
||||||
if (pTableScanInfo->scanTimes < pTableScanInfo->scanInfo.numOfAsc) {
|
if (pTableScanInfo->scanTimes < pTableScanInfo->scanInfo.numOfAsc) {
|
||||||
setTaskStatus(pTaskInfo, TASK_NOT_COMPLETED);
|
setTaskStatus(pTaskInfo, TASK_NOT_COMPLETED);
|
||||||
|
@ -764,6 +791,7 @@ static SSDataBlock* doGroupedTableScan(SOperatorInfo* pOperator) {
|
||||||
}
|
}
|
||||||
|
|
||||||
pTableScanInfo->scanTimes += 1;
|
pTableScanInfo->scanTimes += 1;
|
||||||
|
taosHashClear(pTableScanInfo->pIgnoreTables);
|
||||||
|
|
||||||
if (pTableScanInfo->scanTimes < total) {
|
if (pTableScanInfo->scanTimes < total) {
|
||||||
setTaskStatus(pTaskInfo, TASK_NOT_COMPLETED);
|
setTaskStatus(pTaskInfo, TASK_NOT_COMPLETED);
|
||||||
|
@ -828,7 +856,7 @@ static SSDataBlock* doTableScan(SOperatorInfo* pOperator) {
|
||||||
ASSERT(pInfo->base.dataReader == NULL);
|
ASSERT(pInfo->base.dataReader == NULL);
|
||||||
|
|
||||||
int32_t code = tsdbReaderOpen(pInfo->base.readHandle.vnode, &pInfo->base.cond, pList, num, pInfo->pResBlock,
|
int32_t code = tsdbReaderOpen(pInfo->base.readHandle.vnode, &pInfo->base.cond, pList, num, pInfo->pResBlock,
|
||||||
(STsdbReader**)&pInfo->base.dataReader, GET_TASKID(pTaskInfo), pInfo->countOnly);
|
(STsdbReader**)&pInfo->base.dataReader, GET_TASKID(pTaskInfo), pInfo->countOnly, &pInfo->pIgnoreTables);
|
||||||
if (code != TSDB_CODE_SUCCESS) {
|
if (code != TSDB_CODE_SUCCESS) {
|
||||||
T_LONG_JMP(pTaskInfo->env, code);
|
T_LONG_JMP(pTaskInfo->env, code);
|
||||||
}
|
}
|
||||||
|
@ -897,6 +925,7 @@ static void destroyTableScanBase(STableScanBase* pBase) {
|
||||||
static void destroyTableScanOperatorInfo(void* param) {
|
static void destroyTableScanOperatorInfo(void* param) {
|
||||||
STableScanInfo* pTableScanInfo = (STableScanInfo*)param;
|
STableScanInfo* pTableScanInfo = (STableScanInfo*)param;
|
||||||
blockDataDestroy(pTableScanInfo->pResBlock);
|
blockDataDestroy(pTableScanInfo->pResBlock);
|
||||||
|
taosHashCleanup(pTableScanInfo->pIgnoreTables);
|
||||||
destroyTableScanBase(&pTableScanInfo->base);
|
destroyTableScanBase(&pTableScanInfo->base);
|
||||||
taosMemoryFreeClear(param);
|
taosMemoryFreeClear(param);
|
||||||
}
|
}
|
||||||
|
@ -1063,7 +1092,7 @@ static SSDataBlock* readPreVersionData(SOperatorInfo* pTableScanOp, uint64_t tbU
|
||||||
SSDataBlock* pBlock = pTableScanInfo->pResBlock;
|
SSDataBlock* pBlock = pTableScanInfo->pResBlock;
|
||||||
STsdbReader* pReader = NULL;
|
STsdbReader* pReader = NULL;
|
||||||
int32_t code = tsdbReaderOpen(pTableScanInfo->base.readHandle.vnode, &cond, &tblInfo, 1, pBlock,
|
int32_t code = tsdbReaderOpen(pTableScanInfo->base.readHandle.vnode, &cond, &tblInfo, 1, pBlock,
|
||||||
(STsdbReader**)&pReader, GET_TASKID(pTaskInfo), false);
|
(STsdbReader**)&pReader, GET_TASKID(pTaskInfo), false, NULL);
|
||||||
if (code != TSDB_CODE_SUCCESS) {
|
if (code != TSDB_CODE_SUCCESS) {
|
||||||
terrno = code;
|
terrno = code;
|
||||||
T_LONG_JMP(pTaskInfo->env, code);
|
T_LONG_JMP(pTaskInfo->env, code);
|
||||||
|
@ -1790,7 +1819,7 @@ static SSDataBlock* doStreamScan(SOperatorInfo* pOperator) {
|
||||||
SExecTaskInfo* pTaskInfo = pOperator->pTaskInfo;
|
SExecTaskInfo* pTaskInfo = pOperator->pTaskInfo;
|
||||||
SStreamScanInfo* pInfo = pOperator->info;
|
SStreamScanInfo* pInfo = pOperator->info;
|
||||||
|
|
||||||
qDebug("stream scan called");
|
qDebug("stream scan started, %s", GET_TASKID(pTaskInfo));
|
||||||
|
|
||||||
if (pTaskInfo->streamInfo.recoverStep == STREAM_RECOVER_STEP__PREPARE1 ||
|
if (pTaskInfo->streamInfo.recoverStep == STREAM_RECOVER_STEP__PREPARE1 ||
|
||||||
pTaskInfo->streamInfo.recoverStep == STREAM_RECOVER_STEP__PREPARE2) {
|
pTaskInfo->streamInfo.recoverStep == STREAM_RECOVER_STEP__PREPARE2) {
|
||||||
|
@ -1799,13 +1828,13 @@ static SSDataBlock* doStreamScan(SOperatorInfo* pOperator) {
|
||||||
if (pTaskInfo->streamInfo.recoverStep == STREAM_RECOVER_STEP__PREPARE1) {
|
if (pTaskInfo->streamInfo.recoverStep == STREAM_RECOVER_STEP__PREPARE1) {
|
||||||
pTSInfo->base.cond.startVersion = 0;
|
pTSInfo->base.cond.startVersion = 0;
|
||||||
pTSInfo->base.cond.endVersion = pTaskInfo->streamInfo.fillHistoryVer1;
|
pTSInfo->base.cond.endVersion = pTaskInfo->streamInfo.fillHistoryVer1;
|
||||||
qDebug("stream recover step 1, from %" PRId64 " to %" PRId64, pTSInfo->base.cond.startVersion,
|
qDebug("stream recover step1, verRange:%" PRId64 " - %" PRId64, pTSInfo->base.cond.startVersion,
|
||||||
pTSInfo->base.cond.endVersion);
|
pTSInfo->base.cond.endVersion);
|
||||||
pTaskInfo->streamInfo.recoverStep = STREAM_RECOVER_STEP__SCAN1;
|
pTaskInfo->streamInfo.recoverStep = STREAM_RECOVER_STEP__SCAN1;
|
||||||
} else {
|
} else {
|
||||||
pTSInfo->base.cond.startVersion = pTaskInfo->streamInfo.fillHistoryVer1 + 1;
|
pTSInfo->base.cond.startVersion = pTaskInfo->streamInfo.fillHistoryVer1 + 1;
|
||||||
pTSInfo->base.cond.endVersion = pTaskInfo->streamInfo.fillHistoryVer2;
|
pTSInfo->base.cond.endVersion = pTaskInfo->streamInfo.fillHistoryVer2;
|
||||||
qDebug("stream recover step 2, from %" PRId64 " to %" PRId64, pTSInfo->base.cond.startVersion,
|
qDebug("stream recover step2, verRange:%" PRId64 " - %" PRId64, pTSInfo->base.cond.startVersion,
|
||||||
pTSInfo->base.cond.endVersion);
|
pTSInfo->base.cond.endVersion);
|
||||||
pTaskInfo->streamInfo.recoverStep = STREAM_RECOVER_STEP__SCAN2;
|
pTaskInfo->streamInfo.recoverStep = STREAM_RECOVER_STEP__SCAN2;
|
||||||
}
|
}
|
||||||
|
@ -1907,7 +1936,6 @@ FETCH_NEXT_BLOCK:
|
||||||
if (pInfo->blockType == STREAM_INPUT__DATA_BLOCK) {
|
if (pInfo->blockType == STREAM_INPUT__DATA_BLOCK) {
|
||||||
if (pInfo->validBlockIndex >= total) {
|
if (pInfo->validBlockIndex >= total) {
|
||||||
doClearBufferedBlocks(pInfo);
|
doClearBufferedBlocks(pInfo);
|
||||||
/*pOperator->status = OP_EXEC_DONE;*/
|
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2688,7 +2716,7 @@ static SSDataBlock* getTableDataBlockImpl(void* param) {
|
||||||
SReadHandle* pHandle = &pInfo->base.readHandle;
|
SReadHandle* pHandle = &pInfo->base.readHandle;
|
||||||
|
|
||||||
if (NULL == source->dataReader || !source->multiReader) {
|
if (NULL == source->dataReader || !source->multiReader) {
|
||||||
code = tsdbReaderOpen(pHandle->vnode, pQueryCond, p, 1, pBlock, &source->dataReader, GET_TASKID(pTaskInfo), false);
|
code = tsdbReaderOpen(pHandle->vnode, pQueryCond, p, 1, pBlock, &source->dataReader, GET_TASKID(pTaskInfo), false, NULL);
|
||||||
if (code != 0) {
|
if (code != 0) {
|
||||||
T_LONG_JMP(pTaskInfo->env, code);
|
T_LONG_JMP(pTaskInfo->env, code);
|
||||||
}
|
}
|
||||||
|
@ -2736,6 +2764,10 @@ static SSDataBlock* getTableDataBlockImpl(void* param) {
|
||||||
T_LONG_JMP(pTaskInfo->env, code);
|
T_LONG_JMP(pTaskInfo->env, code);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (status == FUNC_DATA_REQUIRED_ALL_FILTEROUT) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
// current block is filter out according to filter condition, continue load the next block
|
// current block is filter out according to filter condition, continue load the next block
|
||||||
if (status == FUNC_DATA_REQUIRED_FILTEROUT || pBlock->info.rows == 0) {
|
if (status == FUNC_DATA_REQUIRED_FILTEROUT || pBlock->info.rows == 0) {
|
||||||
continue;
|
continue;
|
||||||
|
|
|
@ -2268,7 +2268,7 @@ SOperatorInfo* createDataBlockInfoScanOperator(SReadHandle* readHandle, SBlockDi
|
||||||
size_t num = tableListGetSize(pTableListInfo);
|
size_t num = tableListGetSize(pTableListInfo);
|
||||||
void* pList = tableListGetInfo(pTableListInfo, 0);
|
void* pList = tableListGetInfo(pTableListInfo, 0);
|
||||||
|
|
||||||
code = tsdbReaderOpen(readHandle->vnode, &cond, pList, num, pInfo->pResBlock, &pInfo->pHandle, pTaskInfo->id.str, false);
|
code = tsdbReaderOpen(readHandle->vnode, &cond, pList, num, pInfo->pResBlock, &pInfo->pHandle, pTaskInfo->id.str, false, NULL);
|
||||||
cleanupQueryTableDataCond(&cond);
|
cleanupQueryTableDataCond(&cond);
|
||||||
if (code != 0) {
|
if (code != 0) {
|
||||||
goto _error;
|
goto _error;
|
||||||
|
|
|
@ -310,6 +310,11 @@ static bool genInterpolationResult(STimeSliceOperatorInfo* pSliceInfo, SExprSupp
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (end.key != INT64_MIN && end.key < pSliceInfo->current) {
|
||||||
|
hasInterp = false;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
if (start.key == INT64_MIN || end.key == INT64_MIN) {
|
if (start.key == INT64_MIN || end.key == INT64_MIN) {
|
||||||
colDataSetNULL(pDst, rows);
|
colDataSetNULL(pDst, rows);
|
||||||
break;
|
break;
|
||||||
|
@ -894,8 +899,10 @@ void destroyTimeSliceOperatorInfo(void* param) {
|
||||||
}
|
}
|
||||||
taosArrayDestroy(pInfo->pLinearInfo);
|
taosArrayDestroy(pInfo->pLinearInfo);
|
||||||
|
|
||||||
taosMemoryFree(pInfo->pPrevGroupKey->pData);
|
if (pInfo->pPrevGroupKey) {
|
||||||
taosMemoryFree(pInfo->pPrevGroupKey);
|
taosMemoryFree(pInfo->pPrevGroupKey->pData);
|
||||||
|
taosMemoryFree(pInfo->pPrevGroupKey);
|
||||||
|
}
|
||||||
|
|
||||||
cleanupExprSupp(&pInfo->scalarSup);
|
cleanupExprSupp(&pInfo->scalarSup);
|
||||||
|
|
||||||
|
|
|
@ -54,16 +54,15 @@ int32_t udfdCPluginOpen(SScriptUdfEnvItem *items, int numItems) { return 0; }
|
||||||
int32_t udfdCPluginClose() { return 0; }
|
int32_t udfdCPluginClose() { return 0; }
|
||||||
|
|
||||||
const char *udfdCPluginUdfInitLoadInitDestoryFuncs(SUdfCPluginCtx *udfCtx, const char *udfName) {
|
const char *udfdCPluginUdfInitLoadInitDestoryFuncs(SUdfCPluginCtx *udfCtx, const char *udfName) {
|
||||||
char initFuncName[TSDB_FUNC_NAME_LEN + 5] = {0};
|
char initFuncName[TSDB_FUNC_NAME_LEN + 6] = {0};
|
||||||
char *initSuffix = "_init";
|
char *initSuffix = "_init";
|
||||||
strcpy(initFuncName, udfName);
|
snprintf(initFuncName, sizeof(initFuncName), "%s%s", udfName, initSuffix);
|
||||||
strncat(initFuncName, initSuffix, strlen(initSuffix));
|
|
||||||
uv_dlsym(&udfCtx->lib, initFuncName, (void **)(&udfCtx->initFunc));
|
uv_dlsym(&udfCtx->lib, initFuncName, (void **)(&udfCtx->initFunc));
|
||||||
|
|
||||||
char destroyFuncName[TSDB_FUNC_NAME_LEN + 5] = {0};
|
char destroyFuncName[TSDB_FUNC_NAME_LEN + 9] = {0};
|
||||||
char *destroySuffix = "_destroy";
|
char *destroySuffix = "_destroy";
|
||||||
strcpy(destroyFuncName, udfName);
|
strcpy(destroyFuncName, udfName);
|
||||||
strncat(destroyFuncName, destroySuffix, strlen(destroySuffix));
|
snprintf(destroyFuncName, sizeof(destroyFuncName), "%s%s", udfName, destroySuffix);
|
||||||
uv_dlsym(&udfCtx->lib, destroyFuncName, (void **)(&udfCtx->destroyFunc));
|
uv_dlsym(&udfCtx->lib, destroyFuncName, (void **)(&udfCtx->destroyFunc));
|
||||||
return udfName;
|
return udfName;
|
||||||
}
|
}
|
||||||
|
@ -73,22 +72,19 @@ void udfdCPluginUdfInitLoadAggFuncs(SUdfCPluginCtx *udfCtx, const char *udfName)
|
||||||
strcpy(processFuncName, udfName);
|
strcpy(processFuncName, udfName);
|
||||||
uv_dlsym(&udfCtx->lib, processFuncName, (void **)(&udfCtx->aggProcFunc));
|
uv_dlsym(&udfCtx->lib, processFuncName, (void **)(&udfCtx->aggProcFunc));
|
||||||
|
|
||||||
char startFuncName[TSDB_FUNC_NAME_LEN + 6] = {0};
|
char startFuncName[TSDB_FUNC_NAME_LEN + 7] = {0};
|
||||||
char *startSuffix = "_start";
|
char *startSuffix = "_start";
|
||||||
strncpy(startFuncName, processFuncName, sizeof(startFuncName));
|
snprintf(startFuncName, sizeof(startFuncName), "%s%s", processFuncName, startSuffix);
|
||||||
strncat(startFuncName, startSuffix, strlen(startSuffix));
|
|
||||||
uv_dlsym(&udfCtx->lib, startFuncName, (void **)(&udfCtx->aggStartFunc));
|
uv_dlsym(&udfCtx->lib, startFuncName, (void **)(&udfCtx->aggStartFunc));
|
||||||
|
|
||||||
char finishFuncName[TSDB_FUNC_NAME_LEN + 7] = {0};
|
char finishFuncName[TSDB_FUNC_NAME_LEN + 8] = {0};
|
||||||
char *finishSuffix = "_finish";
|
char *finishSuffix = "_finish";
|
||||||
strncpy(finishFuncName, processFuncName, sizeof(finishFuncName));
|
snprintf(finishFuncName, sizeof(finishFuncName), "%s%s", processFuncName, finishSuffix);
|
||||||
strncat(finishFuncName, finishSuffix, strlen(finishSuffix));
|
|
||||||
uv_dlsym(&udfCtx->lib, finishFuncName, (void **)(&udfCtx->aggFinishFunc));
|
uv_dlsym(&udfCtx->lib, finishFuncName, (void **)(&udfCtx->aggFinishFunc));
|
||||||
|
|
||||||
char mergeFuncName[TSDB_FUNC_NAME_LEN + 6] = {0};
|
char mergeFuncName[TSDB_FUNC_NAME_LEN + 7] = {0};
|
||||||
char *mergeSuffix = "_merge";
|
char *mergeSuffix = "_merge";
|
||||||
strncpy(mergeFuncName, processFuncName, sizeof(mergeFuncName));
|
snprintf(mergeFuncName, sizeof(mergeFuncName), "%s%s", processFuncName, mergeSuffix);
|
||||||
strncat(mergeFuncName, mergeSuffix, strlen(mergeSuffix));
|
|
||||||
uv_dlsym(&udfCtx->lib, mergeFuncName, (void **)(&udfCtx->aggMergeFunc));
|
uv_dlsym(&udfCtx->lib, mergeFuncName, (void **)(&udfCtx->aggMergeFunc));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -87,7 +87,7 @@ static void* nodesCalloc(int32_t num, int32_t size) {
|
||||||
return (char*)p + 1;
|
return (char*)p + 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void nodesFree(void* p) {
|
void nodesFree(void* p) {
|
||||||
char* ptr = (char*)p - 1;
|
char* ptr = (char*)p - 1;
|
||||||
if (0 == *ptr) {
|
if (0 == *ptr) {
|
||||||
taosMemoryFree(ptr);
|
taosMemoryFree(ptr);
|
||||||
|
|
|
@ -2628,7 +2628,9 @@ static bool tbCntScanOptIsEligibleConds(STbCntScanOptInfo* pInfo, SNode* pCondit
|
||||||
if (NULL == pConditions) {
|
if (NULL == pConditions) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
if (LIST_LENGTH(pInfo->pAgg->pGroupKeys) != 0) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
if (QUERY_NODE_LOGIC_CONDITION == nodeType(pConditions)) {
|
if (QUERY_NODE_LOGIC_CONDITION == nodeType(pConditions)) {
|
||||||
return tbCntScanOptIsEligibleLogicCond(pInfo, (SLogicConditionNode*)pConditions);
|
return tbCntScanOptIsEligibleLogicCond(pInfo, (SLogicConditionNode*)pConditions);
|
||||||
}
|
}
|
||||||
|
|
|
@ -548,3 +548,11 @@ int32_t cloneSVreateTbReq(SVCreateTbReq* pSrc, SVCreateTbReq** pDst) {
|
||||||
|
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void freeDbCfgInfo(SDbCfgInfo *pInfo) {
|
||||||
|
if (pInfo) {
|
||||||
|
taosArrayDestroy(pInfo->pRetensions);
|
||||||
|
}
|
||||||
|
taosMemoryFree(pInfo);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
|
@ -120,7 +120,8 @@ typedef struct SQWTaskCtx {
|
||||||
int8_t explain;
|
int8_t explain;
|
||||||
int8_t needFetch;
|
int8_t needFetch;
|
||||||
int8_t localExec;
|
int8_t localExec;
|
||||||
int32_t msgType;
|
int32_t queryMsgType;
|
||||||
|
int32_t fetchMsgType;
|
||||||
int32_t level;
|
int32_t level;
|
||||||
uint64_t sId;
|
uint64_t sId;
|
||||||
|
|
||||||
|
|
|
@ -126,10 +126,10 @@ void qwDbgDumpTasksInfo(SQWorker *mgmt) {
|
||||||
void *key = taosHashGetKey(pIter, NULL);
|
void *key = taosHashGetKey(pIter, NULL);
|
||||||
QW_GET_QTID(key, qId, tId, eId);
|
QW_GET_QTID(key, qId, tId, eId);
|
||||||
|
|
||||||
QW_TASK_DLOG("%p lock:%x, phase:%d, type:%d, explain:%d, needFetch:%d, localExec:%d, msgType:%d, "
|
QW_TASK_DLOG("%p lock:%x, phase:%d, type:%d, explain:%d, needFetch:%d, localExec:%d, queryMsgType:%d, "
|
||||||
"sId:%" PRId64 ", level:%d, queryGotData:%d, queryRsped:%d, queryEnd:%d, queryContinue:%d, queryInQueue:%d, "
|
"sId:%" PRId64 ", level:%d, queryGotData:%d, queryRsped:%d, queryEnd:%d, queryContinue:%d, queryInQueue:%d, "
|
||||||
"rspCode:%x, affectedRows:%" PRId64 ", taskHandle:%p, sinkHandle:%p, tbFName:%s, sver:%d, tver:%d, events:%d,%d,%d,%d,%d",
|
"rspCode:%x, affectedRows:%" PRId64 ", taskHandle:%p, sinkHandle:%p, tbFName:%s, sver:%d, tver:%d, events:%d,%d,%d,%d,%d",
|
||||||
ctx, ctx->lock, ctx->phase, ctx->taskType, ctx->explain, ctx->needFetch, ctx->localExec, ctx->msgType,
|
ctx, ctx->lock, ctx->phase, ctx->taskType, ctx->explain, ctx->needFetch, ctx->localExec, ctx->queryMsgType,
|
||||||
ctx->sId, ctx->level, ctx->queryGotData, ctx->queryRsped, ctx->queryEnd, ctx->queryContinue,
|
ctx->sId, ctx->level, ctx->queryGotData, ctx->queryRsped, ctx->queryEnd, ctx->queryContinue,
|
||||||
ctx->queryInQueue, ctx->rspCode, ctx->affectedRows, ctx->taskHandle, ctx->sinkHandle, ctx->tbInfo.tbFName,
|
ctx->queryInQueue, ctx->rspCode, ctx->affectedRows, ctx->taskHandle, ctx->sinkHandle, ctx->tbInfo.tbFName,
|
||||||
ctx->tbInfo.sversion, ctx->tbInfo.tversion, ctx->events[QW_EVENT_CANCEL], ctx->events[QW_EVENT_READY],
|
ctx->tbInfo.sversion, ctx->tbInfo.tversion, ctx->events[QW_EVENT_CANCEL], ctx->events[QW_EVENT_READY],
|
||||||
|
@ -259,9 +259,9 @@ void qwDbgSimulateDead(QW_FPARAMS_DEF, SQWTaskCtx *ctx, bool *rsped) {
|
||||||
static int32_t ignoreTime = 0;
|
static int32_t ignoreTime = 0;
|
||||||
|
|
||||||
if (++ignoreTime > 10 && 0 == taosRand() % 9) {
|
if (++ignoreTime > 10 && 0 == taosRand() % 9) {
|
||||||
if (ctx->msgType == TDMT_SCH_FETCH) {
|
if (ctx->fetchMsgType == TDMT_SCH_FETCH) {
|
||||||
qwBuildAndSendErrorRsp(TDMT_SCH_LINK_BROKEN, &ctx->ctrlConnInfo, TSDB_CODE_RPC_BROKEN_LINK);
|
qwBuildAndSendErrorRsp(TDMT_SCH_LINK_BROKEN, &ctx->ctrlConnInfo, TSDB_CODE_RPC_BROKEN_LINK);
|
||||||
qwBuildAndSendErrorRsp(ctx->msgType + 1, &ctx->dataConnInfo, TSDB_CODE_QRY_TASK_CTX_NOT_EXIST);
|
qwBuildAndSendErrorRsp(ctx->fetchMsgType + 1, &ctx->dataConnInfo, TSDB_CODE_QRY_TASK_CTX_NOT_EXIST);
|
||||||
*rsped = true;
|
*rsped = true;
|
||||||
|
|
||||||
taosSsleep(3);
|
taosSsleep(3);
|
||||||
|
|
|
@ -254,6 +254,7 @@ bool qwTaskNotInExec(SQWTaskCtx *ctx) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
int32_t qwGenerateSchHbRsp(SQWorker *mgmt, SQWSchStatus *sch, SQWHbInfo *hbInfo) {
|
int32_t qwGenerateSchHbRsp(SQWorker *mgmt, SQWSchStatus *sch, SQWHbInfo *hbInfo) {
|
||||||
int32_t taskNum = 0;
|
int32_t taskNum = 0;
|
||||||
|
|
||||||
|
@ -436,6 +437,40 @@ int32_t qwGetDeleteResFromSink(QW_FPARAMS_DEF, SQWTaskCtx *ctx, SDeleteRes *pRes
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int32_t qwQuickRspFetchReq(QW_FPARAMS_DEF, SQWTaskCtx * ctx, SQWMsg *qwMsg, int32_t code) {
|
||||||
|
if (QUERY_RSP_POLICY_QUICK == tsQueryRspPolicy && ctx != NULL) {
|
||||||
|
if (QW_EVENT_RECEIVED(ctx, QW_EVENT_FETCH)) {
|
||||||
|
void *rsp = NULL;
|
||||||
|
int32_t dataLen = 0;
|
||||||
|
SOutputData sOutput = {0};
|
||||||
|
if (qwGetQueryResFromSink(QW_FPARAMS(), ctx, &dataLen, &rsp, &sOutput)) {
|
||||||
|
return TSDB_CODE_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (rsp) {
|
||||||
|
bool qComplete = (DS_BUF_EMPTY == sOutput.bufStatus && sOutput.queryEnd);
|
||||||
|
|
||||||
|
qwBuildFetchRsp(rsp, &sOutput, dataLen, qComplete);
|
||||||
|
if (qComplete) {
|
||||||
|
atomic_store_8((int8_t *)&ctx->queryEnd, true);
|
||||||
|
}
|
||||||
|
|
||||||
|
qwMsg->connInfo = ctx->dataConnInfo;
|
||||||
|
QW_SET_EVENT_PROCESSED(ctx, QW_EVENT_FETCH);
|
||||||
|
|
||||||
|
qwBuildAndSendFetchRsp(ctx->fetchMsgType + 1, &qwMsg->connInfo, rsp, dataLen, code);
|
||||||
|
rsp = NULL;
|
||||||
|
|
||||||
|
QW_TASK_DLOG("fetch rsp send, handle:%p, code:%x - %s, dataLen:%d", qwMsg->connInfo.handle, code, tstrerror(code),
|
||||||
|
dataLen);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return TSDB_CODE_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
int32_t qwHandlePrePhaseEvents(QW_FPARAMS_DEF, int8_t phase, SQWPhaseInput *input, SQWPhaseOutput *output) {
|
int32_t qwHandlePrePhaseEvents(QW_FPARAMS_DEF, int8_t phase, SQWPhaseInput *input, SQWPhaseOutput *output) {
|
||||||
int32_t code = 0;
|
int32_t code = 0;
|
||||||
SQWTaskCtx *ctx = NULL;
|
SQWTaskCtx *ctx = NULL;
|
||||||
|
@ -584,7 +619,7 @@ _return:
|
||||||
|
|
||||||
if (QW_PHASE_POST_QUERY == phase && ctx && !ctx->queryRsped) {
|
if (QW_PHASE_POST_QUERY == phase && ctx && !ctx->queryRsped) {
|
||||||
bool rsped = false;
|
bool rsped = false;
|
||||||
SQWMsg qwMsg = {.msgType = ctx->msgType, .connInfo = ctx->ctrlConnInfo};
|
SQWMsg qwMsg = {.msgType = ctx->queryMsgType, .connInfo = ctx->ctrlConnInfo};
|
||||||
qwDbgSimulateRedirect(&qwMsg, ctx, &rsped);
|
qwDbgSimulateRedirect(&qwMsg, ctx, &rsped);
|
||||||
qwDbgSimulateDead(QW_FPARAMS(), ctx, &rsped);
|
qwDbgSimulateDead(QW_FPARAMS(), ctx, &rsped);
|
||||||
if (!rsped) {
|
if (!rsped) {
|
||||||
|
@ -634,6 +669,8 @@ int32_t qwPreprocessQuery(QW_FPARAMS_DEF, SQWMsg *qwMsg) {
|
||||||
|
|
||||||
QW_ERR_JRET(qwAddTaskStatus(QW_FPARAMS(), JOB_TASK_STATUS_INIT));
|
QW_ERR_JRET(qwAddTaskStatus(QW_FPARAMS(), JOB_TASK_STATUS_INIT));
|
||||||
|
|
||||||
|
qwSendQueryRsp(QW_FPARAMS(), qwMsg->msgType + 1, ctx, code, true);
|
||||||
|
|
||||||
_return:
|
_return:
|
||||||
|
|
||||||
if (ctx) {
|
if (ctx) {
|
||||||
|
@ -660,7 +697,7 @@ int32_t qwProcessQuery(QW_FPARAMS_DEF, SQWMsg *qwMsg, char *sql) {
|
||||||
ctx->taskType = qwMsg->msgInfo.taskType;
|
ctx->taskType = qwMsg->msgInfo.taskType;
|
||||||
ctx->explain = qwMsg->msgInfo.explain;
|
ctx->explain = qwMsg->msgInfo.explain;
|
||||||
ctx->needFetch = qwMsg->msgInfo.needFetch;
|
ctx->needFetch = qwMsg->msgInfo.needFetch;
|
||||||
ctx->msgType = qwMsg->msgType;
|
ctx->queryMsgType = qwMsg->msgType;
|
||||||
ctx->localExec = false;
|
ctx->localExec = false;
|
||||||
|
|
||||||
// QW_TASK_DLOGL("subplan json string, len:%d, %s", qwMsg->msgLen, qwMsg->msg);
|
// QW_TASK_DLOGL("subplan json string, len:%d, %s", qwMsg->msgLen, qwMsg->msg);
|
||||||
|
@ -684,7 +721,7 @@ int32_t qwProcessQuery(QW_FPARAMS_DEF, SQWMsg *qwMsg, char *sql) {
|
||||||
QW_ERR_JRET(TSDB_CODE_APP_ERROR);
|
QW_ERR_JRET(TSDB_CODE_APP_ERROR);
|
||||||
}
|
}
|
||||||
|
|
||||||
qwSendQueryRsp(QW_FPARAMS(), qwMsg->msgType + 1, ctx, code, true);
|
//qwSendQueryRsp(QW_FPARAMS(), qwMsg->msgType + 1, ctx, code, true);
|
||||||
|
|
||||||
ctx->level = plan->level;
|
ctx->level = plan->level;
|
||||||
atomic_store_ptr(&ctx->taskHandle, pTaskInfo);
|
atomic_store_ptr(&ctx->taskHandle, pTaskInfo);
|
||||||
|
@ -701,32 +738,7 @@ _return:
|
||||||
input.msgType = qwMsg->msgType;
|
input.msgType = qwMsg->msgType;
|
||||||
code = qwHandlePostPhaseEvents(QW_FPARAMS(), QW_PHASE_POST_QUERY, &input, NULL);
|
code = qwHandlePostPhaseEvents(QW_FPARAMS(), QW_PHASE_POST_QUERY, &input, NULL);
|
||||||
|
|
||||||
if (QUERY_RSP_POLICY_QUICK == tsQueryRspPolicy && ctx != NULL && QW_EVENT_RECEIVED(ctx, QW_EVENT_FETCH)) {
|
qwQuickRspFetchReq(QW_FPARAMS(), ctx, qwMsg, code);
|
||||||
void *rsp = NULL;
|
|
||||||
int32_t dataLen = 0;
|
|
||||||
SOutputData sOutput = {0};
|
|
||||||
if (qwGetQueryResFromSink(QW_FPARAMS(), ctx, &dataLen, &rsp, &sOutput)) {
|
|
||||||
return TSDB_CODE_SUCCESS;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (rsp) {
|
|
||||||
bool qComplete = (DS_BUF_EMPTY == sOutput.bufStatus && sOutput.queryEnd);
|
|
||||||
|
|
||||||
qwBuildFetchRsp(rsp, &sOutput, dataLen, qComplete);
|
|
||||||
if (qComplete) {
|
|
||||||
atomic_store_8((int8_t *)&ctx->queryEnd, true);
|
|
||||||
}
|
|
||||||
|
|
||||||
qwMsg->connInfo = ctx->dataConnInfo;
|
|
||||||
QW_SET_EVENT_PROCESSED(ctx, QW_EVENT_FETCH);
|
|
||||||
|
|
||||||
qwBuildAndSendFetchRsp(ctx->msgType + 1, &qwMsg->connInfo, rsp, dataLen, code);
|
|
||||||
rsp = NULL;
|
|
||||||
|
|
||||||
QW_TASK_DLOG("fetch rsp send, handle:%p, code:%x - %s, dataLen:%d", qwMsg->connInfo.handle, code, tstrerror(code),
|
|
||||||
dataLen);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
QW_RET(TSDB_CODE_SUCCESS);
|
QW_RET(TSDB_CODE_SUCCESS);
|
||||||
}
|
}
|
||||||
|
@ -750,8 +762,10 @@ int32_t qwProcessCQuery(QW_FPARAMS_DEF, SQWMsg *qwMsg) {
|
||||||
atomic_store_8((int8_t *)&ctx->queryInQueue, 0);
|
atomic_store_8((int8_t *)&ctx->queryInQueue, 0);
|
||||||
atomic_store_8((int8_t *)&ctx->queryContinue, 0);
|
atomic_store_8((int8_t *)&ctx->queryContinue, 0);
|
||||||
|
|
||||||
QW_ERR_JRET(qwExecTask(QW_FPARAMS(), ctx, &queryStop));
|
if (!queryStop) {
|
||||||
|
QW_ERR_JRET(qwExecTask(QW_FPARAMS(), ctx, &queryStop));
|
||||||
|
}
|
||||||
|
|
||||||
if (QW_EVENT_RECEIVED(ctx, QW_EVENT_FETCH)) {
|
if (QW_EVENT_RECEIVED(ctx, QW_EVENT_FETCH)) {
|
||||||
SOutputData sOutput = {0};
|
SOutputData sOutput = {0};
|
||||||
QW_ERR_JRET(qwGetQueryResFromSink(QW_FPARAMS(), ctx, &dataLen, &rsp, &sOutput));
|
QW_ERR_JRET(qwGetQueryResFromSink(QW_FPARAMS(), ctx, &dataLen, &rsp, &sOutput));
|
||||||
|
@ -774,7 +788,7 @@ int32_t qwProcessCQuery(QW_FPARAMS_DEF, SQWMsg *qwMsg) {
|
||||||
qwMsg->connInfo = ctx->dataConnInfo;
|
qwMsg->connInfo = ctx->dataConnInfo;
|
||||||
QW_SET_EVENT_PROCESSED(ctx, QW_EVENT_FETCH);
|
QW_SET_EVENT_PROCESSED(ctx, QW_EVENT_FETCH);
|
||||||
|
|
||||||
qwBuildAndSendFetchRsp(ctx->msgType + 1, &qwMsg->connInfo, rsp, dataLen, code);
|
qwBuildAndSendFetchRsp(ctx->fetchMsgType + 1, &qwMsg->connInfo, rsp, dataLen, code);
|
||||||
rsp = NULL;
|
rsp = NULL;
|
||||||
|
|
||||||
QW_TASK_DLOG("fetch rsp send, handle:%p, code:%x - %s, dataLen:%d", qwMsg->connInfo.handle, code,
|
QW_TASK_DLOG("fetch rsp send, handle:%p, code:%x - %s, dataLen:%d", qwMsg->connInfo.handle, code,
|
||||||
|
@ -796,7 +810,7 @@ int32_t qwProcessCQuery(QW_FPARAMS_DEF, SQWMsg *qwMsg) {
|
||||||
rsp = NULL;
|
rsp = NULL;
|
||||||
|
|
||||||
qwMsg->connInfo = ctx->dataConnInfo;
|
qwMsg->connInfo = ctx->dataConnInfo;
|
||||||
qwBuildAndSendFetchRsp(ctx->msgType + 1, &qwMsg->connInfo, NULL, 0, code);
|
qwBuildAndSendFetchRsp(ctx->fetchMsgType + 1, &qwMsg->connInfo, NULL, 0, code);
|
||||||
QW_TASK_DLOG("fetch rsp send, handle:%p, code:%x - %s, dataLen:%d", qwMsg->connInfo.handle, code, tstrerror(code),
|
QW_TASK_DLOG("fetch rsp send, handle:%p, code:%x - %s, dataLen:%d", qwMsg->connInfo.handle, code, tstrerror(code),
|
||||||
0);
|
0);
|
||||||
}
|
}
|
||||||
|
@ -830,7 +844,7 @@ int32_t qwProcessFetch(QW_FPARAMS_DEF, SQWMsg *qwMsg) {
|
||||||
|
|
||||||
QW_ERR_JRET(qwGetTaskCtx(QW_FPARAMS(), &ctx));
|
QW_ERR_JRET(qwGetTaskCtx(QW_FPARAMS(), &ctx));
|
||||||
|
|
||||||
ctx->msgType = qwMsg->msgType;
|
ctx->fetchMsgType = qwMsg->msgType;
|
||||||
ctx->dataConnInfo = qwMsg->connInfo;
|
ctx->dataConnInfo = qwMsg->connInfo;
|
||||||
|
|
||||||
SOutputData sOutput = {0};
|
SOutputData sOutput = {0};
|
||||||
|
@ -896,6 +910,8 @@ _return:
|
||||||
qwFreeFetchRsp(rsp);
|
qwFreeFetchRsp(rsp);
|
||||||
rsp = NULL;
|
rsp = NULL;
|
||||||
}
|
}
|
||||||
|
} else {
|
||||||
|
//qwQuickRspFetchReq(QW_FPARAMS(), ctx, qwMsg, code);
|
||||||
}
|
}
|
||||||
|
|
||||||
QW_RET(TSDB_CODE_SUCCESS);
|
QW_RET(TSDB_CODE_SUCCESS);
|
||||||
|
@ -1307,7 +1323,7 @@ int32_t qWorkerProcessLocalQuery(void *pMgmt, uint64_t sId, uint64_t qId, uint64
|
||||||
ctx->taskType = qwMsg->msgInfo.taskType;
|
ctx->taskType = qwMsg->msgInfo.taskType;
|
||||||
ctx->explain = qwMsg->msgInfo.explain;
|
ctx->explain = qwMsg->msgInfo.explain;
|
||||||
ctx->needFetch = qwMsg->msgInfo.needFetch;
|
ctx->needFetch = qwMsg->msgInfo.needFetch;
|
||||||
ctx->msgType = qwMsg->msgType;
|
ctx->queryMsgType = qwMsg->msgType;
|
||||||
ctx->localExec = true;
|
ctx->localExec = true;
|
||||||
ctx->explainRes = explainRes;
|
ctx->explainRes = explainRes;
|
||||||
|
|
||||||
|
@ -1362,7 +1378,7 @@ int32_t qWorkerProcessLocalFetch(void *pMgmt, uint64_t sId, uint64_t qId, uint64
|
||||||
|
|
||||||
QW_ERR_JRET(qwGetTaskCtx(QW_FPARAMS(), &ctx));
|
QW_ERR_JRET(qwGetTaskCtx(QW_FPARAMS(), &ctx));
|
||||||
|
|
||||||
ctx->msgType = TDMT_SCH_MERGE_FETCH;
|
ctx->fetchMsgType = TDMT_SCH_MERGE_FETCH;
|
||||||
ctx->explainRes = explainRes;
|
ctx->explainRes = explainRes;
|
||||||
|
|
||||||
SOutputData sOutput = {0};
|
SOutputData sOutput = {0};
|
||||||
|
|
|
@ -16,8 +16,10 @@
|
||||||
#include "streamInc.h"
|
#include "streamInc.h"
|
||||||
#include "ttimer.h"
|
#include "ttimer.h"
|
||||||
|
|
||||||
#define STREAM_TASK_INPUT_QUEUEU_CAPACITY 20480
|
#define STREAM_TASK_INPUT_QUEUEU_CAPACITY 20480
|
||||||
#define STREAM_TASK_INPUT_QUEUEU_CAPACITY_IN_SIZE (100)
|
#define STREAM_TASK_INPUT_QUEUEU_CAPACITY_IN_SIZE (50)
|
||||||
|
#define ONE_MB_F (1048576.0)
|
||||||
|
#define QUEUE_MEM_SIZE_IN_MB(_q) (taosQueueMemorySize(_q)/ONE_MB_F)
|
||||||
|
|
||||||
int32_t streamInit() {
|
int32_t streamInit() {
|
||||||
int8_t old;
|
int8_t old;
|
||||||
|
@ -281,33 +283,27 @@ int32_t streamProcessRetrieveReq(SStreamTask* pTask, SStreamRetrieveReq* pReq, S
|
||||||
}
|
}
|
||||||
|
|
||||||
bool tInputQueueIsFull(const SStreamTask* pTask) {
|
bool tInputQueueIsFull(const SStreamTask* pTask) {
|
||||||
return taosQueueItemSize((pTask->inputQueue->queue)) >= STREAM_TASK_INPUT_QUEUEU_CAPACITY;
|
bool isFull = taosQueueItemSize((pTask->inputQueue->queue)) >= STREAM_TASK_INPUT_QUEUEU_CAPACITY;
|
||||||
|
double size = QUEUE_MEM_SIZE_IN_MB(pTask->inputQueue->queue);
|
||||||
|
return (isFull || size >= STREAM_TASK_INPUT_QUEUEU_CAPACITY_IN_SIZE);
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t tAppendDataToInputQueue(SStreamTask* pTask, SStreamQueueItem* pItem) {
|
int32_t tAppendDataToInputQueue(SStreamTask* pTask, SStreamQueueItem* pItem) {
|
||||||
int8_t type = pItem->type;
|
int8_t type = pItem->type;
|
||||||
|
int32_t total = taosQueueItemSize(pTask->inputQueue->queue) + 1;
|
||||||
|
double size = QUEUE_MEM_SIZE_IN_MB(pTask->inputQueue->queue);
|
||||||
|
|
||||||
if (type == STREAM_INPUT__DATA_SUBMIT) {
|
if (type == STREAM_INPUT__DATA_SUBMIT) {
|
||||||
SStreamDataSubmit2* pSubmitBlock = streamSubmitBlockClone((SStreamDataSubmit2*)pItem);
|
SStreamDataSubmit2* pSubmitBlock = (SStreamDataSubmit2*)pItem;
|
||||||
if (pSubmitBlock == NULL) {
|
|
||||||
qDebug("task %d %p submit enqueue failed since out of memory", pTask->id.taskId, pTask);
|
|
||||||
terrno = TSDB_CODE_OUT_OF_MEMORY;
|
|
||||||
atomic_store_8(&pTask->inputStatus, TASK_INPUT_STATUS__FAILED);
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
int32_t numOfBlocks = taosQueueItemSize(pTask->inputQueue->queue) + 1;
|
|
||||||
double size = taosQueueMemorySize(pTask->inputQueue->queue) / 1048576.0;
|
|
||||||
|
|
||||||
qDebug("s-task:%s submit enqueue msgLen:%d ver:%" PRId64 ", total in queue:%d, size:%.2fMiB", pTask->id.idStr,
|
qDebug("s-task:%s submit enqueue msgLen:%d ver:%" PRId64 ", total in queue:%d, size:%.2fMiB", pTask->id.idStr,
|
||||||
pSubmitBlock->submit.msgLen, pSubmitBlock->submit.ver, numOfBlocks, size);
|
pSubmitBlock->submit.msgLen, pSubmitBlock->submit.ver, total, size);
|
||||||
|
|
||||||
if ((pTask->taskLevel == TASK_LEVEL__SOURCE) &&
|
if ((pTask->taskLevel == TASK_LEVEL__SOURCE) && (tInputQueueIsFull(pTask))) {
|
||||||
(numOfBlocks > STREAM_TASK_INPUT_QUEUEU_CAPACITY || (size >= STREAM_TASK_INPUT_QUEUEU_CAPACITY_IN_SIZE))) {
|
|
||||||
qError("s-task:%s input queue is full, capacity(size:%d num:%dMiB), current(blocks:%d, size:%.2fMiB) abort", pTask->id.idStr,
|
qError("s-task:%s input queue is full, capacity(size:%d num:%dMiB), current(blocks:%d, size:%.2fMiB) abort", pTask->id.idStr,
|
||||||
STREAM_TASK_INPUT_QUEUEU_CAPACITY, STREAM_TASK_INPUT_QUEUEU_CAPACITY_IN_SIZE,
|
STREAM_TASK_INPUT_QUEUEU_CAPACITY, STREAM_TASK_INPUT_QUEUEU_CAPACITY_IN_SIZE,
|
||||||
numOfBlocks, size);
|
total, size);
|
||||||
streamDataSubmitDestroy(pSubmitBlock);
|
streamDataSubmitDestroy(pSubmitBlock);
|
||||||
|
taosFreeQitem(pSubmitBlock);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -315,10 +311,8 @@ int32_t tAppendDataToInputQueue(SStreamTask* pTask, SStreamQueueItem* pItem) {
|
||||||
} else if (type == STREAM_INPUT__DATA_BLOCK || type == STREAM_INPUT__DATA_RETRIEVE ||
|
} else if (type == STREAM_INPUT__DATA_BLOCK || type == STREAM_INPUT__DATA_RETRIEVE ||
|
||||||
type == STREAM_INPUT__REF_DATA_BLOCK) {
|
type == STREAM_INPUT__REF_DATA_BLOCK) {
|
||||||
int32_t numOfBlocks = taosQueueItemSize(pTask->inputQueue->queue) + 1;
|
int32_t numOfBlocks = taosQueueItemSize(pTask->inputQueue->queue) + 1;
|
||||||
double size = taosQueueMemorySize(pTask->inputQueue->queue) / 1048576.0;
|
|
||||||
|
|
||||||
if ((pTask->taskLevel == TASK_LEVEL__SOURCE) &&
|
if ((pTask->taskLevel == TASK_LEVEL__SOURCE) && (tInputQueueIsFull(pTask))) {
|
||||||
(numOfBlocks > STREAM_TASK_INPUT_QUEUEU_CAPACITY || (size >= STREAM_TASK_INPUT_QUEUEU_CAPACITY_IN_SIZE))) {
|
|
||||||
qError("s-task:%s input queue is full, capacity:%d size:%d MiB, current(blocks:%d, size:%.2fMiB) abort",
|
qError("s-task:%s input queue is full, capacity:%d size:%d MiB, current(blocks:%d, size:%.2fMiB) abort",
|
||||||
pTask->id.idStr, STREAM_TASK_INPUT_QUEUEU_CAPACITY, STREAM_TASK_INPUT_QUEUEU_CAPACITY_IN_SIZE, numOfBlocks,
|
pTask->id.idStr, STREAM_TASK_INPUT_QUEUEU_CAPACITY, STREAM_TASK_INPUT_QUEUEU_CAPACITY_IN_SIZE, numOfBlocks,
|
||||||
size);
|
size);
|
||||||
|
|
|
@ -200,13 +200,7 @@ void streamFreeQitem(SStreamQueueItem* data) {
|
||||||
taosFreeQitem(pMerge);
|
taosFreeQitem(pMerge);
|
||||||
} else if (type == STREAM_INPUT__REF_DATA_BLOCK) {
|
} else if (type == STREAM_INPUT__REF_DATA_BLOCK) {
|
||||||
SStreamRefDataBlock* pRefBlock = (SStreamRefDataBlock*)data;
|
SStreamRefDataBlock* pRefBlock = (SStreamRefDataBlock*)data;
|
||||||
|
blockDataDestroy(pRefBlock->pBlock);
|
||||||
int32_t ref = atomic_sub_fetch_32(pRefBlock->dataRef, 1);
|
|
||||||
ASSERT(ref >= 0);
|
|
||||||
if (ref == 0) {
|
|
||||||
blockDataDestroy(pRefBlock->pBlock);
|
|
||||||
taosMemoryFree(pRefBlock->dataRef);
|
|
||||||
}
|
|
||||||
taosFreeQitem(pRefBlock);
|
taosFreeQitem(pRefBlock);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -35,7 +35,7 @@ static int32_t streamTaskExecImpl(SStreamTask* pTask, const void* data, SArray*
|
||||||
|
|
||||||
while (pTask->taskLevel == TASK_LEVEL__SOURCE) {
|
while (pTask->taskLevel == TASK_LEVEL__SOURCE) {
|
||||||
int8_t status = atomic_load_8(&pTask->status.taskStatus);
|
int8_t status = atomic_load_8(&pTask->status.taskStatus);
|
||||||
if (status != TASK_STATUS__NORMAL) {
|
if (status != TASK_STATUS__NORMAL && status != TASK_STATUS__PAUSE) {
|
||||||
qError("stream task wait for the end of fill history, s-task:%s, status:%d", pTask->id.idStr,
|
qError("stream task wait for the end of fill history, s-task:%s, status:%d", pTask->id.idStr,
|
||||||
atomic_load_8(&pTask->status.taskStatus));
|
atomic_load_8(&pTask->status.taskStatus));
|
||||||
taosMsleep(2);
|
taosMsleep(2);
|
||||||
|
@ -67,7 +67,7 @@ static int32_t streamTaskExecImpl(SStreamTask* pTask, const void* data, SArray*
|
||||||
|
|
||||||
SArray* pBlockList = pMerged->submits;
|
SArray* pBlockList = pMerged->submits;
|
||||||
int32_t numOfBlocks = taosArrayGetSize(pBlockList);
|
int32_t numOfBlocks = taosArrayGetSize(pBlockList);
|
||||||
qDebug("s-task:%s %p set submit input (merged), numOfblocks:%d", pTask->id.idStr, pTask, numOfBlocks);
|
qDebug("s-task:%s %p set submit input (merged), batch num:%d", pTask->id.idStr, pTask, numOfBlocks);
|
||||||
qSetMultiStreamInput(pExecutor, pBlockList->pData, numOfBlocks, STREAM_INPUT__MERGED_SUBMIT);
|
qSetMultiStreamInput(pExecutor, pBlockList->pData, numOfBlocks, STREAM_INPUT__MERGED_SUBMIT);
|
||||||
} else if (pItem->type == STREAM_INPUT__REF_DATA_BLOCK) {
|
} else if (pItem->type == STREAM_INPUT__REF_DATA_BLOCK) {
|
||||||
const SStreamRefDataBlock* pRefBlock = (const SStreamRefDataBlock*)data;
|
const SStreamRefDataBlock* pRefBlock = (const SStreamRefDataBlock*)data;
|
||||||
|
@ -408,7 +408,7 @@ int32_t streamTryExec(SStreamTask* pTask) {
|
||||||
atomic_store_8(&pTask->status.schedStatus, TASK_SCHED_STATUS__INACTIVE);
|
atomic_store_8(&pTask->status.schedStatus, TASK_SCHED_STATUS__INACTIVE);
|
||||||
qDebug("s-task:%s exec completed", pTask->id.idStr);
|
qDebug("s-task:%s exec completed", pTask->id.idStr);
|
||||||
|
|
||||||
if (!taosQueueEmpty(pTask->inputQueue->queue) && (!streamTaskShouldStop(&pTask->status))) {
|
if (!taosQueueEmpty(pTask->inputQueue->queue) && (!streamTaskShouldStop(&pTask->status)) && (!streamTaskShouldPause(&pTask->status))) {
|
||||||
streamSchedExec(pTask);
|
streamSchedExec(pTask);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -224,12 +224,19 @@ int32_t streamBuildSourceRecover2Req(SStreamTask* pTask, SStreamRecoverStep2Req*
|
||||||
|
|
||||||
int32_t streamSourceRecoverScanStep2(SStreamTask* pTask, int64_t ver) {
|
int32_t streamSourceRecoverScanStep2(SStreamTask* pTask, int64_t ver) {
|
||||||
void* exec = pTask->exec.pExecutor;
|
void* exec = pTask->exec.pExecutor;
|
||||||
|
const char* id = pTask->id.idStr;
|
||||||
|
|
||||||
qDebug("s-task:%s recover step2 (blocking stage) started", pTask->id.idStr);
|
int64_t st = taosGetTimestampMs();
|
||||||
|
qDebug("s-task:%s recover step2(blocking stage) started", id);
|
||||||
if (qStreamSourceRecoverStep2(exec, ver) < 0) {
|
if (qStreamSourceRecoverStep2(exec, ver) < 0) {
|
||||||
}
|
}
|
||||||
|
|
||||||
return streamScanExec(pTask, 100);
|
int32_t code = streamScanExec(pTask, 100);
|
||||||
|
|
||||||
|
double el = (taosGetTimestampMs() - st) / 1000.0;
|
||||||
|
qDebug("s-task:%s recover step2(blocking stage) ended, elapsed time:%.2fs", id, el);
|
||||||
|
|
||||||
|
return code;
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t streamDispatchRecoverFinishReq(SStreamTask* pTask) {
|
int32_t streamDispatchRecoverFinishReq(SStreamTask* pTask) {
|
||||||
|
|
|
@ -966,7 +966,7 @@ static void cliSendCb(uv_write_t* req, int status) {
|
||||||
}
|
}
|
||||||
|
|
||||||
if (status == 0) {
|
if (status == 0) {
|
||||||
tTrace("%s conn %p data already was written out", CONN_GET_INST_LABEL(pConn), pConn);
|
tDebug("%s conn %p data already was written out", CONN_GET_INST_LABEL(pConn), pConn);
|
||||||
} else {
|
} else {
|
||||||
if (!uv_is_closing((uv_handle_t*)&pConn->stream)) {
|
if (!uv_is_closing((uv_handle_t*)&pConn->stream)) {
|
||||||
tError("%s conn %p failed to write:%s", CONN_GET_INST_LABEL(pConn), pConn, uv_err_name(status));
|
tError("%s conn %p failed to write:%s", CONN_GET_INST_LABEL(pConn), pConn, uv_err_name(status));
|
||||||
|
|
|
@ -236,7 +236,7 @@ static bool uvHandleReq(SSvrConn* pConn) {
|
||||||
if (pConn->status == ConnNormal && pHead->noResp == 0) {
|
if (pConn->status == ConnNormal && pHead->noResp == 0) {
|
||||||
transRefSrvHandle(pConn);
|
transRefSrvHandle(pConn);
|
||||||
if (cost >= EXCEPTION_LIMIT_US) {
|
if (cost >= EXCEPTION_LIMIT_US) {
|
||||||
tGWarn("%s conn %p %s received from %s, local info:%s, len:%d, cost:%dus, recv exception", transLabel(pTransInst),
|
tGDebug("%s conn %p %s received from %s, local info:%s, len:%d, cost:%dus, recv exception", transLabel(pTransInst),
|
||||||
pConn, TMSG_INFO(transMsg.msgType), pConn->dst, pConn->src, msgLen, (int)cost);
|
pConn, TMSG_INFO(transMsg.msgType), pConn->dst, pConn->src, msgLen, (int)cost);
|
||||||
} else {
|
} else {
|
||||||
tGDebug("%s conn %p %s received from %s, local info:%s, len:%d, cost:%dus", transLabel(pTransInst), pConn,
|
tGDebug("%s conn %p %s received from %s, local info:%s, len:%d, cost:%dus", transLabel(pTransInst), pConn,
|
||||||
|
@ -244,7 +244,7 @@ static bool uvHandleReq(SSvrConn* pConn) {
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
if (cost >= EXCEPTION_LIMIT_US) {
|
if (cost >= EXCEPTION_LIMIT_US) {
|
||||||
tGWarn("%s conn %p %s received from %s, local info:%s, len:%d, noResp:%d, code:%d, cost:%dus, recv exception",
|
tGDebug("%s conn %p %s received from %s, local info:%s, len:%d, noResp:%d, code:%d, cost:%dus, recv exception",
|
||||||
transLabel(pTransInst), pConn, TMSG_INFO(transMsg.msgType), pConn->dst, pConn->src, msgLen, pHead->noResp,
|
transLabel(pTransInst), pConn, TMSG_INFO(transMsg.msgType), pConn->dst, pConn->src, msgLen, pHead->noResp,
|
||||||
transMsg.code, (int)(cost));
|
transMsg.code, (int)(cost));
|
||||||
} else {
|
} else {
|
||||||
|
|
|
@ -62,9 +62,6 @@ SWalReader *walOpenReader(SWal *pWal, SWalFilterCond *cond) {
|
||||||
void walCloseReader(SWalReader *pReader) {
|
void walCloseReader(SWalReader *pReader) {
|
||||||
taosCloseFile(&pReader->pIdxFile);
|
taosCloseFile(&pReader->pIdxFile);
|
||||||
taosCloseFile(&pReader->pLogFile);
|
taosCloseFile(&pReader->pLogFile);
|
||||||
/*if (pReader->cond.enableRef) {*/
|
|
||||||
/*taosHashRemove(pReader->pWal->pRefHash, &pReader->readerId, sizeof(int64_t));*/
|
|
||||||
/*}*/
|
|
||||||
taosMemoryFreeClear(pReader->pHead);
|
taosMemoryFreeClear(pReader->pHead);
|
||||||
taosMemoryFree(pReader);
|
taosMemoryFree(pReader);
|
||||||
}
|
}
|
||||||
|
@ -74,22 +71,25 @@ int32_t walNextValidMsg(SWalReader *pReader) {
|
||||||
int64_t lastVer = walGetLastVer(pReader->pWal);
|
int64_t lastVer = walGetLastVer(pReader->pWal);
|
||||||
int64_t committedVer = walGetCommittedVer(pReader->pWal);
|
int64_t committedVer = walGetCommittedVer(pReader->pWal);
|
||||||
int64_t appliedVer = walGetAppliedVer(pReader->pWal);
|
int64_t appliedVer = walGetAppliedVer(pReader->pWal);
|
||||||
|
|
||||||
if(appliedVer < committedVer){ // wait apply ver equal to commit ver, otherwise may lost data when consume data [TD-24010]
|
if(appliedVer < committedVer){ // wait apply ver equal to commit ver, otherwise may lost data when consume data [TD-24010]
|
||||||
wDebug("vgId:%d, wal apply ver:%"PRId64" smaller than commit ver:%"PRId64, pReader->pWal->cfg.vgId, appliedVer, committedVer);
|
wDebug("vgId:%d, wal apply ver:%"PRId64" smaller than commit ver:%"PRId64, pReader->pWal->cfg.vgId, appliedVer, committedVer);
|
||||||
// taosMsleep(10);
|
|
||||||
}
|
}
|
||||||
// int64_t endVer = pReader->cond.scanUncommited ? lastVer : committedVer;
|
|
||||||
int64_t endVer = TMIN(appliedVer, committedVer);
|
int64_t endVer = TMIN(appliedVer, committedVer);
|
||||||
|
|
||||||
wDebug("vgId:%d, wal start to fetch, index:%" PRId64 ", last index:%" PRId64 " commit index:%" PRId64
|
wDebug("vgId:%d, wal start to fetch, index:%" PRId64 ", last index:%" PRId64 " commit index:%" PRId64
|
||||||
", applied index:%" PRId64", end index:%" PRId64,
|
", applied index:%" PRId64", end index:%" PRId64,
|
||||||
pReader->pWal->cfg.vgId, fetchVer, lastVer, committedVer, appliedVer, endVer);
|
pReader->pWal->cfg.vgId, fetchVer, lastVer, committedVer, appliedVer, endVer);
|
||||||
|
|
||||||
while (fetchVer <= endVer) {
|
while (fetchVer <= endVer) {
|
||||||
if (walFetchHeadNew(pReader, fetchVer) < 0) {
|
if (walFetchHeadNew(pReader, fetchVer) < 0) {
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
if (pReader->pHead->head.msgType == TDMT_VND_SUBMIT ||
|
|
||||||
(IS_META_MSG(pReader->pHead->head.msgType) && pReader->cond.scanMeta)) {
|
int32_t type = pReader->pHead->head.msgType;
|
||||||
|
if (type == TDMT_VND_SUBMIT || ((type == TDMT_VND_DELETE) && (pReader->cond.deleteMsg == 1)) ||
|
||||||
|
(IS_META_MSG(type) && pReader->cond.scanMeta)) {
|
||||||
if (walFetchBodyNew(pReader) < 0) {
|
if (walFetchBodyNew(pReader) < 0) {
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
@ -98,9 +98,11 @@ int32_t walNextValidMsg(SWalReader *pReader) {
|
||||||
if (walSkipFetchBodyNew(pReader) < 0) {
|
if (walSkipFetchBodyNew(pReader) < 0) {
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
fetchVer = pReader->curVersion;
|
fetchVer = pReader->curVersion;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -256,7 +258,9 @@ static int32_t walFetchHeadNew(SWalReader *pRead, int64_t fetchVer) {
|
||||||
if (contLen == sizeof(SWalCkHead)) {
|
if (contLen == sizeof(SWalCkHead)) {
|
||||||
break;
|
break;
|
||||||
} else if (contLen == 0 && !seeked) {
|
} else if (contLen == 0 && !seeked) {
|
||||||
walReadSeekVerImpl(pRead, fetchVer);
|
if(walReadSeekVerImpl(pRead, fetchVer) < 0){
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
seeked = true;
|
seeked = true;
|
||||||
continue;
|
continue;
|
||||||
} else {
|
} else {
|
||||||
|
@ -285,6 +289,7 @@ static int32_t walFetchBodyNew(SWalReader *pReader) {
|
||||||
terrno = TSDB_CODE_OUT_OF_MEMORY;
|
terrno = TSDB_CODE_OUT_OF_MEMORY;
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
pReader->pHead = ptr;
|
pReader->pHead = ptr;
|
||||||
pReadHead = &pReader->pHead->head;
|
pReadHead = &pReader->pHead->head;
|
||||||
pReader->capacity = pReadHead->bodyLen;
|
pReader->capacity = pReadHead->bodyLen;
|
||||||
|
@ -300,14 +305,11 @@ static int32_t walFetchBodyNew(SWalReader *pReader) {
|
||||||
pReader->pWal->cfg.vgId, pReader->pHead->head.version, ver);
|
pReader->pWal->cfg.vgId, pReader->pHead->head.version, ver);
|
||||||
terrno = TSDB_CODE_WAL_FILE_CORRUPTED;
|
terrno = TSDB_CODE_WAL_FILE_CORRUPTED;
|
||||||
}
|
}
|
||||||
// pRead->curInvalid = 1;
|
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (walValidBodyCksum(pReader->pHead) != 0) {
|
if (walValidBodyCksum(pReader->pHead) != 0) {
|
||||||
wError("vgId:%d, wal fetch body error:%" PRId64 ", since body checksum not passed", pReader->pWal->cfg.vgId, ver);
|
wError("vgId:%d, wal fetch body error:%" PRId64 ", since body checksum not passed", pReader->pWal->cfg.vgId, ver);
|
||||||
// pRead->curInvalid = 1;
|
|
||||||
|
|
||||||
terrno = TSDB_CODE_WAL_FILE_CORRUPTED;
|
terrno = TSDB_CODE_WAL_FILE_CORRUPTED;
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
@ -363,7 +365,9 @@ int32_t walFetchHead(SWalReader *pRead, int64_t ver, SWalCkHead *pHead) {
|
||||||
if (contLen == sizeof(SWalCkHead)) {
|
if (contLen == sizeof(SWalCkHead)) {
|
||||||
break;
|
break;
|
||||||
} else if (contLen == 0 && !seeked) {
|
} else if (contLen == 0 && !seeked) {
|
||||||
walReadSeekVerImpl(pRead, ver);
|
if(walReadSeekVerImpl(pRead, ver) < 0){
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
seeked = true;
|
seeked = true;
|
||||||
continue;
|
continue;
|
||||||
} else {
|
} else {
|
||||||
|
@ -497,7 +501,10 @@ int32_t walReadVer(SWalReader *pReader, int64_t ver) {
|
||||||
if (contLen == sizeof(SWalCkHead)) {
|
if (contLen == sizeof(SWalCkHead)) {
|
||||||
break;
|
break;
|
||||||
} else if (contLen == 0 && !seeked) {
|
} else if (contLen == 0 && !seeked) {
|
||||||
walReadSeekVerImpl(pReader, ver);
|
if(walReadSeekVerImpl(pReader, ver) < 0){
|
||||||
|
taosThreadMutexUnlock(&pReader->mutex);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
seeked = true;
|
seeked = true;
|
||||||
continue;
|
continue;
|
||||||
} else {
|
} else {
|
||||||
|
|
|
@ -45,7 +45,7 @@ void walCloseRef(SWal *pWal, int64_t refId) {
|
||||||
taosMemoryFree(pRef);
|
taosMemoryFree(pRef);
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t walRefVer(SWalRef *pRef, int64_t ver) {
|
int32_t walSetRefVer(SWalRef *pRef, int64_t ver) {
|
||||||
SWal *pWal = pRef->pWal;
|
SWal *pWal = pRef->pWal;
|
||||||
wDebug("vgId:%d, wal ref version %" PRId64 ", refId %" PRId64, pWal->cfg.vgId, ver, pRef->refId);
|
wDebug("vgId:%d, wal ref version %" PRId64 ", refId %" PRId64, pWal->cfg.vgId, ver, pRef->refId);
|
||||||
if (pRef->refVer != ver) {
|
if (pRef->refVer != ver) {
|
||||||
|
@ -57,26 +57,12 @@ int32_t walRefVer(SWalRef *pRef, int64_t ver) {
|
||||||
}
|
}
|
||||||
|
|
||||||
pRef->refVer = ver;
|
pRef->refVer = ver;
|
||||||
// bsearch in fileSet
|
|
||||||
// SWalFileInfo tmpInfo;
|
|
||||||
// tmpInfo.firstVer = ver;
|
|
||||||
// SWalFileInfo *pRet = taosArraySearch(pWal->fileInfoSet, &tmpInfo, compareWalFileInfo, TD_LE);
|
|
||||||
// ASSERT(pRet != NULL);
|
|
||||||
// pRef->refFile = pRet->firstVer;
|
|
||||||
|
|
||||||
taosThreadMutexUnlock(&pWal->mutex);
|
taosThreadMutexUnlock(&pWal->mutex);
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
#if 1
|
|
||||||
void walUnrefVer(SWalRef *pRef) {
|
|
||||||
pRef->refId = -1;
|
|
||||||
// pRef->refFile = -1;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
SWalRef *walRefFirstVer(SWal *pWal, SWalRef *pRef) {
|
SWalRef *walRefFirstVer(SWal *pWal, SWalRef *pRef) {
|
||||||
if (pRef == NULL) {
|
if (pRef == NULL) {
|
||||||
pRef = walOpenRef(pWal);
|
pRef = walOpenRef(pWal);
|
||||||
|
@ -87,12 +73,6 @@ SWalRef *walRefFirstVer(SWal *pWal, SWalRef *pRef) {
|
||||||
taosThreadMutexLock(&pWal->mutex);
|
taosThreadMutexLock(&pWal->mutex);
|
||||||
int64_t ver = walGetFirstVer(pWal);
|
int64_t ver = walGetFirstVer(pWal);
|
||||||
pRef->refVer = ver;
|
pRef->refVer = ver;
|
||||||
// bsearch in fileSet
|
|
||||||
// SWalFileInfo tmpInfo;
|
|
||||||
// tmpInfo.firstVer = ver;
|
|
||||||
// SWalFileInfo *pRet = taosArraySearch(pWal->fileInfoSet, &tmpInfo, compareWalFileInfo, TD_LE);
|
|
||||||
// ASSERT(pRet != NULL);
|
|
||||||
// pRef->refFile = pRet->firstVer;
|
|
||||||
|
|
||||||
taosThreadMutexUnlock(&pWal->mutex);
|
taosThreadMutexUnlock(&pWal->mutex);
|
||||||
wDebug("vgId:%d, wal ref version %" PRId64 " for first", pWal->cfg.vgId, ver);
|
wDebug("vgId:%d, wal ref version %" PRId64 " for first", pWal->cfg.vgId, ver);
|
||||||
|
|
|
@ -316,6 +316,10 @@ SArray* taosArrayFromList(const void* src, size_t size, size_t elemSize) {
|
||||||
}
|
}
|
||||||
|
|
||||||
SArray* taosArrayDup(const SArray* pSrc, __array_item_dup_fn_t fn) {
|
SArray* taosArrayDup(const SArray* pSrc, __array_item_dup_fn_t fn) {
|
||||||
|
if (NULL == pSrc) {
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
if (pSrc->size == 0) { // empty array list
|
if (pSrc->size == 0) { // empty array list
|
||||||
return taosArrayInit(8, pSrc->elemSize);
|
return taosArrayInit(8, pSrc->elemSize);
|
||||||
}
|
}
|
||||||
|
|
|
@ -912,11 +912,11 @@ int32_t tsCompressDoubleImp(const char *const input, const int32_t nelements, ch
|
||||||
return opos;
|
return opos;
|
||||||
}
|
}
|
||||||
|
|
||||||
uint64_t decodeDoubleValue(const char *const input, int32_t *const ipos, uint8_t flag) {
|
FORCE_INLINE uint64_t decodeDoubleValue(const char *const input, int32_t *const ipos, uint8_t flag) {
|
||||||
uint64_t diff = 0ul;
|
uint64_t diff = 0ul;
|
||||||
int32_t nbytes = (flag & INT8MASK(3)) + 1;
|
int32_t nbytes = (flag & 0x7) + 1;
|
||||||
for (int32_t i = 0; i < nbytes; i++) {
|
for (int32_t i = 0; i < nbytes; i++) {
|
||||||
diff = diff | ((INT64MASK(8) & input[(*ipos)++]) << BITS_PER_BYTE * i);
|
diff |= (((uint64_t)0xff & input[(*ipos)++]) << BITS_PER_BYTE * i);
|
||||||
}
|
}
|
||||||
int32_t shift_width = (LONG_BYTES * BITS_PER_BYTE - nbytes * BITS_PER_BYTE) * (flag >> 3);
|
int32_t shift_width = (LONG_BYTES * BITS_PER_BYTE - nbytes * BITS_PER_BYTE) * (flag >> 3);
|
||||||
diff <<= shift_width;
|
diff <<= shift_width;
|
||||||
|
@ -936,25 +936,22 @@ int32_t tsDecompressDoubleImp(const char *const input, const int32_t nelements,
|
||||||
uint8_t flags = 0;
|
uint8_t flags = 0;
|
||||||
int32_t ipos = 1;
|
int32_t ipos = 1;
|
||||||
int32_t opos = 0;
|
int32_t opos = 0;
|
||||||
uint64_t prev_value = 0;
|
uint64_t diff = 0;
|
||||||
|
union {
|
||||||
|
uint64_t bits;
|
||||||
|
double real;
|
||||||
|
} curr;
|
||||||
|
|
||||||
|
curr.bits = 0;
|
||||||
|
|
||||||
for (int32_t i = 0; i < nelements; i++) {
|
for (int32_t i = 0; i < nelements; i++) {
|
||||||
if ((i & 0x01) == 0) {
|
if ((i & 0x01) == 0) {
|
||||||
flags = input[ipos++];
|
flags = input[ipos++];
|
||||||
}
|
}
|
||||||
|
|
||||||
uint8_t flag = flags & INT8MASK(4);
|
diff = decodeDoubleValue(input, &ipos, flags & 0x0f);
|
||||||
flags >>= 4;
|
flags >>= 4;
|
||||||
|
curr.bits ^= diff;
|
||||||
uint64_t diff = decodeDoubleValue(input, &ipos, flag);
|
|
||||||
union {
|
|
||||||
uint64_t bits;
|
|
||||||
double real;
|
|
||||||
} curr;
|
|
||||||
|
|
||||||
uint64_t predicted = prev_value;
|
|
||||||
curr.bits = predicted ^ diff;
|
|
||||||
prev_value = curr.bits;
|
|
||||||
|
|
||||||
ostream[opos++] = curr.real;
|
ostream[opos++] = curr.real;
|
||||||
}
|
}
|
||||||
|
|
|
@ -664,7 +664,7 @@ static int32_t taosPushLogBuffer(SLogBuff *pLogBuf, const char *msg, int32_t msg
|
||||||
int32_t end = 0;
|
int32_t end = 0;
|
||||||
int32_t remainSize = 0;
|
int32_t remainSize = 0;
|
||||||
static int64_t lostLine = 0;
|
static int64_t lostLine = 0;
|
||||||
char tmpBuf[128] = {0};
|
char tmpBuf[128];
|
||||||
int32_t tmpBufLen = 0;
|
int32_t tmpBufLen = 0;
|
||||||
|
|
||||||
if (pLogBuf == NULL || pLogBuf->stop) return -1;
|
if (pLogBuf == NULL || pLogBuf->stop) return -1;
|
||||||
|
|
|
@ -495,7 +495,8 @@
|
||||||
,,y,system-test,./pytest.sh python3 ./test.py -f 7-tmq/stbFilter.py
|
,,y,system-test,./pytest.sh python3 ./test.py -f 7-tmq/stbFilter.py
|
||||||
,,y,system-test,./pytest.sh python3 ./test.py -f 7-tmq/tmqCheckData.py
|
,,y,system-test,./pytest.sh python3 ./test.py -f 7-tmq/tmqCheckData.py
|
||||||
,,y,system-test,./pytest.sh python3 ./test.py -f 7-tmq/tmqCheckData1.py
|
,,y,system-test,./pytest.sh python3 ./test.py -f 7-tmq/tmqCheckData1.py
|
||||||
,,y,system-test,./pytest.sh python3 ./test.py -f 7-tmq/tmqConsumerGroup.py
|
#,,y,system-test,./pytest.sh python3 ./test.py -f 7-tmq/tmqConsumerGroup.py
|
||||||
|
,,n,system-test,python3 ./test.py -f 7-tmq/tmqConsumerGroup.py
|
||||||
,,y,system-test,./pytest.sh python3 ./test.py -f 7-tmq/tmqAlterSchema.py
|
,,y,system-test,./pytest.sh python3 ./test.py -f 7-tmq/tmqAlterSchema.py
|
||||||
,,y,system-test,./pytest.sh python3 ./test.py -f 7-tmq/tmqConsFromTsdb.py -N 3 -n 3
|
,,y,system-test,./pytest.sh python3 ./test.py -f 7-tmq/tmqConsFromTsdb.py -N 3 -n 3
|
||||||
,,y,system-test,./pytest.sh python3 ./test.py -f 7-tmq/tmqConsFromTsdb1.py -N 3 -n 3
|
,,y,system-test,./pytest.sh python3 ./test.py -f 7-tmq/tmqConsFromTsdb1.py -N 3 -n 3
|
||||||
|
@ -535,6 +536,7 @@
|
||||||
,,y,system-test,./pytest.sh python3 ./test.py -f 7-tmq/tmq3mnodeSwitch.py -N 6 -M 3 -n 3
|
,,y,system-test,./pytest.sh python3 ./test.py -f 7-tmq/tmq3mnodeSwitch.py -N 6 -M 3 -n 3
|
||||||
,,y,system-test,./pytest.sh python3 ./test.py -f 99-TDcase/TD-19201.py
|
,,y,system-test,./pytest.sh python3 ./test.py -f 99-TDcase/TD-19201.py
|
||||||
,,y,system-test,./pytest.sh python3 ./test.py -f 99-TDcase/TD-21561.py
|
,,y,system-test,./pytest.sh python3 ./test.py -f 99-TDcase/TD-21561.py
|
||||||
|
,,y,system-test,./pytest.sh python3 ./test.py -f 99-TDcase/TS-3404.py
|
||||||
|
|
||||||
,,y,system-test,./pytest.sh python3 ./test.py -f 0-others/balance_vgroups_r1.py -N 6
|
,,y,system-test,./pytest.sh python3 ./test.py -f 0-others/balance_vgroups_r1.py -N 6
|
||||||
,,y,system-test,./pytest.sh python3 ./test.py -f 0-others/taosShell.py
|
,,y,system-test,./pytest.sh python3 ./test.py -f 0-others/taosShell.py
|
||||||
|
|
|
@ -657,36 +657,33 @@ if $data20 != null then
|
||||||
return -1
|
return -1
|
||||||
endi
|
endi
|
||||||
|
|
||||||
#print =============== error for normal table
|
print =============== error for normal table
|
||||||
#sql create table tb2023(ts timestamp, f int);
|
sql create table tb2023(ts timestamp, f int);
|
||||||
#sql_error alter table tb2023 add column v varchar(65535);
|
sql_error alter table tb2023 add column v varchar(65518);
|
||||||
#sql_error alter table tb2023 add column v varchar(65535);
|
sql_error alter table tb2023 add column v varchar(65531);
|
||||||
#sql_error alter table tb2023 add column v varchar(65530);
|
sql_error alter table tb2023 add column v varchar(65535);
|
||||||
#sql alter table tb2023 add column v varchar(16374);
|
sql alter table tb2023 add column v varchar(65517);
|
||||||
#sql_error alter table tb2023 modify column v varchar(65536);
|
sql_error alter table tb2023 modify column v varchar(65518);
|
||||||
#sql desc tb2023
|
sql desc tb2023
|
||||||
#sql alter table tb2023 drop column v
|
sql alter table tb2023 drop column v
|
||||||
#sql_error alter table tb2023 add column v nchar(16384);
|
sql_error alter table tb2023 add column v nchar(16380);
|
||||||
#sql alter table tb2023 add column v nchar(4093);
|
sql alter table tb2023 add column v nchar(16379);
|
||||||
#sql_error alter table tb2023 modify column v nchar(16384);
|
sql_error alter table tb2023 modify column v nchar(16380);
|
||||||
#sql_error alter table tb2023 add column v nchar(16384);
|
sql desc tb2023
|
||||||
#sql alter table tb2023 drop column v
|
|
||||||
#sql alter table tb2023 add column v nchar(16374);
|
print =============== error for super table
|
||||||
#sql desc tb2023
|
sql create table stb2023(ts timestamp, f int) tags(t1 int);
|
||||||
#
|
sql_error alter table stb2023 add column v varchar(65518);
|
||||||
#print =============== error for super table
|
sql_error alter table stb2023 add column v varchar(65531);
|
||||||
#sql create table stb2023(ts timestamp, f int) tags(t1 int);
|
sql_error alter table stb2023 add column v varchar(65535);
|
||||||
#sql_error alter table stb2023 add column v varchar(65535);
|
sql alter table stb2023 add column v varchar(65517);
|
||||||
#sql_error alter table stb2023 add column v varchar(65536);
|
sql_error alter table stb2023 modify column v varchar(65518);
|
||||||
#sql_error alter table stb2023 add column v varchar(33100);
|
sql desc stb2023
|
||||||
#sql alter table stb2023 add column v varchar(16374);
|
sql alter table stb2023 drop column v
|
||||||
#sql_error alter table stb2023 modify column v varchar(16375);
|
sql_error alter table stb2023 add column v nchar(16380);
|
||||||
#sql desc stb2023
|
sql alter table stb2023 add column v nchar(16379);
|
||||||
#sql alter table stb2023 drop column v
|
sql_error alter table stb2023 modify column v nchar(16380);
|
||||||
#sql_error alter table stb2023 add column v nchar(4094);
|
sql desc stb2023
|
||||||
#sql alter table stb2023 add column v nchar(4093);
|
|
||||||
#sql_error alter table stb2023 modify column v nchar(4094);
|
|
||||||
#sql desc stb2023
|
|
||||||
|
|
||||||
print ======= over
|
print ======= over
|
||||||
sql drop database d1
|
sql drop database d1
|
||||||
|
|
|
@ -48,7 +48,7 @@ sql_error alter table tb modify column c2 binary(10);
|
||||||
sql_error alter table tb modify column c2 binary(9);
|
sql_error alter table tb modify column c2 binary(9);
|
||||||
sql_error alter table tb modify column c2 binary(-9);
|
sql_error alter table tb modify column c2 binary(-9);
|
||||||
sql_error alter table tb modify column c2 binary(0);
|
sql_error alter table tb modify column c2 binary(0);
|
||||||
sql_error alter table tb modify column c2 binary(65600);
|
sql_error alter table tb modify column c2 binary(65436);
|
||||||
sql_error alter table tb modify column c2 nchar(30);
|
sql_error alter table tb modify column c2 nchar(30);
|
||||||
sql_error alter table tb modify column c3 double;
|
sql_error alter table tb modify column c3 double;
|
||||||
sql_error alter table tb modify column c3 nchar(10);
|
sql_error alter table tb modify column c3 nchar(10);
|
||||||
|
|
|
@ -103,7 +103,14 @@ endi
|
||||||
if $data62 != 5 then
|
if $data62 != 5 then
|
||||||
return -1
|
return -1
|
||||||
endi
|
endi
|
||||||
|
sql select count(table_name) from information_schema.ins_tables where db_name='db1' and stable_name='sta' group by stable_name
|
||||||
|
print $rows , $data00
|
||||||
|
if $rows != 1 then
|
||||||
|
return -1
|
||||||
|
endi
|
||||||
|
if $data00 != 8 then
|
||||||
|
return -1
|
||||||
|
endi
|
||||||
sql select distinct db_name from information_schema.ins_tables;
|
sql select distinct db_name from information_schema.ins_tables;
|
||||||
print $rows
|
print $rows
|
||||||
if $rows != 4 then
|
if $rows != 4 then
|
||||||
|
|
|
@ -145,29 +145,25 @@ class TMQCom:
|
||||||
processID = subprocess.check_output(psCmd, shell=True).decode("utf-8")
|
processID = subprocess.check_output(psCmd, shell=True).decode("utf-8")
|
||||||
tdLog.debug("%s is stopped by kill -INT" % (processorName))
|
tdLog.debug("%s is stopped by kill -INT" % (processorName))
|
||||||
|
|
||||||
def getStartConsumeNotifyFromTmqsim(self,cdbName='cdb'):
|
def getStartConsumeNotifyFromTmqsim(self,cdbName='cdb',rows=1):
|
||||||
loopFlag = 1
|
loopFlag = 1
|
||||||
while loopFlag:
|
while loopFlag:
|
||||||
tdSql.query("select * from %s.notifyinfo"%cdbName)
|
tdSql.query("select * from %s.notifyinfo where cmdid = 0"%cdbName)
|
||||||
#tdLog.info("row: %d, %l64d, %l64d"%(tdSql.getData(0, 1),tdSql.getData(0, 2),tdSql.getData(0, 3))
|
|
||||||
actRows = tdSql.getRows()
|
actRows = tdSql.getRows()
|
||||||
for i in range(actRows):
|
tdLog.info("row: %d"%(actRows))
|
||||||
if tdSql.getData(i, 1) == 0:
|
if (actRows >= rows):
|
||||||
loopFlag = 0
|
loopFlag = 0
|
||||||
break
|
|
||||||
time.sleep(0.02)
|
time.sleep(0.02)
|
||||||
return
|
return
|
||||||
|
|
||||||
def getStartCommitNotifyFromTmqsim(self,cdbName='cdb'):
|
def getStartCommitNotifyFromTmqsim(self,cdbName='cdb',rows=1):
|
||||||
loopFlag = 1
|
loopFlag = 1
|
||||||
while loopFlag:
|
while loopFlag:
|
||||||
tdSql.query("select * from %s.notifyinfo"%cdbName)
|
tdSql.query("select * from %s.notifyinfo where cmdid = 1"%cdbName)
|
||||||
#tdLog.info("row: %d, %l64d, %l64d"%(tdSql.getData(0, 1),tdSql.getData(0, 2),tdSql.getData(0, 3))
|
|
||||||
actRows = tdSql.getRows()
|
actRows = tdSql.getRows()
|
||||||
for i in range(actRows):
|
tdLog.info("row: %d"%(actRows))
|
||||||
if tdSql.getData(i, 1) == 1:
|
if (actRows >= rows):
|
||||||
loopFlag = 0
|
loopFlag = 0
|
||||||
break
|
|
||||||
time.sleep(0.02)
|
time.sleep(0.02)
|
||||||
return
|
return
|
||||||
|
|
||||||
|
|
|
@ -100,7 +100,7 @@ class TDTestCase:
|
||||||
|
|
||||||
tdLog.info("wait consumer commit notify")
|
tdLog.info("wait consumer commit notify")
|
||||||
# tmqCom.getStartCommitNotifyFromTmqsim(rows=4)
|
# tmqCom.getStartCommitNotifyFromTmqsim(rows=4)
|
||||||
tmqCom.getStartConsumeNotifyFromTmqsim()
|
tmqCom.getStartConsumeNotifyFromTmqsim(rows=2)
|
||||||
|
|
||||||
tdLog.info("pkill one consume processor")
|
tdLog.info("pkill one consume processor")
|
||||||
tmqCom.stopTmqSimProcess('tmq_sim_new')
|
tmqCom.stopTmqSimProcess('tmq_sim_new')
|
||||||
|
|
|
@ -0,0 +1,101 @@
|
||||||
|
import taos
|
||||||
|
import sys
|
||||||
|
import time
|
||||||
|
import socket
|
||||||
|
import os
|
||||||
|
import threading
|
||||||
|
|
||||||
|
from util.log import *
|
||||||
|
from util.sql import *
|
||||||
|
from util.cases import *
|
||||||
|
from util.dnodes import *
|
||||||
|
|
||||||
|
class TDTestCase:
|
||||||
|
hostname = socket.gethostname()
|
||||||
|
|
||||||
|
def init(self, conn, logSql, replicaVar=1):
|
||||||
|
self.replicaVar = int(replicaVar)
|
||||||
|
tdLog.debug(f"start to excute {__file__}")
|
||||||
|
#tdSql.init(conn.cursor())
|
||||||
|
tdSql.init(conn.cursor(), logSql) # output sql.txt file
|
||||||
|
|
||||||
|
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 create_tables(self):
|
||||||
|
tdSql.execute(f"CREATE STABLE `stb5` (`ts` TIMESTAMP, `ip_value` FLOAT, `ip_quality` INT) TAGS (`t1` INT)")
|
||||||
|
tdSql.execute(f"CREATE TABLE `t_11` USING `stb5` (`t1`) TAGS (1)")
|
||||||
|
|
||||||
|
def insert_data(self):
|
||||||
|
tdLog.debug("start to insert data ............")
|
||||||
|
|
||||||
|
tdSql.execute(f"INSERT INTO `t_11` VALUES ('2023-05-10 09:30:47.722', 10.30000, 100)")
|
||||||
|
tdSql.execute(f"INSERT INTO `t_11` VALUES ('2023-05-10 09:30:56.383', 12.30000, 100)")
|
||||||
|
tdSql.execute(f"INSERT INTO `t_11` VALUES ('2023-05-10 09:48:55.778', 13.30000, 100)")
|
||||||
|
tdSql.execute(f"INSERT INTO `t_11` VALUES ('2023-05-10 09:51:50.821', 9.30000, 100)")
|
||||||
|
tdSql.execute(f"INSERT INTO `t_11` VALUES ('2023-05-10 09:58:07.162', 9.30000, 100)")
|
||||||
|
tdSql.execute(f"INSERT INTO `t_11` VALUES ('2023-05-10 13:41:16.075', 9.30000, 100)")
|
||||||
|
tdSql.execute(f"INSERT INTO `t_11` VALUES ('2023-05-13 14:12:58.318', 21.00000, 100)")
|
||||||
|
tdSql.execute(f"INSERT INTO `t_11` VALUES ('2023-05-13 14:13:21.328', 1.10000, 100)")
|
||||||
|
tdSql.execute(f"INSERT INTO `t_11` VALUES ('2023-05-13 14:35:24.258', 1.30000, 100)")
|
||||||
|
tdSql.execute(f"INSERT INTO `t_11` VALUES ('2023-05-13 16:56:49.033', 1.80000, 100)")
|
||||||
|
|
||||||
|
tdLog.debug("insert data ............ [OK]")
|
||||||
|
|
||||||
|
def run(self):
|
||||||
|
tdSql.prepare()
|
||||||
|
self.create_tables()
|
||||||
|
self.insert_data()
|
||||||
|
tdLog.printNoPrefix("======== test TS-3404")
|
||||||
|
|
||||||
|
tdSql.query(f"select _irowts, interp(ip_value) from t_11 range('2023-05-13 14:00:00', '2023-05-13 15:00:00') every(300s) fill(linear);")
|
||||||
|
tdSql.checkRows(13)
|
||||||
|
|
||||||
|
tdSql.checkData(0, 0, '2023-05-13 14:00:00.000')
|
||||||
|
tdSql.checkData(1, 0, '2023-05-13 14:05:00.000')
|
||||||
|
tdSql.checkData(2, 0, '2023-05-13 14:10:00.000')
|
||||||
|
tdSql.checkData(3, 0, '2023-05-13 14:15:00.000')
|
||||||
|
tdSql.checkData(4, 0, '2023-05-13 14:20:00.000')
|
||||||
|
tdSql.checkData(5, 0, '2023-05-13 14:25:00.000')
|
||||||
|
tdSql.checkData(6, 0, '2023-05-13 14:30:00.000')
|
||||||
|
tdSql.checkData(7, 0, '2023-05-13 14:35:00.000')
|
||||||
|
tdSql.checkData(8, 0, '2023-05-13 14:40:00.000')
|
||||||
|
tdSql.checkData(9, 0, '2023-05-13 14:45:00.000')
|
||||||
|
tdSql.checkData(10, 0, '2023-05-13 14:50:00.000')
|
||||||
|
tdSql.checkData(11, 0, '2023-05-13 14:55:00.000')
|
||||||
|
tdSql.checkData(12, 0, '2023-05-13 15:00:00.000')
|
||||||
|
|
||||||
|
tdSql.checkData(0, 1, 20.96512)
|
||||||
|
tdSql.checkData(1, 1, 20.97857)
|
||||||
|
tdSql.checkData(2, 1, 20.99201)
|
||||||
|
tdSql.checkData(3, 1, 1.114917)
|
||||||
|
tdSql.checkData(4, 1, 1.160271)
|
||||||
|
tdSql.checkData(5, 1, 1.205625)
|
||||||
|
tdSql.checkData(6, 1, 1.250978)
|
||||||
|
tdSql.checkData(7, 1, 1.296333)
|
||||||
|
tdSql.checkData(8, 1, 1.316249)
|
||||||
|
tdSql.checkData(9, 1, 1.333927)
|
||||||
|
tdSql.checkData(10, 1, 1.351607)
|
||||||
|
tdSql.checkData(11, 1, 1.369285)
|
||||||
|
tdSql.checkData(12, 1, 1.386964)
|
||||||
|
|
||||||
|
|
||||||
|
def stop(self):
|
||||||
|
tdSql.close()
|
||||||
|
tdLog.success(f"{__file__} successfully executed")
|
||||||
|
|
||||||
|
tdCases.addLinux(__file__, TDTestCase())
|
||||||
|
tdCases.addWindows(__file__, TDTestCase())
|
Loading…
Reference in New Issue