Merge branch '3.0' into feature/tq
This commit is contained in:
commit
023289e51b
|
@ -4,7 +4,7 @@ ExternalProject_Add(libuv
|
||||||
GIT_REPOSITORY https://github.com/libuv/libuv.git
|
GIT_REPOSITORY https://github.com/libuv/libuv.git
|
||||||
GIT_TAG v1.42.0
|
GIT_TAG v1.42.0
|
||||||
SOURCE_DIR "${CMAKE_CONTRIB_DIR}/libuv"
|
SOURCE_DIR "${CMAKE_CONTRIB_DIR}/libuv"
|
||||||
BINARY_DIR ""
|
BINARY_DIR "${CMAKE_CONTRIB_DIR}/libuv"
|
||||||
CONFIGURE_COMMAND ""
|
CONFIGURE_COMMAND ""
|
||||||
BUILD_COMMAND ""
|
BUILD_COMMAND ""
|
||||||
INSTALL_COMMAND ""
|
INSTALL_COMMAND ""
|
||||||
|
|
|
@ -62,6 +62,12 @@ typedef struct SConstantItem {
|
||||||
SVariant value;
|
SVariant value;
|
||||||
} SConstantItem;
|
} SConstantItem;
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
uint32_t numOfTables;
|
||||||
|
SArray *pGroupList;
|
||||||
|
SHashObj *map; // speedup acquire the tableQueryInfo by table uid
|
||||||
|
} STableGroupInfo;
|
||||||
|
|
||||||
typedef struct SSDataBlock {
|
typedef struct SSDataBlock {
|
||||||
SColumnDataAgg *pBlockAgg;
|
SColumnDataAgg *pBlockAgg;
|
||||||
SArray *pDataBlock; // SArray<SColumnInfoData>
|
SArray *pDataBlock; // SArray<SColumnInfoData>
|
||||||
|
|
|
@ -1020,6 +1020,14 @@ typedef struct {
|
||||||
char msg[];
|
char msg[];
|
||||||
} SSubQueryMsg;
|
} SSubQueryMsg;
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
SMsgHead header;
|
||||||
|
uint64_t sId;
|
||||||
|
uint64_t queryId;
|
||||||
|
uint64_t taskId;
|
||||||
|
} SSinkDataReq;
|
||||||
|
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
SMsgHead header;
|
SMsgHead header;
|
||||||
uint64_t sId;
|
uint64_t sId;
|
||||||
|
|
|
@ -23,9 +23,9 @@ extern "C" {
|
||||||
/* ------------------------ TYPES EXPOSED ------------------------ */
|
/* ------------------------ TYPES EXPOSED ------------------------ */
|
||||||
typedef struct SDnode SDnode;
|
typedef struct SDnode SDnode;
|
||||||
typedef struct SBnode SBnode;
|
typedef struct SBnode SBnode;
|
||||||
typedef int32_t (*SendReqToDnodeFp)(SDnode *pDnode, struct SEpSet *epSet, struct SRpcMsg *rpcMsg);
|
typedef int32_t (*SendReqToDnodeFp)(SDnode *pDnode, struct SEpSet *epSet, struct SRpcMsg *pMsg);
|
||||||
typedef int32_t (*SendReqToMnodeFp)(SDnode *pDnode, struct SRpcMsg *rpcMsg);
|
typedef int32_t (*SendReqToMnodeFp)(SDnode *pDnode, struct SRpcMsg *pMsg);
|
||||||
typedef void (*SendRedirectRspFp)(SDnode *pDnode, struct SRpcMsg *rpcMsg);
|
typedef void (*SendRedirectRspFp)(SDnode *pDnode, struct SRpcMsg *pMsg);
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
int64_t numOfErrors;
|
int64_t numOfErrors;
|
||||||
|
@ -33,12 +33,8 @@ typedef struct {
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
int32_t sver;
|
int32_t sver;
|
||||||
} SBnodeCfg;
|
|
||||||
|
|
||||||
typedef struct {
|
|
||||||
int32_t dnodeId;
|
int32_t dnodeId;
|
||||||
int64_t clusterId;
|
int64_t clusterId;
|
||||||
SBnodeCfg cfg;
|
|
||||||
SDnode *pDnode;
|
SDnode *pDnode;
|
||||||
SendReqToDnodeFp sendReqToDnodeFp;
|
SendReqToDnodeFp sendReqToDnodeFp;
|
||||||
SendReqToMnodeFp sendReqToMnodeFp;
|
SendReqToMnodeFp sendReqToMnodeFp;
|
||||||
|
|
|
@ -22,15 +22,39 @@
|
||||||
extern "C" {
|
extern "C" {
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* ------------------------ TYPES EXPOSED ------------------------ */
|
/* ------------------------ TYPES EXPOSED ---------------- */
|
||||||
typedef struct SDnode SDnode;
|
typedef struct SDnode SDnode;
|
||||||
|
|
||||||
|
/* ------------------------ Environment ------------------ */
|
||||||
typedef struct {
|
typedef struct {
|
||||||
int32_t sver;
|
int32_t sver;
|
||||||
int32_t numOfCores;
|
int32_t numOfCores;
|
||||||
int32_t numOfSupportVnodes;
|
|
||||||
int16_t numOfCommitThreads;
|
int16_t numOfCommitThreads;
|
||||||
int8_t enableTelem;
|
int8_t enableTelem;
|
||||||
|
char timezone[TSDB_TIMEZONE_LEN];
|
||||||
|
char locale[TSDB_LOCALE_LEN];
|
||||||
|
char charset[TSDB_LOCALE_LEN];
|
||||||
|
char buildinfo[64];
|
||||||
|
char gitinfo[48];
|
||||||
|
} SDnodeEnvCfg;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Initialize the environment
|
||||||
|
*
|
||||||
|
* @param pOption Option of the environment
|
||||||
|
* @return int32_t 0 for success and -1 for failure
|
||||||
|
*/
|
||||||
|
int32_t dndInit(const SDnodeEnvCfg *pCfg);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief clear the environment
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
void dndCleanup();
|
||||||
|
|
||||||
|
/* ------------------------ SDnode ----------------------- */
|
||||||
|
typedef struct {
|
||||||
|
int32_t numOfSupportVnodes;
|
||||||
int32_t statusInterval;
|
int32_t statusInterval;
|
||||||
float numOfThreadsPerCore;
|
float numOfThreadsPerCore;
|
||||||
float ratioOfQueryCores;
|
float ratioOfQueryCores;
|
||||||
|
@ -41,28 +65,22 @@ typedef struct {
|
||||||
char localEp[TSDB_EP_LEN];
|
char localEp[TSDB_EP_LEN];
|
||||||
char localFqdn[TSDB_FQDN_LEN];
|
char localFqdn[TSDB_FQDN_LEN];
|
||||||
char firstEp[TSDB_EP_LEN];
|
char firstEp[TSDB_EP_LEN];
|
||||||
char timezone[TSDB_TIMEZONE_LEN];
|
} SDnodeObjCfg;
|
||||||
char locale[TSDB_LOCALE_LEN];
|
|
||||||
char charset[TSDB_LOCALE_LEN];
|
|
||||||
char buildinfo[64];
|
|
||||||
char gitinfo[48];
|
|
||||||
} SDnodeOpt;
|
|
||||||
|
|
||||||
/* ------------------------ SDnode ------------------------ */
|
|
||||||
/**
|
/**
|
||||||
* @brief Initialize and start the dnode.
|
* @brief Initialize and start the dnode.
|
||||||
*
|
*
|
||||||
* @param pOption Option of the dnode.
|
* @param pCfg Config of the dnode.
|
||||||
* @return SDnode* The dnode object.
|
* @return SDnode* The dnode object.
|
||||||
*/
|
*/
|
||||||
SDnode *dndInit(SDnodeOpt *pOption);
|
SDnode *dndCreate(SDnodeObjCfg *pCfg);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Stop and cleanup the dnode.
|
* @brief Stop and cleanup the dnode.
|
||||||
*
|
*
|
||||||
* @param pDnode The dnode object to close.
|
* @param pDnode The dnode object to close.
|
||||||
*/
|
*/
|
||||||
void dndCleanup(SDnode *pDnode);
|
void dndClose(SDnode *pDnode);
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
|
|
|
@ -23,9 +23,9 @@ extern "C" {
|
||||||
/* ------------------------ TYPES EXPOSED ------------------------ */
|
/* ------------------------ TYPES EXPOSED ------------------------ */
|
||||||
typedef struct SDnode SDnode;
|
typedef struct SDnode SDnode;
|
||||||
typedef struct SQnode SQnode;
|
typedef struct SQnode SQnode;
|
||||||
typedef int32_t (*SendReqToDnodeFp)(SDnode *pDnode, struct SEpSet *epSet, struct SRpcMsg *rpcMsg);
|
typedef int32_t (*SendReqToDnodeFp)(SDnode *pDnode, struct SEpSet *epSet, struct SRpcMsg *pMsg);
|
||||||
typedef int32_t (*SendReqToMnodeFp)(SDnode *pDnode, struct SRpcMsg *rpcMsg);
|
typedef int32_t (*SendReqToMnodeFp)(SDnode *pDnode, struct SRpcMsg *pMsg);
|
||||||
typedef void (*SendRedirectRspFp)(SDnode *pDnode, struct SRpcMsg *rpcMsg);
|
typedef void (*SendRedirectRspFp)(SDnode *pDnode, struct SRpcMsg *pMsg);
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
int64_t numOfStartTask;
|
int64_t numOfStartTask;
|
||||||
|
@ -40,12 +40,8 @@ typedef struct {
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
int32_t sver;
|
int32_t sver;
|
||||||
} SQnodeCfg;
|
|
||||||
|
|
||||||
typedef struct {
|
|
||||||
int32_t dnodeId;
|
int32_t dnodeId;
|
||||||
int64_t clusterId;
|
int64_t clusterId;
|
||||||
SQnodeCfg cfg;
|
|
||||||
SDnode *pDnode;
|
SDnode *pDnode;
|
||||||
SendReqToDnodeFp sendReqToDnodeFp;
|
SendReqToDnodeFp sendReqToDnodeFp;
|
||||||
SendReqToMnodeFp sendReqToMnodeFp;
|
SendReqToMnodeFp sendReqToMnodeFp;
|
||||||
|
|
|
@ -23,9 +23,9 @@ extern "C" {
|
||||||
/* ------------------------ TYPES EXPOSED ------------------------ */
|
/* ------------------------ TYPES EXPOSED ------------------------ */
|
||||||
typedef struct SDnode SDnode;
|
typedef struct SDnode SDnode;
|
||||||
typedef struct SSnode SSnode;
|
typedef struct SSnode SSnode;
|
||||||
typedef int32_t (*SendReqToDnodeFp)(SDnode *pDnode, struct SEpSet *epSet, struct SRpcMsg *rpcMsg);
|
typedef int32_t (*SendReqToDnodeFp)(SDnode *pDnode, struct SEpSet *epSet, struct SRpcMsg *pMsg);
|
||||||
typedef int32_t (*SendReqToMnodeFp)(SDnode *pDnode, struct SRpcMsg *rpcMsg);
|
typedef int32_t (*SendReqToMnodeFp)(SDnode *pDnode, struct SRpcMsg *pMsg);
|
||||||
typedef void (*SendRedirectRspFp)(SDnode *pDnode, struct SRpcMsg *rpcMsg);
|
typedef void (*SendRedirectRspFp)(SDnode *pDnode, struct SRpcMsg *pMsg);
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
int64_t numOfErrors;
|
int64_t numOfErrors;
|
||||||
|
@ -33,12 +33,8 @@ typedef struct {
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
int32_t sver;
|
int32_t sver;
|
||||||
} SSnodeCfg;
|
|
||||||
|
|
||||||
typedef struct {
|
|
||||||
int32_t dnodeId;
|
int32_t dnodeId;
|
||||||
int64_t clusterId;
|
int64_t clusterId;
|
||||||
SSnodeCfg cfg;
|
|
||||||
SDnode *pDnode;
|
SDnode *pDnode;
|
||||||
SendReqToDnodeFp sendReqToDnodeFp;
|
SendReqToDnodeFp sendReqToDnodeFp;
|
||||||
SendReqToMnodeFp sendReqToMnodeFp;
|
SendReqToMnodeFp sendReqToMnodeFp;
|
||||||
|
|
|
@ -1,77 +0,0 @@
|
||||||
/*
|
|
||||||
* Copyright (c) 2019 TAOS Data, Inc. <jhtao@taosdata.com>
|
|
||||||
*
|
|
||||||
* This program is free software: you can use, redistribute, and/or modify
|
|
||||||
* it under the terms of the GNU Affero General Public License, version 3
|
|
||||||
* or later ("AGPL"), as published by the Free Software Foundation.
|
|
||||||
*
|
|
||||||
* This program is distributed in the hope that it will be useful, but WITHOUT
|
|
||||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
|
||||||
* FITNESS FOR A PARTICULAR PURPOSE.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU Affero General Public License
|
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef _TD_TSDB_H_
|
|
||||||
#define _TD_TSDB_H_
|
|
||||||
|
|
||||||
#include "mallocator.h"
|
|
||||||
#include "meta.h"
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
extern "C" {
|
|
||||||
#endif
|
|
||||||
|
|
||||||
typedef struct SDataStatis {
|
|
||||||
int16_t colId;
|
|
||||||
int64_t sum;
|
|
||||||
int64_t max;
|
|
||||||
int64_t min;
|
|
||||||
int16_t maxIndex;
|
|
||||||
int16_t minIndex;
|
|
||||||
int16_t numOfNull;
|
|
||||||
} SDataStatis;
|
|
||||||
|
|
||||||
typedef struct STable {
|
|
||||||
uint64_t tid;
|
|
||||||
uint64_t uid;
|
|
||||||
STSchema *pSchema;
|
|
||||||
} STable;
|
|
||||||
|
|
||||||
#define TABLE_TID(t) (t)->tid
|
|
||||||
#define TABLE_UID(t) (t)->uid
|
|
||||||
|
|
||||||
// TYPES EXPOSED
|
|
||||||
typedef struct STsdb STsdb;
|
|
||||||
|
|
||||||
typedef struct STsdbCfg {
|
|
||||||
int8_t precision;
|
|
||||||
uint64_t lruCacheSize;
|
|
||||||
int32_t daysPerFile;
|
|
||||||
int32_t minRowsPerFileBlock;
|
|
||||||
int32_t maxRowsPerFileBlock;
|
|
||||||
int32_t keep;
|
|
||||||
int32_t keep1;
|
|
||||||
int32_t keep2;
|
|
||||||
int8_t update;
|
|
||||||
int8_t compression;
|
|
||||||
} STsdbCfg;
|
|
||||||
|
|
||||||
// STsdb
|
|
||||||
STsdb *tsdbOpen(const char *path, int32_t vgId, const STsdbCfg *pTsdbCfg, SMemAllocatorFactory *pMAF, SMeta *pMeta);
|
|
||||||
void tsdbClose(STsdb *);
|
|
||||||
void tsdbRemove(const char *path);
|
|
||||||
int tsdbInsertData(STsdb *pTsdb, SSubmitMsg *pMsg, SSubmitRsp *pRsp);
|
|
||||||
int tsdbPrepareCommit(STsdb *pTsdb);
|
|
||||||
int tsdbCommit(STsdb *pTsdb);
|
|
||||||
|
|
||||||
// STsdbCfg
|
|
||||||
int tsdbOptionsInit(STsdbCfg *);
|
|
||||||
void tsdbOptionsClear(STsdbCfg *);
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif /*_TD_TSDB_H_*/
|
|
|
@ -21,36 +21,38 @@ extern "C" {
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#include "os.h"
|
#include "os.h"
|
||||||
#include "executorimpl.h"
|
#include "thash.h"
|
||||||
|
#include "executor.h"
|
||||||
|
|
||||||
#define DS_CAPACITY_ENOUGH 1
|
#define DS_BUF_LOW 1
|
||||||
#define DS_CAPACITY_FULL 2
|
#define DS_BUF_FULL 2
|
||||||
#define DS_NEED_SCHEDULE 3
|
#define DS_BUF_EMPTY 3
|
||||||
#define DS_END 4
|
|
||||||
#define DS_IN_PROCESS 5
|
|
||||||
|
|
||||||
struct SDataSink;
|
struct SDataSink;
|
||||||
struct SSDataBlock;
|
struct SSDataBlock;
|
||||||
|
|
||||||
typedef struct SDataSinkMgtCfg {
|
typedef struct SDataSinkMgtCfg {
|
||||||
uint32_t maxDataBlockNum;
|
uint32_t maxDataBlockNum; // todo: this should be numOfRows?
|
||||||
uint32_t maxDataBlockNumPerQuery;
|
uint32_t maxDataBlockNumPerQuery;
|
||||||
} SDataSinkMgtCfg;
|
} SDataSinkMgtCfg;
|
||||||
|
|
||||||
int32_t dsDataSinkMgtInit(SDataSinkMgtCfg *cfg);
|
int32_t dsDataSinkMgtInit(SDataSinkMgtCfg *cfg);
|
||||||
|
|
||||||
typedef void* DataSinkHandle;
|
|
||||||
|
|
||||||
typedef struct SInputData {
|
typedef struct SInputData {
|
||||||
const SSDataBlock* pData;
|
const struct SSDataBlock* pData;
|
||||||
SHashObj* pTableRetrieveTsMap;
|
SHashObj* pTableRetrieveTsMap;
|
||||||
} SInputData;
|
} SInputData;
|
||||||
|
|
||||||
typedef struct SOutPutData {
|
typedef struct SOutputData {
|
||||||
int32_t numOfRows;
|
int32_t numOfRows;
|
||||||
int8_t compressed;
|
int8_t compressed;
|
||||||
char* pData;
|
char* pData;
|
||||||
} SOutPutData;
|
bool queryEnd;
|
||||||
|
bool needSchedule;
|
||||||
|
int32_t bufStatus;
|
||||||
|
int64_t useconds;
|
||||||
|
int8_t precision;
|
||||||
|
} SOutputData;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Create a subplan's datasinker handle for all later operations.
|
* Create a subplan's datasinker handle for all later operations.
|
||||||
|
@ -66,16 +68,16 @@ int32_t dsCreateDataSinker(const struct SDataSink *pDataSink, DataSinkHandle* pH
|
||||||
* @param pRes
|
* @param pRes
|
||||||
* @return error code
|
* @return error code
|
||||||
*/
|
*/
|
||||||
int32_t dsPutDataBlock(DataSinkHandle handle, const SInputData* pInput, int32_t* pStatus);
|
int32_t dsPutDataBlock(DataSinkHandle handle, const SInputData* pInput, bool* pContinue);
|
||||||
|
|
||||||
void dsEndPut(DataSinkHandle handle);
|
void dsEndPut(DataSinkHandle handle, int64_t useconds);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get the length of the data returned by the next call to dsGetDataBlock.
|
* Get the length of the data returned by the next call to dsGetDataBlock.
|
||||||
* @param handle
|
* @param handle
|
||||||
* @return data length
|
* @param pLen data length
|
||||||
*/
|
*/
|
||||||
int32_t dsGetDataLength(DataSinkHandle handle, int32_t* pStatus);
|
void dsGetDataLength(DataSinkHandle handle, int32_t* pLen, bool* pQueryEnd);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get data, the caller needs to allocate data memory.
|
* Get data, the caller needs to allocate data memory.
|
||||||
|
@ -84,7 +86,7 @@ int32_t dsGetDataLength(DataSinkHandle handle, int32_t* pStatus);
|
||||||
* @param pStatus output
|
* @param pStatus output
|
||||||
* @return error code
|
* @return error code
|
||||||
*/
|
*/
|
||||||
int32_t dsGetDataBlock(DataSinkHandle handle, SOutPutData* pOutput, int32_t* pStatus);
|
int32_t dsGetDataBlock(DataSinkHandle handle, SOutputData* pOutput);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* After dsGetStatus returns DS_NEED_SCHEDULE, the caller need to put this into the work queue.
|
* After dsGetStatus returns DS_NEED_SCHEDULE, the caller need to put this into the work queue.
|
|
@ -21,24 +21,30 @@ extern "C" {
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
typedef void* qTaskInfo_t;
|
typedef void* qTaskInfo_t;
|
||||||
|
typedef void* DataSinkHandle;
|
||||||
|
struct SSubplan;
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* create the qinfo object according to QueryTableMsg
|
* Create the exec task object according to task json
|
||||||
* @param tsdb
|
* @param tsdb
|
||||||
* @param pQueryTableMsg
|
* @param vgId
|
||||||
|
* @param pTaskInfoMsg
|
||||||
* @param pTaskInfo
|
* @param pTaskInfo
|
||||||
|
* @param qId
|
||||||
* @return
|
* @return
|
||||||
*/
|
*/
|
||||||
int32_t qCreateTask(void* tsdb, int32_t vgId, void* pQueryTableMsg, qTaskInfo_t* pTaskInfo, uint64_t qId);
|
int32_t qCreateExecTask(void* tsdb, int32_t vgId, struct SSubplan* pPlan, qTaskInfo_t* pTaskInfo);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* the main query execution function, including query on both table and multiple tables,
|
* The main task execution function, including query on both table and multiple tables,
|
||||||
* which are decided according to the tag or table name query conditions
|
* which are decided according to the tag or table name query conditions
|
||||||
*
|
*
|
||||||
* @param qinfo
|
* @param tinfo
|
||||||
|
* @param handle
|
||||||
* @return
|
* @return
|
||||||
*/
|
*/
|
||||||
bool qExecTask(qTaskInfo_t qinfo, uint64_t *qId);
|
int32_t qExecTask(qTaskInfo_t tinfo, DataSinkHandle* handle);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Retrieve the produced results information, if current query is not paused or completed,
|
* Retrieve the produced results information, if current query is not paused or completed,
|
||||||
|
@ -60,7 +66,7 @@ int32_t qRetrieveQueryResultInfo(qTaskInfo_t qinfo, bool* buildRes, void* pRspCo
|
||||||
* @param contLen payload length
|
* @param contLen payload length
|
||||||
* @return
|
* @return
|
||||||
*/
|
*/
|
||||||
int32_t qDumpRetrieveResult(qTaskInfo_t qinfo, SRetrieveTableRsp** pRsp, int32_t* contLen, bool* continueExec);
|
//int32_t qDumpRetrieveResult(qTaskInfo_t qinfo, SRetrieveTableRsp** pRsp, int32_t* contLen, bool* continueExec);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* return the transporter context (RPC)
|
* return the transporter context (RPC)
|
||||||
|
@ -81,7 +87,7 @@ int32_t qKillTask(qTaskInfo_t qinfo);
|
||||||
* @param qinfo
|
* @param qinfo
|
||||||
* @return
|
* @return
|
||||||
*/
|
*/
|
||||||
int32_t qIsQueryCompleted(qTaskInfo_t qinfo);
|
int32_t qIsTaskCompleted(qTaskInfo_t qinfo);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* destroy query info structure
|
* destroy query info structure
|
||||||
|
@ -113,7 +119,7 @@ int32_t qGetQualifiedTableIdList(void* pTableList, const char* tagCond, int32_t
|
||||||
* @param numOfIndex
|
* @param numOfIndex
|
||||||
* @return
|
* @return
|
||||||
*/
|
*/
|
||||||
int32_t qCreateTableGroupByGroupExpr(SArray* pTableIdList, TSKEY skey, STableGroupInfo groupInfo, SColIndex* groupByIndex, int32_t numOfIndex);
|
//int32_t qCreateTableGroupByGroupExpr(SArray* pTableIdList, TSKEY skey, STableGroupInfo groupInfo, SColIndex* groupByIndex, int32_t numOfIndex);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Update the table id list of a given query.
|
* Update the table id list of a given query.
|
||||||
|
|
|
@ -43,15 +43,6 @@ typedef struct SField {
|
||||||
int32_t bytes;
|
int32_t bytes;
|
||||||
} SField;
|
} SField;
|
||||||
|
|
||||||
typedef struct SParseBasicCtx {
|
|
||||||
uint64_t requestId;
|
|
||||||
int32_t acctId;
|
|
||||||
const char *db;
|
|
||||||
void *pTransporter;
|
|
||||||
SEpSet mgmtEpSet;
|
|
||||||
struct SCatalog *pCatalog;
|
|
||||||
} SParseBasicCtx;
|
|
||||||
|
|
||||||
typedef struct SFieldInfo {
|
typedef struct SFieldInfo {
|
||||||
int16_t numOfOutput; // number of column in result
|
int16_t numOfOutput; // number of column in result
|
||||||
SField *final;
|
SField *final;
|
||||||
|
|
|
@ -23,11 +23,17 @@ extern "C" {
|
||||||
#include "parsenodes.h"
|
#include "parsenodes.h"
|
||||||
|
|
||||||
typedef struct SParseContext {
|
typedef struct SParseContext {
|
||||||
SParseBasicCtx ctx;
|
uint64_t requestId;
|
||||||
|
int32_t acctId;
|
||||||
|
const char *db;
|
||||||
|
void *pTransporter;
|
||||||
|
SEpSet mgmtEpSet;
|
||||||
const char *pSql; // sql string
|
const char *pSql; // sql string
|
||||||
size_t sqlLen; // length of the sql string
|
size_t sqlLen; // length of the sql string
|
||||||
char *pMsg; // extended error message if exists to help identifying the problem in sql statement.
|
char *pMsg; // extended error message if exists to help identifying the problem in sql statement.
|
||||||
int32_t msgLen; // max length of the msg
|
int32_t msgLen; // max length of the msg
|
||||||
|
|
||||||
|
struct SCatalog *pCatalog;
|
||||||
} SParseContext;
|
} SParseContext;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -93,6 +93,8 @@ typedef struct SScanPhyNode {
|
||||||
SPhyNode node;
|
SPhyNode node;
|
||||||
uint64_t uid; // unique id of the table
|
uint64_t uid; // unique id of the table
|
||||||
int8_t tableType;
|
int8_t tableType;
|
||||||
|
int32_t order; // scan order: TSDB_ORDER_ASC|TSDB_ORDER_DESC
|
||||||
|
int32_t count; // repeat count
|
||||||
} SScanPhyNode;
|
} SScanPhyNode;
|
||||||
|
|
||||||
typedef SScanPhyNode SSystemTableScanPhyNode;
|
typedef SScanPhyNode SSystemTableScanPhyNode;
|
||||||
|
@ -117,6 +119,25 @@ typedef struct SExchangePhyNode {
|
||||||
SArray *pSrcEndPoints; // SEpAddr, scheduler fill by calling qSetSuplanExecutionNode
|
SArray *pSrcEndPoints; // SEpAddr, scheduler fill by calling qSetSuplanExecutionNode
|
||||||
} SExchangePhyNode;
|
} SExchangePhyNode;
|
||||||
|
|
||||||
|
typedef enum EAggAlgo {
|
||||||
|
AGG_ALGO_PLAIN = 1, // simple agg across all input rows
|
||||||
|
AGG_ALGO_SORTED, // grouped agg, input must be sorted
|
||||||
|
AGG_ALGO_HASHED // grouped agg, use internal hashtable
|
||||||
|
} EAggAlgo;
|
||||||
|
|
||||||
|
typedef enum EAggSplit {
|
||||||
|
AGG_SPLIT_PRE = 1, // first level agg, maybe don't need calculate the final result
|
||||||
|
AGG_SPLIT_FINAL // second level agg, must calculate the final result
|
||||||
|
} EAggSplit;
|
||||||
|
|
||||||
|
typedef struct SAggPhyNode {
|
||||||
|
SPhyNode node;
|
||||||
|
EAggAlgo aggAlgo; // algorithm used by agg operator
|
||||||
|
EAggSplit aggSplit; // distributed splitting mode
|
||||||
|
SArray *pExprs; // SExprInfo list, these are expression list of group_by_clause and parameter expression of aggregate function
|
||||||
|
SArray *pGroupByList; // SColIndex list, but these must be column node
|
||||||
|
} SAggPhyNode;
|
||||||
|
|
||||||
typedef struct SSubplanId {
|
typedef struct SSubplanId {
|
||||||
uint64_t queryId;
|
uint64_t queryId;
|
||||||
uint64_t templateId;
|
uint64_t templateId;
|
||||||
|
|
|
@ -30,7 +30,7 @@ OP_ENUM_MACRO(TagScan)
|
||||||
OP_ENUM_MACRO(SystemTableScan)
|
OP_ENUM_MACRO(SystemTableScan)
|
||||||
OP_ENUM_MACRO(Aggregate)
|
OP_ENUM_MACRO(Aggregate)
|
||||||
OP_ENUM_MACRO(Project)
|
OP_ENUM_MACRO(Project)
|
||||||
OP_ENUM_MACRO(Groupby)
|
// OP_ENUM_MACRO(Groupby)
|
||||||
OP_ENUM_MACRO(Limit)
|
OP_ENUM_MACRO(Limit)
|
||||||
OP_ENUM_MACRO(SLimit)
|
OP_ENUM_MACRO(SLimit)
|
||||||
OP_ENUM_MACRO(TimeWindow)
|
OP_ENUM_MACRO(TimeWindow)
|
||||||
|
|
|
@ -20,8 +20,10 @@
|
||||||
extern "C" {
|
extern "C" {
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#include "planner.h"
|
|
||||||
#include "catalog.h"
|
#include "catalog.h"
|
||||||
|
#include "planner.h"
|
||||||
|
|
||||||
|
struct SSchJob;
|
||||||
|
|
||||||
typedef struct SSchedulerCfg {
|
typedef struct SSchedulerCfg {
|
||||||
uint32_t maxJobNum;
|
uint32_t maxJobNum;
|
||||||
|
@ -65,7 +67,7 @@ int32_t schedulerInit(SSchedulerCfg *cfg);
|
||||||
* @param nodeList Qnode/Vnode address list, element is SQueryNodeAddr
|
* @param nodeList Qnode/Vnode address list, element is SQueryNodeAddr
|
||||||
* @return
|
* @return
|
||||||
*/
|
*/
|
||||||
int32_t scheduleExecJob(void *transport, SArray *nodeList, SQueryDag* pDag, void** pJob, SQueryResult *pRes);
|
int32_t scheduleExecJob(void *transport, SArray *nodeList, SQueryDag* pDag, struct SSchJob** pJob, SQueryResult *pRes);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Process the query job, generated according to the query physical plan.
|
* Process the query job, generated according to the query physical plan.
|
||||||
|
@ -73,7 +75,7 @@ int32_t scheduleExecJob(void *transport, SArray *nodeList, SQueryDag* pDag, void
|
||||||
* @param nodeList Qnode/Vnode address list, element is SQueryNodeAddr
|
* @param nodeList Qnode/Vnode address list, element is SQueryNodeAddr
|
||||||
* @return
|
* @return
|
||||||
*/
|
*/
|
||||||
int32_t scheduleAsyncExecJob(void *transport, SArray *nodeList, SQueryDag* pDag, void** pJob);
|
int32_t scheduleAsyncExecJob(void *transport, SArray *nodeList, SQueryDag* pDag, struct SSchJob** pJob);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Fetch query result from the remote query executor
|
* Fetch query result from the remote query executor
|
||||||
|
@ -81,7 +83,7 @@ int32_t scheduleAsyncExecJob(void *transport, SArray *nodeList, SQueryDag* pDag,
|
||||||
* @param data
|
* @param data
|
||||||
* @return
|
* @return
|
||||||
*/
|
*/
|
||||||
int32_t scheduleFetchRows(void *pJob, void **data);
|
int32_t scheduleFetchRows(struct SSchJob *pJob, void **data);
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -89,7 +91,7 @@ int32_t scheduleFetchRows(void *pJob, void **data);
|
||||||
* @param pJob
|
* @param pJob
|
||||||
* @return
|
* @return
|
||||||
*/
|
*/
|
||||||
int32_t scheduleCancelJob(void *pJob);
|
//int32_t scheduleCancelJob(void *pJob);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Free the query job
|
* Free the query job
|
||||||
|
|
|
@ -49,7 +49,7 @@ typedef struct {
|
||||||
} STierMeta;
|
} STierMeta;
|
||||||
|
|
||||||
int tfsInit(SDiskCfg *pDiskCfg, int ndisk);
|
int tfsInit(SDiskCfg *pDiskCfg, int ndisk);
|
||||||
void tfsDestroy();
|
void tfsCleanup();
|
||||||
void tfsUpdateInfo(SFSMeta *pFSMeta, STierMeta *tierMetas, int8_t numLevels);
|
void tfsUpdateInfo(SFSMeta *pFSMeta, STierMeta *tierMetas, int8_t numLevels);
|
||||||
void tfsGetMeta(SFSMeta *pMeta);
|
void tfsGetMeta(SFSMeta *pMeta);
|
||||||
void tfsAllocDisk(int expLevel, int *level, int *id);
|
void tfsAllocDisk(int expLevel, int *level, int *id);
|
||||||
|
|
|
@ -1,64 +0,0 @@
|
||||||
/*
|
|
||||||
* Copyright (c) 2019 TAOS Data, Inc. <jhtao@taosdata.com>
|
|
||||||
*
|
|
||||||
* This program is free software: you can use, redistribute, and/or modify
|
|
||||||
* it under the terms of the GNU Affero General Public License, version 3
|
|
||||||
* or later ("AGPL"), as published by the Free Software Foundation.
|
|
||||||
*
|
|
||||||
* This program is distributed in the hope that it will be useful, but WITHOUT
|
|
||||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
|
||||||
* FITNESS FOR A PARTICULAR PURPOSE.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU Affero General Public License
|
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef _TD_TKV_H_
|
|
||||||
#define _TD_TKV_H_
|
|
||||||
|
|
||||||
#if 0
|
|
||||||
#include "os.h"
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
extern "C" {
|
|
||||||
#endif
|
|
||||||
|
|
||||||
// Types exported
|
|
||||||
typedef struct STkvDb STkvDb;
|
|
||||||
typedef struct STkvOpts STkvOpts;
|
|
||||||
typedef struct STkvCache STkvCache;
|
|
||||||
typedef struct STkvReadOpts STkvReadOpts;
|
|
||||||
typedef struct STkvWriteOpts STkvWriteOpts;
|
|
||||||
|
|
||||||
// DB operations
|
|
||||||
STkvDb *tkvOpen(const STkvOpts *options, const char *path);
|
|
||||||
void tkvClose(STkvDb *db);
|
|
||||||
void tkvPut(STkvDb *db, const STkvWriteOpts *, const char *key, size_t keylen, const char *val, size_t vallen);
|
|
||||||
char * tkvGet(STkvDb *db, const STkvReadOpts *, const char *key, size_t keylen, size_t *vallen);
|
|
||||||
void tkvCommit(STkvDb *db);
|
|
||||||
|
|
||||||
// DB options
|
|
||||||
STkvOpts *tkvOptsCreate();
|
|
||||||
void tkvOptsDestroy(STkvOpts *);
|
|
||||||
void tkvOptionsSetCache(STkvOpts *, STkvCache *);
|
|
||||||
void tkvOptsSetCreateIfMissing(STkvOpts *, unsigned char);
|
|
||||||
|
|
||||||
// DB cache
|
|
||||||
typedef enum { TKV_LRU_CACHE = 0, TKV_LFU_CACHE = 1 } ETkvCacheType;
|
|
||||||
STkvCache *tkvCacheCreate(size_t capacity, ETkvCacheType type);
|
|
||||||
void tkvCacheDestroy(STkvCache *);
|
|
||||||
|
|
||||||
// STkvReadOpts
|
|
||||||
STkvReadOpts *tkvReadOptsCreate();
|
|
||||||
void tkvReadOptsDestroy(STkvReadOpts *);
|
|
||||||
|
|
||||||
// STkvWriteOpts
|
|
||||||
STkvWriteOpts *tkvWriteOptsCreate();
|
|
||||||
void tkvWriteOptsDestroy(STkvWriteOpts *);
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif
|
|
||||||
#endif /*_TD_TKV_H_*/
|
|
|
@ -70,6 +70,8 @@ int32_t* taosGetErrno();
|
||||||
#define TSDB_CODE_INVALID_MSG TAOS_DEF_ERROR_CODE(0, 0x0108)
|
#define TSDB_CODE_INVALID_MSG TAOS_DEF_ERROR_CODE(0, 0x0108)
|
||||||
#define TSDB_CODE_MSG_NOT_PROCESSED TAOS_DEF_ERROR_CODE(0, 0x0109)
|
#define TSDB_CODE_MSG_NOT_PROCESSED TAOS_DEF_ERROR_CODE(0, 0x0109)
|
||||||
#define TSDB_CODE_INVALID_PARA TAOS_DEF_ERROR_CODE(0, 0x010A)
|
#define TSDB_CODE_INVALID_PARA TAOS_DEF_ERROR_CODE(0, 0x010A)
|
||||||
|
#define TSDB_CODE_REPEAT_INIT TAOS_DEF_ERROR_CODE(0, 0x010B)
|
||||||
|
|
||||||
#define TSDB_CODE_REF_NO_MEMORY TAOS_DEF_ERROR_CODE(0, 0x0110)
|
#define TSDB_CODE_REF_NO_MEMORY TAOS_DEF_ERROR_CODE(0, 0x0110)
|
||||||
#define TSDB_CODE_REF_FULL TAOS_DEF_ERROR_CODE(0, 0x0111)
|
#define TSDB_CODE_REF_FULL TAOS_DEF_ERROR_CODE(0, 0x0111)
|
||||||
#define TSDB_CODE_REF_ID_REMOVED TAOS_DEF_ERROR_CODE(0, 0x0112)
|
#define TSDB_CODE_REF_ID_REMOVED TAOS_DEF_ERROR_CODE(0, 0x0112)
|
||||||
|
|
|
@ -23,6 +23,19 @@ extern "C" {
|
||||||
#include "os.h"
|
#include "os.h"
|
||||||
#include "talgo.h"
|
#include "talgo.h"
|
||||||
|
|
||||||
|
#if 0
|
||||||
|
#define TARRAY(TYPE) \
|
||||||
|
struct { \
|
||||||
|
int32_t tarray_size_; \
|
||||||
|
int32_t tarray_neles_; \
|
||||||
|
struct TYPE* td_array_data_; \
|
||||||
|
}
|
||||||
|
|
||||||
|
#define TARRAY_SIZE(ARRAY) (ARRAY)->tarray_size_
|
||||||
|
#define TARRAY_NELES(ARRAY) (ARRAY)->tarray_neles_
|
||||||
|
#define TARRAY_ELE_AT(ARRAY, IDX) ((ARRAY)->td_array_data_ + idx)
|
||||||
|
#endif
|
||||||
|
|
||||||
#define TARRAY_MIN_SIZE 8
|
#define TARRAY_MIN_SIZE 8
|
||||||
#define TARRAY_GET_ELEM(array, index) ((void*)((char*)((array)->pData) + (index) * (array)->elemSize))
|
#define TARRAY_GET_ELEM(array, index) ((void*)((char*)((array)->pData) + (index) * (array)->elemSize))
|
||||||
#define TARRAY_ELEM_IDX(array, ele) (POINTER_DISTANCE(ele, (array)->pData) / (array)->elemSize)
|
#define TARRAY_ELEM_IDX(array, ele) (POINTER_DISTANCE(ele, (array)->pData) / (array)->elemSize)
|
||||||
|
@ -242,7 +255,6 @@ int32_t taosArraySearchIdx(const SArray* pArray, const void* key, __compar_fn_t
|
||||||
*/
|
*/
|
||||||
char* taosArraySearchString(const SArray* pArray, const char* key, __compar_fn_t comparFn, int flags);
|
char* taosArraySearchString(const SArray* pArray, const char* key, __compar_fn_t comparFn, int flags);
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* sort the pointer data in the array
|
* sort the pointer data in the array
|
||||||
* @param pArray
|
* @param pArray
|
||||||
|
|
|
@ -133,13 +133,12 @@ typedef struct SReqResultInfo {
|
||||||
const char *pData;
|
const char *pData;
|
||||||
TAOS_FIELD *fields;
|
TAOS_FIELD *fields;
|
||||||
uint32_t numOfCols;
|
uint32_t numOfCols;
|
||||||
|
|
||||||
int32_t *length;
|
int32_t *length;
|
||||||
TAOS_ROW row;
|
TAOS_ROW row;
|
||||||
char **pCol;
|
char **pCol;
|
||||||
|
|
||||||
uint32_t numOfRows;
|
uint32_t numOfRows;
|
||||||
uint32_t current;
|
uint32_t current;
|
||||||
|
bool completed;
|
||||||
} SReqResultInfo;
|
} SReqResultInfo;
|
||||||
|
|
||||||
typedef struct SShowReqInfo {
|
typedef struct SShowReqInfo {
|
||||||
|
@ -153,6 +152,7 @@ typedef struct SRequestSendRecvBody {
|
||||||
tsem_t rspSem; // not used now
|
tsem_t rspSem; // not used now
|
||||||
void* fp;
|
void* fp;
|
||||||
SShowReqInfo showInfo; // todo this attribute will be removed after the query framework being completed.
|
SShowReqInfo showInfo; // todo this attribute will be removed after the query framework being completed.
|
||||||
|
struct SSchJob *pQueryJob; // query job, created according to sql query DAG.
|
||||||
SDataBuf requestMsg;
|
SDataBuf requestMsg;
|
||||||
SReqResultInfo resInfo;
|
SReqResultInfo resInfo;
|
||||||
} SRequestSendRecvBody;
|
} SRequestSendRecvBody;
|
||||||
|
@ -169,7 +169,6 @@ typedef struct SRequestObj {
|
||||||
char *msgBuf;
|
char *msgBuf;
|
||||||
void *pInfo; // sql parse info, generated by parser module
|
void *pInfo; // sql parse info, generated by parser module
|
||||||
int32_t code;
|
int32_t code;
|
||||||
uint64_t affectedRows;
|
|
||||||
SQueryExecMetric metric;
|
SQueryExecMetric metric;
|
||||||
SRequestSendRecvBody body;
|
SRequestSendRecvBody body;
|
||||||
} SRequestObj;
|
} SRequestObj;
|
||||||
|
@ -201,12 +200,13 @@ int taos_options_imp(TSDB_OPTION option, const char *str);
|
||||||
void* openTransporter(const char *user, const char *auth, int32_t numOfThreads);
|
void* openTransporter(const char *user, const char *auth, int32_t numOfThreads);
|
||||||
|
|
||||||
void processMsgFromServer(void* parent, SRpcMsg* pMsg, SEpSet* pEpSet);
|
void processMsgFromServer(void* parent, SRpcMsg* pMsg, SEpSet* pEpSet);
|
||||||
|
|
||||||
void initMsgHandleFp();
|
void initMsgHandleFp();
|
||||||
|
|
||||||
TAOS *taos_connect_internal(const char *ip, const char *user, const char *pass, const char *auth, const char *db, uint16_t port);
|
TAOS *taos_connect_internal(const char *ip, const char *user, const char *pass, const char *auth, const char *db, uint16_t port);
|
||||||
TAOS_RES *taos_query_l(TAOS *taos, const char *sql, int sqlLen);
|
|
||||||
|
|
||||||
void *doFetchRow(SRequestObj* pRequest);
|
void *doFetchRow(SRequestObj* pRequest);
|
||||||
|
|
||||||
void setResultDataPtr(SReqResultInfo* pResultInfo, TAOS_FIELD* pFields, int32_t numOfCols, int32_t numOfRows);
|
void setResultDataPtr(SReqResultInfo* pResultInfo, TAOS_FIELD* pFields, int32_t numOfCols, int32_t numOfRows);
|
||||||
|
|
||||||
// --- heartbeat
|
// --- heartbeat
|
||||||
|
|
|
@ -1,6 +1,10 @@
|
||||||
|
|
||||||
|
#include "../../libs/scheduler/inc/schedulerInt.h"
|
||||||
#include "clientInt.h"
|
#include "clientInt.h"
|
||||||
#include "clientLog.h"
|
#include "clientLog.h"
|
||||||
|
#include "parser.h"
|
||||||
|
#include "planner.h"
|
||||||
|
#include "scheduler.h"
|
||||||
#include "tdef.h"
|
#include "tdef.h"
|
||||||
#include "tep.h"
|
#include "tep.h"
|
||||||
#include "tglobal.h"
|
#include "tglobal.h"
|
||||||
|
@ -8,9 +12,6 @@
|
||||||
#include "tnote.h"
|
#include "tnote.h"
|
||||||
#include "tpagedfile.h"
|
#include "tpagedfile.h"
|
||||||
#include "tref.h"
|
#include "tref.h"
|
||||||
#include "parser.h"
|
|
||||||
#include "planner.h"
|
|
||||||
#include "scheduler.h"
|
|
||||||
|
|
||||||
#define CHECK_CODE_GOTO(expr, lable) \
|
#define CHECK_CODE_GOTO(expr, lable) \
|
||||||
do { \
|
do { \
|
||||||
|
@ -24,6 +25,7 @@
|
||||||
static int32_t initEpSetFromCfg(const char *firstEp, const char *secondEp, SCorEpSet *pEpSet);
|
static int32_t initEpSetFromCfg(const char *firstEp, const char *secondEp, SCorEpSet *pEpSet);
|
||||||
static SMsgSendInfo* buildConnectMsg(SRequestObj *pRequest);
|
static SMsgSendInfo* buildConnectMsg(SRequestObj *pRequest);
|
||||||
static void destroySendMsgInfo(SMsgSendInfo* pMsgBody);
|
static void destroySendMsgInfo(SMsgSendInfo* pMsgBody);
|
||||||
|
static void setQueryResultByRsp(SReqResultInfo* pResultInfo, const SRetrieveTableRsp* pRsp);
|
||||||
|
|
||||||
static bool stringLengthCheck(const char* str, size_t maxsize) {
|
static bool stringLengthCheck(const char* str, size_t maxsize) {
|
||||||
if (str == NULL) {
|
if (str == NULL) {
|
||||||
|
@ -57,6 +59,7 @@ static char* getClusterKey(const char* user, const char* auth, const char* ip, i
|
||||||
}
|
}
|
||||||
|
|
||||||
static STscObj* taosConnectImpl(const char *ip, const char *user, const char *auth, const char *db, uint16_t port, __taos_async_fn_t fp, void *param, SAppInstInfo* pAppInfo);
|
static STscObj* taosConnectImpl(const char *ip, const char *user, const char *auth, const char *db, uint16_t port, __taos_async_fn_t fp, void *param, SAppInstInfo* pAppInfo);
|
||||||
|
static void setResSchemaInfo(SReqResultInfo* pResInfo, const SDataBlockSchema* pDataBlockSchema);
|
||||||
|
|
||||||
TAOS *taos_connect_internal(const char *ip, const char *user, const char *pass, const char *auth, const char *db, uint16_t port) {
|
TAOS *taos_connect_internal(const char *ip, const char *user, const char *pass, const char *auth, const char *db, uint16_t port) {
|
||||||
if (taos_init() != TSDB_CODE_SUCCESS) {
|
if (taos_init() != TSDB_CODE_SUCCESS) {
|
||||||
|
@ -149,23 +152,26 @@ int32_t parseSql(SRequestObj* pRequest, SQueryNode** pQuery) {
|
||||||
STscObj* pTscObj = pRequest->pTscObj;
|
STscObj* pTscObj = pRequest->pTscObj;
|
||||||
|
|
||||||
SParseContext cxt = {
|
SParseContext cxt = {
|
||||||
.ctx = {.requestId = pRequest->requestId, .acctId = pTscObj->acctId, .db = getConnectionDB(pTscObj), .pTransporter = pTscObj->pTransporter},
|
.requestId = pRequest->requestId,
|
||||||
|
.acctId = pTscObj->acctId,
|
||||||
|
.db = getConnectionDB(pTscObj),
|
||||||
|
.pTransporter = pTscObj->pTransporter,
|
||||||
.pSql = pRequest->sqlstr,
|
.pSql = pRequest->sqlstr,
|
||||||
.sqlLen = pRequest->sqlLen,
|
.sqlLen = pRequest->sqlLen,
|
||||||
.pMsg = pRequest->msgBuf,
|
.pMsg = pRequest->msgBuf,
|
||||||
.msgLen = ERROR_MSG_BUF_DEFAULT_SIZE
|
.msgLen = ERROR_MSG_BUF_DEFAULT_SIZE
|
||||||
};
|
};
|
||||||
|
|
||||||
cxt.ctx.mgmtEpSet = getEpSet_s(&pTscObj->pAppInfo->mgmtEp);
|
cxt.mgmtEpSet = getEpSet_s(&pTscObj->pAppInfo->mgmtEp);
|
||||||
int32_t code = catalogGetHandle(pTscObj->pAppInfo->clusterId, &cxt.ctx.pCatalog);
|
int32_t code = catalogGetHandle(pTscObj->pAppInfo->clusterId, &cxt.pCatalog);
|
||||||
if (code != TSDB_CODE_SUCCESS) {
|
if (code != TSDB_CODE_SUCCESS) {
|
||||||
tfree(cxt.ctx.db);
|
tfree(cxt.db);
|
||||||
return code;
|
return code;
|
||||||
}
|
}
|
||||||
|
|
||||||
code = qParseQuerySql(&cxt, pQuery);
|
code = qParseQuerySql(&cxt, pQuery);
|
||||||
|
|
||||||
tfree(cxt.ctx.db);
|
tfree(cxt.db);
|
||||||
return code;
|
return code;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -198,27 +204,59 @@ int32_t execDdlQuery(SRequestObj* pRequest, SQueryNode* pQuery) {
|
||||||
|
|
||||||
int32_t getPlan(SRequestObj* pRequest, SQueryNode* pQueryNode, SQueryDag** pDag) {
|
int32_t getPlan(SRequestObj* pRequest, SQueryNode* pQueryNode, SQueryDag** pDag) {
|
||||||
pRequest->type = pQueryNode->type;
|
pRequest->type = pQueryNode->type;
|
||||||
return qCreateQueryDag(pQueryNode, pDag, pRequest->requestId);
|
|
||||||
|
SReqResultInfo* pResInfo = &pRequest->body.resInfo;
|
||||||
|
int32_t code = qCreateQueryDag(pQueryNode, pDag, pRequest->requestId);
|
||||||
|
if (code != 0) {
|
||||||
|
return code;
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t scheduleQuery(SRequestObj* pRequest, SQueryDag* pDag, void** pJob) {
|
if (pQueryNode->type == TSDB_SQL_SELECT) {
|
||||||
|
SArray* pa = taosArrayGetP((*pDag)->pSubplans, 0);
|
||||||
|
|
||||||
|
SSubplan* pPlan = taosArrayGetP(pa, 0);
|
||||||
|
SDataBlockSchema* pDataBlockSchema = &(pPlan->pDataSink->schema);
|
||||||
|
setResSchemaInfo(pResInfo, pDataBlockSchema);
|
||||||
|
|
||||||
|
pRequest->type = TDMT_VND_QUERY;
|
||||||
|
}
|
||||||
|
|
||||||
|
return code;
|
||||||
|
}
|
||||||
|
|
||||||
|
void setResSchemaInfo(SReqResultInfo* pResInfo, const SDataBlockSchema* pDataBlockSchema) {
|
||||||
|
assert(pDataBlockSchema != NULL && pDataBlockSchema->numOfCols > 0);
|
||||||
|
|
||||||
|
pResInfo->numOfCols = pDataBlockSchema->numOfCols;
|
||||||
|
pResInfo->fields = calloc(pDataBlockSchema->numOfCols, sizeof(pDataBlockSchema->pSchema[0]));
|
||||||
|
|
||||||
|
for (int32_t i = 0; i < pResInfo->numOfCols; ++i) {
|
||||||
|
SSchema* pSchema = &pDataBlockSchema->pSchema[i];
|
||||||
|
pResInfo->fields[i].bytes = pSchema->bytes;
|
||||||
|
pResInfo->fields[i].type = pSchema->type;
|
||||||
|
tstrncpy(pResInfo->fields[i].name, pSchema->name, tListLen(pResInfo->fields[i].name));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
int32_t scheduleQuery(SRequestObj* pRequest, SQueryDag* pDag) {
|
||||||
if (TSDB_SQL_INSERT == pRequest->type || TSDB_SQL_CREATE_TABLE == pRequest->type) {
|
if (TSDB_SQL_INSERT == pRequest->type || TSDB_SQL_CREATE_TABLE == pRequest->type) {
|
||||||
SQueryResult res = {.code = 0, .numOfRows = 0, .msgSize = ERROR_MSG_BUF_DEFAULT_SIZE, .msg = pRequest->msgBuf};
|
SQueryResult res = {.code = 0, .numOfRows = 0, .msgSize = ERROR_MSG_BUF_DEFAULT_SIZE, .msg = pRequest->msgBuf};
|
||||||
|
|
||||||
int32_t code = scheduleExecJob(pRequest->pTscObj->pTransporter, NULL, pDag, pJob, &res);
|
int32_t code = scheduleExecJob(pRequest->pTscObj->pTransporter, NULL, pDag, &pRequest->body.pQueryJob, &res);
|
||||||
if (code != TSDB_CODE_SUCCESS) {
|
if (code != TSDB_CODE_SUCCESS) {
|
||||||
// handle error and retry
|
// handle error and retry
|
||||||
} else {
|
} else {
|
||||||
if (*pJob != NULL) {
|
if (pRequest->body.pQueryJob != NULL) {
|
||||||
scheduleFreeJob(*pJob);
|
scheduleFreeJob(pRequest->body.pQueryJob);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pRequest->affectedRows = res.numOfRows;
|
pRequest->body.resInfo.numOfRows = res.numOfRows;
|
||||||
return res.code;
|
pRequest->code = res.code;
|
||||||
|
return pRequest->code;
|
||||||
}
|
}
|
||||||
|
|
||||||
return scheduleAsyncExecJob(pRequest->pTscObj->pTransporter, NULL /*todo appInfo.xxx*/, pDag, pJob);
|
return scheduleAsyncExecJob(pRequest->pTscObj->pTransporter, NULL, pDag, &pRequest->body.pQueryJob);
|
||||||
}
|
}
|
||||||
|
|
||||||
typedef struct tmq_t tmq_t;
|
typedef struct tmq_t tmq_t;
|
||||||
|
@ -409,7 +447,6 @@ TAOS_RES *taos_query_l(TAOS *taos, const char *sql, int sqlLen) {
|
||||||
SRequestObj *pRequest = NULL;
|
SRequestObj *pRequest = NULL;
|
||||||
SQueryNode *pQuery = NULL;
|
SQueryNode *pQuery = NULL;
|
||||||
SQueryDag *pDag = NULL;
|
SQueryDag *pDag = NULL;
|
||||||
void *pJob = NULL;
|
|
||||||
|
|
||||||
terrno = TSDB_CODE_SUCCESS;
|
terrno = TSDB_CODE_SUCCESS;
|
||||||
CHECK_CODE_GOTO(buildRequest(pTscObj, sql, sqlLen, &pRequest), _return);
|
CHECK_CODE_GOTO(buildRequest(pTscObj, sql, sqlLen, &pRequest), _return);
|
||||||
|
@ -419,9 +456,8 @@ TAOS_RES *taos_query_l(TAOS *taos, const char *sql, int sqlLen) {
|
||||||
CHECK_CODE_GOTO(execDdlQuery(pRequest, pQuery), _return);
|
CHECK_CODE_GOTO(execDdlQuery(pRequest, pQuery), _return);
|
||||||
} else {
|
} else {
|
||||||
CHECK_CODE_GOTO(getPlan(pRequest, pQuery, &pDag), _return);
|
CHECK_CODE_GOTO(getPlan(pRequest, pQuery, &pDag), _return);
|
||||||
CHECK_CODE_GOTO(scheduleQuery(pRequest, pDag, &pJob), _return);
|
CHECK_CODE_GOTO(scheduleQuery(pRequest, pDag), _return);
|
||||||
pRequest->code = terrno;
|
pRequest->code = terrno;
|
||||||
return pRequest;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
_return:
|
_return:
|
||||||
|
@ -430,6 +466,7 @@ _return:
|
||||||
if (NULL != pRequest && TSDB_CODE_SUCCESS != terrno) {
|
if (NULL != pRequest && TSDB_CODE_SUCCESS != terrno) {
|
||||||
pRequest->code = terrno;
|
pRequest->code = terrno;
|
||||||
}
|
}
|
||||||
|
|
||||||
return pRequest;
|
return pRequest;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -628,7 +665,21 @@ void* doFetchRow(SRequestObj* pRequest) {
|
||||||
SReqResultInfo* pResultInfo = &pRequest->body.resInfo;
|
SReqResultInfo* pResultInfo = &pRequest->body.resInfo;
|
||||||
|
|
||||||
if (pResultInfo->pData == NULL || pResultInfo->current >= pResultInfo->numOfRows) {
|
if (pResultInfo->pData == NULL || pResultInfo->current >= pResultInfo->numOfRows) {
|
||||||
if (pRequest->type == TDMT_MND_SHOW) {
|
if (pRequest->type == TDMT_VND_QUERY) {
|
||||||
|
// All data has returned to App already, no need to try again
|
||||||
|
if (pResultInfo->completed) {
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
scheduleFetchRows(pRequest->body.pQueryJob, (void **)&pRequest->body.resInfo.pData);
|
||||||
|
setQueryResultByRsp(&pRequest->body.resInfo, (SRetrieveTableRsp*)pRequest->body.resInfo.pData);
|
||||||
|
|
||||||
|
if (pResultInfo->numOfRows == 0) {
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
goto _return;
|
||||||
|
} else if (pRequest->type == TDMT_MND_SHOW) {
|
||||||
pRequest->type = TDMT_MND_SHOW_RETRIEVE;
|
pRequest->type = TDMT_MND_SHOW_RETRIEVE;
|
||||||
} else if (pRequest->type == TDMT_VND_SHOW_TABLES) {
|
} else if (pRequest->type == TDMT_VND_SHOW_TABLES) {
|
||||||
pRequest->type = TDMT_VND_SHOW_TABLES_FETCH;
|
pRequest->type = TDMT_VND_SHOW_TABLES_FETCH;
|
||||||
|
@ -671,6 +722,8 @@ void* doFetchRow(SRequestObj* pRequest) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
_return:
|
||||||
|
|
||||||
for(int32_t i = 0; i < pResultInfo->numOfCols; ++i) {
|
for(int32_t i = 0; i < pResultInfo->numOfCols; ++i) {
|
||||||
pResultInfo->row[i] = pResultInfo->pCol[i] + pResultInfo->fields[i].bytes * pResultInfo->current;
|
pResultInfo->row[i] = pResultInfo->pCol[i] + pResultInfo->fields[i].bytes * pResultInfo->current;
|
||||||
if (IS_VAR_DATA_TYPE(pResultInfo->fields[i].type)) {
|
if (IS_VAR_DATA_TYPE(pResultInfo->fields[i].type)) {
|
||||||
|
@ -683,12 +736,23 @@ void* doFetchRow(SRequestObj* pRequest) {
|
||||||
return pResultInfo->row;
|
return pResultInfo->row;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void doPrepareResPtr(SReqResultInfo* pResInfo) {
|
||||||
|
if (pResInfo->row == NULL) {
|
||||||
|
pResInfo->row = calloc(pResInfo->numOfCols, POINTER_BYTES);
|
||||||
|
pResInfo->pCol = calloc(pResInfo->numOfCols, POINTER_BYTES);
|
||||||
|
pResInfo->length = calloc(pResInfo->numOfCols, sizeof(int32_t));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void setResultDataPtr(SReqResultInfo* pResultInfo, TAOS_FIELD* pFields, int32_t numOfCols, int32_t numOfRows) {
|
void setResultDataPtr(SReqResultInfo* pResultInfo, TAOS_FIELD* pFields, int32_t numOfCols, int32_t numOfRows) {
|
||||||
assert(numOfCols > 0 && pFields != NULL && pResultInfo != NULL);
|
assert(numOfCols > 0 && pFields != NULL && pResultInfo != NULL);
|
||||||
if (numOfRows == 0) {
|
if (numOfRows == 0) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// todo check for the failure of malloc
|
||||||
|
doPrepareResPtr(pResultInfo);
|
||||||
|
|
||||||
int32_t offset = 0;
|
int32_t offset = 0;
|
||||||
for (int32_t i = 0; i < numOfCols; ++i) {
|
for (int32_t i = 0; i < numOfCols; ++i) {
|
||||||
pResultInfo->length[i] = pResultInfo->fields[i].bytes;
|
pResultInfo->length[i] = pResultInfo->fields[i].bytes;
|
||||||
|
@ -714,3 +778,14 @@ void setConnectionDB(STscObj* pTscObj, const char* db) {
|
||||||
pthread_mutex_unlock(&pTscObj->mutex);
|
pthread_mutex_unlock(&pTscObj->mutex);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void setQueryResultByRsp(SReqResultInfo* pResultInfo, const SRetrieveTableRsp* pRsp) {
|
||||||
|
assert(pResultInfo != NULL && pRsp != NULL);
|
||||||
|
|
||||||
|
pResultInfo->pRspMsg = (const char*) pRsp;
|
||||||
|
pResultInfo->pData = (void*) pRsp->data;
|
||||||
|
pResultInfo->numOfRows = htonl(pRsp->numOfRows);
|
||||||
|
pResultInfo->current = 0;
|
||||||
|
pResultInfo->completed = (pRsp->completed == 1);
|
||||||
|
|
||||||
|
setResultDataPtr(pResultInfo, pResultInfo->fields, pResultInfo->numOfCols, pResultInfo->numOfRows);
|
||||||
|
}
|
|
@ -265,7 +265,13 @@ const char *taos_data_type(int type) {
|
||||||
const char *taos_get_client_info() { return version; }
|
const char *taos_get_client_info() { return version; }
|
||||||
|
|
||||||
int taos_affected_rows(TAOS_RES *res) {
|
int taos_affected_rows(TAOS_RES *res) {
|
||||||
return ((SRequestObj*)res)->affectedRows;
|
if (res == NULL) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
SRequestObj* pRequest = (SRequestObj*) res;
|
||||||
|
SReqResultInfo* pResInfo = &pRequest->body.resInfo;
|
||||||
|
return pResInfo->numOfRows;
|
||||||
}
|
}
|
||||||
|
|
||||||
int taos_result_precision(TAOS_RES *res) { return TSDB_TIME_PRECISION_MILLI; }
|
int taos_result_precision(TAOS_RES *res) { return TSDB_TIME_PRECISION_MILLI; }
|
||||||
|
|
|
@ -157,9 +157,6 @@ int32_t processShowRsp(void* param, const SDataBuf* pMsg, int32_t code) {
|
||||||
|
|
||||||
pResInfo->fields = pFields;
|
pResInfo->fields = pFields;
|
||||||
pResInfo->numOfCols = pMetaMsg->numOfColumns;
|
pResInfo->numOfCols = pMetaMsg->numOfColumns;
|
||||||
pResInfo->row = calloc(pResInfo->numOfCols, POINTER_BYTES);
|
|
||||||
pResInfo->pCol = calloc(pResInfo->numOfCols, POINTER_BYTES);
|
|
||||||
pResInfo->length = calloc(pResInfo->numOfCols, sizeof(int32_t));
|
|
||||||
|
|
||||||
pRequest->body.showInfo.execId = pShow->showId;
|
pRequest->body.showInfo.execId = pShow->showId;
|
||||||
|
|
||||||
|
|
|
@ -24,7 +24,6 @@
|
||||||
|
|
||||||
#include "../inc/clientInt.h"
|
#include "../inc/clientInt.h"
|
||||||
#include "taos.h"
|
#include "taos.h"
|
||||||
#include "tglobal.h"
|
|
||||||
|
|
||||||
namespace {
|
namespace {
|
||||||
void showDB(TAOS* pConn) {
|
void showDB(TAOS* pConn) {
|
||||||
|
@ -57,242 +56,242 @@ TEST(testCase, connect_Test) {
|
||||||
taos_close(pConn);
|
taos_close(pConn);
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST(testCase, create_user_Test) {
|
//TEST(testCase, create_user_Test) {
|
||||||
TAOS* pConn = taos_connect("localhost", "root", "taosdata", NULL, 0);
|
|
||||||
assert(pConn != NULL);
|
|
||||||
|
|
||||||
TAOS_RES* pRes = taos_query(pConn, "create user abc pass 'abc'");
|
|
||||||
if (taos_errno(pRes) != TSDB_CODE_SUCCESS) {
|
|
||||||
printf("failed to create user, reason:%s\n", taos_errstr(pRes));
|
|
||||||
}
|
|
||||||
|
|
||||||
taos_free_result(pRes);
|
|
||||||
taos_close(pConn);
|
|
||||||
}
|
|
||||||
|
|
||||||
TEST(testCase, create_account_Test) {
|
|
||||||
TAOS* pConn = taos_connect("localhost", "root", "taosdata", NULL, 0);
|
|
||||||
assert(pConn != NULL);
|
|
||||||
|
|
||||||
TAOS_RES* pRes = taos_query(pConn, "create account aabc pass 'abc'");
|
|
||||||
if (taos_errno(pRes) != TSDB_CODE_SUCCESS) {
|
|
||||||
printf("failed to create user, reason:%s\n", taos_errstr(pRes));
|
|
||||||
}
|
|
||||||
|
|
||||||
taos_free_result(pRes);
|
|
||||||
taos_close(pConn);
|
|
||||||
}
|
|
||||||
|
|
||||||
TEST(testCase, drop_account_Test) {
|
|
||||||
TAOS* pConn = taos_connect("localhost", "root", "taosdata", NULL, 0);
|
|
||||||
assert(pConn != NULL);
|
|
||||||
|
|
||||||
TAOS_RES* pRes = taos_query(pConn, "drop account aabc");
|
|
||||||
if (taos_errno(pRes) != TSDB_CODE_SUCCESS) {
|
|
||||||
printf("failed to create user, reason:%s\n", taos_errstr(pRes));
|
|
||||||
}
|
|
||||||
|
|
||||||
taos_free_result(pRes);
|
|
||||||
taos_close(pConn);
|
|
||||||
}
|
|
||||||
|
|
||||||
TEST(testCase, show_user_Test) {
|
|
||||||
TAOS* pConn = taos_connect("localhost", "root", "taosdata", NULL, 0);
|
|
||||||
assert(pConn != NULL);
|
|
||||||
|
|
||||||
TAOS_RES* pRes = taos_query(pConn, "show users");
|
|
||||||
TAOS_ROW pRow = NULL;
|
|
||||||
|
|
||||||
TAOS_FIELD* pFields = taos_fetch_fields(pRes);
|
|
||||||
int32_t numOfFields = taos_num_fields(pRes);
|
|
||||||
|
|
||||||
char str[512] = {0};
|
|
||||||
while ((pRow = taos_fetch_row(pRes)) != NULL) {
|
|
||||||
int32_t code = taos_print_row(str, pRow, pFields, numOfFields);
|
|
||||||
printf("%s\n", str);
|
|
||||||
}
|
|
||||||
|
|
||||||
taos_free_result(pRes);
|
|
||||||
taos_close(pConn);
|
|
||||||
}
|
|
||||||
|
|
||||||
TEST(testCase, drop_user_Test) {
|
|
||||||
TAOS* pConn = taos_connect("localhost", "root", "taosdata", NULL, 0);
|
|
||||||
assert(pConn != NULL);
|
|
||||||
|
|
||||||
TAOS_RES* pRes = taos_query(pConn, "drop user abc");
|
|
||||||
if (taos_errno(pRes) != TSDB_CODE_SUCCESS) {
|
|
||||||
printf("failed to create user, reason:%s\n", taos_errstr(pRes));
|
|
||||||
}
|
|
||||||
|
|
||||||
taos_free_result(pRes);
|
|
||||||
taos_close(pConn);
|
|
||||||
}
|
|
||||||
|
|
||||||
TEST(testCase, show_db_Test) {
|
|
||||||
TAOS* pConn = taos_connect("localhost", "root", "taosdata", NULL, 0);
|
|
||||||
assert(pConn != NULL);
|
|
||||||
|
|
||||||
TAOS_RES* pRes = taos_query(pConn, "show databases");
|
|
||||||
TAOS_ROW pRow = NULL;
|
|
||||||
|
|
||||||
TAOS_FIELD* pFields = taos_fetch_fields(pRes);
|
|
||||||
int32_t numOfFields = taos_num_fields(pRes);
|
|
||||||
|
|
||||||
char str[512] = {0};
|
|
||||||
while ((pRow = taos_fetch_row(pRes)) != NULL) {
|
|
||||||
int32_t code = taos_print_row(str, pRow, pFields, numOfFields);
|
|
||||||
printf("%s\n", str);
|
|
||||||
}
|
|
||||||
|
|
||||||
taos_close(pConn);
|
|
||||||
}
|
|
||||||
|
|
||||||
TEST(testCase, create_db_Test) {
|
|
||||||
TAOS* pConn = taos_connect("localhost", "root", "taosdata", NULL, 0);
|
|
||||||
assert(pConn != NULL);
|
|
||||||
|
|
||||||
TAOS_RES* pRes = taos_query(pConn, "create database abc1 vgroups 2");
|
|
||||||
if (taos_errno(pRes) != 0) {
|
|
||||||
printf("error in create db, reason:%s\n", taos_errstr(pRes));
|
|
||||||
}
|
|
||||||
|
|
||||||
TAOS_FIELD* pFields = taos_fetch_fields(pRes);
|
|
||||||
ASSERT_TRUE(pFields == NULL);
|
|
||||||
|
|
||||||
int32_t numOfFields = taos_num_fields(pRes);
|
|
||||||
ASSERT_EQ(numOfFields, 0);
|
|
||||||
|
|
||||||
taos_free_result(pRes);
|
|
||||||
|
|
||||||
pRes = taos_query(pConn, "create database abc1 vgroups 4");
|
|
||||||
if (taos_errno(pRes) != 0) {
|
|
||||||
printf("error in create db, reason:%s\n", taos_errstr(pRes));
|
|
||||||
}
|
|
||||||
taos_close(pConn);
|
|
||||||
}
|
|
||||||
|
|
||||||
TEST(testCase, create_dnode_Test) {
|
|
||||||
TAOS* pConn = taos_connect("localhost", "root", "taosdata", NULL, 0);
|
|
||||||
assert(pConn != NULL);
|
|
||||||
|
|
||||||
TAOS_RES* pRes = taos_query(pConn, "create dnode abc1 port 7000");
|
|
||||||
if (taos_errno(pRes) != 0) {
|
|
||||||
printf("error in create dnode, reason:%s\n", taos_errstr(pRes));
|
|
||||||
}
|
|
||||||
taos_free_result(pRes);
|
|
||||||
|
|
||||||
pRes = taos_query(pConn, "create dnode 1.1.1.1 port 9000");
|
|
||||||
if (taos_errno(pRes) != 0) {
|
|
||||||
printf("failed to create dnode, reason:%s\n", taos_errstr(pRes));
|
|
||||||
}
|
|
||||||
taos_free_result(pRes);
|
|
||||||
|
|
||||||
taos_close(pConn);
|
|
||||||
}
|
|
||||||
|
|
||||||
TEST(testCase, drop_dnode_Test) {
|
|
||||||
TAOS* pConn = taos_connect("localhost", "root", "taosdata", NULL, 0);
|
|
||||||
assert(pConn != NULL);
|
|
||||||
|
|
||||||
TAOS_RES* pRes = taos_query(pConn, "drop dnode 2");
|
|
||||||
if (taos_errno(pRes) != 0) {
|
|
||||||
printf("error in drop dnode, reason:%s\n", taos_errstr(pRes));
|
|
||||||
}
|
|
||||||
|
|
||||||
TAOS_FIELD* pFields = taos_fetch_fields(pRes);
|
|
||||||
ASSERT_TRUE(pFields == NULL);
|
|
||||||
|
|
||||||
int32_t numOfFields = taos_num_fields(pRes);
|
|
||||||
ASSERT_EQ(numOfFields, 0);
|
|
||||||
|
|
||||||
taos_free_result(pRes);
|
|
||||||
taos_close(pConn);
|
|
||||||
}
|
|
||||||
|
|
||||||
TEST(testCase, use_db_test) {
|
|
||||||
TAOS* pConn = taos_connect("localhost", "root", "taosdata", NULL, 0);
|
|
||||||
assert(pConn != NULL);
|
|
||||||
|
|
||||||
TAOS_RES* pRes = taos_query(pConn, "use abc1");
|
|
||||||
if (taos_errno(pRes) != 0) {
|
|
||||||
printf("error in use db, reason:%s\n", taos_errstr(pRes));
|
|
||||||
}
|
|
||||||
|
|
||||||
TAOS_FIELD* pFields = taos_fetch_fields(pRes);
|
|
||||||
ASSERT_TRUE(pFields == NULL);
|
|
||||||
|
|
||||||
int32_t numOfFields = taos_num_fields(pRes);
|
|
||||||
ASSERT_EQ(numOfFields, 0);
|
|
||||||
|
|
||||||
taos_close(pConn);
|
|
||||||
}
|
|
||||||
|
|
||||||
// TEST(testCase, drop_db_test) {
|
|
||||||
// TAOS* pConn = taos_connect("localhost", "root", "taosdata", NULL, 0);
|
// TAOS* pConn = taos_connect("localhost", "root", "taosdata", NULL, 0);
|
||||||
// assert(pConn != NULL);
|
// assert(pConn != NULL);
|
||||||
//
|
//
|
||||||
// showDB(pConn);
|
// TAOS_RES* pRes = taos_query(pConn, "create user abc pass 'abc'");
|
||||||
|
// if (taos_errno(pRes) != TSDB_CODE_SUCCESS) {
|
||||||
|
// printf("failed to create user, reason:%s\n", taos_errstr(pRes));
|
||||||
|
// }
|
||||||
//
|
//
|
||||||
// TAOS_RES* pRes = taos_query(pConn, "drop database abc1");
|
// taos_free_result(pRes);
|
||||||
|
// taos_close(pConn);
|
||||||
|
//}
|
||||||
|
//
|
||||||
|
//TEST(testCase, create_account_Test) {
|
||||||
|
// TAOS* pConn = taos_connect("localhost", "root", "taosdata", NULL, 0);
|
||||||
|
// assert(pConn != NULL);
|
||||||
|
//
|
||||||
|
// TAOS_RES* pRes = taos_query(pConn, "create account aabc pass 'abc'");
|
||||||
|
// if (taos_errno(pRes) != TSDB_CODE_SUCCESS) {
|
||||||
|
// printf("failed to create user, reason:%s\n", taos_errstr(pRes));
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
// taos_free_result(pRes);
|
||||||
|
// taos_close(pConn);
|
||||||
|
//}
|
||||||
|
//
|
||||||
|
//TEST(testCase, drop_account_Test) {
|
||||||
|
// TAOS* pConn = taos_connect("localhost", "root", "taosdata", NULL, 0);
|
||||||
|
// assert(pConn != NULL);
|
||||||
|
//
|
||||||
|
// TAOS_RES* pRes = taos_query(pConn, "drop account aabc");
|
||||||
|
// if (taos_errno(pRes) != TSDB_CODE_SUCCESS) {
|
||||||
|
// printf("failed to create user, reason:%s\n", taos_errstr(pRes));
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
// taos_free_result(pRes);
|
||||||
|
// taos_close(pConn);
|
||||||
|
//}
|
||||||
|
//
|
||||||
|
//TEST(testCase, show_user_Test) {
|
||||||
|
// TAOS* pConn = taos_connect("localhost", "root", "taosdata", NULL, 0);
|
||||||
|
// assert(pConn != NULL);
|
||||||
|
//
|
||||||
|
// TAOS_RES* pRes = taos_query(pConn, "show users");
|
||||||
|
// TAOS_ROW pRow = NULL;
|
||||||
|
//
|
||||||
|
// TAOS_FIELD* pFields = taos_fetch_fields(pRes);
|
||||||
|
// int32_t numOfFields = taos_num_fields(pRes);
|
||||||
|
//
|
||||||
|
// char str[512] = {0};
|
||||||
|
// while ((pRow = taos_fetch_row(pRes)) != NULL) {
|
||||||
|
// int32_t code = taos_print_row(str, pRow, pFields, numOfFields);
|
||||||
|
// printf("%s\n", str);
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
// taos_free_result(pRes);
|
||||||
|
// taos_close(pConn);
|
||||||
|
//}
|
||||||
|
//
|
||||||
|
//TEST(testCase, drop_user_Test) {
|
||||||
|
// TAOS* pConn = taos_connect("localhost", "root", "taosdata", NULL, 0);
|
||||||
|
// assert(pConn != NULL);
|
||||||
|
//
|
||||||
|
// TAOS_RES* pRes = taos_query(pConn, "drop user abc");
|
||||||
|
// if (taos_errno(pRes) != TSDB_CODE_SUCCESS) {
|
||||||
|
// printf("failed to create user, reason:%s\n", taos_errstr(pRes));
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
// taos_free_result(pRes);
|
||||||
|
// taos_close(pConn);
|
||||||
|
//}
|
||||||
|
//
|
||||||
|
//TEST(testCase, show_db_Test) {
|
||||||
|
// TAOS* pConn = taos_connect("localhost", "root", "taosdata", NULL, 0);
|
||||||
|
// assert(pConn != NULL);
|
||||||
|
//
|
||||||
|
// TAOS_RES* pRes = taos_query(pConn, "show databases");
|
||||||
|
// TAOS_ROW pRow = NULL;
|
||||||
|
//
|
||||||
|
// TAOS_FIELD* pFields = taos_fetch_fields(pRes);
|
||||||
|
// int32_t numOfFields = taos_num_fields(pRes);
|
||||||
|
//
|
||||||
|
// char str[512] = {0};
|
||||||
|
// while ((pRow = taos_fetch_row(pRes)) != NULL) {
|
||||||
|
// int32_t code = taos_print_row(str, pRow, pFields, numOfFields);
|
||||||
|
// printf("%s\n", str);
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
// taos_close(pConn);
|
||||||
|
//}
|
||||||
|
//
|
||||||
|
//TEST(testCase, create_db_Test) {
|
||||||
|
// TAOS* pConn = taos_connect("localhost", "root", "taosdata", NULL, 0);
|
||||||
|
// assert(pConn != NULL);
|
||||||
|
//
|
||||||
|
// TAOS_RES* pRes = taos_query(pConn, "create database abc1 vgroups 2");
|
||||||
// if (taos_errno(pRes) != 0) {
|
// if (taos_errno(pRes) != 0) {
|
||||||
// printf("failed to drop db, reason:%s\n", taos_errstr(pRes));
|
// printf("error in create db, reason:%s\n", taos_errstr(pRes));
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
// TAOS_FIELD* pFields = taos_fetch_fields(pRes);
|
||||||
|
// ASSERT_TRUE(pFields == NULL);
|
||||||
|
//
|
||||||
|
// int32_t numOfFields = taos_num_fields(pRes);
|
||||||
|
// ASSERT_EQ(numOfFields, 0);
|
||||||
|
//
|
||||||
|
// taos_free_result(pRes);
|
||||||
|
//
|
||||||
|
// pRes = taos_query(pConn, "create database abc1 vgroups 4");
|
||||||
|
// if (taos_errno(pRes) != 0) {
|
||||||
|
// printf("error in create db, reason:%s\n", taos_errstr(pRes));
|
||||||
|
// }
|
||||||
|
// taos_close(pConn);
|
||||||
|
//}
|
||||||
|
//
|
||||||
|
//TEST(testCase, create_dnode_Test) {
|
||||||
|
// TAOS* pConn = taos_connect("localhost", "root", "taosdata", NULL, 0);
|
||||||
|
// assert(pConn != NULL);
|
||||||
|
//
|
||||||
|
// TAOS_RES* pRes = taos_query(pConn, "create dnode abc1 port 7000");
|
||||||
|
// if (taos_errno(pRes) != 0) {
|
||||||
|
// printf("error in create dnode, reason:%s\n", taos_errstr(pRes));
|
||||||
// }
|
// }
|
||||||
// taos_free_result(pRes);
|
// taos_free_result(pRes);
|
||||||
//
|
//
|
||||||
// showDB(pConn);
|
// pRes = taos_query(pConn, "create dnode 1.1.1.1 port 9000");
|
||||||
//
|
|
||||||
// pRes = taos_query(pConn, "create database abc1");
|
|
||||||
// if (taos_errno(pRes) != 0) {
|
// if (taos_errno(pRes) != 0) {
|
||||||
// printf("create to drop db, reason:%s\n", taos_errstr(pRes));
|
// printf("failed to create dnode, reason:%s\n", taos_errstr(pRes));
|
||||||
// }
|
// }
|
||||||
// taos_free_result(pRes);
|
// taos_free_result(pRes);
|
||||||
|
//
|
||||||
|
// taos_close(pConn);
|
||||||
|
//}
|
||||||
|
//
|
||||||
|
//TEST(testCase, drop_dnode_Test) {
|
||||||
|
// TAOS* pConn = taos_connect("localhost", "root", "taosdata", NULL, 0);
|
||||||
|
// assert(pConn != NULL);
|
||||||
|
//
|
||||||
|
// TAOS_RES* pRes = taos_query(pConn, "drop dnode 2");
|
||||||
|
// if (taos_errno(pRes) != 0) {
|
||||||
|
// printf("error in drop dnode, reason:%s\n", taos_errstr(pRes));
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
// TAOS_FIELD* pFields = taos_fetch_fields(pRes);
|
||||||
|
// ASSERT_TRUE(pFields == NULL);
|
||||||
|
//
|
||||||
|
// int32_t numOfFields = taos_num_fields(pRes);
|
||||||
|
// ASSERT_EQ(numOfFields, 0);
|
||||||
|
//
|
||||||
|
// taos_free_result(pRes);
|
||||||
|
// taos_close(pConn);
|
||||||
|
//}
|
||||||
|
//
|
||||||
|
//TEST(testCase, use_db_test) {
|
||||||
|
// TAOS* pConn = taos_connect("localhost", "root", "taosdata", NULL, 0);
|
||||||
|
// assert(pConn != NULL);
|
||||||
|
//
|
||||||
|
// TAOS_RES* pRes = taos_query(pConn, "use abc1");
|
||||||
|
// if (taos_errno(pRes) != 0) {
|
||||||
|
// printf("error in use db, reason:%s\n", taos_errstr(pRes));
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
// TAOS_FIELD* pFields = taos_fetch_fields(pRes);
|
||||||
|
// ASSERT_TRUE(pFields == NULL);
|
||||||
|
//
|
||||||
|
// int32_t numOfFields = taos_num_fields(pRes);
|
||||||
|
// ASSERT_EQ(numOfFields, 0);
|
||||||
|
//
|
||||||
|
// taos_close(pConn);
|
||||||
|
//}
|
||||||
|
//
|
||||||
|
//// TEST(testCase, drop_db_test) {
|
||||||
|
//// TAOS* pConn = taos_connect("localhost", "root", "taosdata", NULL, 0);
|
||||||
|
//// assert(pConn != NULL);
|
||||||
|
////
|
||||||
|
//// showDB(pConn);
|
||||||
|
////
|
||||||
|
//// TAOS_RES* pRes = taos_query(pConn, "drop database abc1");
|
||||||
|
//// if (taos_errno(pRes) != 0) {
|
||||||
|
//// printf("failed to drop db, reason:%s\n", taos_errstr(pRes));
|
||||||
|
//// }
|
||||||
|
//// taos_free_result(pRes);
|
||||||
|
////
|
||||||
|
//// showDB(pConn);
|
||||||
|
////
|
||||||
|
//// pRes = taos_query(pConn, "create database abc1");
|
||||||
|
//// if (taos_errno(pRes) != 0) {
|
||||||
|
//// printf("create to drop db, reason:%s\n", taos_errstr(pRes));
|
||||||
|
//// }
|
||||||
|
//// taos_free_result(pRes);
|
||||||
|
//// taos_close(pConn);
|
||||||
|
////}
|
||||||
|
//
|
||||||
|
//TEST(testCase, create_stable_Test) {
|
||||||
|
// TAOS* pConn = taos_connect("localhost", "root", "taosdata", NULL, 0);
|
||||||
|
// assert(pConn != NULL);
|
||||||
|
//
|
||||||
|
// TAOS_RES* pRes = taos_query(pConn, "create database abc1 vgroups 2");
|
||||||
|
// if (taos_errno(pRes) != 0) {
|
||||||
|
// printf("error in create db, reason:%s\n", taos_errstr(pRes));
|
||||||
|
// }
|
||||||
|
// taos_free_result(pRes);
|
||||||
|
//
|
||||||
|
// pRes = taos_query(pConn, "use abc1");
|
||||||
|
// if (taos_errno(pRes) != 0) {
|
||||||
|
// printf("error in use db, reason:%s\n", taos_errstr(pRes));
|
||||||
|
// }
|
||||||
|
// taos_free_result(pRes);
|
||||||
|
//
|
||||||
|
// pRes = taos_query(pConn, "create stable st1(ts timestamp, k int) tags(a int)");
|
||||||
|
// if (taos_errno(pRes) != 0) {
|
||||||
|
// printf("error in create stable, reason:%s\n", taos_errstr(pRes));
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
// TAOS_FIELD* pFields = taos_fetch_fields(pRes);
|
||||||
|
// ASSERT_TRUE(pFields == NULL);
|
||||||
|
//
|
||||||
|
// int32_t numOfFields = taos_num_fields(pRes);
|
||||||
|
// ASSERT_EQ(numOfFields, 0);
|
||||||
|
//
|
||||||
|
// taos_free_result(pRes);
|
||||||
// taos_close(pConn);
|
// taos_close(pConn);
|
||||||
//}
|
//}
|
||||||
|
|
||||||
TEST(testCase, create_stable_Test) {
|
//TEST(testCase, create_table_Test) {
|
||||||
TAOS* pConn = taos_connect("localhost", "root", "taosdata", NULL, 0);
|
// TAOS* pConn = taos_connect("localhost", "root", "taosdata", NULL, 0);
|
||||||
assert(pConn != NULL);
|
// assert(pConn != NULL);
|
||||||
|
//
|
||||||
TAOS_RES* pRes = taos_query(pConn, "create database abc1 vgroups 2");
|
// TAOS_RES* pRes = taos_query(pConn, "use abc1");
|
||||||
if (taos_errno(pRes) != 0) {
|
// taos_free_result(pRes);
|
||||||
printf("error in create db, reason:%s\n", taos_errstr(pRes));
|
//
|
||||||
}
|
// pRes = taos_query(pConn, "create table tm0(ts timestamp, k int)");
|
||||||
taos_free_result(pRes);
|
// taos_free_result(pRes);
|
||||||
|
//
|
||||||
pRes = taos_query(pConn, "use abc1");
|
// taos_close(pConn);
|
||||||
if (taos_errno(pRes) != 0) {
|
//}
|
||||||
printf("error in use db, reason:%s\n", taos_errstr(pRes));
|
|
||||||
}
|
|
||||||
taos_free_result(pRes);
|
|
||||||
|
|
||||||
pRes = taos_query(pConn, "create stable st1(ts timestamp, k int) tags(a int)");
|
|
||||||
if (taos_errno(pRes) != 0) {
|
|
||||||
printf("error in create stable, reason:%s\n", taos_errstr(pRes));
|
|
||||||
}
|
|
||||||
|
|
||||||
TAOS_FIELD* pFields = taos_fetch_fields(pRes);
|
|
||||||
ASSERT_TRUE(pFields == NULL);
|
|
||||||
|
|
||||||
int32_t numOfFields = taos_num_fields(pRes);
|
|
||||||
ASSERT_EQ(numOfFields, 0);
|
|
||||||
|
|
||||||
taos_free_result(pRes);
|
|
||||||
taos_close(pConn);
|
|
||||||
}
|
|
||||||
|
|
||||||
TEST(testCase, create_table_Test) {
|
|
||||||
TAOS* pConn = taos_connect("localhost", "root", "taosdata", NULL, 0);
|
|
||||||
assert(pConn != NULL);
|
|
||||||
|
|
||||||
TAOS_RES* pRes = taos_query(pConn, "use abc1");
|
|
||||||
taos_free_result(pRes);
|
|
||||||
|
|
||||||
pRes = taos_query(pConn, "create table tm0(ts timestamp, k int)");
|
|
||||||
taos_free_result(pRes);
|
|
||||||
|
|
||||||
taos_close(pConn);
|
|
||||||
}
|
|
||||||
|
|
||||||
TEST(testCase, create_ctable_Test) {
|
TEST(testCase, create_ctable_Test) {
|
||||||
TAOS* pConn = taos_connect("localhost", "root", "taosdata", NULL, 0);
|
TAOS* pConn = taos_connect("localhost", "root", "taosdata", NULL, 0);
|
||||||
|
@ -313,193 +312,193 @@ TEST(testCase, create_ctable_Test) {
|
||||||
taos_close(pConn);
|
taos_close(pConn);
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST(testCase, show_stable_Test) {
|
//TEST(testCase, show_stable_Test) {
|
||||||
TAOS* pConn = taos_connect("localhost", "root", "taosdata", NULL, 0);
|
// TAOS* pConn = taos_connect("localhost", "root", "taosdata", NULL, 0);
|
||||||
assert(pConn != NULL);
|
// assert(pConn != NULL);
|
||||||
|
//
|
||||||
TAOS_RES* pRes = taos_query(pConn, "use abc1");
|
// TAOS_RES* pRes = taos_query(pConn, "use abc1");
|
||||||
if (taos_errno(pRes) != 0) {
|
// if (taos_errno(pRes) != 0) {
|
||||||
printf("failed to use db, reason:%s\n", taos_errstr(pRes));
|
// printf("failed to use db, reason:%s\n", taos_errstr(pRes));
|
||||||
}
|
// }
|
||||||
taos_free_result(pRes);
|
// taos_free_result(pRes);
|
||||||
|
//
|
||||||
pRes = taos_query(pConn, "show stables");
|
// pRes = taos_query(pConn, "show stables");
|
||||||
if (taos_errno(pRes) != 0) {
|
// if (taos_errno(pRes) != 0) {
|
||||||
printf("failed to show stables, reason:%s\n", taos_errstr(pRes));
|
// printf("failed to show stables, reason:%s\n", taos_errstr(pRes));
|
||||||
taos_free_result(pRes);
|
// taos_free_result(pRes);
|
||||||
ASSERT_TRUE(false);
|
// ASSERT_TRUE(false);
|
||||||
}
|
// }
|
||||||
|
//
|
||||||
TAOS_ROW pRow = NULL;
|
// TAOS_ROW pRow = NULL;
|
||||||
TAOS_FIELD* pFields = taos_fetch_fields(pRes);
|
// TAOS_FIELD* pFields = taos_fetch_fields(pRes);
|
||||||
int32_t numOfFields = taos_num_fields(pRes);
|
// int32_t numOfFields = taos_num_fields(pRes);
|
||||||
|
//
|
||||||
char str[512] = {0};
|
// char str[512] = {0};
|
||||||
while ((pRow = taos_fetch_row(pRes)) != NULL) {
|
// while ((pRow = taos_fetch_row(pRes)) != NULL) {
|
||||||
int32_t code = taos_print_row(str, pRow, pFields, numOfFields);
|
// int32_t code = taos_print_row(str, pRow, pFields, numOfFields);
|
||||||
printf("%s\n", str);
|
// printf("%s\n", str);
|
||||||
}
|
// }
|
||||||
|
//
|
||||||
taos_free_result(pRes);
|
// taos_free_result(pRes);
|
||||||
taos_close(pConn);
|
// taos_close(pConn);
|
||||||
}
|
//}
|
||||||
|
//
|
||||||
TEST(testCase, show_vgroup_Test) {
|
//TEST(testCase, show_vgroup_Test) {
|
||||||
TAOS* pConn = taos_connect("localhost", "root", "taosdata", NULL, 0);
|
// TAOS* pConn = taos_connect("localhost", "root", "taosdata", NULL, 0);
|
||||||
assert(pConn != NULL);
|
// assert(pConn != NULL);
|
||||||
|
//
|
||||||
TAOS_RES* pRes = taos_query(pConn, "use abc1");
|
// TAOS_RES* pRes = taos_query(pConn, "use abc1");
|
||||||
if (taos_errno(pRes) != 0) {
|
// if (taos_errno(pRes) != 0) {
|
||||||
printf("failed to use db, reason:%s\n", taos_errstr(pRes));
|
// printf("failed to use db, reason:%s\n", taos_errstr(pRes));
|
||||||
}
|
// }
|
||||||
taos_free_result(pRes);
|
// taos_free_result(pRes);
|
||||||
|
//
|
||||||
pRes = taos_query(pConn, "show vgroups");
|
// pRes = taos_query(pConn, "show vgroups");
|
||||||
if (taos_errno(pRes) != 0) {
|
// if (taos_errno(pRes) != 0) {
|
||||||
printf("failed to show vgroups, reason:%s\n", taos_errstr(pRes));
|
// printf("failed to show vgroups, reason:%s\n", taos_errstr(pRes));
|
||||||
taos_free_result(pRes);
|
// taos_free_result(pRes);
|
||||||
ASSERT_TRUE(false);
|
// ASSERT_TRUE(false);
|
||||||
}
|
// }
|
||||||
|
//
|
||||||
TAOS_ROW pRow = NULL;
|
// TAOS_ROW pRow = NULL;
|
||||||
|
//
|
||||||
TAOS_FIELD* pFields = taos_fetch_fields(pRes);
|
// TAOS_FIELD* pFields = taos_fetch_fields(pRes);
|
||||||
int32_t numOfFields = taos_num_fields(pRes);
|
// int32_t numOfFields = taos_num_fields(pRes);
|
||||||
|
//
|
||||||
char str[512] = {0};
|
// char str[512] = {0};
|
||||||
while ((pRow = taos_fetch_row(pRes)) != NULL) {
|
// while ((pRow = taos_fetch_row(pRes)) != NULL) {
|
||||||
int32_t code = taos_print_row(str, pRow, pFields, numOfFields);
|
// int32_t code = taos_print_row(str, pRow, pFields, numOfFields);
|
||||||
printf("%s\n", str);
|
// printf("%s\n", str);
|
||||||
}
|
// }
|
||||||
|
//
|
||||||
taos_free_result(pRes);
|
// taos_free_result(pRes);
|
||||||
taos_close(pConn);
|
// taos_close(pConn);
|
||||||
}
|
//}
|
||||||
|
//
|
||||||
TEST(testCase, create_multiple_tables) {
|
//TEST(testCase, create_multiple_tables) {
|
||||||
TAOS* pConn = taos_connect("localhost", "root", "taosdata", NULL, 0);
|
// TAOS* pConn = taos_connect("localhost", "root", "taosdata", NULL, 0);
|
||||||
ASSERT_NE(pConn, nullptr);
|
// ASSERT_NE(pConn, nullptr);
|
||||||
|
//
|
||||||
TAOS_RES* pRes = taos_query(pConn, "use abc1");
|
// TAOS_RES* pRes = taos_query(pConn, "use abc1");
|
||||||
if (taos_errno(pRes) != 0) {
|
// if (taos_errno(pRes) != 0) {
|
||||||
printf("failed to use db, reason:%s", taos_errstr(pRes));
|
// printf("failed to use db, reason:%s\n", taos_errstr(pRes));
|
||||||
taos_free_result(pRes);
|
// taos_free_result(pRes);
|
||||||
taos_close(pConn);
|
// taos_close(pConn);
|
||||||
return;
|
// return;
|
||||||
}
|
// }
|
||||||
|
//
|
||||||
taos_free_result(pRes);
|
// taos_free_result(pRes);
|
||||||
|
//
|
||||||
pRes = taos_query(pConn, "create table t_2 using st1 tags(1)");
|
// pRes = taos_query(pConn, "create table t_2 using st1 tags(1)");
|
||||||
if (taos_errno(pRes) != 0) {
|
// if (taos_errno(pRes) != 0) {
|
||||||
printf("failed to create multiple tables, reason:%s\n", taos_errstr(pRes));
|
// printf("failed to create multiple tables, reason:%s\n", taos_errstr(pRes));
|
||||||
taos_free_result(pRes);
|
// taos_free_result(pRes);
|
||||||
ASSERT_TRUE(false);
|
// ASSERT_TRUE(false);
|
||||||
}
|
// }
|
||||||
|
//
|
||||||
taos_free_result(pRes);
|
// taos_free_result(pRes);
|
||||||
pRes = taos_query(pConn, "create table t_3 using st1 tags(2)");
|
// pRes = taos_query(pConn, "create table t_3 using st1 tags(2)");
|
||||||
if (taos_errno(pRes) != 0) {
|
// if (taos_errno(pRes) != 0) {
|
||||||
printf("failed to create multiple tables, reason:%s\n", taos_errstr(pRes));
|
// printf("failed to create multiple tables, reason:%s\n", taos_errstr(pRes));
|
||||||
taos_free_result(pRes);
|
// taos_free_result(pRes);
|
||||||
ASSERT_TRUE(false);
|
// ASSERT_TRUE(false);
|
||||||
}
|
// }
|
||||||
|
//
|
||||||
TAOS_ROW pRow = NULL;
|
// TAOS_ROW pRow = NULL;
|
||||||
TAOS_FIELD* pFields = taos_fetch_fields(pRes);
|
// TAOS_FIELD* pFields = taos_fetch_fields(pRes);
|
||||||
int32_t numOfFields = taos_num_fields(pRes);
|
// int32_t numOfFields = taos_num_fields(pRes);
|
||||||
|
//
|
||||||
char str[512] = {0};
|
// char str[512] = {0};
|
||||||
while ((pRow = taos_fetch_row(pRes)) != NULL) {
|
// while ((pRow = taos_fetch_row(pRes)) != NULL) {
|
||||||
int32_t code = taos_print_row(str, pRow, pFields, numOfFields);
|
// int32_t code = taos_print_row(str, pRow, pFields, numOfFields);
|
||||||
printf("%s\n", str);
|
// printf("%s\n", str);
|
||||||
}
|
// }
|
||||||
|
//
|
||||||
taos_free_result(pRes);
|
// taos_free_result(pRes);
|
||||||
|
//
|
||||||
for (int32_t i = 0; i < 20; ++i) {
|
// for (int32_t i = 0; i < 20; ++i) {
|
||||||
char sql[512] = {0};
|
// char sql[512] = {0};
|
||||||
snprintf(sql, tListLen(sql),
|
// snprintf(sql, tListLen(sql),
|
||||||
"create table t_x_%d using st1 tags(2) t_x_%d using st1 tags(5) t_x_%d using st1 tags(911)", i,
|
// "create table t_x_%d using st1 tags(2) t_x_%d using st1 tags(5) t_x_%d using st1 tags(911)", i,
|
||||||
(i + 1) * 30, (i + 2) * 40);
|
// (i + 1) * 30, (i + 2) * 40);
|
||||||
TAOS_RES* pres = taos_query(pConn, sql);
|
// TAOS_RES* pres = taos_query(pConn, sql);
|
||||||
if (taos_errno(pres) != 0) {
|
// if (taos_errno(pres) != 0) {
|
||||||
printf("failed to create table %d\n, reason:%s", i, taos_errstr(pres));
|
// printf("failed to create table %d\n, reason:%s", i, taos_errstr(pres));
|
||||||
}
|
// }
|
||||||
taos_free_result(pres);
|
// taos_free_result(pres);
|
||||||
}
|
// }
|
||||||
|
//
|
||||||
taos_close(pConn);
|
// taos_close(pConn);
|
||||||
}
|
//}
|
||||||
|
//
|
||||||
TEST(testCase, show_table_Test) {
|
//TEST(testCase, show_table_Test) {
|
||||||
TAOS* pConn = taos_connect("localhost", "root", "taosdata", NULL, 0);
|
// TAOS* pConn = taos_connect("localhost", "root", "taosdata", NULL, 0);
|
||||||
assert(pConn != NULL);
|
// assert(pConn != NULL);
|
||||||
|
//
|
||||||
TAOS_RES* pRes = taos_query(pConn, "use abc1");
|
// TAOS_RES* pRes = taos_query(pConn, "use abc1");
|
||||||
taos_free_result(pRes);
|
// taos_free_result(pRes);
|
||||||
|
//
|
||||||
pRes = taos_query(pConn, "show tables");
|
// pRes = taos_query(pConn, "show tables");
|
||||||
if (taos_errno(pRes) != 0) {
|
// if (taos_errno(pRes) != 0) {
|
||||||
printf("failed to show vgroups, reason:%s\n", taos_errstr(pRes));
|
// printf("failed to show vgroups, reason:%s\n", taos_errstr(pRes));
|
||||||
taos_free_result(pRes);
|
// taos_free_result(pRes);
|
||||||
ASSERT_TRUE(false);
|
// ASSERT_TRUE(false);
|
||||||
}
|
// }
|
||||||
|
//
|
||||||
TAOS_ROW pRow = NULL;
|
// TAOS_ROW pRow = NULL;
|
||||||
TAOS_FIELD* pFields = taos_fetch_fields(pRes);
|
// TAOS_FIELD* pFields = taos_fetch_fields(pRes);
|
||||||
int32_t numOfFields = taos_num_fields(pRes);
|
// int32_t numOfFields = taos_num_fields(pRes);
|
||||||
|
//
|
||||||
char str[512] = {0};
|
// char str[512] = {0};
|
||||||
while ((pRow = taos_fetch_row(pRes)) != NULL) {
|
// while ((pRow = taos_fetch_row(pRes)) != NULL) {
|
||||||
int32_t code = taos_print_row(str, pRow, pFields, numOfFields);
|
// int32_t code = taos_print_row(str, pRow, pFields, numOfFields);
|
||||||
printf("%s\n", str);
|
// printf("%s\n", str);
|
||||||
}
|
// }
|
||||||
|
//
|
||||||
taos_free_result(pRes);
|
// taos_free_result(pRes);
|
||||||
taos_close(pConn);
|
// taos_close(pConn);
|
||||||
}
|
//}
|
||||||
|
//
|
||||||
TEST(testCase, drop_stable_Test) {
|
//TEST(testCase, drop_stable_Test) {
|
||||||
TAOS* pConn = taos_connect("localhost", "root", "taosdata", NULL, 0);
|
// TAOS* pConn = taos_connect("localhost", "root", "taosdata", NULL, 0);
|
||||||
assert(pConn != NULL);
|
// assert(pConn != NULL);
|
||||||
|
//
|
||||||
TAOS_RES* pRes = taos_query(pConn, "create database abc1");
|
// TAOS_RES* pRes = taos_query(pConn, "create database abc1");
|
||||||
if (taos_errno(pRes) != 0) {
|
// if (taos_errno(pRes) != 0) {
|
||||||
printf("error in creating db, reason:%s\n", taos_errstr(pRes));
|
// printf("error in creating db, reason:%s\n", taos_errstr(pRes));
|
||||||
}
|
// }
|
||||||
taos_free_result(pRes);
|
// taos_free_result(pRes);
|
||||||
|
//
|
||||||
pRes = taos_query(pConn, "use abc1");
|
// pRes = taos_query(pConn, "use abc1");
|
||||||
if (taos_errno(pRes) != 0) {
|
// if (taos_errno(pRes) != 0) {
|
||||||
printf("error in using db, reason:%s\n", taos_errstr(pRes));
|
// printf("error in using db, reason:%s\n", taos_errstr(pRes));
|
||||||
}
|
// }
|
||||||
taos_free_result(pRes);
|
// taos_free_result(pRes);
|
||||||
|
//
|
||||||
pRes = taos_query(pConn, "drop stable st1");
|
// pRes = taos_query(pConn, "drop stable st1");
|
||||||
if (taos_errno(pRes) != 0) {
|
// if (taos_errno(pRes) != 0) {
|
||||||
printf("failed to drop stable, reason:%s\n", taos_errstr(pRes));
|
// printf("failed to drop stable, reason:%s\n", taos_errstr(pRes));
|
||||||
}
|
// }
|
||||||
|
//
|
||||||
taos_free_result(pRes);
|
// taos_free_result(pRes);
|
||||||
taos_close(pConn);
|
// taos_close(pConn);
|
||||||
}
|
//}
|
||||||
|
//
|
||||||
TEST(testCase, generated_request_id_test) {
|
//TEST(testCase, generated_request_id_test) {
|
||||||
SHashObj* phash = taosHashInit(10000, taosGetDefaultHashFunction(TSDB_DATA_TYPE_BIGINT), false, HASH_ENTRY_LOCK);
|
// SHashObj* phash = taosHashInit(10000, taosGetDefaultHashFunction(TSDB_DATA_TYPE_BIGINT), false, HASH_ENTRY_LOCK);
|
||||||
|
//
|
||||||
for (int32_t i = 0; i < 50000; ++i) {
|
// for (int32_t i = 0; i < 50000; ++i) {
|
||||||
uint64_t v = generateRequestId();
|
// uint64_t v = generateRequestId();
|
||||||
void* result = taosHashGet(phash, &v, sizeof(v));
|
// void* result = taosHashGet(phash, &v, sizeof(v));
|
||||||
if (result != nullptr) {
|
// if (result != nullptr) {
|
||||||
printf("0x%lx, index:%d\n", v, i);
|
// printf("0x%lx, index:%d\n", v, i);
|
||||||
}
|
// }
|
||||||
assert(result == nullptr);
|
// assert(result == nullptr);
|
||||||
taosHashPut(phash, &v, sizeof(v), NULL, 0);
|
// taosHashPut(phash, &v, sizeof(v), NULL, 0);
|
||||||
}
|
// }
|
||||||
|
//
|
||||||
taosHashCleanup(phash);
|
// taosHashCleanup(phash);
|
||||||
}
|
//}
|
||||||
|
|
||||||
// TEST(testCase, create_topic_Test) {
|
// TEST(testCase, create_topic_Test) {
|
||||||
// TAOS* pConn = taos_connect("localhost", "root", "taosdata", NULL, 0);
|
// TAOS* pConn = taos_connect("localhost", "root", "taosdata", NULL, 0);
|
||||||
|
@ -534,6 +533,7 @@ TEST(testCase, generated_request_id_test) {
|
||||||
// tmq_create_topic(pConn, "test_topic_1", sql, strlen(sql));
|
// tmq_create_topic(pConn, "test_topic_1", sql, strlen(sql));
|
||||||
// taos_close(pConn);
|
// taos_close(pConn);
|
||||||
//}
|
//}
|
||||||
|
|
||||||
//TEST(testCase, insert_test) {
|
//TEST(testCase, insert_test) {
|
||||||
// TAOS* pConn = taos_connect("localhost", "root", "taosdata", NULL, 0);
|
// TAOS* pConn = taos_connect("localhost", "root", "taosdata", NULL, 0);
|
||||||
// ASSERT_EQ(pConn, nullptr);
|
// ASSERT_EQ(pConn, nullptr);
|
||||||
|
@ -551,38 +551,48 @@ TEST(testCase, generated_request_id_test) {
|
||||||
// taos_free_result(pRes);
|
// taos_free_result(pRes);
|
||||||
// taos_close(pConn);
|
// taos_close(pConn);
|
||||||
//}
|
//}
|
||||||
//#endif
|
|
||||||
|
|
||||||
TEST(testCase, projection_query_tables) {
|
//TEST(testCase, projection_query_tables) {
|
||||||
TAOS* pConn = taos_connect("localhost", "root", "taosdata", NULL, 0);
|
// TAOS* pConn = taos_connect("localhost", "root", "taosdata", NULL, 0);
|
||||||
ASSERT_NE(pConn, nullptr);
|
// ASSERT_NE(pConn, nullptr);
|
||||||
|
//
|
||||||
TAOS_RES* pRes = taos_query(pConn, "use test1");
|
//// TAOS_RES* pRes = taos_query(pConn, "create database abc1 vgroups 2");
|
||||||
if (taos_errno(pRes) != 0) {
|
//// if (taos_errno(pRes) != 0) {
|
||||||
printf("failed to use db, reason:%s", taos_errstr(pRes));
|
//// printf("failed to use db, reason:%s\n", taos_errstr(pRes));
|
||||||
taos_free_result(pRes);
|
//// taos_free_result(pRes);
|
||||||
return;
|
//// return;
|
||||||
}
|
//// }
|
||||||
|
//
|
||||||
taos_free_result(pRes);
|
//// taos_free_result(pRes);
|
||||||
|
//
|
||||||
pRes = taos_query(pConn, "select * from tm0");
|
// TAOS_RES* pRes = taos_query(pConn, "use abc1");
|
||||||
if (taos_errno(pRes) != 0) {
|
//
|
||||||
printf("failed to create multiple tables, reason:%s\n", taos_errstr(pRes));
|
//// pRes = taos_query(pConn, "create table m1 (ts timestamp, k int) tags(a int)");
|
||||||
taos_free_result(pRes);
|
// taos_free_result(pRes);
|
||||||
ASSERT_TRUE(false);
|
////
|
||||||
}
|
//// pRes = taos_query(pConn, "create table tu using m1 tags(1)");
|
||||||
|
//// taos_free_result(pRes);
|
||||||
TAOS_ROW pRow = NULL;
|
////
|
||||||
TAOS_FIELD* pFields = taos_fetch_fields(pRes);
|
//// pRes = taos_query(pConn, "insert into tu values(now, 1)");
|
||||||
int32_t numOfFields = taos_num_fields(pRes);
|
//// taos_free_result(pRes);
|
||||||
|
//
|
||||||
char str[512] = {0};
|
// pRes = taos_query(pConn, "select * from tu");
|
||||||
while ((pRow = taos_fetch_row(pRes)) != NULL) {
|
// if (taos_errno(pRes) != 0) {
|
||||||
int32_t code = taos_print_row(str, pRow, pFields, numOfFields);
|
// printf("failed to select from table, reason:%s\n", taos_errstr(pRes));
|
||||||
printf("%s\n", str);
|
// taos_free_result(pRes);
|
||||||
}
|
// ASSERT_TRUE(false);
|
||||||
|
// }
|
||||||
taos_free_result(pRes);
|
//
|
||||||
taos_close(pConn);
|
// TAOS_ROW pRow = NULL;
|
||||||
}
|
// TAOS_FIELD* pFields = taos_fetch_fields(pRes);
|
||||||
|
// int32_t numOfFields = taos_num_fields(pRes);
|
||||||
|
//
|
||||||
|
// char str[512] = {0};
|
||||||
|
// while ((pRow = taos_fetch_row(pRes)) != NULL) {
|
||||||
|
// int32_t code = taos_print_row(str, pRow, pFields, numOfFields);
|
||||||
|
// printf("%s\n", str);
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
// taos_free_result(pRes);
|
||||||
|
// taos_close(pConn);
|
||||||
|
//}
|
||||||
|
|
|
@ -37,7 +37,7 @@ uint16_t tsServerPort = 6030;
|
||||||
int32_t tsStatusInterval = 1; // second
|
int32_t tsStatusInterval = 1; // second
|
||||||
int8_t tsEnableTelemetryReporting = 0;
|
int8_t tsEnableTelemetryReporting = 0;
|
||||||
char tsEmail[TSDB_FQDN_LEN] = {0};
|
char tsEmail[TSDB_FQDN_LEN] = {0};
|
||||||
int32_t tsNumOfSupportVnodes = 16;
|
int32_t tsNumOfSupportVnodes = 128;
|
||||||
|
|
||||||
// common
|
// common
|
||||||
int32_t tsRpcTimer = 300;
|
int32_t tsRpcTimer = 300;
|
||||||
|
|
|
@ -30,12 +30,7 @@ extern "C" {
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
typedef struct SBnode {
|
typedef struct SBnode {
|
||||||
int32_t dnodeId;
|
SBnodeOpt opt;
|
||||||
int64_t clusterId;
|
|
||||||
SBnodeCfg cfg;
|
|
||||||
SendReqToDnodeFp sendReqToDnodeFp;
|
|
||||||
SendReqToMnodeFp sendReqToMnodeFp;
|
|
||||||
SendRedirectRspFp sendRedirectRspFp;
|
|
||||||
} SBnode;
|
} SBnode;
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
|
|
|
@ -28,11 +28,11 @@ static struct {
|
||||||
bool printAuth;
|
bool printAuth;
|
||||||
bool printVersion;
|
bool printVersion;
|
||||||
char configDir[PATH_MAX];
|
char configDir[PATH_MAX];
|
||||||
} global = {0};
|
} dmn = {0};
|
||||||
|
|
||||||
void dmnSigintHandle(int signum, void *info, void *ctx) {
|
void dmnSigintHandle(int signum, void *info, void *ctx) {
|
||||||
uInfo("singal:%d is received", signum);
|
uInfo("singal:%d is received", signum);
|
||||||
global.stop = true;
|
dmn.stop = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
void dmnSetSignalHandle() {
|
void dmnSetSignalHandle() {
|
||||||
|
@ -44,7 +44,7 @@ void dmnSetSignalHandle() {
|
||||||
}
|
}
|
||||||
|
|
||||||
int dmnParseOption(int argc, char const *argv[]) {
|
int dmnParseOption(int argc, char const *argv[]) {
|
||||||
tstrncpy(global.configDir, "/etc/taos", PATH_MAX);
|
tstrncpy(dmn.configDir, "/etc/taos", PATH_MAX);
|
||||||
|
|
||||||
for (int i = 1; i < argc; ++i) {
|
for (int i = 1; i < argc; ++i) {
|
||||||
if (strcmp(argv[i], "-c") == 0) {
|
if (strcmp(argv[i], "-c") == 0) {
|
||||||
|
@ -53,19 +53,19 @@ int dmnParseOption(int argc, char const *argv[]) {
|
||||||
printf("config file path overflow");
|
printf("config file path overflow");
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
tstrncpy(global.configDir, argv[i], PATH_MAX);
|
tstrncpy(dmn.configDir, argv[i], PATH_MAX);
|
||||||
} else {
|
} else {
|
||||||
printf("'-c' requires a parameter, default is %s\n", configDir);
|
printf("'-c' requires a parameter, default is %s\n", configDir);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
} else if (strcmp(argv[i], "-C") == 0) {
|
} else if (strcmp(argv[i], "-C") == 0) {
|
||||||
global.dumpConfig = true;
|
dmn.dumpConfig = true;
|
||||||
} else if (strcmp(argv[i], "-k") == 0) {
|
} else if (strcmp(argv[i], "-k") == 0) {
|
||||||
global.generateGrant = true;
|
dmn.generateGrant = true;
|
||||||
} else if (strcmp(argv[i], "-A") == 0) {
|
} else if (strcmp(argv[i], "-A") == 0) {
|
||||||
global.printAuth = true;
|
dmn.printAuth = true;
|
||||||
} else if (strcmp(argv[i], "-V") == 0) {
|
} else if (strcmp(argv[i], "-V") == 0) {
|
||||||
global.printVersion = true;
|
dmn.printVersion = true;
|
||||||
} else {
|
} else {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -92,7 +92,7 @@ void dmnPrintVersion() {
|
||||||
}
|
}
|
||||||
|
|
||||||
int dmnReadConfig(const char *path) {
|
int dmnReadConfig(const char *path) {
|
||||||
tstrncpy(configDir, global.configDir, PATH_MAX);
|
tstrncpy(configDir, dmn.configDir, PATH_MAX);
|
||||||
taosInitGlobalCfg();
|
taosInitGlobalCfg();
|
||||||
taosReadGlobalLogCfg();
|
taosReadGlobalLogCfg();
|
||||||
|
|
||||||
|
@ -114,12 +114,12 @@ int dmnReadConfig(const char *path) {
|
||||||
}
|
}
|
||||||
|
|
||||||
if (taosReadCfgFromFile() != 0) {
|
if (taosReadCfgFromFile() != 0) {
|
||||||
uError("failed to read global config");
|
uError("failed to read config");
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (taosCheckAndPrintCfg() != 0) {
|
if (taosCheckAndPrintCfg() != 0) {
|
||||||
uError("failed to check global config");
|
uError("failed to check config");
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -131,38 +131,50 @@ void dmnDumpConfig() { taosDumpGlobalCfg(); }
|
||||||
|
|
||||||
void dmnWaitSignal() {
|
void dmnWaitSignal() {
|
||||||
dmnSetSignalHandle();
|
dmnSetSignalHandle();
|
||||||
while (!global.stop) {
|
while (!dmn.stop) {
|
||||||
taosMsleep(100);
|
taosMsleep(100);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void dmnInitOption(SDnodeOpt *pOption) {
|
void dnmInitEnvCfg(SDnodeEnvCfg *pCfg) {
|
||||||
pOption->sver = 30000000; //3.0.0.0
|
pCfg->sver = 30000000; // 3.0.0.0
|
||||||
pOption->numOfCores = tsNumOfCores;
|
pCfg->numOfCores = tsNumOfCores;
|
||||||
pOption->numOfSupportVnodes = tsNumOfSupportVnodes;
|
pCfg->numOfCommitThreads = tsNumOfCommitThreads;
|
||||||
pOption->numOfCommitThreads = tsNumOfCommitThreads;
|
pCfg->enableTelem = 0;
|
||||||
pOption->statusInterval = tsStatusInterval;
|
tstrncpy(pCfg->timezone, tsTimezone, TSDB_TIMEZONE_LEN);
|
||||||
pOption->numOfThreadsPerCore = tsNumOfThreadsPerCore;
|
tstrncpy(pCfg->locale, tsLocale, TSDB_LOCALE_LEN);
|
||||||
pOption->ratioOfQueryCores = tsRatioOfQueryCores;
|
tstrncpy(pCfg->charset, tsCharset, TSDB_LOCALE_LEN);
|
||||||
pOption->maxShellConns = tsMaxShellConns;
|
tstrncpy(pCfg->buildinfo, buildinfo, 64);
|
||||||
pOption->shellActivityTimer = tsShellActivityTimer;
|
tstrncpy(pCfg->gitinfo, gitinfo, 48);
|
||||||
pOption->serverPort = tsServerPort;
|
}
|
||||||
tstrncpy(pOption->dataDir, tsDataDir, TSDB_FILENAME_LEN);
|
|
||||||
tstrncpy(pOption->localEp, tsLocalEp, TSDB_EP_LEN);
|
void dmnInitObjCfg(SDnodeObjCfg *pCfg) {
|
||||||
tstrncpy(pOption->localFqdn, tsLocalFqdn, TSDB_FQDN_LEN);
|
pCfg->numOfSupportVnodes = tsNumOfSupportVnodes;
|
||||||
tstrncpy(pOption->firstEp, tsFirst, TSDB_EP_LEN);
|
pCfg->statusInterval = tsStatusInterval;
|
||||||
tstrncpy(pOption->timezone, tsTimezone, TSDB_TIMEZONE_LEN);
|
pCfg->numOfThreadsPerCore = tsNumOfThreadsPerCore;
|
||||||
tstrncpy(pOption->locale, tsLocale, TSDB_LOCALE_LEN);
|
pCfg->ratioOfQueryCores = tsRatioOfQueryCores;
|
||||||
tstrncpy(pOption->charset, tsCharset, TSDB_LOCALE_LEN);
|
pCfg->maxShellConns = tsMaxShellConns;
|
||||||
tstrncpy(pOption->buildinfo, buildinfo, 64);
|
pCfg->shellActivityTimer = tsShellActivityTimer;
|
||||||
tstrncpy(pOption->gitinfo, gitinfo, 48);
|
pCfg->serverPort = tsServerPort;
|
||||||
|
tstrncpy(pCfg->dataDir, tsDataDir, TSDB_FILENAME_LEN);
|
||||||
|
tstrncpy(pCfg->localEp, tsLocalEp, TSDB_EP_LEN);
|
||||||
|
tstrncpy(pCfg->localFqdn, tsLocalFqdn, TSDB_FQDN_LEN);
|
||||||
|
tstrncpy(pCfg->firstEp, tsFirst, TSDB_EP_LEN);
|
||||||
}
|
}
|
||||||
|
|
||||||
int dmnRunDnode() {
|
int dmnRunDnode() {
|
||||||
SDnodeOpt option = {0};
|
SDnodeEnvCfg envCfg = {0};
|
||||||
dmnInitOption(&option);
|
SDnodeObjCfg objCfg = {0};
|
||||||
|
|
||||||
SDnode *pDnode = dndInit(&option);
|
dnmInitEnvCfg(&envCfg);
|
||||||
|
dmnInitObjCfg(&objCfg);
|
||||||
|
|
||||||
|
if (dndInit(&envCfg) != 0) {
|
||||||
|
uInfo("Failed to start TDengine, please check the log at %s", tsLogDir);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
SDnode *pDnode = dndCreate(&objCfg);
|
||||||
if (pDnode == NULL) {
|
if (pDnode == NULL) {
|
||||||
uInfo("Failed to start TDengine, please check the log at %s", tsLogDir);
|
uInfo("Failed to start TDengine, please check the log at %s", tsLogDir);
|
||||||
return -1;
|
return -1;
|
||||||
|
@ -172,7 +184,8 @@ int dmnRunDnode() {
|
||||||
dmnWaitSignal();
|
dmnWaitSignal();
|
||||||
uInfo("TDengine is shut down!");
|
uInfo("TDengine is shut down!");
|
||||||
|
|
||||||
dndCleanup(pDnode);
|
dndClose(pDnode);
|
||||||
|
dndCleanup();
|
||||||
taosCloseLog();
|
taosCloseLog();
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -182,21 +195,21 @@ int main(int argc, char const *argv[]) {
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (global.generateGrant) {
|
if (dmn.generateGrant) {
|
||||||
dmnGenerateGrant();
|
dmnGenerateGrant();
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (global.printVersion) {
|
if (dmn.printVersion) {
|
||||||
dmnPrintVersion();
|
dmnPrintVersion();
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (dmnReadConfig(global.configDir) != 0) {
|
if (dmnReadConfig(dmn.configDir) != 0) {
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (global.dumpConfig) {
|
if (dmn.dumpConfig) {
|
||||||
dmnDumpConfig();
|
dmnDumpConfig();
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
|
@ -19,7 +19,7 @@
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
extern "C" {
|
extern "C" {
|
||||||
#endif
|
#endif
|
||||||
#include "dndInt.h"
|
#include "dndEnv.h"
|
||||||
|
|
||||||
int32_t dndInitBnode(SDnode *pDnode);
|
int32_t dndInitBnode(SDnode *pDnode);
|
||||||
void dndCleanupBnode(SDnode *pDnode);
|
void dndCleanupBnode(SDnode *pDnode);
|
||||||
|
|
|
@ -0,0 +1,149 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2019 TAOS Data, Inc. <jhtao@taosdata.com>
|
||||||
|
*
|
||||||
|
* This program is free software: you can use, redistribute, and/or modify
|
||||||
|
* it under the terms of the GNU Affero General Public License, version 3
|
||||||
|
* or later ("AGPL"), as published by the Free Software Foundation.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful, but WITHOUT
|
||||||
|
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||||
|
* FITNESS FOR A PARTICULAR PURPOSE.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Affero General Public License
|
||||||
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef _TD_DND_ENV_H_
|
||||||
|
#define _TD_DND_ENV_H_
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include "dndInt.h"
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
EWorkerType type;
|
||||||
|
const char *name;
|
||||||
|
int32_t minNum;
|
||||||
|
int32_t maxNum;
|
||||||
|
void *queueFp;
|
||||||
|
SDnode *pDnode;
|
||||||
|
STaosQueue *queue;
|
||||||
|
union {
|
||||||
|
SWorkerPool pool;
|
||||||
|
SMWorkerPool mpool;
|
||||||
|
};
|
||||||
|
} SDnodeWorker;
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
char *dnode;
|
||||||
|
char *mnode;
|
||||||
|
char *snode;
|
||||||
|
char *bnode;
|
||||||
|
char *vnodes;
|
||||||
|
} SDnodeDir;
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
int32_t dnodeId;
|
||||||
|
int32_t dropped;
|
||||||
|
int64_t clusterId;
|
||||||
|
int64_t dver;
|
||||||
|
int64_t rebootTime;
|
||||||
|
int64_t updateTime;
|
||||||
|
int8_t statusSent;
|
||||||
|
SEpSet mnodeEpSet;
|
||||||
|
char *file;
|
||||||
|
SHashObj *dnodeHash;
|
||||||
|
SDnodeEps *dnodeEps;
|
||||||
|
pthread_t *threadId;
|
||||||
|
SRWLatch latch;
|
||||||
|
SDnodeWorker mgmtWorker;
|
||||||
|
SDnodeWorker statusWorker;
|
||||||
|
} SDnodeMgmt;
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
int32_t refCount;
|
||||||
|
int8_t deployed;
|
||||||
|
int8_t dropped;
|
||||||
|
SMnode *pMnode;
|
||||||
|
SRWLatch latch;
|
||||||
|
SDnodeWorker readWorker;
|
||||||
|
SDnodeWorker writeWorker;
|
||||||
|
SDnodeWorker syncWorker;
|
||||||
|
int8_t replica;
|
||||||
|
int8_t selfIndex;
|
||||||
|
SReplica replicas[TSDB_MAX_REPLICA];
|
||||||
|
} SMnodeMgmt;
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
int32_t refCount;
|
||||||
|
int8_t deployed;
|
||||||
|
int8_t dropped;
|
||||||
|
SQnode *pQnode;
|
||||||
|
SRWLatch latch;
|
||||||
|
SDnodeWorker queryWorker;
|
||||||
|
SDnodeWorker fetchWorker;
|
||||||
|
} SQnodeMgmt;
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
int32_t refCount;
|
||||||
|
int8_t deployed;
|
||||||
|
int8_t dropped;
|
||||||
|
SSnode *pSnode;
|
||||||
|
SRWLatch latch;
|
||||||
|
SDnodeWorker writeWorker;
|
||||||
|
} SSnodeMgmt;
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
int32_t refCount;
|
||||||
|
int8_t deployed;
|
||||||
|
int8_t dropped;
|
||||||
|
SBnode *pBnode;
|
||||||
|
SRWLatch latch;
|
||||||
|
SDnodeWorker writeWorker;
|
||||||
|
} SBnodeMgmt;
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
SHashObj *hash;
|
||||||
|
int32_t openVnodes;
|
||||||
|
int32_t totalVnodes;
|
||||||
|
SRWLatch latch;
|
||||||
|
SWorkerPool queryPool;
|
||||||
|
SWorkerPool fetchPool;
|
||||||
|
SMWorkerPool syncPool;
|
||||||
|
SMWorkerPool writePool;
|
||||||
|
} SVnodesMgmt;
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
void *serverRpc;
|
||||||
|
void *clientRpc;
|
||||||
|
DndMsgFp msgFp[TDMT_MAX];
|
||||||
|
} STransMgmt;
|
||||||
|
|
||||||
|
typedef struct SDnode {
|
||||||
|
EStat stat;
|
||||||
|
SDnodeObjCfg cfg;
|
||||||
|
SDnodeEnvCfg env;
|
||||||
|
SDnodeDir dir;
|
||||||
|
FileFd lockFd;
|
||||||
|
SDnodeMgmt dmgmt;
|
||||||
|
SMnodeMgmt mmgmt;
|
||||||
|
SQnodeMgmt qmgmt;
|
||||||
|
SSnodeMgmt smgmt;
|
||||||
|
SBnodeMgmt bmgmt;
|
||||||
|
SVnodesMgmt vmgmt;
|
||||||
|
STransMgmt tmgmt;
|
||||||
|
SStartupReq startup;
|
||||||
|
} SDnode;
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
int8_t once;
|
||||||
|
SDnodeEnvCfg cfg;
|
||||||
|
} SDnodeEnv;
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif /*_TD_DND_ENV_H_*/
|
|
@ -55,124 +55,12 @@ extern int32_t dDebugFlag;
|
||||||
|
|
||||||
typedef enum { DND_STAT_INIT, DND_STAT_RUNNING, DND_STAT_STOPPED } EStat;
|
typedef enum { DND_STAT_INIT, DND_STAT_RUNNING, DND_STAT_STOPPED } EStat;
|
||||||
typedef enum { DND_WORKER_SINGLE, DND_WORKER_MULTI } EWorkerType;
|
typedef enum { DND_WORKER_SINGLE, DND_WORKER_MULTI } EWorkerType;
|
||||||
|
typedef enum { DND_ENV_INIT = 0, DND_ENV_READY = 1, DND_ENV_CLEANUP = 2 } EEnvStat;
|
||||||
typedef void (*DndMsgFp)(SDnode *pDnode, SRpcMsg *pMsg, SEpSet *pEps);
|
typedef void (*DndMsgFp)(SDnode *pDnode, SRpcMsg *pMsg, SEpSet *pEps);
|
||||||
|
|
||||||
typedef struct {
|
|
||||||
EWorkerType type;
|
|
||||||
const char *name;
|
|
||||||
int32_t minNum;
|
|
||||||
int32_t maxNum;
|
|
||||||
void *queueFp;
|
|
||||||
SDnode *pDnode;
|
|
||||||
STaosQueue *queue;
|
|
||||||
union {
|
|
||||||
SWorkerPool pool;
|
|
||||||
SMWorkerPool mpool;
|
|
||||||
};
|
|
||||||
} SDnodeWorker;
|
|
||||||
|
|
||||||
typedef struct {
|
|
||||||
char *dnode;
|
|
||||||
char *mnode;
|
|
||||||
char *snode;
|
|
||||||
char *bnode;
|
|
||||||
char *vnodes;
|
|
||||||
} SDnodeDir;
|
|
||||||
|
|
||||||
typedef struct {
|
|
||||||
int32_t dnodeId;
|
|
||||||
int32_t dropped;
|
|
||||||
int64_t clusterId;
|
|
||||||
int64_t dver;
|
|
||||||
int64_t rebootTime;
|
|
||||||
int64_t updateTime;
|
|
||||||
int8_t statusSent;
|
|
||||||
SEpSet mnodeEpSet;
|
|
||||||
char *file;
|
|
||||||
SHashObj *dnodeHash;
|
|
||||||
SDnodeEps *dnodeEps;
|
|
||||||
pthread_t *threadId;
|
|
||||||
SRWLatch latch;
|
|
||||||
SDnodeWorker mgmtWorker;
|
|
||||||
} SDnodeMgmt;
|
|
||||||
|
|
||||||
typedef struct {
|
|
||||||
int32_t refCount;
|
|
||||||
int8_t deployed;
|
|
||||||
int8_t dropped;
|
|
||||||
SMnode *pMnode;
|
|
||||||
SRWLatch latch;
|
|
||||||
SDnodeWorker readWorker;
|
|
||||||
SDnodeWorker writeWorker;
|
|
||||||
SDnodeWorker syncWorker;
|
|
||||||
int8_t replica;
|
|
||||||
int8_t selfIndex;
|
|
||||||
SReplica replicas[TSDB_MAX_REPLICA];
|
|
||||||
} SMnodeMgmt;
|
|
||||||
|
|
||||||
typedef struct {
|
|
||||||
int32_t refCount;
|
|
||||||
int8_t deployed;
|
|
||||||
int8_t dropped;
|
|
||||||
SQnode *pQnode;
|
|
||||||
SRWLatch latch;
|
|
||||||
SDnodeWorker queryWorker;
|
|
||||||
SDnodeWorker fetchWorker;
|
|
||||||
} SQnodeMgmt;
|
|
||||||
|
|
||||||
typedef struct {
|
|
||||||
int32_t refCount;
|
|
||||||
int8_t deployed;
|
|
||||||
int8_t dropped;
|
|
||||||
SSnode *pSnode;
|
|
||||||
SRWLatch latch;
|
|
||||||
SDnodeWorker writeWorker;
|
|
||||||
} SSnodeMgmt;
|
|
||||||
|
|
||||||
typedef struct {
|
|
||||||
int32_t refCount;
|
|
||||||
int8_t deployed;
|
|
||||||
int8_t dropped;
|
|
||||||
SBnode *pBnode;
|
|
||||||
SRWLatch latch;
|
|
||||||
SDnodeWorker writeWorker;
|
|
||||||
} SBnodeMgmt;
|
|
||||||
|
|
||||||
typedef struct {
|
|
||||||
SHashObj *hash;
|
|
||||||
int32_t openVnodes;
|
|
||||||
int32_t totalVnodes;
|
|
||||||
SRWLatch latch;
|
|
||||||
SWorkerPool queryPool;
|
|
||||||
SWorkerPool fetchPool;
|
|
||||||
SMWorkerPool syncPool;
|
|
||||||
SMWorkerPool writePool;
|
|
||||||
} SVnodesMgmt;
|
|
||||||
|
|
||||||
typedef struct {
|
|
||||||
void *serverRpc;
|
|
||||||
void *clientRpc;
|
|
||||||
DndMsgFp msgFp[TDMT_MAX];
|
|
||||||
} STransMgmt;
|
|
||||||
|
|
||||||
typedef struct SDnode {
|
|
||||||
EStat stat;
|
|
||||||
SDnodeOpt opt;
|
|
||||||
SDnodeDir dir;
|
|
||||||
FileFd lockFd;
|
|
||||||
SDnodeMgmt dmgmt;
|
|
||||||
SMnodeMgmt mmgmt;
|
|
||||||
SQnodeMgmt qmgmt;
|
|
||||||
SSnodeMgmt smgmt;
|
|
||||||
SBnodeMgmt bmgmt;
|
|
||||||
SVnodesMgmt vmgmt;
|
|
||||||
STransMgmt tmgmt;
|
|
||||||
SStartupReq startup;
|
|
||||||
} SDnode;
|
|
||||||
|
|
||||||
EStat dndGetStat(SDnode *pDnode);
|
EStat dndGetStat(SDnode *pDnode);
|
||||||
void dndSetStat(SDnode *pDnode, EStat stat);
|
void dndSetStat(SDnode *pDnode, EStat stat);
|
||||||
char *dndStatStr(EStat stat);
|
const char *dndStatStr(EStat stat);
|
||||||
|
|
||||||
void dndReportStartup(SDnode *pDnode, char *pName, char *pDesc);
|
void dndReportStartup(SDnode *pDnode, char *pName, char *pDesc);
|
||||||
void dndGetStartup(SDnode *pDnode, SStartupReq *pStartup);
|
void dndGetStartup(SDnode *pDnode, SStartupReq *pStartup);
|
||||||
|
|
|
@ -19,7 +19,7 @@
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
extern "C" {
|
extern "C" {
|
||||||
#endif
|
#endif
|
||||||
#include "dndInt.h"
|
#include "dndEnv.h"
|
||||||
|
|
||||||
int32_t dndInitMgmt(SDnode *pDnode);
|
int32_t dndInitMgmt(SDnode *pDnode);
|
||||||
void dndStopMgmt(SDnode *pDnode);
|
void dndStopMgmt(SDnode *pDnode);
|
||||||
|
|
|
@ -19,7 +19,7 @@
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
extern "C" {
|
extern "C" {
|
||||||
#endif
|
#endif
|
||||||
#include "dndInt.h"
|
#include "dndEnv.h"
|
||||||
|
|
||||||
int32_t dndInitMnode(SDnode *pDnode);
|
int32_t dndInitMnode(SDnode *pDnode);
|
||||||
void dndCleanupMnode(SDnode *pDnode);
|
void dndCleanupMnode(SDnode *pDnode);
|
||||||
|
|
|
@ -19,7 +19,7 @@
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
extern "C" {
|
extern "C" {
|
||||||
#endif
|
#endif
|
||||||
#include "dndInt.h"
|
#include "dndEnv.h"
|
||||||
|
|
||||||
int32_t dndInitQnode(SDnode *pDnode);
|
int32_t dndInitQnode(SDnode *pDnode);
|
||||||
void dndCleanupQnode(SDnode *pDnode);
|
void dndCleanupQnode(SDnode *pDnode);
|
||||||
|
|
|
@ -19,7 +19,7 @@
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
extern "C" {
|
extern "C" {
|
||||||
#endif
|
#endif
|
||||||
#include "dndInt.h"
|
#include "dndEnv.h"
|
||||||
|
|
||||||
int32_t dndInitSnode(SDnode *pDnode);
|
int32_t dndInitSnode(SDnode *pDnode);
|
||||||
void dndCleanupSnode(SDnode *pDnode);
|
void dndCleanupSnode(SDnode *pDnode);
|
||||||
|
|
|
@ -19,7 +19,7 @@
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
extern "C" {
|
extern "C" {
|
||||||
#endif
|
#endif
|
||||||
#include "dndInt.h"
|
#include "dndEnv.h"
|
||||||
|
|
||||||
int32_t dndInitTrans(SDnode *pDnode);
|
int32_t dndInitTrans(SDnode *pDnode);
|
||||||
void dndCleanupTrans(SDnode *pDnode);
|
void dndCleanupTrans(SDnode *pDnode);
|
||||||
|
|
|
@ -19,7 +19,7 @@
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
extern "C" {
|
extern "C" {
|
||||||
#endif
|
#endif
|
||||||
#include "dndInt.h"
|
#include "dndEnv.h"
|
||||||
|
|
||||||
int32_t dndInitVnodes(SDnode *pDnode);
|
int32_t dndInitVnodes(SDnode *pDnode);
|
||||||
void dndCleanupVnodes(SDnode *pDnode);
|
void dndCleanupVnodes(SDnode *pDnode);
|
||||||
|
@ -36,6 +36,8 @@ int32_t dndProcessAuthVnodeReq(SDnode *pDnode, SRpcMsg *pReq);
|
||||||
int32_t dndProcessSyncVnodeReq(SDnode *pDnode, SRpcMsg *pReq);
|
int32_t dndProcessSyncVnodeReq(SDnode *pDnode, SRpcMsg *pReq);
|
||||||
int32_t dndProcessCompactVnodeReq(SDnode *pDnode, SRpcMsg *pReq);
|
int32_t dndProcessCompactVnodeReq(SDnode *pDnode, SRpcMsg *pReq);
|
||||||
|
|
||||||
|
int32_t dndPutReqToVQueryQ(SDnode *pDnode, SRpcMsg *pReq);
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -19,7 +19,7 @@
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
extern "C" {
|
extern "C" {
|
||||||
#endif
|
#endif
|
||||||
#include "dndInt.h"
|
#include "dndEnv.h"
|
||||||
|
|
||||||
int32_t dndInitWorker(SDnode *pDnode, SDnodeWorker *pWorker, EWorkerType type, const char *name, int32_t minNum,
|
int32_t dndInitWorker(SDnode *pDnode, SDnodeWorker *pWorker, EWorkerType type, const char *name, int32_t minNum,
|
||||||
int32_t maxNum, void *queueFp);
|
int32_t maxNum, void *queueFp);
|
||||||
|
|
|
@ -179,7 +179,7 @@ static void dndBuildBnodeOption(SDnode *pDnode, SBnodeOpt *pOption) {
|
||||||
pOption->sendRedirectRspFp = dndSendRedirectRsp;
|
pOption->sendRedirectRspFp = dndSendRedirectRsp;
|
||||||
pOption->dnodeId = dndGetDnodeId(pDnode);
|
pOption->dnodeId = dndGetDnodeId(pDnode);
|
||||||
pOption->clusterId = dndGetClusterId(pDnode);
|
pOption->clusterId = dndGetClusterId(pDnode);
|
||||||
pOption->cfg.sver = pDnode->opt.sver;
|
pOption->sver = pDnode->env.sver;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int32_t dndOpenBnode(SDnode *pDnode) {
|
static int32_t dndOpenBnode(SDnode *pDnode) {
|
||||||
|
|
|
@ -22,8 +22,10 @@
|
||||||
#include "dndTransport.h"
|
#include "dndTransport.h"
|
||||||
#include "dndVnodes.h"
|
#include "dndVnodes.h"
|
||||||
#include "sync.h"
|
#include "sync.h"
|
||||||
#include "wal.h"
|
|
||||||
#include "tfs.h"
|
#include "tfs.h"
|
||||||
|
#include "wal.h"
|
||||||
|
|
||||||
|
static SDnodeEnv dndEnv = {0};
|
||||||
|
|
||||||
EStat dndGetStat(SDnode *pDnode) { return pDnode->stat; }
|
EStat dndGetStat(SDnode *pDnode) { return pDnode->stat; }
|
||||||
|
|
||||||
|
@ -32,7 +34,7 @@ void dndSetStat(SDnode *pDnode, EStat stat) {
|
||||||
pDnode->stat = stat;
|
pDnode->stat = stat;
|
||||||
}
|
}
|
||||||
|
|
||||||
char *dndStatStr(EStat stat) {
|
const char *dndStatStr(EStat stat) {
|
||||||
switch (stat) {
|
switch (stat) {
|
||||||
case DND_STAT_INIT:
|
case DND_STAT_INIT:
|
||||||
return "init";
|
return "init";
|
||||||
|
@ -79,25 +81,26 @@ static FileFd dndCheckRunning(char *dataDir) {
|
||||||
return fd;
|
return fd;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int32_t dndInitEnv(SDnode *pDnode, SDnodeOpt *pOption) {
|
static int32_t dndCreateImp(SDnode *pDnode, SDnodeObjCfg *pCfg) {
|
||||||
pDnode->lockFd = dndCheckRunning(pOption->dataDir);
|
pDnode->lockFd = dndCheckRunning(pCfg->dataDir);
|
||||||
if (pDnode->lockFd < 0) {
|
if (pDnode->lockFd < 0) {
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
char path[PATH_MAX + 100];
|
char path[PATH_MAX + 100];
|
||||||
snprintf(path, sizeof(path), "%s%smnode", pOption->dataDir, TD_DIRSEP);
|
snprintf(path, sizeof(path), "%s%smnode", pCfg->dataDir, TD_DIRSEP);
|
||||||
pDnode->dir.mnode = tstrdup(path);
|
pDnode->dir.mnode = tstrdup(path);
|
||||||
snprintf(path, sizeof(path), "%s%svnode", pOption->dataDir, TD_DIRSEP);
|
snprintf(path, sizeof(path), "%s%svnode", pCfg->dataDir, TD_DIRSEP);
|
||||||
pDnode->dir.vnodes = tstrdup(path);
|
pDnode->dir.vnodes = tstrdup(path);
|
||||||
snprintf(path, sizeof(path), "%s%sdnode", pOption->dataDir, TD_DIRSEP);
|
snprintf(path, sizeof(path), "%s%sdnode", pCfg->dataDir, TD_DIRSEP);
|
||||||
pDnode->dir.dnode = tstrdup(path);
|
pDnode->dir.dnode = tstrdup(path);
|
||||||
snprintf(path, sizeof(path), "%s%ssnode", pOption->dataDir, TD_DIRSEP);
|
snprintf(path, sizeof(path), "%s%ssnode", pCfg->dataDir, TD_DIRSEP);
|
||||||
pDnode->dir.snode = tstrdup(path);
|
pDnode->dir.snode = tstrdup(path);
|
||||||
snprintf(path, sizeof(path), "%s%sbnode", pOption->dataDir, TD_DIRSEP);
|
snprintf(path, sizeof(path), "%s%sbnode", pCfg->dataDir, TD_DIRSEP);
|
||||||
pDnode->dir.bnode = tstrdup(path);
|
pDnode->dir.bnode = tstrdup(path);
|
||||||
|
|
||||||
if (pDnode->dir.mnode == NULL || pDnode->dir.vnodes == NULL || pDnode->dir.dnode == NULL) {
|
if (pDnode->dir.mnode == NULL || pDnode->dir.vnodes == NULL || pDnode->dir.dnode == NULL ||
|
||||||
|
pDnode->dir.snode == NULL || pDnode->dir.bnode == NULL) {
|
||||||
dError("failed to malloc dir object");
|
dError("failed to malloc dir object");
|
||||||
terrno = TSDB_CODE_OUT_OF_MEMORY;
|
terrno = TSDB_CODE_OUT_OF_MEMORY;
|
||||||
return -1;
|
return -1;
|
||||||
|
@ -133,11 +136,12 @@ static int32_t dndInitEnv(SDnode *pDnode, SDnodeOpt *pOption) {
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
memcpy(&pDnode->opt, pOption, sizeof(SDnodeOpt));
|
memcpy(&pDnode->cfg, pCfg, sizeof(SDnodeObjCfg));
|
||||||
|
memcpy(&pDnode->env, &dndEnv.cfg, sizeof(SDnodeEnvCfg));
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void dndCleanupEnv(SDnode *pDnode) {
|
static void dndCloseImp(SDnode *pDnode) {
|
||||||
tfree(pDnode->dir.mnode);
|
tfree(pDnode->dir.mnode);
|
||||||
tfree(pDnode->dir.vnodes);
|
tfree(pDnode->dir.vnodes);
|
||||||
tfree(pDnode->dir.dnode);
|
tfree(pDnode->dir.dnode);
|
||||||
|
@ -149,118 +153,95 @@ static void dndCleanupEnv(SDnode *pDnode) {
|
||||||
taosCloseFile(pDnode->lockFd);
|
taosCloseFile(pDnode->lockFd);
|
||||||
pDnode->lockFd = 0;
|
pDnode->lockFd = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
taosStopCacheRefreshWorker();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
SDnode *dndInit(SDnodeOpt *pOption) {
|
SDnode *dndCreate(SDnodeObjCfg *pCfg) {
|
||||||
taosIgnSIGPIPE();
|
dInfo("start to create dnode object");
|
||||||
taosBlockSIGPIPE();
|
|
||||||
taosResolveCRC();
|
|
||||||
|
|
||||||
SDnode *pDnode = calloc(1, sizeof(SDnode));
|
SDnode *pDnode = calloc(1, sizeof(SDnode));
|
||||||
if (pDnode == NULL) {
|
if (pDnode == NULL) {
|
||||||
dError("failed to create dnode object");
|
|
||||||
terrno = TSDB_CODE_OUT_OF_MEMORY;
|
terrno = TSDB_CODE_OUT_OF_MEMORY;
|
||||||
|
dError("failed to create dnode object since %s", terrstr());
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
dInfo("start to initialize TDengine");
|
|
||||||
dndSetStat(pDnode, DND_STAT_INIT);
|
dndSetStat(pDnode, DND_STAT_INIT);
|
||||||
|
|
||||||
if (dndInitEnv(pDnode, pOption) != 0) {
|
if (dndCreateImp(pDnode, pCfg) != 0) {
|
||||||
dError("failed to init env");
|
dError("failed to init dnode dir since %s", terrstr());
|
||||||
dndCleanup(pDnode);
|
dndClose(pDnode);
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (rpcInit() != 0) {
|
|
||||||
dError("failed to init rpc env");
|
|
||||||
dndCleanup(pDnode);
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (walInit() != 0) {
|
|
||||||
dError("failed to init wal env");
|
|
||||||
dndCleanup(pDnode);
|
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
SDiskCfg dCfg;
|
SDiskCfg dCfg;
|
||||||
strcpy(dCfg.dir, pDnode->opt.dataDir);
|
strcpy(dCfg.dir, pDnode->cfg.dataDir);
|
||||||
dCfg.level = 0;
|
dCfg.level = 0;
|
||||||
dCfg.primary = 1;
|
dCfg.primary = 1;
|
||||||
if (tfsInit(&dCfg, 1) != 0) {
|
if (tfsInit(&dCfg, 1) != 0) {
|
||||||
dError("failed to init tfs env");
|
dError("failed to init tfs since %s", terrstr());
|
||||||
dndCleanup(pDnode);
|
dndClose(pDnode);
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (vnodeInit(pDnode->opt.numOfCommitThreads) != 0) {
|
|
||||||
dError("failed to init vnode env");
|
|
||||||
dndCleanup(pDnode);
|
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (dndInitMgmt(pDnode) != 0) {
|
if (dndInitMgmt(pDnode) != 0) {
|
||||||
dError("failed to init dnode");
|
dError("failed to init mgmt since %s", terrstr());
|
||||||
dndCleanup(pDnode);
|
dndClose(pDnode);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (dndInitVnodes(pDnode) != 0) {
|
if (dndInitVnodes(pDnode) != 0) {
|
||||||
dError("failed to init vnodes");
|
dError("failed to init vnodes since %s", terrstr());
|
||||||
dndCleanup(pDnode);
|
dndClose(pDnode);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (dndInitQnode(pDnode) != 0) {
|
if (dndInitQnode(pDnode) != 0) {
|
||||||
dError("failed to init qnode");
|
dError("failed to init qnode since %s", terrstr());
|
||||||
dndCleanup(pDnode);
|
dndClose(pDnode);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (dndInitSnode(pDnode) != 0) {
|
if (dndInitSnode(pDnode) != 0) {
|
||||||
dError("failed to init snode");
|
dError("failed to init snode since %s", terrstr());
|
||||||
dndCleanup(pDnode);
|
dndClose(pDnode);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (dndInitBnode(pDnode) != 0) {
|
if (dndInitBnode(pDnode) != 0) {
|
||||||
dError("failed to init bnode");
|
dError("failed to init bnode since %s", terrstr());
|
||||||
dndCleanup(pDnode);
|
dndClose(pDnode);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (dndInitMnode(pDnode) != 0) {
|
if (dndInitMnode(pDnode) != 0) {
|
||||||
dError("failed to init mnode");
|
dError("failed to init mnode since %s", terrstr());
|
||||||
dndCleanup(pDnode);
|
dndClose(pDnode);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (dndInitTrans(pDnode) != 0) {
|
if (dndInitTrans(pDnode) != 0) {
|
||||||
dError("failed to init transport");
|
dError("failed to init transport since %s", terrstr());
|
||||||
dndCleanup(pDnode);
|
dndClose(pDnode);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
dndSetStat(pDnode, DND_STAT_RUNNING);
|
dndSetStat(pDnode, DND_STAT_RUNNING);
|
||||||
dndSendStatusReq(pDnode);
|
dndSendStatusReq(pDnode);
|
||||||
dndReportStartup(pDnode, "TDengine", "initialized successfully");
|
dndReportStartup(pDnode, "TDengine", "initialized successfully");
|
||||||
dInfo("TDengine is initialized successfully, pDnode:%p", pDnode);
|
dInfo("dnode object is created, data:%p", pDnode);
|
||||||
|
|
||||||
return pDnode;
|
return pDnode;
|
||||||
}
|
}
|
||||||
|
|
||||||
void dndCleanup(SDnode *pDnode) {
|
void dndClose(SDnode *pDnode) {
|
||||||
if (pDnode == NULL) return;
|
if (pDnode == NULL) return;
|
||||||
|
|
||||||
if (dndGetStat(pDnode) == DND_STAT_STOPPED) {
|
if (dndGetStat(pDnode) == DND_STAT_STOPPED) {
|
||||||
dError("dnode is shutting down");
|
dError("dnode is shutting down, data:%p", pDnode);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
dInfo("start to cleanup TDengine");
|
dInfo("start to close dnode, data:%p", pDnode);
|
||||||
dndSetStat(pDnode, DND_STAT_STOPPED);
|
dndSetStat(pDnode, DND_STAT_STOPPED);
|
||||||
dndCleanupTrans(pDnode);
|
dndCleanupTrans(pDnode);
|
||||||
dndStopMgmt(pDnode);
|
dndStopMgmt(pDnode);
|
||||||
|
@ -270,12 +251,66 @@ void dndCleanup(SDnode *pDnode) {
|
||||||
dndCleanupQnode(pDnode);
|
dndCleanupQnode(pDnode);
|
||||||
dndCleanupVnodes(pDnode);
|
dndCleanupVnodes(pDnode);
|
||||||
dndCleanupMgmt(pDnode);
|
dndCleanupMgmt(pDnode);
|
||||||
vnodeClear();
|
tfsCleanup();
|
||||||
tfsDestroy();
|
|
||||||
|
dndCloseImp(pDnode);
|
||||||
|
free(pDnode);
|
||||||
|
dInfo("dnode object is closed, data:%p", pDnode);
|
||||||
|
}
|
||||||
|
|
||||||
|
int32_t dndInit(const SDnodeEnvCfg *pCfg) {
|
||||||
|
if (atomic_val_compare_exchange_8(&dndEnv.once, DND_ENV_INIT, DND_ENV_READY) != DND_ENV_INIT) {
|
||||||
|
terrno = TSDB_CODE_REPEAT_INIT;
|
||||||
|
dError("failed to init dnode env since %s", terrstr());
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
taosIgnSIGPIPE();
|
||||||
|
taosBlockSIGPIPE();
|
||||||
|
taosResolveCRC();
|
||||||
|
|
||||||
|
if (rpcInit() != 0) {
|
||||||
|
dError("failed to init rpc since %s", terrstr());
|
||||||
|
dndCleanup();
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (walInit() != 0) {
|
||||||
|
dError("failed to init wal since %s", terrstr());
|
||||||
|
dndCleanup();
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
SVnodeOpt vnodeOpt = {
|
||||||
|
.sver = pCfg->sver,
|
||||||
|
.timezone = pCfg->timezone,
|
||||||
|
.locale = pCfg->locale,
|
||||||
|
.charset = pCfg->charset,
|
||||||
|
.nthreads = pCfg->numOfCommitThreads,
|
||||||
|
.putReqToVQueryQFp = dndPutReqToVQueryQ,
|
||||||
|
};
|
||||||
|
|
||||||
|
if (vnodeInit(&vnodeOpt) != 0) {
|
||||||
|
dError("failed to init vnode since %s", terrstr());
|
||||||
|
dndCleanup();
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
memcpy(&dndEnv.cfg, pCfg, sizeof(SDnodeEnvCfg));
|
||||||
|
dInfo("dnode env is initialized");
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
void dndCleanup() {
|
||||||
|
if (atomic_val_compare_exchange_8(&dndEnv.once, DND_ENV_READY, DND_ENV_CLEANUP) != DND_ENV_READY) {
|
||||||
|
dError("dnode env is already cleaned up");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
walCleanUp();
|
walCleanUp();
|
||||||
|
vnodeCleanup();
|
||||||
rpcCleanup();
|
rpcCleanup();
|
||||||
|
|
||||||
dndCleanupEnv(pDnode);
|
taosStopCacheRefreshWorker();
|
||||||
free(pDnode);
|
dInfo("dnode env is cleaned up");
|
||||||
dInfo("TDengine is cleaned up successfully");
|
|
||||||
}
|
}
|
|
@ -86,7 +86,7 @@ void dndSendRedirectRsp(SDnode *pDnode, SRpcMsg *pReq) {
|
||||||
dDebug("RPC %p, req:%s is redirected, num:%d use:%d", pReq->handle, TMSG_INFO(msgType), epSet.numOfEps, epSet.inUse);
|
dDebug("RPC %p, req:%s is redirected, num:%d use:%d", pReq->handle, TMSG_INFO(msgType), epSet.numOfEps, epSet.inUse);
|
||||||
for (int32_t i = 0; i < epSet.numOfEps; ++i) {
|
for (int32_t i = 0; i < epSet.numOfEps; ++i) {
|
||||||
dDebug("mnode index:%d %s:%u", i, epSet.fqdn[i], epSet.port[i]);
|
dDebug("mnode index:%d %s:%u", i, epSet.fqdn[i], epSet.port[i]);
|
||||||
if (strcmp(epSet.fqdn[i], pDnode->opt.localFqdn) == 0 && epSet.port[i] == pDnode->opt.serverPort) {
|
if (strcmp(epSet.fqdn[i], pDnode->cfg.localFqdn) == 0 && epSet.port[i] == pDnode->cfg.serverPort) {
|
||||||
epSet.inUse = (i + 1) % epSet.numOfEps;
|
epSet.inUse = (i + 1) % epSet.numOfEps;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -289,8 +289,8 @@ PRASE_DNODE_OVER:
|
||||||
if (root != NULL) cJSON_Delete(root);
|
if (root != NULL) cJSON_Delete(root);
|
||||||
if (fp != NULL) fclose(fp);
|
if (fp != NULL) fclose(fp);
|
||||||
|
|
||||||
if (dndIsEpChanged(pDnode, pMgmt->dnodeId, pDnode->opt.localEp)) {
|
if (dndIsEpChanged(pDnode, pMgmt->dnodeId, pDnode->cfg.localEp)) {
|
||||||
dError("localEp %s different with %s and need reconfigured", pDnode->opt.localEp, pMgmt->file);
|
dError("localEp %s different with %s and need reconfigured", pDnode->cfg.localEp, pMgmt->file);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -298,7 +298,7 @@ PRASE_DNODE_OVER:
|
||||||
pMgmt->dnodeEps = calloc(1, sizeof(SDnodeEps) + sizeof(SDnodeEp));
|
pMgmt->dnodeEps = calloc(1, sizeof(SDnodeEps) + sizeof(SDnodeEp));
|
||||||
pMgmt->dnodeEps->num = 1;
|
pMgmt->dnodeEps->num = 1;
|
||||||
pMgmt->dnodeEps->eps[0].isMnode = 1;
|
pMgmt->dnodeEps->eps[0].isMnode = 1;
|
||||||
taosGetFqdnPortFromEp(pDnode->opt.firstEp, pMgmt->dnodeEps->eps[0].fqdn, &pMgmt->dnodeEps->eps[0].port);
|
taosGetFqdnPortFromEp(pDnode->cfg.firstEp, pMgmt->dnodeEps->eps[0].fqdn, &pMgmt->dnodeEps->eps[0].port);
|
||||||
}
|
}
|
||||||
|
|
||||||
dndResetDnodes(pDnode, pMgmt->dnodeEps);
|
dndResetDnodes(pDnode, pMgmt->dnodeEps);
|
||||||
|
@ -362,24 +362,24 @@ void dndSendStatusReq(SDnode *pDnode) {
|
||||||
|
|
||||||
SDnodeMgmt *pMgmt = &pDnode->dmgmt;
|
SDnodeMgmt *pMgmt = &pDnode->dmgmt;
|
||||||
taosRLockLatch(&pMgmt->latch);
|
taosRLockLatch(&pMgmt->latch);
|
||||||
pStatus->sver = htonl(pDnode->opt.sver);
|
pStatus->sver = htonl(pDnode->env.sver);
|
||||||
pStatus->dver = htobe64(pMgmt->dver);
|
pStatus->dver = htobe64(pMgmt->dver);
|
||||||
pStatus->dnodeId = htonl(pMgmt->dnodeId);
|
pStatus->dnodeId = htonl(pMgmt->dnodeId);
|
||||||
pStatus->clusterId = htobe64(pMgmt->clusterId);
|
pStatus->clusterId = htobe64(pMgmt->clusterId);
|
||||||
pStatus->rebootTime = htobe64(pMgmt->rebootTime);
|
pStatus->rebootTime = htobe64(pMgmt->rebootTime);
|
||||||
pStatus->updateTime = htobe64(pMgmt->updateTime);
|
pStatus->updateTime = htobe64(pMgmt->updateTime);
|
||||||
pStatus->numOfCores = htonl(pDnode->opt.numOfCores);
|
pStatus->numOfCores = htonl(pDnode->env.numOfCores);
|
||||||
pStatus->numOfSupportVnodes = htonl(pDnode->opt.numOfSupportVnodes);
|
pStatus->numOfSupportVnodes = htonl(pDnode->cfg.numOfSupportVnodes);
|
||||||
tstrncpy(pStatus->dnodeEp, pDnode->opt.localEp, TSDB_EP_LEN);
|
tstrncpy(pStatus->dnodeEp, pDnode->cfg.localEp, TSDB_EP_LEN);
|
||||||
|
|
||||||
pStatus->clusterCfg.statusInterval = htonl(pDnode->opt.statusInterval);
|
pStatus->clusterCfg.statusInterval = htonl(pDnode->cfg.statusInterval);
|
||||||
pStatus->clusterCfg.checkTime = 0;
|
pStatus->clusterCfg.checkTime = 0;
|
||||||
char timestr[32] = "1970-01-01 00:00:00.00";
|
char timestr[32] = "1970-01-01 00:00:00.00";
|
||||||
(void)taosParseTime(timestr, &pStatus->clusterCfg.checkTime, (int32_t)strlen(timestr), TSDB_TIME_PRECISION_MILLI, 0);
|
(void)taosParseTime(timestr, &pStatus->clusterCfg.checkTime, (int32_t)strlen(timestr), TSDB_TIME_PRECISION_MILLI, 0);
|
||||||
pStatus->clusterCfg.checkTime = htonl(pStatus->clusterCfg.checkTime);
|
pStatus->clusterCfg.checkTime = htonl(pStatus->clusterCfg.checkTime);
|
||||||
tstrncpy(pStatus->clusterCfg.timezone, pDnode->opt.timezone, TSDB_TIMEZONE_LEN);
|
tstrncpy(pStatus->clusterCfg.timezone, pDnode->env.timezone, TSDB_TIMEZONE_LEN);
|
||||||
tstrncpy(pStatus->clusterCfg.locale, pDnode->opt.locale, TSDB_LOCALE_LEN);
|
tstrncpy(pStatus->clusterCfg.locale, pDnode->env.locale, TSDB_LOCALE_LEN);
|
||||||
tstrncpy(pStatus->clusterCfg.charset, pDnode->opt.charset, TSDB_LOCALE_LEN);
|
tstrncpy(pStatus->clusterCfg.charset, pDnode->env.charset, TSDB_LOCALE_LEN);
|
||||||
taosRUnLockLatch(&pMgmt->latch);
|
taosRUnLockLatch(&pMgmt->latch);
|
||||||
|
|
||||||
dndGetVnodeLoads(pDnode, &pStatus->vnodeLoads);
|
dndGetVnodeLoads(pDnode, &pStatus->vnodeLoads);
|
||||||
|
@ -485,7 +485,7 @@ void dndProcessStartupReq(SDnode *pDnode, SRpcMsg *pReq) {
|
||||||
static void *dnodeThreadRoutine(void *param) {
|
static void *dnodeThreadRoutine(void *param) {
|
||||||
SDnode *pDnode = param;
|
SDnode *pDnode = param;
|
||||||
SDnodeMgmt *pMgmt = &pDnode->dmgmt;
|
SDnodeMgmt *pMgmt = &pDnode->dmgmt;
|
||||||
int32_t ms = pDnode->opt.statusInterval * 1000;
|
int32_t ms = pDnode->cfg.statusInterval * 1000;
|
||||||
|
|
||||||
while (true) {
|
while (true) {
|
||||||
pthread_testcancel();
|
pthread_testcancel();
|
||||||
|
@ -536,6 +536,11 @@ int32_t dndInitMgmt(SDnode *pDnode) {
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (dndInitWorker(pDnode, &pMgmt->statusWorker, DND_WORKER_SINGLE, "dnode-status", 1, 1, dndProcessMgmtQueue) != 0) {
|
||||||
|
dError("failed to start dnode mgmt worker since %s", terrstr());
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
pMgmt->threadId = taosCreateThread(dnodeThreadRoutine, pDnode);
|
pMgmt->threadId = taosCreateThread(dnodeThreadRoutine, pDnode);
|
||||||
if (pMgmt->threadId == NULL) {
|
if (pMgmt->threadId == NULL) {
|
||||||
dError("failed to init dnode thread");
|
dError("failed to init dnode thread");
|
||||||
|
@ -550,6 +555,7 @@ int32_t dndInitMgmt(SDnode *pDnode) {
|
||||||
void dndStopMgmt(SDnode *pDnode) {
|
void dndStopMgmt(SDnode *pDnode) {
|
||||||
SDnodeMgmt *pMgmt = &pDnode->dmgmt;
|
SDnodeMgmt *pMgmt = &pDnode->dmgmt;
|
||||||
dndCleanupWorker(&pMgmt->mgmtWorker);
|
dndCleanupWorker(&pMgmt->mgmtWorker);
|
||||||
|
dndCleanupWorker(&pMgmt->statusWorker);
|
||||||
|
|
||||||
if (pMgmt->threadId != NULL) {
|
if (pMgmt->threadId != NULL) {
|
||||||
taosDestoryThread(pMgmt->threadId);
|
taosDestoryThread(pMgmt->threadId);
|
||||||
|
@ -587,7 +593,12 @@ void dndProcessMgmtMsg(SDnode *pDnode, SRpcMsg *pMsg, SEpSet *pEpSet) {
|
||||||
dndUpdateMnodeEpSet(pDnode, pEpSet);
|
dndUpdateMnodeEpSet(pDnode, pEpSet);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (dndWriteMsgToWorker(&pMgmt->mgmtWorker, pMsg, sizeof(SRpcMsg)) != 0) {
|
SDnodeWorker *pWorker = &pMgmt->mgmtWorker;
|
||||||
|
if (pMsg->msgType == TDMT_MND_STATUS_RSP) {
|
||||||
|
pWorker = &pMgmt->statusWorker;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (dndWriteMsgToWorker(pWorker, pMsg, sizeof(SRpcMsg)) != 0) {
|
||||||
if (pMsg->msgType & 1u) {
|
if (pMsg->msgType & 1u) {
|
||||||
SRpcMsg rsp = {.handle = pMsg->handle, .code = TSDB_CODE_OUT_OF_MEMORY};
|
SRpcMsg rsp = {.handle = pMsg->handle, .code = TSDB_CODE_OUT_OF_MEMORY};
|
||||||
rpcSendResponse(&rsp);
|
rpcSendResponse(&rsp);
|
||||||
|
|
|
@ -247,7 +247,7 @@ static bool dndNeedDeployMnode(SDnode *pDnode) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (strcmp(pDnode->opt.localEp, pDnode->opt.firstEp) != 0) {
|
if (strcmp(pDnode->cfg.localEp, pDnode->cfg.firstEp) != 0) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -266,15 +266,15 @@ static void dndInitMnodeOption(SDnode *pDnode, SMnodeOpt *pOption) {
|
||||||
pOption->putReqToMWriteQFp = dndPutMsgToMWriteQ;
|
pOption->putReqToMWriteQFp = dndPutMsgToMWriteQ;
|
||||||
pOption->dnodeId = dndGetDnodeId(pDnode);
|
pOption->dnodeId = dndGetDnodeId(pDnode);
|
||||||
pOption->clusterId = dndGetClusterId(pDnode);
|
pOption->clusterId = dndGetClusterId(pDnode);
|
||||||
pOption->cfg.sver = pDnode->opt.sver;
|
pOption->cfg.sver = pDnode->env.sver;
|
||||||
pOption->cfg.enableTelem = pDnode->opt.enableTelem;
|
pOption->cfg.enableTelem = pDnode->env.enableTelem;
|
||||||
pOption->cfg.statusInterval = pDnode->opt.statusInterval;
|
pOption->cfg.statusInterval = pDnode->cfg.statusInterval;
|
||||||
pOption->cfg.shellActivityTimer = pDnode->opt.shellActivityTimer;
|
pOption->cfg.shellActivityTimer = pDnode->cfg.shellActivityTimer;
|
||||||
pOption->cfg.timezone = pDnode->opt.timezone;
|
pOption->cfg.timezone = pDnode->env.timezone;
|
||||||
pOption->cfg.charset = pDnode->opt.charset;
|
pOption->cfg.charset = pDnode->env.charset;
|
||||||
pOption->cfg.locale = pDnode->opt.locale;
|
pOption->cfg.locale = pDnode->env.locale;
|
||||||
pOption->cfg.gitinfo = pDnode->opt.gitinfo;
|
pOption->cfg.gitinfo = pDnode->env.gitinfo;
|
||||||
pOption->cfg.buildinfo = pDnode->opt.buildinfo;
|
pOption->cfg.buildinfo = pDnode->env.buildinfo;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void dndBuildMnodeDeployOption(SDnode *pDnode, SMnodeOpt *pOption) {
|
static void dndBuildMnodeDeployOption(SDnode *pDnode, SMnodeOpt *pOption) {
|
||||||
|
@ -283,8 +283,8 @@ static void dndBuildMnodeDeployOption(SDnode *pDnode, SMnodeOpt *pOption) {
|
||||||
pOption->selfIndex = 0;
|
pOption->selfIndex = 0;
|
||||||
SReplica *pReplica = &pOption->replicas[0];
|
SReplica *pReplica = &pOption->replicas[0];
|
||||||
pReplica->id = 1;
|
pReplica->id = 1;
|
||||||
pReplica->port = pDnode->opt.serverPort;
|
pReplica->port = pDnode->cfg.serverPort;
|
||||||
memcpy(pReplica->fqdn, pDnode->opt.localFqdn, TSDB_FQDN_LEN);
|
memcpy(pReplica->fqdn, pDnode->cfg.localFqdn, TSDB_FQDN_LEN);
|
||||||
|
|
||||||
SMnodeMgmt *pMgmt = &pDnode->mmgmt;
|
SMnodeMgmt *pMgmt = &pDnode->mmgmt;
|
||||||
pMgmt->selfIndex = pOption->selfIndex;
|
pMgmt->selfIndex = pOption->selfIndex;
|
||||||
|
|
|
@ -185,7 +185,7 @@ static void dndBuildQnodeOption(SDnode *pDnode, SQnodeOpt *pOption) {
|
||||||
pOption->sendRedirectRspFp = dndSendRedirectRsp;
|
pOption->sendRedirectRspFp = dndSendRedirectRsp;
|
||||||
pOption->dnodeId = dndGetDnodeId(pDnode);
|
pOption->dnodeId = dndGetDnodeId(pDnode);
|
||||||
pOption->clusterId = dndGetClusterId(pDnode);
|
pOption->clusterId = dndGetClusterId(pDnode);
|
||||||
pOption->cfg.sver = pDnode->opt.sver;
|
pOption->sver = pDnode->env.sver;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int32_t dndOpenQnode(SDnode *pDnode) {
|
static int32_t dndOpenQnode(SDnode *pDnode) {
|
||||||
|
|
|
@ -179,7 +179,7 @@ static void dndBuildSnodeOption(SDnode *pDnode, SSnodeOpt *pOption) {
|
||||||
pOption->sendRedirectRspFp = dndSendRedirectRsp;
|
pOption->sendRedirectRspFp = dndSendRedirectRsp;
|
||||||
pOption->dnodeId = dndGetDnodeId(pDnode);
|
pOption->dnodeId = dndGetDnodeId(pDnode);
|
||||||
pOption->clusterId = dndGetClusterId(pDnode);
|
pOption->clusterId = dndGetClusterId(pDnode);
|
||||||
pOption->cfg.sver = pDnode->opt.sver;
|
pOption->sver = pDnode->env.sver;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int32_t dndOpenSnode(SDnode *pDnode) {
|
static int32_t dndOpenSnode(SDnode *pDnode) {
|
||||||
|
|
|
@ -176,7 +176,7 @@ static int32_t dndInitClient(SDnode *pDnode) {
|
||||||
rpcInit.cfp = dndProcessResponse;
|
rpcInit.cfp = dndProcessResponse;
|
||||||
rpcInit.sessions = 1024;
|
rpcInit.sessions = 1024;
|
||||||
rpcInit.connType = TAOS_CONN_CLIENT;
|
rpcInit.connType = TAOS_CONN_CLIENT;
|
||||||
rpcInit.idleTime = pDnode->opt.shellActivityTimer * 1000;
|
rpcInit.idleTime = pDnode->cfg.shellActivityTimer * 1000;
|
||||||
rpcInit.user = INTERNAL_USER;
|
rpcInit.user = INTERNAL_USER;
|
||||||
rpcInit.ckey = INTERNAL_CKEY;
|
rpcInit.ckey = INTERNAL_CKEY;
|
||||||
rpcInit.secret = INTERNAL_SECRET;
|
rpcInit.secret = INTERNAL_SECRET;
|
||||||
|
@ -325,20 +325,20 @@ static int32_t dndInitServer(SDnode *pDnode) {
|
||||||
STransMgmt *pMgmt = &pDnode->tmgmt;
|
STransMgmt *pMgmt = &pDnode->tmgmt;
|
||||||
dndInitMsgFp(pMgmt);
|
dndInitMsgFp(pMgmt);
|
||||||
|
|
||||||
int32_t numOfThreads = (int32_t)((pDnode->opt.numOfCores * pDnode->opt.numOfThreadsPerCore) / 2.0);
|
int32_t numOfThreads = (int32_t)((pDnode->env.numOfCores * pDnode->cfg.numOfThreadsPerCore) / 2.0);
|
||||||
if (numOfThreads < 1) {
|
if (numOfThreads < 1) {
|
||||||
numOfThreads = 1;
|
numOfThreads = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
SRpcInit rpcInit;
|
SRpcInit rpcInit;
|
||||||
memset(&rpcInit, 0, sizeof(rpcInit));
|
memset(&rpcInit, 0, sizeof(rpcInit));
|
||||||
rpcInit.localPort = pDnode->opt.serverPort;
|
rpcInit.localPort = pDnode->cfg.serverPort;
|
||||||
rpcInit.label = "DND-S";
|
rpcInit.label = "DND-S";
|
||||||
rpcInit.numOfThreads = numOfThreads;
|
rpcInit.numOfThreads = numOfThreads;
|
||||||
rpcInit.cfp = dndProcessRequest;
|
rpcInit.cfp = dndProcessRequest;
|
||||||
rpcInit.sessions = pDnode->opt.maxShellConns;
|
rpcInit.sessions = pDnode->cfg.maxShellConns;
|
||||||
rpcInit.connType = TAOS_CONN_SERVER;
|
rpcInit.connType = TAOS_CONN_SERVER;
|
||||||
rpcInit.idleTime = pDnode->opt.shellActivityTimer * 1000;
|
rpcInit.idleTime = pDnode->cfg.shellActivityTimer * 1000;
|
||||||
rpcInit.afp = dndRetrieveUserAuthInfo;
|
rpcInit.afp = dndRetrieveUserAuthInfo;
|
||||||
rpcInit.parent = pDnode;
|
rpcInit.parent = pDnode;
|
||||||
|
|
||||||
|
|
|
@ -381,7 +381,8 @@ static void *dnodeOpenVnodeFunc(void *param) {
|
||||||
pMgmt->openVnodes, pMgmt->totalVnodes);
|
pMgmt->openVnodes, pMgmt->totalVnodes);
|
||||||
dndReportStartup(pDnode, "open-vnodes", stepDesc);
|
dndReportStartup(pDnode, "open-vnodes", stepDesc);
|
||||||
|
|
||||||
SVnode *pImpl = vnodeOpen(pCfg->path, NULL, pCfg->vgId);
|
SVnodeCfg cfg = {.pDnode = pDnode, .vgId = pCfg->vgId};
|
||||||
|
SVnode *pImpl = vnodeOpen(pCfg->path, &cfg);
|
||||||
if (pImpl == NULL) {
|
if (pImpl == NULL) {
|
||||||
dError("vgId:%d, failed to open vnode by thread:%d", pCfg->vgId, pThread->threadIndex);
|
dError("vgId:%d, failed to open vnode by thread:%d", pCfg->vgId, pThread->threadIndex);
|
||||||
pThread->failed++;
|
pThread->failed++;
|
||||||
|
@ -419,7 +420,7 @@ static int32_t dndOpenVnodes(SDnode *pDnode) {
|
||||||
|
|
||||||
pMgmt->totalVnodes = numOfVnodes;
|
pMgmt->totalVnodes = numOfVnodes;
|
||||||
|
|
||||||
int32_t threadNum = pDnode->opt.numOfCores;
|
int32_t threadNum = pDnode->env.numOfCores;
|
||||||
int32_t vnodesPerThread = numOfVnodes / threadNum + 1;
|
int32_t vnodesPerThread = numOfVnodes / threadNum + 1;
|
||||||
|
|
||||||
SVnodeThread *threads = calloc(threadNum, sizeof(SVnodeThread));
|
SVnodeThread *threads = calloc(threadNum, sizeof(SVnodeThread));
|
||||||
|
@ -581,7 +582,8 @@ int32_t dndProcessCreateVnodeReq(SDnode *pDnode, SRpcMsg *pReq) {
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
SVnode *pImpl = vnodeOpen(wrapperCfg.path, NULL /*pCfg*/, pCreate->vgId);
|
vnodeCfg.pDnode = pDnode;
|
||||||
|
SVnode *pImpl = vnodeOpen(wrapperCfg.path, &vnodeCfg);
|
||||||
if (pImpl == NULL) {
|
if (pImpl == NULL) {
|
||||||
dError("vgId:%d, failed to create vnode since %s", pCreate->vgId, terrstr());
|
dError("vgId:%d, failed to create vnode since %s", pCreate->vgId, terrstr());
|
||||||
return -1;
|
return -1;
|
||||||
|
@ -800,7 +802,7 @@ static void dndProcessVnodeSyncQueue(SVnodeObj *pVnode, STaosQall *qall, int32_t
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static int32_t dndWriteRpcMsgToVnodeQueue(STaosQueue *pQueue, SRpcMsg *pRpcMsg) {
|
static int32_t dndWriteRpcMsgToVnodeQueue(STaosQueue *pQueue, SRpcMsg *pRpcMsg, bool sendRsp) {
|
||||||
int32_t code = 0;
|
int32_t code = 0;
|
||||||
|
|
||||||
if (pQueue == NULL) {
|
if (pQueue == NULL) {
|
||||||
|
@ -817,13 +819,15 @@ static int32_t dndWriteRpcMsgToVnodeQueue(STaosQueue *pQueue, SRpcMsg *pRpcMsg)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (code != TSDB_CODE_SUCCESS) {
|
if (code != TSDB_CODE_SUCCESS && sendRsp) {
|
||||||
if (pRpcMsg->msgType & 1u) {
|
if (pRpcMsg->msgType & 1u) {
|
||||||
SRpcMsg rsp = {.handle = pRpcMsg->handle, .code = code};
|
SRpcMsg rsp = {.handle = pRpcMsg->handle, .code = code};
|
||||||
rpcSendResponse(&rsp);
|
rpcSendResponse(&rsp);
|
||||||
}
|
}
|
||||||
rpcFreeCont(pRpcMsg->pCont);
|
rpcFreeCont(pRpcMsg->pCont);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return code;
|
||||||
}
|
}
|
||||||
|
|
||||||
static SVnodeObj *dndAcquireVnodeFromMsg(SDnode *pDnode, SRpcMsg *pMsg) {
|
static SVnodeObj *dndAcquireVnodeFromMsg(SDnode *pDnode, SRpcMsg *pMsg) {
|
||||||
|
@ -846,7 +850,7 @@ static SVnodeObj *dndAcquireVnodeFromMsg(SDnode *pDnode, SRpcMsg *pMsg) {
|
||||||
void dndProcessVnodeWriteMsg(SDnode *pDnode, SRpcMsg *pMsg, SEpSet *pEpSet) {
|
void dndProcessVnodeWriteMsg(SDnode *pDnode, SRpcMsg *pMsg, SEpSet *pEpSet) {
|
||||||
SVnodeObj *pVnode = dndAcquireVnodeFromMsg(pDnode, pMsg);
|
SVnodeObj *pVnode = dndAcquireVnodeFromMsg(pDnode, pMsg);
|
||||||
if (pVnode != NULL) {
|
if (pVnode != NULL) {
|
||||||
dndWriteRpcMsgToVnodeQueue(pVnode->pWriteQ, pMsg);
|
(void)dndWriteRpcMsgToVnodeQueue(pVnode->pWriteQ, pMsg, true);
|
||||||
dndReleaseVnode(pDnode, pVnode);
|
dndReleaseVnode(pDnode, pVnode);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -854,7 +858,7 @@ void dndProcessVnodeWriteMsg(SDnode *pDnode, SRpcMsg *pMsg, SEpSet *pEpSet) {
|
||||||
void dndProcessVnodeSyncMsg(SDnode *pDnode, SRpcMsg *pMsg, SEpSet *pEpSet) {
|
void dndProcessVnodeSyncMsg(SDnode *pDnode, SRpcMsg *pMsg, SEpSet *pEpSet) {
|
||||||
SVnodeObj *pVnode = dndAcquireVnodeFromMsg(pDnode, pMsg);
|
SVnodeObj *pVnode = dndAcquireVnodeFromMsg(pDnode, pMsg);
|
||||||
if (pVnode != NULL) {
|
if (pVnode != NULL) {
|
||||||
dndWriteRpcMsgToVnodeQueue(pVnode->pSyncQ, pMsg);
|
(void)dndWriteRpcMsgToVnodeQueue(pVnode->pSyncQ, pMsg, true);
|
||||||
dndReleaseVnode(pDnode, pVnode);
|
dndReleaseVnode(pDnode, pVnode);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -862,7 +866,7 @@ void dndProcessVnodeSyncMsg(SDnode *pDnode, SRpcMsg *pMsg, SEpSet *pEpSet) {
|
||||||
void dndProcessVnodeQueryMsg(SDnode *pDnode, SRpcMsg *pMsg, SEpSet *pEpSet) {
|
void dndProcessVnodeQueryMsg(SDnode *pDnode, SRpcMsg *pMsg, SEpSet *pEpSet) {
|
||||||
SVnodeObj *pVnode = dndAcquireVnodeFromMsg(pDnode, pMsg);
|
SVnodeObj *pVnode = dndAcquireVnodeFromMsg(pDnode, pMsg);
|
||||||
if (pVnode != NULL) {
|
if (pVnode != NULL) {
|
||||||
dndWriteRpcMsgToVnodeQueue(pVnode->pQueryQ, pMsg);
|
(void)dndWriteRpcMsgToVnodeQueue(pVnode->pQueryQ, pMsg, true);
|
||||||
dndReleaseVnode(pDnode, pVnode);
|
dndReleaseVnode(pDnode, pVnode);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -870,11 +874,23 @@ void dndProcessVnodeQueryMsg(SDnode *pDnode, SRpcMsg *pMsg, SEpSet *pEpSet) {
|
||||||
void dndProcessVnodeFetchMsg(SDnode *pDnode, SRpcMsg *pMsg, SEpSet *pEpSet) {
|
void dndProcessVnodeFetchMsg(SDnode *pDnode, SRpcMsg *pMsg, SEpSet *pEpSet) {
|
||||||
SVnodeObj *pVnode = dndAcquireVnodeFromMsg(pDnode, pMsg);
|
SVnodeObj *pVnode = dndAcquireVnodeFromMsg(pDnode, pMsg);
|
||||||
if (pVnode != NULL) {
|
if (pVnode != NULL) {
|
||||||
dndWriteRpcMsgToVnodeQueue(pVnode->pFetchQ, pMsg);
|
(void)dndWriteRpcMsgToVnodeQueue(pVnode->pFetchQ, pMsg, true);
|
||||||
dndReleaseVnode(pDnode, pVnode);
|
dndReleaseVnode(pDnode, pVnode);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int32_t dndPutReqToVQueryQ(SDnode *pDnode, SRpcMsg *pMsg) {
|
||||||
|
SMsgHead *pHead = pMsg->pCont;
|
||||||
|
// pHead->vgId = htonl(pHead->vgId);
|
||||||
|
|
||||||
|
SVnodeObj *pVnode = dndAcquireVnode(pDnode, pHead->vgId);
|
||||||
|
if (pVnode == NULL) return -1;
|
||||||
|
|
||||||
|
int32_t code = dndWriteRpcMsgToVnodeQueue(pVnode->pFetchQ, pMsg, false);
|
||||||
|
dndReleaseVnode(pDnode, pVnode);
|
||||||
|
return code;
|
||||||
|
}
|
||||||
|
|
||||||
static int32_t dndPutMsgIntoVnodeApplyQueue(SDnode *pDnode, int32_t vgId, SRpcMsg *pMsg) {
|
static int32_t dndPutMsgIntoVnodeApplyQueue(SDnode *pDnode, int32_t vgId, SRpcMsg *pMsg) {
|
||||||
SVnodeObj *pVnode = dndAcquireVnode(pDnode, vgId);
|
SVnodeObj *pVnode = dndAcquireVnode(pDnode, vgId);
|
||||||
if (pVnode == NULL) return -1;
|
if (pVnode == NULL) return -1;
|
||||||
|
@ -888,11 +904,11 @@ static int32_t dndInitVnodeWorkers(SDnode *pDnode) {
|
||||||
SVnodesMgmt *pMgmt = &pDnode->vmgmt;
|
SVnodesMgmt *pMgmt = &pDnode->vmgmt;
|
||||||
|
|
||||||
int32_t maxFetchThreads = 4;
|
int32_t maxFetchThreads = 4;
|
||||||
int32_t minFetchThreads = MIN(maxFetchThreads, pDnode->opt.numOfCores);
|
int32_t minFetchThreads = MIN(maxFetchThreads, pDnode->env.numOfCores);
|
||||||
int32_t minQueryThreads = MAX((int32_t)(pDnode->opt.numOfCores * pDnode->opt.ratioOfQueryCores), 1);
|
int32_t minQueryThreads = MAX((int32_t)(pDnode->env.numOfCores * pDnode->cfg.ratioOfQueryCores), 1);
|
||||||
int32_t maxQueryThreads = minQueryThreads;
|
int32_t maxQueryThreads = minQueryThreads;
|
||||||
int32_t maxWriteThreads = MAX(pDnode->opt.numOfCores, 1);
|
int32_t maxWriteThreads = MAX(pDnode->env.numOfCores, 1);
|
||||||
int32_t maxSyncThreads = MAX(pDnode->opt.numOfCores / 2, 1);
|
int32_t maxSyncThreads = MAX(pDnode->env.numOfCores / 2, 1);
|
||||||
|
|
||||||
SWorkerPool *pPool = &pMgmt->queryPool;
|
SWorkerPool *pPool = &pMgmt->queryPool;
|
||||||
pPool->name = "vnode-query";
|
pPool->name = "vnode-query";
|
||||||
|
|
|
@ -24,7 +24,7 @@ class TestServer {
|
||||||
bool DoStart();
|
bool DoStart();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
SDnodeOpt BuildOption(const char* path, const char* fqdn, uint16_t port, const char* firstEp);
|
SDnodeObjCfg BuildOption(const char* path, const char* fqdn, uint16_t port, const char* firstEp);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
SDnode* pDnode;
|
SDnode* pDnode;
|
||||||
|
|
|
@ -22,30 +22,27 @@ void* serverLoop(void* param) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
SDnodeOpt TestServer::BuildOption(const char* path, const char* fqdn, uint16_t port, const char* firstEp) {
|
SDnodeObjCfg TestServer::BuildOption(const char* path, const char* fqdn, uint16_t port, const char* firstEp) {
|
||||||
SDnodeOpt option = {0};
|
SDnodeObjCfg cfg = {0};
|
||||||
option.sver = 1;
|
cfg.numOfSupportVnodes = 16;
|
||||||
option.numOfCores = 1;
|
cfg.statusInterval = 1;
|
||||||
option.numOfSupportVnodes = 16;
|
cfg.numOfThreadsPerCore = 1;
|
||||||
option.numOfCommitThreads = 1;
|
cfg.ratioOfQueryCores = 1;
|
||||||
option.statusInterval = 1;
|
cfg.maxShellConns = 1000;
|
||||||
option.numOfThreadsPerCore = 1;
|
cfg.shellActivityTimer = 30;
|
||||||
option.ratioOfQueryCores = 1;
|
cfg.serverPort = port;
|
||||||
option.maxShellConns = 1000;
|
strcpy(cfg.dataDir, path);
|
||||||
option.shellActivityTimer = 30;
|
snprintf(cfg.localEp, TSDB_EP_LEN, "%s:%u", fqdn, port);
|
||||||
option.serverPort = port;
|
snprintf(cfg.localFqdn, TSDB_FQDN_LEN, "%s", fqdn);
|
||||||
strcpy(option.dataDir, path);
|
snprintf(cfg.firstEp, TSDB_EP_LEN, "%s", firstEp);
|
||||||
snprintf(option.localEp, TSDB_EP_LEN, "%s:%u", fqdn, port);
|
return cfg;
|
||||||
snprintf(option.localFqdn, TSDB_FQDN_LEN, "%s", fqdn);
|
|
||||||
snprintf(option.firstEp, TSDB_EP_LEN, "%s", firstEp);
|
|
||||||
return option;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
bool TestServer::DoStart() {
|
bool TestServer::DoStart() {
|
||||||
SDnodeOpt option = BuildOption(path, fqdn, port, firstEp);
|
SDnodeObjCfg cfg = BuildOption(path, fqdn, port, firstEp);
|
||||||
taosMkDir(path);
|
taosMkDir(path);
|
||||||
|
|
||||||
pDnode = dndInit(&option);
|
pDnode = dndCreate(&cfg);
|
||||||
if (pDnode != NULL) {
|
if (pDnode != NULL) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
@ -81,7 +78,7 @@ void TestServer::Stop() {
|
||||||
}
|
}
|
||||||
|
|
||||||
if (pDnode != NULL) {
|
if (pDnode != NULL) {
|
||||||
dndCleanup(pDnode);
|
dndClose(pDnode);
|
||||||
pDnode = NULL;
|
pDnode = NULL;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -43,6 +43,11 @@ void Testbase::InitLog(const char* path) {
|
||||||
}
|
}
|
||||||
|
|
||||||
void Testbase::Init(const char* path, int16_t port) {
|
void Testbase::Init(const char* path, int16_t port) {
|
||||||
|
SDnodeEnvCfg cfg = {0};
|
||||||
|
cfg.numOfCommitThreads = 1;
|
||||||
|
cfg.numOfCores = 1;
|
||||||
|
dndInit(&cfg);
|
||||||
|
|
||||||
char fqdn[] = "localhost";
|
char fqdn[] = "localhost";
|
||||||
char firstEp[TSDB_EP_LEN] = {0};
|
char firstEp[TSDB_EP_LEN] = {0};
|
||||||
snprintf(firstEp, TSDB_EP_LEN, "%s:%u", fqdn, port);
|
snprintf(firstEp, TSDB_EP_LEN, "%s:%u", fqdn, port);
|
||||||
|
@ -56,6 +61,7 @@ void Testbase::Init(const char* path, int16_t port) {
|
||||||
void Testbase::Cleanup() {
|
void Testbase::Cleanup() {
|
||||||
server.Stop();
|
server.Stop();
|
||||||
client.Cleanup();
|
client.Cleanup();
|
||||||
|
dndCleanup();
|
||||||
}
|
}
|
||||||
|
|
||||||
void Testbase::Restart() { server.Restart(); }
|
void Testbase::Restart() { server.Restart(); }
|
||||||
|
|
|
@ -740,7 +740,7 @@ static int32_t mndBuildDropVgroupAction(SMnode *pMnode, STrans *pTrans, SDbObj *
|
||||||
if (pReq == NULL) return -1;
|
if (pReq == NULL) return -1;
|
||||||
|
|
||||||
action.pCont = pReq;
|
action.pCont = pReq;
|
||||||
action.contLen = sizeof(SCreateVnodeReq);
|
action.contLen = sizeof(SDropVnodeReq);
|
||||||
action.msgType = TDMT_DND_DROP_VNODE;
|
action.msgType = TDMT_DND_DROP_VNODE;
|
||||||
action.acceptableCode = TSDB_CODE_DND_VNODE_NOT_DEPLOYED;
|
action.acceptableCode = TSDB_CODE_DND_VNODE_NOT_DEPLOYED;
|
||||||
if (mndTransAppendRedoAction(pTrans, &action) != 0) {
|
if (mndTransAppendRedoAction(pTrans, &action) != 0) {
|
||||||
|
|
|
@ -319,6 +319,14 @@ static int32_t mndGetAvailableDnode(SMnode *pMnode, SVgObj *pVgroup, SArray *pAr
|
||||||
|
|
||||||
taosArraySort(pArray, (__compar_fn_t)mndCompareDnodeVnodes);
|
taosArraySort(pArray, (__compar_fn_t)mndCompareDnodeVnodes);
|
||||||
|
|
||||||
|
int32_t size = taosArrayGetSize(pArray);
|
||||||
|
if (size < pVgroup->replica) {
|
||||||
|
mError("db:%s, vgId:%d, no enough online dnodes:%d to alloc %d replica", pVgroup->dbName, pVgroup->vgId, size,
|
||||||
|
pVgroup->replica);
|
||||||
|
terrno = TSDB_CODE_MND_NO_ENOUGH_DNODES;
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
for (int32_t v = 0; v < pVgroup->replica; ++v) {
|
for (int32_t v = 0; v < pVgroup->replica; ++v) {
|
||||||
SVnodeGid *pVgid = &pVgroup->vnodeGid[v];
|
SVnodeGid *pVgid = &pVgroup->vnodeGid[v];
|
||||||
SDnodeObj *pDnode = taosArrayGet(pArray, v);
|
SDnodeObj *pDnode = taosArrayGet(pArray, v);
|
||||||
|
|
|
@ -13,7 +13,7 @@
|
||||||
|
|
||||||
class MndTestProfile : public ::testing::Test {
|
class MndTestProfile : public ::testing::Test {
|
||||||
protected:
|
protected:
|
||||||
static void SetUpTestSuite() { test.Init("/tmp/mnode_test_profile", 9022); }
|
static void SetUpTestSuite() { test.Init("/tmp/mnode_test_profile", 9031); }
|
||||||
static void TearDownTestSuite() { test.Cleanup(); }
|
static void TearDownTestSuite() { test.Cleanup(); }
|
||||||
|
|
||||||
static Testbase test;
|
static Testbase test;
|
||||||
|
@ -53,7 +53,7 @@ TEST_F(MndTestProfile, 01_ConnectMsg) {
|
||||||
|
|
||||||
EXPECT_EQ(pRsp->epSet.inUse, 0);
|
EXPECT_EQ(pRsp->epSet.inUse, 0);
|
||||||
EXPECT_EQ(pRsp->epSet.numOfEps, 1);
|
EXPECT_EQ(pRsp->epSet.numOfEps, 1);
|
||||||
EXPECT_EQ(pRsp->epSet.port[0], 9022);
|
EXPECT_EQ(pRsp->epSet.port[0], 9031);
|
||||||
EXPECT_STREQ(pRsp->epSet.fqdn[0], "localhost");
|
EXPECT_STREQ(pRsp->epSet.fqdn[0], "localhost");
|
||||||
|
|
||||||
connId = pRsp->connId;
|
connId = pRsp->connId;
|
||||||
|
@ -127,7 +127,7 @@ TEST_F(MndTestProfile, 04_HeartBeatMsg) {
|
||||||
|
|
||||||
EXPECT_EQ(pRsp->epSet.inUse, 0);
|
EXPECT_EQ(pRsp->epSet.inUse, 0);
|
||||||
EXPECT_EQ(pRsp->epSet.numOfEps, 1);
|
EXPECT_EQ(pRsp->epSet.numOfEps, 1);
|
||||||
EXPECT_EQ(pRsp->epSet.port[0], 9022);
|
EXPECT_EQ(pRsp->epSet.port[0], 9031);
|
||||||
EXPECT_STREQ(pRsp->epSet.fqdn[0], "localhost");
|
EXPECT_STREQ(pRsp->epSet.fqdn[0], "localhost");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -185,7 +185,7 @@ TEST_F(MndTestProfile, 05_KillConnMsg) {
|
||||||
|
|
||||||
EXPECT_EQ(pRsp->epSet.inUse, 0);
|
EXPECT_EQ(pRsp->epSet.inUse, 0);
|
||||||
EXPECT_EQ(pRsp->epSet.numOfEps, 1);
|
EXPECT_EQ(pRsp->epSet.numOfEps, 1);
|
||||||
EXPECT_EQ(pRsp->epSet.port[0], 9022);
|
EXPECT_EQ(pRsp->epSet.port[0], 9031);
|
||||||
EXPECT_STREQ(pRsp->epSet.fqdn[0], "localhost");
|
EXPECT_STREQ(pRsp->epSet.fqdn[0], "localhost");
|
||||||
|
|
||||||
connId = pRsp->connId;
|
connId = pRsp->connId;
|
||||||
|
@ -249,7 +249,7 @@ TEST_F(MndTestProfile, 07_KillQueryMsg) {
|
||||||
|
|
||||||
EXPECT_EQ(pRsp->epSet.inUse, 0);
|
EXPECT_EQ(pRsp->epSet.inUse, 0);
|
||||||
EXPECT_EQ(pRsp->epSet.numOfEps, 1);
|
EXPECT_EQ(pRsp->epSet.numOfEps, 1);
|
||||||
EXPECT_EQ(pRsp->epSet.port[0], 9022);
|
EXPECT_EQ(pRsp->epSet.port[0], 9031);
|
||||||
EXPECT_STREQ(pRsp->epSet.fqdn[0], "localhost");
|
EXPECT_STREQ(pRsp->epSet.fqdn[0], "localhost");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -29,12 +29,7 @@ extern "C" {
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
typedef struct SQnode {
|
typedef struct SQnode {
|
||||||
int32_t dnodeId;
|
SQnodeOpt opt;
|
||||||
int64_t clusterId;
|
|
||||||
SQnodeCfg cfg;
|
|
||||||
SendReqToDnodeFp sendReqToDnodeFp;
|
|
||||||
SendReqToMnodeFp sendReqToMnodeFp;
|
|
||||||
SendRedirectRspFp sendRedirectRspFp;
|
|
||||||
} SQnode;
|
} SQnode;
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
|
|
|
@ -29,12 +29,7 @@ extern "C" {
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
typedef struct SSnode {
|
typedef struct SSnode {
|
||||||
int32_t dnodeId;
|
SSnodeOpt cfg;
|
||||||
int64_t clusterId;
|
|
||||||
SSnodeCfg cfg;
|
|
||||||
SendReqToDnodeFp sendReqToDnodeFp;
|
|
||||||
SendReqToMnodeFp sendReqToMnodeFp;
|
|
||||||
SendRedirectRspFp sendRedirectRspFp;
|
|
||||||
} SSnode;
|
} SSnode;
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
|
|
|
@ -1,4 +1,33 @@
|
||||||
add_subdirectory(meta)
|
aux_source_directory(src/meta META_SRC)
|
||||||
add_subdirectory(tq)
|
aux_source_directory(src/tq TQ_SRC)
|
||||||
add_subdirectory(tsdb)
|
aux_source_directory(src/tsdb TSDB_SRC)
|
||||||
add_subdirectory(impl)
|
aux_source_directory(src/vnd VND_SRC)
|
||||||
|
list(APPEND
|
||||||
|
VNODE_SRC
|
||||||
|
${META_SRC}
|
||||||
|
${TQ_SRC}
|
||||||
|
${TSDB_SRC}
|
||||||
|
${VND_SRC}
|
||||||
|
)
|
||||||
|
|
||||||
|
add_library(vnode STATIC ${VNODE_SRC})
|
||||||
|
target_include_directories(
|
||||||
|
vnode
|
||||||
|
PUBLIC inc
|
||||||
|
PRIVATE src/inc
|
||||||
|
)
|
||||||
|
target_link_libraries(
|
||||||
|
vnode
|
||||||
|
PUBLIC os
|
||||||
|
PUBLIC util
|
||||||
|
PUBLIC common
|
||||||
|
PUBLIC transport
|
||||||
|
PUBLIC bdb
|
||||||
|
PUBLIC tfs
|
||||||
|
PUBLIC wal
|
||||||
|
PUBLIC qworker
|
||||||
|
)
|
||||||
|
|
||||||
|
if(${BUILD_TEST})
|
||||||
|
# add_subdirectory(test)
|
||||||
|
endif(${BUILD_TEST})
|
||||||
|
|
|
@ -1,24 +0,0 @@
|
||||||
aux_source_directory(src VNODE_SRC)
|
|
||||||
add_library(vnode STATIC ${VNODE_SRC})
|
|
||||||
target_include_directories(
|
|
||||||
vnode
|
|
||||||
PUBLIC "${CMAKE_SOURCE_DIR}/include/dnode/vnode"
|
|
||||||
private "${CMAKE_CURRENT_SOURCE_DIR}/inc"
|
|
||||||
)
|
|
||||||
target_link_libraries(
|
|
||||||
vnode
|
|
||||||
PUBLIC os
|
|
||||||
PUBLIC transport
|
|
||||||
PUBLIC meta
|
|
||||||
PUBLIC tq
|
|
||||||
PUBLIC tsdb
|
|
||||||
PUBLIC wal
|
|
||||||
PUBLIC sync
|
|
||||||
PUBLIC cjson
|
|
||||||
PUBLIC qworker
|
|
||||||
)
|
|
||||||
|
|
||||||
# test
|
|
||||||
if(${BUILD_TEST})
|
|
||||||
# add_subdirectory(test)
|
|
||||||
endif(${BUILD_TEST})
|
|
|
@ -1,32 +0,0 @@
|
||||||
/*
|
|
||||||
* Copyright (c) 2019 TAOS Data, Inc. <jhtao@taosdata.com>
|
|
||||||
*
|
|
||||||
* This program is free software: you can use, redistribute, and/or modify
|
|
||||||
* it under the terms of the GNU Affero General Public License, version 3
|
|
||||||
* or later ("AGPL"), as published by the Free Software Foundation.
|
|
||||||
*
|
|
||||||
* This program is distributed in the hope that it will be useful, but WITHOUT
|
|
||||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
|
||||||
* FITNESS FOR A PARTICULAR PURPOSE.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU Affero General Public License
|
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef _TD_VNODE_MAF_H_
|
|
||||||
#define _TD_VNODE_MAF_H_
|
|
||||||
|
|
||||||
#include "vnode.h"
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
extern "C" {
|
|
||||||
#endif
|
|
||||||
|
|
||||||
int vnodeOpenMAF(SVnode *pVnode);
|
|
||||||
void vnodeCloseMAF(SVnode *pVnode);
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif /*_TD_VNODE_MAF_H_*/
|
|
|
@ -1,30 +0,0 @@
|
||||||
/*
|
|
||||||
* Copyright (c) 2019 TAOS Data, Inc. <jhtao@taosdata.com>
|
|
||||||
*
|
|
||||||
* This program is free software: you can use, redistribute, and/or modify
|
|
||||||
* it under the terms of the GNU Affero General Public License, version 3
|
|
||||||
* or later ("AGPL"), as published by the Free Software Foundation.
|
|
||||||
*
|
|
||||||
* This program is distributed in the hope that it will be useful, but WITHOUT
|
|
||||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
|
||||||
* FITNESS FOR A PARTICULAR PURPOSE.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU Affero General Public License
|
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef _TD_VNODE_READ_H_
|
|
||||||
#define _TD_VNODE_READ_H_
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
extern "C" {
|
|
||||||
#endif
|
|
||||||
#include "vnodeInt.h"
|
|
||||||
|
|
||||||
void vnodeProcessReadMsg(SVnode *pVnode, SVnodeMsg *pMsg);
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif /*_TD_VNODE_READ_H_*/
|
|
|
@ -1,16 +0,0 @@
|
||||||
/*
|
|
||||||
* Copyright (c) 2019 TAOS Data, Inc. <jhtao@taosdata.com>
|
|
||||||
*
|
|
||||||
* This program is free software: you can use, redistribute, and/or modify
|
|
||||||
* it under the terms of the GNU Affero General Public License, version 3
|
|
||||||
* or later ("AGPL"), as published by the Free Software Foundation.
|
|
||||||
*
|
|
||||||
* This program is distributed in the hope that it will be useful, but WITHOUT
|
|
||||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
|
||||||
* FITNESS FOR A PARTICULAR PURPOSE.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU Affero General Public License
|
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "vnodeDef.h"
|
|
|
@ -1,16 +0,0 @@
|
||||||
/*
|
|
||||||
* Copyright (c) 2019 TAOS Data, Inc. <jhtao@taosdata.com>
|
|
||||||
*
|
|
||||||
* This program is free software: you can use, redistribute, and/or modify
|
|
||||||
* it under the terms of the GNU Affero General Public License, version 3
|
|
||||||
* or later ("AGPL"), as published by the Free Software Foundation.
|
|
||||||
*
|
|
||||||
* This program is distributed in the hope that it will be useful, but WITHOUT
|
|
||||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
|
||||||
* FITNESS FOR A PARTICULAR PURPOSE.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU Affero General Public License
|
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "vnodeDef.h"
|
|
|
@ -1,119 +0,0 @@
|
||||||
/*
|
|
||||||
* Copyright (c) 2019 TAOS Data, Inc. <jhtao@taosdata.com>
|
|
||||||
*
|
|
||||||
* This program is free software: you can use, redistribute, and/or modify
|
|
||||||
* it under the terms of the GNU Affero General Public License, version 3
|
|
||||||
* or later ("AGPL"), as published by the Free Software Foundation.
|
|
||||||
*
|
|
||||||
* This program is distributed in the hope that it will be useful, but WITHOUT
|
|
||||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
|
||||||
* FITNESS FOR A PARTICULAR PURPOSE.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU Affero General Public License
|
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "vnodeDef.h"
|
|
||||||
|
|
||||||
#if 0
|
|
||||||
|
|
||||||
static int vnodeBuildCreateTableReq(void **buf, const SVCreateTableReq *pReq);
|
|
||||||
static void *vnodeParseCreateTableReq(void *buf, SVCreateTableReq *pReq);
|
|
||||||
|
|
||||||
int vnodeBuildReq(void **buf, const SVnodeReq *pReq, tmsg_t type) {
|
|
||||||
int tsize = 0;
|
|
||||||
|
|
||||||
tsize += taosEncodeFixedU64(buf, pReq->ver);
|
|
||||||
switch (type) {
|
|
||||||
case TDMT_VND_CREATE_STB:
|
|
||||||
tsize += vnodeBuildCreateTableReq(buf, &(pReq->ctReq));
|
|
||||||
break;
|
|
||||||
case TDMT_VND_SUBMIT:
|
|
||||||
/* code */
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
/* TODO */
|
|
||||||
return tsize;
|
|
||||||
}
|
|
||||||
|
|
||||||
void *vnodeParseReq(void *buf, SVnodeReq *pReq, tmsg_t type) {
|
|
||||||
buf = taosDecodeFixedU64(buf, &(pReq->ver));
|
|
||||||
|
|
||||||
switch (type) {
|
|
||||||
case TDMT_VND_CREATE_STB:
|
|
||||||
buf = vnodeParseCreateTableReq(buf, &(pReq->ctReq));
|
|
||||||
break;
|
|
||||||
|
|
||||||
default:
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
// TODO
|
|
||||||
return buf;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int vnodeBuildCreateTableReq(void **buf, const SVCreateTableReq *pReq) {
|
|
||||||
int tsize = 0;
|
|
||||||
|
|
||||||
tsize += taosEncodeString(buf, pReq->name);
|
|
||||||
tsize += taosEncodeFixedU32(buf, pReq->ttl);
|
|
||||||
tsize += taosEncodeFixedU32(buf, pReq->keep);
|
|
||||||
tsize += taosEncodeFixedU8(buf, pReq->type);
|
|
||||||
|
|
||||||
switch (pReq->type) {
|
|
||||||
case META_SUPER_TABLE:
|
|
||||||
tsize += taosEncodeFixedU64(buf, pReq->stbCfg.suid);
|
|
||||||
tsize += tdEncodeSchema(buf, pReq->stbCfg.pSchema);
|
|
||||||
tsize += tdEncodeSchema(buf, pReq->stbCfg.pTagSchema);
|
|
||||||
break;
|
|
||||||
case META_CHILD_TABLE:
|
|
||||||
tsize += taosEncodeFixedU64(buf, pReq->ctbCfg.suid);
|
|
||||||
tsize += tdEncodeKVRow(buf, pReq->ctbCfg.pTag);
|
|
||||||
break;
|
|
||||||
case META_NORMAL_TABLE:
|
|
||||||
tsize += tdEncodeSchema(buf, pReq->ntbCfg.pSchema);
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
return tsize;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void *vnodeParseCreateTableReq(void *buf, SVCreateTableReq *pReq) {
|
|
||||||
buf = taosDecodeString(buf, &(pReq->name));
|
|
||||||
buf = taosDecodeFixedU32(buf, &(pReq->ttl));
|
|
||||||
buf = taosDecodeFixedU32(buf, &(pReq->keep));
|
|
||||||
buf = taosDecodeFixedU8(buf, &(pReq->type));
|
|
||||||
|
|
||||||
switch (pReq->type) {
|
|
||||||
case META_SUPER_TABLE:
|
|
||||||
buf = taosDecodeFixedU64(buf, &(pReq->stbCfg.suid));
|
|
||||||
buf = tdDecodeSchema(buf, &(pReq->stbCfg.pSchema));
|
|
||||||
buf = tdDecodeSchema(buf, &(pReq->stbCfg.pTagSchema));
|
|
||||||
break;
|
|
||||||
case META_CHILD_TABLE:
|
|
||||||
buf = taosDecodeFixedU64(buf, &(pReq->ctbCfg.suid));
|
|
||||||
buf = tdDecodeKVRow(buf, &(pReq->ctbCfg.pTag));
|
|
||||||
break;
|
|
||||||
case META_NORMAL_TABLE:
|
|
||||||
buf = tdDecodeSchema(buf, &(pReq->ntbCfg.pSchema));
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
return buf;
|
|
||||||
}
|
|
||||||
|
|
||||||
int vnodeBuildDropTableReq(void **buf, const SVDropTbReq *pReq) {
|
|
||||||
// TODO
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
void *vnodeParseDropTableReq(void *buf, SVDropTbReq *pReq) {
|
|
||||||
// TODO
|
|
||||||
}
|
|
||||||
#endif
|
|
|
@ -1,14 +0,0 @@
|
||||||
/*
|
|
||||||
* Copyright (c) 2019 TAOS Data, Inc. <jhtao@taosdata.com>
|
|
||||||
*
|
|
||||||
* This program is free software: you can use, redistribute, and/or modify
|
|
||||||
* it under the terms of the GNU Affero General Public License, version 3
|
|
||||||
* or later ("AGPL"), as published by the Free Software Foundation.
|
|
||||||
*
|
|
||||||
* This program is distributed in the hope that it will be useful, but WITHOUT
|
|
||||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
|
||||||
* FITNESS FOR A PARTICULAR PURPOSE.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU Affero General Public License
|
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
*/
|
|
|
@ -1,12 +0,0 @@
|
||||||
# Vnode API test
|
|
||||||
add_executable(vnodeApiTests "")
|
|
||||||
target_sources(vnodeApiTests
|
|
||||||
PRIVATE
|
|
||||||
"vnodeApiTests.cpp"
|
|
||||||
)
|
|
||||||
target_link_libraries(vnodeApiTests vnode gtest gtest_main)
|
|
||||||
|
|
||||||
add_test(
|
|
||||||
NAME vnode_api_tests
|
|
||||||
COMMAND ${CMAKE_CURRENT_BINARY_DIR}/vnodeApiTests
|
|
||||||
)
|
|
|
@ -1,2 +0,0 @@
|
||||||
// https://stackoverflow.com/questions/8565666/benchmarking-with-googletest
|
|
||||||
// https://github.com/google/benchmark
|
|
|
@ -1,285 +0,0 @@
|
||||||
/**
|
|
||||||
* @file vnodeApiTests.cpp
|
|
||||||
* @author hzcheng (hzcheng@taosdata.com)
|
|
||||||
* @brief VNODE module API tests
|
|
||||||
* @version 0.1
|
|
||||||
* @date 2021-12-13
|
|
||||||
*
|
|
||||||
* @copyright Copyright (c) 2021
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include <gtest/gtest.h>
|
|
||||||
#include <iostream>
|
|
||||||
|
|
||||||
#include "vnode.h"
|
|
||||||
|
|
||||||
static STSchema *vtCreateBasicSchema() {
|
|
||||||
STSchemaBuilder sb;
|
|
||||||
STSchema * pSchema = NULL;
|
|
||||||
|
|
||||||
tdInitTSchemaBuilder(&sb, 0);
|
|
||||||
|
|
||||||
tdAddColToSchema(&sb, TSDB_DATA_TYPE_TIMESTAMP, 0, 0);
|
|
||||||
for (int i = 1; i < 10; i++) {
|
|
||||||
tdAddColToSchema(&sb, TSDB_DATA_TYPE_INT, i, 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
pSchema = tdGetSchemaFromBuilder(&sb);
|
|
||||||
|
|
||||||
tdDestroyTSchemaBuilder(&sb);
|
|
||||||
|
|
||||||
return pSchema;
|
|
||||||
}
|
|
||||||
|
|
||||||
static STSchema *vtCreateBasicTagSchema() {
|
|
||||||
STSchemaBuilder sb;
|
|
||||||
STSchema * pSchema = NULL;
|
|
||||||
|
|
||||||
tdInitTSchemaBuilder(&sb, 0);
|
|
||||||
|
|
||||||
tdAddColToSchema(&sb, TSDB_DATA_TYPE_TIMESTAMP, 0, 0);
|
|
||||||
for (int i = 10; i < 12; i++) {
|
|
||||||
tdAddColToSchema(&sb, TSDB_DATA_TYPE_BINARY, i, 20);
|
|
||||||
}
|
|
||||||
|
|
||||||
pSchema = tdGetSchemaFromBuilder(&sb);
|
|
||||||
|
|
||||||
tdDestroyTSchemaBuilder(&sb);
|
|
||||||
|
|
||||||
return pSchema;
|
|
||||||
}
|
|
||||||
|
|
||||||
static SKVRow vtCreateBasicTag() {
|
|
||||||
SKVRowBuilder rb;
|
|
||||||
SKVRow pTag;
|
|
||||||
|
|
||||||
tdInitKVRowBuilder(&rb);
|
|
||||||
|
|
||||||
for (int i = 0; i < 2; i++) {
|
|
||||||
void *pVal = malloc(sizeof(VarDataLenT) + strlen("foo"));
|
|
||||||
varDataLen(pVal) = strlen("foo");
|
|
||||||
memcpy(varDataVal(pVal), "foo", strlen("foo"));
|
|
||||||
|
|
||||||
tdAddColToKVRow(&rb, i, TSDB_DATA_TYPE_BINARY, pVal);
|
|
||||||
free(pVal);
|
|
||||||
}
|
|
||||||
|
|
||||||
pTag = tdGetKVRowFromBuilder(&rb);
|
|
||||||
tdDestroyKVRowBuilder(&rb);
|
|
||||||
|
|
||||||
return pTag;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void vtBuildCreateStbReq(tb_uid_t suid, char *tbname, SRpcMsg **ppMsg) {
|
|
||||||
SRpcMsg * pMsg;
|
|
||||||
STSchema *pSchema;
|
|
||||||
STSchema *pTagSchema;
|
|
||||||
int zs;
|
|
||||||
void * pBuf;
|
|
||||||
|
|
||||||
pSchema = vtCreateBasicSchema();
|
|
||||||
pTagSchema = vtCreateBasicTagSchema();
|
|
||||||
|
|
||||||
SVnodeReq vCreateSTbReq;
|
|
||||||
vnodeSetCreateStbReq(&vCreateSTbReq, tbname, UINT32_MAX, UINT32_MAX, suid, pSchema, pTagSchema);
|
|
||||||
|
|
||||||
zs = vnodeBuildReq(NULL, &vCreateSTbReq, TDMT_VND_CREATE_STB);
|
|
||||||
pMsg = (SRpcMsg *)malloc(sizeof(SRpcMsg) + zs);
|
|
||||||
pMsg->msgType = TDMT_VND_CREATE_STB;
|
|
||||||
pMsg->contLen = zs;
|
|
||||||
pMsg->pCont = POINTER_SHIFT(pMsg, sizeof(SRpcMsg));
|
|
||||||
|
|
||||||
pBuf = pMsg->pCont;
|
|
||||||
vnodeBuildReq(&pBuf, &vCreateSTbReq, TDMT_VND_CREATE_STB);
|
|
||||||
META_CLEAR_TB_CFG(&vCreateSTbReq);
|
|
||||||
|
|
||||||
tdFreeSchema(pSchema);
|
|
||||||
tdFreeSchema(pTagSchema);
|
|
||||||
|
|
||||||
*ppMsg = pMsg;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void vtBuildCreateCtbReq(tb_uid_t suid, char *tbname, SRpcMsg **ppMsg) {
|
|
||||||
SRpcMsg *pMsg;
|
|
||||||
int tz;
|
|
||||||
SKVRow pTag = vtCreateBasicTag();
|
|
||||||
|
|
||||||
SVnodeReq vCreateCTbReq;
|
|
||||||
vnodeSetCreateCtbReq(&vCreateCTbReq, tbname, UINT32_MAX, UINT32_MAX, suid, pTag);
|
|
||||||
|
|
||||||
tz = vnodeBuildReq(NULL, &vCreateCTbReq, TDMT_VND_CREATE_TABLE);
|
|
||||||
pMsg = (SRpcMsg *)malloc(sizeof(SRpcMsg) + tz);
|
|
||||||
pMsg->msgType = TDMT_VND_CREATE_TABLE;
|
|
||||||
pMsg->contLen = tz;
|
|
||||||
pMsg->pCont = POINTER_SHIFT(pMsg, sizeof(*pMsg));
|
|
||||||
void *pBuf = pMsg->pCont;
|
|
||||||
|
|
||||||
vnodeBuildReq(&pBuf, &vCreateCTbReq, TDMT_VND_CREATE_TABLE);
|
|
||||||
META_CLEAR_TB_CFG(&vCreateCTbReq);
|
|
||||||
free(pTag);
|
|
||||||
|
|
||||||
*ppMsg = pMsg;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void vtBuildCreateNtbReq(char *tbname, SRpcMsg **ppMsg) {
|
|
||||||
// TODO
|
|
||||||
}
|
|
||||||
|
|
||||||
static void vtBuildSubmitReq(SRpcMsg **ppMsg) {
|
|
||||||
SRpcMsg * pMsg;
|
|
||||||
SSubmitMsg *pSubmitMsg;
|
|
||||||
SSubmitBlk *pSubmitBlk;
|
|
||||||
int tz = 1024; // TODO
|
|
||||||
|
|
||||||
pMsg = (SRpcMsg *)malloc(sizeof(*pMsg) + tz);
|
|
||||||
pMsg->msgType = TDMT_VND_SUBMIT;
|
|
||||||
pMsg->contLen = tz;
|
|
||||||
pMsg->pCont = POINTER_SHIFT(pMsg, sizeof(*pMsg));
|
|
||||||
|
|
||||||
// For submit msg header
|
|
||||||
pSubmitMsg = (SSubmitMsg *)(pMsg->pCont);
|
|
||||||
// pSubmitMsg->header.contLen = 0;
|
|
||||||
// pSubmitMsg->header.vgId = 0;
|
|
||||||
// pSubmitMsg->length = 0;
|
|
||||||
pSubmitMsg->numOfBlocks = 1;
|
|
||||||
|
|
||||||
// For submit blk
|
|
||||||
pSubmitBlk = (SSubmitBlk *)(pSubmitMsg->blocks);
|
|
||||||
pSubmitBlk->uid = 0;
|
|
||||||
pSubmitBlk->tid = 0;
|
|
||||||
pSubmitBlk->padding = 0;
|
|
||||||
pSubmitBlk->sversion = 0;
|
|
||||||
pSubmitBlk->dataLen = 0;
|
|
||||||
pSubmitBlk->numOfRows = 0;
|
|
||||||
|
|
||||||
// For row batch
|
|
||||||
|
|
||||||
*ppMsg = pMsg;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void vtClearMsgBatch(SArray *pMsgArr) {
|
|
||||||
SRpcMsg *pMsg;
|
|
||||||
for (size_t i = 0; i < taosArrayGetSize(pMsgArr); i++) {
|
|
||||||
pMsg = *(SRpcMsg **)taosArrayGet(pMsgArr, i);
|
|
||||||
free(pMsg);
|
|
||||||
}
|
|
||||||
|
|
||||||
taosArrayClear(pMsgArr);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void vtProcessAndApplyReqs(SVnode *pVnode, SArray *pMsgArr) {
|
|
||||||
int rcode;
|
|
||||||
SRpcMsg *pReq;
|
|
||||||
SRpcMsg *pRsp;
|
|
||||||
|
|
||||||
rcode = vnodeProcessWMsgs(pVnode, pMsgArr);
|
|
||||||
GTEST_ASSERT_EQ(rcode, 0);
|
|
||||||
|
|
||||||
for (size_t i = 0; i < taosArrayGetSize(pMsgArr); i++) {
|
|
||||||
pReq = *(SRpcMsg **)taosArrayGet(pMsgArr, i);
|
|
||||||
rcode = vnodeApplyWMsg(pVnode, pReq, NULL);
|
|
||||||
GTEST_ASSERT_EQ(rcode, 0);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
TEST(vnodeApiTest, vnode_simple_create_table_test) {
|
|
||||||
tb_uid_t suid = 1638166374163;
|
|
||||||
SRpcMsg *pMsg;
|
|
||||||
SArray * pMsgArr = NULL;
|
|
||||||
SVnode * pVnode;
|
|
||||||
int rcode;
|
|
||||||
int ntables = 1000000;
|
|
||||||
int batch = 10;
|
|
||||||
char tbname[128];
|
|
||||||
|
|
||||||
pMsgArr = (SArray *)taosArrayInit(batch, sizeof(pMsg));
|
|
||||||
|
|
||||||
vnodeDestroy("vnode1");
|
|
||||||
GTEST_ASSERT_GE(vnodeInit(2), 0);
|
|
||||||
|
|
||||||
// CREATE AND OPEN A VNODE
|
|
||||||
pVnode = vnodeOpen("vnode1", NULL);
|
|
||||||
ASSERT_NE(pVnode, nullptr);
|
|
||||||
|
|
||||||
// CREATE A SUPER TABLE
|
|
||||||
sprintf(tbname, "st");
|
|
||||||
vtBuildCreateStbReq(suid, tbname, &pMsg);
|
|
||||||
taosArrayPush(pMsgArr, &pMsg);
|
|
||||||
vtProcessAndApplyReqs(pVnode, pMsgArr);
|
|
||||||
vtClearMsgBatch(pMsgArr);
|
|
||||||
|
|
||||||
// CREATE A LOT OF CHILD TABLES
|
|
||||||
for (int i = 0; i < ntables / batch; i++) {
|
|
||||||
// Build request batch
|
|
||||||
for (int j = 0; j < batch; j++) {
|
|
||||||
sprintf(tbname, "ct%d", i * batch + j + 1);
|
|
||||||
vtBuildCreateCtbReq(suid, tbname, &pMsg);
|
|
||||||
taosArrayPush(pMsgArr, &pMsg);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Process request batch
|
|
||||||
vtProcessAndApplyReqs(pVnode, pMsgArr);
|
|
||||||
|
|
||||||
// Clear request batch
|
|
||||||
vtClearMsgBatch(pMsgArr);
|
|
||||||
}
|
|
||||||
|
|
||||||
// CLOSE THE VNODE
|
|
||||||
vnodeClose(pVnode);
|
|
||||||
vnodeClear();
|
|
||||||
|
|
||||||
taosArrayDestroy(pMsgArr);
|
|
||||||
}
|
|
||||||
|
|
||||||
TEST(vnodeApiTest, vnode_simple_insert_test) {
|
|
||||||
const char *vname = "vnode2";
|
|
||||||
char tbname[128];
|
|
||||||
tb_uid_t suid = 1638166374163;
|
|
||||||
SRpcMsg * pMsg;
|
|
||||||
SArray * pMsgArr;
|
|
||||||
int rcode;
|
|
||||||
SVnode * pVnode;
|
|
||||||
int batch = 1;
|
|
||||||
int loop = 1000000;
|
|
||||||
|
|
||||||
pMsgArr = (SArray *)taosArrayInit(0, sizeof(pMsg));
|
|
||||||
|
|
||||||
vnodeDestroy(vname);
|
|
||||||
|
|
||||||
GTEST_ASSERT_GE(vnodeInit(2), 0);
|
|
||||||
|
|
||||||
// Open a vnode
|
|
||||||
pVnode = vnodeOpen(vname, NULL);
|
|
||||||
GTEST_ASSERT_NE(pVnode, nullptr);
|
|
||||||
|
|
||||||
// 1. CREATE A SUPER TABLE
|
|
||||||
sprintf(tbname, "st");
|
|
||||||
vtBuildCreateStbReq(suid, tbname, &pMsg);
|
|
||||||
taosArrayPush(pMsgArr, &pMsg);
|
|
||||||
vtProcessAndApplyReqs(pVnode, pMsgArr);
|
|
||||||
vtClearMsgBatch(pMsgArr);
|
|
||||||
|
|
||||||
// 2. CREATE A CHILD TABLE
|
|
||||||
sprintf(tbname, "t0");
|
|
||||||
vtBuildCreateCtbReq(suid, tbname, &pMsg);
|
|
||||||
taosArrayPush(pMsgArr, &pMsg);
|
|
||||||
vtProcessAndApplyReqs(pVnode, pMsgArr);
|
|
||||||
vtClearMsgBatch(pMsgArr);
|
|
||||||
|
|
||||||
// 3. WRITE A LOT OF TIME-SERIES DATA
|
|
||||||
for (int j = 0; j < loop; j++) {
|
|
||||||
for (int i = 0; i < batch; i++) {
|
|
||||||
vtBuildSubmitReq(&pMsg);
|
|
||||||
taosArrayPush(pMsgArr, &pMsg);
|
|
||||||
}
|
|
||||||
vtProcessAndApplyReqs(pVnode, pMsgArr);
|
|
||||||
vtClearMsgBatch(pMsgArr);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Close the vnode
|
|
||||||
vnodeClose(pVnode);
|
|
||||||
vnodeClear();
|
|
||||||
|
|
||||||
taosArrayDestroy(pMsgArr);
|
|
||||||
}
|
|
|
@ -0,0 +1,211 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2019 TAOS Data, Inc. <jhtao@taosdata.com>
|
||||||
|
*
|
||||||
|
* This program is free software: you can use, redistribute, and/or modify
|
||||||
|
* it under the terms of the GNU Affero General Public License, version 3
|
||||||
|
* or later ("AGPL"), as published by the Free Software Foundation.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful, but WITHOUT
|
||||||
|
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||||
|
* FITNESS FOR A PARTICULAR PURPOSE.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Affero General Public License
|
||||||
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef _TD_TSDB_H_
|
||||||
|
#define _TD_TSDB_H_
|
||||||
|
|
||||||
|
#include "mallocator.h"
|
||||||
|
#include "meta.h"
|
||||||
|
#include "common.h"
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
typedef struct SDataStatis {
|
||||||
|
int16_t colId;
|
||||||
|
int64_t sum;
|
||||||
|
int64_t max;
|
||||||
|
int64_t min;
|
||||||
|
int16_t maxIndex;
|
||||||
|
int16_t minIndex;
|
||||||
|
int16_t numOfNull;
|
||||||
|
} SDataStatis;
|
||||||
|
|
||||||
|
typedef struct STable {
|
||||||
|
uint64_t tid;
|
||||||
|
uint64_t uid;
|
||||||
|
STSchema *pSchema;
|
||||||
|
} STable;
|
||||||
|
|
||||||
|
#define BLOCK_LOAD_OFFSET_SEQ_ORDER 1
|
||||||
|
#define BLOCK_LOAD_TABLE_SEQ_ORDER 2
|
||||||
|
#define BLOCK_LOAD_TABLE_RR_ORDER 3
|
||||||
|
|
||||||
|
#define TABLE_TID(t) (t)->tid
|
||||||
|
#define TABLE_UID(t) (t)->uid
|
||||||
|
|
||||||
|
// TYPES EXPOSED
|
||||||
|
typedef struct STsdb STsdb;
|
||||||
|
|
||||||
|
typedef struct STsdbCfg {
|
||||||
|
int8_t precision;
|
||||||
|
uint64_t lruCacheSize;
|
||||||
|
int32_t daysPerFile;
|
||||||
|
int32_t minRowsPerFileBlock;
|
||||||
|
int32_t maxRowsPerFileBlock;
|
||||||
|
int32_t keep;
|
||||||
|
int32_t keep1;
|
||||||
|
int32_t keep2;
|
||||||
|
int8_t update;
|
||||||
|
int8_t compression;
|
||||||
|
} STsdbCfg;
|
||||||
|
|
||||||
|
// query condition to build multi-table data block iterator
|
||||||
|
typedef struct STsdbQueryCond {
|
||||||
|
STimeWindow twindow;
|
||||||
|
int32_t order; // desc|asc order to iterate the data block
|
||||||
|
int32_t numOfCols;
|
||||||
|
SColumnInfo *colList;
|
||||||
|
bool loadExternalRows; // load external rows or not
|
||||||
|
int32_t type; // data block load type:
|
||||||
|
} STsdbQueryCond;
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
void *pTable;
|
||||||
|
TSKEY lastKey;
|
||||||
|
uint64_t uid;
|
||||||
|
} STableKeyInfo;
|
||||||
|
|
||||||
|
// STsdb
|
||||||
|
STsdb *tsdbOpen(const char *path, int32_t vgId, const STsdbCfg *pTsdbCfg, SMemAllocatorFactory *pMAF, SMeta *pMeta);
|
||||||
|
void tsdbClose(STsdb *);
|
||||||
|
void tsdbRemove(const char *path);
|
||||||
|
int tsdbInsertData(STsdb *pTsdb, SSubmitMsg *pMsg, SSubmitRsp *pRsp);
|
||||||
|
int tsdbPrepareCommit(STsdb *pTsdb);
|
||||||
|
int tsdbCommit(STsdb *pTsdb);
|
||||||
|
|
||||||
|
// STsdbCfg
|
||||||
|
int tsdbOptionsInit(STsdbCfg *);
|
||||||
|
void tsdbOptionsClear(STsdbCfg *);
|
||||||
|
|
||||||
|
typedef void* tsdbReadHandleT;
|
||||||
|
/**
|
||||||
|
* Get the data block iterator, starting from position according to the query condition
|
||||||
|
*
|
||||||
|
* @param tsdb tsdb handle
|
||||||
|
* @param pCond query condition, including time window, result set order, and basic required columns for each block
|
||||||
|
* @param tableInfoGroup table object list in the form of set, grouped into different sets according to the
|
||||||
|
* group by condition
|
||||||
|
* @param qinfo query info handle from query processor
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
tsdbReadHandleT *tsdbQueryTables(STsdb *tsdb, STsdbQueryCond *pCond, STableGroupInfo *tableInfoGroup, uint64_t qId,
|
||||||
|
void *pRef);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the last row of the given query time window for all the tables in STableGroupInfo object.
|
||||||
|
* Note that only one data block with only row will be returned while invoking retrieve data block function for
|
||||||
|
* all tables in this group.
|
||||||
|
*
|
||||||
|
* @param tsdb tsdb handle
|
||||||
|
* @param pCond query condition, including time window, result set order, and basic required columns for each block
|
||||||
|
* @param tableInfo table list.
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
//tsdbReadHandleT tsdbQueryLastRow(STsdbRepo *tsdb, STsdbQueryCond *pCond, STableGroupInfo *tableInfo, uint64_t qId,
|
||||||
|
// SMemRef *pRef);
|
||||||
|
|
||||||
|
|
||||||
|
tsdbReadHandleT tsdbQueryCacheLast(STsdb *tsdb, STsdbQueryCond *pCond, STableGroupInfo *groupList, uint64_t qId, void* pMemRef);
|
||||||
|
|
||||||
|
bool isTsdbCacheLastRow(tsdbReadHandleT* pTsdbReadHandle);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* get num of rows in mem table
|
||||||
|
*
|
||||||
|
* @param pHandle
|
||||||
|
* @return row size
|
||||||
|
*/
|
||||||
|
|
||||||
|
int64_t tsdbGetNumOfRowsInMemTable(tsdbReadHandleT* pHandle);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* move to next block if exists
|
||||||
|
*
|
||||||
|
* @param pTsdbReadHandle
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
bool tsdbNextDataBlock(tsdbReadHandleT pTsdbReadHandle);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get current data block information
|
||||||
|
*
|
||||||
|
* @param pTsdbReadHandle
|
||||||
|
* @param pBlockInfo
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
void tsdbRetrieveDataBlockInfo(tsdbReadHandleT *pTsdbReadHandle, SDataBlockInfo *pBlockInfo);
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* Get the pre-calculated information w.r.t. current data block.
|
||||||
|
*
|
||||||
|
* In case of data block in cache, the pBlockStatis will always be NULL.
|
||||||
|
* If a block is not completed loaded from disk, the pBlockStatis will be NULL.
|
||||||
|
|
||||||
|
* @pBlockStatis the pre-calculated value for current data blocks. if the block is a cache block, always return 0
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
int32_t tsdbRetrieveDataBlockStatisInfo(tsdbReadHandleT *pTsdbReadHandle, SDataStatis **pBlockStatis);
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* The query condition with primary timestamp is passed to iterator during its constructor function,
|
||||||
|
* the returned data block must be satisfied with the time window condition in any cases,
|
||||||
|
* which means the SData data block is not actually the completed disk data blocks.
|
||||||
|
*
|
||||||
|
* @param pTsdbReadHandle query handle
|
||||||
|
* @param pColumnIdList required data columns id list
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
SArray *tsdbRetrieveDataBlock(tsdbReadHandleT *pTsdbReadHandle, SArray *pColumnIdList);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* destroy the created table group list, which is generated by tag query
|
||||||
|
* @param pGroupList
|
||||||
|
*/
|
||||||
|
void tsdbDestroyTableGroup(STableGroupInfo *pGroupList);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* create the table group result including only one table, used to handle the normal table query
|
||||||
|
*
|
||||||
|
* @param tsdb tsdbHandle
|
||||||
|
* @param uid table uid
|
||||||
|
* @param pGroupInfo the generated result
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
int32_t tsdbGetOneTableGroup(STsdb *tsdb, uint64_t uid, TSKEY startKey, STableGroupInfo *pGroupInfo);
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @param tsdb
|
||||||
|
* @param pTableIdList
|
||||||
|
* @param pGroupInfo
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
int32_t tsdbGetTableGroupFromIdList(STsdb *tsdb, SArray *pTableIdList, STableGroupInfo *pGroupInfo);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* clean up the query handle
|
||||||
|
* @param queryHandle
|
||||||
|
*/
|
||||||
|
void tsdbCleanupQueryHandle(tsdbReadHandleT queryHandle);
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif /*_TD_TSDB_H_*/
|
|
@ -31,56 +31,50 @@ extern "C" {
|
||||||
|
|
||||||
/* ------------------------ TYPES EXPOSED ------------------------ */
|
/* ------------------------ TYPES EXPOSED ------------------------ */
|
||||||
typedef struct SVnode SVnode;
|
typedef struct SVnode SVnode;
|
||||||
|
typedef struct SDnode SDnode;
|
||||||
|
typedef int32_t (*PutReqToVQueryQFp)(SDnode *pDnode, struct SRpcMsg *pReq);
|
||||||
|
|
||||||
typedef struct SVnodeCfg {
|
typedef struct SVnodeCfg {
|
||||||
int32_t vgId;
|
int32_t vgId;
|
||||||
|
SDnode *pDnode;
|
||||||
/** vnode buffer pool options */
|
|
||||||
struct {
|
struct {
|
||||||
/** write buffer size */
|
|
||||||
uint64_t wsize;
|
uint64_t wsize;
|
||||||
uint64_t ssize;
|
uint64_t ssize;
|
||||||
uint64_t lsize;
|
uint64_t lsize;
|
||||||
/** use heap allocator or arena allocator */
|
|
||||||
bool isHeapAllocator;
|
bool isHeapAllocator;
|
||||||
};
|
};
|
||||||
|
|
||||||
/** time to live of tables in this vnode */
|
|
||||||
uint32_t ttl;
|
uint32_t ttl;
|
||||||
|
|
||||||
/** data to keep in this vnode */
|
|
||||||
uint32_t keep;
|
uint32_t keep;
|
||||||
|
|
||||||
/** if TS data is eventually consistency */
|
|
||||||
bool isWeak;
|
bool isWeak;
|
||||||
|
|
||||||
/** TSDB config */
|
|
||||||
STsdbCfg tsdbCfg;
|
STsdbCfg tsdbCfg;
|
||||||
|
|
||||||
/** META config */
|
|
||||||
SMetaCfg metaCfg;
|
SMetaCfg metaCfg;
|
||||||
|
|
||||||
/** TQ config */
|
|
||||||
STqCfg tqCfg;
|
STqCfg tqCfg;
|
||||||
|
|
||||||
/** WAL config */
|
|
||||||
SWalCfg walCfg;
|
SWalCfg walCfg;
|
||||||
} SVnodeCfg;
|
} SVnodeCfg;
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
int32_t sver;
|
||||||
|
char *timezone;
|
||||||
|
char *locale;
|
||||||
|
char *charset;
|
||||||
|
uint16_t nthreads; // number of commit threads. 0 for no threads and a schedule queue should be given (TODO)
|
||||||
|
PutReqToVQueryQFp putReqToVQueryQFp;
|
||||||
|
} SVnodeOpt;
|
||||||
|
|
||||||
/* ------------------------ SVnode ------------------------ */
|
/* ------------------------ SVnode ------------------------ */
|
||||||
/**
|
/**
|
||||||
* @brief Initialize the vnode module
|
* @brief Initialize the vnode module
|
||||||
*
|
*
|
||||||
* @param nthreads number of commit threads. 0 for no threads and
|
* @param pOption Option of the vnode mnodule
|
||||||
* a schedule queue should be given (TODO)
|
|
||||||
* @return int 0 for success and -1 for failure
|
* @return int 0 for success and -1 for failure
|
||||||
*/
|
*/
|
||||||
int vnodeInit(uint16_t nthreads);
|
int vnodeInit(const SVnodeOpt *pOption);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief clear a vnode
|
* @brief Cleanup the vnode module
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
void vnodeClear();
|
void vnodeCleanup();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Open a VNODE.
|
* @brief Open a VNODE.
|
||||||
|
@ -89,7 +83,7 @@ void vnodeClear();
|
||||||
* @param pVnodeCfg options of the vnode
|
* @param pVnodeCfg options of the vnode
|
||||||
* @return SVnode* The vnode object
|
* @return SVnode* The vnode object
|
||||||
*/
|
*/
|
||||||
SVnode *vnodeOpen(const char *path, const SVnodeCfg *pVnodeCfg, int32_t vid);
|
SVnode *vnodeOpen(const char *path, const SVnodeCfg *pVnodeCfg);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Close a VNODE
|
* @brief Close a VNODE
|
|
@ -1,46 +0,0 @@
|
||||||
set(META_DB_IMPL_LIST "BDB" "SQLITE")
|
|
||||||
set(META_DB_IMPL "BDB" CACHE STRING "Use BDB as the default META implementation")
|
|
||||||
set_property(CACHE META_DB_IMPL PROPERTY STRINGS ${META_DB_IMPL_LIST})
|
|
||||||
|
|
||||||
if(META_DB_IMPL IN_LIST META_DB_IMPL_LIST)
|
|
||||||
message(STATUS "META DB Impl: ${META_DB_IMPL}==============")
|
|
||||||
else()
|
|
||||||
message(FATAL_ERROR "Invalid META DB IMPL: ${META_DB_IMPL}==============")
|
|
||||||
endif()
|
|
||||||
|
|
||||||
aux_source_directory(src META_SRC)
|
|
||||||
if(${META_DB_IMPL} STREQUAL "BDB")
|
|
||||||
list(REMOVE_ITEM META_SRC "src/metaSQLiteImpl.c")
|
|
||||||
elseif(${META_DB_IMPL} STREQUAL "SQLITE")
|
|
||||||
list(REMOVE_ITEM META_SRC "src/metaBDBImpl.c")
|
|
||||||
endif()
|
|
||||||
|
|
||||||
add_library(meta STATIC ${META_SRC})
|
|
||||||
target_include_directories(
|
|
||||||
meta
|
|
||||||
PUBLIC "${CMAKE_SOURCE_DIR}/include/dnode/vnode/meta"
|
|
||||||
PUBLIC "${CMAKE_SOURCE_DIR}/include/libs/index"
|
|
||||||
PRIVATE "${CMAKE_CURRENT_SOURCE_DIR}/inc"
|
|
||||||
)
|
|
||||||
target_link_libraries(
|
|
||||||
meta
|
|
||||||
PUBLIC common
|
|
||||||
PUBLIC index
|
|
||||||
)
|
|
||||||
|
|
||||||
if(${META_DB_IMPL} STREQUAL "BDB")
|
|
||||||
target_link_libraries(
|
|
||||||
meta
|
|
||||||
PUBLIC bdb
|
|
||||||
)
|
|
||||||
elseif(${META_DB_IMPL} STREQUAL "SQLITE")
|
|
||||||
target_link_libraries(
|
|
||||||
meta
|
|
||||||
PUBLIC sqlite
|
|
||||||
)
|
|
||||||
endif()
|
|
||||||
|
|
||||||
|
|
||||||
if(${BUILD_TEST})
|
|
||||||
add_subdirectory(test)
|
|
||||||
endif(${BUILD_TEST})
|
|
|
@ -1,212 +0,0 @@
|
||||||
/*
|
|
||||||
* Copyright (c) 2019 TAOS Data, Inc. <jhtao@taosdata.com>
|
|
||||||
*
|
|
||||||
* This program is free software: you can use, redistribute, and/or modify
|
|
||||||
* it under the terms of the GNU Affero General Public License, version 3
|
|
||||||
* or later ("AGPL"), as published by the Free Software Foundation.
|
|
||||||
*
|
|
||||||
* This program is distributed in the hope that it will be useful, but WITHOUT
|
|
||||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
|
||||||
* FITNESS FOR A PARTICULAR PURPOSE.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU Affero General Public License
|
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "metaDef.h"
|
|
||||||
#include "sqlite3.h"
|
|
||||||
|
|
||||||
struct SMetaDB {
|
|
||||||
sqlite3 *pDB;
|
|
||||||
};
|
|
||||||
|
|
||||||
int metaOpenDB(SMeta *pMeta) {
|
|
||||||
char dir[128];
|
|
||||||
int rc;
|
|
||||||
char *err = NULL;
|
|
||||||
|
|
||||||
pMeta->pDB = (SMetaDB *)calloc(1, sizeof(SMetaDB));
|
|
||||||
if (pMeta->pDB == NULL) {
|
|
||||||
// TODO: handle error
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
sprintf(dir, "%s/meta.db", pMeta->path);
|
|
||||||
rc = sqlite3_open(dir, &(pMeta->pDB->pDB));
|
|
||||||
if (rc != SQLITE_OK) {
|
|
||||||
// TODO: handle error
|
|
||||||
printf("failed to open meta.db\n");
|
|
||||||
}
|
|
||||||
|
|
||||||
// For all tables
|
|
||||||
rc = sqlite3_exec(pMeta->pDB->pDB,
|
|
||||||
"CREATE TABLE IF NOT EXISTS tb ("
|
|
||||||
" tbname VARCHAR(256) NOT NULL UNIQUE,"
|
|
||||||
" tb_uid INTEGER NOT NULL UNIQUE "
|
|
||||||
");",
|
|
||||||
NULL, NULL, &err);
|
|
||||||
if (rc != SQLITE_OK) {
|
|
||||||
// TODO: handle error
|
|
||||||
printf("failed to create meta table tb since %s\n", err);
|
|
||||||
}
|
|
||||||
|
|
||||||
// For super tables
|
|
||||||
rc = sqlite3_exec(pMeta->pDB->pDB,
|
|
||||||
"CREATE TABLE IF NOT EXISTS stb ("
|
|
||||||
" tb_uid INTEGER NOT NULL UNIQUE,"
|
|
||||||
" tbname VARCHAR(256) NOT NULL UNIQUE,"
|
|
||||||
" tb_schema BLOB NOT NULL,"
|
|
||||||
" tag_schema BLOB NOT NULL"
|
|
||||||
");",
|
|
||||||
NULL, NULL, &err);
|
|
||||||
if (rc != SQLITE_OK) {
|
|
||||||
// TODO: handle error
|
|
||||||
printf("failed to create meta table stb since %s\n", err);
|
|
||||||
}
|
|
||||||
|
|
||||||
// For normal tables
|
|
||||||
rc = sqlite3_exec(pMeta->pDB->pDB,
|
|
||||||
"CREATE TABLE IF NOT EXISTS ntb ("
|
|
||||||
" tb_uid INTEGER NOT NULL UNIQUE,"
|
|
||||||
" tbname VARCHAR(256) NOT NULL,"
|
|
||||||
" tb_schema BLOB NOT NULL"
|
|
||||||
");",
|
|
||||||
NULL, NULL, &err);
|
|
||||||
if (rc != SQLITE_OK) {
|
|
||||||
// TODO: handle error
|
|
||||||
printf("failed to create meta table ntb since %s\n", err);
|
|
||||||
}
|
|
||||||
|
|
||||||
sqlite3_exec(pMeta->pDB->pDB, "BEGIN;", NULL, NULL, &err);
|
|
||||||
|
|
||||||
tfree(err);
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
void metaCloseDB(SMeta *pMeta) {
|
|
||||||
if (pMeta->pDB) {
|
|
||||||
sqlite3_exec(pMeta->pDB->pDB, "COMMIT;", NULL, NULL, NULL);
|
|
||||||
sqlite3_close(pMeta->pDB->pDB);
|
|
||||||
free(pMeta->pDB);
|
|
||||||
pMeta->pDB = NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
// TODO
|
|
||||||
}
|
|
||||||
|
|
||||||
int metaSaveTableToDB(SMeta *pMeta, const STbCfg *pTbCfg) {
|
|
||||||
char sql[256];
|
|
||||||
char * err = NULL;
|
|
||||||
int rc;
|
|
||||||
tb_uid_t uid;
|
|
||||||
sqlite3_stmt *stmt;
|
|
||||||
char buf[256];
|
|
||||||
void * pBuf;
|
|
||||||
|
|
||||||
switch (pTbCfg->type) {
|
|
||||||
case META_SUPER_TABLE:
|
|
||||||
uid = pTbCfg->stbCfg.suid;
|
|
||||||
sprintf(sql,
|
|
||||||
"INSERT INTO tb VALUES (\'%s\', %" PRIu64
|
|
||||||
");"
|
|
||||||
"CREATE TABLE IF NOT EXISTS stb_%" PRIu64
|
|
||||||
" ("
|
|
||||||
" tb_uid INTEGER NOT NULL UNIQUE,"
|
|
||||||
" tbname VARCHAR(256),"
|
|
||||||
" tag1 INTEGER);",
|
|
||||||
pTbCfg->name, uid, uid);
|
|
||||||
rc = sqlite3_exec(pMeta->pDB->pDB, sql, NULL, NULL, &err);
|
|
||||||
if (rc != SQLITE_OK) {
|
|
||||||
printf("failed to create normal table since %s\n", err);
|
|
||||||
}
|
|
||||||
|
|
||||||
sprintf(sql, "INSERT INTO stb VALUES (%" PRIu64 ", %s, ?, ?)", uid, pTbCfg->name);
|
|
||||||
sqlite3_prepare_v2(pMeta->pDB->pDB, sql, -1, &stmt, NULL);
|
|
||||||
|
|
||||||
pBuf = buf;
|
|
||||||
tdEncodeSchema(&pBuf, pTbCfg->stbCfg.pSchema);
|
|
||||||
sqlite3_bind_blob(stmt, 1, buf, POINTER_DISTANCE(pBuf, buf), NULL);
|
|
||||||
pBuf = buf;
|
|
||||||
tdEncodeSchema(&pBuf, pTbCfg->stbCfg.pTagSchema);
|
|
||||||
sqlite3_bind_blob(stmt, 2, buf, POINTER_DISTANCE(pBuf, buf), NULL);
|
|
||||||
|
|
||||||
sqlite3_step(stmt);
|
|
||||||
|
|
||||||
sqlite3_finalize(stmt);
|
|
||||||
|
|
||||||
#if 0
|
|
||||||
sprintf(sql,
|
|
||||||
"INSERT INTO tb VALUES (?, ?);"
|
|
||||||
// "INSERT INTO stb VALUES (?, ?, ?, ?);"
|
|
||||||
// "CREATE TABLE IF NOT EXISTS stb_%" PRIu64
|
|
||||||
// " ("
|
|
||||||
// " tb_uid INTEGER NOT NULL UNIQUE,"
|
|
||||||
// " tbname VARCHAR(256),"
|
|
||||||
// " tag1 INTEGER);"
|
|
||||||
,
|
|
||||||
uid);
|
|
||||||
rc = sqlite3_prepare_v2(pMeta->pDB->pDB, sql, -1, &stmt, NULL);
|
|
||||||
if (rc != SQLITE_OK) {
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
sqlite3_bind_text(stmt, 1, pTbCfg->name, -1, SQLITE_TRANSIENT);
|
|
||||||
sqlite3_bind_int64(stmt, 2, uid);
|
|
||||||
sqlite3_step(stmt);
|
|
||||||
sqlite3_finalize(stmt);
|
|
||||||
|
|
||||||
|
|
||||||
// sqlite3_bind_int64(stmt, 3, uid);
|
|
||||||
// sqlite3_bind_text(stmt, 4, pTbCfg->name, -1, SQLITE_TRANSIENT);
|
|
||||||
// pBuf = buf;
|
|
||||||
// tdEncodeSchema(&pBuf, pTbCfg->stbCfg.pSchema);
|
|
||||||
// sqlite3_bind_blob(stmt, 5, buf, POINTER_DISTANCE(pBuf, buf), NULL);
|
|
||||||
// pBuf = buf;
|
|
||||||
// tdEncodeSchema(&pBuf, pTbCfg->stbCfg.pTagSchema);
|
|
||||||
// sqlite3_bind_blob(stmt, 6, buf, POINTER_DISTANCE(pBuf, buf), NULL);
|
|
||||||
|
|
||||||
rc = sqliteVjj3_step(stmt);
|
|
||||||
if (rc != SQLITE_OK) {
|
|
||||||
printf("failed to create normal table since %s\n", sqlite3_errmsg(pMeta->pDB->pDB));
|
|
||||||
}
|
|
||||||
sqlite3_finalize(stmt);
|
|
||||||
#endif
|
|
||||||
break;
|
|
||||||
case META_NORMAL_TABLE:
|
|
||||||
// uid = metaGenerateUid(pMeta);
|
|
||||||
// sprintf(sql,
|
|
||||||
// "INSERT INTO tb VALUES (\'%s\', %" PRIu64
|
|
||||||
// ");"
|
|
||||||
// "INSERT INTO ntb VALUES (%" PRIu64 ", \'%s\', );",
|
|
||||||
// pTbCfg->name, uid, uid, pTbCfg->name, );
|
|
||||||
|
|
||||||
// rc = sqlite3_exec(pMeta->pDB->pDB, sql, NULL, NULL, &err);
|
|
||||||
// if (rc != SQLITE_OK) {
|
|
||||||
// printf("failed to create normal table since %s\n", err);
|
|
||||||
// }
|
|
||||||
break;
|
|
||||||
case META_CHILD_TABLE:
|
|
||||||
#if 0
|
|
||||||
uid = metaGenerateUid(pMeta);
|
|
||||||
// sprintf(sql, "INSERT INTO tb VALUES (\'%s\', %" PRIu64
|
|
||||||
// ");"
|
|
||||||
// "INSERT INTO stb_%" PRIu64 " VALUES (%" PRIu64 ", \'%s\', );");
|
|
||||||
rc = sqlite3_exec(pMeta->pDB->pDB, sql, NULL, NULL, &err);
|
|
||||||
if (rc != SQLITE_OK) {
|
|
||||||
printf("failed to create child table since %s\n", err);
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
tfree(err);
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
int metaRemoveTableFromDb(SMeta *pMeta, tb_uid_t uid) {
|
|
||||||
/* TODO */
|
|
||||||
return 0;
|
|
||||||
}
|
|
|
@ -1,24 +0,0 @@
|
||||||
# add_executable(metaTest "")
|
|
||||||
# target_sources(metaTest
|
|
||||||
# PRIVATE
|
|
||||||
# "../src/metaMain.c"
|
|
||||||
# "../src/metaUid.c"
|
|
||||||
# "metaTests.cpp"
|
|
||||||
# )
|
|
||||||
# target_include_directories(metaTest
|
|
||||||
# PUBLIC
|
|
||||||
# "${CMAKE_SOURCE_DIR}/include/server/vnode/meta"
|
|
||||||
# "${CMAKE_CURRENT_SOURCE_DIR}/../inc"
|
|
||||||
# )
|
|
||||||
# target_link_libraries(metaTest
|
|
||||||
# os
|
|
||||||
# util
|
|
||||||
# common
|
|
||||||
# gtest_main
|
|
||||||
# tkv
|
|
||||||
# )
|
|
||||||
# enable_testing()
|
|
||||||
# add_test(
|
|
||||||
# NAME meta_test
|
|
||||||
# COMMAND metaTest
|
|
||||||
# )
|
|
|
@ -1,105 +0,0 @@
|
||||||
#if 0
|
|
||||||
#include <gtest/gtest.h>
|
|
||||||
#include <string.h>
|
|
||||||
#include <iostream>
|
|
||||||
|
|
||||||
#include "meta.h"
|
|
||||||
|
|
||||||
static STSchema *metaGetSimpleSchema() {
|
|
||||||
STSchema * pSchema = NULL;
|
|
||||||
STSchemaBuilder sb = {0};
|
|
||||||
|
|
||||||
tdInitTSchemaBuilder(&sb, 0);
|
|
||||||
tdAddColToSchema(&sb, TSDB_DATA_TYPE_TIMESTAMP, 0, 8);
|
|
||||||
tdAddColToSchema(&sb, TSDB_DATA_TYPE_INT, 1, 4);
|
|
||||||
|
|
||||||
pSchema = tdGetSchemaFromBuilder(&sb);
|
|
||||||
tdDestroyTSchemaBuilder(&sb);
|
|
||||||
|
|
||||||
return pSchema;
|
|
||||||
}
|
|
||||||
|
|
||||||
static SKVRow metaGetSimpleTags() {
|
|
||||||
SKVRowBuilder kvrb = {0};
|
|
||||||
SKVRow row;
|
|
||||||
|
|
||||||
tdInitKVRowBuilder(&kvrb);
|
|
||||||
int64_t ts = 1634287978000;
|
|
||||||
int32_t a = 10;
|
|
||||||
|
|
||||||
tdAddColToKVRow(&kvrb, 0, TSDB_DATA_TYPE_TIMESTAMP, (void *)(&ts));
|
|
||||||
tdAddColToKVRow(&kvrb, 0, TSDB_DATA_TYPE_INT, (void *)(&a));
|
|
||||||
|
|
||||||
row = tdGetKVRowFromBuilder(&kvrb);
|
|
||||||
|
|
||||||
tdDestroyKVRowBuilder(&kvrb);
|
|
||||||
|
|
||||||
return row;
|
|
||||||
}
|
|
||||||
|
|
||||||
TEST(MetaTest, DISABLED_meta_create_1m_normal_tables_test) {
|
|
||||||
// Open Meta
|
|
||||||
SMeta *meta = metaOpen(NULL, NULL);
|
|
||||||
std::cout << "Meta is opened!" << std::endl;
|
|
||||||
|
|
||||||
// Create 1000000 normal tables
|
|
||||||
META_TABLE_OPTS_DECLARE(tbOpts);
|
|
||||||
STSchema *pSchema = metaGetSimpleSchema();
|
|
||||||
char tbname[128];
|
|
||||||
|
|
||||||
for (size_t i = 0; i < 1000000; i++) {
|
|
||||||
sprintf(tbname, "ntb%ld", i);
|
|
||||||
metaNormalTableOptsInit(&tbOpts, tbname, pSchema);
|
|
||||||
metaCreateTable(meta, &tbOpts);
|
|
||||||
metaTableOptsClear(&tbOpts);
|
|
||||||
}
|
|
||||||
|
|
||||||
tdFreeSchema(pSchema);
|
|
||||||
|
|
||||||
// Close Meta
|
|
||||||
metaClose(meta);
|
|
||||||
std::cout << "Meta is closed!" << std::endl;
|
|
||||||
|
|
||||||
// Destroy Meta
|
|
||||||
metaDestroy("meta");
|
|
||||||
std::cout << "Meta is destroyed!" << std::endl;
|
|
||||||
}
|
|
||||||
|
|
||||||
TEST(MetaTest, meta_create_1m_child_tables_test) {
|
|
||||||
// Open Meta
|
|
||||||
SMeta *meta = metaOpen(NULL);
|
|
||||||
std::cout << "Meta is opened!" << std::endl;
|
|
||||||
|
|
||||||
// Create a super tables
|
|
||||||
tb_uid_t uid = 477529885843758ul;
|
|
||||||
META_TABLE_OPTS_DECLARE(tbOpts);
|
|
||||||
STSchema *pSchema = metaGetSimpleSchema();
|
|
||||||
STSchema *pTagSchema = metaGetSimpleSchema();
|
|
||||||
|
|
||||||
metaSuperTableOptsInit(&tbOpts, "st", uid, pSchema, pTagSchema);
|
|
||||||
metaCreateTable(meta, &tbOpts);
|
|
||||||
metaTableOptsClear(&tbOpts);
|
|
||||||
|
|
||||||
tdFreeSchema(pSchema);
|
|
||||||
tdFreeSchema(pTagSchema);
|
|
||||||
|
|
||||||
// Create 1000000 child tables
|
|
||||||
char name[128];
|
|
||||||
SKVRow row = metaGetSimpleTags();
|
|
||||||
for (size_t i = 0; i < 1000000; i++) {
|
|
||||||
sprintf(name, "ctb%ld", i);
|
|
||||||
metaChildTableOptsInit(&tbOpts, name, uid, row);
|
|
||||||
metaCreateTable(meta, &tbOpts);
|
|
||||||
metaTableOptsClear(&tbOpts);
|
|
||||||
}
|
|
||||||
kvRowFree(row);
|
|
||||||
|
|
||||||
// Close Meta
|
|
||||||
metaClose(meta);
|
|
||||||
std::cout << "Meta is closed!" << std::endl;
|
|
||||||
|
|
||||||
// Destroy Meta
|
|
||||||
metaDestroy("meta");
|
|
||||||
std::cout << "Meta is destroyed!" << std::endl;
|
|
||||||
}
|
|
||||||
#endif
|
|
|
@ -17,7 +17,7 @@
|
||||||
#define _TD_VNODE_DEF_H_
|
#define _TD_VNODE_DEF_H_
|
||||||
|
|
||||||
#include "mallocator.h"
|
#include "mallocator.h"
|
||||||
#include "sync.h"
|
// #include "sync.h"
|
||||||
#include "tcoding.h"
|
#include "tcoding.h"
|
||||||
#include "tlist.h"
|
#include "tlist.h"
|
||||||
#include "tlockfree.h"
|
#include "tlockfree.h"
|
||||||
|
@ -30,12 +30,9 @@
|
||||||
#include "vnodeBufferPool.h"
|
#include "vnodeBufferPool.h"
|
||||||
#include "vnodeCfg.h"
|
#include "vnodeCfg.h"
|
||||||
#include "vnodeCommit.h"
|
#include "vnodeCommit.h"
|
||||||
#include "vnodeFS.h"
|
|
||||||
#include "vnodeMemAllocator.h"
|
#include "vnodeMemAllocator.h"
|
||||||
#include "vnodeQuery.h"
|
#include "vnodeQuery.h"
|
||||||
#include "vnodeRequest.h"
|
|
||||||
#include "vnodeStateMgr.h"
|
#include "vnodeStateMgr.h"
|
||||||
#include "vnodeSync.h"
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
extern "C" {
|
extern "C" {
|
||||||
|
@ -57,6 +54,8 @@ typedef struct SVnodeMgr {
|
||||||
pthread_cond_t hasTask;
|
pthread_cond_t hasTask;
|
||||||
TD_DLIST(SVnodeTask) queue;
|
TD_DLIST(SVnodeTask) queue;
|
||||||
// For vnode Mgmt
|
// For vnode Mgmt
|
||||||
|
SDnode* pDnode;
|
||||||
|
PutReqToVQueryQFp putReqToVQueryQFp;
|
||||||
} SVnodeMgr;
|
} SVnodeMgr;
|
||||||
|
|
||||||
extern SVnodeMgr vnodeMgr;
|
extern SVnodeMgr vnodeMgr;
|
||||||
|
@ -71,14 +70,25 @@ struct SVnode {
|
||||||
STsdb* pTsdb;
|
STsdb* pTsdb;
|
||||||
STQ* pTq;
|
STQ* pTq;
|
||||||
SWal* pWal;
|
SWal* pWal;
|
||||||
SVnodeSync* pSync;
|
|
||||||
SVnodeFS* pFs;
|
|
||||||
tsem_t canCommit;
|
tsem_t canCommit;
|
||||||
SQHandle* pQuery;
|
SQHandle* pQuery;
|
||||||
|
SDnode* pDnode;
|
||||||
};
|
};
|
||||||
|
|
||||||
int vnodeScheduleTask(SVnodeTask* task);
|
int vnodeScheduleTask(SVnodeTask* task);
|
||||||
|
|
||||||
|
int32_t vnodePutReqToVQueryQ(SVnode *pVnode, struct SRpcMsg *pReq);
|
||||||
|
|
||||||
|
// For Log
|
||||||
|
extern int32_t vDebugFlag;
|
||||||
|
|
||||||
|
#define vFatal(...) do { if (vDebugFlag & DEBUG_FATAL) { taosPrintLog("TDB FATAL ", 255, __VA_ARGS__); }} while(0)
|
||||||
|
#define vError(...) do { if (vDebugFlag & DEBUG_ERROR) { taosPrintLog("TDB ERROR ", 255, __VA_ARGS__); }} while(0)
|
||||||
|
#define vWarn(...) do { if (vDebugFlag & DEBUG_WARN) { taosPrintLog("TDB WARN ", 255, __VA_ARGS__); }} while(0)
|
||||||
|
#define vInfo(...) do { if (vDebugFlag & DEBUG_INFO) { taosPrintLog("TDB ", 255, __VA_ARGS__); }} while(0)
|
||||||
|
#define vDebug(...) do { if (vDebugFlag & DEBUG_DEBUG) { taosPrintLog("TDB ", tsdbDebugFlag, __VA_ARGS__); }} while(0)
|
||||||
|
#define vTrace(...) do { if (vDebugFlag & DEBUG_TRACE) { taosPrintLog("TDB ", tsdbDebugFlag, __VA_ARGS__); }} while(0)
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue