Merge branch '3.0' into feature/showdnodevariables
This commit is contained in:
commit
4a8c9db884
|
@ -168,7 +168,7 @@ typedef struct {
|
||||||
int32_t vgId;
|
int32_t vgId;
|
||||||
char* dbFName;
|
char* dbFName;
|
||||||
char* tbName;
|
char* tbName;
|
||||||
} SBuildTableMetaInput;
|
} SBuildTableInput;
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
char db[TSDB_DB_FNAME_LEN];
|
char db[TSDB_DB_FNAME_LEN];
|
||||||
|
@ -444,6 +444,7 @@ typedef struct {
|
||||||
char* comment;
|
char* comment;
|
||||||
char* pAst1;
|
char* pAst1;
|
||||||
char* pAst2;
|
char* pAst2;
|
||||||
|
SArray* pFuncs;
|
||||||
} SMCreateStbReq;
|
} SMCreateStbReq;
|
||||||
|
|
||||||
int32_t tSerializeSMCreateStbReq(void* buf, int32_t bufLen, SMCreateStbReq* pReq);
|
int32_t tSerializeSMCreateStbReq(void* buf, int32_t bufLen, SMCreateStbReq* pReq);
|
||||||
|
@ -667,6 +668,41 @@ int32_t tSerializeSQueryTableRsp(void* buf, int32_t bufLen, SQueryTableRsp* pRsp
|
||||||
|
|
||||||
int32_t tDeserializeSQueryTableRsp(void* buf, int32_t bufLen, SQueryTableRsp* pRsp);
|
int32_t tDeserializeSQueryTableRsp(void* buf, int32_t bufLen, SQueryTableRsp* pRsp);
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
SMsgHead header;
|
||||||
|
char dbFName[TSDB_DB_FNAME_LEN];
|
||||||
|
char tbName[TSDB_TABLE_NAME_LEN];
|
||||||
|
} STableCfgReq;
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
char tbName[TSDB_TABLE_NAME_LEN];
|
||||||
|
char stbName[TSDB_TABLE_NAME_LEN];
|
||||||
|
char dbFName[TSDB_DB_FNAME_LEN];
|
||||||
|
int32_t numOfTags;
|
||||||
|
int32_t numOfColumns;
|
||||||
|
int8_t tableType;
|
||||||
|
int64_t delay1;
|
||||||
|
int64_t delay2;
|
||||||
|
int64_t watermark1;
|
||||||
|
int64_t watermark2;
|
||||||
|
int32_t ttl;
|
||||||
|
SArray* pFuncs;
|
||||||
|
int32_t commentLen;
|
||||||
|
char* pComment;
|
||||||
|
SSchema* pSchemas;
|
||||||
|
int32_t tagsLen;
|
||||||
|
char* pTags;
|
||||||
|
} STableCfg;
|
||||||
|
|
||||||
|
typedef STableCfg STableCfgRsp;
|
||||||
|
|
||||||
|
int32_t tSerializeSTableCfgReq(void *buf, int32_t bufLen, STableCfgReq *pReq);
|
||||||
|
int32_t tDeserializeSTableCfgReq(void *buf, int32_t bufLen, STableCfgReq *pReq);
|
||||||
|
|
||||||
|
int32_t tSerializeSTableCfgRsp(void *buf, int32_t bufLen, STableCfgRsp *pRsp);
|
||||||
|
int32_t tDeserializeSTableCfgRsp(void *buf, int32_t bufLen, STableCfgRsp *pRsp);
|
||||||
|
void tFreeSTableCfgRsp(STableCfgRsp *pRsp);
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
char db[TSDB_DB_FNAME_LEN];
|
char db[TSDB_DB_FNAME_LEN];
|
||||||
int32_t numOfVgroups;
|
int32_t numOfVgroups;
|
||||||
|
|
|
@ -132,6 +132,7 @@ enum {
|
||||||
TD_DEF_MSG_TYPE(TDMT_MND_DROP_INDEX, "drop-index", NULL, NULL)
|
TD_DEF_MSG_TYPE(TDMT_MND_DROP_INDEX, "drop-index", NULL, NULL)
|
||||||
TD_DEF_MSG_TYPE(TDMT_MND_GET_INDEX, "get-index", NULL, NULL)
|
TD_DEF_MSG_TYPE(TDMT_MND_GET_INDEX, "get-index", NULL, NULL)
|
||||||
TD_DEF_MSG_TYPE(TDMT_MND_GET_TABLE_INDEX, "get-table-index", NULL, NULL)
|
TD_DEF_MSG_TYPE(TDMT_MND_GET_TABLE_INDEX, "get-table-index", NULL, NULL)
|
||||||
|
TD_DEF_MSG_TYPE(TDMT_MND_TABLE_CFG, "table-cfg", NULL, NULL)
|
||||||
TD_DEF_MSG_TYPE(TDMT_MND_CREATE_TOPIC, "create-topic", SMCreateTopicReq, SMCreateTopicRsp)
|
TD_DEF_MSG_TYPE(TDMT_MND_CREATE_TOPIC, "create-topic", SMCreateTopicReq, SMCreateTopicRsp)
|
||||||
TD_DEF_MSG_TYPE(TDMT_MND_ALTER_TOPIC, "alter-topic", NULL, NULL)
|
TD_DEF_MSG_TYPE(TDMT_MND_ALTER_TOPIC, "alter-topic", NULL, NULL)
|
||||||
TD_DEF_MSG_TYPE(TDMT_MND_DROP_TOPIC, "drop-topic", NULL, NULL)
|
TD_DEF_MSG_TYPE(TDMT_MND_DROP_TOPIC, "drop-topic", NULL, NULL)
|
||||||
|
@ -172,6 +173,7 @@ enum {
|
||||||
TD_DEF_MSG_TYPE(TDMT_VND_UPDATE_TAG_VAL, "update-tag-val", NULL, NULL)
|
TD_DEF_MSG_TYPE(TDMT_VND_UPDATE_TAG_VAL, "update-tag-val", NULL, NULL)
|
||||||
TD_DEF_MSG_TYPE(TDMT_VND_TABLE_META, "vnode-table-meta", NULL, NULL)
|
TD_DEF_MSG_TYPE(TDMT_VND_TABLE_META, "vnode-table-meta", NULL, NULL)
|
||||||
TD_DEF_MSG_TYPE(TDMT_VND_TABLES_META, "vnode-tables-meta", NULL, NULL)
|
TD_DEF_MSG_TYPE(TDMT_VND_TABLES_META, "vnode-tables-meta", NULL, NULL)
|
||||||
|
TD_DEF_MSG_TYPE(TDMT_VND_TABLE_CFG, "vnode-table-cfg", NULL, NULL)
|
||||||
TD_DEF_MSG_TYPE(TDMT_VND_CREATE_STB, "vnode-create-stb", SVCreateStbReq, NULL)
|
TD_DEF_MSG_TYPE(TDMT_VND_CREATE_STB, "vnode-create-stb", SVCreateStbReq, NULL)
|
||||||
TD_DEF_MSG_TYPE(TDMT_VND_ALTER_STB, "vnode-alter-stb", NULL, NULL)
|
TD_DEF_MSG_TYPE(TDMT_VND_ALTER_STB, "vnode-alter-stb", NULL, NULL)
|
||||||
TD_DEF_MSG_TYPE(TDMT_VND_DROP_STB, "vnode-drop-stb", SVDropStbReq, NULL)
|
TD_DEF_MSG_TYPE(TDMT_VND_DROP_STB, "vnode-drop-stb", SVDropStbReq, NULL)
|
||||||
|
|
|
@ -63,6 +63,8 @@ int32_t tNameSetAcctId(SName* dst, int32_t acctId);
|
||||||
|
|
||||||
bool tNameDBNameEqual(SName* left, SName* right);
|
bool tNameDBNameEqual(SName* left, SName* right);
|
||||||
|
|
||||||
|
bool tNameTbNameEqual(SName* left, SName* right);
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
// input
|
// input
|
||||||
SArray* tags; // element is SSmlKv
|
SArray* tags; // element is SSmlKv
|
||||||
|
|
|
@ -68,6 +68,7 @@ typedef struct SCatalogReq {
|
||||||
SArray* pIndex; // element is index name
|
SArray* pIndex; // element is index name
|
||||||
SArray* pUser; // element is SUserAuthInfo
|
SArray* pUser; // element is SUserAuthInfo
|
||||||
SArray* pTableIndex; // element is SNAME
|
SArray* pTableIndex; // element is SNAME
|
||||||
|
SArray* pTableCfg; // element is SNAME
|
||||||
bool qNodeRequired; // valid qnode
|
bool qNodeRequired; // valid qnode
|
||||||
bool dNodeRequired; // valid dnode
|
bool dNodeRequired; // valid dnode
|
||||||
bool forceUpdate;
|
bool forceUpdate;
|
||||||
|
@ -89,6 +90,7 @@ typedef struct SMetaData {
|
||||||
SArray* pIndex; // pRes = SIndexInfo*
|
SArray* pIndex; // pRes = SIndexInfo*
|
||||||
SArray* pUser; // pRes = bool*
|
SArray* pUser; // pRes = bool*
|
||||||
SArray* pQnodeList; // pRes = SArray<SQueryNodeLoad>*
|
SArray* pQnodeList; // pRes = SArray<SQueryNodeLoad>*
|
||||||
|
SArray* pTableCfg; // pRes = STableCfg*
|
||||||
SArray* pDnodeList; // pRes = SArray<SEpSet>*
|
SArray* pDnodeList; // pRes = SArray<SEpSet>*
|
||||||
} SMetaData;
|
} SMetaData;
|
||||||
|
|
||||||
|
@ -284,6 +286,8 @@ int32_t catalogGetIndexMeta(SCatalog* pCtg, SRequestConnInfo* pConn, const char*
|
||||||
|
|
||||||
int32_t catalogGetTableIndex(SCatalog* pCtg, SRequestConnInfo* pConn, const SName* pTableName, SArray** pRes);
|
int32_t catalogGetTableIndex(SCatalog* pCtg, SRequestConnInfo* pConn, const SName* pTableName, SArray** pRes);
|
||||||
|
|
||||||
|
int32_t catalogRefreshGetTableCfg(SCatalog* pCtg, SRequestConnInfo *pConn, const SName* pTableName, STableCfg** pCfg);
|
||||||
|
|
||||||
int32_t catalogUpdateTableIndex(SCatalog* pCtg, STableIndexRsp *pRsp);
|
int32_t catalogUpdateTableIndex(SCatalog* pCtg, STableIndexRsp *pRsp);
|
||||||
|
|
||||||
int32_t catalogGetUdfInfo(SCatalog* pCtg, SRequestConnInfo* pConn, const char* funcName, SFuncInfo* pInfo);
|
int32_t catalogGetUdfInfo(SCatalog* pCtg, SRequestConnInfo* pConn, const char* funcName, SFuncInfo* pInfo);
|
||||||
|
|
|
@ -28,6 +28,15 @@ extern "C" {
|
||||||
#define DESCRIBE_RESULT_TYPE_LEN (20 + VARSTR_HEADER_SIZE)
|
#define DESCRIBE_RESULT_TYPE_LEN (20 + VARSTR_HEADER_SIZE)
|
||||||
#define DESCRIBE_RESULT_NOTE_LEN (8 + VARSTR_HEADER_SIZE)
|
#define DESCRIBE_RESULT_NOTE_LEN (8 + VARSTR_HEADER_SIZE)
|
||||||
|
|
||||||
|
#define SHOW_CREATE_DB_RESULT_COLS 2
|
||||||
|
#define SHOW_CREATE_DB_RESULT_FIELD1_LEN (TSDB_DB_NAME_LEN + VARSTR_HEADER_SIZE)
|
||||||
|
#define SHOW_CREATE_DB_RESULT_FIELD2_LEN (TSDB_MAX_BINARY_LEN + VARSTR_HEADER_SIZE)
|
||||||
|
|
||||||
|
#define SHOW_CREATE_TB_RESULT_COLS 2
|
||||||
|
#define SHOW_CREATE_TB_RESULT_FIELD1_LEN (TSDB_TABLE_NAME_LEN + VARSTR_HEADER_SIZE)
|
||||||
|
#define SHOW_CREATE_TB_RESULT_FIELD2_LEN (TSDB_MAX_BINARY_LEN + VARSTR_HEADER_SIZE)
|
||||||
|
|
||||||
|
|
||||||
#define PRIVILEGE_TYPE_MASK(n) (1 << n)
|
#define PRIVILEGE_TYPE_MASK(n) (1 << n)
|
||||||
|
|
||||||
#define PRIVILEGE_TYPE_ALL PRIVILEGE_TYPE_MASK(0)
|
#define PRIVILEGE_TYPE_ALL PRIVILEGE_TYPE_MASK(0)
|
||||||
|
@ -221,7 +230,7 @@ typedef struct SShowCreateTableStmt {
|
||||||
ENodeType type;
|
ENodeType type;
|
||||||
char dbName[TSDB_DB_NAME_LEN];
|
char dbName[TSDB_DB_NAME_LEN];
|
||||||
char tableName[TSDB_TABLE_NAME_LEN];
|
char tableName[TSDB_TABLE_NAME_LEN];
|
||||||
STableMeta* pMeta;
|
void* pCfg; // STableCfg
|
||||||
} SShowCreateTableStmt;
|
} SShowCreateTableStmt;
|
||||||
|
|
||||||
typedef struct SShowTableDistributedStmt {
|
typedef struct SShowTableDistributedStmt {
|
||||||
|
|
|
@ -207,6 +207,10 @@ char* jobTaskStatusStr(int32_t status);
|
||||||
|
|
||||||
SSchema createSchema(int8_t type, int32_t bytes, col_id_t colId, const char* name);
|
SSchema createSchema(int8_t type, int32_t bytes, col_id_t colId, const char* name);
|
||||||
void destroyQueryExecRes(SQueryExecRes* pRes);
|
void destroyQueryExecRes(SQueryExecRes* pRes);
|
||||||
|
int32_t dataConverToStr(char *str, int type, void *buf, int32_t bufSize, int32_t *len);
|
||||||
|
char* parseTagDatatoJson(void* p);
|
||||||
|
int32_t cloneTableMeta(STableMeta* pSrc, STableMeta** pDst);
|
||||||
|
int32_t cloneDbVgInfo(SDBVgInfo* pSrc, SDBVgInfo** pDst);
|
||||||
|
|
||||||
extern int32_t (*queryBuildMsg[TDMT_MAX])(void *input, char **msg, int32_t msgSize, int32_t *msgLen, void*(*mallocFp)(int32_t));
|
extern int32_t (*queryBuildMsg[TDMT_MAX])(void *input, char **msg, int32_t msgSize, int32_t *msgLen, void*(*mallocFp)(int32_t));
|
||||||
extern int32_t (*queryProcessMsgRsp[TDMT_MAX])(void* output, char* msg, int32_t msgSize);
|
extern int32_t (*queryProcessMsgRsp[TDMT_MAX])(void* output, char* msg, int32_t msgSize);
|
||||||
|
|
|
@ -162,7 +162,7 @@ typedef struct SSyncLogStore {
|
||||||
SyncIndex (*syncLogEndIndex)(struct SSyncLogStore* pLogStore);
|
SyncIndex (*syncLogEndIndex)(struct SSyncLogStore* pLogStore);
|
||||||
bool (*syncLogIsEmpty)(struct SSyncLogStore* pLogStore);
|
bool (*syncLogIsEmpty)(struct SSyncLogStore* pLogStore);
|
||||||
int32_t (*syncLogEntryCount)(struct SSyncLogStore* pLogStore);
|
int32_t (*syncLogEntryCount)(struct SSyncLogStore* pLogStore);
|
||||||
bool (*syncLogInRange)(struct SSyncLogStore* pLogStore, SyncIndex index);
|
// bool (*syncLogInRange)(struct SSyncLogStore* pLogStore, SyncIndex index);
|
||||||
|
|
||||||
SyncIndex (*syncLogWriteIndex)(struct SSyncLogStore* pLogStore);
|
SyncIndex (*syncLogWriteIndex)(struct SSyncLogStore* pLogStore);
|
||||||
SyncIndex (*syncLogLastIndex)(struct SSyncLogStore* pLogStore);
|
SyncIndex (*syncLogLastIndex)(struct SSyncLogStore* pLogStore);
|
||||||
|
|
|
@ -129,6 +129,7 @@ int32_t* taosGetErrno();
|
||||||
#define TSDB_CODE_TSC_STMT_CLAUSE_ERROR TAOS_DEF_ERROR_CODE(0, 0X0227)
|
#define TSDB_CODE_TSC_STMT_CLAUSE_ERROR TAOS_DEF_ERROR_CODE(0, 0X0227)
|
||||||
#define TSDB_CODE_TSC_QUERY_KILLED TAOS_DEF_ERROR_CODE(0, 0X0228)
|
#define TSDB_CODE_TSC_QUERY_KILLED TAOS_DEF_ERROR_CODE(0, 0X0228)
|
||||||
#define TSDB_CODE_TSC_NO_EXEC_NODE TAOS_DEF_ERROR_CODE(0, 0X0229)
|
#define TSDB_CODE_TSC_NO_EXEC_NODE TAOS_DEF_ERROR_CODE(0, 0X0229)
|
||||||
|
#define TSDB_CODE_TSC_NOT_STABLE_ERROR TAOS_DEF_ERROR_CODE(0, 0X022a)
|
||||||
|
|
||||||
// mnode-common
|
// mnode-common
|
||||||
#define TSDB_CODE_MND_APP_ERROR TAOS_DEF_ERROR_CODE(0, 0x0300)
|
#define TSDB_CODE_MND_APP_ERROR TAOS_DEF_ERROR_CODE(0, 0x0300)
|
||||||
|
|
|
@ -196,7 +196,6 @@ function install_bin() {
|
||||||
${csudo}rm -f ${bin_link_dir}/${uninstallScript} || :
|
${csudo}rm -f ${bin_link_dir}/${uninstallScript} || :
|
||||||
${csudo}rm -f ${bin_link_dir}/tarbitrator || :
|
${csudo}rm -f ${bin_link_dir}/tarbitrator || :
|
||||||
${csudo}rm -f ${bin_link_dir}/set_core || :
|
${csudo}rm -f ${bin_link_dir}/set_core || :
|
||||||
${csudo}rm -f ${bin_link_dir}/run_${serverName}_and_${adapterName}.sh || :
|
|
||||||
${csudo}rm -f ${bin_link_dir}/TDinsight.sh || :
|
${csudo}rm -f ${bin_link_dir}/TDinsight.sh || :
|
||||||
|
|
||||||
${csudo}cp -r ${script_dir}/bin/* ${install_main_dir}/bin && ${csudo}chmod 0555 ${install_main_dir}/bin/*
|
${csudo}cp -r ${script_dir}/bin/* ${install_main_dir}/bin && ${csudo}chmod 0555 ${install_main_dir}/bin/*
|
||||||
|
@ -211,7 +210,6 @@ function install_bin() {
|
||||||
[ -x ${install_main_dir}/bin/TDinsight.sh ] && ${csudo}ln -s ${install_main_dir}/bin/TDinsight.sh ${bin_link_dir}/TDinsight.sh || :
|
[ -x ${install_main_dir}/bin/TDinsight.sh ] && ${csudo}ln -s ${install_main_dir}/bin/TDinsight.sh ${bin_link_dir}/TDinsight.sh || :
|
||||||
[ -x ${install_main_dir}/bin/remove.sh ] && ${csudo}ln -s ${install_main_dir}/bin/remove.sh ${bin_link_dir}/${uninstallScript} || :
|
[ -x ${install_main_dir}/bin/remove.sh ] && ${csudo}ln -s ${install_main_dir}/bin/remove.sh ${bin_link_dir}/${uninstallScript} || :
|
||||||
[ -x ${install_main_dir}/bin/set_core.sh ] && ${csudo}ln -s ${install_main_dir}/bin/set_core.sh ${bin_link_dir}/set_core || :
|
[ -x ${install_main_dir}/bin/set_core.sh ] && ${csudo}ln -s ${install_main_dir}/bin/set_core.sh ${bin_link_dir}/set_core || :
|
||||||
[ -x ${install_main_dir}/bin/run_${serverName}_and_${adapterName}.sh ] && ${csudo}ln -s ${install_main_dir}/bin/run_${serverName}_and_${adapterName}.sh ${bin_link_dir}/run_${serverName}_and_${adapterName}.sh || :
|
|
||||||
[ -x ${install_main_dir}/bin/tarbitrator ] && ${csudo}ln -s ${install_main_dir}/bin/tarbitrator ${bin_link_dir}/tarbitrator || :
|
[ -x ${install_main_dir}/bin/tarbitrator ] && ${csudo}ln -s ${install_main_dir}/bin/tarbitrator ${bin_link_dir}/tarbitrator || :
|
||||||
|
|
||||||
if [ "$verMode" == "cluster" ]; then
|
if [ "$verMode" == "cluster" ]; then
|
||||||
|
|
|
@ -176,7 +176,6 @@ function install_bin() {
|
||||||
if [ "$osType" != "Darwin" ]; then
|
if [ "$osType" != "Darwin" ]; then
|
||||||
${csudo}rm -f ${bin_link_dir}/perfMonitor || :
|
${csudo}rm -f ${bin_link_dir}/perfMonitor || :
|
||||||
${csudo}rm -f ${bin_link_dir}/set_core || :
|
${csudo}rm -f ${bin_link_dir}/set_core || :
|
||||||
${csudo}rm -f ${bin_link_dir}/run_taosd_and_taosadapter.sh || :
|
|
||||||
${csudo}rm -f ${bin_link_dir}/${uninstallScript} || :
|
${csudo}rm -f ${bin_link_dir}/${uninstallScript} || :
|
||||||
|
|
||||||
${csudo}cp -r ${binary_dir}/build/bin/${clientName} ${install_main_dir}/bin || :
|
${csudo}cp -r ${binary_dir}/build/bin/${clientName} ${install_main_dir}/bin || :
|
||||||
|
@ -191,7 +190,6 @@ function install_bin() {
|
||||||
${csudo}cp -r ${script_dir}/taosd-dump-cfg.gdb ${install_main_dir}/bin || :
|
${csudo}cp -r ${script_dir}/taosd-dump-cfg.gdb ${install_main_dir}/bin || :
|
||||||
${csudo}cp -r ${script_dir}/remove.sh ${install_main_dir}/bin || :
|
${csudo}cp -r ${script_dir}/remove.sh ${install_main_dir}/bin || :
|
||||||
${csudo}cp -r ${script_dir}/set_core.sh ${install_main_dir}/bin || :
|
${csudo}cp -r ${script_dir}/set_core.sh ${install_main_dir}/bin || :
|
||||||
${csudo}cp -r ${script_dir}/run_taosd_and_taosadapter.sh ${install_main_dir}/bin || :
|
|
||||||
${csudo}cp -r ${script_dir}/startPre.sh ${install_main_dir}/bin || :
|
${csudo}cp -r ${script_dir}/startPre.sh ${install_main_dir}/bin || :
|
||||||
|
|
||||||
${csudo}chmod 0555 ${install_main_dir}/bin/*
|
${csudo}chmod 0555 ${install_main_dir}/bin/*
|
||||||
|
@ -204,7 +202,6 @@ function install_bin() {
|
||||||
[ -x ${install_main_dir}/bin/taosdemo ] && ${csudo}ln -s ${install_main_dir}/bin/taosdemo ${bin_link_dir}/taosdemo || :
|
[ -x ${install_main_dir}/bin/taosdemo ] && ${csudo}ln -s ${install_main_dir}/bin/taosdemo ${bin_link_dir}/taosdemo || :
|
||||||
[ -x ${install_main_dir}/bin/perfMonitor ] && ${csudo}ln -s ${install_main_dir}/bin/perfMonitor ${bin_link_dir}/perfMonitor || :
|
[ -x ${install_main_dir}/bin/perfMonitor ] && ${csudo}ln -s ${install_main_dir}/bin/perfMonitor ${bin_link_dir}/perfMonitor || :
|
||||||
[ -x ${install_main_dir}/set_core.sh ] && ${csudo}ln -s ${install_main_dir}/bin/set_core.sh ${bin_link_dir}/set_core || :
|
[ -x ${install_main_dir}/set_core.sh ] && ${csudo}ln -s ${install_main_dir}/bin/set_core.sh ${bin_link_dir}/set_core || :
|
||||||
[ -x ${install_main_dir}/run_taosd_and_taosadapter.sh ] && ${csudo}ln -s ${install_main_dir}/bin/run_taosd_and_taosadapter.sh ${bin_link_dir}/run_taosd_and_taosadapter.sh || :
|
|
||||||
[ -x ${install_main_dir}/bin/remove.sh ] && ${csudo}ln -s ${install_main_dir}/bin/remove.sh ${bin_link_dir}/${uninstallScript} || :
|
[ -x ${install_main_dir}/bin/remove.sh ] && ${csudo}ln -s ${install_main_dir}/bin/remove.sh ${bin_link_dir}/${uninstallScript} || :
|
||||||
else
|
else
|
||||||
|
|
||||||
|
|
|
@ -244,10 +244,10 @@ void asyncExecLocalCmd(SRequestObj* pRequest, SQuery* pQuery) {
|
||||||
}
|
}
|
||||||
|
|
||||||
SReqResultInfo* pResultInfo = &pRequest->body.resInfo;
|
SReqResultInfo* pResultInfo = &pRequest->body.resInfo;
|
||||||
|
pRequest->code = code;
|
||||||
|
|
||||||
if (pRequest->code != TSDB_CODE_SUCCESS) {
|
if (pRequest->code != TSDB_CODE_SUCCESS) {
|
||||||
pResultInfo->numOfRows = 0;
|
pResultInfo->numOfRows = 0;
|
||||||
pRequest->code = code;
|
|
||||||
tscError("0x%" PRIx64 " fetch results failed, code:%s, reqId:0x%" PRIx64, pRequest->self, tstrerror(code),
|
tscError("0x%" PRIx64 " fetch results failed, code:%s, reqId:0x%" PRIx64, pRequest->self, tstrerror(code),
|
||||||
pRequest->requestId);
|
pRequest->requestId);
|
||||||
} else {
|
} else {
|
||||||
|
@ -256,7 +256,7 @@ void asyncExecLocalCmd(SRequestObj* pRequest, SQuery* pQuery) {
|
||||||
pRequest->requestId);
|
pRequest->requestId);
|
||||||
}
|
}
|
||||||
|
|
||||||
pRequest->body.queryFp(pRequest->body.param, pRequest, 0);
|
pRequest->body.queryFp(pRequest->body.param, pRequest, code);
|
||||||
// pRequest->body.fetchFp(pRequest->body.param, pRequest, pResultInfo->numOfRows);
|
// pRequest->body.fetchFp(pRequest->body.param, pRequest, pResultInfo->numOfRows);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1444,80 +1444,6 @@ static int32_t doPrepareResPtr(SReqResultInfo* pResInfo) {
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
static char* parseTagDatatoJson(void* p) {
|
|
||||||
char* string = NULL;
|
|
||||||
cJSON* json = cJSON_CreateObject();
|
|
||||||
if (json == NULL) {
|
|
||||||
goto end;
|
|
||||||
}
|
|
||||||
|
|
||||||
SArray* pTagVals = NULL;
|
|
||||||
if (tTagToValArray((const STag*)p, &pTagVals) != 0) {
|
|
||||||
goto end;
|
|
||||||
}
|
|
||||||
|
|
||||||
int16_t nCols = taosArrayGetSize(pTagVals);
|
|
||||||
char tagJsonKey[256] = {0};
|
|
||||||
for (int j = 0; j < nCols; ++j) {
|
|
||||||
STagVal* pTagVal = (STagVal*)taosArrayGet(pTagVals, j);
|
|
||||||
// json key encode by binary
|
|
||||||
memset(tagJsonKey, 0, sizeof(tagJsonKey));
|
|
||||||
memcpy(tagJsonKey, pTagVal->pKey, strlen(pTagVal->pKey));
|
|
||||||
// json value
|
|
||||||
char type = pTagVal->type;
|
|
||||||
if (type == TSDB_DATA_TYPE_NULL) {
|
|
||||||
cJSON* value = cJSON_CreateNull();
|
|
||||||
if (value == NULL) {
|
|
||||||
goto end;
|
|
||||||
}
|
|
||||||
cJSON_AddItemToObject(json, tagJsonKey, value);
|
|
||||||
} else if (type == TSDB_DATA_TYPE_NCHAR) {
|
|
||||||
cJSON* value = NULL;
|
|
||||||
if (pTagVal->nData > 0) {
|
|
||||||
char* tagJsonValue = taosMemoryCalloc(pTagVal->nData, 1);
|
|
||||||
int32_t length = taosUcs4ToMbs((TdUcs4*)pTagVal->pData, pTagVal->nData, tagJsonValue);
|
|
||||||
if (length < 0) {
|
|
||||||
tscError("charset:%s to %s. val:%s convert json value failed.", DEFAULT_UNICODE_ENCODEC, tsCharset,
|
|
||||||
pTagVal->pData);
|
|
||||||
taosMemoryFree(tagJsonValue);
|
|
||||||
goto end;
|
|
||||||
}
|
|
||||||
value = cJSON_CreateString(tagJsonValue);
|
|
||||||
taosMemoryFree(tagJsonValue);
|
|
||||||
if (value == NULL) {
|
|
||||||
goto end;
|
|
||||||
}
|
|
||||||
} else if (pTagVal->nData == 0) {
|
|
||||||
value = cJSON_CreateString("");
|
|
||||||
} else {
|
|
||||||
ASSERT(0);
|
|
||||||
}
|
|
||||||
|
|
||||||
cJSON_AddItemToObject(json, tagJsonKey, value);
|
|
||||||
} else if (type == TSDB_DATA_TYPE_DOUBLE) {
|
|
||||||
double jsonVd = *(double*)(&pTagVal->i64);
|
|
||||||
cJSON* value = cJSON_CreateNumber(jsonVd);
|
|
||||||
if (value == NULL) {
|
|
||||||
goto end;
|
|
||||||
}
|
|
||||||
cJSON_AddItemToObject(json, tagJsonKey, value);
|
|
||||||
} else if (type == TSDB_DATA_TYPE_BOOL) {
|
|
||||||
char jsonVd = *(char*)(&pTagVal->i64);
|
|
||||||
cJSON* value = cJSON_CreateBool(jsonVd);
|
|
||||||
if (value == NULL) {
|
|
||||||
goto end;
|
|
||||||
}
|
|
||||||
cJSON_AddItemToObject(json, tagJsonKey, value);
|
|
||||||
} else {
|
|
||||||
ASSERT(0);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
string = cJSON_PrintUnformatted(json);
|
|
||||||
end:
|
|
||||||
cJSON_Delete(json);
|
|
||||||
return string;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int32_t doConvertUCS4(SReqResultInfo* pResultInfo, int32_t numOfRows, int32_t numOfCols, int32_t* colLength) {
|
static int32_t doConvertUCS4(SReqResultInfo* pResultInfo, int32_t numOfRows, int32_t numOfCols, int32_t* colLength) {
|
||||||
for (int32_t i = 0; i < numOfCols; ++i) {
|
for (int32_t i = 0; i < numOfCols; ++i) {
|
||||||
int32_t type = pResultInfo->fields[i].type;
|
int32_t type = pResultInfo->fields[i].type;
|
||||||
|
|
|
@ -532,6 +532,14 @@ int32_t tSerializeSMCreateStbReq(void *buf, int32_t bufLen, SMCreateStbReq *pReq
|
||||||
if (pReq->ast2Len > 0) {
|
if (pReq->ast2Len > 0) {
|
||||||
if (tEncodeBinary(&encoder, pReq->pAst2, pReq->ast2Len) < 0) return -1;
|
if (tEncodeBinary(&encoder, pReq->pAst2, pReq->ast2Len) < 0) return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int32_t numOfFuncs = taosArrayGetSize(pReq->pFuncs);
|
||||||
|
if (tEncodeI32(&encoder, numOfFuncs) < 0) return -1;
|
||||||
|
for (int32_t i = 0; i < numOfFuncs; ++i) {
|
||||||
|
const char *pFunc = taosArrayGet(pReq->pFuncs, i);
|
||||||
|
if (tEncodeCStr(&encoder, pFunc) < 0) return -1;
|
||||||
|
}
|
||||||
|
|
||||||
tEndEncode(&encoder);
|
tEndEncode(&encoder);
|
||||||
|
|
||||||
int32_t tlen = encoder.pos;
|
int32_t tlen = encoder.pos;
|
||||||
|
@ -606,6 +614,21 @@ int32_t tDeserializeSMCreateStbReq(void *buf, int32_t bufLen, SMCreateStbReq *pR
|
||||||
if (tDecodeCStrTo(&decoder, pReq->pAst2) < 0) return -1;
|
if (tDecodeCStrTo(&decoder, pReq->pAst2) < 0) return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int32_t numOfFuncs = 0;
|
||||||
|
if (tDecodeI32(&decoder, &numOfFuncs) < 0) return -1;
|
||||||
|
if (numOfFuncs > 0) {
|
||||||
|
pReq->pFuncs = taosArrayInit(numOfFuncs, TSDB_FUNC_NAME_LEN);
|
||||||
|
if (NULL == pReq->pFuncs) return -1;
|
||||||
|
}
|
||||||
|
for (int32_t i = 0; i < numOfFuncs; ++i) {
|
||||||
|
char* pFunc = NULL;
|
||||||
|
if (tDecodeCStrAlloc(&decoder, &pFunc) < 0) return -1;
|
||||||
|
if (taosArrayPush(pReq->pFuncs, pFunc) == NULL) {
|
||||||
|
terrno = TSDB_CODE_OUT_OF_MEMORY;
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
tEndDecode(&decoder);
|
tEndDecode(&decoder);
|
||||||
|
|
||||||
tDecoderClear(&decoder);
|
tDecoderClear(&decoder);
|
||||||
|
@ -618,8 +641,7 @@ void tFreeSMCreateStbReq(SMCreateStbReq *pReq) {
|
||||||
taosMemoryFreeClear(pReq->comment);
|
taosMemoryFreeClear(pReq->comment);
|
||||||
taosMemoryFreeClear(pReq->pAst1);
|
taosMemoryFreeClear(pReq->pAst1);
|
||||||
taosMemoryFreeClear(pReq->pAst2);
|
taosMemoryFreeClear(pReq->pAst2);
|
||||||
pReq->pColumns = NULL;
|
taosArrayDestroy(pReq->pFuncs);
|
||||||
pReq->pTags = NULL;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t tSerializeSMDropStbReq(void *buf, int32_t bufLen, SMDropStbReq *pReq) {
|
int32_t tSerializeSMDropStbReq(void *buf, int32_t bufLen, SMDropStbReq *pReq) {
|
||||||
|
@ -1757,6 +1779,165 @@ void tFreeSRetrieveFuncRsp(SRetrieveFuncRsp *pRsp) {
|
||||||
taosArrayDestroy(pRsp->pFuncInfos);
|
taosArrayDestroy(pRsp->pFuncInfos);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int32_t tSerializeSTableCfgReq(void *buf, int32_t bufLen, STableCfgReq *pReq) {
|
||||||
|
int32_t headLen = sizeof(SMsgHead);
|
||||||
|
if (buf != NULL) {
|
||||||
|
buf = (char *)buf + headLen;
|
||||||
|
bufLen -= headLen;
|
||||||
|
}
|
||||||
|
|
||||||
|
SEncoder encoder = {0};
|
||||||
|
tEncoderInit(&encoder, buf, bufLen);
|
||||||
|
|
||||||
|
if (tStartEncode(&encoder) < 0) return -1;
|
||||||
|
if (tEncodeCStr(&encoder, pReq->dbFName) < 0) return -1;
|
||||||
|
if (tEncodeCStr(&encoder, pReq->tbName) < 0) return -1;
|
||||||
|
tEndEncode(&encoder);
|
||||||
|
|
||||||
|
int32_t tlen = encoder.pos;
|
||||||
|
tEncoderClear(&encoder);
|
||||||
|
|
||||||
|
if (buf != NULL) {
|
||||||
|
SMsgHead *pHead = (SMsgHead *)((char *)buf - headLen);
|
||||||
|
pHead->vgId = htonl(pReq->header.vgId);
|
||||||
|
pHead->contLen = htonl(tlen + headLen);
|
||||||
|
}
|
||||||
|
|
||||||
|
return tlen + headLen;
|
||||||
|
}
|
||||||
|
|
||||||
|
int32_t tDeserializeSTableCfgReq(void *buf, int32_t bufLen, STableCfgReq *pReq) {
|
||||||
|
int32_t headLen = sizeof(SMsgHead);
|
||||||
|
|
||||||
|
SMsgHead *pHead = buf;
|
||||||
|
pHead->vgId = pReq->header.vgId;
|
||||||
|
pHead->contLen = pReq->header.contLen;
|
||||||
|
|
||||||
|
SDecoder decoder = {0};
|
||||||
|
tDecoderInit(&decoder, (char *)buf + headLen, bufLen - headLen);
|
||||||
|
|
||||||
|
if (tStartDecode(&decoder) < 0) return -1;
|
||||||
|
if (tDecodeCStrTo(&decoder, pReq->dbFName) < 0) return -1;
|
||||||
|
if (tDecodeCStrTo(&decoder, pReq->tbName) < 0) return -1;
|
||||||
|
|
||||||
|
tEndDecode(&decoder);
|
||||||
|
tDecoderClear(&decoder);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int32_t tSerializeSTableCfgRsp(void *buf, int32_t bufLen, STableCfgRsp *pRsp) {
|
||||||
|
SEncoder encoder = {0};
|
||||||
|
tEncoderInit(&encoder, buf, bufLen);
|
||||||
|
|
||||||
|
if (tStartEncode(&encoder) < 0) return -1;
|
||||||
|
if (tEncodeCStr(&encoder, pRsp->tbName) < 0) return -1;
|
||||||
|
if (tEncodeCStr(&encoder, pRsp->stbName) < 0) return -1;
|
||||||
|
if (tEncodeCStr(&encoder, pRsp->dbFName) < 0) return -1;
|
||||||
|
if (tEncodeI32(&encoder, pRsp->numOfTags) < 0) return -1;
|
||||||
|
if (tEncodeI32(&encoder, pRsp->numOfColumns) < 0) return -1;
|
||||||
|
if (tEncodeI8(&encoder, pRsp->tableType) < 0) return -1;
|
||||||
|
if (tEncodeI64(&encoder, pRsp->delay1) < 0) return -1;
|
||||||
|
if (tEncodeI64(&encoder, pRsp->delay2) < 0) return -1;
|
||||||
|
if (tEncodeI64(&encoder, pRsp->watermark1) < 0) return -1;
|
||||||
|
if (tEncodeI64(&encoder, pRsp->watermark2) < 0) return -1;
|
||||||
|
if (tEncodeI32(&encoder, pRsp->ttl) < 0) return -1;
|
||||||
|
|
||||||
|
int32_t numOfFuncs = taosArrayGetSize(pRsp->pFuncs);
|
||||||
|
if (tEncodeI32(&encoder, numOfFuncs) < 0) return -1;
|
||||||
|
for (int32_t i = 0; i < numOfFuncs; ++i) {
|
||||||
|
const char *pFunc = taosArrayGet(pRsp->pFuncs, i);
|
||||||
|
if (tEncodeCStr(&encoder, pFunc) < 0) return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (tEncodeI32(&encoder, pRsp->commentLen) < 0) return -1;
|
||||||
|
if (pRsp->commentLen > 0) {
|
||||||
|
if (tEncodeCStr(&encoder, pRsp->pComment) < 0) return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (int32_t i = 0; i < pRsp->numOfColumns + pRsp->numOfTags; ++i) {
|
||||||
|
SSchema *pSchema = &pRsp->pSchemas[i];
|
||||||
|
if (tEncodeSSchema(&encoder, pSchema) < 0) return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (tEncodeI32(&encoder, pRsp->tagsLen) < 0) return -1;
|
||||||
|
if (tEncodeBinary(&encoder, pRsp->pTags, pRsp->tagsLen) < 0) return -1;
|
||||||
|
|
||||||
|
tEndEncode(&encoder);
|
||||||
|
|
||||||
|
int32_t tlen = encoder.pos;
|
||||||
|
tEncoderClear(&encoder);
|
||||||
|
return tlen;
|
||||||
|
}
|
||||||
|
|
||||||
|
int32_t tDeserializeSTableCfgRsp(void *buf, int32_t bufLen, STableCfgRsp *pRsp) {
|
||||||
|
SDecoder decoder = {0};
|
||||||
|
tDecoderInit(&decoder, buf, bufLen);
|
||||||
|
|
||||||
|
if (tStartDecode(&decoder) < 0) return -1;
|
||||||
|
if (tDecodeCStrTo(&decoder, pRsp->tbName) < 0) return -1;
|
||||||
|
if (tDecodeCStrTo(&decoder, pRsp->stbName) < 0) return -1;
|
||||||
|
if (tDecodeCStrTo(&decoder, pRsp->dbFName) < 0) return -1;
|
||||||
|
if (tDecodeI32(&decoder, &pRsp->numOfTags) < 0) return -1;
|
||||||
|
if (tDecodeI32(&decoder, &pRsp->numOfColumns) < 0) return -1;
|
||||||
|
if (tDecodeI8(&decoder, &pRsp->tableType) < 0) return -1;
|
||||||
|
if (tDecodeI64(&decoder, &pRsp->delay1) < 0) return -1;
|
||||||
|
if (tDecodeI64(&decoder, &pRsp->delay2) < 0) return -1;
|
||||||
|
if (tDecodeI64(&decoder, &pRsp->watermark1) < 0) return -1;
|
||||||
|
if (tDecodeI64(&decoder, &pRsp->watermark2) < 0) return -1;
|
||||||
|
if (tDecodeI32(&decoder, &pRsp->ttl) < 0) return -1;
|
||||||
|
|
||||||
|
int32_t numOfFuncs = 0;
|
||||||
|
if (tDecodeI32(&decoder, &numOfFuncs) < 0) return -1;
|
||||||
|
if (numOfFuncs > 0) {
|
||||||
|
pRsp->pFuncs = taosArrayInit(numOfFuncs, TSDB_FUNC_NAME_LEN);
|
||||||
|
if (NULL == pRsp->pFuncs) return -1;
|
||||||
|
}
|
||||||
|
for (int32_t i = 0; i < numOfFuncs; ++i) {
|
||||||
|
char pFunc[TSDB_FUNC_NAME_LEN];
|
||||||
|
if (tDecodeCStrTo(&decoder, pFunc) < 0) return -1;
|
||||||
|
if (taosArrayPush(pRsp->pFuncs, pFunc) == NULL) {
|
||||||
|
terrno = TSDB_CODE_OUT_OF_MEMORY;
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (tDecodeI32(&decoder, &pRsp->commentLen) < 0) return -1;
|
||||||
|
if (pRsp->commentLen > 0) {
|
||||||
|
if (tDecodeCStrAlloc(&decoder, &pRsp->pComment) < 0) return -1;
|
||||||
|
} else {
|
||||||
|
pRsp->pComment = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
int32_t totalCols = pRsp->numOfTags + pRsp->numOfColumns;
|
||||||
|
pRsp->pSchemas = taosMemoryMalloc(sizeof(SSchema) * totalCols);
|
||||||
|
if (pRsp->pSchemas == NULL) return -1;
|
||||||
|
|
||||||
|
for (int32_t i = 0; i < totalCols; ++i) {
|
||||||
|
SSchema *pSchema = &pRsp->pSchemas[i];
|
||||||
|
if (tDecodeSSchema(&decoder, pSchema) < 0) return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (tDecodeI32(&decoder, &pRsp->tagsLen) < 0) return -1;
|
||||||
|
if (tDecodeBinaryAlloc(&decoder, (void**)&pRsp->pTags, NULL) < 0) return -1;
|
||||||
|
|
||||||
|
tEndDecode(&decoder);
|
||||||
|
|
||||||
|
tDecoderClear(&decoder);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
void tFreeSTableCfgRsp(STableCfgRsp *pRsp) {
|
||||||
|
if (NULL == pRsp) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
taosMemoryFreeClear(pRsp->pComment);
|
||||||
|
taosMemoryFreeClear(pRsp->pSchemas);
|
||||||
|
taosMemoryFreeClear(pRsp->pTags);
|
||||||
|
|
||||||
|
taosArrayDestroy(pRsp->pFuncs);
|
||||||
|
}
|
||||||
|
|
||||||
int32_t tSerializeSCreateDbReq(void *buf, int32_t bufLen, SCreateDbReq *pReq) {
|
int32_t tSerializeSCreateDbReq(void *buf, int32_t bufLen, SCreateDbReq *pReq) {
|
||||||
SEncoder encoder = {0};
|
SEncoder encoder = {0};
|
||||||
tEncoderInit(&encoder, buf, bufLen);
|
tEncoderInit(&encoder, buf, bufLen);
|
||||||
|
|
|
@ -240,6 +240,15 @@ bool tNameDBNameEqual(SName* left, SName* right) {
|
||||||
return (0 == strcmp(left->dbname, right->dbname));
|
return (0 == strcmp(left->dbname, right->dbname));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool tNameTbNameEqual(SName* left, SName* right) {
|
||||||
|
bool equal = tNameDBNameEqual(left, right);
|
||||||
|
if (equal) {
|
||||||
|
return (0 == strcmp(left->tname, right->tname));
|
||||||
|
}
|
||||||
|
|
||||||
|
return equal;
|
||||||
|
}
|
||||||
|
|
||||||
int32_t tNameFromString(SName* dst, const char* str, uint32_t type) {
|
int32_t tNameFromString(SName* dst, const char* str, uint32_t type) {
|
||||||
assert(dst != NULL && str != NULL && strlen(str) > 0);
|
assert(dst != NULL && str != NULL && strlen(str) > 0);
|
||||||
|
|
||||||
|
|
|
@ -183,6 +183,7 @@ SArray *mmGetMsgHandles() {
|
||||||
if (dmSetMgmtHandle(pArray, TDMT_MND_ALTER_STB, mmPutMsgToWriteQueue, 0) == NULL) goto _OVER;
|
if (dmSetMgmtHandle(pArray, TDMT_MND_ALTER_STB, mmPutMsgToWriteQueue, 0) == NULL) goto _OVER;
|
||||||
if (dmSetMgmtHandle(pArray, TDMT_MND_DROP_STB, mmPutMsgToWriteQueue, 0) == NULL) goto _OVER;
|
if (dmSetMgmtHandle(pArray, TDMT_MND_DROP_STB, mmPutMsgToWriteQueue, 0) == NULL) goto _OVER;
|
||||||
if (dmSetMgmtHandle(pArray, TDMT_MND_TABLE_META, mmPutMsgToReadQueue, 0) == NULL) goto _OVER;
|
if (dmSetMgmtHandle(pArray, TDMT_MND_TABLE_META, mmPutMsgToReadQueue, 0) == NULL) goto _OVER;
|
||||||
|
if (dmSetMgmtHandle(pArray, TDMT_MND_TABLE_CFG, mmPutMsgToReadQueue, 0) == NULL) goto _OVER;
|
||||||
if (dmSetMgmtHandle(pArray, TDMT_MND_CREATE_SMA, mmPutMsgToWriteQueue, 0) == NULL) goto _OVER;
|
if (dmSetMgmtHandle(pArray, TDMT_MND_CREATE_SMA, mmPutMsgToWriteQueue, 0) == NULL) goto _OVER;
|
||||||
if (dmSetMgmtHandle(pArray, TDMT_MND_DROP_SMA, mmPutMsgToWriteQueue, 0) == NULL) goto _OVER;
|
if (dmSetMgmtHandle(pArray, TDMT_MND_DROP_SMA, mmPutMsgToWriteQueue, 0) == NULL) goto _OVER;
|
||||||
if (dmSetMgmtHandle(pArray, TDMT_MND_CREATE_STREAM, mmPutMsgToWriteQueue, 0) == NULL) goto _OVER;
|
if (dmSetMgmtHandle(pArray, TDMT_MND_CREATE_STREAM, mmPutMsgToWriteQueue, 0) == NULL) goto _OVER;
|
||||||
|
|
|
@ -330,6 +330,7 @@ SArray *vmGetMsgHandles() {
|
||||||
if (dmSetMgmtHandle(pArray, TDMT_VND_ALTER_TABLE, vmPutMsgToWriteQueue, 0) == NULL) goto _OVER;
|
if (dmSetMgmtHandle(pArray, TDMT_VND_ALTER_TABLE, vmPutMsgToWriteQueue, 0) == NULL) goto _OVER;
|
||||||
if (dmSetMgmtHandle(pArray, TDMT_VND_UPDATE_TAG_VAL, vmPutMsgToWriteQueue, 0) == NULL) goto _OVER;
|
if (dmSetMgmtHandle(pArray, TDMT_VND_UPDATE_TAG_VAL, vmPutMsgToWriteQueue, 0) == NULL) goto _OVER;
|
||||||
if (dmSetMgmtHandle(pArray, TDMT_VND_TABLE_META, vmPutMsgToFetchQueue, 0) == NULL) goto _OVER;
|
if (dmSetMgmtHandle(pArray, TDMT_VND_TABLE_META, vmPutMsgToFetchQueue, 0) == NULL) goto _OVER;
|
||||||
|
if (dmSetMgmtHandle(pArray, TDMT_VND_TABLE_CFG, vmPutMsgToFetchQueue, 0) == NULL) goto _OVER;
|
||||||
if (dmSetMgmtHandle(pArray, TDMT_VND_TABLES_META, vmPutMsgToFetchQueue, 0) == NULL) goto _OVER;
|
if (dmSetMgmtHandle(pArray, TDMT_VND_TABLES_META, vmPutMsgToFetchQueue, 0) == NULL) goto _OVER;
|
||||||
if (dmSetMgmtHandle(pArray, TDMT_VND_CANCEL_TASK, vmPutMsgToFetchQueue, 0) == NULL) goto _OVER;
|
if (dmSetMgmtHandle(pArray, TDMT_VND_CANCEL_TASK, vmPutMsgToFetchQueue, 0) == NULL) goto _OVER;
|
||||||
if (dmSetMgmtHandle(pArray, TDMT_VND_DROP_TASK, vmPutMsgToFetchQueue, 0) == NULL) goto _OVER;
|
if (dmSetMgmtHandle(pArray, TDMT_VND_DROP_TASK, vmPutMsgToFetchQueue, 0) == NULL) goto _OVER;
|
||||||
|
|
|
@ -349,6 +349,7 @@ typedef struct {
|
||||||
int32_t commentLen;
|
int32_t commentLen;
|
||||||
int32_t ast1Len;
|
int32_t ast1Len;
|
||||||
int32_t ast2Len;
|
int32_t ast2Len;
|
||||||
|
SArray* pFuncs;
|
||||||
SSchema* pColumns;
|
SSchema* pColumns;
|
||||||
SSchema* pTags;
|
SSchema* pTags;
|
||||||
char* comment;
|
char* comment;
|
||||||
|
|
|
@ -25,6 +25,7 @@ extern "C" {
|
||||||
int32_t mndInitInfos(SMnode *pMnode);
|
int32_t mndInitInfos(SMnode *pMnode);
|
||||||
void mndCleanupInfos(SMnode *pMnode);
|
void mndCleanupInfos(SMnode *pMnode);
|
||||||
int32_t mndBuildInsTableSchema(SMnode *pMnode, const char *dbFName, const char *tbName, STableMetaRsp *pRsp);
|
int32_t mndBuildInsTableSchema(SMnode *pMnode, const char *dbFName, const char *tbName, STableMetaRsp *pRsp);
|
||||||
|
int32_t mndBuildInsTableCfg(SMnode *pMnode, const char *dbFName, const char *tbName, STableCfgRsp *pRsp);
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
|
|
|
@ -23,6 +23,7 @@ extern "C" {
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
int32_t mndBuildPerfsTableSchema(SMnode *pMnode, const char *dbFName, const char *tbName, STableMetaRsp *pRsp);
|
int32_t mndBuildPerfsTableSchema(SMnode *pMnode, const char *dbFName, const char *tbName, STableMetaRsp *pRsp);
|
||||||
|
int32_t mndBuildPerfsTableCfg(SMnode *pMnode, const char *dbFName, const char *tbName, STableCfgRsp *pRsp);
|
||||||
int32_t mndInitPerfs(SMnode *pMnode);
|
int32_t mndInitPerfs(SMnode *pMnode);
|
||||||
void mndCleanupPerfs(SMnode *pMnode);
|
void mndCleanupPerfs(SMnode *pMnode);
|
||||||
|
|
||||||
|
|
|
@ -90,6 +90,38 @@ int32_t mndBuildInsTableSchema(SMnode *pMnode, const char *dbFName, const char *
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int32_t mndBuildInsTableCfg(SMnode *pMnode, const char *dbFName, const char *tbName, STableCfgRsp *pRsp) {
|
||||||
|
if (NULL == pMnode->infosMeta) {
|
||||||
|
terrno = TSDB_CODE_MND_NOT_READY;
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
STableMetaRsp *pMeta = taosHashGet(pMnode->infosMeta, tbName, strlen(tbName));
|
||||||
|
if (NULL == pMeta) {
|
||||||
|
mError("invalid information schema table name:%s", tbName);
|
||||||
|
terrno = TSDB_CODE_MND_INVALID_SYS_TABLENAME;
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
strcpy(pRsp->tbName, pMeta->tbName);
|
||||||
|
strcpy(pRsp->stbName, pMeta->stbName);
|
||||||
|
strcpy(pRsp->dbFName, pMeta->dbFName);
|
||||||
|
pRsp->numOfTags = pMeta->numOfTags;
|
||||||
|
pRsp->numOfColumns = pMeta->numOfColumns;
|
||||||
|
pRsp->tableType = pMeta->tableType;
|
||||||
|
|
||||||
|
pRsp->pSchemas = taosMemoryCalloc(pMeta->numOfColumns, sizeof(SSchema));
|
||||||
|
if (pRsp->pSchemas == NULL) {
|
||||||
|
terrno = TSDB_CODE_OUT_OF_MEMORY;
|
||||||
|
pRsp->pSchemas = NULL;
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
memcpy(pRsp->pSchemas, pMeta->pSchemas, pMeta->numOfColumns * sizeof(SSchema));
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
int32_t mndInitInfos(SMnode *pMnode) {
|
int32_t mndInitInfos(SMnode *pMnode) {
|
||||||
pMnode->infosMeta = taosHashInit(20, taosGetDefaultHashFunction(TSDB_DATA_TYPE_VARCHAR), false, HASH_NO_LOCK);
|
pMnode->infosMeta = taosHashInit(20, taosGetDefaultHashFunction(TSDB_DATA_TYPE_VARCHAR), false, HASH_NO_LOCK);
|
||||||
if (pMnode->infosMeta == NULL) {
|
if (pMnode->infosMeta == NULL) {
|
||||||
|
|
|
@ -92,6 +92,37 @@ int32_t mndBuildPerfsTableSchema(SMnode *pMnode, const char *dbFName, const char
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int32_t mndBuildPerfsTableCfg(SMnode *pMnode, const char *dbFName, const char *tbName, STableCfgRsp *pRsp) {
|
||||||
|
if (NULL == pMnode->perfsMeta) {
|
||||||
|
terrno = TSDB_CODE_MND_NOT_READY;
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
STableMetaRsp *pMeta = taosHashGet(pMnode->perfsMeta, tbName, strlen(tbName));
|
||||||
|
if (NULL == pMeta) {
|
||||||
|
mError("invalid performance schema table name:%s", tbName);
|
||||||
|
terrno = TSDB_CODE_MND_INVALID_SYS_TABLENAME;
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
strcpy(pRsp->tbName, pMeta->tbName);
|
||||||
|
strcpy(pRsp->stbName, pMeta->stbName);
|
||||||
|
strcpy(pRsp->dbFName, pMeta->dbFName);
|
||||||
|
pRsp->numOfTags = pMeta->numOfTags;
|
||||||
|
pRsp->numOfColumns = pMeta->numOfColumns;
|
||||||
|
pRsp->tableType = pMeta->tableType;
|
||||||
|
|
||||||
|
pRsp->pSchemas = taosMemoryCalloc(pMeta->numOfColumns, sizeof(SSchema));
|
||||||
|
if (pRsp->pSchemas == NULL) {
|
||||||
|
terrno = TSDB_CODE_OUT_OF_MEMORY;
|
||||||
|
pRsp->pSchemas = NULL;
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
memcpy(pRsp->pSchemas, pMeta->pSchemas, pMeta->numOfColumns * sizeof(SSchema));
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
int32_t mndInitPerfs(SMnode *pMnode) {
|
int32_t mndInitPerfs(SMnode *pMnode) {
|
||||||
pMnode->perfsMeta = taosHashInit(20, taosGetDefaultHashFunction(TSDB_DATA_TYPE_BINARY), false, HASH_NO_LOCK);
|
pMnode->perfsMeta = taosHashInit(20, taosGetDefaultHashFunction(TSDB_DATA_TYPE_BINARY), false, HASH_NO_LOCK);
|
||||||
if (pMnode->perfsMeta == NULL) {
|
if (pMnode->perfsMeta == NULL) {
|
||||||
|
|
|
@ -43,6 +43,7 @@ static int32_t mndProcessDropStbReq(SRpcMsg *pReq);
|
||||||
static int32_t mndProcessTableMetaReq(SRpcMsg *pReq);
|
static int32_t mndProcessTableMetaReq(SRpcMsg *pReq);
|
||||||
static int32_t mndRetrieveStb(SRpcMsg *pReq, SShowObj *pShow, SSDataBlock *pBlock, int32_t rows);
|
static int32_t mndRetrieveStb(SRpcMsg *pReq, SShowObj *pShow, SSDataBlock *pBlock, int32_t rows);
|
||||||
static void mndCancelGetNextStb(SMnode *pMnode, void *pIter);
|
static void mndCancelGetNextStb(SMnode *pMnode, void *pIter);
|
||||||
|
static int32_t mndProcessTableCfgReq(SRpcMsg *pReq);
|
||||||
|
|
||||||
int32_t mndInitStb(SMnode *pMnode) {
|
int32_t mndInitStb(SMnode *pMnode) {
|
||||||
SSdbTable table = {
|
SSdbTable table = {
|
||||||
|
@ -62,6 +63,7 @@ int32_t mndInitStb(SMnode *pMnode) {
|
||||||
mndSetMsgHandle(pMnode, TDMT_VND_ALTER_STB_RSP, mndTransProcessRsp);
|
mndSetMsgHandle(pMnode, TDMT_VND_ALTER_STB_RSP, mndTransProcessRsp);
|
||||||
mndSetMsgHandle(pMnode, TDMT_VND_DROP_STB_RSP, mndTransProcessRsp);
|
mndSetMsgHandle(pMnode, TDMT_VND_DROP_STB_RSP, mndTransProcessRsp);
|
||||||
mndSetMsgHandle(pMnode, TDMT_MND_TABLE_META, mndProcessTableMetaReq);
|
mndSetMsgHandle(pMnode, TDMT_MND_TABLE_META, mndProcessTableMetaReq);
|
||||||
|
mndSetMsgHandle(pMnode, TDMT_MND_TABLE_CFG, mndProcessTableCfgReq);
|
||||||
|
|
||||||
mndAddShowRetrieveHandle(pMnode, TSDB_MGMT_TABLE_STB, mndRetrieveStb);
|
mndAddShowRetrieveHandle(pMnode, TSDB_MGMT_TABLE_STB, mndRetrieveStb);
|
||||||
mndAddShowFreeIterHandle(pMnode, TSDB_MGMT_TABLE_STB, mndCancelGetNextStb);
|
mndAddShowFreeIterHandle(pMnode, TSDB_MGMT_TABLE_STB, mndCancelGetNextStb);
|
||||||
|
@ -75,7 +77,7 @@ SSdbRaw *mndStbActionEncode(SStbObj *pStb) {
|
||||||
terrno = TSDB_CODE_OUT_OF_MEMORY;
|
terrno = TSDB_CODE_OUT_OF_MEMORY;
|
||||||
|
|
||||||
int32_t size = sizeof(SStbObj) + (pStb->numOfColumns + pStb->numOfTags) * sizeof(SSchema) + +pStb->commentLen +
|
int32_t size = sizeof(SStbObj) + (pStb->numOfColumns + pStb->numOfTags) * sizeof(SSchema) + +pStb->commentLen +
|
||||||
pStb->ast1Len + pStb->ast2Len + STB_RESERVE_SIZE;
|
pStb->ast1Len + pStb->ast2Len + STB_RESERVE_SIZE + taosArrayGetSize(pStb->pFuncs) * TSDB_FUNC_NAME_LEN;
|
||||||
SSdbRaw *pRaw = sdbAllocRaw(SDB_STB, STB_VER_NUMBER, size);
|
SSdbRaw *pRaw = sdbAllocRaw(SDB_STB, STB_VER_NUMBER, size);
|
||||||
if (pRaw == NULL) goto _OVER;
|
if (pRaw == NULL) goto _OVER;
|
||||||
|
|
||||||
|
@ -100,6 +102,13 @@ SSdbRaw *mndStbActionEncode(SStbObj *pStb) {
|
||||||
SDB_SET_INT32(pRaw, dataPos, pStb->ast1Len, _OVER)
|
SDB_SET_INT32(pRaw, dataPos, pStb->ast1Len, _OVER)
|
||||||
SDB_SET_INT32(pRaw, dataPos, pStb->ast2Len, _OVER)
|
SDB_SET_INT32(pRaw, dataPos, pStb->ast2Len, _OVER)
|
||||||
|
|
||||||
|
int32_t funcNum = taosArrayGetSize(pStb->pFuncs);
|
||||||
|
SDB_SET_INT32(pRaw, dataPos, funcNum, _OVER)
|
||||||
|
for (int32_t i = 0; i < funcNum; ++i) {
|
||||||
|
char* func = taosArrayGet(pStb->pFuncs, i);
|
||||||
|
SDB_SET_BINARY(pRaw, dataPos, func, TSDB_FUNC_NAME_LEN, _OVER)
|
||||||
|
}
|
||||||
|
|
||||||
for (int32_t i = 0; i < pStb->numOfColumns; ++i) {
|
for (int32_t i = 0; i < pStb->numOfColumns; ++i) {
|
||||||
SSchema *pSchema = &pStb->pColumns[i];
|
SSchema *pSchema = &pStb->pColumns[i];
|
||||||
SDB_SET_INT8(pRaw, dataPos, pSchema->type, _OVER)
|
SDB_SET_INT8(pRaw, dataPos, pSchema->type, _OVER)
|
||||||
|
@ -181,6 +190,20 @@ static SSdbRow *mndStbActionDecode(SSdbRaw *pRaw) {
|
||||||
SDB_GET_INT32(pRaw, dataPos, &pStb->ast1Len, _OVER)
|
SDB_GET_INT32(pRaw, dataPos, &pStb->ast1Len, _OVER)
|
||||||
SDB_GET_INT32(pRaw, dataPos, &pStb->ast2Len, _OVER)
|
SDB_GET_INT32(pRaw, dataPos, &pStb->ast2Len, _OVER)
|
||||||
|
|
||||||
|
int32_t funcNum = 0;
|
||||||
|
SDB_GET_INT32(pRaw, dataPos, &funcNum, _OVER)
|
||||||
|
if (funcNum > 0) {
|
||||||
|
pStb->pFuncs = taosArrayInit(funcNum, TSDB_FUNC_NAME_LEN);
|
||||||
|
if (NULL == pStb->pFuncs) {
|
||||||
|
goto _OVER;
|
||||||
|
}
|
||||||
|
char funcName[TSDB_FUNC_NAME_LEN];
|
||||||
|
for (int32_t i = 0; i < funcNum; ++i) {
|
||||||
|
SDB_GET_BINARY(pRaw, dataPos, funcName, TSDB_FUNC_NAME_LEN, _OVER)
|
||||||
|
taosArrayPush(pStb->pFuncs, funcName);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
pStb->pColumns = taosMemoryCalloc(pStb->numOfColumns, sizeof(SSchema));
|
pStb->pColumns = taosMemoryCalloc(pStb->numOfColumns, sizeof(SSchema));
|
||||||
pStb->pTags = taosMemoryCalloc(pStb->numOfTags, sizeof(SSchema));
|
pStb->pTags = taosMemoryCalloc(pStb->numOfTags, sizeof(SSchema));
|
||||||
if (pStb->pColumns == NULL || pStb->pTags == NULL) {
|
if (pStb->pColumns == NULL || pStb->pTags == NULL) {
|
||||||
|
@ -250,6 +273,7 @@ static int32_t mndStbActionDelete(SSdb *pSdb, SStbObj *pStb) {
|
||||||
taosMemoryFreeClear(pStb->comment);
|
taosMemoryFreeClear(pStb->comment);
|
||||||
taosMemoryFreeClear(pStb->pAst1);
|
taosMemoryFreeClear(pStb->pAst1);
|
||||||
taosMemoryFreeClear(pStb->pAst2);
|
taosMemoryFreeClear(pStb->pAst2);
|
||||||
|
taosArrayDestroy(pStb->pFuncs);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -680,6 +704,9 @@ int32_t mndBuildStbFromReq(SMnode *pMnode, SStbObj *pDst, SMCreateStbReq *pCreat
|
||||||
pDst->numOfColumns = pCreate->numOfColumns;
|
pDst->numOfColumns = pCreate->numOfColumns;
|
||||||
pDst->numOfTags = pCreate->numOfTags;
|
pDst->numOfTags = pCreate->numOfTags;
|
||||||
pDst->commentLen = pCreate->commentLen;
|
pDst->commentLen = pCreate->commentLen;
|
||||||
|
pDst->pFuncs = pCreate->pFuncs;
|
||||||
|
pCreate->pFuncs = NULL;
|
||||||
|
|
||||||
if (pDst->commentLen > 0) {
|
if (pDst->commentLen > 0) {
|
||||||
pDst->comment = taosMemoryCalloc(pDst->commentLen + 1, 1);
|
pDst->comment = taosMemoryCalloc(pDst->commentLen + 1, 1);
|
||||||
if (pDst->comment == NULL) {
|
if (pDst->comment == NULL) {
|
||||||
|
@ -1277,6 +1304,60 @@ static int32_t mndBuildStbSchemaImp(SDbObj *pDb, SStbObj *pStb, const char *tbNa
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int32_t mndBuildStbCfgImp(SDbObj *pDb, SStbObj *pStb, const char *tbName, STableCfgRsp *pRsp) {
|
||||||
|
taosRLockLatch(&pStb->lock);
|
||||||
|
|
||||||
|
int32_t totalCols = pStb->numOfColumns + pStb->numOfTags;
|
||||||
|
pRsp->pSchemas = taosMemoryCalloc(totalCols, sizeof(SSchema));
|
||||||
|
if (pRsp->pSchemas == NULL) {
|
||||||
|
taosRUnLockLatch(&pStb->lock);
|
||||||
|
terrno = TSDB_CODE_OUT_OF_MEMORY;
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
strcpy(pRsp->dbFName, pStb->db);
|
||||||
|
strcpy(pRsp->tbName, tbName);
|
||||||
|
strcpy(pRsp->stbName, tbName);
|
||||||
|
pRsp->numOfTags = pStb->numOfTags;
|
||||||
|
pRsp->numOfColumns = pStb->numOfColumns;
|
||||||
|
pRsp->tableType = TSDB_SUPER_TABLE;
|
||||||
|
pRsp->delay1 = pStb->maxdelay[0];
|
||||||
|
pRsp->delay2 = pStb->maxdelay[1];
|
||||||
|
pRsp->watermark1 = pStb->watermark[0];
|
||||||
|
pRsp->watermark2 = pStb->watermark[1];
|
||||||
|
pRsp->ttl = pStb->ttl;
|
||||||
|
pRsp->commentLen = pStb->commentLen;
|
||||||
|
if (pStb->commentLen > 0) {
|
||||||
|
pRsp->pComment = strdup(pStb->comment);
|
||||||
|
}
|
||||||
|
|
||||||
|
for (int32_t i = 0; i < pStb->numOfColumns; ++i) {
|
||||||
|
SSchema *pSchema = &pRsp->pSchemas[i];
|
||||||
|
SSchema *pSrcSchema = &pStb->pColumns[i];
|
||||||
|
memcpy(pSchema->name, pSrcSchema->name, TSDB_COL_NAME_LEN);
|
||||||
|
pSchema->type = pSrcSchema->type;
|
||||||
|
pSchema->colId = pSrcSchema->colId;
|
||||||
|
pSchema->bytes = pSrcSchema->bytes;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (int32_t i = 0; i < pStb->numOfTags; ++i) {
|
||||||
|
SSchema *pSchema = &pRsp->pSchemas[i + pStb->numOfColumns];
|
||||||
|
SSchema *pSrcSchema = &pStb->pTags[i];
|
||||||
|
memcpy(pSchema->name, pSrcSchema->name, TSDB_COL_NAME_LEN);
|
||||||
|
pSchema->type = pSrcSchema->type;
|
||||||
|
pSchema->colId = pSrcSchema->colId;
|
||||||
|
pSchema->bytes = pSrcSchema->bytes;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (pStb->pFuncs) {
|
||||||
|
pRsp->pFuncs = taosArrayDup(pStb->pFuncs);
|
||||||
|
}
|
||||||
|
|
||||||
|
taosRUnLockLatch(&pStb->lock);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
static int32_t mndBuildStbSchema(SMnode *pMnode, const char *dbFName, const char *tbName, STableMetaRsp *pRsp,
|
static int32_t mndBuildStbSchema(SMnode *pMnode, const char *dbFName, const char *tbName, STableMetaRsp *pRsp,
|
||||||
int32_t *smaVer) {
|
int32_t *smaVer) {
|
||||||
char tbFName[TSDB_TABLE_FNAME_LEN] = {0};
|
char tbFName[TSDB_TABLE_FNAME_LEN] = {0};
|
||||||
|
@ -1305,6 +1386,32 @@ static int32_t mndBuildStbSchema(SMnode *pMnode, const char *dbFName, const char
|
||||||
return code;
|
return code;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int32_t mndBuildStbCfg(SMnode *pMnode, const char *dbFName, const char *tbName, STableCfgRsp *pRsp) {
|
||||||
|
char tbFName[TSDB_TABLE_FNAME_LEN] = {0};
|
||||||
|
snprintf(tbFName, sizeof(tbFName), "%s.%s", dbFName, tbName);
|
||||||
|
|
||||||
|
SDbObj *pDb = mndAcquireDb(pMnode, dbFName);
|
||||||
|
if (pDb == NULL) {
|
||||||
|
terrno = TSDB_CODE_MND_DB_NOT_SELECTED;
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
SStbObj *pStb = mndAcquireStb(pMnode, tbFName);
|
||||||
|
if (pStb == NULL) {
|
||||||
|
mndReleaseDb(pMnode, pDb);
|
||||||
|
terrno = TSDB_CODE_PAR_TABLE_NOT_EXIST;
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
int32_t code = mndBuildStbCfgImp(pDb, pStb, tbName, pRsp);
|
||||||
|
|
||||||
|
mndReleaseDb(pMnode, pDb);
|
||||||
|
mndReleaseStb(pMnode, pStb);
|
||||||
|
return code;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
static int32_t mndBuildSMAlterStbRsp(SDbObj *pDb, const SMAlterStbReq *pAlter, SStbObj *pObj, void **pCont,
|
static int32_t mndBuildSMAlterStbRsp(SDbObj *pDb, const SMAlterStbReq *pAlter, SStbObj *pObj, void **pCont,
|
||||||
int32_t *pLen) {
|
int32_t *pLen) {
|
||||||
int32_t ret;
|
int32_t ret;
|
||||||
|
@ -1664,6 +1771,63 @@ _OVER:
|
||||||
return code;
|
return code;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int32_t mndProcessTableCfgReq(SRpcMsg *pReq) {
|
||||||
|
SMnode *pMnode = pReq->info.node;
|
||||||
|
int32_t code = -1;
|
||||||
|
STableCfgReq cfgReq = {0};
|
||||||
|
STableCfgRsp cfgRsp = {0};
|
||||||
|
|
||||||
|
if (tDeserializeSTableCfgReq(pReq->pCont, pReq->contLen, &cfgReq) != 0) {
|
||||||
|
terrno = TSDB_CODE_INVALID_MSG;
|
||||||
|
goto _OVER;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (0 == strcmp(cfgReq.dbFName, TSDB_INFORMATION_SCHEMA_DB)) {
|
||||||
|
mDebug("information_schema table:%s.%s, start to retrieve cfg", cfgReq.dbFName, cfgReq.tbName);
|
||||||
|
if (mndBuildInsTableCfg(pMnode, cfgReq.dbFName, cfgReq.tbName, &cfgRsp) != 0) {
|
||||||
|
goto _OVER;
|
||||||
|
}
|
||||||
|
} else if (0 == strcmp(cfgReq.dbFName, TSDB_PERFORMANCE_SCHEMA_DB)) {
|
||||||
|
mDebug("performance_schema table:%s.%s, start to retrieve cfg", cfgReq.dbFName, cfgReq.tbName);
|
||||||
|
if (mndBuildPerfsTableCfg(pMnode, cfgReq.dbFName, cfgReq.tbName, &cfgRsp) != 0) {
|
||||||
|
goto _OVER;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
mDebug("stb:%s.%s, start to retrieve cfg", cfgReq.dbFName, cfgReq.tbName);
|
||||||
|
if (mndBuildStbCfg(pMnode, cfgReq.dbFName, cfgReq.tbName, &cfgRsp) != 0) {
|
||||||
|
goto _OVER;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
int32_t rspLen = tSerializeSTableCfgRsp(NULL, 0, &cfgRsp);
|
||||||
|
if (rspLen < 0) {
|
||||||
|
terrno = TSDB_CODE_INVALID_MSG;
|
||||||
|
goto _OVER;
|
||||||
|
}
|
||||||
|
|
||||||
|
void *pRsp = rpcMallocCont(rspLen);
|
||||||
|
if (pRsp == NULL) {
|
||||||
|
terrno = TSDB_CODE_OUT_OF_MEMORY;
|
||||||
|
goto _OVER;
|
||||||
|
}
|
||||||
|
|
||||||
|
tSerializeSTableCfgRsp(pRsp, rspLen, &cfgRsp);
|
||||||
|
pReq->info.rsp = pRsp;
|
||||||
|
pReq->info.rspLen = rspLen;
|
||||||
|
code = 0;
|
||||||
|
|
||||||
|
mTrace("%s.%s, cfg is retrieved", cfgReq.dbFName, cfgReq.tbName);
|
||||||
|
|
||||||
|
_OVER:
|
||||||
|
if (code != 0) {
|
||||||
|
mError("stb:%s.%s, failed to retrieve cfg since %s", cfgReq.dbFName, cfgReq.tbName, terrstr());
|
||||||
|
}
|
||||||
|
|
||||||
|
tFreeSTableCfgRsp(&cfgRsp);
|
||||||
|
return code;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
int32_t mndValidateStbInfo(SMnode *pMnode, SSTableVersion *pStbVersions, int32_t numOfStbs, void **ppRsp,
|
int32_t mndValidateStbInfo(SMnode *pMnode, SSTableVersion *pStbVersions, int32_t numOfStbs, void **ppRsp,
|
||||||
int32_t *pRspLen) {
|
int32_t *pRspLen) {
|
||||||
SSTbHbRsp hbRsp = {0};
|
SSTbHbRsp hbRsp = {0};
|
||||||
|
|
|
@ -79,6 +79,7 @@ void vnodeBufPoolReset(SVBufPool* pPool);
|
||||||
int32_t vnodeQueryOpen(SVnode* pVnode);
|
int32_t vnodeQueryOpen(SVnode* pVnode);
|
||||||
void vnodeQueryClose(SVnode* pVnode);
|
void vnodeQueryClose(SVnode* pVnode);
|
||||||
int32_t vnodeGetTableMeta(SVnode* pVnode, SRpcMsg* pMsg);
|
int32_t vnodeGetTableMeta(SVnode* pVnode, SRpcMsg* pMsg);
|
||||||
|
int vnodeGetTableCfg(SVnode *pVnode, SRpcMsg *pMsg);
|
||||||
|
|
||||||
// vnodeCommit.c
|
// vnodeCommit.c
|
||||||
int32_t vnodeBegin(SVnode* pVnode);
|
int32_t vnodeBegin(SVnode* pVnode);
|
||||||
|
|
|
@ -124,6 +124,115 @@ _exit:
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int vnodeGetTableCfg(SVnode *pVnode, SRpcMsg *pMsg) {
|
||||||
|
STableCfgReq cfgReq = {0};
|
||||||
|
STableCfgRsp cfgRsp = {0};
|
||||||
|
SMetaReader mer1 = {0};
|
||||||
|
SMetaReader mer2 = {0};
|
||||||
|
char tableFName[TSDB_TABLE_FNAME_LEN];
|
||||||
|
SRpcMsg rpcMsg;
|
||||||
|
int32_t code = 0;
|
||||||
|
int32_t rspLen = 0;
|
||||||
|
void *pRsp = NULL;
|
||||||
|
SSchemaWrapper schema = {0};
|
||||||
|
SSchemaWrapper schemaTag = {0};
|
||||||
|
|
||||||
|
// decode req
|
||||||
|
if (tDeserializeSTableCfgReq(pMsg->pCont, pMsg->contLen, &cfgReq) != 0) {
|
||||||
|
code = TSDB_CODE_INVALID_MSG;
|
||||||
|
goto _exit;
|
||||||
|
}
|
||||||
|
|
||||||
|
strcpy(cfgRsp.tbName, cfgReq.tbName);
|
||||||
|
memcpy(cfgRsp.dbFName, cfgReq.dbFName, sizeof(cfgRsp.dbFName));
|
||||||
|
|
||||||
|
sprintf(tableFName, "%s.%s", cfgReq.dbFName, cfgReq.tbName);
|
||||||
|
code = vnodeValidateTableHash(pVnode, tableFName);
|
||||||
|
if (code) {
|
||||||
|
goto _exit;
|
||||||
|
}
|
||||||
|
|
||||||
|
// query meta
|
||||||
|
metaReaderInit(&mer1, pVnode->pMeta, 0);
|
||||||
|
|
||||||
|
if (metaGetTableEntryByName(&mer1, cfgReq.tbName) < 0) {
|
||||||
|
code = terrno;
|
||||||
|
goto _exit;
|
||||||
|
}
|
||||||
|
|
||||||
|
cfgRsp.tableType = mer1.me.type;
|
||||||
|
|
||||||
|
if (mer1.me.type == TSDB_SUPER_TABLE) {
|
||||||
|
code = TSDB_CODE_VND_HASH_MISMATCH;
|
||||||
|
goto _exit;
|
||||||
|
} else if (mer1.me.type == TSDB_CHILD_TABLE) {
|
||||||
|
metaReaderInit(&mer2, pVnode->pMeta, 0);
|
||||||
|
if (metaGetTableEntryByUid(&mer2, mer1.me.ctbEntry.suid) < 0) goto _exit;
|
||||||
|
|
||||||
|
strcpy(cfgRsp.stbName, mer2.me.name);
|
||||||
|
schema = mer2.me.stbEntry.schemaRow;
|
||||||
|
schemaTag = mer2.me.stbEntry.schemaTag;
|
||||||
|
cfgRsp.ttl = mer1.me.ctbEntry.ttlDays;
|
||||||
|
cfgRsp.commentLen = mer1.me.ctbEntry.commentLen;
|
||||||
|
if (mer1.me.ctbEntry.commentLen > 0) {
|
||||||
|
cfgRsp.pComment = strdup(mer1.me.ctbEntry.comment);
|
||||||
|
}
|
||||||
|
STag *pTag = (STag *)mer1.me.ctbEntry.pTags;
|
||||||
|
cfgRsp.tagsLen = pTag->len;
|
||||||
|
cfgRsp.pTags = taosMemoryMalloc(cfgRsp.tagsLen);
|
||||||
|
memcpy(cfgRsp.pTags, pTag, cfgRsp.tagsLen);
|
||||||
|
} else if (mer1.me.type == TSDB_NORMAL_TABLE) {
|
||||||
|
schema = mer1.me.ntbEntry.schemaRow;
|
||||||
|
cfgRsp.ttl = mer1.me.ntbEntry.ttlDays;
|
||||||
|
cfgRsp.commentLen = mer1.me.ntbEntry.commentLen;
|
||||||
|
if (mer1.me.ntbEntry.commentLen > 0) {
|
||||||
|
cfgRsp.pComment = strdup(mer1.me.ntbEntry.comment);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
ASSERT(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
cfgRsp.numOfTags = schemaTag.nCols;
|
||||||
|
cfgRsp.numOfColumns = schema.nCols;
|
||||||
|
cfgRsp.pSchemas = (SSchema *)taosMemoryMalloc(sizeof(SSchema) * (cfgRsp.numOfColumns + cfgRsp.numOfTags));
|
||||||
|
|
||||||
|
memcpy(cfgRsp.pSchemas, schema.pSchema, sizeof(SSchema) * schema.nCols);
|
||||||
|
if (schemaTag.nCols) {
|
||||||
|
memcpy(cfgRsp.pSchemas + schema.nCols, schemaTag.pSchema, sizeof(SSchema) * schemaTag.nCols);
|
||||||
|
}
|
||||||
|
|
||||||
|
// encode and send response
|
||||||
|
rspLen = tSerializeSTableCfgRsp(NULL, 0, &cfgRsp);
|
||||||
|
if (rspLen < 0) {
|
||||||
|
code = TSDB_CODE_INVALID_MSG;
|
||||||
|
goto _exit;
|
||||||
|
}
|
||||||
|
|
||||||
|
pRsp = rpcMallocCont(rspLen);
|
||||||
|
if (pRsp == NULL) {
|
||||||
|
code = TSDB_CODE_OUT_OF_MEMORY;
|
||||||
|
goto _exit;
|
||||||
|
}
|
||||||
|
tSerializeSTableCfgRsp(pRsp, rspLen, &cfgRsp);
|
||||||
|
|
||||||
|
_exit:
|
||||||
|
rpcMsg.info = pMsg->info;
|
||||||
|
rpcMsg.pCont = pRsp;
|
||||||
|
rpcMsg.contLen = rspLen;
|
||||||
|
rpcMsg.code = code;
|
||||||
|
|
||||||
|
if (code) {
|
||||||
|
qError("get table %s cfg failed cause of %s", cfgReq.tbName, tstrerror(code));
|
||||||
|
}
|
||||||
|
|
||||||
|
tmsgSendRsp(&rpcMsg);
|
||||||
|
|
||||||
|
tFreeSTableCfgRsp(&cfgRsp);
|
||||||
|
metaReaderClear(&mer2);
|
||||||
|
metaReaderClear(&mer1);
|
||||||
|
return TSDB_CODE_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
int32_t vnodeGetLoad(SVnode *pVnode, SVnodeLoad *pLoad) {
|
int32_t vnodeGetLoad(SVnode *pVnode, SVnodeLoad *pLoad) {
|
||||||
pLoad->vgId = TD_VID(pVnode);
|
pLoad->vgId = TD_VID(pVnode);
|
||||||
pLoad->syncState = syncGetMyRole(pVnode->sync);
|
pLoad->syncState = syncGetMyRole(pVnode->sync);
|
||||||
|
|
|
@ -255,6 +255,8 @@ int32_t vnodeProcessFetchMsg(SVnode *pVnode, SRpcMsg *pMsg, SQueueInfo *pInfo) {
|
||||||
return qWorkerProcessHbMsg(pVnode, pVnode->pQuery, pMsg, 0);
|
return qWorkerProcessHbMsg(pVnode, pVnode->pQuery, pMsg, 0);
|
||||||
case TDMT_VND_TABLE_META:
|
case TDMT_VND_TABLE_META:
|
||||||
return vnodeGetTableMeta(pVnode, pMsg);
|
return vnodeGetTableMeta(pVnode, pMsg);
|
||||||
|
case TDMT_VND_TABLE_CFG:
|
||||||
|
return vnodeGetTableCfg(pVnode, pMsg);
|
||||||
case TDMT_VND_CONSUME:
|
case TDMT_VND_CONSUME:
|
||||||
return tqProcessPollReq(pVnode->pTq, pMsg, pInfo->workerId);
|
return tqProcessPollReq(pVnode->pTq, pMsg, pInfo->workerId);
|
||||||
case TDMT_STREAM_TASK_RUN:
|
case TDMT_STREAM_TASK_RUN:
|
||||||
|
|
|
@ -71,11 +71,18 @@ typedef enum {
|
||||||
CTG_TASK_GET_TB_META,
|
CTG_TASK_GET_TB_META,
|
||||||
CTG_TASK_GET_TB_HASH,
|
CTG_TASK_GET_TB_HASH,
|
||||||
CTG_TASK_GET_TB_INDEX,
|
CTG_TASK_GET_TB_INDEX,
|
||||||
|
CTG_TASK_GET_TB_CFG,
|
||||||
CTG_TASK_GET_INDEX,
|
CTG_TASK_GET_INDEX,
|
||||||
CTG_TASK_GET_UDF,
|
CTG_TASK_GET_UDF,
|
||||||
CTG_TASK_GET_USER,
|
CTG_TASK_GET_USER,
|
||||||
} CTG_TASK_TYPE;
|
} CTG_TASK_TYPE;
|
||||||
|
|
||||||
|
typedef enum {
|
||||||
|
CTG_TASK_LAUNCHED = 1,
|
||||||
|
CTG_TASK_DONE,
|
||||||
|
} CTG_TASK_STATUS;
|
||||||
|
|
||||||
|
|
||||||
typedef struct SCtgDebug {
|
typedef struct SCtgDebug {
|
||||||
bool lockEnable;
|
bool lockEnable;
|
||||||
bool cacheEnable;
|
bool cacheEnable;
|
||||||
|
@ -102,6 +109,12 @@ typedef struct SCtgTbIndexCtx {
|
||||||
SName* pName;
|
SName* pName;
|
||||||
} SCtgTbIndexCtx;
|
} SCtgTbIndexCtx;
|
||||||
|
|
||||||
|
typedef struct SCtgTbCfgCtx {
|
||||||
|
SName* pName;
|
||||||
|
int32_t tbType;
|
||||||
|
SVgroupInfo* pVgInfo;
|
||||||
|
} SCtgTbCfgCtx;
|
||||||
|
|
||||||
typedef struct SCtgDbVgCtx {
|
typedef struct SCtgDbVgCtx {
|
||||||
char dbFName[TSDB_DB_FNAME_LEN];
|
char dbFName[TSDB_DB_FNAME_LEN];
|
||||||
} SCtgDbVgCtx;
|
} SCtgDbVgCtx;
|
||||||
|
@ -190,6 +203,8 @@ typedef struct SCtgJob {
|
||||||
SArray* pTasks;
|
SArray* pTasks;
|
||||||
int32_t taskDone;
|
int32_t taskDone;
|
||||||
SMetaData jobRes;
|
SMetaData jobRes;
|
||||||
|
int32_t taskIdx;
|
||||||
|
SRWLatch taskLock;
|
||||||
|
|
||||||
uint64_t queryId;
|
uint64_t queryId;
|
||||||
SCatalog* pCtg;
|
SCatalog* pCtg;
|
||||||
|
@ -207,6 +222,7 @@ typedef struct SCtgJob {
|
||||||
int32_t userNum;
|
int32_t userNum;
|
||||||
int32_t dbInfoNum;
|
int32_t dbInfoNum;
|
||||||
int32_t tbIndexNum;
|
int32_t tbIndexNum;
|
||||||
|
int32_t tbCfgNum;
|
||||||
} SCtgJob;
|
} SCtgJob;
|
||||||
|
|
||||||
typedef struct SCtgMsgCtx {
|
typedef struct SCtgMsgCtx {
|
||||||
|
@ -216,6 +232,16 @@ typedef struct SCtgMsgCtx {
|
||||||
char* target;
|
char* target;
|
||||||
} SCtgMsgCtx;
|
} SCtgMsgCtx;
|
||||||
|
|
||||||
|
typedef struct SCtgTask SCtgTask;
|
||||||
|
typedef int32_t (*ctgSubTaskCbFp)(SCtgTask*);
|
||||||
|
|
||||||
|
typedef struct SCtgSubRes {
|
||||||
|
CTG_TASK_TYPE type;
|
||||||
|
int32_t code;
|
||||||
|
void* res;
|
||||||
|
ctgSubTaskCbFp fp;
|
||||||
|
} SCtgSubRes;
|
||||||
|
|
||||||
typedef struct SCtgTask {
|
typedef struct SCtgTask {
|
||||||
CTG_TASK_TYPE type;
|
CTG_TASK_TYPE type;
|
||||||
int32_t taskId;
|
int32_t taskId;
|
||||||
|
@ -224,16 +250,26 @@ typedef struct SCtgTask {
|
||||||
SCtgMsgCtx msgCtx;
|
SCtgMsgCtx msgCtx;
|
||||||
int32_t code;
|
int32_t code;
|
||||||
void* res;
|
void* res;
|
||||||
|
CTG_TASK_STATUS status;
|
||||||
|
SRWLatch lock;
|
||||||
|
SArray* pParents;
|
||||||
|
SCtgSubRes subRes;
|
||||||
} SCtgTask;
|
} SCtgTask;
|
||||||
|
|
||||||
|
typedef int32_t (*ctgInitTaskFp)(SCtgJob*, int32_t, void*);
|
||||||
typedef int32_t (*ctgLanchTaskFp)(SCtgTask*);
|
typedef int32_t (*ctgLanchTaskFp)(SCtgTask*);
|
||||||
typedef int32_t (*ctgHandleTaskMsgRspFp)(SCtgTask*, int32_t, const SDataBuf *, int32_t);
|
typedef int32_t (*ctgHandleTaskMsgRspFp)(SCtgTask*, int32_t, const SDataBuf *, int32_t);
|
||||||
typedef int32_t (*ctgDumpTaskResFp)(SCtgTask*);
|
typedef int32_t (*ctgDumpTaskResFp)(SCtgTask*);
|
||||||
|
typedef int32_t (*ctgCloneTaskResFp)(SCtgTask*, void**);
|
||||||
|
typedef int32_t (*ctgCompTaskFp)(SCtgTask*, void*, bool*);
|
||||||
|
|
||||||
typedef struct SCtgAsyncFps {
|
typedef struct SCtgAsyncFps {
|
||||||
|
ctgInitTaskFp initFp;
|
||||||
ctgLanchTaskFp launchFp;
|
ctgLanchTaskFp launchFp;
|
||||||
ctgHandleTaskMsgRspFp handleRspFp;
|
ctgHandleTaskMsgRspFp handleRspFp;
|
||||||
ctgDumpTaskResFp dumpResFp;
|
ctgDumpTaskResFp dumpResFp;
|
||||||
|
ctgCompTaskFp compFp;
|
||||||
|
ctgCloneTaskResFp cloneFp;
|
||||||
} SCtgAsyncFps;
|
} SCtgAsyncFps;
|
||||||
|
|
||||||
typedef struct SCtgApiStat {
|
typedef struct SCtgApiStat {
|
||||||
|
@ -521,6 +557,8 @@ int32_t ctgDropTbIndexEnqueue(SCatalog* pCtg, SName* pName, bool syncOp);
|
||||||
int32_t ctgOpDropTbIndex(SCtgCacheOperation *operation);
|
int32_t ctgOpDropTbIndex(SCtgCacheOperation *operation);
|
||||||
int32_t ctgOpUpdateTbIndex(SCtgCacheOperation *operation);
|
int32_t ctgOpUpdateTbIndex(SCtgCacheOperation *operation);
|
||||||
int32_t ctgOpClearCache(SCtgCacheOperation *operation);
|
int32_t ctgOpClearCache(SCtgCacheOperation *operation);
|
||||||
|
int32_t ctgReadTbTypeFromCache(SCatalog* pCtg, char* dbFName, char *tableName, int32_t *tbType);
|
||||||
|
int32_t ctgGetTbHashVgroupFromCache(SCatalog *pCtg, const SName *pTableName, SVgroupInfo **pVgroup);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@ -536,10 +574,14 @@ int32_t ctgGetUserDbAuthFromMnode(SCatalog* pCtg, SRequestConnInfo *pConn, const
|
||||||
int32_t ctgGetTbMetaFromMnodeImpl(SCatalog* pCtg, SRequestConnInfo *pConn, char *dbFName, char* tbName, STableMetaOutput* out, SCtgTask* pTask);
|
int32_t ctgGetTbMetaFromMnodeImpl(SCatalog* pCtg, SRequestConnInfo *pConn, char *dbFName, char* tbName, STableMetaOutput* out, SCtgTask* pTask);
|
||||||
int32_t ctgGetTbMetaFromMnode(SCatalog* pCtg, SRequestConnInfo *pConn, const SName* pTableName, STableMetaOutput* out, SCtgTask* pTask);
|
int32_t ctgGetTbMetaFromMnode(SCatalog* pCtg, SRequestConnInfo *pConn, const SName* pTableName, STableMetaOutput* out, SCtgTask* pTask);
|
||||||
int32_t ctgGetTbMetaFromVnode(SCatalog* pCtg, SRequestConnInfo *pConn, const SName* pTableName, SVgroupInfo *vgroupInfo, STableMetaOutput* out, SCtgTask* pTask);
|
int32_t ctgGetTbMetaFromVnode(SCatalog* pCtg, SRequestConnInfo *pConn, const SName* pTableName, SVgroupInfo *vgroupInfo, STableMetaOutput* out, SCtgTask* pTask);
|
||||||
|
int32_t ctgGetTableCfgFromVnode(SCatalog* pCtg, SRequestConnInfo *pConn, const SName* pTableName, SVgroupInfo *vgroupInfo, STableCfg **out, SCtgTask* pTask);
|
||||||
|
int32_t ctgGetTableCfgFromMnode(SCatalog* pCtg, SRequestConnInfo *pConn, const SName* pTableName, STableCfg **out, SCtgTask* pTask);
|
||||||
|
|
||||||
int32_t ctgInitJob(SCatalog* pCtg, SRequestConnInfo *pConn, SCtgJob** job, uint64_t reqId, const SCatalogReq* pReq, catalogCallback fp, void* param, int32_t* taskNum);
|
int32_t ctgInitJob(SCatalog* pCtg, SRequestConnInfo *pConn, SCtgJob** job, uint64_t reqId, const SCatalogReq* pReq, catalogCallback fp, void* param, int32_t* taskNum);
|
||||||
int32_t ctgLaunchJob(SCtgJob *pJob);
|
int32_t ctgLaunchJob(SCtgJob *pJob);
|
||||||
int32_t ctgMakeAsyncRes(SCtgJob *pJob);
|
int32_t ctgMakeAsyncRes(SCtgJob *pJob);
|
||||||
|
int32_t ctgLaunchSubTask(SCtgTask *pTask, CTG_TASK_TYPE type, ctgSubTaskCbFp fp, void* param);
|
||||||
|
int32_t ctgGetTbCfgCb(SCtgTask *pTask);
|
||||||
|
|
||||||
int32_t ctgCloneVgInfo(SDBVgInfo *src, SDBVgInfo **dst);
|
int32_t ctgCloneVgInfo(SDBVgInfo *src, SDBVgInfo **dst);
|
||||||
int32_t ctgCloneMetaOutput(STableMetaOutput *output, STableMetaOutput **pOutput);
|
int32_t ctgCloneMetaOutput(STableMetaOutput *output, STableMetaOutput **pOutput);
|
||||||
|
@ -560,6 +602,7 @@ char * ctgTaskTypeStr(CTG_TASK_TYPE type);
|
||||||
int32_t ctgUpdateSendTargetInfo(SMsgSendInfo *pMsgSendInfo, int32_t msgType, SCtgTask* pTask);
|
int32_t ctgUpdateSendTargetInfo(SMsgSendInfo *pMsgSendInfo, int32_t msgType, SCtgTask* pTask);
|
||||||
int32_t ctgCloneTableIndex(SArray* pIndex, SArray** pRes);
|
int32_t ctgCloneTableIndex(SArray* pIndex, SArray** pRes);
|
||||||
void ctgFreeSTableIndex(void *info);
|
void ctgFreeSTableIndex(void *info);
|
||||||
|
void ctgClearSubTaskRes(SCtgSubRes *pRes);
|
||||||
|
|
||||||
|
|
||||||
extern SCatalogMgmt gCtgMgmt;
|
extern SCatalogMgmt gCtgMgmt;
|
||||||
|
|
|
@ -22,36 +22,6 @@
|
||||||
|
|
||||||
SCatalogMgmt gCtgMgmt = {0};
|
SCatalogMgmt gCtgMgmt = {0};
|
||||||
|
|
||||||
int32_t ctgRemoveTbMetaFromCache(SCatalog* pCtg, SName* pTableName, bool syncReq) {
|
|
||||||
int32_t code = 0;
|
|
||||||
STableMeta* tblMeta = NULL;
|
|
||||||
SCtgTbMetaCtx tbCtx = {0};
|
|
||||||
tbCtx.flag = CTG_FLAG_UNKNOWN_STB;
|
|
||||||
tbCtx.pName = pTableName;
|
|
||||||
|
|
||||||
CTG_ERR_JRET(ctgReadTbMetaFromCache(pCtg, &tbCtx, &tblMeta));
|
|
||||||
|
|
||||||
if (NULL == tblMeta) {
|
|
||||||
ctgDebug("table already not in cache, db:%s, tblName:%s", pTableName->dbname, pTableName->tname);
|
|
||||||
return TSDB_CODE_SUCCESS;
|
|
||||||
}
|
|
||||||
|
|
||||||
char dbFName[TSDB_DB_FNAME_LEN];
|
|
||||||
tNameGetFullDbName(pTableName, dbFName);
|
|
||||||
|
|
||||||
if (TSDB_SUPER_TABLE == tblMeta->tableType) {
|
|
||||||
CTG_ERR_JRET(ctgDropStbMetaEnqueue(pCtg, dbFName, tbCtx.tbInfo.dbId, pTableName->tname, tblMeta->suid, syncReq));
|
|
||||||
} else {
|
|
||||||
CTG_ERR_JRET(ctgDropTbMetaEnqueue(pCtg, dbFName, tbCtx.tbInfo.dbId, pTableName->tname, syncReq));
|
|
||||||
}
|
|
||||||
|
|
||||||
_return:
|
|
||||||
|
|
||||||
taosMemoryFreeClear(tblMeta);
|
|
||||||
|
|
||||||
CTG_RET(code);
|
|
||||||
}
|
|
||||||
|
|
||||||
int32_t ctgGetDBVgInfo(SCatalog* pCtg, SRequestConnInfo *pConn, const char* dbFName, SCtgDBCache** dbCache, SDBVgInfo **pInfo) {
|
int32_t ctgGetDBVgInfo(SCatalog* pCtg, SRequestConnInfo *pConn, const char* dbFName, SCtgDBCache** dbCache, SDBVgInfo **pInfo) {
|
||||||
int32_t code = 0;
|
int32_t code = 0;
|
||||||
|
|
||||||
|
@ -212,29 +182,6 @@ _return:
|
||||||
CTG_RET(code);
|
CTG_RET(code);
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t ctgGetTbMetaFromCache(SCatalog* pCtg, SRequestConnInfo *pConn, SCtgTbMetaCtx* ctx, STableMeta** pTableMeta) {
|
|
||||||
if (CTG_IS_SYS_DBNAME(ctx->pName->dbname)) {
|
|
||||||
CTG_FLAG_SET_SYS_DB(ctx->flag);
|
|
||||||
}
|
|
||||||
|
|
||||||
CTG_ERR_RET(ctgReadTbMetaFromCache(pCtg, ctx, pTableMeta));
|
|
||||||
|
|
||||||
if (*pTableMeta) {
|
|
||||||
if (CTG_FLAG_MATCH_STB(ctx->flag, (*pTableMeta)->tableType) &&
|
|
||||||
((!CTG_FLAG_IS_FORCE_UPDATE(ctx->flag)) || (CTG_FLAG_IS_SYS_DB(ctx->flag)))) {
|
|
||||||
return TSDB_CODE_SUCCESS;
|
|
||||||
}
|
|
||||||
|
|
||||||
taosMemoryFreeClear(*pTableMeta);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (CTG_FLAG_IS_UNKNOWN_STB(ctx->flag)) {
|
|
||||||
CTG_FLAG_SET_STB(ctx->flag, ctx->tbInfo.tbType);
|
|
||||||
}
|
|
||||||
|
|
||||||
return TSDB_CODE_SUCCESS;
|
|
||||||
}
|
|
||||||
|
|
||||||
int32_t ctgGetTbMeta(SCatalog* pCtg, SRequestConnInfo *pConn, SCtgTbMetaCtx* ctx, STableMeta** pTableMeta) {
|
int32_t ctgGetTbMeta(SCatalog* pCtg, SRequestConnInfo *pConn, SCtgTbMetaCtx* ctx, STableMeta** pTableMeta) {
|
||||||
int32_t code = 0;
|
int32_t code = 0;
|
||||||
STableMetaOutput *output = NULL;
|
STableMetaOutput *output = NULL;
|
||||||
|
@ -381,6 +328,23 @@ _return:
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int32_t ctgGetTbType(SCatalog* pCtg, SRequestConnInfo *pConn, SName* pTableName, int32_t *tbType) {
|
||||||
|
char dbFName[TSDB_DB_FNAME_LEN];
|
||||||
|
tNameGetFullDbName(pTableName, dbFName);
|
||||||
|
CTG_ERR_RET(ctgReadTbTypeFromCache(pCtg, dbFName, pTableName->tname, tbType));
|
||||||
|
if (*tbType > 0) {
|
||||||
|
return TSDB_CODE_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
STableMeta* pMeta = NULL;
|
||||||
|
CTG_ERR_RET(catalogGetTableMeta(pCtg, pConn, pTableName, &pMeta));
|
||||||
|
|
||||||
|
*tbType = pMeta->tableType;
|
||||||
|
taosMemoryFree(pMeta);
|
||||||
|
|
||||||
|
return TSDB_CODE_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
int32_t ctgGetTbIndex(SCatalog* pCtg, SRequestConnInfo *pConn, SName* pTableName, SArray** pRes) {
|
int32_t ctgGetTbIndex(SCatalog* pCtg, SRequestConnInfo *pConn, SName* pTableName, SArray** pRes) {
|
||||||
CTG_ERR_RET(ctgReadTbIndexFromCache(pCtg, pTableName, pRes));
|
CTG_ERR_RET(ctgReadTbIndexFromCache(pCtg, pTableName, pRes));
|
||||||
if (*pRes) {
|
if (*pRes) {
|
||||||
|
@ -419,6 +383,20 @@ _return:
|
||||||
CTG_RET(code);
|
CTG_RET(code);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int32_t ctgGetTbCfg(SCatalog* pCtg, SRequestConnInfo *pConn, SName* pTableName, STableCfg** pCfg) {
|
||||||
|
int32_t tbType = 0;
|
||||||
|
CTG_ERR_RET(ctgGetTbType(pCtg, pConn, pTableName, &tbType));
|
||||||
|
|
||||||
|
if (TSDB_SUPER_TABLE == tbType) {
|
||||||
|
CTG_ERR_RET(ctgGetTableCfgFromMnode(pCtg, pConn, pTableName, pCfg, NULL));
|
||||||
|
} else {
|
||||||
|
SVgroupInfo vgroupInfo = {0};
|
||||||
|
CTG_ERR_RET(catalogGetTableHashVgroup(pCtg, pConn, pTableName, &vgroupInfo));
|
||||||
|
CTG_ERR_RET(ctgGetTableCfgFromVnode(pCtg, pConn, pTableName, &vgroupInfo, pCfg, NULL));
|
||||||
|
}
|
||||||
|
|
||||||
|
CTG_RET(TSDB_CODE_SUCCESS);
|
||||||
|
}
|
||||||
|
|
||||||
int32_t ctgGetTbDistVgInfo(SCatalog* pCtg, SRequestConnInfo *pConn, SName* pTableName, SArray** pVgList) {
|
int32_t ctgGetTbDistVgInfo(SCatalog* pCtg, SRequestConnInfo *pConn, SName* pTableName, SArray** pVgList) {
|
||||||
STableMeta *tbMeta = NULL;
|
STableMeta *tbMeta = NULL;
|
||||||
|
@ -1222,6 +1200,23 @@ _return:
|
||||||
CTG_API_LEAVE(code);
|
CTG_API_LEAVE(code);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int32_t catalogRefreshGetTableCfg(SCatalog* pCtg, SRequestConnInfo *pConn, const SName* pTableName, STableCfg** pCfg) {
|
||||||
|
CTG_API_ENTER();
|
||||||
|
|
||||||
|
if (NULL == pCtg || NULL == pConn || NULL == pTableName || NULL == pCfg) {
|
||||||
|
CTG_API_LEAVE(TSDB_CODE_CTG_INVALID_INPUT);
|
||||||
|
}
|
||||||
|
|
||||||
|
int32_t code = 0;
|
||||||
|
CTG_ERR_JRET(catalogRemoveTableMeta(pCtg, (SName*)pTableName));
|
||||||
|
|
||||||
|
CTG_ERR_JRET(ctgGetTbCfg(pCtg, pConn, (SName*)pTableName, pCfg));
|
||||||
|
|
||||||
|
_return:
|
||||||
|
|
||||||
|
CTG_API_LEAVE(code);
|
||||||
|
}
|
||||||
|
|
||||||
int32_t catalogGetUdfInfo(SCatalog* pCtg, SRequestConnInfo *pConn, const char* funcName, SFuncInfo* pInfo) {
|
int32_t catalogGetUdfInfo(SCatalog* pCtg, SRequestConnInfo *pConn, const char* funcName, SFuncInfo* pInfo) {
|
||||||
CTG_API_ENTER();
|
CTG_API_ENTER();
|
||||||
|
|
||||||
|
|
|
@ -20,7 +20,8 @@
|
||||||
#include "systable.h"
|
#include "systable.h"
|
||||||
#include "tref.h"
|
#include "tref.h"
|
||||||
|
|
||||||
int32_t ctgInitGetTbMetaTask(SCtgJob *pJob, int32_t taskIdx, SName *name) {
|
int32_t ctgInitGetTbMetaTask(SCtgJob *pJob, int32_t taskIdx, void* param) {
|
||||||
|
SName *name = (SName*)param;
|
||||||
SCtgTask task = {0};
|
SCtgTask task = {0};
|
||||||
|
|
||||||
task.type = CTG_TASK_GET_TB_META;
|
task.type = CTG_TASK_GET_TB_META;
|
||||||
|
@ -44,12 +45,13 @@ int32_t ctgInitGetTbMetaTask(SCtgJob *pJob, int32_t taskIdx, SName *name) {
|
||||||
|
|
||||||
taosArrayPush(pJob->pTasks, &task);
|
taosArrayPush(pJob->pTasks, &task);
|
||||||
|
|
||||||
qDebug("QID:0x%" PRIx64 " the %d task type %s initialized, tbName:%s", pJob->queryId, taskIdx, ctgTaskTypeStr(task.type), name->tname);
|
qDebug("QID:0x%" PRIx64 " the %dth task type %s initialized, tbName:%s", pJob->queryId, taskIdx, ctgTaskTypeStr(task.type), name->tname);
|
||||||
|
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t ctgInitGetDbVgTask(SCtgJob *pJob, int32_t taskIdx, char *dbFName) {
|
int32_t ctgInitGetDbVgTask(SCtgJob *pJob, int32_t taskIdx, void* param) {
|
||||||
|
char *dbFName = (char*)param;
|
||||||
SCtgTask task = {0};
|
SCtgTask task = {0};
|
||||||
|
|
||||||
task.type = CTG_TASK_GET_DB_VGROUP;
|
task.type = CTG_TASK_GET_DB_VGROUP;
|
||||||
|
@ -67,12 +69,13 @@ int32_t ctgInitGetDbVgTask(SCtgJob *pJob, int32_t taskIdx, char *dbFName) {
|
||||||
|
|
||||||
taosArrayPush(pJob->pTasks, &task);
|
taosArrayPush(pJob->pTasks, &task);
|
||||||
|
|
||||||
qDebug("QID:0x%" PRIx64 " the %d task type %s initialized, dbFName:%s", pJob->queryId, taskIdx, ctgTaskTypeStr(task.type), dbFName);
|
qDebug("QID:0x%" PRIx64 " the %dth task type %s initialized, dbFName:%s", pJob->queryId, taskIdx, ctgTaskTypeStr(task.type), dbFName);
|
||||||
|
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t ctgInitGetDbCfgTask(SCtgJob *pJob, int32_t taskIdx, char *dbFName) {
|
int32_t ctgInitGetDbCfgTask(SCtgJob *pJob, int32_t taskIdx, void* param) {
|
||||||
|
char *dbFName = (char*)param;
|
||||||
SCtgTask task = {0};
|
SCtgTask task = {0};
|
||||||
|
|
||||||
task.type = CTG_TASK_GET_DB_CFG;
|
task.type = CTG_TASK_GET_DB_CFG;
|
||||||
|
@ -90,12 +93,13 @@ int32_t ctgInitGetDbCfgTask(SCtgJob *pJob, int32_t taskIdx, char *dbFName) {
|
||||||
|
|
||||||
taosArrayPush(pJob->pTasks, &task);
|
taosArrayPush(pJob->pTasks, &task);
|
||||||
|
|
||||||
qDebug("QID:0x%" PRIx64 " the %d task type %s initialized, dbFName:%s", pJob->queryId, taskIdx, ctgTaskTypeStr(task.type), dbFName);
|
qDebug("QID:0x%" PRIx64 " the %dth task type %s initialized, dbFName:%s", pJob->queryId, taskIdx, ctgTaskTypeStr(task.type), dbFName);
|
||||||
|
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t ctgInitGetDbInfoTask(SCtgJob *pJob, int32_t taskIdx, char *dbFName) {
|
int32_t ctgInitGetDbInfoTask(SCtgJob *pJob, int32_t taskIdx, void* param) {
|
||||||
|
char *dbFName = (char*)param;
|
||||||
SCtgTask task = {0};
|
SCtgTask task = {0};
|
||||||
|
|
||||||
task.type = CTG_TASK_GET_DB_INFO;
|
task.type = CTG_TASK_GET_DB_INFO;
|
||||||
|
@ -113,13 +117,14 @@ int32_t ctgInitGetDbInfoTask(SCtgJob *pJob, int32_t taskIdx, char *dbFName) {
|
||||||
|
|
||||||
taosArrayPush(pJob->pTasks, &task);
|
taosArrayPush(pJob->pTasks, &task);
|
||||||
|
|
||||||
qDebug("QID:0x%" PRIx64 " the %d task type %s initialized, dbFName:%s", pJob->queryId, taskIdx, ctgTaskTypeStr(task.type), dbFName);
|
qDebug("QID:0x%" PRIx64 " the %dth task type %s initialized, dbFName:%s", pJob->queryId, taskIdx, ctgTaskTypeStr(task.type), dbFName);
|
||||||
|
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
int32_t ctgInitGetTbHashTask(SCtgJob *pJob, int32_t taskIdx, SName *name) {
|
int32_t ctgInitGetTbHashTask(SCtgJob *pJob, int32_t taskIdx, void* param) {
|
||||||
|
SName *name = (SName*)param;
|
||||||
SCtgTask task = {0};
|
SCtgTask task = {0};
|
||||||
|
|
||||||
task.type = CTG_TASK_GET_TB_HASH;
|
task.type = CTG_TASK_GET_TB_HASH;
|
||||||
|
@ -143,12 +148,12 @@ int32_t ctgInitGetTbHashTask(SCtgJob *pJob, int32_t taskIdx, SName *name) {
|
||||||
|
|
||||||
taosArrayPush(pJob->pTasks, &task);
|
taosArrayPush(pJob->pTasks, &task);
|
||||||
|
|
||||||
qDebug("QID:0x%" PRIx64 " the %d task type %s initialized, tableName:%s", pJob->queryId, taskIdx, ctgTaskTypeStr(task.type), name->tname);
|
qDebug("QID:0x%" PRIx64 " the %dth task type %s initialized, tableName:%s", pJob->queryId, taskIdx, ctgTaskTypeStr(task.type), name->tname);
|
||||||
|
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t ctgInitGetQnodeTask(SCtgJob *pJob, int32_t taskIdx) {
|
int32_t ctgInitGetQnodeTask(SCtgJob *pJob, int32_t taskIdx, void* param) {
|
||||||
SCtgTask task = {0};
|
SCtgTask task = {0};
|
||||||
|
|
||||||
task.type = CTG_TASK_GET_QNODE;
|
task.type = CTG_TASK_GET_QNODE;
|
||||||
|
@ -163,7 +168,8 @@ int32_t ctgInitGetQnodeTask(SCtgJob *pJob, int32_t taskIdx) {
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t ctgInitGetIndexTask(SCtgJob *pJob, int32_t taskIdx, char *name) {
|
int32_t ctgInitGetIndexTask(SCtgJob *pJob, int32_t taskIdx, void* param) {
|
||||||
|
char *name = (char*)param;
|
||||||
SCtgTask task = {0};
|
SCtgTask task = {0};
|
||||||
|
|
||||||
task.type = CTG_TASK_GET_INDEX;
|
task.type = CTG_TASK_GET_INDEX;
|
||||||
|
@ -181,12 +187,13 @@ int32_t ctgInitGetIndexTask(SCtgJob *pJob, int32_t taskIdx, char *name) {
|
||||||
|
|
||||||
taosArrayPush(pJob->pTasks, &task);
|
taosArrayPush(pJob->pTasks, &task);
|
||||||
|
|
||||||
qDebug("QID:0x%" PRIx64 " the %d task type %s initialized, indexFName:%s", pJob->queryId, taskIdx, ctgTaskTypeStr(task.type), name);
|
qDebug("QID:0x%" PRIx64 " the %dth task type %s initialized, indexFName:%s", pJob->queryId, taskIdx, ctgTaskTypeStr(task.type), name);
|
||||||
|
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t ctgInitGetUdfTask(SCtgJob *pJob, int32_t taskIdx, char *name) {
|
int32_t ctgInitGetUdfTask(SCtgJob *pJob, int32_t taskIdx, void* param) {
|
||||||
|
char *name = (char*)param;
|
||||||
SCtgTask task = {0};
|
SCtgTask task = {0};
|
||||||
|
|
||||||
task.type = CTG_TASK_GET_UDF;
|
task.type = CTG_TASK_GET_UDF;
|
||||||
|
@ -204,12 +211,13 @@ int32_t ctgInitGetUdfTask(SCtgJob *pJob, int32_t taskIdx, char *name) {
|
||||||
|
|
||||||
taosArrayPush(pJob->pTasks, &task);
|
taosArrayPush(pJob->pTasks, &task);
|
||||||
|
|
||||||
qDebug("QID:0x%" PRIx64 " the %d task type %s initialized, udfName:%s", pJob->queryId, taskIdx, ctgTaskTypeStr(task.type), name);
|
qDebug("QID:0x%" PRIx64 " the %dth task type %s initialized, udfName:%s", pJob->queryId, taskIdx, ctgTaskTypeStr(task.type), name);
|
||||||
|
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t ctgInitGetUserTask(SCtgJob *pJob, int32_t taskIdx, SUserAuthInfo *user) {
|
int32_t ctgInitGetUserTask(SCtgJob *pJob, int32_t taskIdx, void* param) {
|
||||||
|
SUserAuthInfo *user = (SUserAuthInfo*)param;
|
||||||
SCtgTask task = {0};
|
SCtgTask task = {0};
|
||||||
|
|
||||||
task.type = CTG_TASK_GET_USER;
|
task.type = CTG_TASK_GET_USER;
|
||||||
|
@ -227,12 +235,13 @@ int32_t ctgInitGetUserTask(SCtgJob *pJob, int32_t taskIdx, SUserAuthInfo *user)
|
||||||
|
|
||||||
taosArrayPush(pJob->pTasks, &task);
|
taosArrayPush(pJob->pTasks, &task);
|
||||||
|
|
||||||
qDebug("QID:0x%" PRIx64 " the %d task type %s initialized, user:%s", pJob->queryId, taskIdx, ctgTaskTypeStr(task.type), user->user);
|
qDebug("QID:0x%" PRIx64 " the %dth task type %s initialized, user:%s", pJob->queryId, taskIdx, ctgTaskTypeStr(task.type), user->user);
|
||||||
|
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t ctgInitGetTbIndexTask(SCtgJob *pJob, int32_t taskIdx, SName *name) {
|
int32_t ctgInitGetTbIndexTask(SCtgJob *pJob, int32_t taskIdx, void* param) {
|
||||||
|
SName *name = (SName*)param;
|
||||||
SCtgTask task = {0};
|
SCtgTask task = {0};
|
||||||
|
|
||||||
task.type = CTG_TASK_GET_TB_INDEX;
|
task.type = CTG_TASK_GET_TB_INDEX;
|
||||||
|
@ -255,11 +264,41 @@ int32_t ctgInitGetTbIndexTask(SCtgJob *pJob, int32_t taskIdx, SName *name) {
|
||||||
|
|
||||||
taosArrayPush(pJob->pTasks, &task);
|
taosArrayPush(pJob->pTasks, &task);
|
||||||
|
|
||||||
qDebug("QID:0x%" PRIx64 " the %d task type %s initialized, tbName:%s", pJob->queryId, taskIdx, ctgTaskTypeStr(task.type), name->tname);
|
qDebug("QID:0x%" PRIx64 " the %dth task type %s initialized, tbName:%s", pJob->queryId, taskIdx, ctgTaskTypeStr(task.type), name->tname);
|
||||||
|
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int32_t ctgInitGetTbCfgTask(SCtgJob *pJob, int32_t taskIdx, void* param) {
|
||||||
|
SName *name = (SName*)param;
|
||||||
|
SCtgTask task = {0};
|
||||||
|
|
||||||
|
task.type = CTG_TASK_GET_TB_CFG;
|
||||||
|
task.taskId = taskIdx;
|
||||||
|
task.pJob = pJob;
|
||||||
|
|
||||||
|
task.taskCtx = taosMemoryCalloc(1, sizeof(SCtgTbCfgCtx));
|
||||||
|
if (NULL == task.taskCtx) {
|
||||||
|
CTG_ERR_RET(TSDB_CODE_OUT_OF_MEMORY);
|
||||||
|
}
|
||||||
|
|
||||||
|
SCtgTbCfgCtx* ctx = task.taskCtx;
|
||||||
|
ctx->pName = taosMemoryMalloc(sizeof(*name));
|
||||||
|
if (NULL == ctx->pName) {
|
||||||
|
taosMemoryFree(task.taskCtx);
|
||||||
|
CTG_ERR_RET(TSDB_CODE_OUT_OF_MEMORY);
|
||||||
|
}
|
||||||
|
|
||||||
|
memcpy(ctx->pName, name, sizeof(*name));
|
||||||
|
|
||||||
|
taosArrayPush(pJob->pTasks, &task);
|
||||||
|
|
||||||
|
qDebug("QID:0x%" PRIx64 " the %dth task type %s initialized, tbName:%s", pJob->queryId, taskIdx, ctgTaskTypeStr(task.type), name->tname);
|
||||||
|
|
||||||
|
return TSDB_CODE_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
int32_t ctgHandleForceUpdate(SCatalog* pCtg, int32_t taskNum, SCtgJob *pJob, const SCatalogReq* pReq) {
|
int32_t ctgHandleForceUpdate(SCatalog* pCtg, int32_t taskNum, SCtgJob *pJob, const SCatalogReq* pReq) {
|
||||||
SHashObj* pDb = taosHashInit(taskNum, taosGetDefaultHashFunction(TSDB_DATA_TYPE_BINARY), false, HASH_NO_LOCK);
|
SHashObj* pDb = taosHashInit(taskNum, taosGetDefaultHashFunction(TSDB_DATA_TYPE_BINARY), false, HASH_NO_LOCK);
|
||||||
|
@ -296,6 +335,13 @@ int32_t ctgHandleForceUpdate(SCatalog* pCtg, int32_t taskNum, SCtgJob *pJob, con
|
||||||
taosHashPut(pDb, dbFName, strlen(dbFName), dbFName, TSDB_DB_FNAME_LEN);
|
taosHashPut(pDb, dbFName, strlen(dbFName), dbFName, TSDB_DB_FNAME_LEN);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
for (int32_t i = 0; i < pJob->tbCfgNum; ++i) {
|
||||||
|
SName* name = taosArrayGet(pReq->pTableCfg, i);
|
||||||
|
char dbFName[TSDB_DB_FNAME_LEN];
|
||||||
|
tNameGetFullDbName(name, dbFName);
|
||||||
|
taosHashPut(pDb, dbFName, strlen(dbFName), dbFName, TSDB_DB_FNAME_LEN);
|
||||||
|
}
|
||||||
|
|
||||||
char* dbFName = taosHashIterate(pDb, NULL);
|
char* dbFName = taosHashIterate(pDb, NULL);
|
||||||
while (dbFName) {
|
while (dbFName) {
|
||||||
ctgDropDbVgroupEnqueue(pCtg, dbFName, true);
|
ctgDropDbVgroupEnqueue(pCtg, dbFName, true);
|
||||||
|
@ -304,10 +350,8 @@ int32_t ctgHandleForceUpdate(SCatalog* pCtg, int32_t taskNum, SCtgJob *pJob, con
|
||||||
|
|
||||||
taosHashCleanup(pDb);
|
taosHashCleanup(pDb);
|
||||||
|
|
||||||
int32_t tbNum = pJob->tbMetaNum + pJob->tbHashNum;
|
// REFRESH TABLE META
|
||||||
if (tbNum > 0) {
|
SHashObj* pTb = taosHashInit(taskNum, taosGetDefaultHashFunction(TSDB_DATA_TYPE_BINARY), false, HASH_NO_LOCK);
|
||||||
if (tbNum > pJob->tbMetaNum && tbNum > pJob->tbHashNum) {
|
|
||||||
SHashObj* pTb = taosHashInit(tbNum, taosGetDefaultHashFunction(TSDB_DATA_TYPE_BINARY), false, HASH_NO_LOCK);
|
|
||||||
for (int32_t i = 0; i < pJob->tbMetaNum; ++i) {
|
for (int32_t i = 0; i < pJob->tbMetaNum; ++i) {
|
||||||
SName* name = taosArrayGet(pReq->pTableMeta, i);
|
SName* name = taosArrayGet(pReq->pTableMeta, i);
|
||||||
taosHashPut(pTb, name, sizeof(SName), name, sizeof(SName));
|
taosHashPut(pTb, name, sizeof(SName), name, sizeof(SName));
|
||||||
|
@ -318,6 +362,11 @@ int32_t ctgHandleForceUpdate(SCatalog* pCtg, int32_t taskNum, SCtgJob *pJob, con
|
||||||
taosHashPut(pTb, name, sizeof(SName), name, sizeof(SName));
|
taosHashPut(pTb, name, sizeof(SName), name, sizeof(SName));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
for (int32_t i = 0; i < pJob->tbCfgNum; ++i) {
|
||||||
|
SName* name = taosArrayGet(pReq->pTableCfg, i);
|
||||||
|
taosHashPut(pTb, name, sizeof(SName), name, sizeof(SName));
|
||||||
|
}
|
||||||
|
|
||||||
SName* name = taosHashIterate(pTb, NULL);
|
SName* name = taosHashIterate(pTb, NULL);
|
||||||
while (name) {
|
while (name) {
|
||||||
catalogRemoveTableMeta(pCtg, name);
|
catalogRemoveTableMeta(pCtg, name);
|
||||||
|
@ -325,18 +374,7 @@ int32_t ctgHandleForceUpdate(SCatalog* pCtg, int32_t taskNum, SCtgJob *pJob, con
|
||||||
}
|
}
|
||||||
|
|
||||||
taosHashCleanup(pTb);
|
taosHashCleanup(pTb);
|
||||||
} else {
|
|
||||||
for (int32_t i = 0; i < pJob->tbMetaNum; ++i) {
|
|
||||||
SName* name = taosArrayGet(pReq->pTableMeta, i);
|
|
||||||
catalogRemoveTableMeta(pCtg, name);
|
|
||||||
}
|
|
||||||
|
|
||||||
for (int32_t i = 0; i < pJob->tbHashNum; ++i) {
|
|
||||||
SName* name = taosArrayGet(pReq->pTableHash, i);
|
|
||||||
catalogRemoveTableMeta(pCtg, name);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
for (int32_t i = 0; i < pJob->tbIndexNum; ++i) {
|
for (int32_t i = 0; i < pJob->tbIndexNum; ++i) {
|
||||||
SName* name = taosArrayGet(pReq->pTableIndex, i);
|
SName* name = taosArrayGet(pReq->pTableIndex, i);
|
||||||
|
@ -346,6 +384,20 @@ int32_t ctgHandleForceUpdate(SCatalog* pCtg, int32_t taskNum, SCtgJob *pJob, con
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int32_t ctgInitTask(SCtgJob *pJob, CTG_TASK_TYPE type, void* param, int32_t *taskId) {
|
||||||
|
int32_t tid = atomic_fetch_add_32(&pJob->taskIdx, 1);
|
||||||
|
|
||||||
|
CTG_LOCK(CTG_WRITE, &pJob->taskLock);
|
||||||
|
CTG_ERR_RET((*gCtgAsyncFps[type].initFp)(pJob, tid, param));
|
||||||
|
CTG_UNLOCK(CTG_WRITE, &pJob->taskLock);
|
||||||
|
|
||||||
|
if (taskId) {
|
||||||
|
*taskId = tid;
|
||||||
|
}
|
||||||
|
|
||||||
|
return TSDB_CODE_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
int32_t ctgInitJob(SCatalog* pCtg, SRequestConnInfo *pConn, SCtgJob** job, uint64_t reqId, const SCatalogReq* pReq, catalogCallback fp, void* param, int32_t* taskNum) {
|
int32_t ctgInitJob(SCatalog* pCtg, SRequestConnInfo *pConn, SCtgJob** job, uint64_t reqId, const SCatalogReq* pReq, catalogCallback fp, void* param, int32_t* taskNum) {
|
||||||
int32_t code = 0;
|
int32_t code = 0;
|
||||||
int32_t tbMetaNum = (int32_t)taosArrayGetSize(pReq->pTableMeta);
|
int32_t tbMetaNum = (int32_t)taosArrayGetSize(pReq->pTableMeta);
|
||||||
|
@ -359,8 +411,9 @@ int32_t ctgInitJob(SCatalog* pCtg, SRequestConnInfo *pConn, SCtgJob** job, uint6
|
||||||
int32_t userNum = (int32_t)taosArrayGetSize(pReq->pUser);
|
int32_t userNum = (int32_t)taosArrayGetSize(pReq->pUser);
|
||||||
int32_t dbInfoNum = (int32_t)taosArrayGetSize(pReq->pDbInfo);
|
int32_t dbInfoNum = (int32_t)taosArrayGetSize(pReq->pDbInfo);
|
||||||
int32_t tbIndexNum = (int32_t)taosArrayGetSize(pReq->pTableIndex);
|
int32_t tbIndexNum = (int32_t)taosArrayGetSize(pReq->pTableIndex);
|
||||||
|
int32_t tbCfgNum = (int32_t)taosArrayGetSize(pReq->pTableCfg);
|
||||||
|
|
||||||
*taskNum = tbMetaNum + dbVgNum + udfNum + tbHashNum + qnodeNum + dnodeNum + dbCfgNum + indexNum + userNum + dbInfoNum + tbIndexNum;
|
*taskNum = tbMetaNum + dbVgNum + udfNum + tbHashNum + qnodeNum + dnodeNum + dbCfgNum + indexNum + userNum + dbInfoNum + tbIndexNum + tbCfgNum;
|
||||||
if (*taskNum <= 0) {
|
if (*taskNum <= 0) {
|
||||||
ctgDebug("Empty input for job, no need to retrieve meta, reqId:0x%" PRIx64, reqId);
|
ctgDebug("Empty input for job, no need to retrieve meta, reqId:0x%" PRIx64, reqId);
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
|
@ -391,6 +444,7 @@ int32_t ctgInitJob(SCatalog* pCtg, SRequestConnInfo *pConn, SCtgJob** job, uint6
|
||||||
pJob->userNum = userNum;
|
pJob->userNum = userNum;
|
||||||
pJob->dbInfoNum = dbInfoNum;
|
pJob->dbInfoNum = dbInfoNum;
|
||||||
pJob->tbIndexNum = tbIndexNum;
|
pJob->tbIndexNum = tbIndexNum;
|
||||||
|
pJob->tbCfgNum = tbCfgNum;
|
||||||
|
|
||||||
pJob->pTasks = taosArrayInit(*taskNum, sizeof(SCtgTask));
|
pJob->pTasks = taosArrayInit(*taskNum, sizeof(SCtgTask));
|
||||||
|
|
||||||
|
@ -403,54 +457,58 @@ int32_t ctgInitJob(SCatalog* pCtg, SRequestConnInfo *pConn, SCtgJob** job, uint6
|
||||||
CTG_ERR_JRET(ctgHandleForceUpdate(pCtg, *taskNum, pJob, pReq));
|
CTG_ERR_JRET(ctgHandleForceUpdate(pCtg, *taskNum, pJob, pReq));
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t taskIdx = 0;
|
|
||||||
for (int32_t i = 0; i < dbVgNum; ++i) {
|
for (int32_t i = 0; i < dbVgNum; ++i) {
|
||||||
char* dbFName = taosArrayGet(pReq->pDbVgroup, i);
|
char* dbFName = taosArrayGet(pReq->pDbVgroup, i);
|
||||||
CTG_ERR_JRET(ctgInitGetDbVgTask(pJob, taskIdx++, dbFName));
|
CTG_ERR_JRET(ctgInitTask(pJob, CTG_TASK_GET_DB_VGROUP, dbFName, NULL));
|
||||||
}
|
}
|
||||||
|
|
||||||
for (int32_t i = 0; i < dbCfgNum; ++i) {
|
for (int32_t i = 0; i < dbCfgNum; ++i) {
|
||||||
char* dbFName = taosArrayGet(pReq->pDbCfg, i);
|
char* dbFName = taosArrayGet(pReq->pDbCfg, i);
|
||||||
CTG_ERR_JRET(ctgInitGetDbCfgTask(pJob, taskIdx++, dbFName));
|
CTG_ERR_JRET(ctgInitTask(pJob, CTG_TASK_GET_DB_CFG, dbFName, NULL));
|
||||||
}
|
}
|
||||||
|
|
||||||
for (int32_t i = 0; i < dbInfoNum; ++i) {
|
for (int32_t i = 0; i < dbInfoNum; ++i) {
|
||||||
char* dbFName = taosArrayGet(pReq->pDbInfo, i);
|
char* dbFName = taosArrayGet(pReq->pDbInfo, i);
|
||||||
CTG_ERR_JRET(ctgInitGetDbInfoTask(pJob, taskIdx++, dbFName));
|
CTG_ERR_JRET(ctgInitTask(pJob, CTG_TASK_GET_DB_INFO, dbFName, NULL));
|
||||||
}
|
}
|
||||||
|
|
||||||
for (int32_t i = 0; i < tbMetaNum; ++i) {
|
for (int32_t i = 0; i < tbMetaNum; ++i) {
|
||||||
SName* name = taosArrayGet(pReq->pTableMeta, i);
|
SName* name = taosArrayGet(pReq->pTableMeta, i);
|
||||||
CTG_ERR_JRET(ctgInitGetTbMetaTask(pJob, taskIdx++, name));
|
CTG_ERR_JRET(ctgInitTask(pJob, CTG_TASK_GET_TB_META, name, NULL));
|
||||||
}
|
}
|
||||||
|
|
||||||
for (int32_t i = 0; i < tbHashNum; ++i) {
|
for (int32_t i = 0; i < tbHashNum; ++i) {
|
||||||
SName* name = taosArrayGet(pReq->pTableHash, i);
|
SName* name = taosArrayGet(pReq->pTableHash, i);
|
||||||
CTG_ERR_JRET(ctgInitGetTbHashTask(pJob, taskIdx++, name));
|
CTG_ERR_JRET(ctgInitTask(pJob, CTG_TASK_GET_TB_HASH, name, NULL));
|
||||||
}
|
}
|
||||||
|
|
||||||
for (int32_t i = 0; i < tbIndexNum; ++i) {
|
for (int32_t i = 0; i < tbIndexNum; ++i) {
|
||||||
SName* name = taosArrayGet(pReq->pTableIndex, i);
|
SName* name = taosArrayGet(pReq->pTableIndex, i);
|
||||||
CTG_ERR_JRET(ctgInitGetTbIndexTask(pJob, taskIdx++, name));
|
CTG_ERR_JRET(ctgInitTask(pJob, CTG_TASK_GET_TB_INDEX, name, NULL));
|
||||||
|
}
|
||||||
|
|
||||||
|
for (int32_t i = 0; i < tbCfgNum; ++i) {
|
||||||
|
SName* name = taosArrayGet(pReq->pTableCfg, i);
|
||||||
|
CTG_ERR_JRET(ctgInitTask(pJob, CTG_TASK_GET_TB_CFG, name, NULL));
|
||||||
}
|
}
|
||||||
|
|
||||||
for (int32_t i = 0; i < indexNum; ++i) {
|
for (int32_t i = 0; i < indexNum; ++i) {
|
||||||
char* indexName = taosArrayGet(pReq->pIndex, i);
|
char* indexName = taosArrayGet(pReq->pIndex, i);
|
||||||
CTG_ERR_JRET(ctgInitGetIndexTask(pJob, taskIdx++, indexName));
|
CTG_ERR_JRET(ctgInitTask(pJob, CTG_TASK_GET_INDEX, indexName, NULL));
|
||||||
}
|
}
|
||||||
|
|
||||||
for (int32_t i = 0; i < udfNum; ++i) {
|
for (int32_t i = 0; i < udfNum; ++i) {
|
||||||
char* udfName = taosArrayGet(pReq->pUdf, i);
|
char* udfName = taosArrayGet(pReq->pUdf, i);
|
||||||
CTG_ERR_JRET(ctgInitGetUdfTask(pJob, taskIdx++, udfName));
|
CTG_ERR_JRET(ctgInitTask(pJob, CTG_TASK_GET_UDF, udfName, NULL));
|
||||||
}
|
}
|
||||||
|
|
||||||
for (int32_t i = 0; i < userNum; ++i) {
|
for (int32_t i = 0; i < userNum; ++i) {
|
||||||
SUserAuthInfo* user = taosArrayGet(pReq->pUser, i);
|
SUserAuthInfo* user = taosArrayGet(pReq->pUser, i);
|
||||||
CTG_ERR_JRET(ctgInitGetUserTask(pJob, taskIdx++, user));
|
CTG_ERR_JRET(ctgInitTask(pJob, CTG_TASK_GET_USER, user, NULL));
|
||||||
}
|
}
|
||||||
|
|
||||||
if (qnodeNum) {
|
if (qnodeNum) {
|
||||||
CTG_ERR_JRET(ctgInitGetQnodeTask(pJob, taskIdx++));
|
CTG_ERR_JRET(ctgInitTask(pJob, CTG_TASK_GET_QNODE, NULL, NULL));
|
||||||
}
|
}
|
||||||
|
|
||||||
pJob->refId = taosAddRef(gCtgMgmt.jobPool, pJob);
|
pJob->refId = taosAddRef(gCtgMgmt.jobPool, pJob);
|
||||||
|
@ -530,6 +588,21 @@ int32_t ctgDumpTbIndexRes(SCtgTask* pTask) {
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int32_t ctgDumpTbCfgRes(SCtgTask* pTask) {
|
||||||
|
SCtgJob* pJob = pTask->pJob;
|
||||||
|
if (NULL == pJob->jobRes.pTableCfg) {
|
||||||
|
pJob->jobRes.pTableCfg = taosArrayInit(pJob->tbCfgNum, sizeof(SMetaRes));
|
||||||
|
if (NULL == pJob->jobRes.pTableCfg) {
|
||||||
|
CTG_ERR_RET(TSDB_CODE_OUT_OF_MEMORY);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
SMetaRes res = {.code = pTask->code, .pRes = pTask->res};
|
||||||
|
taosArrayPush(pJob->jobRes.pTableCfg, &res);
|
||||||
|
|
||||||
|
return TSDB_CODE_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
int32_t ctgDumpIndexRes(SCtgTask* pTask) {
|
int32_t ctgDumpIndexRes(SCtgTask* pTask) {
|
||||||
SCtgJob* pJob = pTask->pJob;
|
SCtgJob* pJob = pTask->pJob;
|
||||||
if (NULL == pJob->jobRes.pIndex) {
|
if (NULL == pJob->jobRes.pIndex) {
|
||||||
|
@ -620,13 +693,48 @@ int32_t ctgDumpUserRes(SCtgTask* pTask) {
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int32_t ctgInvokeSubCb(SCtgTask *pTask) {
|
||||||
|
int32_t code = 0;
|
||||||
|
|
||||||
|
CTG_LOCK(CTG_WRITE, &pTask->lock);
|
||||||
|
|
||||||
|
int32_t parentNum = taosArrayGetSize(pTask->pParents);
|
||||||
|
for (int32_t i = 0; i < parentNum; ++i) {
|
||||||
|
SCtgTask* pParent = taosArrayGetP(pTask->pParents, i);
|
||||||
|
|
||||||
|
pParent->subRes.code = pTask->code;
|
||||||
|
if (TSDB_CODE_SUCCESS == pTask->code) {
|
||||||
|
code = (*gCtgAsyncFps[pTask->type].cloneFp)(pTask, &pParent->subRes.res);
|
||||||
|
if (code) {
|
||||||
|
pParent->subRes.code = code;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
CTG_ERR_JRET(pParent->subRes.fp(pParent));
|
||||||
|
}
|
||||||
|
|
||||||
|
_return:
|
||||||
|
|
||||||
|
CTG_UNLOCK(CTG_WRITE, &pTask->lock);
|
||||||
|
|
||||||
|
CTG_RET(code);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
int32_t ctgHandleTaskEnd(SCtgTask* pTask, int32_t rspCode) {
|
int32_t ctgHandleTaskEnd(SCtgTask* pTask, int32_t rspCode) {
|
||||||
SCtgJob* pJob = pTask->pJob;
|
SCtgJob* pJob = pTask->pJob;
|
||||||
int32_t code = 0;
|
int32_t code = 0;
|
||||||
|
|
||||||
|
if (CTG_TASK_DONE == pTask->status) {
|
||||||
|
return TSDB_CODE_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
qDebug("QID:0x%" PRIx64 " task %d end with res %s", pJob->queryId, pTask->taskId, tstrerror(rspCode));
|
qDebug("QID:0x%" PRIx64 " task %d end with res %s", pJob->queryId, pTask->taskId, tstrerror(rspCode));
|
||||||
|
|
||||||
pTask->code = rspCode;
|
pTask->code = rspCode;
|
||||||
|
pTask->status = CTG_TASK_DONE;
|
||||||
|
|
||||||
|
ctgInvokeSubCb(pTask);
|
||||||
|
|
||||||
int32_t taskDone = atomic_add_fetch_32(&pJob->taskDone, 1);
|
int32_t taskDone = atomic_add_fetch_32(&pJob->taskDone, 1);
|
||||||
if (taskDone < taosArrayGetSize(pJob->pTasks)) {
|
if (taskDone < taosArrayGetSize(pJob->pTasks)) {
|
||||||
|
@ -638,7 +746,7 @@ int32_t ctgHandleTaskEnd(SCtgTask* pTask, int32_t rspCode) {
|
||||||
|
|
||||||
_return:
|
_return:
|
||||||
|
|
||||||
qDebug("QID:0x%" PRIx64 " user callback with rsp %s", pJob->queryId, tstrerror(code));
|
qDebug("QID:0x%" PRIx64 " ctg call user callback with rsp %s", pJob->queryId, tstrerror(code));
|
||||||
|
|
||||||
(*pJob->userFp)(&pJob->jobRes, pJob->userParam, code);
|
(*pJob->userFp)(&pJob->jobRes, pJob->userParam, code);
|
||||||
|
|
||||||
|
@ -804,11 +912,12 @@ int32_t ctgHandleGetDbVgRsp(SCtgTask* pTask, int32_t reqType, const SDataBuf *pM
|
||||||
switch (reqType) {
|
switch (reqType) {
|
||||||
case TDMT_MND_USE_DB: {
|
case TDMT_MND_USE_DB: {
|
||||||
SUseDbOutput* pOut = (SUseDbOutput*)pTask->msgCtx.out;
|
SUseDbOutput* pOut = (SUseDbOutput*)pTask->msgCtx.out;
|
||||||
|
SDBVgInfo* pDb = NULL;
|
||||||
|
|
||||||
CTG_ERR_JRET(ctgGenerateVgList(pCtg, pOut->dbVgroup->vgHash, (SArray**)&pTask->res));
|
CTG_ERR_JRET(ctgGenerateVgList(pCtg, pOut->dbVgroup->vgHash, (SArray**)&pTask->res));
|
||||||
|
|
||||||
CTG_ERR_JRET(ctgUpdateVgroupEnqueue(pCtg, ctx->dbFName, pOut->dbId, pOut->dbVgroup, false));
|
CTG_ERR_JRET(cloneDbVgInfo(pOut->dbVgroup, &pDb));
|
||||||
pOut->dbVgroup = NULL;
|
CTG_ERR_JRET(ctgUpdateVgroupEnqueue(pCtg, ctx->dbFName, pOut->dbId, pDb, false));
|
||||||
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -876,6 +985,7 @@ int32_t ctgHandleGetTbIndexRsp(SCtgTask* pTask, int32_t reqType, const SDataBuf
|
||||||
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:
|
||||||
|
|
||||||
if (TSDB_CODE_MND_DB_INDEX_NOT_EXIST == code) {
|
if (TSDB_CODE_MND_DB_INDEX_NOT_EXIST == code) {
|
||||||
code = TSDB_CODE_SUCCESS;
|
code = TSDB_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
|
@ -884,6 +994,18 @@ _return:
|
||||||
CTG_RET(code);
|
CTG_RET(code);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int32_t ctgHandleGetTbCfgRsp(SCtgTask* pTask, int32_t reqType, const SDataBuf *pMsg, int32_t rspCode) {
|
||||||
|
int32_t code = 0;
|
||||||
|
CTG_ERR_JRET(ctgProcessRspMsg(&pTask->msgCtx.out, reqType, pMsg->pData, pMsg->len, rspCode, pTask->msgCtx.target));
|
||||||
|
|
||||||
|
TSWAP(pTask->res, pTask->msgCtx.out);
|
||||||
|
|
||||||
|
_return:
|
||||||
|
|
||||||
|
ctgHandleTaskEnd(pTask, code);
|
||||||
|
|
||||||
|
CTG_RET(code);
|
||||||
|
}
|
||||||
|
|
||||||
int32_t ctgHandleGetDbCfgRsp(SCtgTask* pTask, int32_t reqType, const SDataBuf *pMsg, int32_t rspCode) {
|
int32_t ctgHandleGetDbCfgRsp(SCtgTask* pTask, int32_t reqType, const SDataBuf *pMsg, int32_t rspCode) {
|
||||||
int32_t code = 0;
|
int32_t code = 0;
|
||||||
|
@ -1140,6 +1262,48 @@ int32_t ctgLaunchGetTbIndexTask(SCtgTask *pTask) {
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int32_t ctgLaunchGetTbCfgTask(SCtgTask *pTask) {
|
||||||
|
int32_t code = 0;
|
||||||
|
SCatalog* pCtg = pTask->pJob->pCtg;
|
||||||
|
SRequestConnInfo* pConn = &pTask->pJob->conn;
|
||||||
|
SCtgTbCfgCtx* pCtx = (SCtgTbCfgCtx*)pTask->taskCtx;
|
||||||
|
SArray* pRes = NULL;
|
||||||
|
char dbFName[TSDB_DB_FNAME_LEN];
|
||||||
|
tNameGetFullDbName(pCtx->pName, dbFName);
|
||||||
|
|
||||||
|
if (pCtx->tbType <= 0) {
|
||||||
|
CTG_ERR_JRET(ctgReadTbTypeFromCache(pCtg, dbFName, pCtx->pName->tname, &pCtx->tbType));
|
||||||
|
if (pCtx->tbType <= 0) {
|
||||||
|
CTG_ERR_JRET(ctgLaunchSubTask(pTask, CTG_TASK_GET_TB_META, ctgGetTbCfgCb, pCtx->pName));
|
||||||
|
return TSDB_CODE_SUCCESS;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (TSDB_SUPER_TABLE == pCtx->tbType) {
|
||||||
|
CTG_ERR_JRET(ctgGetTableCfgFromMnode(pCtg, pConn, pCtx->pName, NULL, pTask));
|
||||||
|
} else {
|
||||||
|
if (NULL == pCtx->pVgInfo) {
|
||||||
|
CTG_ERR_JRET(ctgGetTbHashVgroupFromCache(pCtg, pCtx->pName, &pCtx->pVgInfo));
|
||||||
|
if (NULL == pCtx->pVgInfo) {
|
||||||
|
CTG_ERR_JRET(ctgLaunchSubTask(pTask, CTG_TASK_GET_DB_VGROUP, ctgGetTbCfgCb, dbFName));
|
||||||
|
return TSDB_CODE_SUCCESS;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
CTG_ERR_JRET(ctgGetTableCfgFromVnode(pCtg, pConn, pCtx->pName, pCtx->pVgInfo, NULL, pTask));
|
||||||
|
}
|
||||||
|
|
||||||
|
return TSDB_CODE_SUCCESS;
|
||||||
|
|
||||||
|
_return:
|
||||||
|
|
||||||
|
if (CTG_TASK_LAUNCHED == pTask->status) {
|
||||||
|
ctgHandleTaskEnd(pTask, code);
|
||||||
|
}
|
||||||
|
|
||||||
|
CTG_RET(code);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
int32_t ctgLaunchGetQnodeTask(SCtgTask *pTask) {
|
int32_t ctgLaunchGetQnodeTask(SCtgTask *pTask) {
|
||||||
SCatalog* pCtg = pTask->pJob->pCtg;
|
SCatalog* pCtg = pTask->pJob->pCtg;
|
||||||
|
@ -1246,17 +1410,70 @@ int32_t ctgRelaunchGetTbMetaTask(SCtgTask *pTask) {
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int32_t ctgGetTbCfgCb(SCtgTask *pTask) {
|
||||||
|
int32_t code = 0;
|
||||||
|
|
||||||
|
CTG_ERR_JRET(pTask->subRes.code);
|
||||||
|
|
||||||
|
SCtgTbCfgCtx* pCtx = (SCtgTbCfgCtx*)pTask->taskCtx;
|
||||||
|
if (CTG_TASK_GET_TB_META == pTask->subRes.type) {
|
||||||
|
pCtx->tbType = ((STableMeta*)pTask->subRes.res)->tableType;
|
||||||
|
} else if (CTG_TASK_GET_DB_VGROUP == pTask->subRes.type) {
|
||||||
|
SDBVgInfo* pDb = (SDBVgInfo*)pTask->subRes.res;
|
||||||
|
|
||||||
|
pCtx->pVgInfo = taosMemoryCalloc(1, sizeof(SVgroupInfo));
|
||||||
|
CTG_ERR_JRET(ctgGetVgInfoFromHashValue(pTask->pJob->pCtg, pDb, pCtx->pName, pCtx->pVgInfo));
|
||||||
|
}
|
||||||
|
|
||||||
|
CTG_RET(ctgLaunchGetTbCfgTask(pTask));
|
||||||
|
|
||||||
|
_return:
|
||||||
|
|
||||||
|
CTG_RET(ctgHandleTaskEnd(pTask, pTask->subRes.code));
|
||||||
|
}
|
||||||
|
|
||||||
|
int32_t ctgCompDbVgTasks(SCtgTask* pTask, void* param, bool* equal) {
|
||||||
|
SCtgDbVgCtx* ctx = pTask->taskCtx;
|
||||||
|
|
||||||
|
*equal = (0 == strcmp(ctx->dbFName, param));
|
||||||
|
|
||||||
|
return TSDB_CODE_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int32_t ctgCompTbMetaTasks(SCtgTask* pTask, void* param, bool* equal) {
|
||||||
|
SCtgTbMetaCtx* ctx = pTask->taskCtx;
|
||||||
|
|
||||||
|
*equal = tNameTbNameEqual(ctx->pName, (SName*)param);
|
||||||
|
|
||||||
|
return TSDB_CODE_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
int32_t ctgCloneTbMeta(SCtgTask* pTask, void** pRes) {
|
||||||
|
STableMeta* pMeta = (STableMeta*)pTask->res;
|
||||||
|
|
||||||
|
CTG_RET(cloneTableMeta(pMeta, (STableMeta**)pRes));
|
||||||
|
}
|
||||||
|
|
||||||
|
int32_t ctgCloneDbVg(SCtgTask* pTask, void** pRes) {
|
||||||
|
SUseDbOutput* pOut = (SUseDbOutput*)pTask->msgCtx.out;
|
||||||
|
|
||||||
|
CTG_RET(cloneDbVgInfo(pOut->dbVgroup, (SDBVgInfo**)pRes));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
SCtgAsyncFps gCtgAsyncFps[] = {
|
SCtgAsyncFps gCtgAsyncFps[] = {
|
||||||
{ctgLaunchGetQnodeTask, ctgHandleGetQnodeRsp, ctgDumpQnodeRes},
|
{ctgInitGetQnodeTask, ctgLaunchGetQnodeTask, ctgHandleGetQnodeRsp, ctgDumpQnodeRes, NULL, NULL},
|
||||||
{ctgLaunchGetDbVgTask, ctgHandleGetDbVgRsp, ctgDumpDbVgRes},
|
{ctgInitGetDbVgTask, ctgLaunchGetDbVgTask, ctgHandleGetDbVgRsp, ctgDumpDbVgRes, ctgCompDbVgTasks, ctgCloneDbVg},
|
||||||
{ctgLaunchGetDbCfgTask, ctgHandleGetDbCfgRsp, ctgDumpDbCfgRes},
|
{ctgInitGetDbCfgTask, ctgLaunchGetDbCfgTask, ctgHandleGetDbCfgRsp, ctgDumpDbCfgRes, NULL, NULL},
|
||||||
{ctgLaunchGetDbInfoTask, ctgHandleGetDbInfoRsp, ctgDumpDbInfoRes},
|
{ctgInitGetDbInfoTask, ctgLaunchGetDbInfoTask, ctgHandleGetDbInfoRsp, ctgDumpDbInfoRes, NULL, NULL},
|
||||||
{ctgLaunchGetTbMetaTask, ctgHandleGetTbMetaRsp, ctgDumpTbMetaRes},
|
{ctgInitGetTbMetaTask, ctgLaunchGetTbMetaTask, ctgHandleGetTbMetaRsp, ctgDumpTbMetaRes, ctgCompTbMetaTasks, ctgCloneTbMeta},
|
||||||
{ctgLaunchGetTbHashTask, ctgHandleGetTbHashRsp, ctgDumpTbHashRes},
|
{ctgInitGetTbHashTask, ctgLaunchGetTbHashTask, ctgHandleGetTbHashRsp, ctgDumpTbHashRes, NULL, NULL},
|
||||||
{ctgLaunchGetTbIndexTask, ctgHandleGetTbIndexRsp, ctgDumpTbIndexRes},
|
{ctgInitGetTbIndexTask, ctgLaunchGetTbIndexTask, ctgHandleGetTbIndexRsp, ctgDumpTbIndexRes, NULL, NULL},
|
||||||
{ctgLaunchGetIndexTask, ctgHandleGetIndexRsp, ctgDumpIndexRes},
|
{ctgInitGetTbCfgTask, ctgLaunchGetTbCfgTask, ctgHandleGetTbCfgRsp, ctgDumpTbCfgRes, NULL, NULL},
|
||||||
{ctgLaunchGetUdfTask, ctgHandleGetUdfRsp, ctgDumpUdfRes},
|
{ctgInitGetIndexTask, ctgLaunchGetIndexTask, ctgHandleGetIndexRsp, ctgDumpIndexRes, NULL, NULL},
|
||||||
{ctgLaunchGetUserTask, ctgHandleGetUserRsp, ctgDumpUserRes},
|
{ctgInitGetUdfTask, ctgLaunchGetUdfTask, ctgHandleGetUdfRsp, ctgDumpUdfRes, NULL, NULL},
|
||||||
|
{ctgInitGetUserTask, ctgLaunchGetUserTask, ctgHandleGetUserRsp, ctgDumpUserRes, NULL, NULL},
|
||||||
};
|
};
|
||||||
|
|
||||||
int32_t ctgMakeAsyncRes(SCtgJob *pJob) {
|
int32_t ctgMakeAsyncRes(SCtgJob *pJob) {
|
||||||
|
@ -1271,6 +1488,86 @@ int32_t ctgMakeAsyncRes(SCtgJob *pJob) {
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int32_t ctgSearchExistingTask(SCtgJob *pJob, CTG_TASK_TYPE type, void* param, int32_t* taskId) {
|
||||||
|
bool equal = false;
|
||||||
|
SCtgTask* pTask = NULL;
|
||||||
|
int32_t code = 0;
|
||||||
|
|
||||||
|
CTG_LOCK(CTG_READ, &pJob->taskLock);
|
||||||
|
|
||||||
|
int32_t taskNum = taosArrayGetSize(pJob->pTasks);
|
||||||
|
for (int32_t i = 0; i < taskNum; ++i) {
|
||||||
|
pTask = taosArrayGet(pJob->pTasks, i);
|
||||||
|
if (type != pTask->type) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
CTG_ERR_JRET((*gCtgAsyncFps[type].compFp)(pTask, param, &equal));
|
||||||
|
if (equal) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
_return:
|
||||||
|
|
||||||
|
CTG_UNLOCK(CTG_READ, &pJob->taskLock);
|
||||||
|
if (equal) {
|
||||||
|
*taskId = pTask->taskId;
|
||||||
|
}
|
||||||
|
|
||||||
|
CTG_RET(code);
|
||||||
|
}
|
||||||
|
|
||||||
|
int32_t ctgSetSubTaskCb(SCtgTask *pSub, SCtgTask *pTask) {
|
||||||
|
int32_t code = 0;
|
||||||
|
|
||||||
|
CTG_LOCK(CTG_WRITE, &pSub->lock);
|
||||||
|
if (CTG_TASK_DONE == pSub->status) {
|
||||||
|
pTask->subRes.code = pSub->code;
|
||||||
|
CTG_ERR_JRET((*gCtgAsyncFps[pTask->type].cloneFp)(pSub, &pTask->subRes.res));
|
||||||
|
CTG_ERR_JRET(pTask->subRes.fp(pTask));
|
||||||
|
} else {
|
||||||
|
if (NULL == pSub->pParents) {
|
||||||
|
pSub->pParents = taosArrayInit(4, POINTER_BYTES);
|
||||||
|
}
|
||||||
|
|
||||||
|
taosArrayPush(pSub->pParents, &pTask);
|
||||||
|
}
|
||||||
|
|
||||||
|
_return:
|
||||||
|
|
||||||
|
CTG_UNLOCK(CTG_WRITE, &pSub->lock);
|
||||||
|
|
||||||
|
CTG_RET(code);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int32_t ctgLaunchSubTask(SCtgTask *pTask, CTG_TASK_TYPE type, ctgSubTaskCbFp fp, void* param) {
|
||||||
|
SCtgJob* pJob = pTask->pJob;
|
||||||
|
int32_t subTaskId = -1;
|
||||||
|
bool newTask = false;
|
||||||
|
|
||||||
|
ctgClearSubTaskRes(&pTask->subRes);
|
||||||
|
pTask->subRes.type = type;
|
||||||
|
pTask->subRes.fp = fp;
|
||||||
|
|
||||||
|
CTG_ERR_RET(ctgSearchExistingTask(pJob, type, param, &subTaskId));
|
||||||
|
if (subTaskId < 0) {
|
||||||
|
CTG_ERR_RET(ctgInitTask(pJob, type, param, &subTaskId));
|
||||||
|
newTask = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
SCtgTask* pSub = taosArrayGet(pJob->pTasks, subTaskId);
|
||||||
|
|
||||||
|
CTG_ERR_RET(ctgSetSubTaskCb(pSub, pTask));
|
||||||
|
|
||||||
|
if (newTask) {
|
||||||
|
CTG_ERR_RET((*gCtgAsyncFps[pSub->type].launchFp)(pSub));
|
||||||
|
pSub->status = CTG_TASK_LAUNCHED;
|
||||||
|
}
|
||||||
|
|
||||||
|
return TSDB_CODE_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
int32_t ctgLaunchJob(SCtgJob *pJob) {
|
int32_t ctgLaunchJob(SCtgJob *pJob) {
|
||||||
int32_t taskNum = taosArrayGetSize(pJob->pTasks);
|
int32_t taskNum = taosArrayGetSize(pJob->pTasks);
|
||||||
|
@ -1280,6 +1577,7 @@ int32_t ctgLaunchJob(SCtgJob *pJob) {
|
||||||
|
|
||||||
qDebug("QID:0x%" PRIx64 " ctg start to launch task %d", pJob->queryId, pTask->taskId);
|
qDebug("QID:0x%" PRIx64 " ctg start to launch task %d", pJob->queryId, pTask->taskId);
|
||||||
CTG_ERR_RET((*gCtgAsyncFps[pTask->type].launchFp)(pTask));
|
CTG_ERR_RET((*gCtgAsyncFps[pTask->type].launchFp)(pTask));
|
||||||
|
pTask->status = CTG_TASK_LAUNCHED;
|
||||||
}
|
}
|
||||||
|
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
|
|
|
@ -326,6 +326,7 @@ _return:
|
||||||
|
|
||||||
int32_t ctgAcquireTbIndexFromCache(SCatalog* pCtg, char *dbFName, char* tbName, SCtgDBCache **pDb, SCtgTbCache** pTb) {
|
int32_t ctgAcquireTbIndexFromCache(SCatalog* pCtg, char *dbFName, char* tbName, SCtgDBCache **pDb, SCtgTbCache** pTb) {
|
||||||
SCtgDBCache *dbCache = NULL;
|
SCtgDBCache *dbCache = NULL;
|
||||||
|
SCtgTbCache* pCache = NULL;
|
||||||
ctgAcquireDBCache(pCtg, dbFName, &dbCache);
|
ctgAcquireDBCache(pCtg, dbFName, &dbCache);
|
||||||
if (NULL == dbCache) {
|
if (NULL == dbCache) {
|
||||||
ctgDebug("db %s not in cache", dbFName);
|
ctgDebug("db %s not in cache", dbFName);
|
||||||
|
@ -333,7 +334,7 @@ int32_t ctgAcquireTbIndexFromCache(SCatalog* pCtg, char *dbFName, char* tbName,
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t sz = 0;
|
int32_t sz = 0;
|
||||||
SCtgTbCache* pCache = taosHashAcquire(dbCache->tbCache, tbName, strlen(tbName));
|
pCache = taosHashAcquire(dbCache->tbCache, tbName, strlen(tbName));
|
||||||
if (NULL == pCache) {
|
if (NULL == pCache) {
|
||||||
ctgDebug("tb %s not in cache, dbFName:%s", tbName, dbFName);
|
ctgDebug("tb %s not in cache, dbFName:%s", tbName, dbFName);
|
||||||
goto _return;
|
goto _return;
|
||||||
|
@ -540,10 +541,10 @@ int32_t ctgReadTbVerFromCache(SCatalog *pCtg, SName *pTableName, int32_t *sver,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
int32_t ctgReadTbTypeFromCache(SCatalog* pCtg, char* dbFName, char *tableName, int32_t *tbType) {
|
int32_t ctgReadTbTypeFromCache(SCatalog* pCtg, char* dbFName, char *tbName, int32_t *tbType) {
|
||||||
SCtgDBCache *dbCache = NULL;
|
SCtgDBCache *dbCache = NULL;
|
||||||
SCtgTbCache *tbCache = NULL;
|
SCtgTbCache *tbCache = NULL;
|
||||||
CTG_ERR_RET(ctgAcquireTbMetaFromCache(pCtg, dbFName, tableName, &dbCache, &tbCache));
|
CTG_ERR_RET(ctgAcquireTbMetaFromCache(pCtg, dbFName, tbName, &dbCache, &tbCache));
|
||||||
if (NULL == tbCache) {
|
if (NULL == tbCache) {
|
||||||
ctgReleaseTbMetaToCache(pCtg, dbCache, tbCache);
|
ctgReleaseTbMetaToCache(pCtg, dbCache, tbCache);
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
|
@ -552,7 +553,7 @@ int32_t ctgReadTbTypeFromCache(SCatalog* pCtg, char* dbFName, char *tableName, i
|
||||||
*tbType = tbCache->pMeta->tableType;
|
*tbType = tbCache->pMeta->tableType;
|
||||||
ctgReleaseTbMetaToCache(pCtg, dbCache, tbCache);
|
ctgReleaseTbMetaToCache(pCtg, dbCache, tbCache);
|
||||||
|
|
||||||
ctgDebug("Got tb %s tbType %d from cache, dbFName:%s", tableName, *tbType, dbFName);
|
ctgDebug("Got tb %s tbType %d from cache, dbFName:%s", tbName, *tbType, dbFName);
|
||||||
|
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
|
@ -1394,7 +1395,7 @@ int32_t ctgWriteTbMetaToCache(SCatalog *pCtg, SCtgDBCache *dbCache, char *dbFNam
|
||||||
if (orig) {
|
if (orig) {
|
||||||
origType = orig->tableType;
|
origType = orig->tableType;
|
||||||
|
|
||||||
if (origType == meta->tableType && orig->uid == meta->uid && orig->sversion >= meta->sversion && orig->tversion >= meta->tversion) {
|
if (origType == meta->tableType && orig->uid == meta->uid && (origType == TSDB_CHILD_TABLE || (orig->sversion >= meta->sversion && orig->tversion >= meta->tversion))) {
|
||||||
taosMemoryFree(meta);
|
taosMemoryFree(meta);
|
||||||
ctgDebug("ignore table %s meta update", tbName);
|
ctgDebug("ignore table %s meta update", tbName);
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
|
@ -2060,4 +2061,92 @@ int32_t ctgStartUpdateThread() {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int32_t ctgGetTbMetaFromCache(SCatalog* pCtg, SRequestConnInfo *pConn, SCtgTbMetaCtx* ctx, STableMeta** pTableMeta) {
|
||||||
|
if (CTG_IS_SYS_DBNAME(ctx->pName->dbname)) {
|
||||||
|
CTG_FLAG_SET_SYS_DB(ctx->flag);
|
||||||
|
}
|
||||||
|
|
||||||
|
CTG_ERR_RET(ctgReadTbMetaFromCache(pCtg, ctx, pTableMeta));
|
||||||
|
|
||||||
|
if (*pTableMeta) {
|
||||||
|
if (CTG_FLAG_MATCH_STB(ctx->flag, (*pTableMeta)->tableType) &&
|
||||||
|
((!CTG_FLAG_IS_FORCE_UPDATE(ctx->flag)) || (CTG_FLAG_IS_SYS_DB(ctx->flag)))) {
|
||||||
|
return TSDB_CODE_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
taosMemoryFreeClear(*pTableMeta);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (CTG_FLAG_IS_UNKNOWN_STB(ctx->flag)) {
|
||||||
|
CTG_FLAG_SET_STB(ctx->flag, ctx->tbInfo.tbType);
|
||||||
|
}
|
||||||
|
|
||||||
|
return TSDB_CODE_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int32_t ctgRemoveTbMetaFromCache(SCatalog* pCtg, SName* pTableName, bool syncReq) {
|
||||||
|
int32_t code = 0;
|
||||||
|
STableMeta* tblMeta = NULL;
|
||||||
|
SCtgTbMetaCtx tbCtx = {0};
|
||||||
|
tbCtx.flag = CTG_FLAG_UNKNOWN_STB;
|
||||||
|
tbCtx.pName = pTableName;
|
||||||
|
|
||||||
|
CTG_ERR_JRET(ctgReadTbMetaFromCache(pCtg, &tbCtx, &tblMeta));
|
||||||
|
|
||||||
|
if (NULL == tblMeta) {
|
||||||
|
ctgDebug("table already not in cache, db:%s, tblName:%s", pTableName->dbname, pTableName->tname);
|
||||||
|
return TSDB_CODE_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
char dbFName[TSDB_DB_FNAME_LEN];
|
||||||
|
tNameGetFullDbName(pTableName, dbFName);
|
||||||
|
|
||||||
|
if (TSDB_SUPER_TABLE == tblMeta->tableType) {
|
||||||
|
CTG_ERR_JRET(ctgDropStbMetaEnqueue(pCtg, dbFName, tbCtx.tbInfo.dbId, pTableName->tname, tblMeta->suid, syncReq));
|
||||||
|
} else {
|
||||||
|
CTG_ERR_JRET(ctgDropTbMetaEnqueue(pCtg, dbFName, tbCtx.tbInfo.dbId, pTableName->tname, syncReq));
|
||||||
|
}
|
||||||
|
|
||||||
|
_return:
|
||||||
|
|
||||||
|
taosMemoryFreeClear(tblMeta);
|
||||||
|
|
||||||
|
CTG_RET(code);
|
||||||
|
}
|
||||||
|
|
||||||
|
int32_t ctgGetTbHashVgroupFromCache(SCatalog *pCtg, const SName *pTableName, SVgroupInfo **pVgroup) {
|
||||||
|
if (CTG_IS_SYS_DBNAME(pTableName->dbname)) {
|
||||||
|
ctgError("no valid vgInfo for db, dbname:%s", pTableName->dbname);
|
||||||
|
CTG_ERR_RET(TSDB_CODE_CTG_INVALID_INPUT);
|
||||||
|
}
|
||||||
|
|
||||||
|
SCtgDBCache* dbCache = NULL;
|
||||||
|
int32_t code = 0;
|
||||||
|
char dbFName[TSDB_DB_FNAME_LEN] = {0};
|
||||||
|
tNameGetFullDbName(pTableName, dbFName);
|
||||||
|
|
||||||
|
CTG_ERR_RET(ctgAcquireVgInfoFromCache(pCtg, dbFName, &dbCache));
|
||||||
|
|
||||||
|
if (NULL == dbCache) {
|
||||||
|
*pVgroup = NULL;
|
||||||
|
return TSDB_CODE_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
*pVgroup = taosMemoryCalloc(1, sizeof(SVgroupInfo));
|
||||||
|
CTG_ERR_JRET(ctgGetVgInfoFromHashValue(pCtg, dbCache->vgCache.vgInfo, pTableName, *pVgroup));
|
||||||
|
|
||||||
|
_return:
|
||||||
|
|
||||||
|
if (dbCache) {
|
||||||
|
ctgReleaseVgInfoToCache(pCtg, dbCache);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (code) {
|
||||||
|
taosMemoryFreeClear(*pVgroup);
|
||||||
|
}
|
||||||
|
|
||||||
|
CTG_RET(code);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -172,6 +172,39 @@ int32_t ctgProcessRspMsg(void* out, int32_t reqType, char* msg, int32_t msgSize,
|
||||||
qDebug("Got table meta from vnode, tbFName:%s", target);
|
qDebug("Got table meta from vnode, tbFName:%s", target);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
case TDMT_VND_TABLE_CFG: {
|
||||||
|
if (TSDB_CODE_SUCCESS != rspCode) {
|
||||||
|
qError("error rsp for table cfg from vnode, code:%s, tbFName:%s", tstrerror(rspCode), target);
|
||||||
|
CTG_ERR_RET(rspCode);
|
||||||
|
}
|
||||||
|
|
||||||
|
code = queryProcessMsgRsp[TMSG_INDEX(reqType)](out, msg, msgSize);
|
||||||
|
if (code) {
|
||||||
|
qError("Process vnode tb cfg rsp failed, code:%s, tbFName:%s", tstrerror(code), target);
|
||||||
|
CTG_ERR_RET(code);
|
||||||
|
}
|
||||||
|
|
||||||
|
qDebug("Got table cfg from vnode, tbFName:%s", target);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case TDMT_MND_TABLE_CFG: {
|
||||||
|
if (TSDB_CODE_SUCCESS != rspCode) {
|
||||||
|
qError("error rsp for stb cfg from mnode, error:%s, tbFName:%s", tstrerror(rspCode), target);
|
||||||
|
CTG_ERR_RET(rspCode);
|
||||||
|
}
|
||||||
|
|
||||||
|
code = queryProcessMsgRsp[TMSG_INDEX(reqType)](out, msg, msgSize);
|
||||||
|
if (code) {
|
||||||
|
qError("Process mnode stb cfg rsp failed, error:%s, tbFName:%s", tstrerror(code), target);
|
||||||
|
CTG_ERR_RET(code);
|
||||||
|
}
|
||||||
|
|
||||||
|
qDebug("Got stb cfg from mnode, tbFName:%s", target);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
default:
|
||||||
|
qError("invalid req type %s", TMSG_INFO(reqType));
|
||||||
|
return TSDB_CODE_APP_ERROR;
|
||||||
}
|
}
|
||||||
|
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
|
@ -584,7 +617,7 @@ int32_t ctgGetUserDbAuthFromMnode(SCatalog* pCtg, SRequestConnInfo *pConn, const
|
||||||
|
|
||||||
|
|
||||||
int32_t ctgGetTbMetaFromMnodeImpl(SCatalog* pCtg, SRequestConnInfo *pConn, char *dbFName, char* tbName, STableMetaOutput* out, SCtgTask* pTask) {
|
int32_t ctgGetTbMetaFromMnodeImpl(SCatalog* pCtg, SRequestConnInfo *pConn, char *dbFName, char* tbName, STableMetaOutput* out, SCtgTask* pTask) {
|
||||||
SBuildTableMetaInput bInput = {.vgId = 0, .dbFName = dbFName, .tbName = tbName};
|
SBuildTableInput bInput = {.vgId = 0, .dbFName = dbFName, .tbName = tbName};
|
||||||
char *msg = NULL;
|
char *msg = NULL;
|
||||||
SEpSet *pVnodeEpSet = NULL;
|
SEpSet *pVnodeEpSet = NULL;
|
||||||
int32_t msgLen = 0;
|
int32_t msgLen = 0;
|
||||||
|
@ -640,9 +673,11 @@ int32_t ctgGetTbMetaFromVnode(SCatalog* pCtg, SRequestConnInfo *pConn, const SNa
|
||||||
sprintf(tbFName, "%s.%s", dbFName, pTableName->tname);
|
sprintf(tbFName, "%s.%s", dbFName, pTableName->tname);
|
||||||
void*(*mallocFp)(int32_t) = pTask ? taosMemoryMalloc : rpcMallocCont;
|
void*(*mallocFp)(int32_t) = pTask ? taosMemoryMalloc : rpcMallocCont;
|
||||||
|
|
||||||
ctgDebug("try to get table meta from vnode, vgId:%d, tbFName:%s", vgroupInfo->vgId, tbFName);
|
SEp* pEp = &vgroupInfo->epSet.eps[vgroupInfo->epSet.inUse];
|
||||||
|
ctgDebug("try to get table meta from vnode, vgId:%d, ep num:%d, ep %s:%d, tbFName:%s",
|
||||||
|
vgroupInfo->vgId, vgroupInfo->epSet.numOfEps, pEp->fqdn, pEp->port, tbFName);
|
||||||
|
|
||||||
SBuildTableMetaInput bInput = {.vgId = vgroupInfo->vgId, .dbFName = dbFName, .tbName = (char *)tNameGetTableName(pTableName)};
|
SBuildTableInput bInput = {.vgId = vgroupInfo->vgId, .dbFName = dbFName, .tbName = (char *)tNameGetTableName(pTableName)};
|
||||||
char *msg = NULL;
|
char *msg = NULL;
|
||||||
int32_t msgLen = 0;
|
int32_t msgLen = 0;
|
||||||
|
|
||||||
|
@ -680,4 +715,89 @@ int32_t ctgGetTbMetaFromVnode(SCatalog* pCtg, SRequestConnInfo *pConn, const SNa
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int32_t ctgGetTableCfgFromVnode(SCatalog* pCtg, SRequestConnInfo *pConn, const SName* pTableName, SVgroupInfo *vgroupInfo, STableCfg **out, SCtgTask* pTask) {
|
||||||
|
char *msg = NULL;
|
||||||
|
int32_t msgLen = 0;
|
||||||
|
int32_t reqType = TDMT_VND_TABLE_CFG;
|
||||||
|
char tbFName[TSDB_TABLE_FNAME_LEN];
|
||||||
|
tNameExtractFullName(pTableName, tbFName);
|
||||||
|
void*(*mallocFp)(int32_t) = pTask ? taosMemoryMalloc : rpcMallocCont;
|
||||||
|
char dbFName[TSDB_DB_FNAME_LEN];
|
||||||
|
tNameGetFullDbName(pTableName, dbFName);
|
||||||
|
SBuildTableInput bInput = {.vgId = vgroupInfo->vgId, .dbFName = dbFName, .tbName = (char*)pTableName->tname};
|
||||||
|
|
||||||
|
SEp* pEp = &vgroupInfo->epSet.eps[vgroupInfo->epSet.inUse];
|
||||||
|
ctgDebug("try to get table cfg from vnode, vgId:%d, ep num:%d, ep %s:%d, tbFName:%s",
|
||||||
|
vgroupInfo->vgId, vgroupInfo->epSet.numOfEps, pEp->fqdn, pEp->port, tbFName);
|
||||||
|
|
||||||
|
int32_t code = queryBuildMsg[TMSG_INDEX(reqType)](&bInput, &msg, 0, &msgLen, mallocFp);
|
||||||
|
if (code) {
|
||||||
|
ctgError("Build get tb cfg msg failed, code:%s, tbFName:%s", tstrerror(code), tbFName);
|
||||||
|
CTG_ERR_RET(code);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (pTask) {
|
||||||
|
CTG_ERR_RET(ctgUpdateMsgCtx(&pTask->msgCtx, reqType, NULL, (char*)tbFName));
|
||||||
|
|
||||||
|
SRequestConnInfo vConn = {.pTrans = pConn->pTrans,
|
||||||
|
.requestId = pConn->requestId,
|
||||||
|
.requestObjRefId = pConn->requestObjRefId,
|
||||||
|
.mgmtEps = vgroupInfo->epSet};
|
||||||
|
CTG_RET(ctgAsyncSendMsg(pCtg, &vConn, pTask, reqType, msg, msgLen));
|
||||||
|
}
|
||||||
|
|
||||||
|
SRpcMsg rpcMsg = {
|
||||||
|
.msgType = reqType,
|
||||||
|
.pCont = msg,
|
||||||
|
.contLen = msgLen,
|
||||||
|
};
|
||||||
|
|
||||||
|
SRpcMsg rpcRsp = {0};
|
||||||
|
rpcSendRecv(pConn->pTrans, &vgroupInfo->epSet, &rpcMsg, &rpcRsp);
|
||||||
|
|
||||||
|
CTG_ERR_RET(ctgProcessRspMsg(out, reqType, rpcRsp.pCont, rpcRsp.contLen, rpcRsp.code, (char*)tbFName));
|
||||||
|
|
||||||
|
return TSDB_CODE_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int32_t ctgGetTableCfgFromMnode(SCatalog* pCtg, SRequestConnInfo *pConn, const SName* pTableName, STableCfg **out, SCtgTask* pTask) {
|
||||||
|
char *msg = NULL;
|
||||||
|
int32_t msgLen = 0;
|
||||||
|
int32_t reqType = TDMT_MND_TABLE_CFG;
|
||||||
|
char tbFName[TSDB_TABLE_FNAME_LEN];
|
||||||
|
tNameExtractFullName(pTableName, tbFName);
|
||||||
|
void*(*mallocFp)(int32_t) = pTask ? taosMemoryMalloc : rpcMallocCont;
|
||||||
|
char dbFName[TSDB_DB_FNAME_LEN];
|
||||||
|
tNameGetFullDbName(pTableName, dbFName);
|
||||||
|
SBuildTableInput bInput = {.vgId = 0, .dbFName = dbFName, .tbName = (char*)pTableName->tname};
|
||||||
|
|
||||||
|
ctgDebug("try to get table cfg from mnode, tbFName:%s", tbFName);
|
||||||
|
|
||||||
|
int32_t code = queryBuildMsg[TMSG_INDEX(reqType)](&bInput, &msg, 0, &msgLen, mallocFp);
|
||||||
|
if (code) {
|
||||||
|
ctgError("Build get tb cfg msg failed, code:%s, tbFName:%s", tstrerror(code), tbFName);
|
||||||
|
CTG_ERR_RET(code);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (pTask) {
|
||||||
|
CTG_ERR_RET(ctgUpdateMsgCtx(&pTask->msgCtx, reqType, NULL, (char*)tbFName));
|
||||||
|
|
||||||
|
CTG_RET(ctgAsyncSendMsg(pCtg, pConn, pTask, reqType, msg, msgLen));
|
||||||
|
}
|
||||||
|
|
||||||
|
SRpcMsg rpcMsg = {
|
||||||
|
.msgType = reqType,
|
||||||
|
.pCont = msg,
|
||||||
|
.contLen = msgLen,
|
||||||
|
};
|
||||||
|
|
||||||
|
SRpcMsg rpcRsp = {0};
|
||||||
|
rpcSendRecv(pConn->pTrans, &pConn->mgmtEps, &rpcMsg, &rpcRsp);
|
||||||
|
|
||||||
|
CTG_ERR_RET(ctgProcessRspMsg(out, reqType, rpcRsp.pCont, rpcRsp.contLen, rpcRsp.code, (char*)tbFName));
|
||||||
|
|
||||||
|
return TSDB_CODE_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -33,6 +33,10 @@ char *ctgTaskTypeStr(CTG_TASK_TYPE type) {
|
||||||
return "[get table meta]";
|
return "[get table meta]";
|
||||||
case CTG_TASK_GET_TB_HASH:
|
case CTG_TASK_GET_TB_HASH:
|
||||||
return "[get table hash]";
|
return "[get table hash]";
|
||||||
|
case CTG_TASK_GET_TB_INDEX:
|
||||||
|
return "[get table index]";
|
||||||
|
case CTG_TASK_GET_TB_CFG:
|
||||||
|
return "[get table cfg]";
|
||||||
case CTG_TASK_GET_INDEX:
|
case CTG_TASK_GET_INDEX:
|
||||||
return "[get index]";
|
return "[get index]";
|
||||||
case CTG_TASK_GET_UDF:
|
case CTG_TASK_GET_UDF:
|
||||||
|
@ -96,6 +100,9 @@ void ctgFreeSMetaData(SMetaData* pData) {
|
||||||
|
|
||||||
taosArrayDestroy(pData->pQnodeList);
|
taosArrayDestroy(pData->pQnodeList);
|
||||||
pData->pQnodeList = NULL;
|
pData->pQnodeList = NULL;
|
||||||
|
|
||||||
|
taosArrayDestroy(pData->pTableCfg);
|
||||||
|
pData->pTableCfg = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
void ctgFreeSCtgUserAuth(SCtgUserAuth *userCache) {
|
void ctgFreeSCtgUserAuth(SCtgUserAuth *userCache) {
|
||||||
|
@ -280,6 +287,13 @@ void ctgFreeMsgCtx(SCtgMsgCtx* pCtx) {
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
case TDMT_VND_TABLE_CFG:
|
||||||
|
case TDMT_MND_TABLE_CFG: {
|
||||||
|
STableCfgRsp* pOut = (STableCfgRsp*)pCtx->out;
|
||||||
|
tFreeSTableCfgRsp(pOut);
|
||||||
|
taosMemoryFreeClear(pCtx->out);
|
||||||
|
break;
|
||||||
|
}
|
||||||
case TDMT_MND_RETRIEVE_FUNC: {
|
case TDMT_MND_RETRIEVE_FUNC: {
|
||||||
SFuncInfo* pOut = (SFuncInfo*)pCtx->out;
|
SFuncInfo* pOut = (SFuncInfo*)pCtx->out;
|
||||||
taosMemoryFree(pOut->pCode);
|
taosMemoryFree(pOut->pCode);
|
||||||
|
@ -328,14 +342,151 @@ void ctgResetTbMetaTask(SCtgTask* pTask) {
|
||||||
taosMemoryFreeClear(pTask->res);
|
taosMemoryFreeClear(pTask->res);
|
||||||
}
|
}
|
||||||
|
|
||||||
void ctgFreeTask(SCtgTask* pTask) {
|
void ctgFreeTaskRes(CTG_TASK_TYPE type, void **pRes) {
|
||||||
ctgFreeMsgCtx(&pTask->msgCtx);
|
switch (type) {
|
||||||
|
case CTG_TASK_GET_QNODE: {
|
||||||
|
taosArrayDestroy((SArray*)*pRes);
|
||||||
|
*pRes = NULL;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case CTG_TASK_GET_TB_META: {
|
||||||
|
taosMemoryFreeClear(*pRes);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case CTG_TASK_GET_DB_VGROUP: {
|
||||||
|
taosArrayDestroy((SArray*)*pRes);
|
||||||
|
*pRes = NULL;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case CTG_TASK_GET_DB_CFG: {
|
||||||
|
if (*pRes) {
|
||||||
|
SDbCfgInfo* pInfo = (SDbCfgInfo*)*pRes;
|
||||||
|
taosArrayDestroy(pInfo->pRetensions);
|
||||||
|
taosMemoryFreeClear(*pRes);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case CTG_TASK_GET_DB_INFO: {
|
||||||
|
taosMemoryFreeClear(*pRes);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case CTG_TASK_GET_TB_HASH: {
|
||||||
|
taosMemoryFreeClear(*pRes);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case CTG_TASK_GET_TB_INDEX: {
|
||||||
|
taosArrayDestroyEx(*pRes, tFreeSTableIndexInfo);
|
||||||
|
*pRes = NULL;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case CTG_TASK_GET_TB_CFG: {
|
||||||
|
if (*pRes) {
|
||||||
|
STableCfg* pInfo = (STableCfg*)*pRes;
|
||||||
|
tFreeSTableCfgRsp(pInfo);
|
||||||
|
taosMemoryFreeClear(*pRes);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case CTG_TASK_GET_INDEX: {
|
||||||
|
taosMemoryFreeClear(*pRes);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case CTG_TASK_GET_UDF: {
|
||||||
|
taosMemoryFreeClear(*pRes);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case CTG_TASK_GET_USER: {
|
||||||
|
taosMemoryFreeClear(*pRes);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
default:
|
||||||
|
qError("invalid task type %d", type);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void ctgFreeSubTaskRes(CTG_TASK_TYPE type, void **pRes) {
|
||||||
|
switch (type) {
|
||||||
|
case CTG_TASK_GET_QNODE: {
|
||||||
|
taosArrayDestroy((SArray*)*pRes);
|
||||||
|
*pRes = NULL;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case CTG_TASK_GET_TB_META: {
|
||||||
|
taosMemoryFreeClear(*pRes);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case CTG_TASK_GET_DB_VGROUP: {
|
||||||
|
if (*pRes) {
|
||||||
|
SDBVgInfo* pInfo = (SDBVgInfo*)*pRes;
|
||||||
|
taosHashCleanup(pInfo->vgHash);
|
||||||
|
taosMemoryFreeClear(*pRes);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case CTG_TASK_GET_DB_CFG: {
|
||||||
|
if (*pRes) {
|
||||||
|
SDbCfgInfo* pInfo = (SDbCfgInfo*)*pRes;
|
||||||
|
taosArrayDestroy(pInfo->pRetensions);
|
||||||
|
taosMemoryFreeClear(*pRes);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case CTG_TASK_GET_DB_INFO: {
|
||||||
|
taosMemoryFreeClear(*pRes);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case CTG_TASK_GET_TB_HASH: {
|
||||||
|
taosMemoryFreeClear(*pRes);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case CTG_TASK_GET_TB_INDEX: {
|
||||||
|
taosArrayDestroyEx(*pRes, tFreeSTableIndexInfo);
|
||||||
|
*pRes = NULL;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case CTG_TASK_GET_TB_CFG: {
|
||||||
|
if (*pRes) {
|
||||||
|
STableCfg* pInfo = (STableCfg*)*pRes;
|
||||||
|
tFreeSTableCfgRsp(pInfo);
|
||||||
|
taosMemoryFreeClear(*pRes);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case CTG_TASK_GET_INDEX: {
|
||||||
|
taosMemoryFreeClear(*pRes);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case CTG_TASK_GET_UDF: {
|
||||||
|
taosMemoryFreeClear(*pRes);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case CTG_TASK_GET_USER: {
|
||||||
|
taosMemoryFreeClear(*pRes);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
default:
|
||||||
|
qError("invalid task type %d", type);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void ctgClearSubTaskRes(SCtgSubRes *pRes) {
|
||||||
|
pRes->code = 0;
|
||||||
|
|
||||||
|
if (NULL == pRes->res) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
ctgFreeSubTaskRes(pRes->type, &pRes->res);
|
||||||
|
}
|
||||||
|
|
||||||
|
void ctgFreeTaskCtx(SCtgTask* pTask) {
|
||||||
switch (pTask->type) {
|
switch (pTask->type) {
|
||||||
case CTG_TASK_GET_QNODE: {
|
case CTG_TASK_GET_QNODE: {
|
||||||
taosArrayDestroy((SArray*)pTask->res);
|
|
||||||
taosMemoryFreeClear(pTask->taskCtx);
|
taosMemoryFreeClear(pTask->taskCtx);
|
||||||
pTask->res = NULL;
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case CTG_TASK_GET_TB_META: {
|
case CTG_TASK_GET_TB_META: {
|
||||||
|
@ -346,56 +497,49 @@ void ctgFreeTask(SCtgTask* pTask) {
|
||||||
pTask->msgCtx.lastOut = NULL;
|
pTask->msgCtx.lastOut = NULL;
|
||||||
}
|
}
|
||||||
taosMemoryFreeClear(pTask->taskCtx);
|
taosMemoryFreeClear(pTask->taskCtx);
|
||||||
taosMemoryFreeClear(pTask->res);
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case CTG_TASK_GET_DB_VGROUP: {
|
case CTG_TASK_GET_DB_VGROUP: {
|
||||||
taosArrayDestroy((SArray*)pTask->res);
|
|
||||||
taosMemoryFreeClear(pTask->taskCtx);
|
taosMemoryFreeClear(pTask->taskCtx);
|
||||||
pTask->res = NULL;
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case CTG_TASK_GET_DB_CFG: {
|
case CTG_TASK_GET_DB_CFG: {
|
||||||
taosMemoryFreeClear(pTask->taskCtx);
|
taosMemoryFreeClear(pTask->taskCtx);
|
||||||
if (pTask->res) {
|
|
||||||
SDbCfgInfo* pInfo = (SDbCfgInfo*)pTask->res;
|
|
||||||
taosArrayDestroy(pInfo->pRetensions);
|
|
||||||
taosMemoryFreeClear(pTask->res);
|
|
||||||
}
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case CTG_TASK_GET_DB_INFO: {
|
case CTG_TASK_GET_DB_INFO: {
|
||||||
taosMemoryFreeClear(pTask->taskCtx);
|
taosMemoryFreeClear(pTask->taskCtx);
|
||||||
taosMemoryFreeClear(pTask->res);
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case CTG_TASK_GET_TB_HASH: {
|
case CTG_TASK_GET_TB_HASH: {
|
||||||
SCtgTbHashCtx* taskCtx = (SCtgTbHashCtx*)pTask->taskCtx;
|
SCtgTbHashCtx* taskCtx = (SCtgTbHashCtx*)pTask->taskCtx;
|
||||||
taosMemoryFreeClear(taskCtx->pName);
|
taosMemoryFreeClear(taskCtx->pName);
|
||||||
taosMemoryFreeClear(pTask->taskCtx);
|
taosMemoryFreeClear(pTask->taskCtx);
|
||||||
taosMemoryFreeClear(pTask->res);
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case CTG_TASK_GET_TB_INDEX: {
|
case CTG_TASK_GET_TB_INDEX: {
|
||||||
SCtgTbIndexCtx* taskCtx = (SCtgTbIndexCtx*)pTask->taskCtx;
|
SCtgTbIndexCtx* taskCtx = (SCtgTbIndexCtx*)pTask->taskCtx;
|
||||||
taosMemoryFreeClear(taskCtx->pName);
|
taosMemoryFreeClear(taskCtx->pName);
|
||||||
taosMemoryFreeClear(pTask->taskCtx);
|
taosMemoryFreeClear(pTask->taskCtx);
|
||||||
taosArrayDestroyEx(pTask->res, tFreeSTableIndexInfo);
|
break;
|
||||||
|
}
|
||||||
|
case CTG_TASK_GET_TB_CFG: {
|
||||||
|
SCtgTbCfgCtx* taskCtx = (SCtgTbCfgCtx*)pTask->taskCtx;
|
||||||
|
taosMemoryFreeClear(taskCtx->pName);
|
||||||
|
taosMemoryFreeClear(taskCtx->pVgInfo);
|
||||||
|
taosMemoryFreeClear(pTask->taskCtx);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case CTG_TASK_GET_INDEX: {
|
case CTG_TASK_GET_INDEX: {
|
||||||
taosMemoryFreeClear(pTask->taskCtx);
|
taosMemoryFreeClear(pTask->taskCtx);
|
||||||
taosMemoryFreeClear(pTask->res);
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case CTG_TASK_GET_UDF: {
|
case CTG_TASK_GET_UDF: {
|
||||||
taosMemoryFreeClear(pTask->taskCtx);
|
taosMemoryFreeClear(pTask->taskCtx);
|
||||||
taosMemoryFreeClear(pTask->res);
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case CTG_TASK_GET_USER: {
|
case CTG_TASK_GET_USER: {
|
||||||
taosMemoryFreeClear(pTask->taskCtx);
|
taosMemoryFreeClear(pTask->taskCtx);
|
||||||
taosMemoryFreeClear(pTask->res);
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
default:
|
default:
|
||||||
|
@ -404,6 +548,16 @@ void ctgFreeTask(SCtgTask* pTask) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void ctgFreeTask(SCtgTask* pTask) {
|
||||||
|
ctgFreeMsgCtx(&pTask->msgCtx);
|
||||||
|
ctgFreeTaskRes(pTask->type, &pTask->res);
|
||||||
|
ctgFreeTaskCtx(pTask);
|
||||||
|
|
||||||
|
taosArrayDestroy(pTask->pParents);
|
||||||
|
ctgClearSubTaskRes(&pTask->subRes);
|
||||||
|
}
|
||||||
|
|
||||||
void ctgFreeTasks(SArray* pArray) {
|
void ctgFreeTasks(SArray* pArray) {
|
||||||
if (NULL == pArray) {
|
if (NULL == pArray) {
|
||||||
return;
|
return;
|
||||||
|
|
|
@ -16,6 +16,7 @@
|
||||||
#include "command.h"
|
#include "command.h"
|
||||||
#include "catalog.h"
|
#include "catalog.h"
|
||||||
#include "tdatablock.h"
|
#include "tdatablock.h"
|
||||||
|
#include "tglobal.h"
|
||||||
|
|
||||||
static int32_t getSchemaBytes(const SSchema* pSchema) {
|
static int32_t getSchemaBytes(const SSchema* pSchema) {
|
||||||
switch (pSchema->type) {
|
switch (pSchema->type) {
|
||||||
|
@ -123,11 +124,430 @@ static int32_t execDescribe(SNode* pStmt, SRetrieveTableRsp** pRsp) {
|
||||||
|
|
||||||
static int32_t execResetQueryCache() { return catalogClearCache(); }
|
static int32_t execResetQueryCache() { return catalogClearCache(); }
|
||||||
|
|
||||||
static int32_t execShowCreateDatabase(SShowCreateDatabaseStmt* pStmt) { return TSDB_CODE_FAILED; }
|
|
||||||
|
|
||||||
static int32_t execShowCreateTable(SShowCreateTableStmt* pStmt) { return TSDB_CODE_FAILED; }
|
static SSDataBlock* buildCreateDBResultDataBlock() {
|
||||||
|
SSDataBlock* pBlock = taosMemoryCalloc(1, sizeof(SSDataBlock));
|
||||||
|
pBlock->info.numOfCols = SHOW_CREATE_DB_RESULT_COLS;
|
||||||
|
pBlock->info.hasVarCol = true;
|
||||||
|
|
||||||
static int32_t execShowCreateSTable(SShowCreateTableStmt* pStmt) { return TSDB_CODE_FAILED; }
|
pBlock->pDataBlock = taosArrayInit(pBlock->info.numOfCols, sizeof(SColumnInfoData));
|
||||||
|
|
||||||
|
SColumnInfoData infoData = {0};
|
||||||
|
infoData.info.type = TSDB_DATA_TYPE_VARCHAR;
|
||||||
|
infoData.info.bytes = SHOW_CREATE_DB_RESULT_FIELD1_LEN;
|
||||||
|
|
||||||
|
taosArrayPush(pBlock->pDataBlock, &infoData);
|
||||||
|
|
||||||
|
infoData.info.type = TSDB_DATA_TYPE_VARCHAR;
|
||||||
|
infoData.info.bytes = SHOW_CREATE_DB_RESULT_FIELD2_LEN;
|
||||||
|
taosArrayPush(pBlock->pDataBlock, &infoData);
|
||||||
|
|
||||||
|
return pBlock;
|
||||||
|
}
|
||||||
|
|
||||||
|
int64_t getValOfDiffPrecision(int8_t unit, int64_t val) {
|
||||||
|
int64_t v = 0;
|
||||||
|
switch (unit) {
|
||||||
|
case 's':
|
||||||
|
v = val / 1000;
|
||||||
|
break;
|
||||||
|
case 'm':
|
||||||
|
v = val / tsTickPerMin[TSDB_TIME_PRECISION_MILLI];
|
||||||
|
break;
|
||||||
|
case 'h':
|
||||||
|
v = val / (tsTickPerMin[TSDB_TIME_PRECISION_MILLI] * 60);
|
||||||
|
break;
|
||||||
|
case 'd':
|
||||||
|
v = val / (tsTickPerMin[TSDB_TIME_PRECISION_MILLI] * 24 * 60);
|
||||||
|
break;
|
||||||
|
case 'w':
|
||||||
|
v = val / (tsTickPerMin[TSDB_TIME_PRECISION_MILLI] * 24 * 60 * 7);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
return v;
|
||||||
|
}
|
||||||
|
|
||||||
|
char *buildRetension(SArray *pRetension) {
|
||||||
|
size_t size = taosArrayGetSize(pRetension);
|
||||||
|
if (size == 0) {
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
char *p1 = taosMemoryCalloc(1, 100);
|
||||||
|
SRetention *p = taosArrayGet(pRetension, 0);
|
||||||
|
|
||||||
|
int32_t len = 0;
|
||||||
|
|
||||||
|
int64_t v1 = getValOfDiffPrecision(p->freqUnit, p->freq);
|
||||||
|
int64_t v2 = getValOfDiffPrecision(p->keepUnit, p->keep);
|
||||||
|
len += sprintf(p1 + len, "%" PRId64 "%c:%" PRId64 "%c", v1, p->freqUnit, v2, p->keepUnit);
|
||||||
|
|
||||||
|
if (size > 1) {
|
||||||
|
len += sprintf(p1 + len, ",");
|
||||||
|
p = taosArrayGet(pRetension, 1);
|
||||||
|
|
||||||
|
v1 = getValOfDiffPrecision(p->freqUnit, p->freq);
|
||||||
|
v2 = getValOfDiffPrecision(p->keepUnit, p->keep);
|
||||||
|
len += sprintf(p1 + len, "%" PRId64 "%c:%" PRId64 "%c", v1, p->freqUnit, v2, p->keepUnit);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (size > 2) {
|
||||||
|
len += sprintf(p1 + len, ",");
|
||||||
|
p = taosArrayGet(pRetension, 2);
|
||||||
|
|
||||||
|
v1 = getValOfDiffPrecision(p->freqUnit, p->freq);
|
||||||
|
v2 = getValOfDiffPrecision(p->keepUnit, p->keep);
|
||||||
|
len += sprintf(p1 + len, "%" PRId64 "%c:%" PRId64 "%c", v1, p->freqUnit, v2, p->keepUnit);
|
||||||
|
}
|
||||||
|
|
||||||
|
return p1;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static void setCreateDBResultIntoDataBlock(SSDataBlock* pBlock, char *dbFName, SDbCfgInfo* pCfg) {
|
||||||
|
blockDataEnsureCapacity(pBlock, 1);
|
||||||
|
pBlock->info.rows = 1;
|
||||||
|
|
||||||
|
SColumnInfoData* pCol1 = taosArrayGet(pBlock->pDataBlock, 0);
|
||||||
|
char buf1[SHOW_CREATE_DB_RESULT_FIELD1_LEN] = {0};
|
||||||
|
STR_TO_VARSTR(buf1, dbFName);
|
||||||
|
colDataAppend(pCol1, 0, buf1, false);
|
||||||
|
|
||||||
|
SColumnInfoData* pCol2 = taosArrayGet(pBlock->pDataBlock, 1);
|
||||||
|
char buf2[SHOW_CREATE_DB_RESULT_FIELD2_LEN] = {0};
|
||||||
|
int32_t len = 0;
|
||||||
|
char *prec = NULL;
|
||||||
|
switch (pCfg->precision) {
|
||||||
|
case TSDB_TIME_PRECISION_MILLI:
|
||||||
|
prec = TSDB_TIME_PRECISION_MILLI_STR;
|
||||||
|
break;
|
||||||
|
case TSDB_TIME_PRECISION_MICRO:
|
||||||
|
prec = TSDB_TIME_PRECISION_MICRO_STR;
|
||||||
|
break;
|
||||||
|
case TSDB_TIME_PRECISION_NANO:
|
||||||
|
prec = TSDB_TIME_PRECISION_NANO_STR;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
prec = "none";
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
char *retentions = buildRetension(pCfg->pRetensions);
|
||||||
|
|
||||||
|
len += sprintf(buf2 + VARSTR_HEADER_SIZE, "CREATE DATABASE `%s` BUFFER %d CACHELAST %d COMP %d DURATION %dm "
|
||||||
|
"FSYNC %d MAXROWS %d MINROWS %d KEEP %dm,%dm,%dm PAGES %d PAGESIZE %d PRECISION '%s' REPLICA %d "
|
||||||
|
"STRICT %d WAL %d VGROUPS %d SINGLE_STABLE %d",
|
||||||
|
dbFName, pCfg->buffer, pCfg->cacheLastRow, pCfg->compression, pCfg->daysPerFile,
|
||||||
|
pCfg->fsyncPeriod, pCfg->maxRows, pCfg->minRows, pCfg->daysToKeep0, pCfg->daysToKeep1, pCfg->daysToKeep2,
|
||||||
|
pCfg->pages, pCfg->pageSize, prec, pCfg->replications, pCfg->strict, pCfg->walLevel, pCfg->numOfVgroups,
|
||||||
|
1 == pCfg->numOfStables);
|
||||||
|
|
||||||
|
if (retentions) {
|
||||||
|
len += sprintf(buf2 + VARSTR_HEADER_SIZE + len, " RETENTIONS %s", retentions);
|
||||||
|
taosMemoryFree(retentions);
|
||||||
|
}
|
||||||
|
|
||||||
|
(varDataLen(buf2)) = len;
|
||||||
|
|
||||||
|
colDataAppend(pCol2, 0, buf2, false);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static int32_t execShowCreateDatabase(SShowCreateDatabaseStmt* pStmt, SRetrieveTableRsp** pRsp) {
|
||||||
|
SSDataBlock* pBlock = buildCreateDBResultDataBlock();
|
||||||
|
setCreateDBResultIntoDataBlock(pBlock, pStmt->dbName, pStmt->pCfg);
|
||||||
|
|
||||||
|
size_t rspSize = sizeof(SRetrieveTableRsp) + blockGetEncodeSize(pBlock);
|
||||||
|
*pRsp = taosMemoryCalloc(1, rspSize);
|
||||||
|
if (NULL == *pRsp) {
|
||||||
|
return TSDB_CODE_OUT_OF_MEMORY;
|
||||||
|
}
|
||||||
|
|
||||||
|
(*pRsp)->useconds = 0;
|
||||||
|
(*pRsp)->completed = 1;
|
||||||
|
(*pRsp)->precision = 0;
|
||||||
|
(*pRsp)->compressed = 0;
|
||||||
|
(*pRsp)->compLen = 0;
|
||||||
|
(*pRsp)->numOfRows = htonl(1);
|
||||||
|
(*pRsp)->numOfCols = htonl(SHOW_CREATE_DB_RESULT_COLS);
|
||||||
|
|
||||||
|
int32_t len = 0;
|
||||||
|
blockCompressEncode(pBlock, (*pRsp)->data, &len, SHOW_CREATE_DB_RESULT_COLS, false);
|
||||||
|
ASSERT(len == rspSize - sizeof(SRetrieveTableRsp));
|
||||||
|
|
||||||
|
blockDataDestroy(pBlock);
|
||||||
|
return TSDB_CODE_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
static SSDataBlock* buildCreateTbResultDataBlock() {
|
||||||
|
SSDataBlock* pBlock = taosMemoryCalloc(1, sizeof(SSDataBlock));
|
||||||
|
pBlock->info.numOfCols = SHOW_CREATE_TB_RESULT_COLS;
|
||||||
|
pBlock->info.hasVarCol = true;
|
||||||
|
|
||||||
|
pBlock->pDataBlock = taosArrayInit(pBlock->info.numOfCols, sizeof(SColumnInfoData));
|
||||||
|
|
||||||
|
SColumnInfoData infoData = {0};
|
||||||
|
infoData.info.type = TSDB_DATA_TYPE_VARCHAR;
|
||||||
|
infoData.info.bytes = SHOW_CREATE_TB_RESULT_FIELD1_LEN;
|
||||||
|
|
||||||
|
taosArrayPush(pBlock->pDataBlock, &infoData);
|
||||||
|
|
||||||
|
infoData.info.type = TSDB_DATA_TYPE_VARCHAR;
|
||||||
|
infoData.info.bytes = SHOW_CREATE_TB_RESULT_FIELD2_LEN;
|
||||||
|
taosArrayPush(pBlock->pDataBlock, &infoData);
|
||||||
|
|
||||||
|
return pBlock;
|
||||||
|
}
|
||||||
|
|
||||||
|
void appendColumnFields(char* buf, int32_t* len, STableCfg* pCfg) {
|
||||||
|
for (int32_t i = 0; i < pCfg->numOfColumns; ++i) {
|
||||||
|
SSchema* pSchema = pCfg->pSchemas + i;
|
||||||
|
char type[32];
|
||||||
|
sprintf(type, "%s", tDataTypes[pSchema->type].name);
|
||||||
|
if (TSDB_DATA_TYPE_VARCHAR == pSchema->type) {
|
||||||
|
sprintf(type + strlen(type), "(%d)", (int32_t)(pSchema->bytes - VARSTR_HEADER_SIZE));
|
||||||
|
} else if (TSDB_DATA_TYPE_NCHAR == pSchema->type) {
|
||||||
|
sprintf(type + strlen(type), "(%d)", (int32_t)((pSchema->bytes - VARSTR_HEADER_SIZE)/TSDB_NCHAR_SIZE));
|
||||||
|
}
|
||||||
|
|
||||||
|
*len += sprintf(buf + VARSTR_HEADER_SIZE + *len, "%s`%s` %s", ((i > 0) ? ", " : ""), pSchema->name, type);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void appendTagFields(char* buf, int32_t* len, STableCfg* pCfg) {
|
||||||
|
for (int32_t i = 0; i < pCfg->numOfTags; ++i) {
|
||||||
|
SSchema* pSchema = pCfg->pSchemas + pCfg->numOfColumns + i;
|
||||||
|
char type[32];
|
||||||
|
sprintf(type, "%s", tDataTypes[pSchema->type].name);
|
||||||
|
if (TSDB_DATA_TYPE_VARCHAR == pSchema->type) {
|
||||||
|
sprintf(type + strlen(type), "(%d)", (int32_t)(pSchema->bytes - VARSTR_HEADER_SIZE));
|
||||||
|
} else if (TSDB_DATA_TYPE_NCHAR == pSchema->type) {
|
||||||
|
sprintf(type + strlen(type), "(%d)", (int32_t)((pSchema->bytes - VARSTR_HEADER_SIZE)/TSDB_NCHAR_SIZE));
|
||||||
|
}
|
||||||
|
|
||||||
|
*len += sprintf(buf + VARSTR_HEADER_SIZE + *len, "%s`%s` %s", ((i > 0) ? ", " : ""), pSchema->name, type);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void appendTagNameFields(char* buf, int32_t* len, STableCfg* pCfg) {
|
||||||
|
for (int32_t i = 0; i < pCfg->numOfTags; ++i) {
|
||||||
|
SSchema* pSchema = pCfg->pSchemas + pCfg->numOfColumns + i;
|
||||||
|
*len += sprintf(buf + VARSTR_HEADER_SIZE + *len, "%s`%s`", ((i > 0) ? ", " : ""), pSchema->name);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int32_t appendTagValues(char* buf, int32_t* len, STableCfg* pCfg) {
|
||||||
|
SArray *pTagVals = NULL;
|
||||||
|
STag *pTag = (STag*)pCfg->pTags;
|
||||||
|
|
||||||
|
if (pCfg->pTags && pTag->flags & TD_TAG_JSON) {
|
||||||
|
char *pJson = parseTagDatatoJson(pTag);
|
||||||
|
if (pJson) {
|
||||||
|
*len += sprintf(buf + VARSTR_HEADER_SIZE + *len, "%s", pJson);
|
||||||
|
taosMemoryFree(pJson);
|
||||||
|
}
|
||||||
|
|
||||||
|
return TSDB_CODE_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
int32_t code = tTagToValArray((const STag *)pCfg->pTags, &pTagVals);
|
||||||
|
if (code) {
|
||||||
|
return code;
|
||||||
|
}
|
||||||
|
|
||||||
|
int16_t valueNum = taosArrayGetSize(pTagVals);
|
||||||
|
int32_t num = 0;
|
||||||
|
int32_t j = 0;
|
||||||
|
for (int32_t i = 0; i < pCfg->numOfTags; ++i) {
|
||||||
|
SSchema* pSchema = pCfg->pSchemas + pCfg->numOfColumns + i;
|
||||||
|
if (i > 0) {
|
||||||
|
*len += sprintf(buf + VARSTR_HEADER_SIZE + *len, ", ");
|
||||||
|
}
|
||||||
|
|
||||||
|
if (j >= valueNum) {
|
||||||
|
*len += sprintf(buf + VARSTR_HEADER_SIZE + *len, "NULL");
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
STagVal *pTagVal = (STagVal *)taosArrayGet(pTagVals, j);
|
||||||
|
if (pSchema->colId > pTagVal->cid) {
|
||||||
|
qError("tag value and column mismatch, schemaId:%d, valId:%d", pSchema->colId, pTagVal->cid);
|
||||||
|
taosArrayDestroy(pTagVals);
|
||||||
|
return TSDB_CODE_APP_ERROR;
|
||||||
|
} else if (pSchema->colId == pTagVal->cid) {
|
||||||
|
char type = pTagVal->type;
|
||||||
|
int32_t tlen = 0;
|
||||||
|
|
||||||
|
if (IS_VAR_DATA_TYPE(type)) {
|
||||||
|
dataConverToStr(buf + VARSTR_HEADER_SIZE + *len, type, pTagVal->pData, pTagVal->nData, &tlen);
|
||||||
|
} else {
|
||||||
|
dataConverToStr(buf + VARSTR_HEADER_SIZE + *len, type, &pTagVal->i64, tDataTypes[type].bytes, &tlen);
|
||||||
|
}
|
||||||
|
*len += tlen;
|
||||||
|
j++;
|
||||||
|
} else {
|
||||||
|
*len += sprintf(buf + VARSTR_HEADER_SIZE + *len, "NULL");
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
if (type == TSDB_DATA_TYPE_BINARY) {
|
||||||
|
if (pTagVal->nData > 0) {
|
||||||
|
if (num) {
|
||||||
|
*len += sprintf(buf + VARSTR_HEADER_SIZE + *len, ", ");
|
||||||
|
}
|
||||||
|
|
||||||
|
memcpy(buf + VARSTR_HEADER_SIZE + *len, pTagVal->pData, pTagVal->nData);
|
||||||
|
*len += pTagVal->nData;
|
||||||
|
}
|
||||||
|
} else if (type == TSDB_DATA_TYPE_NCHAR) {
|
||||||
|
if (pTagVal->nData > 0) {
|
||||||
|
if (num) {
|
||||||
|
*len += sprintf(buf + VARSTR_HEADER_SIZE + *len, ", ");
|
||||||
|
}
|
||||||
|
int32_t tlen = taosUcs4ToMbs((TdUcs4 *)pTagVal->pData, pTagVal->nData, buf + VARSTR_HEADER_SIZE + *len);
|
||||||
|
}
|
||||||
|
} else if (type == TSDB_DATA_TYPE_DOUBLE) {
|
||||||
|
double val = *(double *)(&pTagVal->i64);
|
||||||
|
int len = 0;
|
||||||
|
term = indexTermCreate(suid, ADD_VALUE, type, key, nKey, (const char *)&val, len);
|
||||||
|
} else if (type == TSDB_DATA_TYPE_BOOL) {
|
||||||
|
int val = *(int *)(&pTagVal->i64);
|
||||||
|
int len = 0;
|
||||||
|
term = indexTermCreate(suid, ADD_VALUE, TSDB_DATA_TYPE_INT, key, nKey, (const char *)&val, len);
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
}
|
||||||
|
|
||||||
|
taosArrayDestroy(pTagVals);
|
||||||
|
|
||||||
|
return TSDB_CODE_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
void appendTableOptions(char* buf, int32_t* len, STableCfg* pCfg) {
|
||||||
|
if (pCfg->commentLen > 0) {
|
||||||
|
*len += sprintf(buf + VARSTR_HEADER_SIZE + *len, " COMMENT '%s'", pCfg->pComment);
|
||||||
|
} else if (0 == pCfg->commentLen) {
|
||||||
|
*len += sprintf(buf + VARSTR_HEADER_SIZE + *len, " COMMENT ''");
|
||||||
|
}
|
||||||
|
|
||||||
|
if (pCfg->watermark1 > 0) {
|
||||||
|
*len += sprintf(buf + VARSTR_HEADER_SIZE + *len, " WATERMARK %" PRId64 "a", pCfg->watermark1);
|
||||||
|
if (pCfg->watermark2 > 0) {
|
||||||
|
*len += sprintf(buf + VARSTR_HEADER_SIZE + *len, ", %" PRId64 "a", pCfg->watermark2);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (pCfg->delay1 > 0) {
|
||||||
|
*len += sprintf(buf + VARSTR_HEADER_SIZE + *len, " MAX_DELAY %" PRId64 "a", pCfg->delay1);
|
||||||
|
if (pCfg->delay2 > 0) {
|
||||||
|
*len += sprintf(buf + VARSTR_HEADER_SIZE + *len, ", %" PRId64 "a", pCfg->delay2);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
int32_t funcNum = taosArrayGetSize(pCfg->pFuncs);
|
||||||
|
if (funcNum > 0) {
|
||||||
|
*len += sprintf(buf + VARSTR_HEADER_SIZE + *len, " ROLLUP(");
|
||||||
|
for (int32_t i = 0; i < funcNum; ++i) {
|
||||||
|
char* pFunc = taosArrayGet(pCfg->pFuncs, i);
|
||||||
|
*len += sprintf(buf + VARSTR_HEADER_SIZE + *len, "%s%s", ((i > 0) ? ", " : ""), pFunc);
|
||||||
|
}
|
||||||
|
*len += sprintf(buf + VARSTR_HEADER_SIZE + *len, ")");
|
||||||
|
}
|
||||||
|
|
||||||
|
if (pCfg->ttl > 0) {
|
||||||
|
*len += sprintf(buf + VARSTR_HEADER_SIZE + *len, " TTL %d", pCfg->ttl);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static int32_t setCreateTBResultIntoDataBlock(SSDataBlock* pBlock, char *tbName, STableCfg* pCfg) {
|
||||||
|
int32_t code = 0;
|
||||||
|
blockDataEnsureCapacity(pBlock, 1);
|
||||||
|
pBlock->info.rows = 1;
|
||||||
|
|
||||||
|
SColumnInfoData* pCol1 = taosArrayGet(pBlock->pDataBlock, 0);
|
||||||
|
char buf1[SHOW_CREATE_TB_RESULT_FIELD1_LEN] = {0};
|
||||||
|
STR_TO_VARSTR(buf1, tbName);
|
||||||
|
colDataAppend(pCol1, 0, buf1, false);
|
||||||
|
|
||||||
|
SColumnInfoData* pCol2 = taosArrayGet(pBlock->pDataBlock, 1);
|
||||||
|
char buf2[SHOW_CREATE_TB_RESULT_FIELD2_LEN] = {0};
|
||||||
|
int32_t len = 0;
|
||||||
|
|
||||||
|
if (TSDB_SUPER_TABLE == pCfg->tableType) {
|
||||||
|
len += sprintf(buf2 + VARSTR_HEADER_SIZE, "CREATE STABLE `%s` (", tbName);
|
||||||
|
appendColumnFields(buf2, &len, pCfg);
|
||||||
|
len += sprintf(buf2 + VARSTR_HEADER_SIZE + len, ") TAGS (");
|
||||||
|
appendTagFields(buf2, &len, pCfg);
|
||||||
|
len += sprintf(buf2 + VARSTR_HEADER_SIZE + len, ")");
|
||||||
|
appendTableOptions(buf2, &len, pCfg);
|
||||||
|
} else if (TSDB_CHILD_TABLE == pCfg->tableType) {
|
||||||
|
len += sprintf(buf2 + VARSTR_HEADER_SIZE, "CREATE TABLE `%s` USING `%s` (", tbName, pCfg->stbName);
|
||||||
|
appendTagNameFields(buf2, &len, pCfg);
|
||||||
|
len += sprintf(buf2 + VARSTR_HEADER_SIZE + len, ") TAGS (");
|
||||||
|
code = appendTagValues(buf2, &len, pCfg);
|
||||||
|
if (code) {
|
||||||
|
return code;
|
||||||
|
}
|
||||||
|
len += sprintf(buf2 + VARSTR_HEADER_SIZE + len, ")");
|
||||||
|
appendTableOptions(buf2, &len, pCfg);
|
||||||
|
} else {
|
||||||
|
len += sprintf(buf2 + VARSTR_HEADER_SIZE, "CREATE TABLE `%s` (", tbName);
|
||||||
|
appendColumnFields(buf2, &len, pCfg);
|
||||||
|
len += sprintf(buf2 + VARSTR_HEADER_SIZE + len, ")");
|
||||||
|
}
|
||||||
|
|
||||||
|
varDataLen(buf2) = len;
|
||||||
|
|
||||||
|
colDataAppend(pCol2, 0, buf2, false);
|
||||||
|
|
||||||
|
return TSDB_CODE_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static int32_t execShowCreateTable(SShowCreateTableStmt* pStmt, SRetrieveTableRsp** pRsp) {
|
||||||
|
SSDataBlock* pBlock = buildCreateTbResultDataBlock();
|
||||||
|
int32_t code = setCreateTBResultIntoDataBlock(pBlock, pStmt->tableName, pStmt->pCfg);
|
||||||
|
if (code) {
|
||||||
|
return code;
|
||||||
|
}
|
||||||
|
|
||||||
|
size_t rspSize = sizeof(SRetrieveTableRsp) + blockGetEncodeSize(pBlock);
|
||||||
|
*pRsp = taosMemoryCalloc(1, rspSize);
|
||||||
|
if (NULL == *pRsp) {
|
||||||
|
return TSDB_CODE_OUT_OF_MEMORY;
|
||||||
|
}
|
||||||
|
|
||||||
|
(*pRsp)->useconds = 0;
|
||||||
|
(*pRsp)->completed = 1;
|
||||||
|
(*pRsp)->precision = 0;
|
||||||
|
(*pRsp)->compressed = 0;
|
||||||
|
(*pRsp)->compLen = 0;
|
||||||
|
(*pRsp)->numOfRows = htonl(1);
|
||||||
|
(*pRsp)->numOfCols = htonl(SHOW_CREATE_TB_RESULT_COLS);
|
||||||
|
|
||||||
|
int32_t len = 0;
|
||||||
|
blockCompressEncode(pBlock, (*pRsp)->data, &len, SHOW_CREATE_TB_RESULT_COLS, false);
|
||||||
|
ASSERT(len == rspSize - sizeof(SRetrieveTableRsp));
|
||||||
|
|
||||||
|
blockDataDestroy(pBlock);
|
||||||
|
return TSDB_CODE_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int32_t execShowCreateSTable(SShowCreateTableStmt* pStmt, SRetrieveTableRsp** pRsp) {
|
||||||
|
STableCfg* pCfg = (STableCfg*)pStmt->pCfg;
|
||||||
|
if (TSDB_SUPER_TABLE != pCfg->tableType) {
|
||||||
|
terrno = TSDB_CODE_TSC_NOT_STABLE_ERROR;
|
||||||
|
return terrno;
|
||||||
|
}
|
||||||
|
|
||||||
|
return execShowCreateTable(pStmt, pRsp);
|
||||||
|
}
|
||||||
|
|
||||||
static int32_t execAlterLocal(SAlterLocalStmt* pStmt) { return TSDB_CODE_FAILED; }
|
static int32_t execAlterLocal(SAlterLocalStmt* pStmt) { return TSDB_CODE_FAILED; }
|
||||||
|
|
||||||
|
@ -140,11 +560,11 @@ int32_t qExecCommand(SNode* pStmt, SRetrieveTableRsp** pRsp) {
|
||||||
case QUERY_NODE_RESET_QUERY_CACHE_STMT:
|
case QUERY_NODE_RESET_QUERY_CACHE_STMT:
|
||||||
return execResetQueryCache();
|
return execResetQueryCache();
|
||||||
case QUERY_NODE_SHOW_CREATE_DATABASE_STMT:
|
case QUERY_NODE_SHOW_CREATE_DATABASE_STMT:
|
||||||
return execShowCreateDatabase((SShowCreateDatabaseStmt*)pStmt);
|
return execShowCreateDatabase((SShowCreateDatabaseStmt*)pStmt, pRsp);
|
||||||
case QUERY_NODE_SHOW_CREATE_TABLE_STMT:
|
case QUERY_NODE_SHOW_CREATE_TABLE_STMT:
|
||||||
return execShowCreateTable((SShowCreateTableStmt*)pStmt);
|
return execShowCreateTable((SShowCreateTableStmt*)pStmt, pRsp);
|
||||||
case QUERY_NODE_SHOW_CREATE_STABLE_STMT:
|
case QUERY_NODE_SHOW_CREATE_STABLE_STMT:
|
||||||
return execShowCreateSTable((SShowCreateTableStmt*)pStmt);
|
return execShowCreateSTable((SShowCreateTableStmt*)pStmt, pRsp);
|
||||||
case QUERY_NODE_ALTER_LOCAL_STMT:
|
case QUERY_NODE_ALTER_LOCAL_STMT:
|
||||||
return execAlterLocal((SAlterLocalStmt*)pStmt);
|
return execAlterLocal((SAlterLocalStmt*)pStmt);
|
||||||
case QUERY_NODE_SHOW_LOCAL_VARIABLES_STMT:
|
case QUERY_NODE_SHOW_LOCAL_VARIABLES_STMT:
|
||||||
|
|
|
@ -903,7 +903,6 @@ static SSDataBlock* doStreamBlockScan(SOperatorInfo* pOperator) {
|
||||||
// NOTE: this operator does never check if current status is done or not
|
// NOTE: this operator does never check if current status is done or not
|
||||||
SExecTaskInfo* pTaskInfo = pOperator->pTaskInfo;
|
SExecTaskInfo* pTaskInfo = pOperator->pTaskInfo;
|
||||||
SStreamBlockScanInfo* pInfo = pOperator->info;
|
SStreamBlockScanInfo* pInfo = pOperator->info;
|
||||||
int32_t rows = 0;
|
|
||||||
|
|
||||||
pTaskInfo->code = pOperator->fpSet._openFn(pOperator);
|
pTaskInfo->code = pOperator->fpSet._openFn(pOperator);
|
||||||
if (pTaskInfo->code != TSDB_CODE_SUCCESS || pOperator->status == OP_EXEC_DONE) {
|
if (pTaskInfo->code != TSDB_CODE_SUCCESS || pOperator->status == OP_EXEC_DONE) {
|
||||||
|
@ -1023,9 +1022,6 @@ static SSDataBlock* doStreamBlockScan(SOperatorInfo* pOperator) {
|
||||||
pTaskInfo->code = terrno;
|
pTaskInfo->code = terrno;
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
rows = pBlockInfo->rows;
|
|
||||||
|
|
||||||
// currently only the tbname pseudo column
|
// currently only the tbname pseudo column
|
||||||
if (pInfo->numOfPseudoExpr > 0) {
|
if (pInfo->numOfPseudoExpr > 0) {
|
||||||
addTagPseudoColumnData(&pInfo->readHandle, pInfo->pPseudoExpr, pInfo->numOfPseudoExpr, pInfo->pRes);
|
addTagPseudoColumnData(&pInfo->readHandle, pInfo->pPseudoExpr, pInfo->numOfPseudoExpr, pInfo->pRes);
|
||||||
|
@ -1033,14 +1029,16 @@ static SSDataBlock* doStreamBlockScan(SOperatorInfo* pOperator) {
|
||||||
|
|
||||||
doFilter(pInfo->pCondition, pInfo->pRes);
|
doFilter(pInfo->pCondition, pInfo->pRes);
|
||||||
blockDataUpdateTsWindow(pInfo->pRes, pInfo->primaryTsIndex);
|
blockDataUpdateTsWindow(pInfo->pRes, pInfo->primaryTsIndex);
|
||||||
|
if (pBlockInfo->rows > 0) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// record the scan action.
|
// record the scan action.
|
||||||
pInfo->numOfExec++;
|
pInfo->numOfExec++;
|
||||||
pOperator->resultInfo.totalRows += pBlockInfo->rows;
|
pOperator->resultInfo.totalRows += pBlockInfo->rows;
|
||||||
|
|
||||||
if (rows == 0) {
|
if (pBlockInfo->rows == 0) {
|
||||||
pOperator->status = OP_EXEC_DONE;
|
pOperator->status = OP_EXEC_DONE;
|
||||||
} else if (pInfo->pUpdateInfo) {
|
} else if (pInfo->pUpdateInfo) {
|
||||||
pInfo->tsArrayIndex = 0;
|
pInfo->tsArrayIndex = 0;
|
||||||
|
@ -1056,7 +1054,7 @@ static SSDataBlock* doStreamBlockScan(SOperatorInfo* pOperator) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return (rows == 0) ? NULL : pInfo->pRes;
|
return (pBlockInfo->rows == 0) ? NULL : pInfo->pRes;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1270,7 +1270,8 @@ static int32_t getAllIntervalWindow(SHashObj* pHashMap, SArray* resWins) {
|
||||||
}
|
}
|
||||||
|
|
||||||
bool isCloseWindow(STimeWindow *pWin, STimeWindowAggSupp* pSup) {
|
bool isCloseWindow(STimeWindow *pWin, STimeWindowAggSupp* pSup) {
|
||||||
return pWin->ekey < pSup->maxTs - pSup->waterMark;
|
ASSERT(pSup->maxTs == INT64_MIN || pSup->maxTs > 0);
|
||||||
|
return pSup->maxTs != INT64_MIN && pWin->ekey < pSup->maxTs - pSup->waterMark;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int32_t closeIntervalWindow(SHashObj* pHashMap, STimeWindowAggSupp* pSup, SInterval* pInterval,
|
static int32_t closeIntervalWindow(SHashObj* pHashMap, STimeWindowAggSupp* pSup, SInterval* pInterval,
|
||||||
|
@ -2141,7 +2142,9 @@ void compactFunctions(SqlFunctionCtx* pDestCtx, SqlFunctionCtx* pSourceCtx, int3
|
||||||
static void rebuildIntervalWindow(SStreamFinalIntervalOperatorInfo* pInfo, SExprSupp* pSup, SArray* pWinArray, int32_t groupId,
|
static void rebuildIntervalWindow(SStreamFinalIntervalOperatorInfo* pInfo, SExprSupp* pSup, SArray* pWinArray, int32_t groupId,
|
||||||
int32_t numOfOutput, SExecTaskInfo* pTaskInfo) {
|
int32_t numOfOutput, SExecTaskInfo* pTaskInfo) {
|
||||||
int32_t size = taosArrayGetSize(pWinArray);
|
int32_t size = taosArrayGetSize(pWinArray);
|
||||||
ASSERT(pInfo->pChildren);
|
if (!pInfo->pChildren) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
for (int32_t i = 0; i < size; i++) {
|
for (int32_t i = 0; i < size; i++) {
|
||||||
STimeWindow* pParentWin = taosArrayGet(pWinArray, i);
|
STimeWindow* pParentWin = taosArrayGet(pWinArray, i);
|
||||||
SResultRow* pCurResult = NULL;
|
SResultRow* pCurResult = NULL;
|
||||||
|
@ -2339,6 +2342,7 @@ static SSDataBlock* doStreamFinalIntervalAgg(SOperatorInfo* pOperator) {
|
||||||
SStreamFinalIntervalOperatorInfo* pChInfo = pChildOp->info;
|
SStreamFinalIntervalOperatorInfo* pChInfo = pChildOp->info;
|
||||||
setInputDataBlock(pChildOp, pChildOp->exprSupp.pCtx, pBlock, pChInfo->order, MAIN_SCAN, true);
|
setInputDataBlock(pChildOp, pChildOp->exprSupp.pCtx, pBlock, pChInfo->order, MAIN_SCAN, true);
|
||||||
doHashInterval(pChildOp, pBlock, pBlock->info.groupId, NULL);
|
doHashInterval(pChildOp, pBlock, pBlock->info.groupId, NULL);
|
||||||
|
pChInfo->twAggSup.maxTs = TMAX(pChInfo->twAggSup.maxTs, pBlock->info.window.ekey);
|
||||||
}
|
}
|
||||||
maxTs = TMAX(maxTs, pBlock->info.window.ekey);
|
maxTs = TMAX(maxTs, pBlock->info.window.ekey);
|
||||||
}
|
}
|
||||||
|
@ -2406,7 +2410,7 @@ SOperatorInfo* createStreamFinalIntervalOperatorInfo(SOperatorInfo* downstream,
|
||||||
initResultRowInfo(&pInfo->binfo.resultRowInfo);
|
initResultRowInfo(&pInfo->binfo.resultRowInfo);
|
||||||
pInfo->pChildren = NULL;
|
pInfo->pChildren = NULL;
|
||||||
if (numOfChild > 0) {
|
if (numOfChild > 0) {
|
||||||
pInfo->pChildren = taosArrayInit(numOfChild, sizeof(SOperatorInfo));
|
pInfo->pChildren = taosArrayInit(numOfChild, sizeof(void *));
|
||||||
for (int32_t i = 0; i < numOfChild; i++) {
|
for (int32_t i = 0; i < numOfChild; i++) {
|
||||||
SOperatorInfo* pChildOp = createStreamFinalIntervalOperatorInfo(NULL, pPhyNode, pTaskInfo, 0);
|
SOperatorInfo* pChildOp = createStreamFinalIntervalOperatorInfo(NULL, pPhyNode, pTaskInfo, 0);
|
||||||
if (pChildOp) {
|
if (pChildOp) {
|
||||||
|
|
|
@ -655,7 +655,7 @@ void nodesDestroyNode(SNode* pNode) {
|
||||||
break;
|
break;
|
||||||
case QUERY_NODE_SHOW_CREATE_TABLE_STMT:
|
case QUERY_NODE_SHOW_CREATE_TABLE_STMT:
|
||||||
case QUERY_NODE_SHOW_CREATE_STABLE_STMT:
|
case QUERY_NODE_SHOW_CREATE_STABLE_STMT:
|
||||||
taosMemoryFreeClear(((SShowCreateTableStmt*)pNode)->pMeta);
|
taosMemoryFreeClear(((SShowCreateTableStmt*)pNode)->pCfg);
|
||||||
break;
|
break;
|
||||||
case QUERY_NODE_SHOW_TABLE_DISTRIBUTED_STMT: // no pointer field
|
case QUERY_NODE_SHOW_TABLE_DISTRIBUTED_STMT: // no pointer field
|
||||||
case QUERY_NODE_KILL_CONNECTION_STMT: // no pointer field
|
case QUERY_NODE_KILL_CONNECTION_STMT: // no pointer field
|
||||||
|
|
|
@ -47,6 +47,7 @@ typedef struct SParseMetaCache {
|
||||||
SHashObj* pUserAuth; // key is SUserAuthInfo serialized string, element is bool indicating whether or not to pass
|
SHashObj* pUserAuth; // key is SUserAuthInfo serialized string, element is bool indicating whether or not to pass
|
||||||
SHashObj* pUdf; // key is funcName, element is SFuncInfo*
|
SHashObj* pUdf; // key is funcName, element is SFuncInfo*
|
||||||
SHashObj* pTableIndex; // key is tbFName, element is SArray<STableIndexInfo>*
|
SHashObj* pTableIndex; // key is tbFName, element is SArray<STableIndexInfo>*
|
||||||
|
SHashObj* pTableCfg; // key is tbFName, element is STableCfg*
|
||||||
SArray* pDnodes; // element is SEpSet
|
SArray* pDnodes; // element is SEpSet
|
||||||
bool dnodeRequired;
|
bool dnodeRequired;
|
||||||
} SParseMetaCache;
|
} SParseMetaCache;
|
||||||
|
@ -79,6 +80,7 @@ int32_t reserveUserAuthInCache(int32_t acctId, const char* pUser, const char* pD
|
||||||
int32_t reserveUserAuthInCacheExt(const char* pUser, const SName* pName, AUTH_TYPE type, SParseMetaCache* pMetaCache);
|
int32_t reserveUserAuthInCacheExt(const char* pUser, const SName* pName, AUTH_TYPE type, SParseMetaCache* pMetaCache);
|
||||||
int32_t reserveUdfInCache(const char* pFunc, SParseMetaCache* pMetaCache);
|
int32_t reserveUdfInCache(const char* pFunc, SParseMetaCache* pMetaCache);
|
||||||
int32_t reserveTableIndexInCache(int32_t acctId, const char* pDb, const char* pTable, SParseMetaCache* pMetaCache);
|
int32_t reserveTableIndexInCache(int32_t acctId, const char* pDb, const char* pTable, SParseMetaCache* pMetaCache);
|
||||||
|
int32_t reserveTableCfgInCache(int32_t acctId, const char* pDb, const char* pTable, SParseMetaCache* pMetaCache);
|
||||||
int32_t reserveDnodeRequiredInCache(SParseMetaCache* pMetaCache);
|
int32_t reserveDnodeRequiredInCache(SParseMetaCache* pMetaCache);
|
||||||
int32_t getTableMetaFromCache(SParseMetaCache* pMetaCache, const SName* pName, STableMeta** pMeta);
|
int32_t getTableMetaFromCache(SParseMetaCache* pMetaCache, const SName* pName, STableMeta** pMeta);
|
||||||
int32_t getDbVgInfoFromCache(SParseMetaCache* pMetaCache, const char* pDbFName, SArray** pVgInfo);
|
int32_t getDbVgInfoFromCache(SParseMetaCache* pMetaCache, const char* pDbFName, SArray** pVgInfo);
|
||||||
|
@ -90,6 +92,7 @@ int32_t getUserAuthFromCache(SParseMetaCache* pMetaCache, const char* pUser, con
|
||||||
bool* pPass);
|
bool* pPass);
|
||||||
int32_t getUdfInfoFromCache(SParseMetaCache* pMetaCache, const char* pFunc, SFuncInfo* pInfo);
|
int32_t getUdfInfoFromCache(SParseMetaCache* pMetaCache, const char* pFunc, SFuncInfo* pInfo);
|
||||||
int32_t getTableIndexFromCache(SParseMetaCache* pMetaCache, const SName* pName, SArray** pIndexes);
|
int32_t getTableIndexFromCache(SParseMetaCache* pMetaCache, const SName* pName, SArray** pIndexes);
|
||||||
|
int32_t getTableCfgFromCache(SParseMetaCache* pMetaCache, const SName* pName, STableCfg** pOutput);
|
||||||
int32_t getDnodeListFromCache(SParseMetaCache* pMetaCache, SArray** pDnodes);
|
int32_t getDnodeListFromCache(SParseMetaCache* pMetaCache, SArray** pDnodes);
|
||||||
void destoryParseMetaCache(SParseMetaCache* pMetaCache);
|
void destoryParseMetaCache(SParseMetaCache* pMetaCache);
|
||||||
|
|
||||||
|
|
|
@ -411,7 +411,14 @@ static int32_t collectMetaKeyFromShowCreateDatabase(SCollectMetaKeyCxt* pCxt, SS
|
||||||
}
|
}
|
||||||
|
|
||||||
static int32_t collectMetaKeyFromShowCreateTable(SCollectMetaKeyCxt* pCxt, SShowCreateTableStmt* pStmt) {
|
static int32_t collectMetaKeyFromShowCreateTable(SCollectMetaKeyCxt* pCxt, SShowCreateTableStmt* pStmt) {
|
||||||
return reserveTableMetaInCache(pCxt->pParseCxt->acctId, pStmt->dbName, pStmt->tableName, pCxt->pMetaCache);
|
SName name = {.type = TSDB_TABLE_NAME_T, .acctId = pCxt->pParseCxt->acctId};
|
||||||
|
strcpy(name.dbname, pStmt->dbName);
|
||||||
|
strcpy(name.tname, pStmt->tableName);
|
||||||
|
int32_t code = catalogRemoveTableMeta(pCxt->pParseCxt->pCatalog, &name);
|
||||||
|
if (TSDB_CODE_SUCCESS == code) {
|
||||||
|
code = reserveTableCfgInCache(pCxt->pParseCxt->acctId, pStmt->dbName, pStmt->tableName, pCxt->pMetaCache);
|
||||||
|
}
|
||||||
|
return code;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int32_t collectMetaKeyFromShowApps(SCollectMetaKeyCxt* pCxt, SShowStmt* pStmt) {
|
static int32_t collectMetaKeyFromShowApps(SCollectMetaKeyCxt* pCxt, SShowStmt* pStmt) {
|
||||||
|
|
|
@ -1081,15 +1081,6 @@ end:
|
||||||
return code;
|
return code;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int32_t cloneTableMeta(STableMeta* pSrc, STableMeta** pDst) {
|
|
||||||
*pDst = taosMemoryMalloc(TABLE_META_SIZE(pSrc));
|
|
||||||
if (NULL == *pDst) {
|
|
||||||
return TSDB_CODE_TSC_OUT_OF_MEMORY;
|
|
||||||
}
|
|
||||||
memcpy(*pDst, pSrc, TABLE_META_SIZE(pSrc));
|
|
||||||
return TSDB_CODE_SUCCESS;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int32_t storeTableMeta(SInsertParseContext* pCxt, SHashObj* pHash, SName* pTableName, const char* pName,
|
static int32_t storeTableMeta(SInsertParseContext* pCxt, SHashObj* pHash, SName* pTableName, const char* pName,
|
||||||
int32_t len, STableMeta* pMeta) {
|
int32_t len, STableMeta* pMeta) {
|
||||||
SVgroupInfo vg;
|
SVgroupInfo vg;
|
||||||
|
|
|
@ -133,6 +133,30 @@ static int32_t getTableMeta(STranslateContext* pCxt, const char* pDbName, const
|
||||||
return getTableMetaImpl(pCxt, toName(pCxt->pParseCxt->acctId, pDbName, pTableName, &name), pMeta);
|
return getTableMetaImpl(pCxt, toName(pCxt->pParseCxt->acctId, pDbName, pTableName, &name), pMeta);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int32_t getTableCfg(STranslateContext* pCxt, const SName* pName, STableCfg** pCfg) {
|
||||||
|
SParseContext* pParCxt = pCxt->pParseCxt;
|
||||||
|
int32_t code = collectUseDatabase(pName, pCxt->pDbs);
|
||||||
|
if (TSDB_CODE_SUCCESS == code) {
|
||||||
|
code = collectUseTable(pName, pCxt->pTables);
|
||||||
|
}
|
||||||
|
if (TSDB_CODE_SUCCESS == code) {
|
||||||
|
if (pParCxt->async) {
|
||||||
|
code = getTableCfgFromCache(pCxt->pMetaCache, pName, pCfg);
|
||||||
|
} else {
|
||||||
|
SRequestConnInfo conn = {.pTrans = pParCxt->pTransporter,
|
||||||
|
.requestId = pParCxt->requestId,
|
||||||
|
.requestObjRefId = pParCxt->requestRid,
|
||||||
|
.mgmtEps = pParCxt->mgmtEpSet};
|
||||||
|
code = catalogRefreshGetTableCfg(pParCxt->pCatalog, &conn, pName, pCfg);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (TSDB_CODE_SUCCESS != code) {
|
||||||
|
parserError("catalogRefreshGetTableCfg error, code:%s, dbName:%s, tbName:%s", tstrerror(code), pName->dbname,
|
||||||
|
pName->tname);
|
||||||
|
}
|
||||||
|
return code;
|
||||||
|
}
|
||||||
|
|
||||||
static int32_t refreshGetTableMeta(STranslateContext* pCxt, const char* pDbName, const char* pTableName,
|
static int32_t refreshGetTableMeta(STranslateContext* pCxt, const char* pDbName, const char* pTableName,
|
||||||
STableMeta** pMeta) {
|
STableMeta** pMeta) {
|
||||||
SParseContext* pParCxt = pCxt->pParseCxt;
|
SParseContext* pParCxt = pCxt->pParseCxt;
|
||||||
|
@ -3503,13 +3527,24 @@ static int32_t buildRollupAst(STranslateContext* pCxt, SCreateTableStmt* pStmt,
|
||||||
return code;
|
return code;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int32_t buildRollupFuncs(SNodeList* pFuncs, SArray** pArray) {
|
||||||
|
if (NULL == pFuncs) {
|
||||||
|
return TSDB_CODE_SUCCESS;
|
||||||
|
}
|
||||||
|
*pArray = taosArrayInit(LIST_LENGTH(pFuncs), TSDB_FUNC_NAME_LEN);
|
||||||
|
SNode* pNode;
|
||||||
|
FOREACH(pNode, pFuncs) {
|
||||||
|
taosArrayPush(*pArray, ((SFunctionNode*)pNode)->functionName);
|
||||||
|
}
|
||||||
|
return TSDB_CODE_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
static int32_t buildCreateStbReq(STranslateContext* pCxt, SCreateTableStmt* pStmt, SMCreateStbReq* pReq) {
|
static int32_t buildCreateStbReq(STranslateContext* pCxt, SCreateTableStmt* pStmt, SMCreateStbReq* pReq) {
|
||||||
pReq->igExists = pStmt->ignoreExists;
|
pReq->igExists = pStmt->ignoreExists;
|
||||||
pReq->delay1 = pStmt->pOptions->maxDelay1;
|
pReq->delay1 = pStmt->pOptions->maxDelay1;
|
||||||
pReq->delay2 = pStmt->pOptions->maxDelay2;
|
pReq->delay2 = pStmt->pOptions->maxDelay2;
|
||||||
pReq->watermark1 = pStmt->pOptions->watermark1;
|
pReq->watermark1 = pStmt->pOptions->watermark1;
|
||||||
pReq->watermark2 = pStmt->pOptions->watermark2;
|
pReq->watermark2 = pStmt->pOptions->watermark2;
|
||||||
// pReq->ttl = pStmt->pOptions->ttl;
|
|
||||||
columnDefNodeToField(pStmt->pCols, &pReq->pColumns);
|
columnDefNodeToField(pStmt->pCols, &pReq->pColumns);
|
||||||
columnDefNodeToField(pStmt->pTags, &pReq->pTags);
|
columnDefNodeToField(pStmt->pTags, &pReq->pTags);
|
||||||
pReq->numOfColumns = LIST_LENGTH(pStmt->pCols);
|
pReq->numOfColumns = LIST_LENGTH(pStmt->pCols);
|
||||||
|
@ -3523,6 +3558,7 @@ static int32_t buildCreateStbReq(STranslateContext* pCxt, SCreateTableStmt* pStm
|
||||||
} else {
|
} else {
|
||||||
pReq->commentLen = -1;
|
pReq->commentLen = -1;
|
||||||
}
|
}
|
||||||
|
buildRollupFuncs(pStmt->pOptions->pRollupFuncs, &pReq->pFuncs);
|
||||||
|
|
||||||
SName tableName;
|
SName tableName;
|
||||||
tNameExtractFullName(toName(pCxt->pParseCxt->acctId, pStmt->dbName, pStmt->tableName, &tableName), pReq->name);
|
tNameExtractFullName(toName(pCxt->pParseCxt->acctId, pStmt->dbName, pStmt->tableName, &tableName), pReq->name);
|
||||||
|
@ -4296,7 +4332,10 @@ static int32_t translateShowCreateDatabase(STranslateContext* pCxt, SShowCreateD
|
||||||
}
|
}
|
||||||
|
|
||||||
static int32_t translateShowCreateTable(STranslateContext* pCxt, SShowCreateTableStmt* pStmt) {
|
static int32_t translateShowCreateTable(STranslateContext* pCxt, SShowCreateTableStmt* pStmt) {
|
||||||
return getTableMeta(pCxt, pStmt->dbName, pStmt->tableName, &pStmt->pMeta);
|
SName name;
|
||||||
|
toName(pCxt->pParseCxt->acctId, pStmt->dbName, pStmt->tableName, &name);
|
||||||
|
|
||||||
|
return getTableCfg(pCxt, &name, (STableCfg**)&pStmt->pCfg);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int32_t translateQuery(STranslateContext* pCxt, SNode* pNode) {
|
static int32_t translateQuery(STranslateContext* pCxt, SNode* pNode) {
|
||||||
|
|
|
@ -561,6 +561,9 @@ int32_t buildCatalogReq(const SParseMetaCache* pMetaCache, SCatalogReq* pCatalog
|
||||||
if (TSDB_CODE_SUCCESS == code) {
|
if (TSDB_CODE_SUCCESS == code) {
|
||||||
code = buildTableReq(pMetaCache->pTableIndex, &pCatalogReq->pTableIndex);
|
code = buildTableReq(pMetaCache->pTableIndex, &pCatalogReq->pTableIndex);
|
||||||
}
|
}
|
||||||
|
if (TSDB_CODE_SUCCESS == code) {
|
||||||
|
code = buildTableReq(pMetaCache->pTableCfg, &pCatalogReq->pTableCfg);
|
||||||
|
}
|
||||||
pCatalogReq->dNodeRequired = pMetaCache->dnodeRequired;
|
pCatalogReq->dNodeRequired = pMetaCache->dnodeRequired;
|
||||||
return code;
|
return code;
|
||||||
}
|
}
|
||||||
|
@ -657,6 +660,9 @@ int32_t putMetaDataToCache(const SCatalogReq* pCatalogReq, const SMetaData* pMet
|
||||||
if (TSDB_CODE_SUCCESS == code) {
|
if (TSDB_CODE_SUCCESS == code) {
|
||||||
code = putTableDataToCache(pCatalogReq->pTableIndex, pMetaData->pTableIndex, &pMetaCache->pTableIndex);
|
code = putTableDataToCache(pCatalogReq->pTableIndex, pMetaData->pTableIndex, &pMetaCache->pTableIndex);
|
||||||
}
|
}
|
||||||
|
if (TSDB_CODE_SUCCESS == code) {
|
||||||
|
code = putTableDataToCache(pCatalogReq->pTableCfg, pMetaData->pTableCfg, &pMetaCache->pTableCfg);
|
||||||
|
}
|
||||||
pMetaCache->pDnodes = pMetaData->pDnodeList;
|
pMetaCache->pDnodes = pMetaData->pDnodeList;
|
||||||
return code;
|
return code;
|
||||||
}
|
}
|
||||||
|
@ -863,6 +869,10 @@ int32_t reserveTableIndexInCache(int32_t acctId, const char* pDb, const char* pT
|
||||||
return reserveTableReqInCache(acctId, pDb, pTable, &pMetaCache->pTableIndex);
|
return reserveTableReqInCache(acctId, pDb, pTable, &pMetaCache->pTableIndex);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int32_t reserveTableCfgInCache(int32_t acctId, const char* pDb, const char* pTable, SParseMetaCache* pMetaCache) {
|
||||||
|
return reserveTableReqInCache(acctId, pDb, pTable, &pMetaCache->pTableCfg);
|
||||||
|
}
|
||||||
|
|
||||||
int32_t getTableIndexFromCache(SParseMetaCache* pMetaCache, const SName* pName, SArray** pIndexes) {
|
int32_t getTableIndexFromCache(SParseMetaCache* pMetaCache, const SName* pName, SArray** pIndexes) {
|
||||||
char fullName[TSDB_TABLE_FNAME_LEN];
|
char fullName[TSDB_TABLE_FNAME_LEN];
|
||||||
tNameExtractFullName(pName, fullName);
|
tNameExtractFullName(pName, fullName);
|
||||||
|
@ -877,6 +887,41 @@ int32_t getTableIndexFromCache(SParseMetaCache* pMetaCache, const SName* pName,
|
||||||
return code;
|
return code;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
STableCfg* tableCfgDup(STableCfg* pCfg) {
|
||||||
|
STableCfg* pNew = taosMemoryMalloc(sizeof(*pNew));
|
||||||
|
|
||||||
|
memcpy(pNew, pCfg, sizeof(*pNew));
|
||||||
|
if (pNew->pComment) {
|
||||||
|
pNew->pComment = strdup(pNew->pComment);
|
||||||
|
}
|
||||||
|
if (pNew->pFuncs) {
|
||||||
|
pNew->pFuncs = taosArrayDup(pNew->pFuncs);
|
||||||
|
}
|
||||||
|
|
||||||
|
int32_t schemaSize = (pCfg->numOfColumns + pCfg->numOfTags) * sizeof(SSchema);
|
||||||
|
|
||||||
|
SSchema* pSchema = taosMemoryMalloc(schemaSize);
|
||||||
|
memcpy(pSchema, pCfg->pSchemas, schemaSize);
|
||||||
|
|
||||||
|
pNew->pSchemas = pSchema;
|
||||||
|
|
||||||
|
return pNew;
|
||||||
|
}
|
||||||
|
|
||||||
|
int32_t getTableCfgFromCache(SParseMetaCache* pMetaCache, const SName* pName, STableCfg** pOutput) {
|
||||||
|
char fullName[TSDB_TABLE_FNAME_LEN];
|
||||||
|
tNameExtractFullName(pName, fullName);
|
||||||
|
STableCfg* pCfg = NULL;
|
||||||
|
int32_t code = getMetaDataFromHash(fullName, strlen(fullName), pMetaCache->pTableCfg, (void**)&pCfg);
|
||||||
|
if (TSDB_CODE_SUCCESS == code) {
|
||||||
|
*pOutput = tableCfgDup(pCfg);
|
||||||
|
if (NULL == *pOutput) {
|
||||||
|
code = TSDB_CODE_OUT_OF_MEMORY;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return code;
|
||||||
|
}
|
||||||
|
|
||||||
int32_t reserveDnodeRequiredInCache(SParseMetaCache* pMetaCache) {
|
int32_t reserveDnodeRequiredInCache(SParseMetaCache* pMetaCache) {
|
||||||
pMetaCache->dnodeRequired = true;
|
pMetaCache->dnodeRequired = true;
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
|
@ -899,4 +944,5 @@ void destoryParseMetaCache(SParseMetaCache* pMetaCache) {
|
||||||
taosHashCleanup(pMetaCache->pUserAuth);
|
taosHashCleanup(pMetaCache->pUserAuth);
|
||||||
taosHashCleanup(pMetaCache->pUdf);
|
taosHashCleanup(pMetaCache->pUdf);
|
||||||
taosHashCleanup(pMetaCache->pTableIndex);
|
taosHashCleanup(pMetaCache->pTableIndex);
|
||||||
|
taosHashCleanup(pMetaCache->pTableCfg);
|
||||||
}
|
}
|
||||||
|
|
|
@ -261,6 +261,11 @@ int32_t __catalogGetDnodeList(SCatalog* pCatalog, SRequestConnInfo* pConn, SArra
|
||||||
return g_mockCatalogService->catalogGetDnodeList(pDnodeList);
|
return g_mockCatalogService->catalogGetDnodeList(pDnodeList);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int32_t __catalogRefreshGetTableCfg(SCatalog* pCtg, SRequestConnInfo *pConn, const SName* pTableName, STableCfg** pCfg) {
|
||||||
|
*pCfg = (STableCfg*)taosMemoryCalloc(1, sizeof(STableCfg));
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
void initMetaDataEnv() {
|
void initMetaDataEnv() {
|
||||||
g_mockCatalogService.reset(new MockCatalogService());
|
g_mockCatalogService.reset(new MockCatalogService());
|
||||||
|
|
||||||
|
@ -279,6 +284,7 @@ void initMetaDataEnv() {
|
||||||
stub.set(catalogRemoveTableMeta, __catalogRemoveTableMeta);
|
stub.set(catalogRemoveTableMeta, __catalogRemoveTableMeta);
|
||||||
stub.set(catalogGetTableIndex, __catalogGetTableIndex);
|
stub.set(catalogGetTableIndex, __catalogGetTableIndex);
|
||||||
stub.set(catalogGetDnodeList, __catalogGetDnodeList);
|
stub.set(catalogGetDnodeList, __catalogGetDnodeList);
|
||||||
|
stub.set(catalogRefreshGetTableCfg, __catalogRefreshGetTableCfg);
|
||||||
// {
|
// {
|
||||||
// AddrAny any("libcatalog.so");
|
// AddrAny any("libcatalog.so");
|
||||||
// std::map<std::string,void*> result;
|
// std::map<std::string,void*> result;
|
||||||
|
|
|
@ -199,6 +199,9 @@ class MockCatalogServiceImpl {
|
||||||
if (TSDB_CODE_SUCCESS == code && pCatalogReq->dNodeRequired) {
|
if (TSDB_CODE_SUCCESS == code && pCatalogReq->dNodeRequired) {
|
||||||
code = catalogGetDnodeList(&pMetaData->pDnodeList);
|
code = catalogGetDnodeList(&pMetaData->pDnodeList);
|
||||||
}
|
}
|
||||||
|
if (TSDB_CODE_SUCCESS == code) {
|
||||||
|
code = getAllTableCfg(pCatalogReq->pTableCfg, &pMetaData->pTableCfg);
|
||||||
|
}
|
||||||
return code;
|
return code;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -545,6 +548,20 @@ class MockCatalogServiceImpl {
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int32_t getAllTableCfg(SArray* pTableCfgReq, SArray** pTableCfgData) const {
|
||||||
|
if (NULL != pTableCfgReq) {
|
||||||
|
int32_t ntables = taosArrayGetSize(pTableCfgReq);
|
||||||
|
*pTableCfgData = taosArrayInit(ntables, sizeof(SMetaRes));
|
||||||
|
for (int32_t i = 0; i < ntables; ++i) {
|
||||||
|
SMetaRes res = {0};
|
||||||
|
res.pRes = taosMemoryCalloc(1, sizeof(STableCfg));
|
||||||
|
res.code = TSDB_CODE_SUCCESS;
|
||||||
|
taosArrayPush(*pTableCfgData, &res);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return TSDB_CODE_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
uint64_t id_;
|
uint64_t id_;
|
||||||
std::unique_ptr<TableBuilder> builder_;
|
std::unique_ptr<TableBuilder> builder_;
|
||||||
DbMetaCache meta_;
|
DbMetaCache meta_;
|
||||||
|
|
|
@ -45,7 +45,7 @@ TEST_F(ParserShowToUseTest, showCreateSTable) {
|
||||||
ASSERT_EQ(nodeType(pQuery->pRoot), QUERY_NODE_SHOW_CREATE_STABLE_STMT);
|
ASSERT_EQ(nodeType(pQuery->pRoot), QUERY_NODE_SHOW_CREATE_STABLE_STMT);
|
||||||
ASSERT_EQ(pQuery->execMode, QUERY_EXEC_MODE_LOCAL);
|
ASSERT_EQ(pQuery->execMode, QUERY_EXEC_MODE_LOCAL);
|
||||||
ASSERT_TRUE(pQuery->haveResultSet);
|
ASSERT_TRUE(pQuery->haveResultSet);
|
||||||
ASSERT_NE(((SShowCreateTableStmt*)pQuery->pRoot)->pMeta, nullptr);
|
ASSERT_NE(((SShowCreateTableStmt*)pQuery->pRoot)->pCfg, nullptr);
|
||||||
});
|
});
|
||||||
|
|
||||||
run("SHOW CREATE STABLE st1");
|
run("SHOW CREATE STABLE st1");
|
||||||
|
@ -58,7 +58,7 @@ TEST_F(ParserShowToUseTest, showCreateTable) {
|
||||||
ASSERT_EQ(nodeType(pQuery->pRoot), QUERY_NODE_SHOW_CREATE_TABLE_STMT);
|
ASSERT_EQ(nodeType(pQuery->pRoot), QUERY_NODE_SHOW_CREATE_TABLE_STMT);
|
||||||
ASSERT_EQ(pQuery->execMode, QUERY_EXEC_MODE_LOCAL);
|
ASSERT_EQ(pQuery->execMode, QUERY_EXEC_MODE_LOCAL);
|
||||||
ASSERT_TRUE(pQuery->haveResultSet);
|
ASSERT_TRUE(pQuery->haveResultSet);
|
||||||
ASSERT_NE(((SShowCreateTableStmt*)pQuery->pRoot)->pMeta, nullptr);
|
ASSERT_NE(((SShowCreateTableStmt*)pQuery->pRoot)->pCfg, nullptr);
|
||||||
});
|
});
|
||||||
|
|
||||||
run("SHOW CREATE TABLE t1");
|
run("SHOW CREATE TABLE t1");
|
||||||
|
|
|
@ -19,6 +19,7 @@
|
||||||
#include "tmsg.h"
|
#include "tmsg.h"
|
||||||
#include "trpc.h"
|
#include "trpc.h"
|
||||||
#include "tsched.h"
|
#include "tsched.h"
|
||||||
|
#include "cJSON.h"
|
||||||
|
|
||||||
#define VALIDNUMOFCOLS(x) ((x) >= TSDB_MIN_COLUMNS && (x) <= TSDB_MAX_COLUMNS)
|
#define VALIDNUMOFCOLS(x) ((x) >= TSDB_MIN_COLUMNS && (x) <= TSDB_MAX_COLUMNS)
|
||||||
#define VALIDNUMOFTAGS(x) ((x) >= 0 && (x) <= TSDB_MAX_TAGS)
|
#define VALIDNUMOFTAGS(x) ((x) >= 0 && (x) <= TSDB_MAX_TAGS)
|
||||||
|
@ -220,3 +221,209 @@ void destroyQueryExecRes(SQueryExecRes* pRes) {
|
||||||
qError("invalid exec result for request type %d", pRes->msgType);
|
qError("invalid exec result for request type %d", pRes->msgType);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int32_t dataConverToStr(char *str, int type, void *buf, int32_t bufSize, int32_t *len) {
|
||||||
|
int32_t n = 0;
|
||||||
|
|
||||||
|
switch (type) {
|
||||||
|
case TSDB_DATA_TYPE_NULL:
|
||||||
|
n = sprintf(str, "null");
|
||||||
|
break;
|
||||||
|
|
||||||
|
case TSDB_DATA_TYPE_BOOL:
|
||||||
|
n = sprintf(str, (*(int8_t*)buf) ? "true" : "false");
|
||||||
|
break;
|
||||||
|
|
||||||
|
case TSDB_DATA_TYPE_TINYINT:
|
||||||
|
n = sprintf(str, "%d", *(int8_t*)buf);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case TSDB_DATA_TYPE_SMALLINT:
|
||||||
|
n = sprintf(str, "%d", *(int16_t*)buf);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case TSDB_DATA_TYPE_INT:
|
||||||
|
n = sprintf(str, "%d", *(int32_t*)buf);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case TSDB_DATA_TYPE_BIGINT:
|
||||||
|
case TSDB_DATA_TYPE_TIMESTAMP:
|
||||||
|
n = sprintf(str, "%" PRId64, *(int64_t*)buf);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case TSDB_DATA_TYPE_FLOAT:
|
||||||
|
n = sprintf(str, "%e", GET_FLOAT_VAL(buf));
|
||||||
|
break;
|
||||||
|
|
||||||
|
case TSDB_DATA_TYPE_DOUBLE:
|
||||||
|
n = sprintf(str, "%e", GET_DOUBLE_VAL(buf));
|
||||||
|
break;
|
||||||
|
|
||||||
|
case TSDB_DATA_TYPE_BINARY:
|
||||||
|
case TSDB_DATA_TYPE_NCHAR:
|
||||||
|
if (bufSize < 0) {
|
||||||
|
// tscError("invalid buf size");
|
||||||
|
return TSDB_CODE_TSC_INVALID_VALUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
*str = '"';
|
||||||
|
memcpy(str + 1, buf, bufSize);
|
||||||
|
*(str + bufSize + 1) = '"';
|
||||||
|
n = bufSize + 2;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case TSDB_DATA_TYPE_UTINYINT:
|
||||||
|
n = sprintf(str, "%d", *(uint8_t*)buf);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case TSDB_DATA_TYPE_USMALLINT:
|
||||||
|
n = sprintf(str, "%d", *(uint16_t*)buf);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case TSDB_DATA_TYPE_UINT:
|
||||||
|
n = sprintf(str, "%u", *(uint32_t*)buf);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case TSDB_DATA_TYPE_UBIGINT:
|
||||||
|
n = sprintf(str, "%" PRIu64, *(uint64_t*)buf);
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
// tscError("unsupported type:%d", type);
|
||||||
|
return TSDB_CODE_TSC_INVALID_VALUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
*len = n;
|
||||||
|
|
||||||
|
return TSDB_CODE_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
char* parseTagDatatoJson(void* p) {
|
||||||
|
char* string = NULL;
|
||||||
|
cJSON* json = cJSON_CreateObject();
|
||||||
|
if (json == NULL) {
|
||||||
|
goto end;
|
||||||
|
}
|
||||||
|
|
||||||
|
SArray* pTagVals = NULL;
|
||||||
|
if (tTagToValArray((const STag*)p, &pTagVals) != 0) {
|
||||||
|
goto end;
|
||||||
|
}
|
||||||
|
|
||||||
|
int16_t nCols = taosArrayGetSize(pTagVals);
|
||||||
|
char tagJsonKey[256] = {0};
|
||||||
|
for (int j = 0; j < nCols; ++j) {
|
||||||
|
STagVal* pTagVal = (STagVal*)taosArrayGet(pTagVals, j);
|
||||||
|
// json key encode by binary
|
||||||
|
memset(tagJsonKey, 0, sizeof(tagJsonKey));
|
||||||
|
memcpy(tagJsonKey, pTagVal->pKey, strlen(pTagVal->pKey));
|
||||||
|
// json value
|
||||||
|
char type = pTagVal->type;
|
||||||
|
if (type == TSDB_DATA_TYPE_NULL) {
|
||||||
|
cJSON* value = cJSON_CreateNull();
|
||||||
|
if (value == NULL) {
|
||||||
|
goto end;
|
||||||
|
}
|
||||||
|
cJSON_AddItemToObject(json, tagJsonKey, value);
|
||||||
|
} else if (type == TSDB_DATA_TYPE_NCHAR) {
|
||||||
|
cJSON* value = NULL;
|
||||||
|
if (pTagVal->nData > 0) {
|
||||||
|
char* tagJsonValue = taosMemoryCalloc(pTagVal->nData, 1);
|
||||||
|
int32_t length = taosUcs4ToMbs((TdUcs4*)pTagVal->pData, pTagVal->nData, tagJsonValue);
|
||||||
|
if (length < 0) {
|
||||||
|
qError("charset:%s to %s. val:%s convert json value failed.", DEFAULT_UNICODE_ENCODEC, tsCharset,
|
||||||
|
pTagVal->pData);
|
||||||
|
taosMemoryFree(tagJsonValue);
|
||||||
|
goto end;
|
||||||
|
}
|
||||||
|
value = cJSON_CreateString(tagJsonValue);
|
||||||
|
taosMemoryFree(tagJsonValue);
|
||||||
|
if (value == NULL) {
|
||||||
|
goto end;
|
||||||
|
}
|
||||||
|
} else if (pTagVal->nData == 0) {
|
||||||
|
value = cJSON_CreateString("");
|
||||||
|
} else {
|
||||||
|
ASSERT(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
cJSON_AddItemToObject(json, tagJsonKey, value);
|
||||||
|
} else if (type == TSDB_DATA_TYPE_DOUBLE) {
|
||||||
|
double jsonVd = *(double*)(&pTagVal->i64);
|
||||||
|
cJSON* value = cJSON_CreateNumber(jsonVd);
|
||||||
|
if (value == NULL) {
|
||||||
|
goto end;
|
||||||
|
}
|
||||||
|
cJSON_AddItemToObject(json, tagJsonKey, value);
|
||||||
|
} else if (type == TSDB_DATA_TYPE_BOOL) {
|
||||||
|
char jsonVd = *(char*)(&pTagVal->i64);
|
||||||
|
cJSON* value = cJSON_CreateBool(jsonVd);
|
||||||
|
if (value == NULL) {
|
||||||
|
goto end;
|
||||||
|
}
|
||||||
|
cJSON_AddItemToObject(json, tagJsonKey, value);
|
||||||
|
} else {
|
||||||
|
ASSERT(0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
string = cJSON_PrintUnformatted(json);
|
||||||
|
end:
|
||||||
|
cJSON_Delete(json);
|
||||||
|
return string;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int32_t cloneTableMeta(STableMeta* pSrc, STableMeta** pDst) {
|
||||||
|
if (NULL == pSrc) {
|
||||||
|
*pDst = NULL;
|
||||||
|
return TSDB_CODE_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
int32_t metaSize = (pSrc->tableInfo.numOfColumns + pSrc->tableInfo.numOfTags) * sizeof(SSchema);
|
||||||
|
*pDst = taosMemoryMalloc(metaSize);
|
||||||
|
if (NULL == *pDst) {
|
||||||
|
return TSDB_CODE_TSC_OUT_OF_MEMORY;
|
||||||
|
}
|
||||||
|
memcpy(*pDst, pSrc, metaSize);
|
||||||
|
return TSDB_CODE_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
int32_t cloneDbVgInfo(SDBVgInfo* pSrc, SDBVgInfo** pDst) {
|
||||||
|
if (NULL == pSrc) {
|
||||||
|
*pDst = NULL;
|
||||||
|
return TSDB_CODE_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
*pDst = taosMemoryMalloc(sizeof(*pSrc));
|
||||||
|
if (NULL == *pDst) {
|
||||||
|
return TSDB_CODE_TSC_OUT_OF_MEMORY;
|
||||||
|
}
|
||||||
|
memcpy(*pDst, pSrc, sizeof(*pSrc));
|
||||||
|
if (pSrc->vgHash) {
|
||||||
|
(*pDst)->vgHash = taosHashInit(taosHashGetSize(pSrc->vgHash), taosGetDefaultHashFunction(TSDB_DATA_TYPE_INT), true, HASH_ENTRY_LOCK);
|
||||||
|
if (NULL == (*pDst)->vgHash) {
|
||||||
|
return TSDB_CODE_TSC_OUT_OF_MEMORY;
|
||||||
|
}
|
||||||
|
|
||||||
|
SVgroupInfo* vgInfo = NULL;
|
||||||
|
void *pIter = taosHashIterate(pSrc->vgHash, NULL);
|
||||||
|
while (pIter) {
|
||||||
|
vgInfo = pIter;
|
||||||
|
int32_t* vgId = taosHashGetKey(pIter, NULL);
|
||||||
|
|
||||||
|
if (0 != taosHashPut((*pDst)->vgHash, vgId, sizeof(*vgId), vgInfo, sizeof(*vgInfo))) {
|
||||||
|
qError("taosHashPut failed, vgId:%d", vgInfo->vgId);
|
||||||
|
taosHashCancelIterate(pSrc->vgHash, pIter);
|
||||||
|
taosHashCleanup((*pDst)->vgHash);
|
||||||
|
taosMemoryFreeClear(*pDst);
|
||||||
|
return TSDB_CODE_CTG_MEM_ERROR;
|
||||||
|
}
|
||||||
|
|
||||||
|
pIter = taosHashIterate(pSrc->vgHash, pIter);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return TSDB_CODE_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -63,7 +63,7 @@ int32_t queryBuildUseDbOutput(SUseDbOutput *pOut, SUseDbRsp *usedbRsp) {
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t queryBuildTableMetaReqMsg(void *input, char **msg, int32_t msgSize, int32_t *msgLen, void*(*mallcFp)(int32_t)) {
|
int32_t queryBuildTableMetaReqMsg(void *input, char **msg, int32_t msgSize, int32_t *msgLen, void*(*mallcFp)(int32_t)) {
|
||||||
SBuildTableMetaInput *pInput = input;
|
SBuildTableInput *pInput = input;
|
||||||
if (NULL == input || NULL == msg || NULL == msgLen) {
|
if (NULL == input || NULL == msg || NULL == msgLen) {
|
||||||
return TSDB_CODE_TSC_INVALID_INPUT;
|
return TSDB_CODE_TSC_INVALID_INPUT;
|
||||||
}
|
}
|
||||||
|
@ -233,6 +233,27 @@ int32_t queryBuildGetTbIndexMsg(void *input, char **msg, int32_t msgSize, int32_
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int32_t queryBuildGetTbCfgMsg(void *input, char **msg, int32_t msgSize, int32_t *msgLen, void*(*mallcFp)(int32_t)) {
|
||||||
|
if (NULL == msg || NULL == msgLen) {
|
||||||
|
return TSDB_CODE_TSC_INVALID_INPUT;
|
||||||
|
}
|
||||||
|
|
||||||
|
SBuildTableInput *pInput = input;
|
||||||
|
STableCfgReq cfgReq = {0};
|
||||||
|
cfgReq.header.vgId = pInput->vgId;
|
||||||
|
strcpy(cfgReq.dbFName, pInput->dbFName);
|
||||||
|
strcpy(cfgReq.tbName, pInput->tbName);
|
||||||
|
|
||||||
|
int32_t bufLen = tSerializeSTableCfgReq(NULL, 0, &cfgReq);
|
||||||
|
void *pBuf = (*mallcFp)(bufLen);
|
||||||
|
tSerializeSTableCfgReq(pBuf, bufLen, &cfgReq);
|
||||||
|
|
||||||
|
*msg = pBuf;
|
||||||
|
*msgLen = bufLen;
|
||||||
|
|
||||||
|
return TSDB_CODE_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
int32_t queryProcessUseDBRsp(void *output, char *msg, int32_t msgSize) {
|
int32_t queryProcessUseDBRsp(void *output, char *msg, int32_t msgSize) {
|
||||||
SUseDbOutput *pOut = output;
|
SUseDbOutput *pOut = output;
|
||||||
|
@ -527,6 +548,21 @@ int32_t queryProcessGetTbIndexRsp(void *output, char *msg, int32_t msgSize) {
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int32_t queryProcessGetTbCfgRsp(void *output, char *msg, int32_t msgSize) {
|
||||||
|
if (NULL == output || NULL == msg || msgSize <= 0) {
|
||||||
|
return TSDB_CODE_TSC_INVALID_INPUT;
|
||||||
|
}
|
||||||
|
|
||||||
|
STableCfgRsp *out = taosMemoryCalloc(1, sizeof(STableCfgRsp));
|
||||||
|
if (tDeserializeSTableCfgRsp(msg, msgSize, out) != 0) {
|
||||||
|
qError("tDeserializeSTableCfgRsp failed, msgSize:%d", msgSize);
|
||||||
|
return TSDB_CODE_INVALID_MSG;
|
||||||
|
}
|
||||||
|
|
||||||
|
*(STableCfgRsp**)output = out;
|
||||||
|
|
||||||
|
return TSDB_CODE_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
void initQueryModuleMsgHandle() {
|
void initQueryModuleMsgHandle() {
|
||||||
queryBuildMsg[TMSG_INDEX(TDMT_VND_TABLE_META)] = queryBuildTableMetaReqMsg;
|
queryBuildMsg[TMSG_INDEX(TDMT_VND_TABLE_META)] = queryBuildTableMetaReqMsg;
|
||||||
|
@ -539,6 +575,8 @@ void initQueryModuleMsgHandle() {
|
||||||
queryBuildMsg[TMSG_INDEX(TDMT_MND_RETRIEVE_FUNC)] = queryBuildRetrieveFuncMsg;
|
queryBuildMsg[TMSG_INDEX(TDMT_MND_RETRIEVE_FUNC)] = queryBuildRetrieveFuncMsg;
|
||||||
queryBuildMsg[TMSG_INDEX(TDMT_MND_GET_USER_AUTH)] = queryBuildGetUserAuthMsg;
|
queryBuildMsg[TMSG_INDEX(TDMT_MND_GET_USER_AUTH)] = queryBuildGetUserAuthMsg;
|
||||||
queryBuildMsg[TMSG_INDEX(TDMT_MND_GET_TABLE_INDEX)] = queryBuildGetTbIndexMsg;
|
queryBuildMsg[TMSG_INDEX(TDMT_MND_GET_TABLE_INDEX)] = queryBuildGetTbIndexMsg;
|
||||||
|
queryBuildMsg[TMSG_INDEX(TDMT_VND_TABLE_CFG)] = queryBuildGetTbCfgMsg;
|
||||||
|
queryBuildMsg[TMSG_INDEX(TDMT_MND_TABLE_CFG)] = queryBuildGetTbCfgMsg;
|
||||||
|
|
||||||
queryProcessMsgRsp[TMSG_INDEX(TDMT_VND_TABLE_META)] = queryProcessTableMetaRsp;
|
queryProcessMsgRsp[TMSG_INDEX(TDMT_VND_TABLE_META)] = queryProcessTableMetaRsp;
|
||||||
queryProcessMsgRsp[TMSG_INDEX(TDMT_MND_TABLE_META)] = queryProcessTableMetaRsp;
|
queryProcessMsgRsp[TMSG_INDEX(TDMT_MND_TABLE_META)] = queryProcessTableMetaRsp;
|
||||||
|
@ -550,6 +588,8 @@ void initQueryModuleMsgHandle() {
|
||||||
queryProcessMsgRsp[TMSG_INDEX(TDMT_MND_RETRIEVE_FUNC)] = queryProcessRetrieveFuncRsp;
|
queryProcessMsgRsp[TMSG_INDEX(TDMT_MND_RETRIEVE_FUNC)] = queryProcessRetrieveFuncRsp;
|
||||||
queryProcessMsgRsp[TMSG_INDEX(TDMT_MND_GET_USER_AUTH)] = queryProcessGetUserAuthRsp;
|
queryProcessMsgRsp[TMSG_INDEX(TDMT_MND_GET_USER_AUTH)] = queryProcessGetUserAuthRsp;
|
||||||
queryProcessMsgRsp[TMSG_INDEX(TDMT_MND_GET_TABLE_INDEX)] = queryProcessGetTbIndexRsp;
|
queryProcessMsgRsp[TMSG_INDEX(TDMT_MND_GET_TABLE_INDEX)] = queryProcessGetTbIndexRsp;
|
||||||
|
queryProcessMsgRsp[TMSG_INDEX(TDMT_VND_TABLE_CFG)] = queryProcessGetTbCfgRsp;
|
||||||
|
queryProcessMsgRsp[TMSG_INDEX(TDMT_MND_TABLE_CFG)] = queryProcessGetTbCfgRsp;
|
||||||
}
|
}
|
||||||
|
|
||||||
#pragma GCC diagnostic pop
|
#pragma GCC diagnostic pop
|
||||||
|
|
|
@ -197,6 +197,7 @@ int32_t syncNodeSendMsgByInfo(const SNodeInfo* nodeInfo, SSyncNode* pSyncNode, S
|
||||||
cJSON* syncNode2Json(const SSyncNode* pSyncNode);
|
cJSON* syncNode2Json(const SSyncNode* pSyncNode);
|
||||||
char* syncNode2Str(const SSyncNode* pSyncNode);
|
char* syncNode2Str(const SSyncNode* pSyncNode);
|
||||||
void syncNodeEventLog(const SSyncNode* pSyncNode, char* str);
|
void syncNodeEventLog(const SSyncNode* pSyncNode, char* str);
|
||||||
|
void syncNodeErrorLog(const SSyncNode* pSyncNode, char* str);
|
||||||
char* syncNode2SimpleStr(const SSyncNode* pSyncNode);
|
char* syncNode2SimpleStr(const SSyncNode* pSyncNode);
|
||||||
bool syncNodeInConfig(SSyncNode* pSyncNode, const SSyncCfg* config);
|
bool syncNodeInConfig(SSyncNode* pSyncNode, const SSyncCfg* config);
|
||||||
void syncNodeDoConfigChange(SSyncNode* pSyncNode, SSyncCfg* newConfig, SyncIndex lastConfigChangeIndex);
|
void syncNodeDoConfigChange(SSyncNode* pSyncNode, SSyncCfg* newConfig, SyncIndex lastConfigChangeIndex);
|
||||||
|
|
|
@ -99,19 +99,25 @@ int32_t syncNodeOnAppendEntriesCb(SSyncNode* ths, SyncAppendEntries* pMsg) {
|
||||||
if (pMsg->term > ths->pRaftStore->currentTerm) {
|
if (pMsg->term > ths->pRaftStore->currentTerm) {
|
||||||
syncNodeUpdateTerm(ths, pMsg->term);
|
syncNodeUpdateTerm(ths, pMsg->term);
|
||||||
}
|
}
|
||||||
assert(pMsg->term <= ths->pRaftStore->currentTerm);
|
ASSERT(pMsg->term <= ths->pRaftStore->currentTerm);
|
||||||
|
|
||||||
// reset elect timer
|
// reset elect timer
|
||||||
if (pMsg->term == ths->pRaftStore->currentTerm) {
|
if (pMsg->term == ths->pRaftStore->currentTerm) {
|
||||||
ths->leaderCache = pMsg->srcId;
|
ths->leaderCache = pMsg->srcId;
|
||||||
syncNodeResetElectTimer(ths);
|
syncNodeResetElectTimer(ths);
|
||||||
}
|
}
|
||||||
assert(pMsg->dataLen >= 0);
|
ASSERT(pMsg->dataLen >= 0);
|
||||||
|
|
||||||
SyncTerm localPreLogTerm = 0;
|
SyncTerm localPreLogTerm = 0;
|
||||||
if (pMsg->prevLogIndex >= SYNC_INDEX_BEGIN && pMsg->prevLogIndex <= ths->pLogStore->getLastIndex(ths->pLogStore)) {
|
if (pMsg->prevLogIndex >= SYNC_INDEX_BEGIN && pMsg->prevLogIndex <= ths->pLogStore->getLastIndex(ths->pLogStore)) {
|
||||||
SSyncRaftEntry* pEntry = ths->pLogStore->getEntry(ths->pLogStore, pMsg->prevLogIndex);
|
SSyncRaftEntry* pEntry = ths->pLogStore->getEntry(ths->pLogStore, pMsg->prevLogIndex);
|
||||||
assert(pEntry != NULL);
|
if (pEntry == NULL) {
|
||||||
|
char logBuf[128];
|
||||||
|
snprintf(logBuf, sizeof(logBuf), "getEntry error, index:%ld, since %s", pMsg->prevLogIndex, terrstr());
|
||||||
|
syncNodeErrorLog(ths, logBuf);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
localPreLogTerm = pEntry->term;
|
localPreLogTerm = pEntry->term;
|
||||||
syncEntryDestory(pEntry);
|
syncEntryDestory(pEntry);
|
||||||
}
|
}
|
||||||
|
@ -160,7 +166,7 @@ int32_t syncNodeOnAppendEntriesCb(SSyncNode* ths, SyncAppendEntries* pMsg) {
|
||||||
// accept request
|
// accept request
|
||||||
if (pMsg->term == ths->pRaftStore->currentTerm && ths->state == TAOS_SYNC_STATE_FOLLOWER && logOK) {
|
if (pMsg->term == ths->pRaftStore->currentTerm && ths->state == TAOS_SYNC_STATE_FOLLOWER && logOK) {
|
||||||
// preIndex = -1, or has preIndex entry in local log
|
// preIndex = -1, or has preIndex entry in local log
|
||||||
assert(pMsg->prevLogIndex <= ths->pLogStore->getLastIndex(ths->pLogStore));
|
ASSERT(pMsg->prevLogIndex <= ths->pLogStore->getLastIndex(ths->pLogStore));
|
||||||
|
|
||||||
// has extra entries (> preIndex) in local log
|
// has extra entries (> preIndex) in local log
|
||||||
bool hasExtraEntries = pMsg->prevLogIndex < ths->pLogStore->getLastIndex(ths->pLogStore);
|
bool hasExtraEntries = pMsg->prevLogIndex < ths->pLogStore->getLastIndex(ths->pLogStore);
|
||||||
|
@ -179,13 +185,21 @@ int32_t syncNodeOnAppendEntriesCb(SSyncNode* ths, SyncAppendEntries* pMsg) {
|
||||||
|
|
||||||
SyncIndex extraIndex = pMsg->prevLogIndex + 1;
|
SyncIndex extraIndex = pMsg->prevLogIndex + 1;
|
||||||
SSyncRaftEntry* pExtraEntry = ths->pLogStore->getEntry(ths->pLogStore, extraIndex);
|
SSyncRaftEntry* pExtraEntry = ths->pLogStore->getEntry(ths->pLogStore, extraIndex);
|
||||||
assert(pExtraEntry != NULL);
|
if (pExtraEntry == NULL) {
|
||||||
|
char logBuf[128];
|
||||||
|
snprintf(logBuf, sizeof(logBuf), "getEntry error2, index:%ld, since %s", extraIndex, terrstr());
|
||||||
|
syncNodeErrorLog(ths, logBuf);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
SSyncRaftEntry* pAppendEntry = syncEntryDeserialize(pMsg->data, pMsg->dataLen);
|
SSyncRaftEntry* pAppendEntry = syncEntryDeserialize(pMsg->data, pMsg->dataLen);
|
||||||
assert(pAppendEntry != NULL);
|
if (pAppendEntry == NULL) {
|
||||||
|
syncNodeErrorLog(ths, "syncEntryDeserialize pAppendEntry error");
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
// log not match, conflict
|
// log not match, conflict
|
||||||
assert(extraIndex == pAppendEntry->index);
|
ASSERT(extraIndex == pAppendEntry->index);
|
||||||
if (pExtraEntry->term != pAppendEntry->term) {
|
if (pExtraEntry->term != pAppendEntry->term) {
|
||||||
conflict = true;
|
conflict = true;
|
||||||
}
|
}
|
||||||
|
@ -201,7 +215,12 @@ int32_t syncNodeOnAppendEntriesCb(SSyncNode* ths, SyncAppendEntries* pMsg) {
|
||||||
for (SyncIndex index = delEnd; index >= delBegin; --index) {
|
for (SyncIndex index = delEnd; index >= delBegin; --index) {
|
||||||
if (ths->pFsm->FpRollBackCb != NULL) {
|
if (ths->pFsm->FpRollBackCb != NULL) {
|
||||||
SSyncRaftEntry* pRollBackEntry = ths->pLogStore->getEntry(ths->pLogStore, index);
|
SSyncRaftEntry* pRollBackEntry = ths->pLogStore->getEntry(ths->pLogStore, index);
|
||||||
assert(pRollBackEntry != NULL);
|
if (pRollBackEntry == NULL) {
|
||||||
|
char logBuf[128];
|
||||||
|
snprintf(logBuf, sizeof(logBuf), "getEntry error3, index:%ld, since %s", index, terrstr());
|
||||||
|
syncNodeErrorLog(ths, logBuf);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
// if (pRollBackEntry->msgType != TDMT_SYNC_NOOP) {
|
// if (pRollBackEntry->msgType != TDMT_SYNC_NOOP) {
|
||||||
if (syncUtilUserRollback(pRollBackEntry->msgType)) {
|
if (syncUtilUserRollback(pRollBackEntry->msgType)) {
|
||||||
|
@ -257,7 +276,10 @@ int32_t syncNodeOnAppendEntriesCb(SSyncNode* ths, SyncAppendEntries* pMsg) {
|
||||||
|
|
||||||
} else if (!hasExtraEntries && hasAppendEntries) {
|
} else if (!hasExtraEntries && hasAppendEntries) {
|
||||||
SSyncRaftEntry* pAppendEntry = syncEntryDeserialize(pMsg->data, pMsg->dataLen);
|
SSyncRaftEntry* pAppendEntry = syncEntryDeserialize(pMsg->data, pMsg->dataLen);
|
||||||
assert(pAppendEntry != NULL);
|
if (pAppendEntry == NULL) {
|
||||||
|
syncNodeErrorLog(ths, "syncEntryDeserialize pAppendEntry2 error");
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
// append new entries
|
// append new entries
|
||||||
ths->pLogStore->appendEntry(ths->pLogStore, pAppendEntry);
|
ths->pLogStore->appendEntry(ths->pLogStore, pAppendEntry);
|
||||||
|
@ -287,7 +309,8 @@ int32_t syncNodeOnAppendEntriesCb(SSyncNode* ths, SyncAppendEntries* pMsg) {
|
||||||
// do nothing
|
// do nothing
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
assert(0);
|
syncNodeLog3("", ths);
|
||||||
|
ASSERT(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
SyncAppendEntriesReply* pReply = syncAppendEntriesReplyBuild(ths->vgId);
|
SyncAppendEntriesReply* pReply = syncAppendEntriesReplyBuild(ths->vgId);
|
||||||
|
|
|
@ -67,7 +67,7 @@ int32_t syncNodeOnAppendEntriesReplyCb(SSyncNode* ths, SyncAppendEntriesReply* p
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
assert(pMsg->term == ths->pRaftStore->currentTerm);
|
ASSERT(pMsg->term == ths->pRaftStore->currentTerm);
|
||||||
|
|
||||||
if (pMsg->success) {
|
if (pMsg->success) {
|
||||||
// nextIndex' = [nextIndex EXCEPT ![i][j] = m.mmatchIndex + 1]
|
// nextIndex' = [nextIndex EXCEPT ![i][j] = m.mmatchIndex + 1]
|
||||||
|
|
|
@ -75,7 +75,7 @@ void syncMaybeAdvanceCommitIndex(SSyncNode* pSyncNode) {
|
||||||
if (agree) {
|
if (agree) {
|
||||||
// term
|
// term
|
||||||
SSyncRaftEntry* pEntry = pSyncNode->pLogStore->getEntry(pSyncNode->pLogStore, index);
|
SSyncRaftEntry* pEntry = pSyncNode->pLogStore->getEntry(pSyncNode->pLogStore, index);
|
||||||
assert(pEntry != NULL);
|
ASSERT(pEntry != NULL);
|
||||||
|
|
||||||
// cannot commit, even if quorum agree. need check term!
|
// cannot commit, even if quorum agree. need check term!
|
||||||
if (pEntry->term == pSyncNode->pRaftStore->currentTerm) {
|
if (pEntry->term == pSyncNode->pRaftStore->currentTerm) {
|
||||||
|
|
|
@ -32,7 +32,7 @@
|
||||||
// /\ UNCHANGED <<serverVars, candidateVars, leaderVars, logVars>>
|
// /\ UNCHANGED <<serverVars, candidateVars, leaderVars, logVars>>
|
||||||
//
|
//
|
||||||
int32_t syncNodeRequestVotePeers(SSyncNode* pSyncNode) {
|
int32_t syncNodeRequestVotePeers(SSyncNode* pSyncNode) {
|
||||||
assert(pSyncNode->state == TAOS_SYNC_STATE_CANDIDATE);
|
ASSERT(pSyncNode->state == TAOS_SYNC_STATE_CANDIDATE);
|
||||||
|
|
||||||
int32_t ret = 0;
|
int32_t ret = 0;
|
||||||
for (int i = 0; i < pSyncNode->peersNum; ++i) {
|
for (int i = 0; i < pSyncNode->peersNum; ++i) {
|
||||||
|
@ -44,7 +44,7 @@ int32_t syncNodeRequestVotePeers(SSyncNode* pSyncNode) {
|
||||||
pMsg->lastLogTerm = pSyncNode->pLogStore->getLastTerm(pSyncNode->pLogStore);
|
pMsg->lastLogTerm = pSyncNode->pLogStore->getLastTerm(pSyncNode->pLogStore);
|
||||||
|
|
||||||
ret = syncNodeRequestVote(pSyncNode, &pSyncNode->peersId[i], pMsg);
|
ret = syncNodeRequestVote(pSyncNode, &pSyncNode->peersId[i], pMsg);
|
||||||
assert(ret == 0);
|
ASSERT(ret == 0);
|
||||||
syncRequestVoteDestroy(pMsg);
|
syncRequestVoteDestroy(pMsg);
|
||||||
}
|
}
|
||||||
return ret;
|
return ret;
|
||||||
|
@ -75,7 +75,7 @@ int32_t syncNodeElect(SSyncNode* pSyncNode) {
|
||||||
if (pSyncNode->state == TAOS_SYNC_STATE_FOLLOWER) {
|
if (pSyncNode->state == TAOS_SYNC_STATE_FOLLOWER) {
|
||||||
syncNodeFollower2Candidate(pSyncNode);
|
syncNodeFollower2Candidate(pSyncNode);
|
||||||
}
|
}
|
||||||
assert(pSyncNode->state == TAOS_SYNC_STATE_CANDIDATE);
|
ASSERT(pSyncNode->state == TAOS_SYNC_STATE_CANDIDATE);
|
||||||
|
|
||||||
// start election
|
// start election
|
||||||
raftStoreNextTerm(pSyncNode->pRaftStore);
|
raftStoreNextTerm(pSyncNode->pRaftStore);
|
||||||
|
@ -86,7 +86,7 @@ int32_t syncNodeElect(SSyncNode* pSyncNode) {
|
||||||
syncNodeVoteForSelf(pSyncNode);
|
syncNodeVoteForSelf(pSyncNode);
|
||||||
if (voteGrantedMajority(pSyncNode->pVotesGranted)) {
|
if (voteGrantedMajority(pSyncNode->pVotesGranted)) {
|
||||||
// only myself, to leader
|
// only myself, to leader
|
||||||
assert(!pSyncNode->pVotesGranted->toLeader);
|
ASSERT(!pSyncNode->pVotesGranted->toLeader);
|
||||||
syncNodeCandidate2Leader(pSyncNode);
|
syncNodeCandidate2Leader(pSyncNode);
|
||||||
pSyncNode->pVotesGranted->toLeader = true;
|
pSyncNode->pVotesGranted->toLeader = true;
|
||||||
return ret;
|
return ret;
|
||||||
|
@ -98,7 +98,7 @@ int32_t syncNodeElect(SSyncNode* pSyncNode) {
|
||||||
ret = syncNodeRequestVotePeers(pSyncNode);
|
ret = syncNodeRequestVotePeers(pSyncNode);
|
||||||
}
|
}
|
||||||
|
|
||||||
assert(ret == 0);
|
ASSERT(ret == 0);
|
||||||
syncNodeResetElectTimer(pSyncNode);
|
syncNodeResetElectTimer(pSyncNode);
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
|
|
|
@ -14,7 +14,7 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "syncEnv.h"
|
#include "syncEnv.h"
|
||||||
// #include <assert.h>
|
// #include <ASSERT.h>
|
||||||
|
|
||||||
SSyncEnv *gSyncEnv = NULL;
|
SSyncEnv *gSyncEnv = NULL;
|
||||||
|
|
||||||
|
@ -40,7 +40,7 @@ int32_t syncEnvStart() {
|
||||||
taosSeedRand(seed);
|
taosSeedRand(seed);
|
||||||
// gSyncEnv = doSyncEnvStart(gSyncEnv);
|
// gSyncEnv = doSyncEnvStart(gSyncEnv);
|
||||||
gSyncEnv = doSyncEnvStart();
|
gSyncEnv = doSyncEnvStart();
|
||||||
assert(gSyncEnv != NULL);
|
ASSERT(gSyncEnv != NULL);
|
||||||
sTrace("sync env start ok");
|
sTrace("sync env start ok");
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
@ -86,7 +86,7 @@ static void syncEnvTick(void *param, void *tmrId) {
|
||||||
|
|
||||||
static SSyncEnv *doSyncEnvStart() {
|
static SSyncEnv *doSyncEnvStart() {
|
||||||
SSyncEnv *pSyncEnv = (SSyncEnv *)taosMemoryMalloc(sizeof(SSyncEnv));
|
SSyncEnv *pSyncEnv = (SSyncEnv *)taosMemoryMalloc(sizeof(SSyncEnv));
|
||||||
assert(pSyncEnv != NULL);
|
ASSERT(pSyncEnv != NULL);
|
||||||
memset(pSyncEnv, 0, sizeof(SSyncEnv));
|
memset(pSyncEnv, 0, sizeof(SSyncEnv));
|
||||||
|
|
||||||
pSyncEnv->envTickTimerCounter = 0;
|
pSyncEnv->envTickTimerCounter = 0;
|
||||||
|
@ -103,7 +103,7 @@ static SSyncEnv *doSyncEnvStart() {
|
||||||
}
|
}
|
||||||
|
|
||||||
static int32_t doSyncEnvStop(SSyncEnv *pSyncEnv) {
|
static int32_t doSyncEnvStop(SSyncEnv *pSyncEnv) {
|
||||||
assert(pSyncEnv == gSyncEnv);
|
ASSERT(pSyncEnv == gSyncEnv);
|
||||||
if (pSyncEnv != NULL) {
|
if (pSyncEnv != NULL) {
|
||||||
atomic_store_8(&(pSyncEnv->isStart), 0);
|
atomic_store_8(&(pSyncEnv->isStart), 0);
|
||||||
taosTmrCleanUp(pSyncEnv->pTimerManager);
|
taosTmrCleanUp(pSyncEnv->pTimerManager);
|
||||||
|
|
|
@ -30,7 +30,7 @@ static int32_t syncIODestroy(SSyncIO *io);
|
||||||
static int32_t syncIOStartInternal(SSyncIO *io);
|
static int32_t syncIOStartInternal(SSyncIO *io);
|
||||||
static int32_t syncIOStopInternal(SSyncIO *io);
|
static int32_t syncIOStopInternal(SSyncIO *io);
|
||||||
|
|
||||||
static void * syncIOConsumerFunc(void *param);
|
static void *syncIOConsumerFunc(void *param);
|
||||||
static void syncIOProcessRequest(void *pParent, SRpcMsg *pMsg, SEpSet *pEpSet);
|
static void syncIOProcessRequest(void *pParent, SRpcMsg *pMsg, SEpSet *pEpSet);
|
||||||
static void syncIOProcessReply(void *pParent, SRpcMsg *pMsg, SEpSet *pEpSet);
|
static void syncIOProcessReply(void *pParent, SRpcMsg *pMsg, SEpSet *pEpSet);
|
||||||
static int32_t syncIOAuth(void *parent, char *meterId, char *spi, char *encrypt, char *secret, char *ckey);
|
static int32_t syncIOAuth(void *parent, char *meterId, char *spi, char *encrypt, char *secret, char *ckey);
|
||||||
|
@ -47,11 +47,11 @@ static void syncIOTickPing(void *param, void *tmrId);
|
||||||
int32_t syncIOStart(char *host, uint16_t port) {
|
int32_t syncIOStart(char *host, uint16_t port) {
|
||||||
int32_t ret = 0;
|
int32_t ret = 0;
|
||||||
gSyncIO = syncIOCreate(host, port);
|
gSyncIO = syncIOCreate(host, port);
|
||||||
assert(gSyncIO != NULL);
|
ASSERT(gSyncIO != NULL);
|
||||||
|
|
||||||
taosSeedRand(taosGetTimestampSec());
|
taosSeedRand(taosGetTimestampSec());
|
||||||
ret = syncIOStartInternal(gSyncIO);
|
ret = syncIOStartInternal(gSyncIO);
|
||||||
assert(ret == 0);
|
ASSERT(ret == 0);
|
||||||
|
|
||||||
sTrace("syncIOStart ok, gSyncIO:%p", gSyncIO);
|
sTrace("syncIOStart ok, gSyncIO:%p", gSyncIO);
|
||||||
return ret;
|
return ret;
|
||||||
|
@ -59,16 +59,16 @@ int32_t syncIOStart(char *host, uint16_t port) {
|
||||||
|
|
||||||
int32_t syncIOStop() {
|
int32_t syncIOStop() {
|
||||||
int32_t ret = syncIOStopInternal(gSyncIO);
|
int32_t ret = syncIOStopInternal(gSyncIO);
|
||||||
assert(ret == 0);
|
ASSERT(ret == 0);
|
||||||
|
|
||||||
ret = syncIODestroy(gSyncIO);
|
ret = syncIODestroy(gSyncIO);
|
||||||
assert(ret == 0);
|
ASSERT(ret == 0);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t syncIOSendMsg(const SEpSet *pEpSet, SRpcMsg *pMsg) {
|
int32_t syncIOSendMsg(const SEpSet *pEpSet, SRpcMsg *pMsg) {
|
||||||
assert(pEpSet->inUse == 0);
|
ASSERT(pEpSet->inUse == 0);
|
||||||
assert(pEpSet->numOfEps == 1);
|
ASSERT(pEpSet->numOfEps == 1);
|
||||||
|
|
||||||
int32_t ret = 0;
|
int32_t ret = 0;
|
||||||
{
|
{
|
||||||
|
@ -107,25 +107,25 @@ int32_t syncIOEqMsg(const SMsgCb *msgcb, SRpcMsg *pMsg) {
|
||||||
|
|
||||||
int32_t syncIOQTimerStart() {
|
int32_t syncIOQTimerStart() {
|
||||||
int32_t ret = syncIOStartQ(gSyncIO);
|
int32_t ret = syncIOStartQ(gSyncIO);
|
||||||
assert(ret == 0);
|
ASSERT(ret == 0);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t syncIOQTimerStop() {
|
int32_t syncIOQTimerStop() {
|
||||||
int32_t ret = syncIOStopQ(gSyncIO);
|
int32_t ret = syncIOStopQ(gSyncIO);
|
||||||
assert(ret == 0);
|
ASSERT(ret == 0);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t syncIOPingTimerStart() {
|
int32_t syncIOPingTimerStart() {
|
||||||
int32_t ret = syncIOStartPing(gSyncIO);
|
int32_t ret = syncIOStartPing(gSyncIO);
|
||||||
assert(ret == 0);
|
ASSERT(ret == 0);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t syncIOPingTimerStop() {
|
int32_t syncIOPingTimerStop() {
|
||||||
int32_t ret = syncIOStopPing(gSyncIO);
|
int32_t ret = syncIOStopPing(gSyncIO);
|
||||||
assert(ret == 0);
|
ASSERT(ret == 0);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -151,7 +151,7 @@ static SSyncIO *syncIOCreate(char *host, uint16_t port) {
|
||||||
static int32_t syncIODestroy(SSyncIO *io) {
|
static int32_t syncIODestroy(SSyncIO *io) {
|
||||||
int32_t ret = 0;
|
int32_t ret = 0;
|
||||||
int8_t start = atomic_load_8(&io->isStart);
|
int8_t start = atomic_load_8(&io->isStart);
|
||||||
assert(start == 0);
|
ASSERT(start == 0);
|
||||||
|
|
||||||
if (io->serverRpc != NULL) {
|
if (io->serverRpc != NULL) {
|
||||||
rpcClose(io->serverRpc);
|
rpcClose(io->serverRpc);
|
||||||
|
@ -242,9 +242,9 @@ static int32_t syncIOStopInternal(SSyncIO *io) {
|
||||||
}
|
}
|
||||||
|
|
||||||
static void *syncIOConsumerFunc(void *param) {
|
static void *syncIOConsumerFunc(void *param) {
|
||||||
SSyncIO * io = param;
|
SSyncIO *io = param;
|
||||||
STaosQall *qall;
|
STaosQall *qall;
|
||||||
SRpcMsg * pRpcMsg, rpcMsg;
|
SRpcMsg *pRpcMsg, rpcMsg;
|
||||||
qall = taosAllocateQall();
|
qall = taosAllocateQall();
|
||||||
|
|
||||||
while (1) {
|
while (1) {
|
||||||
|
@ -264,7 +264,7 @@ static void *syncIOConsumerFunc(void *param) {
|
||||||
if (pRpcMsg->msgType == TDMT_SYNC_PING) {
|
if (pRpcMsg->msgType == TDMT_SYNC_PING) {
|
||||||
if (io->FpOnSyncPing != NULL) {
|
if (io->FpOnSyncPing != NULL) {
|
||||||
SyncPing *pSyncMsg = syncPingFromRpcMsg2(pRpcMsg);
|
SyncPing *pSyncMsg = syncPingFromRpcMsg2(pRpcMsg);
|
||||||
assert(pSyncMsg != NULL);
|
ASSERT(pSyncMsg != NULL);
|
||||||
io->FpOnSyncPing(io->pSyncNode, pSyncMsg);
|
io->FpOnSyncPing(io->pSyncNode, pSyncMsg);
|
||||||
syncPingDestroy(pSyncMsg);
|
syncPingDestroy(pSyncMsg);
|
||||||
}
|
}
|
||||||
|
@ -272,7 +272,7 @@ static void *syncIOConsumerFunc(void *param) {
|
||||||
} else if (pRpcMsg->msgType == TDMT_SYNC_PING_REPLY) {
|
} else if (pRpcMsg->msgType == TDMT_SYNC_PING_REPLY) {
|
||||||
if (io->FpOnSyncPingReply != NULL) {
|
if (io->FpOnSyncPingReply != NULL) {
|
||||||
SyncPingReply *pSyncMsg = syncPingReplyFromRpcMsg2(pRpcMsg);
|
SyncPingReply *pSyncMsg = syncPingReplyFromRpcMsg2(pRpcMsg);
|
||||||
assert(pSyncMsg != NULL);
|
ASSERT(pSyncMsg != NULL);
|
||||||
io->FpOnSyncPingReply(io->pSyncNode, pSyncMsg);
|
io->FpOnSyncPingReply(io->pSyncNode, pSyncMsg);
|
||||||
syncPingReplyDestroy(pSyncMsg);
|
syncPingReplyDestroy(pSyncMsg);
|
||||||
}
|
}
|
||||||
|
@ -280,7 +280,7 @@ static void *syncIOConsumerFunc(void *param) {
|
||||||
} else if (pRpcMsg->msgType == TDMT_SYNC_CLIENT_REQUEST) {
|
} else if (pRpcMsg->msgType == TDMT_SYNC_CLIENT_REQUEST) {
|
||||||
if (io->FpOnSyncClientRequest != NULL) {
|
if (io->FpOnSyncClientRequest != NULL) {
|
||||||
SyncClientRequest *pSyncMsg = syncClientRequestFromRpcMsg2(pRpcMsg);
|
SyncClientRequest *pSyncMsg = syncClientRequestFromRpcMsg2(pRpcMsg);
|
||||||
assert(pSyncMsg != NULL);
|
ASSERT(pSyncMsg != NULL);
|
||||||
io->FpOnSyncClientRequest(io->pSyncNode, pSyncMsg);
|
io->FpOnSyncClientRequest(io->pSyncNode, pSyncMsg);
|
||||||
syncClientRequestDestroy(pSyncMsg);
|
syncClientRequestDestroy(pSyncMsg);
|
||||||
}
|
}
|
||||||
|
@ -288,7 +288,7 @@ static void *syncIOConsumerFunc(void *param) {
|
||||||
} else if (pRpcMsg->msgType == TDMT_SYNC_REQUEST_VOTE) {
|
} else if (pRpcMsg->msgType == TDMT_SYNC_REQUEST_VOTE) {
|
||||||
if (io->FpOnSyncRequestVote != NULL) {
|
if (io->FpOnSyncRequestVote != NULL) {
|
||||||
SyncRequestVote *pSyncMsg = syncRequestVoteFromRpcMsg2(pRpcMsg);
|
SyncRequestVote *pSyncMsg = syncRequestVoteFromRpcMsg2(pRpcMsg);
|
||||||
assert(pSyncMsg != NULL);
|
ASSERT(pSyncMsg != NULL);
|
||||||
io->FpOnSyncRequestVote(io->pSyncNode, pSyncMsg);
|
io->FpOnSyncRequestVote(io->pSyncNode, pSyncMsg);
|
||||||
syncRequestVoteDestroy(pSyncMsg);
|
syncRequestVoteDestroy(pSyncMsg);
|
||||||
}
|
}
|
||||||
|
@ -296,7 +296,7 @@ static void *syncIOConsumerFunc(void *param) {
|
||||||
} else if (pRpcMsg->msgType == TDMT_SYNC_REQUEST_VOTE_REPLY) {
|
} else if (pRpcMsg->msgType == TDMT_SYNC_REQUEST_VOTE_REPLY) {
|
||||||
if (io->FpOnSyncRequestVoteReply != NULL) {
|
if (io->FpOnSyncRequestVoteReply != NULL) {
|
||||||
SyncRequestVoteReply *pSyncMsg = syncRequestVoteReplyFromRpcMsg2(pRpcMsg);
|
SyncRequestVoteReply *pSyncMsg = syncRequestVoteReplyFromRpcMsg2(pRpcMsg);
|
||||||
assert(pSyncMsg != NULL);
|
ASSERT(pSyncMsg != NULL);
|
||||||
io->FpOnSyncRequestVoteReply(io->pSyncNode, pSyncMsg);
|
io->FpOnSyncRequestVoteReply(io->pSyncNode, pSyncMsg);
|
||||||
syncRequestVoteReplyDestroy(pSyncMsg);
|
syncRequestVoteReplyDestroy(pSyncMsg);
|
||||||
}
|
}
|
||||||
|
@ -304,7 +304,7 @@ static void *syncIOConsumerFunc(void *param) {
|
||||||
} else if (pRpcMsg->msgType == TDMT_SYNC_APPEND_ENTRIES) {
|
} else if (pRpcMsg->msgType == TDMT_SYNC_APPEND_ENTRIES) {
|
||||||
if (io->FpOnSyncAppendEntries != NULL) {
|
if (io->FpOnSyncAppendEntries != NULL) {
|
||||||
SyncAppendEntries *pSyncMsg = syncAppendEntriesFromRpcMsg2(pRpcMsg);
|
SyncAppendEntries *pSyncMsg = syncAppendEntriesFromRpcMsg2(pRpcMsg);
|
||||||
assert(pSyncMsg != NULL);
|
ASSERT(pSyncMsg != NULL);
|
||||||
io->FpOnSyncAppendEntries(io->pSyncNode, pSyncMsg);
|
io->FpOnSyncAppendEntries(io->pSyncNode, pSyncMsg);
|
||||||
syncAppendEntriesDestroy(pSyncMsg);
|
syncAppendEntriesDestroy(pSyncMsg);
|
||||||
}
|
}
|
||||||
|
@ -312,7 +312,7 @@ static void *syncIOConsumerFunc(void *param) {
|
||||||
} else if (pRpcMsg->msgType == TDMT_SYNC_APPEND_ENTRIES_REPLY) {
|
} else if (pRpcMsg->msgType == TDMT_SYNC_APPEND_ENTRIES_REPLY) {
|
||||||
if (io->FpOnSyncAppendEntriesReply != NULL) {
|
if (io->FpOnSyncAppendEntriesReply != NULL) {
|
||||||
SyncAppendEntriesReply *pSyncMsg = syncAppendEntriesReplyFromRpcMsg2(pRpcMsg);
|
SyncAppendEntriesReply *pSyncMsg = syncAppendEntriesReplyFromRpcMsg2(pRpcMsg);
|
||||||
assert(pSyncMsg != NULL);
|
ASSERT(pSyncMsg != NULL);
|
||||||
io->FpOnSyncAppendEntriesReply(io->pSyncNode, pSyncMsg);
|
io->FpOnSyncAppendEntriesReply(io->pSyncNode, pSyncMsg);
|
||||||
syncAppendEntriesReplyDestroy(pSyncMsg);
|
syncAppendEntriesReplyDestroy(pSyncMsg);
|
||||||
}
|
}
|
||||||
|
@ -320,7 +320,7 @@ static void *syncIOConsumerFunc(void *param) {
|
||||||
} else if (pRpcMsg->msgType == TDMT_SYNC_TIMEOUT) {
|
} else if (pRpcMsg->msgType == TDMT_SYNC_TIMEOUT) {
|
||||||
if (io->FpOnSyncTimeout != NULL) {
|
if (io->FpOnSyncTimeout != NULL) {
|
||||||
SyncTimeout *pSyncMsg = syncTimeoutFromRpcMsg2(pRpcMsg);
|
SyncTimeout *pSyncMsg = syncTimeoutFromRpcMsg2(pRpcMsg);
|
||||||
assert(pSyncMsg != NULL);
|
ASSERT(pSyncMsg != NULL);
|
||||||
io->FpOnSyncTimeout(io->pSyncNode, pSyncMsg);
|
io->FpOnSyncTimeout(io->pSyncNode, pSyncMsg);
|
||||||
syncTimeoutDestroy(pSyncMsg);
|
syncTimeoutDestroy(pSyncMsg);
|
||||||
}
|
}
|
||||||
|
@ -328,7 +328,7 @@ static void *syncIOConsumerFunc(void *param) {
|
||||||
} else if (pRpcMsg->msgType == TDMT_SYNC_SNAPSHOT_SEND) {
|
} else if (pRpcMsg->msgType == TDMT_SYNC_SNAPSHOT_SEND) {
|
||||||
if (io->FpOnSyncSnapshotSend != NULL) {
|
if (io->FpOnSyncSnapshotSend != NULL) {
|
||||||
SyncSnapshotSend *pSyncMsg = syncSnapshotSendFromRpcMsg2(pRpcMsg);
|
SyncSnapshotSend *pSyncMsg = syncSnapshotSendFromRpcMsg2(pRpcMsg);
|
||||||
assert(pSyncMsg != NULL);
|
ASSERT(pSyncMsg != NULL);
|
||||||
io->FpOnSyncSnapshotSend(io->pSyncNode, pSyncMsg);
|
io->FpOnSyncSnapshotSend(io->pSyncNode, pSyncMsg);
|
||||||
syncSnapshotSendDestroy(pSyncMsg);
|
syncSnapshotSendDestroy(pSyncMsg);
|
||||||
}
|
}
|
||||||
|
@ -336,7 +336,7 @@ static void *syncIOConsumerFunc(void *param) {
|
||||||
} else if (pRpcMsg->msgType == TDMT_SYNC_SNAPSHOT_RSP) {
|
} else if (pRpcMsg->msgType == TDMT_SYNC_SNAPSHOT_RSP) {
|
||||||
if (io->FpOnSyncSnapshotRsp != NULL) {
|
if (io->FpOnSyncSnapshotRsp != NULL) {
|
||||||
SyncSnapshotRsp *pSyncMsg = syncSnapshotRspFromRpcMsg2(pRpcMsg);
|
SyncSnapshotRsp *pSyncMsg = syncSnapshotRspFromRpcMsg2(pRpcMsg);
|
||||||
assert(pSyncMsg != NULL);
|
ASSERT(pSyncMsg != NULL);
|
||||||
io->FpOnSyncSnapshotRsp(io->pSyncNode, pSyncMsg);
|
io->FpOnSyncSnapshotRsp(io->pSyncNode, pSyncMsg);
|
||||||
syncSnapshotRspDestroy(pSyncMsg);
|
syncSnapshotRspDestroy(pSyncMsg);
|
||||||
}
|
}
|
||||||
|
|
|
@ -20,7 +20,7 @@
|
||||||
|
|
||||||
SSyncIndexMgr *syncIndexMgrCreate(SSyncNode *pSyncNode) {
|
SSyncIndexMgr *syncIndexMgrCreate(SSyncNode *pSyncNode) {
|
||||||
SSyncIndexMgr *pSyncIndexMgr = taosMemoryMalloc(sizeof(SSyncIndexMgr));
|
SSyncIndexMgr *pSyncIndexMgr = taosMemoryMalloc(sizeof(SSyncIndexMgr));
|
||||||
assert(pSyncIndexMgr != NULL);
|
ASSERT(pSyncIndexMgr != NULL);
|
||||||
memset(pSyncIndexMgr, 0, sizeof(SSyncIndexMgr));
|
memset(pSyncIndexMgr, 0, sizeof(SSyncIndexMgr));
|
||||||
|
|
||||||
pSyncIndexMgr->replicas = &(pSyncNode->replicasId);
|
pSyncIndexMgr->replicas = &(pSyncNode->replicasId);
|
||||||
|
@ -63,7 +63,7 @@ void syncIndexMgrSetIndex(SSyncIndexMgr *pSyncIndexMgr, const SRaftId *pRaftId,
|
||||||
}
|
}
|
||||||
|
|
||||||
// maybe config change
|
// maybe config change
|
||||||
// assert(0);
|
// ASSERT(0);
|
||||||
|
|
||||||
char host[128];
|
char host[128];
|
||||||
uint16_t port;
|
uint16_t port;
|
||||||
|
@ -169,7 +169,7 @@ void syncIndexMgrSetTerm(SSyncIndexMgr *pSyncIndexMgr, const SRaftId *pRaftId, S
|
||||||
}
|
}
|
||||||
|
|
||||||
// maybe config change
|
// maybe config change
|
||||||
// assert(0);
|
// ASSERT(0);
|
||||||
char host[128];
|
char host[128];
|
||||||
uint16_t port;
|
uint16_t port;
|
||||||
syncUtilU642Addr(pRaftId->addr, host, sizeof(host), &port);
|
syncUtilU642Addr(pRaftId->addr, host, sizeof(host), &port);
|
||||||
|
@ -183,5 +183,5 @@ SyncTerm syncIndexMgrGetTerm(SSyncIndexMgr *pSyncIndexMgr, const SRaftId *pRaftI
|
||||||
return term;
|
return term;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
assert(0);
|
ASSERT(0);
|
||||||
}
|
}
|
|
@ -75,7 +75,7 @@ int32_t syncInit() {
|
||||||
|
|
||||||
void syncCleanUp() {
|
void syncCleanUp() {
|
||||||
int32_t ret = syncEnvStop();
|
int32_t ret = syncEnvStop();
|
||||||
assert(ret == 0);
|
ASSERT(ret == 0);
|
||||||
|
|
||||||
if (tsNodeRefId != -1) {
|
if (tsNodeRefId != -1) {
|
||||||
taosCloseRef(tsNodeRefId);
|
taosCloseRef(tsNodeRefId);
|
||||||
|
@ -85,7 +85,7 @@ void syncCleanUp() {
|
||||||
|
|
||||||
int64_t syncOpen(const SSyncInfo* pSyncInfo) {
|
int64_t syncOpen(const SSyncInfo* pSyncInfo) {
|
||||||
SSyncNode* pSyncNode = syncNodeOpen(pSyncInfo);
|
SSyncNode* pSyncNode = syncNodeOpen(pSyncInfo);
|
||||||
assert(pSyncNode != NULL);
|
ASSERT(pSyncNode != NULL);
|
||||||
|
|
||||||
if (gRaftDetailLog) {
|
if (gRaftDetailLog) {
|
||||||
syncNodeLog2("syncNodeOpen open success", pSyncNode);
|
syncNodeLog2("syncNodeOpen open success", pSyncNode);
|
||||||
|
@ -318,7 +318,7 @@ bool syncCanLeaderTransfer(int64_t rid) {
|
||||||
if (pSyncNode == NULL) {
|
if (pSyncNode == NULL) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
assert(rid == pSyncNode->rid);
|
ASSERT(rid == pSyncNode->rid);
|
||||||
|
|
||||||
if (pSyncNode->replicaNum == 1) {
|
if (pSyncNode->replicaNum == 1) {
|
||||||
taosReleaseRef(tsNodeRefId, pSyncNode->rid);
|
taosReleaseRef(tsNodeRefId, pSyncNode->rid);
|
||||||
|
@ -355,7 +355,7 @@ ESyncState syncGetMyRole(int64_t rid) {
|
||||||
if (pSyncNode == NULL) {
|
if (pSyncNode == NULL) {
|
||||||
return TAOS_SYNC_STATE_ERROR;
|
return TAOS_SYNC_STATE_ERROR;
|
||||||
}
|
}
|
||||||
assert(rid == pSyncNode->rid);
|
ASSERT(rid == pSyncNode->rid);
|
||||||
ESyncState state = pSyncNode->state;
|
ESyncState state = pSyncNode->state;
|
||||||
|
|
||||||
taosReleaseRef(tsNodeRefId, pSyncNode->rid);
|
taosReleaseRef(tsNodeRefId, pSyncNode->rid);
|
||||||
|
@ -367,7 +367,7 @@ bool syncIsReady(int64_t rid) {
|
||||||
if (pSyncNode == NULL) {
|
if (pSyncNode == NULL) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
assert(rid == pSyncNode->rid);
|
ASSERT(rid == pSyncNode->rid);
|
||||||
bool b = (pSyncNode->state == TAOS_SYNC_STATE_LEADER) && pSyncNode->restoreFinish;
|
bool b = (pSyncNode->state == TAOS_SYNC_STATE_LEADER) && pSyncNode->restoreFinish;
|
||||||
taosReleaseRef(tsNodeRefId, pSyncNode->rid);
|
taosReleaseRef(tsNodeRefId, pSyncNode->rid);
|
||||||
return b;
|
return b;
|
||||||
|
@ -378,7 +378,7 @@ bool syncIsRestoreFinish(int64_t rid) {
|
||||||
if (pSyncNode == NULL) {
|
if (pSyncNode == NULL) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
assert(rid == pSyncNode->rid);
|
ASSERT(rid == pSyncNode->rid);
|
||||||
bool b = pSyncNode->restoreFinish;
|
bool b = pSyncNode->restoreFinish;
|
||||||
|
|
||||||
taosReleaseRef(tsNodeRefId, pSyncNode->rid);
|
taosReleaseRef(tsNodeRefId, pSyncNode->rid);
|
||||||
|
@ -390,7 +390,7 @@ int32_t syncGetSnapshotMeta(int64_t rid, struct SSnapshotMeta* sMeta) {
|
||||||
if (pSyncNode == NULL) {
|
if (pSyncNode == NULL) {
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
assert(rid == pSyncNode->rid);
|
ASSERT(rid == pSyncNode->rid);
|
||||||
sMeta->lastConfigIndex = pSyncNode->pRaftCfg->lastConfigIndex;
|
sMeta->lastConfigIndex = pSyncNode->pRaftCfg->lastConfigIndex;
|
||||||
|
|
||||||
sTrace("vgId:%d, get snapshot meta, lastConfigIndex:%" PRId64, pSyncNode->vgId, pSyncNode->pRaftCfg->lastConfigIndex);
|
sTrace("vgId:%d, get snapshot meta, lastConfigIndex:%" PRId64, pSyncNode->vgId, pSyncNode->pRaftCfg->lastConfigIndex);
|
||||||
|
@ -404,7 +404,7 @@ int32_t syncGetSnapshotMetaByIndex(int64_t rid, SyncIndex snapshotIndex, struct
|
||||||
if (pSyncNode == NULL) {
|
if (pSyncNode == NULL) {
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
assert(rid == pSyncNode->rid);
|
ASSERT(rid == pSyncNode->rid);
|
||||||
|
|
||||||
ASSERT(pSyncNode->pRaftCfg->configIndexCount >= 1);
|
ASSERT(pSyncNode->pRaftCfg->configIndexCount >= 1);
|
||||||
SyncIndex lastIndex = (pSyncNode->pRaftCfg->configIndexArr)[0];
|
SyncIndex lastIndex = (pSyncNode->pRaftCfg->configIndexArr)[0];
|
||||||
|
@ -448,7 +448,7 @@ SyncTerm syncGetMyTerm(int64_t rid) {
|
||||||
if (pSyncNode == NULL) {
|
if (pSyncNode == NULL) {
|
||||||
return TAOS_SYNC_STATE_ERROR;
|
return TAOS_SYNC_STATE_ERROR;
|
||||||
}
|
}
|
||||||
assert(rid == pSyncNode->rid);
|
ASSERT(rid == pSyncNode->rid);
|
||||||
SyncTerm term = pSyncNode->pRaftStore->currentTerm;
|
SyncTerm term = pSyncNode->pRaftStore->currentTerm;
|
||||||
|
|
||||||
taosReleaseRef(tsNodeRefId, pSyncNode->rid);
|
taosReleaseRef(tsNodeRefId, pSyncNode->rid);
|
||||||
|
@ -460,7 +460,7 @@ SyncGroupId syncGetVgId(int64_t rid) {
|
||||||
if (pSyncNode == NULL) {
|
if (pSyncNode == NULL) {
|
||||||
return TAOS_SYNC_STATE_ERROR;
|
return TAOS_SYNC_STATE_ERROR;
|
||||||
}
|
}
|
||||||
assert(rid == pSyncNode->rid);
|
ASSERT(rid == pSyncNode->rid);
|
||||||
SyncGroupId vgId = pSyncNode->vgId;
|
SyncGroupId vgId = pSyncNode->vgId;
|
||||||
|
|
||||||
taosReleaseRef(tsNodeRefId, pSyncNode->rid);
|
taosReleaseRef(tsNodeRefId, pSyncNode->rid);
|
||||||
|
@ -473,7 +473,7 @@ void syncGetEpSet(int64_t rid, SEpSet* pEpSet) {
|
||||||
memset(pEpSet, 0, sizeof(*pEpSet));
|
memset(pEpSet, 0, sizeof(*pEpSet));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
assert(rid == pSyncNode->rid);
|
ASSERT(rid == pSyncNode->rid);
|
||||||
pEpSet->numOfEps = 0;
|
pEpSet->numOfEps = 0;
|
||||||
for (int i = 0; i < pSyncNode->pRaftCfg->cfg.replicaNum; ++i) {
|
for (int i = 0; i < pSyncNode->pRaftCfg->cfg.replicaNum; ++i) {
|
||||||
snprintf(pEpSet->eps[i].fqdn, sizeof(pEpSet->eps[i].fqdn), "%s", (pSyncNode->pRaftCfg->cfg.nodeInfo)[i].nodeFqdn);
|
snprintf(pEpSet->eps[i].fqdn, sizeof(pEpSet->eps[i].fqdn), "%s", (pSyncNode->pRaftCfg->cfg.nodeInfo)[i].nodeFqdn);
|
||||||
|
@ -494,7 +494,7 @@ int32_t syncGetRespRpc(int64_t rid, uint64_t index, SRpcMsg* msg) {
|
||||||
if (pSyncNode == NULL) {
|
if (pSyncNode == NULL) {
|
||||||
return TAOS_SYNC_STATE_ERROR;
|
return TAOS_SYNC_STATE_ERROR;
|
||||||
}
|
}
|
||||||
assert(rid == pSyncNode->rid);
|
ASSERT(rid == pSyncNode->rid);
|
||||||
|
|
||||||
SRespStub stub;
|
SRespStub stub;
|
||||||
int32_t ret = syncRespMgrGet(pSyncNode->pSyncRespMgr, index, &stub);
|
int32_t ret = syncRespMgrGet(pSyncNode->pSyncRespMgr, index, &stub);
|
||||||
|
@ -511,7 +511,7 @@ int32_t syncGetAndDelRespRpc(int64_t rid, uint64_t index, SRpcHandleInfo* pInfo)
|
||||||
if (pSyncNode == NULL) {
|
if (pSyncNode == NULL) {
|
||||||
return TAOS_SYNC_STATE_ERROR;
|
return TAOS_SYNC_STATE_ERROR;
|
||||||
}
|
}
|
||||||
assert(rid == pSyncNode->rid);
|
ASSERT(rid == pSyncNode->rid);
|
||||||
|
|
||||||
SRespStub stub;
|
SRespStub stub;
|
||||||
int32_t ret = syncRespMgrGetAndDel(pSyncNode->pSyncRespMgr, index, &stub);
|
int32_t ret = syncRespMgrGetAndDel(pSyncNode->pSyncRespMgr, index, &stub);
|
||||||
|
@ -530,7 +530,7 @@ void syncSetMsgCb(int64_t rid, const SMsgCb* msgcb) {
|
||||||
sTrace("syncSetQ get pSyncNode is NULL, rid:%ld", rid);
|
sTrace("syncSetQ get pSyncNode is NULL, rid:%ld", rid);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
assert(rid == pSyncNode->rid);
|
ASSERT(rid == pSyncNode->rid);
|
||||||
pSyncNode->msgcb = msgcb;
|
pSyncNode->msgcb = msgcb;
|
||||||
|
|
||||||
taosReleaseRef(tsNodeRefId, pSyncNode->rid);
|
taosReleaseRef(tsNodeRefId, pSyncNode->rid);
|
||||||
|
@ -542,7 +542,7 @@ char* sync2SimpleStr(int64_t rid) {
|
||||||
sTrace("syncSetRpc get pSyncNode is NULL, rid:%ld", rid);
|
sTrace("syncSetRpc get pSyncNode is NULL, rid:%ld", rid);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
assert(rid == pSyncNode->rid);
|
ASSERT(rid == pSyncNode->rid);
|
||||||
char* s = syncNode2SimpleStr(pSyncNode);
|
char* s = syncNode2SimpleStr(pSyncNode);
|
||||||
taosReleaseRef(tsNodeRefId, pSyncNode->rid);
|
taosReleaseRef(tsNodeRefId, pSyncNode->rid);
|
||||||
|
|
||||||
|
@ -554,7 +554,7 @@ void setPingTimerMS(int64_t rid, int32_t pingTimerMS) {
|
||||||
if (pSyncNode == NULL) {
|
if (pSyncNode == NULL) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
assert(rid == pSyncNode->rid);
|
ASSERT(rid == pSyncNode->rid);
|
||||||
pSyncNode->pingBaseLine = pingTimerMS;
|
pSyncNode->pingBaseLine = pingTimerMS;
|
||||||
pSyncNode->pingTimerMS = pingTimerMS;
|
pSyncNode->pingTimerMS = pingTimerMS;
|
||||||
|
|
||||||
|
@ -566,7 +566,7 @@ void setElectTimerMS(int64_t rid, int32_t electTimerMS) {
|
||||||
if (pSyncNode == NULL) {
|
if (pSyncNode == NULL) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
assert(rid == pSyncNode->rid);
|
ASSERT(rid == pSyncNode->rid);
|
||||||
pSyncNode->electBaseLine = electTimerMS;
|
pSyncNode->electBaseLine = electTimerMS;
|
||||||
|
|
||||||
taosReleaseRef(tsNodeRefId, pSyncNode->rid);
|
taosReleaseRef(tsNodeRefId, pSyncNode->rid);
|
||||||
|
@ -577,7 +577,7 @@ void setHeartbeatTimerMS(int64_t rid, int32_t hbTimerMS) {
|
||||||
if (pSyncNode == NULL) {
|
if (pSyncNode == NULL) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
assert(rid == pSyncNode->rid);
|
ASSERT(rid == pSyncNode->rid);
|
||||||
pSyncNode->hbBaseLine = hbTimerMS;
|
pSyncNode->hbBaseLine = hbTimerMS;
|
||||||
pSyncNode->heartbeatTimerMS = hbTimerMS;
|
pSyncNode->heartbeatTimerMS = hbTimerMS;
|
||||||
|
|
||||||
|
@ -592,7 +592,7 @@ int32_t syncPropose(int64_t rid, const SRpcMsg* pMsg, bool isWeak) {
|
||||||
terrno = TSDB_CODE_SYN_INTERNAL_ERROR;
|
terrno = TSDB_CODE_SYN_INTERNAL_ERROR;
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
assert(rid == pSyncNode->rid);
|
ASSERT(rid == pSyncNode->rid);
|
||||||
ret = syncNodePropose(pSyncNode, pMsg, isWeak);
|
ret = syncNodePropose(pSyncNode, pMsg, isWeak);
|
||||||
|
|
||||||
taosReleaseRef(tsNodeRefId, pSyncNode->rid);
|
taosReleaseRef(tsNodeRefId, pSyncNode->rid);
|
||||||
|
@ -662,7 +662,7 @@ SSyncNode* syncNodeOpen(const SSyncInfo* pOldSyncInfo) {
|
||||||
SSyncInfo* pSyncInfo = (SSyncInfo*)pOldSyncInfo;
|
SSyncInfo* pSyncInfo = (SSyncInfo*)pOldSyncInfo;
|
||||||
|
|
||||||
SSyncNode* pSyncNode = (SSyncNode*)taosMemoryMalloc(sizeof(SSyncNode));
|
SSyncNode* pSyncNode = (SSyncNode*)taosMemoryMalloc(sizeof(SSyncNode));
|
||||||
assert(pSyncNode != NULL);
|
ASSERT(pSyncNode != NULL);
|
||||||
memset(pSyncNode, 0, sizeof(SSyncNode));
|
memset(pSyncNode, 0, sizeof(SSyncNode));
|
||||||
|
|
||||||
int32_t ret = 0;
|
int32_t ret = 0;
|
||||||
|
@ -682,12 +682,12 @@ SSyncNode* syncNodeOpen(const SSyncInfo* pOldSyncInfo) {
|
||||||
meta.snapshotEnable = pSyncInfo->snapshotEnable;
|
meta.snapshotEnable = pSyncInfo->snapshotEnable;
|
||||||
meta.lastConfigIndex = SYNC_INDEX_INVALID;
|
meta.lastConfigIndex = SYNC_INDEX_INVALID;
|
||||||
ret = raftCfgCreateFile((SSyncCfg*)&(pSyncInfo->syncCfg), meta, pSyncNode->configPath);
|
ret = raftCfgCreateFile((SSyncCfg*)&(pSyncInfo->syncCfg), meta, pSyncNode->configPath);
|
||||||
assert(ret == 0);
|
ASSERT(ret == 0);
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
// update syncCfg by raft_config.json
|
// update syncCfg by raft_config.json
|
||||||
pSyncNode->pRaftCfg = raftCfgOpen(pSyncNode->configPath);
|
pSyncNode->pRaftCfg = raftCfgOpen(pSyncNode->configPath);
|
||||||
assert(pSyncNode->pRaftCfg != NULL);
|
ASSERT(pSyncNode->pRaftCfg != NULL);
|
||||||
pSyncInfo->syncCfg = pSyncNode->pRaftCfg->cfg;
|
pSyncInfo->syncCfg = pSyncNode->pRaftCfg->cfg;
|
||||||
|
|
||||||
if (gRaftDetailLog) {
|
if (gRaftDetailLog) {
|
||||||
|
@ -712,7 +712,7 @@ SSyncNode* syncNodeOpen(const SSyncInfo* pOldSyncInfo) {
|
||||||
|
|
||||||
// init raft config
|
// init raft config
|
||||||
pSyncNode->pRaftCfg = raftCfgOpen(pSyncNode->configPath);
|
pSyncNode->pRaftCfg = raftCfgOpen(pSyncNode->configPath);
|
||||||
assert(pSyncNode->pRaftCfg != NULL);
|
ASSERT(pSyncNode->pRaftCfg != NULL);
|
||||||
|
|
||||||
// init internal
|
// init internal
|
||||||
pSyncNode->myNodeInfo = pSyncNode->pRaftCfg->cfg.nodeInfo[pSyncNode->pRaftCfg->cfg.myIndex];
|
pSyncNode->myNodeInfo = pSyncNode->pRaftCfg->cfg.nodeInfo[pSyncNode->pRaftCfg->cfg.myIndex];
|
||||||
|
@ -771,23 +771,23 @@ SSyncNode* syncNodeOpen(const SSyncInfo* pOldSyncInfo) {
|
||||||
// init TLA+ server vars
|
// init TLA+ server vars
|
||||||
pSyncNode->state = TAOS_SYNC_STATE_FOLLOWER;
|
pSyncNode->state = TAOS_SYNC_STATE_FOLLOWER;
|
||||||
pSyncNode->pRaftStore = raftStoreOpen(pSyncNode->raftStorePath);
|
pSyncNode->pRaftStore = raftStoreOpen(pSyncNode->raftStorePath);
|
||||||
assert(pSyncNode->pRaftStore != NULL);
|
ASSERT(pSyncNode->pRaftStore != NULL);
|
||||||
|
|
||||||
// init TLA+ candidate vars
|
// init TLA+ candidate vars
|
||||||
pSyncNode->pVotesGranted = voteGrantedCreate(pSyncNode);
|
pSyncNode->pVotesGranted = voteGrantedCreate(pSyncNode);
|
||||||
assert(pSyncNode->pVotesGranted != NULL);
|
ASSERT(pSyncNode->pVotesGranted != NULL);
|
||||||
pSyncNode->pVotesRespond = votesRespondCreate(pSyncNode);
|
pSyncNode->pVotesRespond = votesRespondCreate(pSyncNode);
|
||||||
assert(pSyncNode->pVotesRespond != NULL);
|
ASSERT(pSyncNode->pVotesRespond != NULL);
|
||||||
|
|
||||||
// init TLA+ leader vars
|
// init TLA+ leader vars
|
||||||
pSyncNode->pNextIndex = syncIndexMgrCreate(pSyncNode);
|
pSyncNode->pNextIndex = syncIndexMgrCreate(pSyncNode);
|
||||||
assert(pSyncNode->pNextIndex != NULL);
|
ASSERT(pSyncNode->pNextIndex != NULL);
|
||||||
pSyncNode->pMatchIndex = syncIndexMgrCreate(pSyncNode);
|
pSyncNode->pMatchIndex = syncIndexMgrCreate(pSyncNode);
|
||||||
assert(pSyncNode->pMatchIndex != NULL);
|
ASSERT(pSyncNode->pMatchIndex != NULL);
|
||||||
|
|
||||||
// init TLA+ log vars
|
// init TLA+ log vars
|
||||||
pSyncNode->pLogStore = logStoreCreate(pSyncNode);
|
pSyncNode->pLogStore = logStoreCreate(pSyncNode);
|
||||||
assert(pSyncNode->pLogStore != NULL);
|
ASSERT(pSyncNode->pLogStore != NULL);
|
||||||
pSyncNode->commitIndex = SYNC_INDEX_INVALID;
|
pSyncNode->commitIndex = SYNC_INDEX_INVALID;
|
||||||
|
|
||||||
// timer ms init
|
// timer ms init
|
||||||
|
@ -845,7 +845,7 @@ SSyncNode* syncNodeOpen(const SSyncInfo* pOldSyncInfo) {
|
||||||
|
|
||||||
// tools
|
// tools
|
||||||
pSyncNode->pSyncRespMgr = syncRespMgrCreate(pSyncNode, 0);
|
pSyncNode->pSyncRespMgr = syncRespMgrCreate(pSyncNode, 0);
|
||||||
assert(pSyncNode->pSyncRespMgr != NULL);
|
ASSERT(pSyncNode->pSyncRespMgr != NULL);
|
||||||
|
|
||||||
// restore state
|
// restore state
|
||||||
pSyncNode->restoreFinish = false;
|
pSyncNode->restoreFinish = false;
|
||||||
|
@ -893,7 +893,7 @@ void syncNodeStart(SSyncNode* pSyncNode) {
|
||||||
|
|
||||||
// int32_t ret = 0;
|
// int32_t ret = 0;
|
||||||
// ret = syncNodeStartPingTimer(pSyncNode);
|
// ret = syncNodeStartPingTimer(pSyncNode);
|
||||||
// assert(ret == 0);
|
// ASSERT(ret == 0);
|
||||||
|
|
||||||
if (gRaftDetailLog) {
|
if (gRaftDetailLog) {
|
||||||
syncNodeLog2("==state change become leader immediately==", pSyncNode);
|
syncNodeLog2("==state change become leader immediately==", pSyncNode);
|
||||||
|
@ -915,10 +915,10 @@ void syncNodeClose(SSyncNode* pSyncNode) {
|
||||||
syncNodeEventLog(pSyncNode, "sync close");
|
syncNodeEventLog(pSyncNode, "sync close");
|
||||||
|
|
||||||
int32_t ret;
|
int32_t ret;
|
||||||
assert(pSyncNode != NULL);
|
ASSERT(pSyncNode != NULL);
|
||||||
|
|
||||||
ret = raftStoreClose(pSyncNode->pRaftStore);
|
ret = raftStoreClose(pSyncNode->pRaftStore);
|
||||||
assert(ret == 0);
|
ASSERT(ret == 0);
|
||||||
|
|
||||||
syncRespMgrDestroy(pSyncNode->pSyncRespMgr);
|
syncRespMgrDestroy(pSyncNode->pSyncRespMgr);
|
||||||
voteGrantedDestroy(pSyncNode->pVotesGranted);
|
voteGrantedDestroy(pSyncNode->pVotesGranted);
|
||||||
|
@ -980,7 +980,7 @@ int32_t syncNodePingSelf(SSyncNode* pSyncNode) {
|
||||||
int32_t ret = 0;
|
int32_t ret = 0;
|
||||||
SyncPing* pMsg = syncPingBuild3(&pSyncNode->myRaftId, &pSyncNode->myRaftId, pSyncNode->vgId);
|
SyncPing* pMsg = syncPingBuild3(&pSyncNode->myRaftId, &pSyncNode->myRaftId, pSyncNode->vgId);
|
||||||
ret = syncNodePing(pSyncNode, &pMsg->destId, pMsg);
|
ret = syncNodePing(pSyncNode, &pMsg->destId, pMsg);
|
||||||
assert(ret == 0);
|
ASSERT(ret == 0);
|
||||||
|
|
||||||
syncPingDestroy(pMsg);
|
syncPingDestroy(pMsg);
|
||||||
return ret;
|
return ret;
|
||||||
|
@ -992,7 +992,7 @@ int32_t syncNodePingPeers(SSyncNode* pSyncNode) {
|
||||||
SRaftId* destId = &(pSyncNode->peersId[i]);
|
SRaftId* destId = &(pSyncNode->peersId[i]);
|
||||||
SyncPing* pMsg = syncPingBuild3(&pSyncNode->myRaftId, destId, pSyncNode->vgId);
|
SyncPing* pMsg = syncPingBuild3(&pSyncNode->myRaftId, destId, pSyncNode->vgId);
|
||||||
ret = syncNodePing(pSyncNode, destId, pMsg);
|
ret = syncNodePing(pSyncNode, destId, pMsg);
|
||||||
assert(ret == 0);
|
ASSERT(ret == 0);
|
||||||
syncPingDestroy(pMsg);
|
syncPingDestroy(pMsg);
|
||||||
}
|
}
|
||||||
return ret;
|
return ret;
|
||||||
|
@ -1004,7 +1004,7 @@ int32_t syncNodePingAll(SSyncNode* pSyncNode) {
|
||||||
SRaftId* destId = &(pSyncNode->replicasId[i]);
|
SRaftId* destId = &(pSyncNode->replicasId[i]);
|
||||||
SyncPing* pMsg = syncPingBuild3(&pSyncNode->myRaftId, destId, pSyncNode->vgId);
|
SyncPing* pMsg = syncPingBuild3(&pSyncNode->myRaftId, destId, pSyncNode->vgId);
|
||||||
ret = syncNodePing(pSyncNode, destId, pMsg);
|
ret = syncNodePing(pSyncNode, destId, pMsg);
|
||||||
assert(ret == 0);
|
ASSERT(ret == 0);
|
||||||
syncPingDestroy(pMsg);
|
syncPingDestroy(pMsg);
|
||||||
}
|
}
|
||||||
return ret;
|
return ret;
|
||||||
|
@ -1311,6 +1311,7 @@ void syncNodeEventLog(const SSyncNode* pSyncNode, char* str) {
|
||||||
|
|
||||||
if (userStrLen < 256) {
|
if (userStrLen < 256) {
|
||||||
char logBuf[128 + 256];
|
char logBuf[128 + 256];
|
||||||
|
if (pSyncNode != NULL && pSyncNode->pRaftCfg != NULL && pSyncNode->pRaftStore != NULL) {
|
||||||
snprintf(logBuf, sizeof(logBuf),
|
snprintf(logBuf, sizeof(logBuf),
|
||||||
"vgId:%d, sync %s %s, term:%lu, commit:%ld, beginlog:%ld, lastlog:%ld, lastsnapshot:%ld, standby:%d, "
|
"vgId:%d, sync %s %s, term:%lu, commit:%ld, beginlog:%ld, lastlog:%ld, lastsnapshot:%ld, standby:%d, "
|
||||||
"replica-num:%d, "
|
"replica-num:%d, "
|
||||||
|
@ -1319,11 +1320,15 @@ void syncNodeEventLog(const SSyncNode* pSyncNode, char* str) {
|
||||||
pSyncNode->commitIndex, logBeginIndex, logLastIndex, snapshot.lastApplyIndex,
|
pSyncNode->commitIndex, logBeginIndex, logLastIndex, snapshot.lastApplyIndex,
|
||||||
pSyncNode->pRaftCfg->isStandBy, pSyncNode->replicaNum, pSyncNode->pRaftCfg->lastConfigIndex,
|
pSyncNode->pRaftCfg->isStandBy, pSyncNode->replicaNum, pSyncNode->pRaftCfg->lastConfigIndex,
|
||||||
pSyncNode->changing);
|
pSyncNode->changing);
|
||||||
|
} else {
|
||||||
|
snprintf(logBuf, sizeof(logBuf), "%s", str);
|
||||||
|
}
|
||||||
sDebug("%s", logBuf);
|
sDebug("%s", logBuf);
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
int len = 128 + userStrLen;
|
int len = 128 + userStrLen;
|
||||||
char* s = (char*)taosMemoryMalloc(len);
|
char* s = (char*)taosMemoryMalloc(len);
|
||||||
|
if (pSyncNode != NULL && pSyncNode->pRaftCfg != NULL && pSyncNode->pRaftStore != NULL) {
|
||||||
snprintf(s, len,
|
snprintf(s, len,
|
||||||
"vgId:%d, sync %s %s, term:%lu, commit:%ld, beginlog:%ld, lastlog:%ld, lastsnapshot:%ld, standby:%d, "
|
"vgId:%d, sync %s %s, term:%lu, commit:%ld, beginlog:%ld, lastlog:%ld, lastsnapshot:%ld, standby:%d, "
|
||||||
"replica-num:%d, "
|
"replica-num:%d, "
|
||||||
|
@ -1332,11 +1337,60 @@ void syncNodeEventLog(const SSyncNode* pSyncNode, char* str) {
|
||||||
pSyncNode->commitIndex, logBeginIndex, logLastIndex, snapshot.lastApplyIndex,
|
pSyncNode->commitIndex, logBeginIndex, logLastIndex, snapshot.lastApplyIndex,
|
||||||
pSyncNode->pRaftCfg->isStandBy, pSyncNode->replicaNum, pSyncNode->pRaftCfg->lastConfigIndex,
|
pSyncNode->pRaftCfg->isStandBy, pSyncNode->replicaNum, pSyncNode->pRaftCfg->lastConfigIndex,
|
||||||
pSyncNode->changing);
|
pSyncNode->changing);
|
||||||
|
} else {
|
||||||
|
snprintf(s, len, "%s", str);
|
||||||
|
}
|
||||||
sDebug("%s", s);
|
sDebug("%s", s);
|
||||||
taosMemoryFree(s);
|
taosMemoryFree(s);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void syncNodeErrorLog(const SSyncNode* pSyncNode, char* str) {
|
||||||
|
int32_t userStrLen = strlen(str);
|
||||||
|
|
||||||
|
SSnapshot snapshot = {.data = NULL, .lastApplyIndex = -1, .lastApplyTerm = 0};
|
||||||
|
if (pSyncNode->pFsm->FpGetSnapshotInfo != NULL) {
|
||||||
|
pSyncNode->pFsm->FpGetSnapshotInfo(pSyncNode->pFsm, &snapshot);
|
||||||
|
}
|
||||||
|
SyncIndex logLastIndex = pSyncNode->pLogStore->syncLogLastIndex(pSyncNode->pLogStore);
|
||||||
|
SyncIndex logBeginIndex = pSyncNode->pLogStore->syncLogBeginIndex(pSyncNode->pLogStore);
|
||||||
|
|
||||||
|
if (userStrLen < 256) {
|
||||||
|
char logBuf[128 + 256];
|
||||||
|
if (pSyncNode != NULL && pSyncNode->pRaftCfg != NULL && pSyncNode->pRaftStore != NULL) {
|
||||||
|
snprintf(logBuf, sizeof(logBuf),
|
||||||
|
"vgId:%d, sync %s %s, term:%lu, commit:%ld, beginlog:%ld, lastlog:%ld, lastsnapshot:%ld, standby:%d, "
|
||||||
|
"replica-num:%d, "
|
||||||
|
"lconfig:%ld, changing:%d",
|
||||||
|
pSyncNode->vgId, syncUtilState2String(pSyncNode->state), str, pSyncNode->pRaftStore->currentTerm,
|
||||||
|
pSyncNode->commitIndex, logBeginIndex, logLastIndex, snapshot.lastApplyIndex,
|
||||||
|
pSyncNode->pRaftCfg->isStandBy, pSyncNode->replicaNum, pSyncNode->pRaftCfg->lastConfigIndex,
|
||||||
|
pSyncNode->changing);
|
||||||
|
} else {
|
||||||
|
snprintf(logBuf, sizeof(logBuf), "%s", str);
|
||||||
|
}
|
||||||
|
sError("%s", logBuf);
|
||||||
|
|
||||||
|
} else {
|
||||||
|
int len = 128 + userStrLen;
|
||||||
|
char* s = (char*)taosMemoryMalloc(len);
|
||||||
|
if (pSyncNode != NULL && pSyncNode->pRaftCfg != NULL && pSyncNode->pRaftStore != NULL) {
|
||||||
|
snprintf(s, len,
|
||||||
|
"vgId:%d, sync %s %s, term:%lu, commit:%ld, beginlog:%ld, lastlog:%ld, lastsnapshot:%ld, standby:%d, "
|
||||||
|
"replica-num:%d, "
|
||||||
|
"lconfig:%ld, changing:%d",
|
||||||
|
pSyncNode->vgId, syncUtilState2String(pSyncNode->state), str, pSyncNode->pRaftStore->currentTerm,
|
||||||
|
pSyncNode->commitIndex, logBeginIndex, logLastIndex, snapshot.lastApplyIndex,
|
||||||
|
pSyncNode->pRaftCfg->isStandBy, pSyncNode->replicaNum, pSyncNode->pRaftCfg->lastConfigIndex,
|
||||||
|
pSyncNode->changing);
|
||||||
|
} else {
|
||||||
|
snprintf(s, len, "%s", str);
|
||||||
|
}
|
||||||
|
sError("%s", s);
|
||||||
|
taosMemoryFree(s);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
char* syncNode2SimpleStr(const SSyncNode* pSyncNode) {
|
char* syncNode2SimpleStr(const SSyncNode* pSyncNode) {
|
||||||
int len = 256;
|
int len = 256;
|
||||||
char* s = (char*)taosMemoryMalloc(len);
|
char* s = (char*)taosMemoryMalloc(len);
|
||||||
|
@ -1702,8 +1756,8 @@ void syncNodeBecomeLeader(SSyncNode* pSyncNode, const char* debugStr) {
|
||||||
}
|
}
|
||||||
|
|
||||||
void syncNodeCandidate2Leader(SSyncNode* pSyncNode) {
|
void syncNodeCandidate2Leader(SSyncNode* pSyncNode) {
|
||||||
assert(pSyncNode->state == TAOS_SYNC_STATE_CANDIDATE);
|
ASSERT(pSyncNode->state == TAOS_SYNC_STATE_CANDIDATE);
|
||||||
assert(voteGrantedMajority(pSyncNode->pVotesGranted));
|
ASSERT(voteGrantedMajority(pSyncNode->pVotesGranted));
|
||||||
syncNodeBecomeLeader(pSyncNode, "candidate to leader");
|
syncNodeBecomeLeader(pSyncNode, "candidate to leader");
|
||||||
|
|
||||||
syncNodeLog2("==state change syncNodeCandidate2Leader==", pSyncNode);
|
syncNodeLog2("==state change syncNodeCandidate2Leader==", pSyncNode);
|
||||||
|
@ -1715,21 +1769,21 @@ void syncNodeCandidate2Leader(SSyncNode* pSyncNode) {
|
||||||
}
|
}
|
||||||
|
|
||||||
void syncNodeFollower2Candidate(SSyncNode* pSyncNode) {
|
void syncNodeFollower2Candidate(SSyncNode* pSyncNode) {
|
||||||
assert(pSyncNode->state == TAOS_SYNC_STATE_FOLLOWER);
|
ASSERT(pSyncNode->state == TAOS_SYNC_STATE_FOLLOWER);
|
||||||
pSyncNode->state = TAOS_SYNC_STATE_CANDIDATE;
|
pSyncNode->state = TAOS_SYNC_STATE_CANDIDATE;
|
||||||
|
|
||||||
syncNodeLog2("==state change syncNodeFollower2Candidate==", pSyncNode);
|
syncNodeLog2("==state change syncNodeFollower2Candidate==", pSyncNode);
|
||||||
}
|
}
|
||||||
|
|
||||||
void syncNodeLeader2Follower(SSyncNode* pSyncNode) {
|
void syncNodeLeader2Follower(SSyncNode* pSyncNode) {
|
||||||
assert(pSyncNode->state == TAOS_SYNC_STATE_LEADER);
|
ASSERT(pSyncNode->state == TAOS_SYNC_STATE_LEADER);
|
||||||
syncNodeBecomeFollower(pSyncNode, "leader to follower");
|
syncNodeBecomeFollower(pSyncNode, "leader to follower");
|
||||||
|
|
||||||
syncNodeLog2("==state change syncNodeLeader2Follower==", pSyncNode);
|
syncNodeLog2("==state change syncNodeLeader2Follower==", pSyncNode);
|
||||||
}
|
}
|
||||||
|
|
||||||
void syncNodeCandidate2Follower(SSyncNode* pSyncNode) {
|
void syncNodeCandidate2Follower(SSyncNode* pSyncNode) {
|
||||||
assert(pSyncNode->state == TAOS_SYNC_STATE_CANDIDATE);
|
ASSERT(pSyncNode->state == TAOS_SYNC_STATE_CANDIDATE);
|
||||||
syncNodeBecomeFollower(pSyncNode, "candidate to follower");
|
syncNodeBecomeFollower(pSyncNode, "candidate to follower");
|
||||||
|
|
||||||
syncNodeLog2("==state change syncNodeCandidate2Follower==", pSyncNode);
|
syncNodeLog2("==state change syncNodeCandidate2Follower==", pSyncNode);
|
||||||
|
@ -1740,8 +1794,8 @@ void syncNodeCandidate2Follower(SSyncNode* pSyncNode) {
|
||||||
// just called by syncNodeVoteForSelf
|
// just called by syncNodeVoteForSelf
|
||||||
// need assert
|
// need assert
|
||||||
void syncNodeVoteForTerm(SSyncNode* pSyncNode, SyncTerm term, SRaftId* pRaftId) {
|
void syncNodeVoteForTerm(SSyncNode* pSyncNode, SyncTerm term, SRaftId* pRaftId) {
|
||||||
assert(term == pSyncNode->pRaftStore->currentTerm);
|
ASSERT(term == pSyncNode->pRaftStore->currentTerm);
|
||||||
assert(!raftStoreHasVoted(pSyncNode->pRaftStore));
|
ASSERT(!raftStoreHasVoted(pSyncNode->pRaftStore));
|
||||||
|
|
||||||
raftStoreVote(pSyncNode->pRaftStore, pRaftId);
|
raftStoreVote(pSyncNode->pRaftStore, pRaftId);
|
||||||
}
|
}
|
||||||
|
@ -1764,7 +1818,7 @@ void syncNodeVoteForSelf(SSyncNode* pSyncNode) {
|
||||||
// snapshot --------------
|
// snapshot --------------
|
||||||
bool syncNodeHasSnapshot(SSyncNode* pSyncNode) {
|
bool syncNodeHasSnapshot(SSyncNode* pSyncNode) {
|
||||||
bool ret = false;
|
bool ret = false;
|
||||||
SSnapshot snapshot = {.data = NULL, .lastApplyIndex = -1, .lastApplyTerm = 0};
|
SSnapshot snapshot = {.data = NULL, .lastApplyIndex = -1, .lastApplyTerm = 0, .lastConfigIndex = -1};
|
||||||
if (pSyncNode->pFsm->FpGetSnapshotInfo != NULL) {
|
if (pSyncNode->pFsm->FpGetSnapshotInfo != NULL) {
|
||||||
pSyncNode->pFsm->FpGetSnapshotInfo(pSyncNode->pFsm, &snapshot);
|
pSyncNode->pFsm->FpGetSnapshotInfo(pSyncNode->pFsm, &snapshot);
|
||||||
if (snapshot.lastApplyIndex >= SYNC_INDEX_BEGIN) {
|
if (snapshot.lastApplyIndex >= SYNC_INDEX_BEGIN) {
|
||||||
|
@ -1774,6 +1828,7 @@ bool syncNodeHasSnapshot(SSyncNode* pSyncNode) {
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if 0
|
||||||
bool syncNodeIsIndexInSnapshot(SSyncNode* pSyncNode, SyncIndex index) {
|
bool syncNodeIsIndexInSnapshot(SSyncNode* pSyncNode, SyncIndex index) {
|
||||||
ASSERT(syncNodeHasSnapshot(pSyncNode));
|
ASSERT(syncNodeHasSnapshot(pSyncNode));
|
||||||
ASSERT(pSyncNode->pFsm->FpGetSnapshotInfo != NULL);
|
ASSERT(pSyncNode->pFsm->FpGetSnapshotInfo != NULL);
|
||||||
|
@ -1784,6 +1839,7 @@ bool syncNodeIsIndexInSnapshot(SSyncNode* pSyncNode, SyncIndex index) {
|
||||||
bool b = (index <= snapshot.lastApplyIndex);
|
bool b = (index <= snapshot.lastApplyIndex);
|
||||||
return b;
|
return b;
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
SyncIndex syncNodeGetLastIndex(SSyncNode* pSyncNode) {
|
SyncIndex syncNodeGetLastIndex(SSyncNode* pSyncNode) {
|
||||||
SSnapshot snapshot = {.data = NULL, .lastApplyIndex = -1, .lastApplyTerm = 0};
|
SSnapshot snapshot = {.data = NULL, .lastApplyIndex = -1, .lastApplyTerm = 0};
|
||||||
|
@ -1800,7 +1856,7 @@ SyncTerm syncNodeGetLastTerm(SSyncNode* pSyncNode) {
|
||||||
SyncTerm lastTerm = 0;
|
SyncTerm lastTerm = 0;
|
||||||
if (syncNodeHasSnapshot(pSyncNode)) {
|
if (syncNodeHasSnapshot(pSyncNode)) {
|
||||||
// has snapshot
|
// has snapshot
|
||||||
SSnapshot snapshot = {.data = NULL, .lastApplyIndex = -1, .lastApplyTerm = 0};
|
SSnapshot snapshot = {.data = NULL, .lastApplyIndex = -1, .lastApplyTerm = 0, .lastConfigIndex = -1};
|
||||||
if (pSyncNode->pFsm->FpGetSnapshotInfo != NULL) {
|
if (pSyncNode->pFsm->FpGetSnapshotInfo != NULL) {
|
||||||
pSyncNode->pFsm->FpGetSnapshotInfo(pSyncNode->pFsm, &snapshot);
|
pSyncNode->pFsm->FpGetSnapshotInfo(pSyncNode->pFsm, &snapshot);
|
||||||
}
|
}
|
||||||
|
@ -1834,8 +1890,8 @@ SyncIndex syncNodeSyncStartIndex(SSyncNode* pSyncNode) {
|
||||||
|
|
||||||
SyncIndex syncNodeGetPreIndex(SSyncNode* pSyncNode, SyncIndex index) {
|
SyncIndex syncNodeGetPreIndex(SSyncNode* pSyncNode, SyncIndex index) {
|
||||||
ASSERT(index >= SYNC_INDEX_BEGIN);
|
ASSERT(index >= SYNC_INDEX_BEGIN);
|
||||||
SyncIndex syncStartIndex = syncNodeSyncStartIndex(pSyncNode);
|
|
||||||
|
|
||||||
|
SyncIndex syncStartIndex = syncNodeSyncStartIndex(pSyncNode);
|
||||||
if (index > syncStartIndex) {
|
if (index > syncStartIndex) {
|
||||||
syncNodeLog3("syncNodeGetPreIndex", pSyncNode);
|
syncNodeLog3("syncNodeGetPreIndex", pSyncNode);
|
||||||
ASSERT(0);
|
ASSERT(0);
|
||||||
|
@ -1847,8 +1903,47 @@ SyncIndex syncNodeGetPreIndex(SSyncNode* pSyncNode, SyncIndex index) {
|
||||||
|
|
||||||
SyncTerm syncNodeGetPreTerm(SSyncNode* pSyncNode, SyncIndex index) {
|
SyncTerm syncNodeGetPreTerm(SSyncNode* pSyncNode, SyncIndex index) {
|
||||||
ASSERT(index >= SYNC_INDEX_BEGIN);
|
ASSERT(index >= SYNC_INDEX_BEGIN);
|
||||||
SyncIndex syncStartIndex = syncNodeSyncStartIndex(pSyncNode);
|
|
||||||
|
|
||||||
|
SyncIndex syncStartIndex = syncNodeSyncStartIndex(pSyncNode);
|
||||||
|
if (index > syncStartIndex) {
|
||||||
|
syncNodeLog3("syncNodeGetPreTerm", pSyncNode);
|
||||||
|
ASSERT(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (index == SYNC_INDEX_BEGIN) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
SyncTerm preTerm = 0;
|
||||||
|
SyncIndex preIndex = index - 1;
|
||||||
|
SSyncRaftEntry* pPreEntry = NULL;
|
||||||
|
int32_t code = pSyncNode->pLogStore->syncLogGetEntry(pSyncNode->pLogStore, preIndex, &pPreEntry);
|
||||||
|
if (code == 0) {
|
||||||
|
ASSERT(pPreEntry != NULL);
|
||||||
|
preTerm = pPreEntry->term;
|
||||||
|
taosMemoryFree(pPreEntry);
|
||||||
|
return preTerm;
|
||||||
|
} else {
|
||||||
|
if (terrno == TSDB_CODE_WAL_LOG_NOT_EXIST) {
|
||||||
|
SSnapshot snapshot = {.data = NULL, .lastApplyIndex = -1, .lastApplyTerm = 0, .lastConfigIndex = -1};
|
||||||
|
if (pSyncNode->pFsm->FpGetSnapshotInfo != NULL) {
|
||||||
|
pSyncNode->pFsm->FpGetSnapshotInfo(pSyncNode->pFsm, &snapshot);
|
||||||
|
if (snapshot.lastApplyIndex == preIndex) {
|
||||||
|
return snapshot.lastApplyTerm;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
ASSERT(0);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
#if 0
|
||||||
|
SyncTerm syncNodeGetPreTerm(SSyncNode* pSyncNode, SyncIndex index) {
|
||||||
|
ASSERT(index >= SYNC_INDEX_BEGIN);
|
||||||
|
|
||||||
|
SyncIndex syncStartIndex = syncNodeSyncStartIndex(pSyncNode);
|
||||||
if (index > syncStartIndex) {
|
if (index > syncStartIndex) {
|
||||||
syncNodeLog3("syncNodeGetPreTerm", pSyncNode);
|
syncNodeLog3("syncNodeGetPreTerm", pSyncNode);
|
||||||
ASSERT(0);
|
ASSERT(0);
|
||||||
|
@ -1861,7 +1956,7 @@ SyncTerm syncNodeGetPreTerm(SSyncNode* pSyncNode, SyncIndex index) {
|
||||||
SyncTerm preTerm = 0;
|
SyncTerm preTerm = 0;
|
||||||
if (syncNodeHasSnapshot(pSyncNode)) {
|
if (syncNodeHasSnapshot(pSyncNode)) {
|
||||||
// has snapshot
|
// has snapshot
|
||||||
SSnapshot snapshot = {.data = NULL, .lastApplyIndex = -1, .lastApplyTerm = 0};
|
SSnapshot snapshot = {.data = NULL, .lastApplyIndex = -1, .lastApplyTerm = 0, .lastConfigIndex = -1};
|
||||||
if (pSyncNode->pFsm->FpGetSnapshotInfo != NULL) {
|
if (pSyncNode->pFsm->FpGetSnapshotInfo != NULL) {
|
||||||
pSyncNode->pFsm->FpGetSnapshotInfo(pSyncNode->pFsm, &snapshot);
|
pSyncNode->pFsm->FpGetSnapshotInfo(pSyncNode->pFsm, &snapshot);
|
||||||
}
|
}
|
||||||
|
@ -1908,6 +2003,7 @@ SyncTerm syncNodeGetPreTerm(SSyncNode* pSyncNode, SyncIndex index) {
|
||||||
|
|
||||||
return preTerm;
|
return preTerm;
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
// get pre index and term of "index"
|
// get pre index and term of "index"
|
||||||
int32_t syncNodeGetPreIndexTerm(SSyncNode* pSyncNode, SyncIndex index, SyncIndex* pPreIndex, SyncTerm* pPreTerm) {
|
int32_t syncNodeGetPreIndexTerm(SSyncNode* pSyncNode, SyncIndex index, SyncIndex* pPreIndex, SyncTerm* pPreTerm) {
|
||||||
|
@ -2062,17 +2158,17 @@ static void syncNodeEqHeartbeatTimer(void* param, void* tmrId) {
|
||||||
|
|
||||||
static int32_t syncNodeEqNoop(SSyncNode* ths) {
|
static int32_t syncNodeEqNoop(SSyncNode* ths) {
|
||||||
int32_t ret = 0;
|
int32_t ret = 0;
|
||||||
assert(ths->state == TAOS_SYNC_STATE_LEADER);
|
ASSERT(ths->state == TAOS_SYNC_STATE_LEADER);
|
||||||
|
|
||||||
SyncIndex index = ths->pLogStore->getLastIndex(ths->pLogStore) + 1;
|
SyncIndex index = ths->pLogStore->syncLogWriteIndex(ths->pLogStore);
|
||||||
SyncTerm term = ths->pRaftStore->currentTerm;
|
SyncTerm term = ths->pRaftStore->currentTerm;
|
||||||
SSyncRaftEntry* pEntry = syncEntryBuildNoop(term, index, ths->vgId);
|
SSyncRaftEntry* pEntry = syncEntryBuildNoop(term, index, ths->vgId);
|
||||||
assert(pEntry != NULL);
|
ASSERT(pEntry != NULL);
|
||||||
|
|
||||||
uint32_t entryLen;
|
uint32_t entryLen;
|
||||||
char* serialized = syncEntrySerialize(pEntry, &entryLen);
|
char* serialized = syncEntrySerialize(pEntry, &entryLen);
|
||||||
SyncClientRequest* pSyncMsg = syncClientRequestBuild(entryLen);
|
SyncClientRequest* pSyncMsg = syncClientRequestBuild(entryLen);
|
||||||
assert(pSyncMsg->dataLen == entryLen);
|
ASSERT(pSyncMsg->dataLen == entryLen);
|
||||||
memcpy(pSyncMsg->data, serialized, entryLen);
|
memcpy(pSyncMsg->data, serialized, entryLen);
|
||||||
|
|
||||||
SRpcMsg rpcMsg = {0};
|
SRpcMsg rpcMsg = {0};
|
||||||
|
@ -2092,10 +2188,10 @@ static int32_t syncNodeEqNoop(SSyncNode* ths) {
|
||||||
static int32_t syncNodeAppendNoop(SSyncNode* ths) {
|
static int32_t syncNodeAppendNoop(SSyncNode* ths) {
|
||||||
int32_t ret = 0;
|
int32_t ret = 0;
|
||||||
|
|
||||||
SyncIndex index = ths->pLogStore->getLastIndex(ths->pLogStore) + 1;
|
SyncIndex index = ths->pLogStore->syncLogWriteIndex(ths->pLogStore);
|
||||||
SyncTerm term = ths->pRaftStore->currentTerm;
|
SyncTerm term = ths->pRaftStore->currentTerm;
|
||||||
SSyncRaftEntry* pEntry = syncEntryBuildNoop(term, index, ths->vgId);
|
SSyncRaftEntry* pEntry = syncEntryBuildNoop(term, index, ths->vgId);
|
||||||
assert(pEntry != NULL);
|
ASSERT(pEntry != NULL);
|
||||||
|
|
||||||
if (ths->state == TAOS_SYNC_STATE_LEADER) {
|
if (ths->state == TAOS_SYNC_STATE_LEADER) {
|
||||||
// ths->pLogStore->appendEntry(ths->pLogStore, pEntry);
|
// ths->pLogStore->appendEntry(ths->pLogStore, pEntry);
|
||||||
|
@ -2158,7 +2254,7 @@ int32_t syncNodeOnClientRequestCb(SSyncNode* ths, SyncClientRequest* pMsg) {
|
||||||
SyncIndex index = ths->pLogStore->syncLogWriteIndex(ths->pLogStore);
|
SyncIndex index = ths->pLogStore->syncLogWriteIndex(ths->pLogStore);
|
||||||
SyncTerm term = ths->pRaftStore->currentTerm;
|
SyncTerm term = ths->pRaftStore->currentTerm;
|
||||||
SSyncRaftEntry* pEntry = syncEntryBuild2((SyncClientRequest*)pMsg, term, index);
|
SSyncRaftEntry* pEntry = syncEntryBuild2((SyncClientRequest*)pMsg, term, index);
|
||||||
assert(pEntry != NULL);
|
ASSERT(pEntry != NULL);
|
||||||
|
|
||||||
if (ths->state == TAOS_SYNC_STATE_LEADER) {
|
if (ths->state == TAOS_SYNC_STATE_LEADER) {
|
||||||
// ths->pLogStore->appendEntry(ths->pLogStore, pEntry);
|
// ths->pLogStore->appendEntry(ths->pLogStore, pEntry);
|
||||||
|
|
|
@ -186,18 +186,18 @@ void syncTimeoutDestroy(SyncTimeout* pMsg) {
|
||||||
}
|
}
|
||||||
|
|
||||||
void syncTimeoutSerialize(const SyncTimeout* pMsg, char* buf, uint32_t bufLen) {
|
void syncTimeoutSerialize(const SyncTimeout* pMsg, char* buf, uint32_t bufLen) {
|
||||||
assert(pMsg->bytes <= bufLen);
|
ASSERT(pMsg->bytes <= bufLen);
|
||||||
memcpy(buf, pMsg, pMsg->bytes);
|
memcpy(buf, pMsg, pMsg->bytes);
|
||||||
}
|
}
|
||||||
|
|
||||||
void syncTimeoutDeserialize(const char* buf, uint32_t len, SyncTimeout* pMsg) {
|
void syncTimeoutDeserialize(const char* buf, uint32_t len, SyncTimeout* pMsg) {
|
||||||
memcpy(pMsg, buf, len);
|
memcpy(pMsg, buf, len);
|
||||||
assert(len == pMsg->bytes);
|
ASSERT(len == pMsg->bytes);
|
||||||
}
|
}
|
||||||
|
|
||||||
char* syncTimeoutSerialize2(const SyncTimeout* pMsg, uint32_t* len) {
|
char* syncTimeoutSerialize2(const SyncTimeout* pMsg, uint32_t* len) {
|
||||||
char* buf = taosMemoryMalloc(pMsg->bytes);
|
char* buf = taosMemoryMalloc(pMsg->bytes);
|
||||||
assert(buf != NULL);
|
ASSERT(buf != NULL);
|
||||||
syncTimeoutSerialize(pMsg, buf, pMsg->bytes);
|
syncTimeoutSerialize(pMsg, buf, pMsg->bytes);
|
||||||
if (len != NULL) {
|
if (len != NULL) {
|
||||||
*len = pMsg->bytes;
|
*len = pMsg->bytes;
|
||||||
|
@ -208,9 +208,9 @@ char* syncTimeoutSerialize2(const SyncTimeout* pMsg, uint32_t* len) {
|
||||||
SyncTimeout* syncTimeoutDeserialize2(const char* buf, uint32_t len) {
|
SyncTimeout* syncTimeoutDeserialize2(const char* buf, uint32_t len) {
|
||||||
uint32_t bytes = *((uint32_t*)buf);
|
uint32_t bytes = *((uint32_t*)buf);
|
||||||
SyncTimeout* pMsg = taosMemoryMalloc(bytes);
|
SyncTimeout* pMsg = taosMemoryMalloc(bytes);
|
||||||
assert(pMsg != NULL);
|
ASSERT(pMsg != NULL);
|
||||||
syncTimeoutDeserialize(buf, len, pMsg);
|
syncTimeoutDeserialize(buf, len, pMsg);
|
||||||
assert(len == pMsg->bytes);
|
ASSERT(len == pMsg->bytes);
|
||||||
return pMsg;
|
return pMsg;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -228,7 +228,7 @@ void syncTimeoutFromRpcMsg(const SRpcMsg* pRpcMsg, SyncTimeout* pMsg) {
|
||||||
|
|
||||||
SyncTimeout* syncTimeoutFromRpcMsg2(const SRpcMsg* pRpcMsg) {
|
SyncTimeout* syncTimeoutFromRpcMsg2(const SRpcMsg* pRpcMsg) {
|
||||||
SyncTimeout* pMsg = syncTimeoutDeserialize2(pRpcMsg->pCont, pRpcMsg->contLen);
|
SyncTimeout* pMsg = syncTimeoutDeserialize2(pRpcMsg->pCont, pRpcMsg->contLen);
|
||||||
assert(pMsg != NULL);
|
ASSERT(pMsg != NULL);
|
||||||
return pMsg;
|
return pMsg;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -322,19 +322,19 @@ void syncPingDestroy(SyncPing* pMsg) {
|
||||||
}
|
}
|
||||||
|
|
||||||
void syncPingSerialize(const SyncPing* pMsg, char* buf, uint32_t bufLen) {
|
void syncPingSerialize(const SyncPing* pMsg, char* buf, uint32_t bufLen) {
|
||||||
assert(pMsg->bytes <= bufLen);
|
ASSERT(pMsg->bytes <= bufLen);
|
||||||
memcpy(buf, pMsg, pMsg->bytes);
|
memcpy(buf, pMsg, pMsg->bytes);
|
||||||
}
|
}
|
||||||
|
|
||||||
void syncPingDeserialize(const char* buf, uint32_t len, SyncPing* pMsg) {
|
void syncPingDeserialize(const char* buf, uint32_t len, SyncPing* pMsg) {
|
||||||
memcpy(pMsg, buf, len);
|
memcpy(pMsg, buf, len);
|
||||||
assert(len == pMsg->bytes);
|
ASSERT(len == pMsg->bytes);
|
||||||
assert(pMsg->bytes == sizeof(SyncPing) + pMsg->dataLen);
|
ASSERT(pMsg->bytes == sizeof(SyncPing) + pMsg->dataLen);
|
||||||
}
|
}
|
||||||
|
|
||||||
char* syncPingSerialize2(const SyncPing* pMsg, uint32_t* len) {
|
char* syncPingSerialize2(const SyncPing* pMsg, uint32_t* len) {
|
||||||
char* buf = taosMemoryMalloc(pMsg->bytes);
|
char* buf = taosMemoryMalloc(pMsg->bytes);
|
||||||
assert(buf != NULL);
|
ASSERT(buf != NULL);
|
||||||
syncPingSerialize(pMsg, buf, pMsg->bytes);
|
syncPingSerialize(pMsg, buf, pMsg->bytes);
|
||||||
if (len != NULL) {
|
if (len != NULL) {
|
||||||
*len = pMsg->bytes;
|
*len = pMsg->bytes;
|
||||||
|
@ -345,9 +345,9 @@ char* syncPingSerialize2(const SyncPing* pMsg, uint32_t* len) {
|
||||||
SyncPing* syncPingDeserialize2(const char* buf, uint32_t len) {
|
SyncPing* syncPingDeserialize2(const char* buf, uint32_t len) {
|
||||||
uint32_t bytes = *((uint32_t*)buf);
|
uint32_t bytes = *((uint32_t*)buf);
|
||||||
SyncPing* pMsg = taosMemoryMalloc(bytes);
|
SyncPing* pMsg = taosMemoryMalloc(bytes);
|
||||||
assert(pMsg != NULL);
|
ASSERT(pMsg != NULL);
|
||||||
syncPingDeserialize(buf, len, pMsg);
|
syncPingDeserialize(buf, len, pMsg);
|
||||||
assert(len == pMsg->bytes);
|
ASSERT(len == pMsg->bytes);
|
||||||
return pMsg;
|
return pMsg;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -406,7 +406,7 @@ SyncPing* syncPingDeserialize3(void* buf, int32_t bufLen) {
|
||||||
}
|
}
|
||||||
|
|
||||||
pMsg = taosMemoryMalloc(bytes);
|
pMsg = taosMemoryMalloc(bytes);
|
||||||
assert(pMsg != NULL);
|
ASSERT(pMsg != NULL);
|
||||||
pMsg->bytes = bytes;
|
pMsg->bytes = bytes;
|
||||||
|
|
||||||
if (tDecodeI32(&decoder, &pMsg->vgId) < 0) {
|
if (tDecodeI32(&decoder, &pMsg->vgId) < 0) {
|
||||||
|
@ -435,7 +435,7 @@ SyncPing* syncPingDeserialize3(void* buf, int32_t bufLen) {
|
||||||
if (tDecodeBinary(&decoder, (uint8_t**)(&data), &len) < 0) {
|
if (tDecodeBinary(&decoder, (uint8_t**)(&data), &len) < 0) {
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
assert(len = pMsg->dataLen);
|
ASSERT(len = pMsg->dataLen);
|
||||||
memcpy(pMsg->data, data, len);
|
memcpy(pMsg->data, data, len);
|
||||||
|
|
||||||
tEndDecode(&decoder);
|
tEndDecode(&decoder);
|
||||||
|
@ -457,7 +457,7 @@ void syncPingFromRpcMsg(const SRpcMsg* pRpcMsg, SyncPing* pMsg) {
|
||||||
|
|
||||||
SyncPing* syncPingFromRpcMsg2(const SRpcMsg* pRpcMsg) {
|
SyncPing* syncPingFromRpcMsg2(const SRpcMsg* pRpcMsg) {
|
||||||
SyncPing* pMsg = syncPingDeserialize2(pRpcMsg->pCont, pRpcMsg->contLen);
|
SyncPing* pMsg = syncPingDeserialize2(pRpcMsg->pCont, pRpcMsg->contLen);
|
||||||
assert(pMsg != NULL);
|
ASSERT(pMsg != NULL);
|
||||||
return pMsg;
|
return pMsg;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -584,19 +584,19 @@ void syncPingReplyDestroy(SyncPingReply* pMsg) {
|
||||||
}
|
}
|
||||||
|
|
||||||
void syncPingReplySerialize(const SyncPingReply* pMsg, char* buf, uint32_t bufLen) {
|
void syncPingReplySerialize(const SyncPingReply* pMsg, char* buf, uint32_t bufLen) {
|
||||||
assert(pMsg->bytes <= bufLen);
|
ASSERT(pMsg->bytes <= bufLen);
|
||||||
memcpy(buf, pMsg, pMsg->bytes);
|
memcpy(buf, pMsg, pMsg->bytes);
|
||||||
}
|
}
|
||||||
|
|
||||||
void syncPingReplyDeserialize(const char* buf, uint32_t len, SyncPingReply* pMsg) {
|
void syncPingReplyDeserialize(const char* buf, uint32_t len, SyncPingReply* pMsg) {
|
||||||
memcpy(pMsg, buf, len);
|
memcpy(pMsg, buf, len);
|
||||||
assert(len == pMsg->bytes);
|
ASSERT(len == pMsg->bytes);
|
||||||
assert(pMsg->bytes == sizeof(SyncPing) + pMsg->dataLen);
|
ASSERT(pMsg->bytes == sizeof(SyncPing) + pMsg->dataLen);
|
||||||
}
|
}
|
||||||
|
|
||||||
char* syncPingReplySerialize2(const SyncPingReply* pMsg, uint32_t* len) {
|
char* syncPingReplySerialize2(const SyncPingReply* pMsg, uint32_t* len) {
|
||||||
char* buf = taosMemoryMalloc(pMsg->bytes);
|
char* buf = taosMemoryMalloc(pMsg->bytes);
|
||||||
assert(buf != NULL);
|
ASSERT(buf != NULL);
|
||||||
syncPingReplySerialize(pMsg, buf, pMsg->bytes);
|
syncPingReplySerialize(pMsg, buf, pMsg->bytes);
|
||||||
if (len != NULL) {
|
if (len != NULL) {
|
||||||
*len = pMsg->bytes;
|
*len = pMsg->bytes;
|
||||||
|
@ -607,9 +607,9 @@ char* syncPingReplySerialize2(const SyncPingReply* pMsg, uint32_t* len) {
|
||||||
SyncPingReply* syncPingReplyDeserialize2(const char* buf, uint32_t len) {
|
SyncPingReply* syncPingReplyDeserialize2(const char* buf, uint32_t len) {
|
||||||
uint32_t bytes = *((uint32_t*)buf);
|
uint32_t bytes = *((uint32_t*)buf);
|
||||||
SyncPingReply* pMsg = taosMemoryMalloc(bytes);
|
SyncPingReply* pMsg = taosMemoryMalloc(bytes);
|
||||||
assert(pMsg != NULL);
|
ASSERT(pMsg != NULL);
|
||||||
syncPingReplyDeserialize(buf, len, pMsg);
|
syncPingReplyDeserialize(buf, len, pMsg);
|
||||||
assert(len == pMsg->bytes);
|
ASSERT(len == pMsg->bytes);
|
||||||
return pMsg;
|
return pMsg;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -668,7 +668,7 @@ SyncPingReply* syncPingReplyDeserialize3(void* buf, int32_t bufLen) {
|
||||||
}
|
}
|
||||||
|
|
||||||
pMsg = taosMemoryMalloc(bytes);
|
pMsg = taosMemoryMalloc(bytes);
|
||||||
assert(pMsg != NULL);
|
ASSERT(pMsg != NULL);
|
||||||
pMsg->bytes = bytes;
|
pMsg->bytes = bytes;
|
||||||
|
|
||||||
if (tDecodeI32(&decoder, &pMsg->vgId) < 0) {
|
if (tDecodeI32(&decoder, &pMsg->vgId) < 0) {
|
||||||
|
@ -697,7 +697,7 @@ SyncPingReply* syncPingReplyDeserialize3(void* buf, int32_t bufLen) {
|
||||||
if (tDecodeBinary(&decoder, (uint8_t**)(&data), &len) < 0) {
|
if (tDecodeBinary(&decoder, (uint8_t**)(&data), &len) < 0) {
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
assert(len = pMsg->dataLen);
|
ASSERT(len = pMsg->dataLen);
|
||||||
memcpy(pMsg->data, data, len);
|
memcpy(pMsg->data, data, len);
|
||||||
|
|
||||||
tEndDecode(&decoder);
|
tEndDecode(&decoder);
|
||||||
|
@ -719,7 +719,7 @@ void syncPingReplyFromRpcMsg(const SRpcMsg* pRpcMsg, SyncPingReply* pMsg) {
|
||||||
|
|
||||||
SyncPingReply* syncPingReplyFromRpcMsg2(const SRpcMsg* pRpcMsg) {
|
SyncPingReply* syncPingReplyFromRpcMsg2(const SRpcMsg* pRpcMsg) {
|
||||||
SyncPingReply* pMsg = syncPingReplyDeserialize2(pRpcMsg->pCont, pRpcMsg->contLen);
|
SyncPingReply* pMsg = syncPingReplyDeserialize2(pRpcMsg->pCont, pRpcMsg->contLen);
|
||||||
assert(pMsg != NULL);
|
ASSERT(pMsg != NULL);
|
||||||
return pMsg;
|
return pMsg;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -844,18 +844,18 @@ void syncClientRequestDestroy(SyncClientRequest* pMsg) {
|
||||||
}
|
}
|
||||||
|
|
||||||
void syncClientRequestSerialize(const SyncClientRequest* pMsg, char* buf, uint32_t bufLen) {
|
void syncClientRequestSerialize(const SyncClientRequest* pMsg, char* buf, uint32_t bufLen) {
|
||||||
assert(pMsg->bytes <= bufLen);
|
ASSERT(pMsg->bytes <= bufLen);
|
||||||
memcpy(buf, pMsg, pMsg->bytes);
|
memcpy(buf, pMsg, pMsg->bytes);
|
||||||
}
|
}
|
||||||
|
|
||||||
void syncClientRequestDeserialize(const char* buf, uint32_t len, SyncClientRequest* pMsg) {
|
void syncClientRequestDeserialize(const char* buf, uint32_t len, SyncClientRequest* pMsg) {
|
||||||
memcpy(pMsg, buf, len);
|
memcpy(pMsg, buf, len);
|
||||||
assert(len == pMsg->bytes);
|
ASSERT(len == pMsg->bytes);
|
||||||
}
|
}
|
||||||
|
|
||||||
char* syncClientRequestSerialize2(const SyncClientRequest* pMsg, uint32_t* len) {
|
char* syncClientRequestSerialize2(const SyncClientRequest* pMsg, uint32_t* len) {
|
||||||
char* buf = taosMemoryMalloc(pMsg->bytes);
|
char* buf = taosMemoryMalloc(pMsg->bytes);
|
||||||
assert(buf != NULL);
|
ASSERT(buf != NULL);
|
||||||
syncClientRequestSerialize(pMsg, buf, pMsg->bytes);
|
syncClientRequestSerialize(pMsg, buf, pMsg->bytes);
|
||||||
if (len != NULL) {
|
if (len != NULL) {
|
||||||
*len = pMsg->bytes;
|
*len = pMsg->bytes;
|
||||||
|
@ -866,9 +866,9 @@ char* syncClientRequestSerialize2(const SyncClientRequest* pMsg, uint32_t* len)
|
||||||
SyncClientRequest* syncClientRequestDeserialize2(const char* buf, uint32_t len) {
|
SyncClientRequest* syncClientRequestDeserialize2(const char* buf, uint32_t len) {
|
||||||
uint32_t bytes = *((uint32_t*)buf);
|
uint32_t bytes = *((uint32_t*)buf);
|
||||||
SyncClientRequest* pMsg = taosMemoryMalloc(bytes);
|
SyncClientRequest* pMsg = taosMemoryMalloc(bytes);
|
||||||
assert(pMsg != NULL);
|
ASSERT(pMsg != NULL);
|
||||||
syncClientRequestDeserialize(buf, len, pMsg);
|
syncClientRequestDeserialize(buf, len, pMsg);
|
||||||
assert(len == pMsg->bytes);
|
ASSERT(len == pMsg->bytes);
|
||||||
return pMsg;
|
return pMsg;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -888,7 +888,7 @@ void syncClientRequestFromRpcMsg(const SRpcMsg* pRpcMsg, SyncClientRequest* pMsg
|
||||||
// step 3. RpcMsg => SyncClientRequest, from queue
|
// step 3. RpcMsg => SyncClientRequest, from queue
|
||||||
SyncClientRequest* syncClientRequestFromRpcMsg2(const SRpcMsg* pRpcMsg) {
|
SyncClientRequest* syncClientRequestFromRpcMsg2(const SRpcMsg* pRpcMsg) {
|
||||||
SyncClientRequest* pMsg = syncClientRequestDeserialize2(pRpcMsg->pCont, pRpcMsg->contLen);
|
SyncClientRequest* pMsg = syncClientRequestDeserialize2(pRpcMsg->pCont, pRpcMsg->contLen);
|
||||||
assert(pMsg != NULL);
|
ASSERT(pMsg != NULL);
|
||||||
return pMsg;
|
return pMsg;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -974,18 +974,18 @@ void syncRequestVoteDestroy(SyncRequestVote* pMsg) {
|
||||||
}
|
}
|
||||||
|
|
||||||
void syncRequestVoteSerialize(const SyncRequestVote* pMsg, char* buf, uint32_t bufLen) {
|
void syncRequestVoteSerialize(const SyncRequestVote* pMsg, char* buf, uint32_t bufLen) {
|
||||||
assert(pMsg->bytes <= bufLen);
|
ASSERT(pMsg->bytes <= bufLen);
|
||||||
memcpy(buf, pMsg, pMsg->bytes);
|
memcpy(buf, pMsg, pMsg->bytes);
|
||||||
}
|
}
|
||||||
|
|
||||||
void syncRequestVoteDeserialize(const char* buf, uint32_t len, SyncRequestVote* pMsg) {
|
void syncRequestVoteDeserialize(const char* buf, uint32_t len, SyncRequestVote* pMsg) {
|
||||||
memcpy(pMsg, buf, len);
|
memcpy(pMsg, buf, len);
|
||||||
assert(len == pMsg->bytes);
|
ASSERT(len == pMsg->bytes);
|
||||||
}
|
}
|
||||||
|
|
||||||
char* syncRequestVoteSerialize2(const SyncRequestVote* pMsg, uint32_t* len) {
|
char* syncRequestVoteSerialize2(const SyncRequestVote* pMsg, uint32_t* len) {
|
||||||
char* buf = taosMemoryMalloc(pMsg->bytes);
|
char* buf = taosMemoryMalloc(pMsg->bytes);
|
||||||
assert(buf != NULL);
|
ASSERT(buf != NULL);
|
||||||
syncRequestVoteSerialize(pMsg, buf, pMsg->bytes);
|
syncRequestVoteSerialize(pMsg, buf, pMsg->bytes);
|
||||||
if (len != NULL) {
|
if (len != NULL) {
|
||||||
*len = pMsg->bytes;
|
*len = pMsg->bytes;
|
||||||
|
@ -996,9 +996,9 @@ char* syncRequestVoteSerialize2(const SyncRequestVote* pMsg, uint32_t* len) {
|
||||||
SyncRequestVote* syncRequestVoteDeserialize2(const char* buf, uint32_t len) {
|
SyncRequestVote* syncRequestVoteDeserialize2(const char* buf, uint32_t len) {
|
||||||
uint32_t bytes = *((uint32_t*)buf);
|
uint32_t bytes = *((uint32_t*)buf);
|
||||||
SyncRequestVote* pMsg = taosMemoryMalloc(bytes);
|
SyncRequestVote* pMsg = taosMemoryMalloc(bytes);
|
||||||
assert(pMsg != NULL);
|
ASSERT(pMsg != NULL);
|
||||||
syncRequestVoteDeserialize(buf, len, pMsg);
|
syncRequestVoteDeserialize(buf, len, pMsg);
|
||||||
assert(len == pMsg->bytes);
|
ASSERT(len == pMsg->bytes);
|
||||||
return pMsg;
|
return pMsg;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1016,7 +1016,7 @@ void syncRequestVoteFromRpcMsg(const SRpcMsg* pRpcMsg, SyncRequestVote* pMsg) {
|
||||||
|
|
||||||
SyncRequestVote* syncRequestVoteFromRpcMsg2(const SRpcMsg* pRpcMsg) {
|
SyncRequestVote* syncRequestVoteFromRpcMsg2(const SRpcMsg* pRpcMsg) {
|
||||||
SyncRequestVote* pMsg = syncRequestVoteDeserialize2(pRpcMsg->pCont, pRpcMsg->contLen);
|
SyncRequestVote* pMsg = syncRequestVoteDeserialize2(pRpcMsg->pCont, pRpcMsg->contLen);
|
||||||
assert(pMsg != NULL);
|
ASSERT(pMsg != NULL);
|
||||||
return pMsg;
|
return pMsg;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1125,18 +1125,18 @@ void syncRequestVoteReplyDestroy(SyncRequestVoteReply* pMsg) {
|
||||||
}
|
}
|
||||||
|
|
||||||
void syncRequestVoteReplySerialize(const SyncRequestVoteReply* pMsg, char* buf, uint32_t bufLen) {
|
void syncRequestVoteReplySerialize(const SyncRequestVoteReply* pMsg, char* buf, uint32_t bufLen) {
|
||||||
assert(pMsg->bytes <= bufLen);
|
ASSERT(pMsg->bytes <= bufLen);
|
||||||
memcpy(buf, pMsg, pMsg->bytes);
|
memcpy(buf, pMsg, pMsg->bytes);
|
||||||
}
|
}
|
||||||
|
|
||||||
void syncRequestVoteReplyDeserialize(const char* buf, uint32_t len, SyncRequestVoteReply* pMsg) {
|
void syncRequestVoteReplyDeserialize(const char* buf, uint32_t len, SyncRequestVoteReply* pMsg) {
|
||||||
memcpy(pMsg, buf, len);
|
memcpy(pMsg, buf, len);
|
||||||
assert(len == pMsg->bytes);
|
ASSERT(len == pMsg->bytes);
|
||||||
}
|
}
|
||||||
|
|
||||||
char* syncRequestVoteReplySerialize2(const SyncRequestVoteReply* pMsg, uint32_t* len) {
|
char* syncRequestVoteReplySerialize2(const SyncRequestVoteReply* pMsg, uint32_t* len) {
|
||||||
char* buf = taosMemoryMalloc(pMsg->bytes);
|
char* buf = taosMemoryMalloc(pMsg->bytes);
|
||||||
assert(buf != NULL);
|
ASSERT(buf != NULL);
|
||||||
syncRequestVoteReplySerialize(pMsg, buf, pMsg->bytes);
|
syncRequestVoteReplySerialize(pMsg, buf, pMsg->bytes);
|
||||||
if (len != NULL) {
|
if (len != NULL) {
|
||||||
*len = pMsg->bytes;
|
*len = pMsg->bytes;
|
||||||
|
@ -1147,9 +1147,9 @@ char* syncRequestVoteReplySerialize2(const SyncRequestVoteReply* pMsg, uint32_t*
|
||||||
SyncRequestVoteReply* syncRequestVoteReplyDeserialize2(const char* buf, uint32_t len) {
|
SyncRequestVoteReply* syncRequestVoteReplyDeserialize2(const char* buf, uint32_t len) {
|
||||||
uint32_t bytes = *((uint32_t*)buf);
|
uint32_t bytes = *((uint32_t*)buf);
|
||||||
SyncRequestVoteReply* pMsg = taosMemoryMalloc(bytes);
|
SyncRequestVoteReply* pMsg = taosMemoryMalloc(bytes);
|
||||||
assert(pMsg != NULL);
|
ASSERT(pMsg != NULL);
|
||||||
syncRequestVoteReplyDeserialize(buf, len, pMsg);
|
syncRequestVoteReplyDeserialize(buf, len, pMsg);
|
||||||
assert(len == pMsg->bytes);
|
ASSERT(len == pMsg->bytes);
|
||||||
return pMsg;
|
return pMsg;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1167,7 +1167,7 @@ void syncRequestVoteReplyFromRpcMsg(const SRpcMsg* pRpcMsg, SyncRequestVoteReply
|
||||||
|
|
||||||
SyncRequestVoteReply* syncRequestVoteReplyFromRpcMsg2(const SRpcMsg* pRpcMsg) {
|
SyncRequestVoteReply* syncRequestVoteReplyFromRpcMsg2(const SRpcMsg* pRpcMsg) {
|
||||||
SyncRequestVoteReply* pMsg = syncRequestVoteReplyDeserialize2(pRpcMsg->pCont, pRpcMsg->contLen);
|
SyncRequestVoteReply* pMsg = syncRequestVoteReplyDeserialize2(pRpcMsg->pCont, pRpcMsg->contLen);
|
||||||
assert(pMsg != NULL);
|
ASSERT(pMsg != NULL);
|
||||||
return pMsg;
|
return pMsg;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1274,19 +1274,19 @@ void syncAppendEntriesDestroy(SyncAppendEntries* pMsg) {
|
||||||
}
|
}
|
||||||
|
|
||||||
void syncAppendEntriesSerialize(const SyncAppendEntries* pMsg, char* buf, uint32_t bufLen) {
|
void syncAppendEntriesSerialize(const SyncAppendEntries* pMsg, char* buf, uint32_t bufLen) {
|
||||||
assert(pMsg->bytes <= bufLen);
|
ASSERT(pMsg->bytes <= bufLen);
|
||||||
memcpy(buf, pMsg, pMsg->bytes);
|
memcpy(buf, pMsg, pMsg->bytes);
|
||||||
}
|
}
|
||||||
|
|
||||||
void syncAppendEntriesDeserialize(const char* buf, uint32_t len, SyncAppendEntries* pMsg) {
|
void syncAppendEntriesDeserialize(const char* buf, uint32_t len, SyncAppendEntries* pMsg) {
|
||||||
memcpy(pMsg, buf, len);
|
memcpy(pMsg, buf, len);
|
||||||
assert(len == pMsg->bytes);
|
ASSERT(len == pMsg->bytes);
|
||||||
assert(pMsg->bytes == sizeof(SyncAppendEntries) + pMsg->dataLen);
|
ASSERT(pMsg->bytes == sizeof(SyncAppendEntries) + pMsg->dataLen);
|
||||||
}
|
}
|
||||||
|
|
||||||
char* syncAppendEntriesSerialize2(const SyncAppendEntries* pMsg, uint32_t* len) {
|
char* syncAppendEntriesSerialize2(const SyncAppendEntries* pMsg, uint32_t* len) {
|
||||||
char* buf = taosMemoryMalloc(pMsg->bytes);
|
char* buf = taosMemoryMalloc(pMsg->bytes);
|
||||||
assert(buf != NULL);
|
ASSERT(buf != NULL);
|
||||||
syncAppendEntriesSerialize(pMsg, buf, pMsg->bytes);
|
syncAppendEntriesSerialize(pMsg, buf, pMsg->bytes);
|
||||||
if (len != NULL) {
|
if (len != NULL) {
|
||||||
*len = pMsg->bytes;
|
*len = pMsg->bytes;
|
||||||
|
@ -1297,9 +1297,9 @@ char* syncAppendEntriesSerialize2(const SyncAppendEntries* pMsg, uint32_t* len)
|
||||||
SyncAppendEntries* syncAppendEntriesDeserialize2(const char* buf, uint32_t len) {
|
SyncAppendEntries* syncAppendEntriesDeserialize2(const char* buf, uint32_t len) {
|
||||||
uint32_t bytes = *((uint32_t*)buf);
|
uint32_t bytes = *((uint32_t*)buf);
|
||||||
SyncAppendEntries* pMsg = taosMemoryMalloc(bytes);
|
SyncAppendEntries* pMsg = taosMemoryMalloc(bytes);
|
||||||
assert(pMsg != NULL);
|
ASSERT(pMsg != NULL);
|
||||||
syncAppendEntriesDeserialize(buf, len, pMsg);
|
syncAppendEntriesDeserialize(buf, len, pMsg);
|
||||||
assert(len == pMsg->bytes);
|
ASSERT(len == pMsg->bytes);
|
||||||
return pMsg;
|
return pMsg;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1317,7 +1317,7 @@ void syncAppendEntriesFromRpcMsg(const SRpcMsg* pRpcMsg, SyncAppendEntries* pMsg
|
||||||
|
|
||||||
SyncAppendEntries* syncAppendEntriesFromRpcMsg2(const SRpcMsg* pRpcMsg) {
|
SyncAppendEntries* syncAppendEntriesFromRpcMsg2(const SRpcMsg* pRpcMsg) {
|
||||||
SyncAppendEntries* pMsg = syncAppendEntriesDeserialize2(pRpcMsg->pCont, pRpcMsg->contLen);
|
SyncAppendEntries* pMsg = syncAppendEntriesDeserialize2(pRpcMsg->pCont, pRpcMsg->contLen);
|
||||||
assert(pMsg != NULL);
|
ASSERT(pMsg != NULL);
|
||||||
return pMsg;
|
return pMsg;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1444,18 +1444,18 @@ void syncAppendEntriesReplyDestroy(SyncAppendEntriesReply* pMsg) {
|
||||||
}
|
}
|
||||||
|
|
||||||
void syncAppendEntriesReplySerialize(const SyncAppendEntriesReply* pMsg, char* buf, uint32_t bufLen) {
|
void syncAppendEntriesReplySerialize(const SyncAppendEntriesReply* pMsg, char* buf, uint32_t bufLen) {
|
||||||
assert(pMsg->bytes <= bufLen);
|
ASSERT(pMsg->bytes <= bufLen);
|
||||||
memcpy(buf, pMsg, pMsg->bytes);
|
memcpy(buf, pMsg, pMsg->bytes);
|
||||||
}
|
}
|
||||||
|
|
||||||
void syncAppendEntriesReplyDeserialize(const char* buf, uint32_t len, SyncAppendEntriesReply* pMsg) {
|
void syncAppendEntriesReplyDeserialize(const char* buf, uint32_t len, SyncAppendEntriesReply* pMsg) {
|
||||||
memcpy(pMsg, buf, len);
|
memcpy(pMsg, buf, len);
|
||||||
assert(len == pMsg->bytes);
|
ASSERT(len == pMsg->bytes);
|
||||||
}
|
}
|
||||||
|
|
||||||
char* syncAppendEntriesReplySerialize2(const SyncAppendEntriesReply* pMsg, uint32_t* len) {
|
char* syncAppendEntriesReplySerialize2(const SyncAppendEntriesReply* pMsg, uint32_t* len) {
|
||||||
char* buf = taosMemoryMalloc(pMsg->bytes);
|
char* buf = taosMemoryMalloc(pMsg->bytes);
|
||||||
assert(buf != NULL);
|
ASSERT(buf != NULL);
|
||||||
syncAppendEntriesReplySerialize(pMsg, buf, pMsg->bytes);
|
syncAppendEntriesReplySerialize(pMsg, buf, pMsg->bytes);
|
||||||
if (len != NULL) {
|
if (len != NULL) {
|
||||||
*len = pMsg->bytes;
|
*len = pMsg->bytes;
|
||||||
|
@ -1466,9 +1466,9 @@ char* syncAppendEntriesReplySerialize2(const SyncAppendEntriesReply* pMsg, uint3
|
||||||
SyncAppendEntriesReply* syncAppendEntriesReplyDeserialize2(const char* buf, uint32_t len) {
|
SyncAppendEntriesReply* syncAppendEntriesReplyDeserialize2(const char* buf, uint32_t len) {
|
||||||
uint32_t bytes = *((uint32_t*)buf);
|
uint32_t bytes = *((uint32_t*)buf);
|
||||||
SyncAppendEntriesReply* pMsg = taosMemoryMalloc(bytes);
|
SyncAppendEntriesReply* pMsg = taosMemoryMalloc(bytes);
|
||||||
assert(pMsg != NULL);
|
ASSERT(pMsg != NULL);
|
||||||
syncAppendEntriesReplyDeserialize(buf, len, pMsg);
|
syncAppendEntriesReplyDeserialize(buf, len, pMsg);
|
||||||
assert(len == pMsg->bytes);
|
ASSERT(len == pMsg->bytes);
|
||||||
return pMsg;
|
return pMsg;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1486,7 +1486,7 @@ void syncAppendEntriesReplyFromRpcMsg(const SRpcMsg* pRpcMsg, SyncAppendEntriesR
|
||||||
|
|
||||||
SyncAppendEntriesReply* syncAppendEntriesReplyFromRpcMsg2(const SRpcMsg* pRpcMsg) {
|
SyncAppendEntriesReply* syncAppendEntriesReplyFromRpcMsg2(const SRpcMsg* pRpcMsg) {
|
||||||
SyncAppendEntriesReply* pMsg = syncAppendEntriesReplyDeserialize2(pRpcMsg->pCont, pRpcMsg->contLen);
|
SyncAppendEntriesReply* pMsg = syncAppendEntriesReplyDeserialize2(pRpcMsg->pCont, pRpcMsg->contLen);
|
||||||
assert(pMsg != NULL);
|
ASSERT(pMsg != NULL);
|
||||||
return pMsg;
|
return pMsg;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1607,18 +1607,18 @@ void syncApplyMsgDestroy(SyncApplyMsg* pMsg) {
|
||||||
}
|
}
|
||||||
|
|
||||||
void syncApplyMsgSerialize(const SyncApplyMsg* pMsg, char* buf, uint32_t bufLen) {
|
void syncApplyMsgSerialize(const SyncApplyMsg* pMsg, char* buf, uint32_t bufLen) {
|
||||||
assert(pMsg->bytes <= bufLen);
|
ASSERT(pMsg->bytes <= bufLen);
|
||||||
memcpy(buf, pMsg, pMsg->bytes);
|
memcpy(buf, pMsg, pMsg->bytes);
|
||||||
}
|
}
|
||||||
|
|
||||||
void syncApplyMsgDeserialize(const char* buf, uint32_t len, SyncApplyMsg* pMsg) {
|
void syncApplyMsgDeserialize(const char* buf, uint32_t len, SyncApplyMsg* pMsg) {
|
||||||
memcpy(pMsg, buf, len);
|
memcpy(pMsg, buf, len);
|
||||||
assert(len == pMsg->bytes);
|
ASSERT(len == pMsg->bytes);
|
||||||
}
|
}
|
||||||
|
|
||||||
char* syncApplyMsgSerialize2(const SyncApplyMsg* pMsg, uint32_t* len) {
|
char* syncApplyMsgSerialize2(const SyncApplyMsg* pMsg, uint32_t* len) {
|
||||||
char* buf = taosMemoryMalloc(pMsg->bytes);
|
char* buf = taosMemoryMalloc(pMsg->bytes);
|
||||||
assert(buf != NULL);
|
ASSERT(buf != NULL);
|
||||||
syncApplyMsgSerialize(pMsg, buf, pMsg->bytes);
|
syncApplyMsgSerialize(pMsg, buf, pMsg->bytes);
|
||||||
if (len != NULL) {
|
if (len != NULL) {
|
||||||
*len = pMsg->bytes;
|
*len = pMsg->bytes;
|
||||||
|
@ -1629,9 +1629,9 @@ char* syncApplyMsgSerialize2(const SyncApplyMsg* pMsg, uint32_t* len) {
|
||||||
SyncApplyMsg* syncApplyMsgDeserialize2(const char* buf, uint32_t len) {
|
SyncApplyMsg* syncApplyMsgDeserialize2(const char* buf, uint32_t len) {
|
||||||
uint32_t bytes = *((uint32_t*)buf);
|
uint32_t bytes = *((uint32_t*)buf);
|
||||||
SyncApplyMsg* pMsg = taosMemoryMalloc(bytes);
|
SyncApplyMsg* pMsg = taosMemoryMalloc(bytes);
|
||||||
assert(pMsg != NULL);
|
ASSERT(pMsg != NULL);
|
||||||
syncApplyMsgDeserialize(buf, len, pMsg);
|
syncApplyMsgDeserialize(buf, len, pMsg);
|
||||||
assert(len == pMsg->bytes);
|
ASSERT(len == pMsg->bytes);
|
||||||
return pMsg;
|
return pMsg;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1752,19 +1752,19 @@ void syncSnapshotSendDestroy(SyncSnapshotSend* pMsg) {
|
||||||
}
|
}
|
||||||
|
|
||||||
void syncSnapshotSendSerialize(const SyncSnapshotSend* pMsg, char* buf, uint32_t bufLen) {
|
void syncSnapshotSendSerialize(const SyncSnapshotSend* pMsg, char* buf, uint32_t bufLen) {
|
||||||
assert(pMsg->bytes <= bufLen);
|
ASSERT(pMsg->bytes <= bufLen);
|
||||||
memcpy(buf, pMsg, pMsg->bytes);
|
memcpy(buf, pMsg, pMsg->bytes);
|
||||||
}
|
}
|
||||||
|
|
||||||
void syncSnapshotSendDeserialize(const char* buf, uint32_t len, SyncSnapshotSend* pMsg) {
|
void syncSnapshotSendDeserialize(const char* buf, uint32_t len, SyncSnapshotSend* pMsg) {
|
||||||
memcpy(pMsg, buf, len);
|
memcpy(pMsg, buf, len);
|
||||||
assert(len == pMsg->bytes);
|
ASSERT(len == pMsg->bytes);
|
||||||
assert(pMsg->bytes == sizeof(SyncSnapshotSend) + pMsg->dataLen);
|
ASSERT(pMsg->bytes == sizeof(SyncSnapshotSend) + pMsg->dataLen);
|
||||||
}
|
}
|
||||||
|
|
||||||
char* syncSnapshotSendSerialize2(const SyncSnapshotSend* pMsg, uint32_t* len) {
|
char* syncSnapshotSendSerialize2(const SyncSnapshotSend* pMsg, uint32_t* len) {
|
||||||
char* buf = taosMemoryMalloc(pMsg->bytes);
|
char* buf = taosMemoryMalloc(pMsg->bytes);
|
||||||
assert(buf != NULL);
|
ASSERT(buf != NULL);
|
||||||
syncSnapshotSendSerialize(pMsg, buf, pMsg->bytes);
|
syncSnapshotSendSerialize(pMsg, buf, pMsg->bytes);
|
||||||
if (len != NULL) {
|
if (len != NULL) {
|
||||||
*len = pMsg->bytes;
|
*len = pMsg->bytes;
|
||||||
|
@ -1775,9 +1775,9 @@ char* syncSnapshotSendSerialize2(const SyncSnapshotSend* pMsg, uint32_t* len) {
|
||||||
SyncSnapshotSend* syncSnapshotSendDeserialize2(const char* buf, uint32_t len) {
|
SyncSnapshotSend* syncSnapshotSendDeserialize2(const char* buf, uint32_t len) {
|
||||||
uint32_t bytes = *((uint32_t*)buf);
|
uint32_t bytes = *((uint32_t*)buf);
|
||||||
SyncSnapshotSend* pMsg = taosMemoryMalloc(bytes);
|
SyncSnapshotSend* pMsg = taosMemoryMalloc(bytes);
|
||||||
assert(pMsg != NULL);
|
ASSERT(pMsg != NULL);
|
||||||
syncSnapshotSendDeserialize(buf, len, pMsg);
|
syncSnapshotSendDeserialize(buf, len, pMsg);
|
||||||
assert(len == pMsg->bytes);
|
ASSERT(len == pMsg->bytes);
|
||||||
return pMsg;
|
return pMsg;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1795,7 +1795,7 @@ void syncSnapshotSendFromRpcMsg(const SRpcMsg* pRpcMsg, SyncSnapshotSend* pMsg)
|
||||||
|
|
||||||
SyncSnapshotSend* syncSnapshotSendFromRpcMsg2(const SRpcMsg* pRpcMsg) {
|
SyncSnapshotSend* syncSnapshotSendFromRpcMsg2(const SRpcMsg* pRpcMsg) {
|
||||||
SyncSnapshotSend* pMsg = syncSnapshotSendDeserialize2(pRpcMsg->pCont, pRpcMsg->contLen);
|
SyncSnapshotSend* pMsg = syncSnapshotSendDeserialize2(pRpcMsg->pCont, pRpcMsg->contLen);
|
||||||
assert(pMsg != NULL);
|
ASSERT(pMsg != NULL);
|
||||||
return pMsg;
|
return pMsg;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1925,18 +1925,18 @@ void syncSnapshotRspDestroy(SyncSnapshotRsp* pMsg) {
|
||||||
}
|
}
|
||||||
|
|
||||||
void syncSnapshotRspSerialize(const SyncSnapshotRsp* pMsg, char* buf, uint32_t bufLen) {
|
void syncSnapshotRspSerialize(const SyncSnapshotRsp* pMsg, char* buf, uint32_t bufLen) {
|
||||||
assert(pMsg->bytes <= bufLen);
|
ASSERT(pMsg->bytes <= bufLen);
|
||||||
memcpy(buf, pMsg, pMsg->bytes);
|
memcpy(buf, pMsg, pMsg->bytes);
|
||||||
}
|
}
|
||||||
|
|
||||||
void syncSnapshotRspDeserialize(const char* buf, uint32_t len, SyncSnapshotRsp* pMsg) {
|
void syncSnapshotRspDeserialize(const char* buf, uint32_t len, SyncSnapshotRsp* pMsg) {
|
||||||
memcpy(pMsg, buf, len);
|
memcpy(pMsg, buf, len);
|
||||||
assert(len == pMsg->bytes);
|
ASSERT(len == pMsg->bytes);
|
||||||
}
|
}
|
||||||
|
|
||||||
char* syncSnapshotRspSerialize2(const SyncSnapshotRsp* pMsg, uint32_t* len) {
|
char* syncSnapshotRspSerialize2(const SyncSnapshotRsp* pMsg, uint32_t* len) {
|
||||||
char* buf = taosMemoryMalloc(pMsg->bytes);
|
char* buf = taosMemoryMalloc(pMsg->bytes);
|
||||||
assert(buf != NULL);
|
ASSERT(buf != NULL);
|
||||||
syncSnapshotRspSerialize(pMsg, buf, pMsg->bytes);
|
syncSnapshotRspSerialize(pMsg, buf, pMsg->bytes);
|
||||||
if (len != NULL) {
|
if (len != NULL) {
|
||||||
*len = pMsg->bytes;
|
*len = pMsg->bytes;
|
||||||
|
@ -1947,9 +1947,9 @@ char* syncSnapshotRspSerialize2(const SyncSnapshotRsp* pMsg, uint32_t* len) {
|
||||||
SyncSnapshotRsp* syncSnapshotRspDeserialize2(const char* buf, uint32_t len) {
|
SyncSnapshotRsp* syncSnapshotRspDeserialize2(const char* buf, uint32_t len) {
|
||||||
uint32_t bytes = *((uint32_t*)buf);
|
uint32_t bytes = *((uint32_t*)buf);
|
||||||
SyncSnapshotRsp* pMsg = taosMemoryMalloc(bytes);
|
SyncSnapshotRsp* pMsg = taosMemoryMalloc(bytes);
|
||||||
assert(pMsg != NULL);
|
ASSERT(pMsg != NULL);
|
||||||
syncSnapshotRspDeserialize(buf, len, pMsg);
|
syncSnapshotRspDeserialize(buf, len, pMsg);
|
||||||
assert(len == pMsg->bytes);
|
ASSERT(len == pMsg->bytes);
|
||||||
return pMsg;
|
return pMsg;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1967,7 +1967,7 @@ void syncSnapshotRspFromRpcMsg(const SRpcMsg* pRpcMsg, SyncSnapshotRsp* pMsg) {
|
||||||
|
|
||||||
SyncSnapshotRsp* syncSnapshotRspFromRpcMsg2(const SRpcMsg* pRpcMsg) {
|
SyncSnapshotRsp* syncSnapshotRspFromRpcMsg2(const SRpcMsg* pRpcMsg) {
|
||||||
SyncSnapshotRsp* pMsg = syncSnapshotRspDeserialize2(pRpcMsg->pCont, pRpcMsg->contLen);
|
SyncSnapshotRsp* pMsg = syncSnapshotRspDeserialize2(pRpcMsg->pCont, pRpcMsg->contLen);
|
||||||
assert(pMsg != NULL);
|
ASSERT(pMsg != NULL);
|
||||||
return pMsg;
|
return pMsg;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2085,18 +2085,18 @@ void syncLeaderTransferDestroy(SyncLeaderTransfer* pMsg) {
|
||||||
}
|
}
|
||||||
|
|
||||||
void syncLeaderTransferSerialize(const SyncLeaderTransfer* pMsg, char* buf, uint32_t bufLen) {
|
void syncLeaderTransferSerialize(const SyncLeaderTransfer* pMsg, char* buf, uint32_t bufLen) {
|
||||||
assert(pMsg->bytes <= bufLen);
|
ASSERT(pMsg->bytes <= bufLen);
|
||||||
memcpy(buf, pMsg, pMsg->bytes);
|
memcpy(buf, pMsg, pMsg->bytes);
|
||||||
}
|
}
|
||||||
|
|
||||||
void syncLeaderTransferDeserialize(const char* buf, uint32_t len, SyncLeaderTransfer* pMsg) {
|
void syncLeaderTransferDeserialize(const char* buf, uint32_t len, SyncLeaderTransfer* pMsg) {
|
||||||
memcpy(pMsg, buf, len);
|
memcpy(pMsg, buf, len);
|
||||||
assert(len == pMsg->bytes);
|
ASSERT(len == pMsg->bytes);
|
||||||
}
|
}
|
||||||
|
|
||||||
char* syncLeaderTransferSerialize2(const SyncLeaderTransfer* pMsg, uint32_t* len) {
|
char* syncLeaderTransferSerialize2(const SyncLeaderTransfer* pMsg, uint32_t* len) {
|
||||||
char* buf = taosMemoryMalloc(pMsg->bytes);
|
char* buf = taosMemoryMalloc(pMsg->bytes);
|
||||||
assert(buf != NULL);
|
ASSERT(buf != NULL);
|
||||||
syncLeaderTransferSerialize(pMsg, buf, pMsg->bytes);
|
syncLeaderTransferSerialize(pMsg, buf, pMsg->bytes);
|
||||||
if (len != NULL) {
|
if (len != NULL) {
|
||||||
*len = pMsg->bytes;
|
*len = pMsg->bytes;
|
||||||
|
@ -2107,9 +2107,9 @@ char* syncLeaderTransferSerialize2(const SyncLeaderTransfer* pMsg, uint32_t* len
|
||||||
SyncLeaderTransfer* syncLeaderTransferDeserialize2(const char* buf, uint32_t len) {
|
SyncLeaderTransfer* syncLeaderTransferDeserialize2(const char* buf, uint32_t len) {
|
||||||
uint32_t bytes = *((uint32_t*)buf);
|
uint32_t bytes = *((uint32_t*)buf);
|
||||||
SyncLeaderTransfer* pMsg = taosMemoryMalloc(bytes);
|
SyncLeaderTransfer* pMsg = taosMemoryMalloc(bytes);
|
||||||
assert(pMsg != NULL);
|
ASSERT(pMsg != NULL);
|
||||||
syncLeaderTransferDeserialize(buf, len, pMsg);
|
syncLeaderTransferDeserialize(buf, len, pMsg);
|
||||||
assert(len == pMsg->bytes);
|
ASSERT(len == pMsg->bytes);
|
||||||
return pMsg;
|
return pMsg;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2127,7 +2127,7 @@ void syncLeaderTransferFromRpcMsg(const SRpcMsg* pRpcMsg, SyncLeaderTransfer* pM
|
||||||
|
|
||||||
SyncLeaderTransfer* syncLeaderTransferFromRpcMsg2(const SRpcMsg* pRpcMsg) {
|
SyncLeaderTransfer* syncLeaderTransferFromRpcMsg2(const SRpcMsg* pRpcMsg) {
|
||||||
SyncLeaderTransfer* pMsg = syncLeaderTransferDeserialize2(pRpcMsg->pCont, pRpcMsg->contLen);
|
SyncLeaderTransfer* pMsg = syncLeaderTransferDeserialize2(pRpcMsg->pCont, pRpcMsg->contLen);
|
||||||
assert(pMsg != NULL);
|
ASSERT(pMsg != NULL);
|
||||||
return pMsg;
|
return pMsg;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2247,18 +2247,18 @@ void syncReconfigFinishDestroy(SyncReconfigFinish* pMsg) {
|
||||||
}
|
}
|
||||||
|
|
||||||
void syncReconfigFinishSerialize(const SyncReconfigFinish* pMsg, char* buf, uint32_t bufLen) {
|
void syncReconfigFinishSerialize(const SyncReconfigFinish* pMsg, char* buf, uint32_t bufLen) {
|
||||||
assert(pMsg->bytes <= bufLen);
|
ASSERT(pMsg->bytes <= bufLen);
|
||||||
memcpy(buf, pMsg, pMsg->bytes);
|
memcpy(buf, pMsg, pMsg->bytes);
|
||||||
}
|
}
|
||||||
|
|
||||||
void syncReconfigFinishDeserialize(const char* buf, uint32_t len, SyncReconfigFinish* pMsg) {
|
void syncReconfigFinishDeserialize(const char* buf, uint32_t len, SyncReconfigFinish* pMsg) {
|
||||||
memcpy(pMsg, buf, len);
|
memcpy(pMsg, buf, len);
|
||||||
assert(len == pMsg->bytes);
|
ASSERT(len == pMsg->bytes);
|
||||||
}
|
}
|
||||||
|
|
||||||
char* syncReconfigFinishSerialize2(const SyncReconfigFinish* pMsg, uint32_t* len) {
|
char* syncReconfigFinishSerialize2(const SyncReconfigFinish* pMsg, uint32_t* len) {
|
||||||
char* buf = taosMemoryMalloc(pMsg->bytes);
|
char* buf = taosMemoryMalloc(pMsg->bytes);
|
||||||
assert(buf != NULL);
|
ASSERT(buf != NULL);
|
||||||
syncReconfigFinishSerialize(pMsg, buf, pMsg->bytes);
|
syncReconfigFinishSerialize(pMsg, buf, pMsg->bytes);
|
||||||
if (len != NULL) {
|
if (len != NULL) {
|
||||||
*len = pMsg->bytes;
|
*len = pMsg->bytes;
|
||||||
|
@ -2269,9 +2269,9 @@ char* syncReconfigFinishSerialize2(const SyncReconfigFinish* pMsg, uint32_t* len
|
||||||
SyncReconfigFinish* syncReconfigFinishDeserialize2(const char* buf, uint32_t len) {
|
SyncReconfigFinish* syncReconfigFinishDeserialize2(const char* buf, uint32_t len) {
|
||||||
uint32_t bytes = *((uint32_t*)buf);
|
uint32_t bytes = *((uint32_t*)buf);
|
||||||
SyncReconfigFinish* pMsg = taosMemoryMalloc(bytes);
|
SyncReconfigFinish* pMsg = taosMemoryMalloc(bytes);
|
||||||
assert(pMsg != NULL);
|
ASSERT(pMsg != NULL);
|
||||||
syncReconfigFinishDeserialize(buf, len, pMsg);
|
syncReconfigFinishDeserialize(buf, len, pMsg);
|
||||||
assert(len == pMsg->bytes);
|
ASSERT(len == pMsg->bytes);
|
||||||
return pMsg;
|
return pMsg;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2289,7 +2289,7 @@ void syncReconfigFinishFromRpcMsg(const SRpcMsg* pRpcMsg, SyncReconfigFinish* pM
|
||||||
|
|
||||||
SyncReconfigFinish* syncReconfigFinishFromRpcMsg2(const SRpcMsg* pRpcMsg) {
|
SyncReconfigFinish* syncReconfigFinishFromRpcMsg2(const SRpcMsg* pRpcMsg) {
|
||||||
SyncReconfigFinish* pMsg = syncReconfigFinishDeserialize2(pRpcMsg->pCont, pRpcMsg->contLen);
|
SyncReconfigFinish* pMsg = syncReconfigFinishDeserialize2(pRpcMsg->pCont, pRpcMsg->contLen);
|
||||||
assert(pMsg != NULL);
|
ASSERT(pMsg != NULL);
|
||||||
return pMsg;
|
return pMsg;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -24,29 +24,29 @@ SRaftCfg *raftCfgOpen(const char *path) {
|
||||||
snprintf(pCfg->path, sizeof(pCfg->path), "%s", path);
|
snprintf(pCfg->path, sizeof(pCfg->path), "%s", path);
|
||||||
|
|
||||||
pCfg->pFile = taosOpenFile(pCfg->path, TD_FILE_READ | TD_FILE_WRITE);
|
pCfg->pFile = taosOpenFile(pCfg->path, TD_FILE_READ | TD_FILE_WRITE);
|
||||||
assert(pCfg->pFile != NULL);
|
ASSERT(pCfg->pFile != NULL);
|
||||||
|
|
||||||
taosLSeekFile(pCfg->pFile, 0, SEEK_SET);
|
taosLSeekFile(pCfg->pFile, 0, SEEK_SET);
|
||||||
|
|
||||||
char buf[1024] = {0};
|
char buf[1024] = {0};
|
||||||
int len = taosReadFile(pCfg->pFile, buf, sizeof(buf));
|
int len = taosReadFile(pCfg->pFile, buf, sizeof(buf));
|
||||||
assert(len > 0);
|
ASSERT(len > 0);
|
||||||
|
|
||||||
int32_t ret = raftCfgFromStr(buf, pCfg);
|
int32_t ret = raftCfgFromStr(buf, pCfg);
|
||||||
assert(ret == 0);
|
ASSERT(ret == 0);
|
||||||
|
|
||||||
return pCfg;
|
return pCfg;
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t raftCfgClose(SRaftCfg *pRaftCfg) {
|
int32_t raftCfgClose(SRaftCfg *pRaftCfg) {
|
||||||
int64_t ret = taosCloseFile(&(pRaftCfg->pFile));
|
int64_t ret = taosCloseFile(&(pRaftCfg->pFile));
|
||||||
assert(ret == 0);
|
ASSERT(ret == 0);
|
||||||
taosMemoryFree(pRaftCfg);
|
taosMemoryFree(pRaftCfg);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t raftCfgPersist(SRaftCfg *pRaftCfg) {
|
int32_t raftCfgPersist(SRaftCfg *pRaftCfg) {
|
||||||
assert(pRaftCfg != NULL);
|
ASSERT(pRaftCfg != NULL);
|
||||||
|
|
||||||
char *s = raftCfg2Str(pRaftCfg);
|
char *s = raftCfg2Str(pRaftCfg);
|
||||||
taosLSeekFile(pRaftCfg->pFile, 0, SEEK_SET);
|
taosLSeekFile(pRaftCfg->pFile, 0, SEEK_SET);
|
||||||
|
@ -61,10 +61,10 @@ int32_t raftCfgPersist(SRaftCfg *pRaftCfg) {
|
||||||
|
|
||||||
snprintf(buf, sizeof(buf), "%s", s);
|
snprintf(buf, sizeof(buf), "%s", s);
|
||||||
int64_t ret = taosWriteFile(pRaftCfg->pFile, buf, sizeof(buf));
|
int64_t ret = taosWriteFile(pRaftCfg->pFile, buf, sizeof(buf));
|
||||||
assert(ret == sizeof(buf));
|
ASSERT(ret == sizeof(buf));
|
||||||
|
|
||||||
// int64_t ret = taosWriteFile(pRaftCfg->pFile, s, strlen(s) + 1);
|
// int64_t ret = taosWriteFile(pRaftCfg->pFile, s, strlen(s) + 1);
|
||||||
// assert(ret == strlen(s) + 1);
|
// ASSERT(ret == strlen(s) + 1);
|
||||||
|
|
||||||
taosMemoryFree(s);
|
taosMemoryFree(s);
|
||||||
taosFsyncFile(pRaftCfg->pFile);
|
taosFsyncFile(pRaftCfg->pFile);
|
||||||
|
@ -135,27 +135,27 @@ int32_t syncCfgFromJson(const cJSON *pRoot, SSyncCfg *pSyncCfg) {
|
||||||
const cJSON *pJson = pRoot;
|
const cJSON *pJson = pRoot;
|
||||||
|
|
||||||
cJSON *pReplicaNum = cJSON_GetObjectItem(pJson, "replicaNum");
|
cJSON *pReplicaNum = cJSON_GetObjectItem(pJson, "replicaNum");
|
||||||
assert(cJSON_IsNumber(pReplicaNum));
|
ASSERT(cJSON_IsNumber(pReplicaNum));
|
||||||
pSyncCfg->replicaNum = cJSON_GetNumberValue(pReplicaNum);
|
pSyncCfg->replicaNum = cJSON_GetNumberValue(pReplicaNum);
|
||||||
|
|
||||||
cJSON *pMyIndex = cJSON_GetObjectItem(pJson, "myIndex");
|
cJSON *pMyIndex = cJSON_GetObjectItem(pJson, "myIndex");
|
||||||
assert(cJSON_IsNumber(pMyIndex));
|
ASSERT(cJSON_IsNumber(pMyIndex));
|
||||||
pSyncCfg->myIndex = cJSON_GetNumberValue(pMyIndex);
|
pSyncCfg->myIndex = cJSON_GetNumberValue(pMyIndex);
|
||||||
|
|
||||||
cJSON *pNodeInfoArr = cJSON_GetObjectItem(pJson, "nodeInfo");
|
cJSON *pNodeInfoArr = cJSON_GetObjectItem(pJson, "nodeInfo");
|
||||||
int arraySize = cJSON_GetArraySize(pNodeInfoArr);
|
int arraySize = cJSON_GetArraySize(pNodeInfoArr);
|
||||||
assert(arraySize == pSyncCfg->replicaNum);
|
ASSERT(arraySize == pSyncCfg->replicaNum);
|
||||||
|
|
||||||
for (int i = 0; i < arraySize; ++i) {
|
for (int i = 0; i < arraySize; ++i) {
|
||||||
cJSON *pNodeInfo = cJSON_GetArrayItem(pNodeInfoArr, i);
|
cJSON *pNodeInfo = cJSON_GetArrayItem(pNodeInfoArr, i);
|
||||||
assert(pNodeInfo != NULL);
|
ASSERT(pNodeInfo != NULL);
|
||||||
|
|
||||||
cJSON *pNodePort = cJSON_GetObjectItem(pNodeInfo, "nodePort");
|
cJSON *pNodePort = cJSON_GetObjectItem(pNodeInfo, "nodePort");
|
||||||
assert(cJSON_IsNumber(pNodePort));
|
ASSERT(cJSON_IsNumber(pNodePort));
|
||||||
((pSyncCfg->nodeInfo)[i]).nodePort = cJSON_GetNumberValue(pNodePort);
|
((pSyncCfg->nodeInfo)[i]).nodePort = cJSON_GetNumberValue(pNodePort);
|
||||||
|
|
||||||
cJSON *pNodeFqdn = cJSON_GetObjectItem(pNodeInfo, "nodeFqdn");
|
cJSON *pNodeFqdn = cJSON_GetObjectItem(pNodeInfo, "nodeFqdn");
|
||||||
assert(cJSON_IsString(pNodeFqdn));
|
ASSERT(cJSON_IsString(pNodeFqdn));
|
||||||
snprintf(((pSyncCfg->nodeInfo)[i]).nodeFqdn, sizeof(((pSyncCfg->nodeInfo)[i]).nodeFqdn), "%s",
|
snprintf(((pSyncCfg->nodeInfo)[i]).nodeFqdn, sizeof(((pSyncCfg->nodeInfo)[i]).nodeFqdn), "%s",
|
||||||
pNodeFqdn->valuestring);
|
pNodeFqdn->valuestring);
|
||||||
}
|
}
|
||||||
|
@ -165,10 +165,10 @@ int32_t syncCfgFromJson(const cJSON *pRoot, SSyncCfg *pSyncCfg) {
|
||||||
|
|
||||||
int32_t syncCfgFromStr(const char *s, SSyncCfg *pSyncCfg) {
|
int32_t syncCfgFromStr(const char *s, SSyncCfg *pSyncCfg) {
|
||||||
cJSON *pRoot = cJSON_Parse(s);
|
cJSON *pRoot = cJSON_Parse(s);
|
||||||
assert(pRoot != NULL);
|
ASSERT(pRoot != NULL);
|
||||||
|
|
||||||
int32_t ret = syncCfgFromJson(pRoot, pSyncCfg);
|
int32_t ret = syncCfgFromJson(pRoot, pSyncCfg);
|
||||||
assert(ret == 0);
|
ASSERT(ret == 0);
|
||||||
|
|
||||||
cJSON_Delete(pRoot);
|
cJSON_Delete(pRoot);
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -207,10 +207,10 @@ char *raftCfg2Str(SRaftCfg *pRaftCfg) {
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t raftCfgCreateFile(SSyncCfg *pCfg, SRaftCfgMeta meta, const char *path) {
|
int32_t raftCfgCreateFile(SSyncCfg *pCfg, SRaftCfgMeta meta, const char *path) {
|
||||||
assert(pCfg != NULL);
|
ASSERT(pCfg != NULL);
|
||||||
|
|
||||||
TdFilePtr pFile = taosOpenFile(path, TD_FILE_CREATE | TD_FILE_WRITE);
|
TdFilePtr pFile = taosOpenFile(path, TD_FILE_CREATE | TD_FILE_WRITE);
|
||||||
assert(pFile != NULL);
|
ASSERT(pFile != NULL);
|
||||||
|
|
||||||
SRaftCfg raftCfg;
|
SRaftCfg raftCfg;
|
||||||
raftCfg.cfg = *pCfg;
|
raftCfg.cfg = *pCfg;
|
||||||
|
@ -227,10 +227,10 @@ int32_t raftCfgCreateFile(SSyncCfg *pCfg, SRaftCfgMeta meta, const char *path) {
|
||||||
ASSERT(strlen(s) + 1 <= CONFIG_FILE_LEN);
|
ASSERT(strlen(s) + 1 <= CONFIG_FILE_LEN);
|
||||||
snprintf(buf, sizeof(buf), "%s", s);
|
snprintf(buf, sizeof(buf), "%s", s);
|
||||||
int64_t ret = taosWriteFile(pFile, buf, sizeof(buf));
|
int64_t ret = taosWriteFile(pFile, buf, sizeof(buf));
|
||||||
assert(ret == sizeof(buf));
|
ASSERT(ret == sizeof(buf));
|
||||||
|
|
||||||
// int64_t ret = taosWriteFile(pFile, s, strlen(s) + 1);
|
// int64_t ret = taosWriteFile(pFile, s, strlen(s) + 1);
|
||||||
// assert(ret == strlen(s) + 1);
|
// ASSERT(ret == strlen(s) + 1);
|
||||||
|
|
||||||
taosMemoryFree(s);
|
taosMemoryFree(s);
|
||||||
taosCloseFile(&pFile);
|
taosCloseFile(&pFile);
|
||||||
|
@ -255,15 +255,15 @@ int32_t raftCfgFromJson(const cJSON *pRoot, SRaftCfg *pRaftCfg) {
|
||||||
|
|
||||||
cJSON *pIndexArr = cJSON_GetObjectItem(pJson, "configIndexArr");
|
cJSON *pIndexArr = cJSON_GetObjectItem(pJson, "configIndexArr");
|
||||||
int arraySize = cJSON_GetArraySize(pIndexArr);
|
int arraySize = cJSON_GetArraySize(pIndexArr);
|
||||||
assert(arraySize == pRaftCfg->configIndexCount);
|
ASSERT(arraySize == pRaftCfg->configIndexCount);
|
||||||
|
|
||||||
memset(pRaftCfg->configIndexArr, 0, sizeof(pRaftCfg->configIndexArr));
|
memset(pRaftCfg->configIndexArr, 0, sizeof(pRaftCfg->configIndexArr));
|
||||||
for (int i = 0; i < arraySize; ++i) {
|
for (int i = 0; i < arraySize; ++i) {
|
||||||
cJSON *pIndexObj = cJSON_GetArrayItem(pIndexArr, i);
|
cJSON *pIndexObj = cJSON_GetArrayItem(pIndexArr, i);
|
||||||
assert(pIndexObj != NULL);
|
ASSERT(pIndexObj != NULL);
|
||||||
|
|
||||||
cJSON *pIndex = cJSON_GetObjectItem(pIndexObj, "index");
|
cJSON *pIndex = cJSON_GetObjectItem(pIndexObj, "index");
|
||||||
assert(cJSON_IsString(pIndex));
|
ASSERT(cJSON_IsString(pIndex));
|
||||||
(pRaftCfg->configIndexArr)[i] = atoll(pIndex->valuestring);
|
(pRaftCfg->configIndexArr)[i] = atoll(pIndex->valuestring);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -276,10 +276,10 @@ int32_t raftCfgFromJson(const cJSON *pRoot, SRaftCfg *pRaftCfg) {
|
||||||
|
|
||||||
int32_t raftCfgFromStr(const char *s, SRaftCfg *pRaftCfg) {
|
int32_t raftCfgFromStr(const char *s, SRaftCfg *pRaftCfg) {
|
||||||
cJSON *pRoot = cJSON_Parse(s);
|
cJSON *pRoot = cJSON_Parse(s);
|
||||||
assert(pRoot != NULL);
|
ASSERT(pRoot != NULL);
|
||||||
|
|
||||||
int32_t ret = raftCfgFromJson(pRoot, pRaftCfg);
|
int32_t ret = raftCfgFromJson(pRoot, pRaftCfg);
|
||||||
assert(ret == 0);
|
ASSERT(ret == 0);
|
||||||
|
|
||||||
cJSON_Delete(pRoot);
|
cJSON_Delete(pRoot);
|
||||||
return 0;
|
return 0;
|
||||||
|
|
|
@ -19,7 +19,7 @@
|
||||||
SSyncRaftEntry* syncEntryBuild(uint32_t dataLen) {
|
SSyncRaftEntry* syncEntryBuild(uint32_t dataLen) {
|
||||||
uint32_t bytes = sizeof(SSyncRaftEntry) + dataLen;
|
uint32_t bytes = sizeof(SSyncRaftEntry) + dataLen;
|
||||||
SSyncRaftEntry* pEntry = taosMemoryMalloc(bytes);
|
SSyncRaftEntry* pEntry = taosMemoryMalloc(bytes);
|
||||||
assert(pEntry != NULL);
|
ASSERT(pEntry != NULL);
|
||||||
memset(pEntry, 0, bytes);
|
memset(pEntry, 0, bytes);
|
||||||
pEntry->bytes = bytes;
|
pEntry->bytes = bytes;
|
||||||
pEntry->dataLen = dataLen;
|
pEntry->dataLen = dataLen;
|
||||||
|
@ -29,14 +29,14 @@ SSyncRaftEntry* syncEntryBuild(uint32_t dataLen) {
|
||||||
// step 4. SyncClientRequest => SSyncRaftEntry, add term, index
|
// step 4. SyncClientRequest => SSyncRaftEntry, add term, index
|
||||||
SSyncRaftEntry* syncEntryBuild2(SyncClientRequest* pMsg, SyncTerm term, SyncIndex index) {
|
SSyncRaftEntry* syncEntryBuild2(SyncClientRequest* pMsg, SyncTerm term, SyncIndex index) {
|
||||||
SSyncRaftEntry* pEntry = syncEntryBuild3(pMsg, term, index);
|
SSyncRaftEntry* pEntry = syncEntryBuild3(pMsg, term, index);
|
||||||
assert(pEntry != NULL);
|
ASSERT(pEntry != NULL);
|
||||||
|
|
||||||
return pEntry;
|
return pEntry;
|
||||||
}
|
}
|
||||||
|
|
||||||
SSyncRaftEntry* syncEntryBuild3(SyncClientRequest* pMsg, SyncTerm term, SyncIndex index) {
|
SSyncRaftEntry* syncEntryBuild3(SyncClientRequest* pMsg, SyncTerm term, SyncIndex index) {
|
||||||
SSyncRaftEntry* pEntry = syncEntryBuild(pMsg->dataLen);
|
SSyncRaftEntry* pEntry = syncEntryBuild(pMsg->dataLen);
|
||||||
assert(pEntry != NULL);
|
ASSERT(pEntry != NULL);
|
||||||
|
|
||||||
pEntry->msgType = pMsg->msgType;
|
pEntry->msgType = pMsg->msgType;
|
||||||
pEntry->originalRpcType = pMsg->originalRpcType;
|
pEntry->originalRpcType = pMsg->originalRpcType;
|
||||||
|
@ -63,7 +63,7 @@ SSyncRaftEntry* syncEntryBuildNoop(SyncTerm term, SyncIndex index, int32_t vgId)
|
||||||
memcpy(rpcMsg.pCont, &head, sizeof(head));
|
memcpy(rpcMsg.pCont, &head, sizeof(head));
|
||||||
|
|
||||||
SSyncRaftEntry* pEntry = syncEntryBuild(rpcMsg.contLen);
|
SSyncRaftEntry* pEntry = syncEntryBuild(rpcMsg.contLen);
|
||||||
assert(pEntry != NULL);
|
ASSERT(pEntry != NULL);
|
||||||
|
|
||||||
pEntry->msgType = TDMT_SYNC_CLIENT_REQUEST;
|
pEntry->msgType = TDMT_SYNC_CLIENT_REQUEST;
|
||||||
pEntry->originalRpcType = TDMT_SYNC_NOOP;
|
pEntry->originalRpcType = TDMT_SYNC_NOOP;
|
||||||
|
@ -72,7 +72,7 @@ SSyncRaftEntry* syncEntryBuildNoop(SyncTerm term, SyncIndex index, int32_t vgId)
|
||||||
pEntry->term = term;
|
pEntry->term = term;
|
||||||
pEntry->index = index;
|
pEntry->index = index;
|
||||||
|
|
||||||
assert(pEntry->dataLen == rpcMsg.contLen);
|
ASSERT(pEntry->dataLen == rpcMsg.contLen);
|
||||||
memcpy(pEntry->data, rpcMsg.pCont, rpcMsg.contLen);
|
memcpy(pEntry->data, rpcMsg.pCont, rpcMsg.contLen);
|
||||||
rpcFreeCont(rpcMsg.pCont);
|
rpcFreeCont(rpcMsg.pCont);
|
||||||
|
|
||||||
|
@ -88,7 +88,7 @@ void syncEntryDestory(SSyncRaftEntry* pEntry) {
|
||||||
// step 5. SSyncRaftEntry => bin, to raft log
|
// step 5. SSyncRaftEntry => bin, to raft log
|
||||||
char* syncEntrySerialize(const SSyncRaftEntry* pEntry, uint32_t* len) {
|
char* syncEntrySerialize(const SSyncRaftEntry* pEntry, uint32_t* len) {
|
||||||
char* buf = taosMemoryMalloc(pEntry->bytes);
|
char* buf = taosMemoryMalloc(pEntry->bytes);
|
||||||
assert(buf != NULL);
|
ASSERT(buf != NULL);
|
||||||
memcpy(buf, pEntry, pEntry->bytes);
|
memcpy(buf, pEntry, pEntry->bytes);
|
||||||
if (len != NULL) {
|
if (len != NULL) {
|
||||||
*len = pEntry->bytes;
|
*len = pEntry->bytes;
|
||||||
|
@ -100,9 +100,9 @@ char* syncEntrySerialize(const SSyncRaftEntry* pEntry, uint32_t* len) {
|
||||||
SSyncRaftEntry* syncEntryDeserialize(const char* buf, uint32_t len) {
|
SSyncRaftEntry* syncEntryDeserialize(const char* buf, uint32_t len) {
|
||||||
uint32_t bytes = *((uint32_t*)buf);
|
uint32_t bytes = *((uint32_t*)buf);
|
||||||
SSyncRaftEntry* pEntry = taosMemoryMalloc(bytes);
|
SSyncRaftEntry* pEntry = taosMemoryMalloc(bytes);
|
||||||
assert(pEntry != NULL);
|
ASSERT(pEntry != NULL);
|
||||||
memcpy(pEntry, buf, len);
|
memcpy(pEntry, buf, len);
|
||||||
assert(len == pEntry->bytes);
|
ASSERT(len == pEntry->bytes);
|
||||||
return pEntry;
|
return pEntry;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -25,7 +25,7 @@ static SyncIndex raftLogEndIndex(struct SSyncLogStore* pLogStore);
|
||||||
static SyncIndex raftLogWriteIndex(struct SSyncLogStore* pLogStore);
|
static SyncIndex raftLogWriteIndex(struct SSyncLogStore* pLogStore);
|
||||||
static bool raftLogIsEmpty(struct SSyncLogStore* pLogStore);
|
static bool raftLogIsEmpty(struct SSyncLogStore* pLogStore);
|
||||||
static int32_t raftLogEntryCount(struct SSyncLogStore* pLogStore);
|
static int32_t raftLogEntryCount(struct SSyncLogStore* pLogStore);
|
||||||
static bool raftLogInRange(struct SSyncLogStore* pLogStore, SyncIndex index);
|
|
||||||
static SyncIndex raftLogLastIndex(struct SSyncLogStore* pLogStore);
|
static SyncIndex raftLogLastIndex(struct SSyncLogStore* pLogStore);
|
||||||
static SyncTerm raftLogLastTerm(struct SSyncLogStore* pLogStore);
|
static SyncTerm raftLogLastTerm(struct SSyncLogStore* pLogStore);
|
||||||
static int32_t raftLogAppendEntry(struct SSyncLogStore* pLogStore, SSyncRaftEntry* pEntry);
|
static int32_t raftLogAppendEntry(struct SSyncLogStore* pLogStore, SSyncRaftEntry* pEntry);
|
||||||
|
@ -58,8 +58,6 @@ static int32_t raftLogSetBeginIndex(struct SSyncLogStore* pLogStore, SyncIndex b
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t raftLogResetBeginIndex(struct SSyncLogStore* pLogStore) { return 0; }
|
|
||||||
|
|
||||||
static SyncIndex raftLogBeginIndex(struct SSyncLogStore* pLogStore) {
|
static SyncIndex raftLogBeginIndex(struct SSyncLogStore* pLogStore) {
|
||||||
SSyncLogStoreData* pData = pLogStore->data;
|
SSyncLogStoreData* pData = pLogStore->data;
|
||||||
SWal* pWal = pData->pWal;
|
SWal* pWal = pData->pWal;
|
||||||
|
@ -81,6 +79,7 @@ static int32_t raftLogEntryCount(struct SSyncLogStore* pLogStore) {
|
||||||
return count > 0 ? count : 0;
|
return count > 0 ? count : 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if 0
|
||||||
static bool raftLogInRange(struct SSyncLogStore* pLogStore, SyncIndex index) {
|
static bool raftLogInRange(struct SSyncLogStore* pLogStore, SyncIndex index) {
|
||||||
SyncIndex beginIndex = raftLogBeginIndex(pLogStore);
|
SyncIndex beginIndex = raftLogBeginIndex(pLogStore);
|
||||||
SyncIndex endIndex = raftLogEndIndex(pLogStore);
|
SyncIndex endIndex = raftLogEndIndex(pLogStore);
|
||||||
|
@ -90,6 +89,7 @@ static bool raftLogInRange(struct SSyncLogStore* pLogStore, SyncIndex index) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
static SyncIndex raftLogLastIndex(struct SSyncLogStore* pLogStore) {
|
static SyncIndex raftLogLastIndex(struct SSyncLogStore* pLogStore) {
|
||||||
SyncIndex lastIndex;
|
SyncIndex lastIndex;
|
||||||
|
@ -143,7 +143,10 @@ static int32_t raftLogAppendEntry(struct SSyncLogStore* pLogStore, SSyncRaftEntr
|
||||||
SWal* pWal = pData->pWal;
|
SWal* pWal = pData->pWal;
|
||||||
|
|
||||||
SyncIndex writeIndex = raftLogWriteIndex(pLogStore);
|
SyncIndex writeIndex = raftLogWriteIndex(pLogStore);
|
||||||
ASSERT(pEntry->index == writeIndex);
|
if (pEntry->index != writeIndex) {
|
||||||
|
sError("raftLogAppendEntry error, pEntry->index:%ld update to writeIndex:%ld", pEntry->index, writeIndex);
|
||||||
|
pEntry->index = writeIndex;
|
||||||
|
}
|
||||||
|
|
||||||
int code = 0;
|
int code = 0;
|
||||||
SSyncLogMeta syncMeta;
|
SSyncLogMeta syncMeta;
|
||||||
|
@ -171,6 +174,7 @@ static int32_t raftLogAppendEntry(struct SSyncLogStore* pLogStore, SSyncRaftEntr
|
||||||
return code;
|
return code;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if 0
|
||||||
static int32_t raftLogGetEntry(struct SSyncLogStore* pLogStore, SyncIndex index, SSyncRaftEntry** ppEntry) {
|
static int32_t raftLogGetEntry(struct SSyncLogStore* pLogStore, SyncIndex index, SSyncRaftEntry** ppEntry) {
|
||||||
SSyncLogStoreData* pData = pLogStore->data;
|
SSyncLogStoreData* pData = pLogStore->data;
|
||||||
SWal* pWal = pData->pWal;
|
SWal* pWal = pData->pWal;
|
||||||
|
@ -215,6 +219,49 @@ static int32_t raftLogGetEntry(struct SSyncLogStore* pLogStore, SyncIndex index,
|
||||||
|
|
||||||
return code;
|
return code;
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
static int32_t raftLogGetEntry(struct SSyncLogStore* pLogStore, SyncIndex index, SSyncRaftEntry** ppEntry) {
|
||||||
|
SSyncLogStoreData* pData = pLogStore->data;
|
||||||
|
SWal* pWal = pData->pWal;
|
||||||
|
int32_t code;
|
||||||
|
|
||||||
|
*ppEntry = NULL;
|
||||||
|
|
||||||
|
SWalReadHandle* pWalHandle = walOpenReadHandle(pWal);
|
||||||
|
if (pWalHandle == NULL) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
code = walReadWithHandle(pWalHandle, index);
|
||||||
|
if (code != 0) {
|
||||||
|
int32_t err = terrno;
|
||||||
|
const char* errStr = tstrerror(err);
|
||||||
|
int32_t linuxErr = errno;
|
||||||
|
const char* linuxErrMsg = strerror(errno);
|
||||||
|
sError("raftLogGetEntry error, err:%d %X, msg:%s, linuxErr:%d, linuxErrMsg:%s", err, err, errStr, linuxErr,
|
||||||
|
linuxErrMsg);
|
||||||
|
|
||||||
|
walCloseReadHandle(pWalHandle);
|
||||||
|
return code;
|
||||||
|
}
|
||||||
|
|
||||||
|
*ppEntry = syncEntryBuild(pWalHandle->pHead->head.bodyLen);
|
||||||
|
ASSERT(*ppEntry != NULL);
|
||||||
|
(*ppEntry)->msgType = TDMT_SYNC_CLIENT_REQUEST;
|
||||||
|
(*ppEntry)->originalRpcType = pWalHandle->pHead->head.msgType;
|
||||||
|
(*ppEntry)->seqNum = pWalHandle->pHead->head.syncMeta.seqNum;
|
||||||
|
(*ppEntry)->isWeak = pWalHandle->pHead->head.syncMeta.isWeek;
|
||||||
|
(*ppEntry)->term = pWalHandle->pHead->head.syncMeta.term;
|
||||||
|
(*ppEntry)->index = index;
|
||||||
|
ASSERT((*ppEntry)->dataLen == pWalHandle->pHead->head.bodyLen);
|
||||||
|
memcpy((*ppEntry)->data, pWalHandle->pHead->head.body, pWalHandle->pHead->head.bodyLen);
|
||||||
|
|
||||||
|
// need to hold, do not new every time!!
|
||||||
|
walCloseReadHandle(pWalHandle);
|
||||||
|
|
||||||
|
return code;
|
||||||
|
}
|
||||||
|
|
||||||
static int32_t raftLogTruncate(struct SSyncLogStore* pLogStore, SyncIndex fromIndex) {
|
static int32_t raftLogTruncate(struct SSyncLogStore* pLogStore, SyncIndex fromIndex) {
|
||||||
SSyncLogStoreData* pData = pLogStore->data;
|
SSyncLogStoreData* pData = pLogStore->data;
|
||||||
|
@ -245,10 +292,10 @@ static int32_t raftLogGetLastEntry(SSyncLogStore* pLogStore, SSyncRaftEntry** pp
|
||||||
//-------------------------------
|
//-------------------------------
|
||||||
SSyncLogStore* logStoreCreate(SSyncNode* pSyncNode) {
|
SSyncLogStore* logStoreCreate(SSyncNode* pSyncNode) {
|
||||||
SSyncLogStore* pLogStore = taosMemoryMalloc(sizeof(SSyncLogStore));
|
SSyncLogStore* pLogStore = taosMemoryMalloc(sizeof(SSyncLogStore));
|
||||||
assert(pLogStore != NULL);
|
ASSERT(pLogStore != NULL);
|
||||||
|
|
||||||
pLogStore->data = taosMemoryMalloc(sizeof(SSyncLogStoreData));
|
pLogStore->data = taosMemoryMalloc(sizeof(SSyncLogStoreData));
|
||||||
assert(pLogStore->data != NULL);
|
ASSERT(pLogStore->data != NULL);
|
||||||
|
|
||||||
SSyncLogStoreData* pData = pLogStore->data;
|
SSyncLogStoreData* pData = pLogStore->data;
|
||||||
pData->pSyncNode = pSyncNode;
|
pData->pSyncNode = pSyncNode;
|
||||||
|
@ -277,7 +324,6 @@ SSyncLogStore* logStoreCreate(SSyncNode* pSyncNode) {
|
||||||
pLogStore->syncLogEndIndex = raftLogEndIndex;
|
pLogStore->syncLogEndIndex = raftLogEndIndex;
|
||||||
pLogStore->syncLogIsEmpty = raftLogIsEmpty;
|
pLogStore->syncLogIsEmpty = raftLogIsEmpty;
|
||||||
pLogStore->syncLogEntryCount = raftLogEntryCount;
|
pLogStore->syncLogEntryCount = raftLogEntryCount;
|
||||||
pLogStore->syncLogInRange = raftLogInRange;
|
|
||||||
pLogStore->syncLogLastIndex = raftLogLastIndex;
|
pLogStore->syncLogLastIndex = raftLogLastIndex;
|
||||||
pLogStore->syncLogLastTerm = raftLogLastTerm;
|
pLogStore->syncLogLastTerm = raftLogLastTerm;
|
||||||
pLogStore->syncLogAppendEntry = raftLogAppendEntry;
|
pLogStore->syncLogAppendEntry = raftLogAppendEntry;
|
||||||
|
@ -285,6 +331,8 @@ SSyncLogStore* logStoreCreate(SSyncNode* pSyncNode) {
|
||||||
pLogStore->syncLogTruncate = raftLogTruncate;
|
pLogStore->syncLogTruncate = raftLogTruncate;
|
||||||
pLogStore->syncLogWriteIndex = raftLogWriteIndex;
|
pLogStore->syncLogWriteIndex = raftLogWriteIndex;
|
||||||
|
|
||||||
|
// pLogStore->syncLogInRange = raftLogInRange;
|
||||||
|
|
||||||
return pLogStore;
|
return pLogStore;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -301,7 +349,7 @@ int32_t logStoreAppendEntry(SSyncLogStore* pLogStore, SSyncRaftEntry* pEntry) {
|
||||||
SWal* pWal = pData->pWal;
|
SWal* pWal = pData->pWal;
|
||||||
|
|
||||||
SyncIndex lastIndex = logStoreLastIndex(pLogStore);
|
SyncIndex lastIndex = logStoreLastIndex(pLogStore);
|
||||||
assert(pEntry->index == lastIndex + 1);
|
ASSERT(pEntry->index == lastIndex + 1);
|
||||||
|
|
||||||
int code = 0;
|
int code = 0;
|
||||||
SSyncLogMeta syncMeta;
|
SSyncLogMeta syncMeta;
|
||||||
|
@ -347,10 +395,10 @@ SSyncRaftEntry* logStoreGetEntry(SSyncLogStore* pLogStore, SyncIndex index) {
|
||||||
linuxErrMsg);
|
linuxErrMsg);
|
||||||
ASSERT(0);
|
ASSERT(0);
|
||||||
}
|
}
|
||||||
// assert(walReadWithHandle(pWalHandle, index) == 0);
|
// ASSERT(walReadWithHandle(pWalHandle, index) == 0);
|
||||||
|
|
||||||
SSyncRaftEntry* pEntry = syncEntryBuild(pWalHandle->pHead->head.bodyLen);
|
SSyncRaftEntry* pEntry = syncEntryBuild(pWalHandle->pHead->head.bodyLen);
|
||||||
assert(pEntry != NULL);
|
ASSERT(pEntry != NULL);
|
||||||
|
|
||||||
pEntry->msgType = TDMT_SYNC_CLIENT_REQUEST;
|
pEntry->msgType = TDMT_SYNC_CLIENT_REQUEST;
|
||||||
pEntry->originalRpcType = pWalHandle->pHead->head.msgType;
|
pEntry->originalRpcType = pWalHandle->pHead->head.msgType;
|
||||||
|
@ -358,7 +406,7 @@ SSyncRaftEntry* logStoreGetEntry(SSyncLogStore* pLogStore, SyncIndex index) {
|
||||||
pEntry->isWeak = pWalHandle->pHead->head.syncMeta.isWeek;
|
pEntry->isWeak = pWalHandle->pHead->head.syncMeta.isWeek;
|
||||||
pEntry->term = pWalHandle->pHead->head.syncMeta.term;
|
pEntry->term = pWalHandle->pHead->head.syncMeta.term;
|
||||||
pEntry->index = index;
|
pEntry->index = index;
|
||||||
assert(pEntry->dataLen == pWalHandle->pHead->head.bodyLen);
|
ASSERT(pEntry->dataLen == pWalHandle->pHead->head.bodyLen);
|
||||||
memcpy(pEntry->data, pWalHandle->pHead->head.body, pWalHandle->pHead->head.bodyLen);
|
memcpy(pEntry->data, pWalHandle->pHead->head.body, pWalHandle->pHead->head.bodyLen);
|
||||||
|
|
||||||
// need to hold, do not new every time!!
|
// need to hold, do not new every time!!
|
||||||
|
@ -373,7 +421,7 @@ SSyncRaftEntry* logStoreGetEntry(SSyncLogStore* pLogStore, SyncIndex index) {
|
||||||
int32_t logStoreTruncate(SSyncLogStore* pLogStore, SyncIndex fromIndex) {
|
int32_t logStoreTruncate(SSyncLogStore* pLogStore, SyncIndex fromIndex) {
|
||||||
SSyncLogStoreData* pData = pLogStore->data;
|
SSyncLogStoreData* pData = pLogStore->data;
|
||||||
SWal* pWal = pData->pWal;
|
SWal* pWal = pData->pWal;
|
||||||
// assert(walRollback(pWal, fromIndex) == 0);
|
// ASSERT(walRollback(pWal, fromIndex) == 0);
|
||||||
int32_t code = walRollback(pWal, fromIndex);
|
int32_t code = walRollback(pWal, fromIndex);
|
||||||
if (code != 0) {
|
if (code != 0) {
|
||||||
int32_t err = terrno;
|
int32_t err = terrno;
|
||||||
|
@ -407,7 +455,7 @@ SyncTerm logStoreLastTerm(SSyncLogStore* pLogStore) {
|
||||||
int32_t logStoreUpdateCommitIndex(SSyncLogStore* pLogStore, SyncIndex index) {
|
int32_t logStoreUpdateCommitIndex(SSyncLogStore* pLogStore, SyncIndex index) {
|
||||||
SSyncLogStoreData* pData = pLogStore->data;
|
SSyncLogStoreData* pData = pLogStore->data;
|
||||||
SWal* pWal = pData->pWal;
|
SWal* pWal = pData->pWal;
|
||||||
// assert(walCommit(pWal, index) == 0);
|
// ASSERT(walCommit(pWal, index) == 0);
|
||||||
int32_t code = walCommit(pWal, index);
|
int32_t code = walCommit(pWal, index);
|
||||||
if (code != 0) {
|
if (code != 0) {
|
||||||
int32_t err = terrno;
|
int32_t err = terrno;
|
||||||
|
|
|
@ -39,40 +39,40 @@ SRaftStore *raftStoreOpen(const char *path) {
|
||||||
|
|
||||||
if (!raftStoreFileExist(pRaftStore->path)) {
|
if (!raftStoreFileExist(pRaftStore->path)) {
|
||||||
ret = raftStoreInit(pRaftStore);
|
ret = raftStoreInit(pRaftStore);
|
||||||
assert(ret == 0);
|
ASSERT(ret == 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
pRaftStore->pFile = taosOpenFile(path, TD_FILE_READ | TD_FILE_WRITE);
|
pRaftStore->pFile = taosOpenFile(path, TD_FILE_READ | TD_FILE_WRITE);
|
||||||
assert(pRaftStore->pFile != NULL);
|
ASSERT(pRaftStore->pFile != NULL);
|
||||||
|
|
||||||
int len = taosReadFile(pRaftStore->pFile, storeBuf, RAFT_STORE_BLOCK_SIZE);
|
int len = taosReadFile(pRaftStore->pFile, storeBuf, RAFT_STORE_BLOCK_SIZE);
|
||||||
assert(len == RAFT_STORE_BLOCK_SIZE);
|
ASSERT(len == RAFT_STORE_BLOCK_SIZE);
|
||||||
|
|
||||||
ret = raftStoreDeserialize(pRaftStore, storeBuf, len);
|
ret = raftStoreDeserialize(pRaftStore, storeBuf, len);
|
||||||
assert(ret == 0);
|
ASSERT(ret == 0);
|
||||||
|
|
||||||
return pRaftStore;
|
return pRaftStore;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int32_t raftStoreInit(SRaftStore *pRaftStore) {
|
static int32_t raftStoreInit(SRaftStore *pRaftStore) {
|
||||||
assert(pRaftStore != NULL);
|
ASSERT(pRaftStore != NULL);
|
||||||
|
|
||||||
pRaftStore->pFile = taosOpenFile(pRaftStore->path, TD_FILE_CREATE | TD_FILE_WRITE);
|
pRaftStore->pFile = taosOpenFile(pRaftStore->path, TD_FILE_CREATE | TD_FILE_WRITE);
|
||||||
assert(pRaftStore->pFile != NULL);
|
ASSERT(pRaftStore->pFile != NULL);
|
||||||
|
|
||||||
pRaftStore->currentTerm = 0;
|
pRaftStore->currentTerm = 0;
|
||||||
pRaftStore->voteFor.addr = 0;
|
pRaftStore->voteFor.addr = 0;
|
||||||
pRaftStore->voteFor.vgId = 0;
|
pRaftStore->voteFor.vgId = 0;
|
||||||
|
|
||||||
int32_t ret = raftStorePersist(pRaftStore);
|
int32_t ret = raftStorePersist(pRaftStore);
|
||||||
assert(ret == 0);
|
ASSERT(ret == 0);
|
||||||
|
|
||||||
taosCloseFile(&pRaftStore->pFile);
|
taosCloseFile(&pRaftStore->pFile);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t raftStoreClose(SRaftStore *pRaftStore) {
|
int32_t raftStoreClose(SRaftStore *pRaftStore) {
|
||||||
assert(pRaftStore != NULL);
|
ASSERT(pRaftStore != NULL);
|
||||||
|
|
||||||
taosCloseFile(&pRaftStore->pFile);
|
taosCloseFile(&pRaftStore->pFile);
|
||||||
taosMemoryFree(pRaftStore);
|
taosMemoryFree(pRaftStore);
|
||||||
|
@ -81,17 +81,17 @@ int32_t raftStoreClose(SRaftStore *pRaftStore) {
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t raftStorePersist(SRaftStore *pRaftStore) {
|
int32_t raftStorePersist(SRaftStore *pRaftStore) {
|
||||||
assert(pRaftStore != NULL);
|
ASSERT(pRaftStore != NULL);
|
||||||
|
|
||||||
int32_t ret;
|
int32_t ret;
|
||||||
char storeBuf[RAFT_STORE_BLOCK_SIZE] = {0};
|
char storeBuf[RAFT_STORE_BLOCK_SIZE] = {0};
|
||||||
ret = raftStoreSerialize(pRaftStore, storeBuf, sizeof(storeBuf));
|
ret = raftStoreSerialize(pRaftStore, storeBuf, sizeof(storeBuf));
|
||||||
assert(ret == 0);
|
ASSERT(ret == 0);
|
||||||
|
|
||||||
taosLSeekFile(pRaftStore->pFile, 0, SEEK_SET);
|
taosLSeekFile(pRaftStore->pFile, 0, SEEK_SET);
|
||||||
|
|
||||||
ret = taosWriteFile(pRaftStore->pFile, storeBuf, sizeof(storeBuf));
|
ret = taosWriteFile(pRaftStore->pFile, storeBuf, sizeof(storeBuf));
|
||||||
assert(ret == RAFT_STORE_BLOCK_SIZE);
|
ASSERT(ret == RAFT_STORE_BLOCK_SIZE);
|
||||||
|
|
||||||
taosFsyncFile(pRaftStore->pFile);
|
taosFsyncFile(pRaftStore->pFile);
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -103,7 +103,7 @@ static bool raftStoreFileExist(char *path) {
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t raftStoreSerialize(SRaftStore *pRaftStore, char *buf, size_t len) {
|
int32_t raftStoreSerialize(SRaftStore *pRaftStore, char *buf, size_t len) {
|
||||||
assert(pRaftStore != NULL);
|
ASSERT(pRaftStore != NULL);
|
||||||
|
|
||||||
cJSON *pRoot = cJSON_CreateObject();
|
cJSON *pRoot = cJSON_CreateObject();
|
||||||
|
|
||||||
|
@ -125,7 +125,7 @@ int32_t raftStoreSerialize(SRaftStore *pRaftStore, char *buf, size_t len) {
|
||||||
|
|
||||||
char *serialized = cJSON_Print(pRoot);
|
char *serialized = cJSON_Print(pRoot);
|
||||||
int len2 = strlen(serialized);
|
int len2 = strlen(serialized);
|
||||||
assert(len2 < len);
|
ASSERT(len2 < len);
|
||||||
memset(buf, 0, len);
|
memset(buf, 0, len);
|
||||||
snprintf(buf, len, "%s", serialized);
|
snprintf(buf, len, "%s", serialized);
|
||||||
taosMemoryFree(serialized);
|
taosMemoryFree(serialized);
|
||||||
|
@ -135,17 +135,17 @@ int32_t raftStoreSerialize(SRaftStore *pRaftStore, char *buf, size_t len) {
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t raftStoreDeserialize(SRaftStore *pRaftStore, char *buf, size_t len) {
|
int32_t raftStoreDeserialize(SRaftStore *pRaftStore, char *buf, size_t len) {
|
||||||
assert(pRaftStore != NULL);
|
ASSERT(pRaftStore != NULL);
|
||||||
|
|
||||||
assert(len > 0 && len <= RAFT_STORE_BLOCK_SIZE);
|
ASSERT(len > 0 && len <= RAFT_STORE_BLOCK_SIZE);
|
||||||
cJSON *pRoot = cJSON_Parse(buf);
|
cJSON *pRoot = cJSON_Parse(buf);
|
||||||
|
|
||||||
cJSON *pCurrentTerm = cJSON_GetObjectItem(pRoot, "current_term");
|
cJSON *pCurrentTerm = cJSON_GetObjectItem(pRoot, "current_term");
|
||||||
assert(cJSON_IsString(pCurrentTerm));
|
ASSERT(cJSON_IsString(pCurrentTerm));
|
||||||
sscanf(pCurrentTerm->valuestring, "%lu", &(pRaftStore->currentTerm));
|
sscanf(pCurrentTerm->valuestring, "%lu", &(pRaftStore->currentTerm));
|
||||||
|
|
||||||
cJSON *pVoteForAddr = cJSON_GetObjectItem(pRoot, "vote_for_addr");
|
cJSON *pVoteForAddr = cJSON_GetObjectItem(pRoot, "vote_for_addr");
|
||||||
assert(cJSON_IsString(pVoteForAddr));
|
ASSERT(cJSON_IsString(pVoteForAddr));
|
||||||
sscanf(pVoteForAddr->valuestring, "%lu", &(pRaftStore->voteFor.addr));
|
sscanf(pVoteForAddr->valuestring, "%lu", &(pRaftStore->voteFor.addr));
|
||||||
|
|
||||||
cJSON *pVoteForVgid = cJSON_GetObjectItem(pRoot, "vote_for_vgid");
|
cJSON *pVoteForVgid = cJSON_GetObjectItem(pRoot, "vote_for_vgid");
|
||||||
|
@ -161,7 +161,7 @@ bool raftStoreHasVoted(SRaftStore *pRaftStore) {
|
||||||
}
|
}
|
||||||
|
|
||||||
void raftStoreVote(SRaftStore *pRaftStore, SRaftId *pRaftId) {
|
void raftStoreVote(SRaftStore *pRaftStore, SRaftId *pRaftId) {
|
||||||
assert(!syncUtilEmptyId(pRaftId));
|
ASSERT(!syncUtilEmptyId(pRaftId));
|
||||||
pRaftStore->voteFor = *pRaftId;
|
pRaftStore->voteFor = *pRaftId;
|
||||||
raftStorePersist(pRaftStore);
|
raftStorePersist(pRaftStore);
|
||||||
}
|
}
|
||||||
|
@ -216,7 +216,7 @@ cJSON *raftStore2Json(SRaftStore *pRaftStore) {
|
||||||
|
|
||||||
char *raftStore2Str(SRaftStore *pRaftStore) {
|
char *raftStore2Str(SRaftStore *pRaftStore) {
|
||||||
cJSON *pJson = raftStore2Json(pRaftStore);
|
cJSON *pJson = raftStore2Json(pRaftStore);
|
||||||
char * serialized = cJSON_Print(pJson);
|
char *serialized = cJSON_Print(pJson);
|
||||||
cJSON_Delete(pJson);
|
cJSON_Delete(pJson);
|
||||||
return serialized;
|
return serialized;
|
||||||
}
|
}
|
||||||
|
|
|
@ -49,7 +49,7 @@
|
||||||
// /\ UNCHANGED <<serverVars, candidateVars, leaderVars, logVars>>
|
// /\ UNCHANGED <<serverVars, candidateVars, leaderVars, logVars>>
|
||||||
//
|
//
|
||||||
int32_t syncNodeAppendEntriesPeers(SSyncNode* pSyncNode) {
|
int32_t syncNodeAppendEntriesPeers(SSyncNode* pSyncNode) {
|
||||||
assert(pSyncNode->state == TAOS_SYNC_STATE_LEADER);
|
ASSERT(pSyncNode->state == TAOS_SYNC_STATE_LEADER);
|
||||||
|
|
||||||
syncIndexMgrLog2("==syncNodeAppendEntriesPeers== pNextIndex", pSyncNode->pNextIndex);
|
syncIndexMgrLog2("==syncNodeAppendEntriesPeers== pNextIndex", pSyncNode->pNextIndex);
|
||||||
syncIndexMgrLog2("==syncNodeAppendEntriesPeers== pMatchIndex", pSyncNode->pMatchIndex);
|
syncIndexMgrLog2("==syncNodeAppendEntriesPeers== pMatchIndex", pSyncNode->pMatchIndex);
|
||||||
|
@ -68,7 +68,7 @@ int32_t syncNodeAppendEntriesPeers(SSyncNode* pSyncNode) {
|
||||||
SyncTerm preLogTerm = 0;
|
SyncTerm preLogTerm = 0;
|
||||||
if (preLogIndex >= SYNC_INDEX_BEGIN) {
|
if (preLogIndex >= SYNC_INDEX_BEGIN) {
|
||||||
SSyncRaftEntry* pPreEntry = pSyncNode->pLogStore->getEntry(pSyncNode->pLogStore, preLogIndex);
|
SSyncRaftEntry* pPreEntry = pSyncNode->pLogStore->getEntry(pSyncNode->pLogStore, preLogIndex);
|
||||||
assert(pPreEntry != NULL);
|
ASSERT(pPreEntry != NULL);
|
||||||
|
|
||||||
preLogTerm = pPreEntry->term;
|
preLogTerm = pPreEntry->term;
|
||||||
syncEntryDestory(pPreEntry);
|
syncEntryDestory(pPreEntry);
|
||||||
|
@ -81,12 +81,12 @@ int32_t syncNodeAppendEntriesPeers(SSyncNode* pSyncNode) {
|
||||||
SSyncRaftEntry* pEntry = pSyncNode->pLogStore->getEntry(pSyncNode->pLogStore, nextIndex);
|
SSyncRaftEntry* pEntry = pSyncNode->pLogStore->getEntry(pSyncNode->pLogStore, nextIndex);
|
||||||
if (pEntry != NULL) {
|
if (pEntry != NULL) {
|
||||||
pMsg = syncAppendEntriesBuild(pEntry->bytes, pSyncNode->vgId);
|
pMsg = syncAppendEntriesBuild(pEntry->bytes, pSyncNode->vgId);
|
||||||
assert(pMsg != NULL);
|
ASSERT(pMsg != NULL);
|
||||||
|
|
||||||
// add pEntry into msg
|
// add pEntry into msg
|
||||||
uint32_t len;
|
uint32_t len;
|
||||||
char* serialized = syncEntrySerialize(pEntry, &len);
|
char* serialized = syncEntrySerialize(pEntry, &len);
|
||||||
assert(len == pEntry->bytes);
|
ASSERT(len == pEntry->bytes);
|
||||||
memcpy(pMsg->data, serialized, len);
|
memcpy(pMsg->data, serialized, len);
|
||||||
|
|
||||||
taosMemoryFree(serialized);
|
taosMemoryFree(serialized);
|
||||||
|
@ -95,10 +95,10 @@ int32_t syncNodeAppendEntriesPeers(SSyncNode* pSyncNode) {
|
||||||
} else {
|
} else {
|
||||||
// maybe overflow, send empty record
|
// maybe overflow, send empty record
|
||||||
pMsg = syncAppendEntriesBuild(0, pSyncNode->vgId);
|
pMsg = syncAppendEntriesBuild(0, pSyncNode->vgId);
|
||||||
assert(pMsg != NULL);
|
ASSERT(pMsg != NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
assert(pMsg != NULL);
|
ASSERT(pMsg != NULL);
|
||||||
pMsg->srcId = pSyncNode->myRaftId;
|
pMsg->srcId = pSyncNode->myRaftId;
|
||||||
pMsg->destId = *pDestId;
|
pMsg->destId = *pDestId;
|
||||||
pMsg->term = pSyncNode->pRaftStore->currentTerm;
|
pMsg->term = pSyncNode->pRaftStore->currentTerm;
|
||||||
|
@ -148,25 +148,32 @@ int32_t syncNodeAppendEntriesPeersSnapshot(SSyncNode* pSyncNode) {
|
||||||
|
|
||||||
SSyncRaftEntry* pEntry;
|
SSyncRaftEntry* pEntry;
|
||||||
int32_t code = pSyncNode->pLogStore->syncLogGetEntry(pSyncNode->pLogStore, nextIndex, &pEntry);
|
int32_t code = pSyncNode->pLogStore->syncLogGetEntry(pSyncNode->pLogStore, nextIndex, &pEntry);
|
||||||
ASSERT(code == 0);
|
|
||||||
|
|
||||||
if (pEntry != NULL) {
|
if (code == 0) {
|
||||||
|
ASSERT(pEntry != NULL);
|
||||||
|
|
||||||
pMsg = syncAppendEntriesBuild(pEntry->bytes, pSyncNode->vgId);
|
pMsg = syncAppendEntriesBuild(pEntry->bytes, pSyncNode->vgId);
|
||||||
ASSERT(pMsg != NULL);
|
ASSERT(pMsg != NULL);
|
||||||
|
|
||||||
// add pEntry into msg
|
// add pEntry into msg
|
||||||
uint32_t len;
|
uint32_t len;
|
||||||
char* serialized = syncEntrySerialize(pEntry, &len);
|
char* serialized = syncEntrySerialize(pEntry, &len);
|
||||||
assert(len == pEntry->bytes);
|
ASSERT(len == pEntry->bytes);
|
||||||
memcpy(pMsg->data, serialized, len);
|
memcpy(pMsg->data, serialized, len);
|
||||||
|
|
||||||
taosMemoryFree(serialized);
|
taosMemoryFree(serialized);
|
||||||
syncEntryDestory(pEntry);
|
syncEntryDestory(pEntry);
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
|
if (terrno == TSDB_CODE_WAL_LOG_NOT_EXIST) {
|
||||||
// no entry in log
|
// no entry in log
|
||||||
pMsg = syncAppendEntriesBuild(0, pSyncNode->vgId);
|
pMsg = syncAppendEntriesBuild(0, pSyncNode->vgId);
|
||||||
ASSERT(pMsg != NULL);
|
ASSERT(pMsg != NULL);
|
||||||
|
|
||||||
|
} else {
|
||||||
|
syncNodeLog3("", pSyncNode);
|
||||||
|
ASSERT(0);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// prepare msg
|
// prepare msg
|
||||||
|
|
|
@ -52,7 +52,7 @@ int32_t syncNodeOnRequestVoteCb(SSyncNode* ths, SyncRequestVote* pMsg) {
|
||||||
if (pMsg->term > ths->pRaftStore->currentTerm) {
|
if (pMsg->term > ths->pRaftStore->currentTerm) {
|
||||||
syncNodeUpdateTerm(ths, pMsg->term);
|
syncNodeUpdateTerm(ths, pMsg->term);
|
||||||
}
|
}
|
||||||
assert(pMsg->term <= ths->pRaftStore->currentTerm);
|
ASSERT(pMsg->term <= ths->pRaftStore->currentTerm);
|
||||||
|
|
||||||
bool logOK = (pMsg->lastLogTerm > ths->pLogStore->getLastTerm(ths->pLogStore)) ||
|
bool logOK = (pMsg->lastLogTerm > ths->pLogStore->getLastTerm(ths->pLogStore)) ||
|
||||||
((pMsg->lastLogTerm == ths->pLogStore->getLastTerm(ths->pLogStore)) &&
|
((pMsg->lastLogTerm == ths->pLogStore->getLastTerm(ths->pLogStore)) &&
|
||||||
|
|
|
@ -50,7 +50,7 @@ int32_t syncNodeOnRequestVoteReplyCb(SSyncNode* ths, SyncRequestVoteReply* pMsg)
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
// assert(!(pMsg->term > ths->pRaftStore->currentTerm));
|
// ASSERT(!(pMsg->term > ths->pRaftStore->currentTerm));
|
||||||
// no need this code, because if I receive reply.term, then I must have sent for that term.
|
// no need this code, because if I receive reply.term, then I must have sent for that term.
|
||||||
// if (pMsg->term > ths->pRaftStore->currentTerm) {
|
// if (pMsg->term > ths->pRaftStore->currentTerm) {
|
||||||
// syncNodeUpdateTerm(ths, pMsg->term);
|
// syncNodeUpdateTerm(ths, pMsg->term);
|
||||||
|
@ -65,7 +65,7 @@ int32_t syncNodeOnRequestVoteReplyCb(SSyncNode* ths, SyncRequestVoteReply* pMsg)
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
assert(pMsg->term == ths->pRaftStore->currentTerm);
|
ASSERT(pMsg->term == ths->pRaftStore->currentTerm);
|
||||||
|
|
||||||
// This tallies votes even when the current state is not Candidate,
|
// This tallies votes even when the current state is not Candidate,
|
||||||
// but they won't be looked at, so it doesn't matter.
|
// but they won't be looked at, so it doesn't matter.
|
||||||
|
@ -115,7 +115,7 @@ int32_t syncNodeOnRequestVoteReplySnapshotCb(SSyncNode* ths, SyncRequestVoteRepl
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
// assert(!(pMsg->term > ths->pRaftStore->currentTerm));
|
// ASSERT(!(pMsg->term > ths->pRaftStore->currentTerm));
|
||||||
// no need this code, because if I receive reply.term, then I must have sent for that term.
|
// no need this code, because if I receive reply.term, then I must have sent for that term.
|
||||||
// if (pMsg->term > ths->pRaftStore->currentTerm) {
|
// if (pMsg->term > ths->pRaftStore->currentTerm) {
|
||||||
// syncNodeUpdateTerm(ths, pMsg->term);
|
// syncNodeUpdateTerm(ths, pMsg->term);
|
||||||
|
|
|
@ -22,7 +22,7 @@ SSyncRespMgr *syncRespMgrCreate(void *data, int64_t ttl) {
|
||||||
|
|
||||||
pObj->pRespHash =
|
pObj->pRespHash =
|
||||||
taosHashInit(sizeof(uint64_t), taosGetDefaultHashFunction(TSDB_DATA_TYPE_BINARY), true, HASH_NO_LOCK);
|
taosHashInit(sizeof(uint64_t), taosGetDefaultHashFunction(TSDB_DATA_TYPE_BINARY), true, HASH_NO_LOCK);
|
||||||
assert(pObj->pRespHash != NULL);
|
ASSERT(pObj->pRespHash != NULL);
|
||||||
pObj->ttl = ttl;
|
pObj->ttl = ttl;
|
||||||
pObj->data = data;
|
pObj->data = data;
|
||||||
pObj->seqNum = 0;
|
pObj->seqNum = 0;
|
||||||
|
|
|
@ -73,41 +73,49 @@ void snapshotSenderStart(SSyncSnapshotSender *pSender, SSnapshot snapshot, void
|
||||||
pSender->seq = SYNC_SNAPSHOT_SEQ_BEGIN;
|
pSender->seq = SYNC_SNAPSHOT_SEQ_BEGIN;
|
||||||
pSender->ack = SYNC_SNAPSHOT_SEQ_INVALID;
|
pSender->ack = SYNC_SNAPSHOT_SEQ_INVALID;
|
||||||
|
|
||||||
// open snapshot reader
|
// init snapshot and reader
|
||||||
ASSERT(pSender->pReader == NULL);
|
ASSERT(pSender->pReader == NULL);
|
||||||
pSender->pReader = pReader;
|
pSender->pReader = pReader;
|
||||||
pSender->snapshot = snapshot;
|
pSender->snapshot = snapshot;
|
||||||
|
|
||||||
/*
|
|
||||||
// open snapshot reader
|
|
||||||
ASSERT(pSender->pReader == NULL);
|
|
||||||
int32_t ret = pSender->pSyncNode->pFsm->FpSnapshotStartRead(pSender->pSyncNode->pFsm, &(pSender->pReader));
|
|
||||||
ASSERT(ret == 0);
|
|
||||||
|
|
||||||
// get current snapshot info
|
|
||||||
pSender->pSyncNode->pFsm->FpGetSnapshotInfo(pSender->pSyncNode->pFsm, &(pSender->snapshot));
|
|
||||||
*/
|
|
||||||
|
|
||||||
if (pSender->pCurrentBlock != NULL) {
|
if (pSender->pCurrentBlock != NULL) {
|
||||||
taosMemoryFree(pSender->pCurrentBlock);
|
taosMemoryFree(pSender->pCurrentBlock);
|
||||||
}
|
}
|
||||||
|
|
||||||
pSender->blockLen = 0;
|
pSender->blockLen = 0;
|
||||||
|
|
||||||
if (pSender->snapshot.lastConfigIndex != SYNC_INDEX_INVALID) {
|
if (pSender->snapshot.lastConfigIndex != SYNC_INDEX_INVALID) {
|
||||||
SSyncRaftEntry *pEntry =
|
int32_t code = 0;
|
||||||
pSender->pSyncNode->pLogStore->getEntry(pSender->pSyncNode->pLogStore, pSender->snapshot.lastConfigIndex);
|
SSyncRaftEntry *pEntry = NULL;
|
||||||
|
code = pSender->pSyncNode->pLogStore->syncLogGetEntry(pSender->pSyncNode->pLogStore,
|
||||||
|
pSender->snapshot.lastConfigIndex, &pEntry);
|
||||||
|
|
||||||
|
bool getLastConfig = false;
|
||||||
|
if (code == 0) {
|
||||||
ASSERT(pEntry != NULL);
|
ASSERT(pEntry != NULL);
|
||||||
|
|
||||||
SRpcMsg rpcMsg;
|
SRpcMsg rpcMsg;
|
||||||
syncEntry2OriginalRpc(pEntry, &rpcMsg);
|
syncEntry2OriginalRpc(pEntry, &rpcMsg);
|
||||||
|
|
||||||
SSyncCfg lastConfig;
|
SSyncCfg lastConfig;
|
||||||
int32_t ret = syncCfgFromStr(rpcMsg.pCont, &lastConfig);
|
int32_t ret = syncCfgFromStr(rpcMsg.pCont, &lastConfig);
|
||||||
ASSERT(ret == 0);
|
ASSERT(ret == 0);
|
||||||
pSender->lastConfig = lastConfig;
|
pSender->lastConfig = lastConfig;
|
||||||
|
getLastConfig = true;
|
||||||
|
|
||||||
rpcFreeCont(rpcMsg.pCont);
|
rpcFreeCont(rpcMsg.pCont);
|
||||||
syncEntryDestory(pEntry);
|
syncEntryDestory(pEntry);
|
||||||
|
} else {
|
||||||
|
if (pSender->snapshot.lastConfigIndex == pSender->pSyncNode->pRaftCfg->lastConfigIndex) {
|
||||||
|
sTrace("vgId:%d sync sender get cfg from local", pSender->pSyncNode->vgId);
|
||||||
|
pSender->lastConfig = pSender->pSyncNode->pRaftCfg->cfg;
|
||||||
|
getLastConfig = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!getLastConfig) {
|
||||||
|
syncNodeLog3("", pSender->pSyncNode);
|
||||||
|
ASSERT(0);
|
||||||
|
}
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
memset(&(pSender->lastConfig), 0, sizeof(SSyncCfg));
|
memset(&(pSender->lastConfig), 0, sizeof(SSyncCfg));
|
||||||
|
|
|
@ -86,7 +86,7 @@ void syncUtilraftId2EpSet(const SRaftId* raftId, SEpSet* pEpSet) {
|
||||||
|
|
||||||
void syncUtilnodeInfo2raftId(const SNodeInfo* pNodeInfo, SyncGroupId vgId, SRaftId* raftId) {
|
void syncUtilnodeInfo2raftId(const SNodeInfo* pNodeInfo, SyncGroupId vgId, SRaftId* raftId) {
|
||||||
uint32_t ipv4 = taosGetIpv4FromFqdn(pNodeInfo->nodeFqdn);
|
uint32_t ipv4 = taosGetIpv4FromFqdn(pNodeInfo->nodeFqdn);
|
||||||
assert(ipv4 != 0xFFFFFFFF);
|
ASSERT(ipv4 != 0xFFFFFFFF);
|
||||||
char ipbuf[128] = {0};
|
char ipbuf[128] = {0};
|
||||||
tinet_ntoa(ipbuf, ipv4);
|
tinet_ntoa(ipbuf, ipv4);
|
||||||
raftId->addr = syncUtilAddr2U64(ipbuf, pNodeInfo->nodePort);
|
raftId->addr = syncUtilAddr2U64(ipbuf, pNodeInfo->nodePort);
|
||||||
|
@ -124,7 +124,7 @@ void syncUtilbufCopyDeep(const SSyncBuffer* src, SSyncBuffer* dest) {
|
||||||
int32_t syncUtilRand(int32_t max) { return taosRand() % max; }
|
int32_t syncUtilRand(int32_t max) { return taosRand() % max; }
|
||||||
|
|
||||||
int32_t syncUtilElectRandomMS(int32_t min, int32_t max) {
|
int32_t syncUtilElectRandomMS(int32_t min, int32_t max) {
|
||||||
assert(min > 0 && max > 0 && max >= min);
|
ASSERT(min > 0 && max > 0 && max >= min);
|
||||||
return min + syncUtilRand(max - min);
|
return min + syncUtilRand(max - min);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -201,7 +201,7 @@ bool syncUtilCanPrint(char c) {
|
||||||
|
|
||||||
char* syncUtilprintBin(char* ptr, uint32_t len) {
|
char* syncUtilprintBin(char* ptr, uint32_t len) {
|
||||||
char* s = taosMemoryMalloc(len + 1);
|
char* s = taosMemoryMalloc(len + 1);
|
||||||
assert(s != NULL);
|
ASSERT(s != NULL);
|
||||||
memset(s, 0, len + 1);
|
memset(s, 0, len + 1);
|
||||||
memcpy(s, ptr, len);
|
memcpy(s, ptr, len);
|
||||||
|
|
||||||
|
@ -216,7 +216,7 @@ char* syncUtilprintBin(char* ptr, uint32_t len) {
|
||||||
char* syncUtilprintBin2(char* ptr, uint32_t len) {
|
char* syncUtilprintBin2(char* ptr, uint32_t len) {
|
||||||
uint32_t len2 = len * 4 + 1;
|
uint32_t len2 = len * 4 + 1;
|
||||||
char* s = taosMemoryMalloc(len2);
|
char* s = taosMemoryMalloc(len2);
|
||||||
assert(s != NULL);
|
ASSERT(s != NULL);
|
||||||
memset(s, 0, len2);
|
memset(s, 0, len2);
|
||||||
|
|
||||||
char* p = s;
|
char* p = s;
|
||||||
|
|
|
@ -24,7 +24,7 @@ static void voteGrantedClearVotes(SVotesGranted *pVotesGranted) {
|
||||||
|
|
||||||
SVotesGranted *voteGrantedCreate(SSyncNode *pSyncNode) {
|
SVotesGranted *voteGrantedCreate(SSyncNode *pSyncNode) {
|
||||||
SVotesGranted *pVotesGranted = taosMemoryMalloc(sizeof(SVotesGranted));
|
SVotesGranted *pVotesGranted = taosMemoryMalloc(sizeof(SVotesGranted));
|
||||||
assert(pVotesGranted != NULL);
|
ASSERT(pVotesGranted != NULL);
|
||||||
memset(pVotesGranted, 0, sizeof(SVotesGranted));
|
memset(pVotesGranted, 0, sizeof(SVotesGranted));
|
||||||
|
|
||||||
pVotesGranted->replicas = &(pSyncNode->replicasId);
|
pVotesGranted->replicas = &(pSyncNode->replicasId);
|
||||||
|
@ -62,9 +62,9 @@ bool voteGrantedMajority(SVotesGranted *pVotesGranted) {
|
||||||
}
|
}
|
||||||
|
|
||||||
void voteGrantedVote(SVotesGranted *pVotesGranted, SyncRequestVoteReply *pMsg) {
|
void voteGrantedVote(SVotesGranted *pVotesGranted, SyncRequestVoteReply *pMsg) {
|
||||||
assert(pMsg->voteGranted == true);
|
ASSERT(pMsg->voteGranted == true);
|
||||||
assert(pMsg->term == pVotesGranted->term);
|
ASSERT(pMsg->term == pVotesGranted->term);
|
||||||
assert(syncUtilSameId(&pVotesGranted->pSyncNode->myRaftId, &pMsg->destId));
|
ASSERT(syncUtilSameId(&pVotesGranted->pSyncNode->myRaftId, &pMsg->destId));
|
||||||
|
|
||||||
int j = -1;
|
int j = -1;
|
||||||
for (int i = 0; i < pVotesGranted->replicaNum; ++i) {
|
for (int i = 0; i < pVotesGranted->replicaNum; ++i) {
|
||||||
|
@ -73,14 +73,14 @@ void voteGrantedVote(SVotesGranted *pVotesGranted, SyncRequestVoteReply *pMsg) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
assert(j != -1);
|
ASSERT(j != -1);
|
||||||
assert(j >= 0 && j < pVotesGranted->replicaNum);
|
ASSERT(j >= 0 && j < pVotesGranted->replicaNum);
|
||||||
|
|
||||||
if (pVotesGranted->isGranted[j] != true) {
|
if (pVotesGranted->isGranted[j] != true) {
|
||||||
++(pVotesGranted->votes);
|
++(pVotesGranted->votes);
|
||||||
pVotesGranted->isGranted[j] = true;
|
pVotesGranted->isGranted[j] = true;
|
||||||
}
|
}
|
||||||
assert(pVotesGranted->votes <= pVotesGranted->replicaNum);
|
ASSERT(pVotesGranted->votes <= pVotesGranted->replicaNum);
|
||||||
}
|
}
|
||||||
|
|
||||||
void voteGrantedReset(SVotesGranted *pVotesGranted, SyncTerm term) {
|
void voteGrantedReset(SVotesGranted *pVotesGranted, SyncTerm term) {
|
||||||
|
@ -127,7 +127,7 @@ cJSON *voteGranted2Json(SVotesGranted *pVotesGranted) {
|
||||||
|
|
||||||
char *voteGranted2Str(SVotesGranted *pVotesGranted) {
|
char *voteGranted2Str(SVotesGranted *pVotesGranted) {
|
||||||
cJSON *pJson = voteGranted2Json(pVotesGranted);
|
cJSON *pJson = voteGranted2Json(pVotesGranted);
|
||||||
char * serialized = cJSON_Print(pJson);
|
char *serialized = cJSON_Print(pJson);
|
||||||
cJSON_Delete(pJson);
|
cJSON_Delete(pJson);
|
||||||
return serialized;
|
return serialized;
|
||||||
}
|
}
|
||||||
|
@ -162,7 +162,7 @@ void voteGrantedLog2(char *s, SVotesGranted *pObj) {
|
||||||
// SVotesRespond -----------------------------
|
// SVotesRespond -----------------------------
|
||||||
SVotesRespond *votesRespondCreate(SSyncNode *pSyncNode) {
|
SVotesRespond *votesRespondCreate(SSyncNode *pSyncNode) {
|
||||||
SVotesRespond *pVotesRespond = taosMemoryMalloc(sizeof(SVotesRespond));
|
SVotesRespond *pVotesRespond = taosMemoryMalloc(sizeof(SVotesRespond));
|
||||||
assert(pVotesRespond != NULL);
|
ASSERT(pVotesRespond != NULL);
|
||||||
memset(pVotesRespond, 0, sizeof(SVotesRespond));
|
memset(pVotesRespond, 0, sizeof(SVotesRespond));
|
||||||
|
|
||||||
pVotesRespond->replicas = &(pSyncNode->replicasId);
|
pVotesRespond->replicas = &(pSyncNode->replicasId);
|
||||||
|
@ -198,15 +198,15 @@ bool votesResponded(SVotesRespond *pVotesRespond, const SRaftId *pRaftId) {
|
||||||
}
|
}
|
||||||
|
|
||||||
void votesRespondAdd(SVotesRespond *pVotesRespond, const SyncRequestVoteReply *pMsg) {
|
void votesRespondAdd(SVotesRespond *pVotesRespond, const SyncRequestVoteReply *pMsg) {
|
||||||
assert(pVotesRespond->term == pMsg->term);
|
ASSERT(pVotesRespond->term == pMsg->term);
|
||||||
for (int i = 0; i < pVotesRespond->replicaNum; ++i) {
|
for (int i = 0; i < pVotesRespond->replicaNum; ++i) {
|
||||||
if (syncUtilSameId(&((*(pVotesRespond->replicas))[i]), &pMsg->srcId)) {
|
if (syncUtilSameId(&((*(pVotesRespond->replicas))[i]), &pMsg->srcId)) {
|
||||||
// assert(pVotesRespond->isRespond[i] == false);
|
// ASSERT(pVotesRespond->isRespond[i] == false);
|
||||||
pVotesRespond->isRespond[i] = true;
|
pVotesRespond->isRespond[i] = true;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
assert(0);
|
ASSERT(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
void votesRespondReset(SVotesRespond *pVotesRespond, SyncTerm term) {
|
void votesRespondReset(SVotesRespond *pVotesRespond, SyncTerm term) {
|
||||||
|
@ -256,7 +256,7 @@ cJSON *votesRespond2Json(SVotesRespond *pVotesRespond) {
|
||||||
|
|
||||||
char *votesRespond2Str(SVotesRespond *pVotesRespond) {
|
char *votesRespond2Str(SVotesRespond *pVotesRespond) {
|
||||||
cJSON *pJson = votesRespond2Json(pVotesRespond);
|
cJSON *pJson = votesRespond2Json(pVotesRespond);
|
||||||
char * serialized = cJSON_Print(pJson);
|
char *serialized = cJSON_Print(pJson);
|
||||||
cJSON_Delete(pJson);
|
cJSON_Delete(pJson);
|
||||||
return serialized;
|
return serialized;
|
||||||
}
|
}
|
||||||
|
|
|
@ -34,6 +34,7 @@ add_executable(syncWriteTest "")
|
||||||
add_executable(syncReplicateTest "")
|
add_executable(syncReplicateTest "")
|
||||||
add_executable(syncRefTest "")
|
add_executable(syncRefTest "")
|
||||||
add_executable(syncLogStoreCheck "")
|
add_executable(syncLogStoreCheck "")
|
||||||
|
add_executable(syncLogStoreCheck2 "")
|
||||||
add_executable(syncRaftCfgTest "")
|
add_executable(syncRaftCfgTest "")
|
||||||
add_executable(syncRespMgrTest "")
|
add_executable(syncRespMgrTest "")
|
||||||
add_executable(syncSnapshotTest "")
|
add_executable(syncSnapshotTest "")
|
||||||
|
@ -196,6 +197,10 @@ target_sources(syncLogStoreCheck
|
||||||
PRIVATE
|
PRIVATE
|
||||||
"syncLogStoreCheck.cpp"
|
"syncLogStoreCheck.cpp"
|
||||||
)
|
)
|
||||||
|
target_sources(syncLogStoreCheck2
|
||||||
|
PRIVATE
|
||||||
|
"syncLogStoreCheck2.cpp"
|
||||||
|
)
|
||||||
target_sources(syncRaftCfgTest
|
target_sources(syncRaftCfgTest
|
||||||
PRIVATE
|
PRIVATE
|
||||||
"syncRaftCfgTest.cpp"
|
"syncRaftCfgTest.cpp"
|
||||||
|
@ -442,6 +447,11 @@ target_include_directories(syncLogStoreCheck
|
||||||
"${TD_SOURCE_DIR}/include/libs/sync"
|
"${TD_SOURCE_DIR}/include/libs/sync"
|
||||||
"${CMAKE_CURRENT_SOURCE_DIR}/../inc"
|
"${CMAKE_CURRENT_SOURCE_DIR}/../inc"
|
||||||
)
|
)
|
||||||
|
target_include_directories(syncLogStoreCheck2
|
||||||
|
PUBLIC
|
||||||
|
"${TD_SOURCE_DIR}/include/libs/sync"
|
||||||
|
"${CMAKE_CURRENT_SOURCE_DIR}/../inc"
|
||||||
|
)
|
||||||
target_include_directories(syncRaftCfgTest
|
target_include_directories(syncRaftCfgTest
|
||||||
PUBLIC
|
PUBLIC
|
||||||
"${TD_SOURCE_DIR}/include/libs/sync"
|
"${TD_SOURCE_DIR}/include/libs/sync"
|
||||||
|
@ -668,6 +678,10 @@ target_link_libraries(syncLogStoreCheck
|
||||||
sync
|
sync
|
||||||
gtest_main
|
gtest_main
|
||||||
)
|
)
|
||||||
|
target_link_libraries(syncLogStoreCheck2
|
||||||
|
sync
|
||||||
|
gtest_main
|
||||||
|
)
|
||||||
target_link_libraries(syncRaftCfgTest
|
target_link_libraries(syncRaftCfgTest
|
||||||
sync
|
sync
|
||||||
gtest_main
|
gtest_main
|
||||||
|
|
|
@ -0,0 +1,76 @@
|
||||||
|
#include <gtest/gtest.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include "syncEnv.h"
|
||||||
|
#include "syncIO.h"
|
||||||
|
#include "syncInt.h"
|
||||||
|
#include "syncRaftLog.h"
|
||||||
|
#include "syncRaftStore.h"
|
||||||
|
#include "syncUtil.h"
|
||||||
|
#include "wal.h"
|
||||||
|
|
||||||
|
void logTest() {
|
||||||
|
sTrace("--- sync log test: trace");
|
||||||
|
sDebug("--- sync log test: debug");
|
||||||
|
sInfo("--- sync log test: info");
|
||||||
|
sWarn("--- sync log test: warn");
|
||||||
|
sError("--- sync log test: error");
|
||||||
|
sFatal("--- sync log test: fatal");
|
||||||
|
}
|
||||||
|
|
||||||
|
void init() {
|
||||||
|
int code = walInit();
|
||||||
|
assert(code == 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
void cleanup() { walCleanUp(); }
|
||||||
|
|
||||||
|
SWal* createWal(char* path, int32_t vgId) {
|
||||||
|
SWalCfg walCfg;
|
||||||
|
memset(&walCfg, 0, sizeof(SWalCfg));
|
||||||
|
walCfg.vgId = vgId;
|
||||||
|
walCfg.fsyncPeriod = 1000;
|
||||||
|
walCfg.retentionPeriod = 1000;
|
||||||
|
walCfg.rollPeriod = 1000;
|
||||||
|
walCfg.retentionSize = 1000;
|
||||||
|
walCfg.segSize = 1000;
|
||||||
|
walCfg.level = TAOS_WAL_FSYNC;
|
||||||
|
SWal* pWal = walOpen(path, &walCfg);
|
||||||
|
assert(pWal != NULL);
|
||||||
|
return pWal;
|
||||||
|
}
|
||||||
|
|
||||||
|
SSyncNode* createSyncNode(SWal* pWal) {
|
||||||
|
SSyncNode* pSyncNode = (SSyncNode*)taosMemoryMalloc(sizeof(SSyncNode));
|
||||||
|
memset(pSyncNode, 0, sizeof(SSyncNode));
|
||||||
|
pSyncNode->pWal = pWal;
|
||||||
|
return pSyncNode;
|
||||||
|
}
|
||||||
|
|
||||||
|
void usage(char* exe) { printf("usage: %s path vgId \n", exe); }
|
||||||
|
|
||||||
|
int main(int argc, char** argv) {
|
||||||
|
if (argc != 3) {
|
||||||
|
usage(argv[0]);
|
||||||
|
exit(-1);
|
||||||
|
}
|
||||||
|
char* path = argv[1];
|
||||||
|
int32_t vgId = atoi(argv[2]);
|
||||||
|
|
||||||
|
init();
|
||||||
|
SWal* pWal = createWal(path, vgId);
|
||||||
|
assert(pWal != NULL);
|
||||||
|
SSyncNode* pSyncNode = createSyncNode(pWal);
|
||||||
|
assert(pSyncNode != NULL);
|
||||||
|
|
||||||
|
SSyncLogStore* pLog = logStoreCreate(pSyncNode);
|
||||||
|
assert(pLog != NULL);
|
||||||
|
|
||||||
|
logStorePrint2((char*)"==syncLogStoreCheck==", pLog);
|
||||||
|
|
||||||
|
walClose(pWal);
|
||||||
|
logStoreDestory(pLog);
|
||||||
|
taosMemoryFree(pSyncNode);
|
||||||
|
|
||||||
|
cleanup();
|
||||||
|
return 0;
|
||||||
|
}
|
|
@ -69,6 +69,7 @@ void test1() {
|
||||||
init();
|
init();
|
||||||
pLogStore = logStoreCreate(pSyncNode);
|
pLogStore = logStoreCreate(pSyncNode);
|
||||||
assert(pLogStore);
|
assert(pLogStore);
|
||||||
|
pSyncNode->pLogStore = pLogStore;
|
||||||
logStoreLog2((char*)"\n\n\ntest1 ----- ", pLogStore);
|
logStoreLog2((char*)"\n\n\ntest1 ----- ", pLogStore);
|
||||||
|
|
||||||
if (gAssert) {
|
if (gAssert) {
|
||||||
|
@ -88,6 +89,7 @@ void test1() {
|
||||||
init();
|
init();
|
||||||
pLogStore = logStoreCreate(pSyncNode);
|
pLogStore = logStoreCreate(pSyncNode);
|
||||||
assert(pLogStore);
|
assert(pLogStore);
|
||||||
|
pSyncNode->pLogStore = pLogStore;
|
||||||
logStoreLog2((char*)"\n\n\ntest1 restart ----- ", pLogStore);
|
logStoreLog2((char*)"\n\n\ntest1 restart ----- ", pLogStore);
|
||||||
|
|
||||||
if (gAssert) {
|
if (gAssert) {
|
||||||
|
@ -110,6 +112,7 @@ void test2() {
|
||||||
init();
|
init();
|
||||||
pLogStore = logStoreCreate(pSyncNode);
|
pLogStore = logStoreCreate(pSyncNode);
|
||||||
assert(pLogStore);
|
assert(pLogStore);
|
||||||
|
pSyncNode->pLogStore = pLogStore;
|
||||||
pLogStore->syncLogSetBeginIndex(pLogStore, 5);
|
pLogStore->syncLogSetBeginIndex(pLogStore, 5);
|
||||||
logStoreLog2((char*)"\n\n\ntest2 ----- ", pLogStore);
|
logStoreLog2((char*)"\n\n\ntest2 ----- ", pLogStore);
|
||||||
|
|
||||||
|
@ -130,6 +133,7 @@ void test2() {
|
||||||
init();
|
init();
|
||||||
pLogStore = logStoreCreate(pSyncNode);
|
pLogStore = logStoreCreate(pSyncNode);
|
||||||
assert(pLogStore);
|
assert(pLogStore);
|
||||||
|
pSyncNode->pLogStore = pLogStore;
|
||||||
logStoreLog2((char*)"\n\n\ntest2 restart ----- ", pLogStore);
|
logStoreLog2((char*)"\n\n\ntest2 restart ----- ", pLogStore);
|
||||||
|
|
||||||
if (gAssert) {
|
if (gAssert) {
|
||||||
|
@ -152,6 +156,7 @@ void test3() {
|
||||||
init();
|
init();
|
||||||
pLogStore = logStoreCreate(pSyncNode);
|
pLogStore = logStoreCreate(pSyncNode);
|
||||||
assert(pLogStore);
|
assert(pLogStore);
|
||||||
|
pSyncNode->pLogStore = pLogStore;
|
||||||
logStoreLog2((char*)"\n\n\ntest3 ----- ", pLogStore);
|
logStoreLog2((char*)"\n\n\ntest3 ----- ", pLogStore);
|
||||||
|
|
||||||
if (gAssert) {
|
if (gAssert) {
|
||||||
|
@ -198,6 +203,7 @@ void test3() {
|
||||||
init();
|
init();
|
||||||
pLogStore = logStoreCreate(pSyncNode);
|
pLogStore = logStoreCreate(pSyncNode);
|
||||||
assert(pLogStore);
|
assert(pLogStore);
|
||||||
|
pSyncNode->pLogStore = pLogStore;
|
||||||
logStoreLog2((char*)"\n\n\ntest3 restart ----- ", pLogStore);
|
logStoreLog2((char*)"\n\n\ntest3 restart ----- ", pLogStore);
|
||||||
|
|
||||||
if (gAssert) {
|
if (gAssert) {
|
||||||
|
@ -220,6 +226,7 @@ void test4() {
|
||||||
init();
|
init();
|
||||||
pLogStore = logStoreCreate(pSyncNode);
|
pLogStore = logStoreCreate(pSyncNode);
|
||||||
assert(pLogStore);
|
assert(pLogStore);
|
||||||
|
pSyncNode->pLogStore = pLogStore;
|
||||||
logStoreLog2((char*)"\n\n\ntest4 ----- ", pLogStore);
|
logStoreLog2((char*)"\n\n\ntest4 ----- ", pLogStore);
|
||||||
pLogStore->syncLogSetBeginIndex(pLogStore, 5);
|
pLogStore->syncLogSetBeginIndex(pLogStore, 5);
|
||||||
|
|
||||||
|
@ -257,6 +264,7 @@ void test4() {
|
||||||
init();
|
init();
|
||||||
pLogStore = logStoreCreate(pSyncNode);
|
pLogStore = logStoreCreate(pSyncNode);
|
||||||
assert(pLogStore);
|
assert(pLogStore);
|
||||||
|
pSyncNode->pLogStore = pLogStore;
|
||||||
logStoreLog2((char*)"\n\n\ntest4 restart ----- ", pLogStore);
|
logStoreLog2((char*)"\n\n\ntest4 restart ----- ", pLogStore);
|
||||||
|
|
||||||
if (gAssert) {
|
if (gAssert) {
|
||||||
|
@ -279,6 +287,7 @@ void test5() {
|
||||||
init();
|
init();
|
||||||
pLogStore = logStoreCreate(pSyncNode);
|
pLogStore = logStoreCreate(pSyncNode);
|
||||||
assert(pLogStore);
|
assert(pLogStore);
|
||||||
|
pSyncNode->pLogStore = pLogStore;
|
||||||
logStoreLog2((char*)"\n\n\ntest5 ----- ", pLogStore);
|
logStoreLog2((char*)"\n\n\ntest5 ----- ", pLogStore);
|
||||||
pLogStore->syncLogSetBeginIndex(pLogStore, 5);
|
pLogStore->syncLogSetBeginIndex(pLogStore, 5);
|
||||||
|
|
||||||
|
@ -329,6 +338,7 @@ void test5() {
|
||||||
init();
|
init();
|
||||||
pLogStore = logStoreCreate(pSyncNode);
|
pLogStore = logStoreCreate(pSyncNode);
|
||||||
assert(pLogStore);
|
assert(pLogStore);
|
||||||
|
pSyncNode->pLogStore = pLogStore;
|
||||||
logStoreLog2((char*)"\n\n\ntest5 restart ----- ", pLogStore);
|
logStoreLog2((char*)"\n\n\ntest5 restart ----- ", pLogStore);
|
||||||
|
|
||||||
if (gAssert) {
|
if (gAssert) {
|
||||||
|
@ -351,6 +361,7 @@ void test6() {
|
||||||
init();
|
init();
|
||||||
pLogStore = logStoreCreate(pSyncNode);
|
pLogStore = logStoreCreate(pSyncNode);
|
||||||
assert(pLogStore);
|
assert(pLogStore);
|
||||||
|
pSyncNode->pLogStore = pLogStore;
|
||||||
logStoreLog2((char*)"\n\n\ntest6 ----- ", pLogStore);
|
logStoreLog2((char*)"\n\n\ntest6 ----- ", pLogStore);
|
||||||
pLogStore->syncLogSetBeginIndex(pLogStore, 5);
|
pLogStore->syncLogSetBeginIndex(pLogStore, 5);
|
||||||
|
|
||||||
|
@ -401,6 +412,7 @@ void test6() {
|
||||||
init();
|
init();
|
||||||
pLogStore = logStoreCreate(pSyncNode);
|
pLogStore = logStoreCreate(pSyncNode);
|
||||||
assert(pLogStore);
|
assert(pLogStore);
|
||||||
|
pSyncNode->pLogStore = pLogStore;
|
||||||
logStoreLog2((char*)"\n\n\ntest6 restart ----- ", pLogStore);
|
logStoreLog2((char*)"\n\n\ntest6 restart ----- ", pLogStore);
|
||||||
|
|
||||||
if (gAssert) {
|
if (gAssert) {
|
||||||
|
|
|
@ -56,14 +56,9 @@ typedef struct {
|
||||||
} SIntHdr;
|
} SIntHdr;
|
||||||
#pragma pack(pop)
|
#pragma pack(pop)
|
||||||
|
|
||||||
typedef struct {
|
|
||||||
u8 flags;
|
|
||||||
SBTree *pBt;
|
|
||||||
} SBtreeInitPageArg;
|
|
||||||
|
|
||||||
static int tdbDefaultKeyCmprFn(const void *pKey1, int keyLen1, const void *pKey2, int keyLen2);
|
static int tdbDefaultKeyCmprFn(const void *pKey1, int keyLen1, const void *pKey2, int keyLen2);
|
||||||
static int tdbBtreeOpenImpl(SBTree *pBt);
|
static int tdbBtreeOpenImpl(SBTree *pBt);
|
||||||
static int tdbBtreeInitPage(SPage *pPage, void *arg, int init);
|
//static int tdbBtreeInitPage(SPage *pPage, void *arg, int init);
|
||||||
static int tdbBtreeEncodeCell(SPage *pPage, const void *pKey, int kLen, const void *pVal, int vLen, SCell *pCell,
|
static int tdbBtreeEncodeCell(SPage *pPage, const void *pKey, int kLen, const void *pVal, int vLen, SCell *pCell,
|
||||||
int *szCell, TXN *pTxn, SBTree *pBt);
|
int *szCell, TXN *pTxn, SBTree *pBt);
|
||||||
static int tdbBtreeDecodeCell(SPage *pPage, const SCell *pCell, SCellDecoder *pDecoder, TXN *pTxn, SBTree *pBt);
|
static int tdbBtreeDecodeCell(SPage *pPage, const SCell *pCell, SCellDecoder *pDecoder, TXN *pTxn, SBTree *pBt);
|
||||||
|
@ -348,7 +343,7 @@ static int tdbBtreeOpenImpl(SBTree *pBt) {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int tdbBtreeInitPage(SPage *pPage, void *arg, int init) {
|
int tdbBtreeInitPage(SPage *pPage, void *arg, int init) {
|
||||||
SBTree *pBt;
|
SBTree *pBt;
|
||||||
u8 flags;
|
u8 flags;
|
||||||
u8 leaf;
|
u8 leaf;
|
||||||
|
|
|
@ -425,3 +425,70 @@ static int tdbPagerWritePageToDB(SPager *pPager, SPage *pPage) {
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int tdbPagerRestore(SPager *pPager, SBTree *pBt) {
|
||||||
|
int ret = 0;
|
||||||
|
SPgno journalSize = 0;
|
||||||
|
u8 *pageBuf = NULL;
|
||||||
|
|
||||||
|
tdb_fd_t jfd = tdbOsOpen(pPager->jFileName, TDB_O_RDWR, 0755);
|
||||||
|
if (jfd == NULL) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
ret = tdbGetFileSize(jfd, pPager->pageSize, &journalSize);
|
||||||
|
if (ret < 0) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
pageBuf = tdbOsCalloc(1, pPager->pageSize);
|
||||||
|
if (pageBuf == NULL) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
TXN txn;
|
||||||
|
tdbTxnOpen(&txn, 0, tdbDefaultMalloc, tdbDefaultFree, NULL, 0);
|
||||||
|
SBtreeInitPageArg iArg;
|
||||||
|
iArg.pBt = pBt;
|
||||||
|
iArg.flags = 0;
|
||||||
|
|
||||||
|
for (int pgIndex = 0; pgIndex < journalSize; ++pgIndex) {
|
||||||
|
// read pgno & the page from journal
|
||||||
|
SPgno pgno;
|
||||||
|
SPage *pPage;
|
||||||
|
|
||||||
|
int ret = tdbOsRead(jfd, &pgno, sizeof(pgno));
|
||||||
|
if (ret < 0) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
ret = tdbOsRead(jfd, pageBuf, pPager->pageSize);
|
||||||
|
if (ret < 0) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
ret = tdbPagerFetchPage(pPager, &pgno, &pPage, tdbBtreeInitPage, &iArg, &txn);
|
||||||
|
if (ret < 0) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
// write the page to db
|
||||||
|
ret = tdbPagerWritePageToDB(pPager, pPage);
|
||||||
|
if (ret < 0) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
tdbPCacheRelease(pPager->pCache, pPage, &txn);
|
||||||
|
}
|
||||||
|
|
||||||
|
tdbOsFSync(pPager->fd);
|
||||||
|
|
||||||
|
tdbTxnClose(&txn);
|
||||||
|
|
||||||
|
tdbOsFree(pageBuf);
|
||||||
|
|
||||||
|
tdbOsClose(jfd);
|
||||||
|
tdbOsRemove(pPager->jFileName);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
|
@ -61,6 +61,11 @@ int tdbTbOpen(const char *tbname, int keyLen, int valLen, tdb_cmpr_fn_t keyCmprF
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ret = tdbPagerRestore(pPager, pTb->pBt);
|
||||||
|
if (ret < 0) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
*ppTb = pTb;
|
*ppTb = pTb;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
|
@ -158,6 +158,13 @@ int tdbBtreeUpsert(SBTree *pBt, const void *pKey, int nKey, const void *pData, i
|
||||||
int tdbBtreeGet(SBTree *pBt, const void *pKey, int kLen, void **ppVal, int *vLen);
|
int tdbBtreeGet(SBTree *pBt, const void *pKey, int kLen, void **ppVal, int *vLen);
|
||||||
int tdbBtreePGet(SBTree *pBt, const void *pKey, int kLen, void **ppKey, int *pkLen, void **ppVal, int *vLen);
|
int tdbBtreePGet(SBTree *pBt, const void *pKey, int kLen, void **ppKey, int *pkLen, void **ppVal, int *vLen);
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
u8 flags;
|
||||||
|
SBTree *pBt;
|
||||||
|
} SBtreeInitPageArg;
|
||||||
|
|
||||||
|
int tdbBtreeInitPage(SPage *pPage, void *arg, int init);
|
||||||
|
|
||||||
// SBTC
|
// SBTC
|
||||||
int tdbBtcOpen(SBTC *pBtc, SBTree *pBt, TXN *pTxn);
|
int tdbBtcOpen(SBTC *pBtc, SBTree *pBt, TXN *pTxn);
|
||||||
int tdbBtcClose(SBTC *pBtc);
|
int tdbBtcClose(SBTC *pBtc);
|
||||||
|
@ -185,6 +192,7 @@ int tdbPagerFetchPage(SPager *pPager, SPgno *ppgno, SPage **ppPage, int (*initP
|
||||||
TXN *pTxn);
|
TXN *pTxn);
|
||||||
void tdbPagerReturnPage(SPager *pPager, SPage *pPage, TXN *pTxn);
|
void tdbPagerReturnPage(SPager *pPager, SPage *pPage, TXN *pTxn);
|
||||||
int tdbPagerAllocPage(SPager *pPager, SPgno *ppgno);
|
int tdbPagerAllocPage(SPager *pPager, SPgno *ppgno);
|
||||||
|
int tdbPagerRestore(SPager *pPager, SBTree *pBt);
|
||||||
|
|
||||||
// tdbPCache.c ====================================
|
// tdbPCache.c ====================================
|
||||||
#define TDB_PCACHE_PAGE \
|
#define TDB_PCACHE_PAGE \
|
||||||
|
|
|
@ -259,6 +259,12 @@ int32_t walReadWithHandle_s(SWalReadHandle *pRead, int64_t ver, SWalReadHead **p
|
||||||
|
|
||||||
int32_t walReadWithHandle(SWalReadHandle *pRead, int64_t ver) {
|
int32_t walReadWithHandle(SWalReadHandle *pRead, int64_t ver) {
|
||||||
int64_t code;
|
int64_t code;
|
||||||
|
|
||||||
|
if (pRead->pWal->vers.firstVer == -1) {
|
||||||
|
terrno = TSDB_CODE_WAL_LOG_NOT_EXIST;
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
// TODO: check wal life
|
// TODO: check wal life
|
||||||
if (pRead->curVersion != ver) {
|
if (pRead->curVersion != ver) {
|
||||||
if (walReadSeekVer(pRead, ver) < 0) {
|
if (walReadSeekVer(pRead, ver) < 0) {
|
||||||
|
|
|
@ -134,6 +134,7 @@ TAOS_DEFINE_ERROR(TSDB_CODE_TSC_STMT_TBNAME_ERROR, "Stmt table name not s
|
||||||
TAOS_DEFINE_ERROR(TSDB_CODE_TSC_STMT_CLAUSE_ERROR, "not supported stmt clause")
|
TAOS_DEFINE_ERROR(TSDB_CODE_TSC_STMT_CLAUSE_ERROR, "not supported stmt clause")
|
||||||
TAOS_DEFINE_ERROR(TSDB_CODE_TSC_QUERY_KILLED, "Query killed")
|
TAOS_DEFINE_ERROR(TSDB_CODE_TSC_QUERY_KILLED, "Query killed")
|
||||||
TAOS_DEFINE_ERROR(TSDB_CODE_TSC_NO_EXEC_NODE, "No available execution node")
|
TAOS_DEFINE_ERROR(TSDB_CODE_TSC_NO_EXEC_NODE, "No available execution node")
|
||||||
|
TAOS_DEFINE_ERROR(TSDB_CODE_TSC_NOT_STABLE_ERROR, "Table is not a super table")
|
||||||
|
|
||||||
// mnode-common
|
// mnode-common
|
||||||
TAOS_DEFINE_ERROR(TSDB_CODE_MND_APP_ERROR, "Mnode internal error")
|
TAOS_DEFINE_ERROR(TSDB_CODE_MND_APP_ERROR, "Mnode internal error")
|
||||||
|
|
|
@ -0,0 +1,46 @@
|
||||||
|
###################################################################
|
||||||
|
# Copyright (c) 2016 by TAOS Technologies, Inc.
|
||||||
|
# All rights reserved.
|
||||||
|
#
|
||||||
|
# This file is proprietary and confidential to TAOS Technologies.
|
||||||
|
# No part of this file may be reproduced, stored, transmitted,
|
||||||
|
# disclosed or used in any form or by any means other than as
|
||||||
|
# expressly provided by the written permission from Jianhui Tao
|
||||||
|
#
|
||||||
|
###################################################################
|
||||||
|
|
||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
|
||||||
|
from util.sql import tdSql
|
||||||
|
|
||||||
|
class TDSetSql:
|
||||||
|
def init(self, conn, logSql):
|
||||||
|
tdSql.init(conn.cursor(), logSql)
|
||||||
|
self.stbname = 'stb'
|
||||||
|
|
||||||
|
def set_create_normaltable_sql(self, ntbname='ntb',
|
||||||
|
column_dict={'ts':'timestamp','col1':'tinyint','col2':'smallint','col3':'int','col4':'bigint','col5': 'unsigned int','col6': 'unsigned tinyint','col7': 'unsigned smallint',
|
||||||
|
'col8': 'unsigned int','col9': 'unsigned bigint','col10': 'float','col11': 'double','col12': 'bool','col13': 'binary(20)','col14': 'nchar(20)'}):
|
||||||
|
column_sql = ''
|
||||||
|
for k, v in column_dict.items():
|
||||||
|
column_sql += f"{k} {v},"
|
||||||
|
create_ntb_sql = f'create table {ntbname} ({column_sql[:-1]})'
|
||||||
|
return create_ntb_sql
|
||||||
|
|
||||||
|
def set_create_stable_sql(self,stbname='stb',
|
||||||
|
column_dict={'ts':'timestamp','col1':'tinyint','col2':'smallint','col3':'int','col4':'bigint','col5': 'unsigned int','col6': 'unsigned tinyint','col7': 'unsigned smallint',
|
||||||
|
'col8': 'unsigned int','col9': 'unsigned bigint','col10': 'float','col11': 'double','col12': 'bool','col13': 'binary(20)','col14': 'nchar(20)'},
|
||||||
|
tag_dict={'ts_tag':'timestamp','t1':'tinyint','t2':'smallint','t3':'int','t4':'bigint','t5': 'unsigned int','t6': 'unsigned tinyint','t7': 'unsigned smallint',
|
||||||
|
't8': 'unsigned int','t9': 'unsigned bigint','t10': 'float','t11': 'double','t12': 'bool','t13': 'binary(20)','t14': 'nchar(20)'}):
|
||||||
|
column_sql = ''
|
||||||
|
tag_sql = ''
|
||||||
|
for k,v in column_dict.items():
|
||||||
|
column_sql += f"{k} {v},"
|
||||||
|
for k,v in tag_dict.items():
|
||||||
|
tag_sql += f"{k} {v},"
|
||||||
|
create_stb_sql = f'create table {stbname} ({column_sql[:-1]}) tags({tag_sql[:-1]})'
|
||||||
|
return create_stb_sql
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -36,6 +36,7 @@ sql create database db vgroups 3
|
||||||
sql use db
|
sql use db
|
||||||
sql create table stb (ts timestamp, c int) tags (t int)
|
sql create table stb (ts timestamp, c int) tags (t int)
|
||||||
sql create table t0 using stb tags (0)
|
sql create table t0 using stb tags (0)
|
||||||
|
sql create table tba (ts timestamp, c1 binary(10), c2 nchar(10));
|
||||||
|
|
||||||
print =============== run show xxxx
|
print =============== run show xxxx
|
||||||
sql show dnodes
|
sql show dnodes
|
||||||
|
@ -62,7 +63,7 @@ if $rows != 1 then
|
||||||
endi
|
endi
|
||||||
#sql show streams,
|
#sql show streams,
|
||||||
sql show tables
|
sql show tables
|
||||||
if $rows != 1 then
|
if $rows != 2 then
|
||||||
return -1
|
return -1
|
||||||
endi
|
endi
|
||||||
#sql show user_table_distributed
|
#sql show user_table_distributed
|
||||||
|
@ -98,7 +99,7 @@ if $rows != 1 then
|
||||||
endi
|
endi
|
||||||
#sql select * from information_schema.`streams`
|
#sql select * from information_schema.`streams`
|
||||||
sql select * from information_schema.user_tables
|
sql select * from information_schema.user_tables
|
||||||
if $rows != 29 then
|
if $rows != 30 then
|
||||||
return -1
|
return -1
|
||||||
endi
|
endi
|
||||||
#sql select * from information_schema.user_table_distributed
|
#sql select * from information_schema.user_table_distributed
|
||||||
|
@ -160,7 +161,7 @@ if $rows != 1 then
|
||||||
endi
|
endi
|
||||||
#sql show streams,
|
#sql show streams,
|
||||||
sql show tables
|
sql show tables
|
||||||
if $rows != 1 then
|
if $rows != 2 then
|
||||||
return -1
|
return -1
|
||||||
endi
|
endi
|
||||||
#sql show user_table_distributed
|
#sql show user_table_distributed
|
||||||
|
@ -196,7 +197,7 @@ if $rows != 1 then
|
||||||
endi
|
endi
|
||||||
#sql select * from performance_schema.`streams`
|
#sql select * from performance_schema.`streams`
|
||||||
sql select * from information_schema.user_tables
|
sql select * from information_schema.user_tables
|
||||||
if $rows != 29 then
|
if $rows != 30 then
|
||||||
return -1
|
return -1
|
||||||
endi
|
endi
|
||||||
#sql select * from information_schema.user_table_distributed
|
#sql select * from information_schema.user_table_distributed
|
||||||
|
@ -209,5 +210,22 @@ if $rows != 3 then
|
||||||
return -1
|
return -1
|
||||||
endi
|
endi
|
||||||
|
|
||||||
|
sql show create stable stb;
|
||||||
|
if $rows != 1 then
|
||||||
|
return -1
|
||||||
|
endi
|
||||||
|
|
||||||
|
sql show create table t0;
|
||||||
|
if $rows != 1 then
|
||||||
|
return -1
|
||||||
|
endi
|
||||||
|
|
||||||
|
sql show create table tba;
|
||||||
|
if $rows != 1 then
|
||||||
|
return -1
|
||||||
|
endi
|
||||||
|
|
||||||
|
sql_error show create stable t0;
|
||||||
|
|
||||||
system sh/exec.sh -n dnode1 -s stop -x SIGINT
|
system sh/exec.sh -n dnode1 -s stop -x SIGINT
|
||||||
system sh/exec.sh -n dnode2 -s stop -x SIGINT
|
system sh/exec.sh -n dnode2 -s stop -x SIGINT
|
||||||
|
|
|
@ -11,103 +11,159 @@
|
||||||
|
|
||||||
# -*- coding: utf-8 -*-
|
# -*- coding: utf-8 -*-
|
||||||
|
|
||||||
import random
|
|
||||||
import string
|
import string
|
||||||
from util.common import *
|
from util.common import *
|
||||||
from util.log import *
|
from util.log import *
|
||||||
from util.cases import *
|
from util.cases import *
|
||||||
from util.sql import *
|
from util.sql import *
|
||||||
|
from util.sqlset import *
|
||||||
|
|
||||||
class TDTestCase:
|
class TDTestCase:
|
||||||
def init(self, conn, logSql):
|
def init(self, conn, logSql):
|
||||||
tdLog.debug("start to execute %s" % __file__)
|
tdLog.debug("start to execute %s" % __file__)
|
||||||
tdSql.init(conn.cursor())
|
tdSql.init(conn.cursor())
|
||||||
|
self.setsql = TDSetSql()
|
||||||
|
self.ntbname = 'ntb'
|
||||||
self.rowNum = 10
|
self.rowNum = 10
|
||||||
self.tbnum = 20
|
self.tbnum = 20
|
||||||
self.ts = 1537146000000
|
self.ts = 1537146000000
|
||||||
self.binary_str = 'taosdata'
|
self.binary_str = 'taosdata'
|
||||||
self.nchar_str = '涛思数据'
|
self.nchar_str = '涛思数据'
|
||||||
def top_check_base(self):
|
self.column_dict = {
|
||||||
tdSql.prepare()
|
'ts' : 'timestamp',
|
||||||
tdSql.execute('''create table stb(ts timestamp, col1 tinyint, col2 smallint, col3 int, col4 bigint, col5 tinyint unsigned, col6 smallint unsigned,
|
'col1': 'tinyint',
|
||||||
col7 int unsigned, col8 bigint unsigned, col9 float, col10 double, col11 bool, col12 binary(20), col13 nchar(20)) tags(loc nchar(20))''')
|
'col2': 'smallint',
|
||||||
tdSql.execute("create table stb_1 using stb tags('beijing')")
|
'col3': 'int',
|
||||||
|
'col4': 'bigint',
|
||||||
|
'col5': 'tinyint unsigned',
|
||||||
|
'col6': 'smallint unsigned',
|
||||||
|
'col7': 'int unsigned',
|
||||||
|
'col8': 'bigint unsigned',
|
||||||
|
'col9': 'float',
|
||||||
|
'col10': 'double',
|
||||||
|
'col11': 'bool',
|
||||||
|
'col12': 'binary(20)',
|
||||||
|
'col13': 'nchar(20)'
|
||||||
|
}
|
||||||
|
|
||||||
|
self.param_list = [1,100]
|
||||||
|
|
||||||
|
def insert_data(self,column_dict,tbname,row_num):
|
||||||
|
sql = ''
|
||||||
|
for k, v in column_dict.items():
|
||||||
|
if v.lower() == 'timestamp' or v.lower() == 'tinyint' or v.lower() == 'smallint' or v.lower() == 'int' or v.lower() == 'bigint' or \
|
||||||
|
v.lower() == 'tinyint unsigned' or v.lower() == 'smallint unsigned' or v.lower() == 'int unsigned' or v.lower() == 'bigint unsigned' or v.lower() == 'bool':
|
||||||
|
sql += '%d,'
|
||||||
|
elif v.lower() == 'float' or v.lower() == 'double':
|
||||||
|
sql += '%f,'
|
||||||
|
elif 'binary' in v.lower():
|
||||||
|
sql += f'"{self.binary_str}%d",'
|
||||||
|
elif 'nchar' in v.lower():
|
||||||
|
sql += f'"{self.nchar_str}%d",'
|
||||||
|
insert_sql = f'insert into {tbname} values({sql[:-1]})'
|
||||||
|
for i in range(row_num):
|
||||||
|
insert_list = []
|
||||||
|
for k, v in column_dict.items():
|
||||||
|
if v.lower() in[ 'tinyint' , 'smallint' , 'int', 'bigint' , 'tinyint unsigned' , 'smallint unsigned' , 'int unsigned' , 'bigint unsigned'] or\
|
||||||
|
'binary' in v.lower() or 'nchar' in v.lower():
|
||||||
|
insert_list.append(1 + i)
|
||||||
|
elif v.lower() == 'float' or v.lower() == 'double':
|
||||||
|
insert_list.append(0.1 + i)
|
||||||
|
elif v.lower() == 'bool':
|
||||||
|
insert_list.append(i % 2)
|
||||||
|
elif v.lower() == 'timestamp':
|
||||||
|
insert_list.append(self.ts + i)
|
||||||
|
tdSql.execute(insert_sql%(tuple(insert_list)))
|
||||||
|
pass
|
||||||
|
def top_check_data(self,tbname,tb_type):
|
||||||
|
new_column_dict = {}
|
||||||
|
for param in self.param_list:
|
||||||
|
for k,v in self.column_dict.items():
|
||||||
|
if v.lower() in ['tinyint','smallint','int','bigint','tinyint unsigned','smallint unsigned','int unsigned','bigint unsigned']:
|
||||||
|
tdSql.query(f'select top({k},{param}) from {tbname}')
|
||||||
|
if param >= self.rowNum:
|
||||||
|
if tb_type in ['normal_table','child_table']:
|
||||||
|
tdSql.checkRows(self.rowNum)
|
||||||
|
values_list = []
|
||||||
for i in range(self.rowNum):
|
for i in range(self.rowNum):
|
||||||
tdSql.execute(f"insert into stb_1 values(%d, %d, %d, %d, %d, %d, %d, %d, %d, %f, %f, %d, '{self.binary_str}%d', '{self.nchar_str}%d')"
|
tp = (self.rowNum-i,)
|
||||||
% (self.ts + i, i + 1, i + 1, i + 1, i + 1, i + 1, i + 1, i + 1, i + 1, i + 0.1, i + 0.1, i % 2, i + 1, i + 1))
|
values_list.insert(0,tp)
|
||||||
column_list = ['col1','col2','col3','col4','col5','col6','col7','col8']
|
tdSql.checkEqual(tdSql.queryResult,values_list)
|
||||||
error_column_list = ['col11','col12','col13']
|
elif tb_type == 'stable':
|
||||||
error_param_list = [0,101]
|
tdSql.checkRows(param)
|
||||||
for i in column_list:
|
elif param < self.rowNum:
|
||||||
tdSql.query(f'select top({i},2) from stb_1')
|
if tb_type in ['normal_table','child_table']:
|
||||||
|
tdSql.checkRows(param)
|
||||||
|
values_list = []
|
||||||
|
for i in range(param):
|
||||||
|
tp = (self.rowNum-i,)
|
||||||
|
values_list.insert(0,tp)
|
||||||
|
tdSql.checkEqual(tdSql.queryResult,values_list)
|
||||||
|
elif tb_type == 'stable':
|
||||||
|
tdSql.checkRows(param)
|
||||||
|
for i in [self.param_list[0]-1,self.param_list[-1]+1]:
|
||||||
|
tdSql.error(f'select top({k},{i}) from {tbname}')
|
||||||
|
new_column_dict.update({k:v})
|
||||||
|
elif v.lower() == 'bool' or 'binary' in v.lower() or 'nchar' in v.lower():
|
||||||
|
tdSql.error(f'select top({k},{param}) from {tbname}')
|
||||||
|
tdSql.error(f'select * from {tbname} where top({k},{param})=1')
|
||||||
|
for key in new_column_dict.keys():
|
||||||
|
for k in self.column_dict.keys():
|
||||||
|
if key == k :
|
||||||
|
continue
|
||||||
|
else:
|
||||||
|
tdSql.query(f'select top({key},2),{k} from {tbname} group by tbname')
|
||||||
|
if tb_type == 'normal_table' or tb_type == 'child_table':
|
||||||
tdSql.checkRows(2)
|
tdSql.checkRows(2)
|
||||||
tdSql.checkEqual(tdSql.queryResult,[(9,),(10,)])
|
else:
|
||||||
for j in error_param_list:
|
tdSql.checkRows(2*self.tbnum)
|
||||||
tdSql.error(f'select top({i},{j}) from stb_1')
|
def top_check_stb(self):
|
||||||
for i in error_column_list:
|
|
||||||
tdSql.error(f'select top({i},10) from stb_1')
|
|
||||||
tdSql.query("select ts,top(col1, 2),ts from stb_1 group by tbname")
|
|
||||||
tdSql.checkRows(2)
|
|
||||||
tdSql.query('select top(col2,1) from stb_1 interval(1y) order by col2')
|
|
||||||
tdSql.checkData(0,0,10)
|
|
||||||
tdSql.error("select * from stb_1 where top(col2,1)=1")
|
|
||||||
tdSql.execute('drop database db')
|
|
||||||
def top_check_stb_distribute(self):
|
|
||||||
# prepare data for vgroup 4
|
|
||||||
dbname = tdCom.getLongName(10, "letters")
|
dbname = tdCom.getLongName(10, "letters")
|
||||||
stbname = tdCom.getLongName(5, "letters")
|
stbname = tdCom.getLongName(5, "letters")
|
||||||
|
tag_dict = {
|
||||||
|
't0':'int'
|
||||||
|
}
|
||||||
|
tag_values = [
|
||||||
|
f'1'
|
||||||
|
]
|
||||||
tdSql.execute(f"create database if not exists {dbname} vgroups 2")
|
tdSql.execute(f"create database if not exists {dbname} vgroups 2")
|
||||||
tdSql.execute(f'use {dbname}')
|
tdSql.execute(f'use {dbname}')
|
||||||
# build 20 child tables,every table insert 10 rows
|
tdSql.execute(self.setsql.set_create_stable_sql(stbname,self.column_dict,tag_dict))
|
||||||
tdSql.execute(f'''create table {stbname}(ts timestamp, col1 tinyint, col2 smallint, col3 int, col4 bigint, col5 tinyint unsigned, col6 smallint unsigned,
|
|
||||||
col7 int unsigned, col8 bigint unsigned, col9 float, col10 double, col11 bool, col12 binary(20), col13 nchar(20)) tags(loc nchar(20))''')
|
|
||||||
for i in range(self.tbnum):
|
for i in range(self.tbnum):
|
||||||
tdSql.execute(f"create table {stbname}_{i} using {stbname} tags('beijing')")
|
tdSql.execute(f"create table {stbname}_{i} using {stbname} tags({tag_values[0]})")
|
||||||
tdSql.execute(f"insert into {stbname}_{i}(ts) values(%d)" % (self.ts - 1-i))
|
tdSql.execute(self.insert_data(self.column_dict,f'{stbname}_{i}',self.rowNum))
|
||||||
column_list = ['col1','col2','col3','col4','col5','col6','col7','col8']
|
|
||||||
for i in [f'{stbname}', f'{dbname}.{stbname}']:
|
|
||||||
for j in column_list:
|
|
||||||
tdSql.query(f"select top({j},1) from {i}")
|
|
||||||
tdSql.checkRows(0)
|
|
||||||
tdSql.query('show tables')
|
tdSql.query('show tables')
|
||||||
vgroup_list = []
|
vgroup_list = []
|
||||||
for i in range(len(tdSql.queryResult)):
|
for i in range(len(tdSql.queryResult)):
|
||||||
vgroup_list.append(tdSql.queryResult[i][6])
|
vgroup_list.append(tdSql.queryResult[i][6])
|
||||||
vgroup_list_set = set(vgroup_list)
|
|
||||||
|
|
||||||
|
vgroup_list_set = set(vgroup_list)
|
||||||
for i in vgroup_list_set:
|
for i in vgroup_list_set:
|
||||||
vgroups_num = vgroup_list.count(i)
|
vgroups_num = vgroup_list.count(i)
|
||||||
if vgroups_num >=2:
|
if vgroups_num >= 2:
|
||||||
tdLog.info(f'This scene with {vgroups_num} vgroups is ok!')
|
tdLog.info(f'This scene with {vgroups_num} vgroups is ok!')
|
||||||
continue
|
|
||||||
else:
|
else:
|
||||||
tdLog.exit(f'This scene does not meet the requirements with {vgroups_num} vgroup!\n')
|
tdLog.exit(
|
||||||
for i in range(self.rowNum):
|
'This scene does not meet the requirements with {vgroups_num} vgroup!\n')
|
||||||
for j in range(self.tbnum):
|
for i in range(self.tbnum):
|
||||||
tdSql.execute(f"insert into {stbname}_{j} values(%d, %d, %d, %d, %d, %d, %d, %d, %d, %f, %f, %d, '{self.binary_str}%d', '{self.nchar_str}%d')"
|
self.top_check_data(f'{stbname}_{i}','child_table')
|
||||||
% (self.ts + i, i + 1, i + 1, i + 1, i + 1, i + 1, i + 1, i + 1, i + 1, i + 0.1, i + 0.1, i % 2, i + 1, i + 1))
|
self.top_check_data(stbname,'stable')
|
||||||
|
tdSql.execute(f'drop database {dbname}')
|
||||||
|
|
||||||
error_column_list = ['col11','col12','col13']
|
def top_check_ntb(self):
|
||||||
error_param_list = [0,101]
|
tdSql.prepare()
|
||||||
for i in column_list:
|
tdSql.execute(self.setsql.set_create_normaltable_sql(self.ntbname,self.column_dict))
|
||||||
tdSql.query(f'select top({i},2) from {stbname}')
|
self.insert_data(self.column_dict,self.ntbname,self.rowNum)
|
||||||
tdSql.checkRows(2)
|
self.top_check_data(self.ntbname,'normal_table')
|
||||||
tdSql.checkEqual(tdSql.queryResult,[(10,),(10,)])
|
tdSql.execute('drop database db')
|
||||||
for j in error_param_list:
|
|
||||||
tdSql.error(f'select top({i},{j}) from {stbname}')
|
|
||||||
for i in error_column_list:
|
|
||||||
tdSql.error(f'select top({i},10) from {stbname}')
|
|
||||||
|
|
||||||
tdSql.query(f"select ts,top(col1, 2),ts from {stbname} group by tbname")
|
|
||||||
tdSql.checkRows(2*self.tbnum)
|
|
||||||
tdSql.query(f'select top(col2,1) from {stbname} interval(1y) order by col2')
|
|
||||||
tdSql.checkData(0,0,10)
|
|
||||||
tdSql.error(f"select * from {stbname} where top(col2,1)=1")
|
|
||||||
def run(self):
|
def run(self):
|
||||||
self.top_check_base()
|
self.top_check_ntb()
|
||||||
self.top_check_stb_distribute()
|
self.top_check_stb()
|
||||||
|
|
||||||
|
|
||||||
def stop(self):
|
def stop(self):
|
||||||
tdSql.close()
|
tdSql.close()
|
||||||
tdLog.success("%s successfully executed" % __file__)
|
tdLog.success("%s successfully executed" % __file__)
|
||||||
|
|
Loading…
Reference in New Issue