<feature>:merge from 3.0
This commit is contained in:
commit
80d5c856ea
|
@ -5,6 +5,7 @@ AccessModifierOffset: -1
|
||||||
AlignAfterOpenBracket: Align
|
AlignAfterOpenBracket: Align
|
||||||
AlignConsecutiveAssignments: false
|
AlignConsecutiveAssignments: false
|
||||||
AlignConsecutiveDeclarations: true
|
AlignConsecutiveDeclarations: true
|
||||||
|
AlignConsecutiveMacros: true
|
||||||
AlignEscapedNewlinesLeft: true
|
AlignEscapedNewlinesLeft: true
|
||||||
AlignOperands: true
|
AlignOperands: true
|
||||||
AlignTrailingComments: true
|
AlignTrailingComments: true
|
||||||
|
|
|
@ -36,11 +36,13 @@ IF (TD_WINDOWS)
|
||||||
ENDIF ()
|
ENDIF ()
|
||||||
|
|
||||||
ELSE ()
|
ELSE ()
|
||||||
SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Werror -fPIC -gdwarf-2 -g3")
|
SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Werror -Werror=return-type -fPIC -gdwarf-2 -g3")
|
||||||
SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Werror -fPIC -gdwarf-2 -g3")
|
SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Werror -Werror=return-type -fPIC -gdwarf-2 -g3")
|
||||||
|
#SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Werror -Werror=return-type -fPIC -gdwarf-2 -fsanitize=address -fsanitize=undefined -fno-sanitize-recover=all -fsanitize=float-divide-by-zero -fsanitize=float-cast-overflow -fno-sanitize=null -fno-sanitize=alignment -static-libasan -g3")
|
||||||
|
#SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Werror -Werror=return-type -fPIC -gdwarf-2 -fsanitize=address -fsanitize=undefined -fno-sanitize-recover=all -fsanitize=float-divide-by-zero -fsanitize=float-cast-overflow -fno-sanitize=null -fno-sanitize=alignment -static-libasan -g3")
|
||||||
|
|
||||||
MESSAGE("System processor ID: ${CMAKE_SYSTEM_PROCESSOR}")
|
MESSAGE("System processor ID: ${CMAKE_SYSTEM_PROCESSOR}")
|
||||||
IF (${CMAKE_SYSTEM_PROCESSOR} MATCHES "arm64")
|
IF (${CMAKE_SYSTEM_PROCESSOR} MATCHES "arm64" OR ${CMAKE_SYSTEM_PROCESSOR} MATCHES "aarch64")
|
||||||
ADD_DEFINITIONS("-D_TD_ARM_")
|
ADD_DEFINITIONS("-D_TD_ARM_")
|
||||||
ELSE ()
|
ELSE ()
|
||||||
ADD_DEFINITIONS("-msse4.2 -mfma")
|
ADD_DEFINITIONS("-msse4.2 -mfma")
|
||||||
|
|
|
@ -55,17 +55,6 @@ option(
|
||||||
OFF
|
OFF
|
||||||
)
|
)
|
||||||
|
|
||||||
IF(${TD_WINDOWS})
|
|
||||||
MESSAGE("Not build BDB on Windows")
|
|
||||||
ELSE ()
|
|
||||||
option(
|
|
||||||
BUILD_WITH_BDB
|
|
||||||
"If build with BerkleyDB"
|
|
||||||
ON
|
|
||||||
)
|
|
||||||
|
|
||||||
ENDIF ()
|
|
||||||
|
|
||||||
option(
|
option(
|
||||||
BUILD_WITH_LUCENE
|
BUILD_WITH_LUCENE
|
||||||
"If build with lucene"
|
"If build with lucene"
|
||||||
|
|
|
@ -42,7 +42,7 @@ IF (${CMAKE_SYSTEM_NAME} MATCHES "Linux" OR ${CMAKE_SYSTEM_NAME} MATCHES "Darwin
|
||||||
|
|
||||||
SET(TD_DARWIN TRUE)
|
SET(TD_DARWIN TRUE)
|
||||||
SET(OSTYPE "macOS")
|
SET(OSTYPE "macOS")
|
||||||
ADD_DEFINITIONS("-DDARWIN -Wno-tautological-pointer-compare -Wno-return-type")
|
ADD_DEFINITIONS("-DDARWIN -Wno-tautological-pointer-compare")
|
||||||
|
|
||||||
MESSAGE("Current system processor is ${CMAKE_SYSTEM_PROCESSOR}.")
|
MESSAGE("Current system processor is ${CMAKE_SYSTEM_PROCESSOR}.")
|
||||||
IF (${CMAKE_SYSTEM_PROCESSOR} MATCHES "arm64" OR ${CMAKE_SYSTEM_PROCESSOR} MATCHES "x86_64")
|
IF (${CMAKE_SYSTEM_PROCESSOR} MATCHES "arm64" OR ${CMAKE_SYSTEM_PROCESSOR} MATCHES "x86_64")
|
||||||
|
|
|
@ -63,9 +63,9 @@ if(${BUILD_WITH_UV})
|
||||||
endif(${BUILD_WITH_UV})
|
endif(${BUILD_WITH_UV})
|
||||||
|
|
||||||
# bdb
|
# bdb
|
||||||
if(${BUILD_WITH_BDB})
|
#if(${BUILD_WITH_BDB})
|
||||||
cat("${CMAKE_SUPPORT_DIR}/bdb_CMakeLists.txt.in" ${CONTRIB_TMP_FILE})
|
#cat("${CMAKE_SUPPORT_DIR}/bdb_CMakeLists.txt.in" ${CONTRIB_TMP_FILE})
|
||||||
endif(${BUILD_WITH_BDB})
|
#endif(${BUILD_WITH_BDB})
|
||||||
|
|
||||||
# sqlite
|
# sqlite
|
||||||
if(${BUILD_WITH_SQLITE})
|
if(${BUILD_WITH_SQLITE})
|
||||||
|
|
|
@ -7,9 +7,9 @@ if(${BUILD_WITH_LUCENE})
|
||||||
add_subdirectory(lucene)
|
add_subdirectory(lucene)
|
||||||
endif(${BUILD_WITH_LUCENE})
|
endif(${BUILD_WITH_LUCENE})
|
||||||
|
|
||||||
if(${BUILD_WITH_BDB})
|
#if(${BUILD_WITH_BDB})
|
||||||
add_subdirectory(bdb)
|
#add_subdirectory(bdb)
|
||||||
endif(${BUILD_WITH_BDB})
|
#endif(${BUILD_WITH_BDB})
|
||||||
|
|
||||||
if(${BUILD_WITH_SQLITE})
|
if(${BUILD_WITH_SQLITE})
|
||||||
add_subdirectory(sqlite)
|
add_subdirectory(sqlite)
|
||||||
|
|
|
@ -28,7 +28,7 @@ int32_t init_env() {
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
TAOS_RES* pRes = taos_query(pConn, "create database if not exists abc1 vgroups 1");
|
TAOS_RES* pRes = taos_query(pConn, "create database if not exists abc1 vgroups 2");
|
||||||
if (taos_errno(pRes) != 0) {
|
if (taos_errno(pRes) != 0) {
|
||||||
printf("error in create db, reason:%s\n", taos_errstr(pRes));
|
printf("error in create db, reason:%s\n", taos_errstr(pRes));
|
||||||
return -1;
|
return -1;
|
||||||
|
@ -42,25 +42,33 @@ int32_t init_env() {
|
||||||
}
|
}
|
||||||
taos_free_result(pRes);
|
taos_free_result(pRes);
|
||||||
|
|
||||||
pRes = taos_query(pConn, "create stable if not exists st1 (ts timestamp, k int) tags(a int)");
|
pRes =
|
||||||
|
taos_query(pConn, "create stable if not exists st1 (ts timestamp, c1 int, c2 float, c3 binary(10)) tags(t1 int)");
|
||||||
if (taos_errno(pRes) != 0) {
|
if (taos_errno(pRes) != 0) {
|
||||||
printf("failed to create super table st1, reason:%s\n", taos_errstr(pRes));
|
printf("failed to create super table st1, reason:%s\n", taos_errstr(pRes));
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
taos_free_result(pRes);
|
taos_free_result(pRes);
|
||||||
|
|
||||||
pRes = taos_query(pConn, "create table if not exists tu1 using st1 tags(1)");
|
pRes = taos_query(pConn, "create table if not exists ct0 using st1 tags(1000)");
|
||||||
if (taos_errno(pRes) != 0) {
|
if (taos_errno(pRes) != 0) {
|
||||||
printf("failed to create child table tu1, reason:%s\n", taos_errstr(pRes));
|
printf("failed to create child table tu1, reason:%s\n", taos_errstr(pRes));
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
taos_free_result(pRes);
|
taos_free_result(pRes);
|
||||||
|
|
||||||
pRes = taos_query(pConn, "create table if not exists tu2 using st1 tags(2)");
|
pRes = taos_query(pConn, "create table if not exists ct1 using st1 tags(2000)");
|
||||||
if (taos_errno(pRes) != 0) {
|
if (taos_errno(pRes) != 0) {
|
||||||
printf("failed to create child table tu2, reason:%s\n", taos_errstr(pRes));
|
printf("failed to create child table tu2, reason:%s\n", taos_errstr(pRes));
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pRes = taos_query(pConn, "create table if not exists ct3 using st1 tags(3000)");
|
||||||
|
if (taos_errno(pRes) != 0) {
|
||||||
|
printf("failed to create child table tu3, reason:%s\n", taos_errstr(pRes));
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
taos_free_result(pRes);
|
taos_free_result(pRes);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -82,12 +90,40 @@ int32_t create_topic() {
|
||||||
|
|
||||||
/*const char* sql = "select * from tu1";*/
|
/*const char* sql = "select * from tu1";*/
|
||||||
/*pRes = tmq_create_topic(pConn, "test_stb_topic_1", sql, strlen(sql));*/
|
/*pRes = tmq_create_topic(pConn, "test_stb_topic_1", sql, strlen(sql));*/
|
||||||
pRes = taos_query(pConn, "create topic test_stb_topic_1 as select * from tu1");
|
pRes = taos_query(pConn, "create topic topic_ctb_column as select ts, c1 from ct1");
|
||||||
if (taos_errno(pRes) != 0) {
|
if (taos_errno(pRes) != 0) {
|
||||||
printf("failed to create topic test_stb_topic_1, reason:%s\n", taos_errstr(pRes));
|
printf("failed to create topic topic_ctb_column, reason:%s\n", taos_errstr(pRes));
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
taos_free_result(pRes);
|
taos_free_result(pRes);
|
||||||
|
|
||||||
|
#if 0
|
||||||
|
pRes = taos_query(pConn, "insert into tu1 values(now, 1, 1.0, 'bi1')");
|
||||||
|
if (taos_errno(pRes) != 0) {
|
||||||
|
printf("failed to insert, reason:%s\n", taos_errstr(pRes));
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
taos_free_result(pRes);
|
||||||
|
pRes = taos_query(pConn, "insert into tu1 values(now+1d, 1, 1.0, 'bi1')");
|
||||||
|
if (taos_errno(pRes) != 0) {
|
||||||
|
printf("failed to insert, reason:%s\n", taos_errstr(pRes));
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
taos_free_result(pRes);
|
||||||
|
pRes = taos_query(pConn, "insert into tu2 values(now, 2, 2.0, 'bi2')");
|
||||||
|
if (taos_errno(pRes) != 0) {
|
||||||
|
printf("failed to insert, reason:%s\n", taos_errstr(pRes));
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
taos_free_result(pRes);
|
||||||
|
pRes = taos_query(pConn, "insert into tu2 values(now+1d, 2, 2.0, 'bi2')");
|
||||||
|
if (taos_errno(pRes) != 0) {
|
||||||
|
printf("failed to insert, reason:%s\n", taos_errstr(pRes));
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
taos_free_result(pRes);
|
||||||
|
#endif
|
||||||
|
|
||||||
taos_close(pConn);
|
taos_close(pConn);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -115,7 +151,7 @@ tmq_t* build_consumer() {
|
||||||
|
|
||||||
tmq_list_t* build_topic_list() {
|
tmq_list_t* build_topic_list() {
|
||||||
tmq_list_t* topic_list = tmq_list_new();
|
tmq_list_t* topic_list = tmq_list_new();
|
||||||
tmq_list_append(topic_list, "test_stb_topic_1");
|
tmq_list_append(topic_list, "topic_ctb_column");
|
||||||
return topic_list;
|
return topic_list;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -215,8 +251,8 @@ int main(int argc, char* argv[]) {
|
||||||
if (argc > 1) {
|
if (argc > 1) {
|
||||||
printf("env init\n");
|
printf("env init\n");
|
||||||
code = init_env();
|
code = init_env();
|
||||||
}
|
|
||||||
create_topic();
|
create_topic();
|
||||||
|
}
|
||||||
tmq_t* tmq = build_consumer();
|
tmq_t* tmq = build_consumer();
|
||||||
tmq_list_t* topic_list = build_topic_list();
|
tmq_list_t* topic_list = build_topic_list();
|
||||||
/*perf_loop(tmq, topic_list);*/
|
/*perf_loop(tmq, topic_list);*/
|
||||||
|
|
|
@ -20,7 +20,7 @@
|
||||||
#include "taos.h"
|
#include "taos.h"
|
||||||
|
|
||||||
int32_t init_env() {
|
int32_t init_env() {
|
||||||
TAOS* pConn = taos_connect("localhost", "root", "taosdata", NULL, 7010);
|
TAOS* pConn = taos_connect("localhost", "root", "taosdata", NULL, 0);
|
||||||
if (pConn == NULL) {
|
if (pConn == NULL) {
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
@ -65,7 +65,7 @@ int32_t init_env() {
|
||||||
int32_t create_stream() {
|
int32_t create_stream() {
|
||||||
printf("create stream\n");
|
printf("create stream\n");
|
||||||
TAOS_RES* pRes;
|
TAOS_RES* pRes;
|
||||||
TAOS* pConn = taos_connect("localhost", "root", "taosdata", NULL, 7010);
|
TAOS* pConn = taos_connect("localhost", "root", "taosdata", NULL, 0);
|
||||||
if (pConn == NULL) {
|
if (pConn == NULL) {
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
|
@ -54,6 +54,7 @@ typedef void TAOS_SUB;
|
||||||
#define TSDB_DATA_TYPE_BLOB 18 // binary
|
#define TSDB_DATA_TYPE_BLOB 18 // binary
|
||||||
#define TSDB_DATA_TYPE_MEDIUMBLOB 19
|
#define TSDB_DATA_TYPE_MEDIUMBLOB 19
|
||||||
#define TSDB_DATA_TYPE_BINARY TSDB_DATA_TYPE_VARCHAR // string
|
#define TSDB_DATA_TYPE_BINARY TSDB_DATA_TYPE_VARCHAR // string
|
||||||
|
#define TSDB_DATA_TYPE_MAX 20
|
||||||
|
|
||||||
typedef enum {
|
typedef enum {
|
||||||
TSDB_OPTION_LOCALE,
|
TSDB_OPTION_LOCALE,
|
||||||
|
@ -187,6 +188,9 @@ DLL_EXPORT void taos_stop_query(TAOS_RES *res);
|
||||||
DLL_EXPORT bool taos_is_null(TAOS_RES *res, int32_t row, int32_t col);
|
DLL_EXPORT bool taos_is_null(TAOS_RES *res, int32_t row, int32_t col);
|
||||||
DLL_EXPORT bool taos_is_update_query(TAOS_RES *res);
|
DLL_EXPORT bool taos_is_update_query(TAOS_RES *res);
|
||||||
DLL_EXPORT int taos_fetch_block(TAOS_RES *res, TAOS_ROW *rows);
|
DLL_EXPORT int taos_fetch_block(TAOS_RES *res, TAOS_ROW *rows);
|
||||||
|
DLL_EXPORT int taos_fetch_block_s(TAOS_RES *res, int* numOfRows, TAOS_ROW *rows);
|
||||||
|
DLL_EXPORT int taos_fetch_raw_block(TAOS_RES *res, int* numOfRows, void** pData);
|
||||||
|
DLL_EXPORT int *taos_get_column_data_offset(TAOS_RES *res, int columnIndex);
|
||||||
DLL_EXPORT int taos_validate_sql(TAOS *taos, const char *sql);
|
DLL_EXPORT int taos_validate_sql(TAOS *taos, const char *sql);
|
||||||
DLL_EXPORT void taos_reset_current_db(TAOS *taos);
|
DLL_EXPORT void taos_reset_current_db(TAOS *taos);
|
||||||
|
|
||||||
|
|
|
@ -76,6 +76,13 @@ typedef enum {
|
||||||
TSDB_SMA_TYPE_ROLLUP = 2, // Rollup SMA
|
TSDB_SMA_TYPE_ROLLUP = 2, // Rollup SMA
|
||||||
} ETsdbSmaType;
|
} ETsdbSmaType;
|
||||||
|
|
||||||
|
typedef enum {
|
||||||
|
TSDB_BSMA_TYPE_NONE = 0, // no block-wise SMA
|
||||||
|
TSDB_BSMA_TYPE_I = 1, // sum/min/max(default)
|
||||||
|
} ETsdbBSmaType;
|
||||||
|
|
||||||
|
#define TSDB_BSMA_TYPE_LATEST TSDB_BSMA_TYPE_I
|
||||||
|
|
||||||
extern char *qtypeStr[];
|
extern char *qtypeStr[];
|
||||||
|
|
||||||
#define TSDB_PORT_HTTP 11
|
#define TSDB_PORT_HTTP 11
|
||||||
|
|
|
@ -37,6 +37,14 @@ enum {
|
||||||
TMQ_MSG_TYPE__EP_RSP,
|
TMQ_MSG_TYPE__EP_RSP,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
enum {
|
||||||
|
STREAM_TRIGGER__AT_ONCE = 1,
|
||||||
|
STREAM_TRIGGER__WINDOW_CLOSE,
|
||||||
|
STREAM_TRIGGER__BY_COUNT,
|
||||||
|
STREAM_TRIGGER__BY_BATCH_COUNT,
|
||||||
|
STREAM_TRIGGER__BY_EVENT_TIME,
|
||||||
|
};
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
uint32_t numOfTables;
|
uint32_t numOfTables;
|
||||||
SArray* pGroupList;
|
SArray* pGroupList;
|
||||||
|
@ -45,12 +53,12 @@ typedef struct {
|
||||||
|
|
||||||
typedef struct SColumnDataAgg {
|
typedef struct SColumnDataAgg {
|
||||||
int16_t colId;
|
int16_t colId;
|
||||||
int64_t sum;
|
|
||||||
int64_t max;
|
|
||||||
int64_t min;
|
|
||||||
int16_t maxIndex;
|
int16_t maxIndex;
|
||||||
int16_t minIndex;
|
int16_t minIndex;
|
||||||
int16_t numOfNull;
|
int16_t numOfNull;
|
||||||
|
int64_t sum;
|
||||||
|
int64_t max;
|
||||||
|
int64_t min;
|
||||||
} SColumnDataAgg;
|
} SColumnDataAgg;
|
||||||
|
|
||||||
typedef struct SDataBlockInfo {
|
typedef struct SDataBlockInfo {
|
||||||
|
@ -59,8 +67,11 @@ typedef struct SDataBlockInfo {
|
||||||
int32_t rowSize;
|
int32_t rowSize;
|
||||||
int16_t numOfCols;
|
int16_t numOfCols;
|
||||||
int16_t hasVarCol;
|
int16_t hasVarCol;
|
||||||
union {int64_t uid; int64_t blockId;};
|
union {
|
||||||
int64_t groupId; // no need to serialize
|
int64_t uid;
|
||||||
|
int64_t blockId;
|
||||||
|
};
|
||||||
|
uint64_t groupId; // no need to serialize
|
||||||
} SDataBlockInfo;
|
} SDataBlockInfo;
|
||||||
|
|
||||||
typedef struct SSDataBlock {
|
typedef struct SSDataBlock {
|
||||||
|
@ -182,24 +193,23 @@ typedef struct SColumn {
|
||||||
uint8_t scale;
|
uint8_t scale;
|
||||||
} SColumn;
|
} SColumn;
|
||||||
|
|
||||||
typedef struct SLimit {
|
typedef struct STableBlockDistInfo {
|
||||||
int64_t limit;
|
uint16_t rowSize;
|
||||||
int64_t offset;
|
uint16_t numOfFiles;
|
||||||
} SLimit;
|
uint32_t numOfTables;
|
||||||
|
uint64_t totalSize;
|
||||||
typedef struct SOrder {
|
uint64_t totalRows;
|
||||||
uint32_t order;
|
int32_t maxRows;
|
||||||
SColumn col;
|
int32_t minRows;
|
||||||
} SOrder;
|
int32_t firstSeekTimeUs;
|
||||||
|
uint32_t numOfRowsInMemTable;
|
||||||
typedef struct SGroupbyExpr {
|
uint32_t numOfSmallBlocks;
|
||||||
SArray* columnInfo; // SArray<SColIndex>, group by columns information
|
SArray *dataBlockInfos;
|
||||||
bool groupbyTag; // group by tag or column
|
} STableBlockDistInfo;
|
||||||
} SGroupbyExpr;
|
|
||||||
|
|
||||||
enum {
|
enum {
|
||||||
FUNC_PARAM_TYPE_VALUE = 0,
|
FUNC_PARAM_TYPE_VALUE = 0x1,
|
||||||
FUNC_PARAM_TYPE_COLUMN,
|
FUNC_PARAM_TYPE_COLUMN= 0x2,
|
||||||
};
|
};
|
||||||
|
|
||||||
typedef struct SFunctParam {
|
typedef struct SFunctParam {
|
||||||
|
@ -230,15 +240,6 @@ typedef struct SExprInfo {
|
||||||
struct tExprNode* pExpr;
|
struct tExprNode* pExpr;
|
||||||
} SExprInfo;
|
} SExprInfo;
|
||||||
|
|
||||||
typedef struct SStateWindow {
|
|
||||||
SColumn col;
|
|
||||||
} SStateWindow;
|
|
||||||
|
|
||||||
typedef struct SSessionWindow {
|
|
||||||
int64_t gap; // gap between two session window(in microseconds)
|
|
||||||
SColumn col;
|
|
||||||
} SSessionWindow;
|
|
||||||
|
|
||||||
#define QUERY_ASC_FORWARD_STEP 1
|
#define QUERY_ASC_FORWARD_STEP 1
|
||||||
#define QUERY_DESC_FORWARD_STEP -1
|
#define QUERY_DESC_FORWARD_STEP -1
|
||||||
|
|
||||||
|
|
|
@ -113,39 +113,53 @@ static FORCE_INLINE void colDataAppendNULL(SColumnInfoData* pColumnInfoData, uin
|
||||||
pColumnInfoData->hasNull = true;
|
pColumnInfoData->hasNull = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
static FORCE_INLINE int32_t colDataAppendInt8(SColumnInfoData* pColumnInfoData, uint32_t currentRow, int8_t* v) {
|
static FORCE_INLINE void colDataAppendNNULL(SColumnInfoData* pColumnInfoData, uint32_t start, size_t nRows) {
|
||||||
|
if (IS_VAR_DATA_TYPE(pColumnInfoData->info.type)) {
|
||||||
|
for(int32_t i = start; i < start + nRows; ++i) {
|
||||||
|
pColumnInfoData->varmeta.offset[i] = -1; // it is a null value of VAR type.
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
for(int32_t i = start; i < start + nRows; ++i) {
|
||||||
|
colDataSetNull_f(pColumnInfoData->nullbitmap, i);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pColumnInfoData->hasNull = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
static FORCE_INLINE void colDataAppendInt8(SColumnInfoData* pColumnInfoData, uint32_t currentRow, int8_t* v) {
|
||||||
ASSERT(pColumnInfoData->info.type == TSDB_DATA_TYPE_TINYINT ||
|
ASSERT(pColumnInfoData->info.type == TSDB_DATA_TYPE_TINYINT ||
|
||||||
pColumnInfoData->info.type == TSDB_DATA_TYPE_UTINYINT || pColumnInfoData->info.type == TSDB_DATA_TYPE_BOOL);
|
pColumnInfoData->info.type == TSDB_DATA_TYPE_UTINYINT || pColumnInfoData->info.type == TSDB_DATA_TYPE_BOOL);
|
||||||
char* p = pColumnInfoData->pData + pColumnInfoData->info.bytes * currentRow;
|
char* p = pColumnInfoData->pData + pColumnInfoData->info.bytes * currentRow;
|
||||||
*(int8_t*)p = *(int8_t*)v;
|
*(int8_t*)p = *(int8_t*)v;
|
||||||
}
|
}
|
||||||
|
|
||||||
static FORCE_INLINE int32_t colDataAppendInt16(SColumnInfoData* pColumnInfoData, uint32_t currentRow, int16_t* v) {
|
static FORCE_INLINE void colDataAppendInt16(SColumnInfoData* pColumnInfoData, uint32_t currentRow, int16_t* v) {
|
||||||
ASSERT(pColumnInfoData->info.type == TSDB_DATA_TYPE_SMALLINT || pColumnInfoData->info.type == TSDB_DATA_TYPE_USMALLINT);
|
ASSERT(pColumnInfoData->info.type == TSDB_DATA_TYPE_SMALLINT || pColumnInfoData->info.type == TSDB_DATA_TYPE_USMALLINT);
|
||||||
char* p = pColumnInfoData->pData + pColumnInfoData->info.bytes * currentRow;
|
char* p = pColumnInfoData->pData + pColumnInfoData->info.bytes * currentRow;
|
||||||
*(int16_t*)p = *(int16_t*)v;
|
*(int16_t*)p = *(int16_t*)v;
|
||||||
}
|
}
|
||||||
|
|
||||||
static FORCE_INLINE int32_t colDataAppendInt32(SColumnInfoData* pColumnInfoData, uint32_t currentRow, int32_t* v) {
|
static FORCE_INLINE void colDataAppendInt32(SColumnInfoData* pColumnInfoData, uint32_t currentRow, int32_t* v) {
|
||||||
ASSERT(pColumnInfoData->info.type == TSDB_DATA_TYPE_INT || pColumnInfoData->info.type == TSDB_DATA_TYPE_UINT);
|
ASSERT(pColumnInfoData->info.type == TSDB_DATA_TYPE_INT || pColumnInfoData->info.type == TSDB_DATA_TYPE_UINT);
|
||||||
char* p = pColumnInfoData->pData + pColumnInfoData->info.bytes * currentRow;
|
char* p = pColumnInfoData->pData + pColumnInfoData->info.bytes * currentRow;
|
||||||
*(int32_t*)p = *(int32_t*)v;
|
*(int32_t*)p = *(int32_t*)v;
|
||||||
}
|
}
|
||||||
|
|
||||||
static FORCE_INLINE int32_t colDataAppendInt64(SColumnInfoData* pColumnInfoData, uint32_t currentRow, int64_t* v) {
|
static FORCE_INLINE void colDataAppendInt64(SColumnInfoData* pColumnInfoData, uint32_t currentRow, int64_t* v) {
|
||||||
int32_t type = pColumnInfoData->info.type;
|
int32_t type = pColumnInfoData->info.type;
|
||||||
ASSERT(type == TSDB_DATA_TYPE_BIGINT || type == TSDB_DATA_TYPE_UBIGINT || type == TSDB_DATA_TYPE_TIMESTAMP);
|
ASSERT(type == TSDB_DATA_TYPE_BIGINT || type == TSDB_DATA_TYPE_UBIGINT || type == TSDB_DATA_TYPE_TIMESTAMP);
|
||||||
char* p = pColumnInfoData->pData + pColumnInfoData->info.bytes * currentRow;
|
char* p = pColumnInfoData->pData + pColumnInfoData->info.bytes * currentRow;
|
||||||
*(int64_t*)p = *(int64_t*)v;
|
*(int64_t*)p = *(int64_t*)v;
|
||||||
}
|
}
|
||||||
|
|
||||||
static FORCE_INLINE int32_t colDataAppendFloat(SColumnInfoData* pColumnInfoData, uint32_t currentRow, float* v) {
|
static FORCE_INLINE void colDataAppendFloat(SColumnInfoData* pColumnInfoData, uint32_t currentRow, float* v) {
|
||||||
ASSERT(pColumnInfoData->info.type == TSDB_DATA_TYPE_FLOAT);
|
ASSERT(pColumnInfoData->info.type == TSDB_DATA_TYPE_FLOAT);
|
||||||
char* p = pColumnInfoData->pData + pColumnInfoData->info.bytes * currentRow;
|
char* p = pColumnInfoData->pData + pColumnInfoData->info.bytes * currentRow;
|
||||||
*(float*)p = *(float*)v;
|
*(float*)p = *(float*)v;
|
||||||
}
|
}
|
||||||
|
|
||||||
static FORCE_INLINE int32_t colDataAppendDouble(SColumnInfoData* pColumnInfoData, uint32_t currentRow, double* v) {
|
static FORCE_INLINE void colDataAppendDouble(SColumnInfoData* pColumnInfoData, uint32_t currentRow, double* v) {
|
||||||
ASSERT(pColumnInfoData->info.type == TSDB_DATA_TYPE_DOUBLE);
|
ASSERT(pColumnInfoData->info.type == TSDB_DATA_TYPE_DOUBLE);
|
||||||
char* p = pColumnInfoData->pData + pColumnInfoData->info.bytes * currentRow;
|
char* p = pColumnInfoData->pData + pColumnInfoData->info.bytes * currentRow;
|
||||||
*(double*)p = *(double*)v;
|
*(double*)p = *(double*)v;
|
||||||
|
@ -163,11 +177,12 @@ void colDataTrim(SColumnInfoData* pColumnInfoData);
|
||||||
size_t blockDataGetNumOfCols(const SSDataBlock* pBlock);
|
size_t blockDataGetNumOfCols(const SSDataBlock* pBlock);
|
||||||
size_t blockDataGetNumOfRows(const SSDataBlock* pBlock);
|
size_t blockDataGetNumOfRows(const SSDataBlock* pBlock);
|
||||||
|
|
||||||
int32_t blockDataMerge(SSDataBlock* pDest, const SSDataBlock* pSrc);
|
int32_t blockDataMerge(SSDataBlock* pDest, const SSDataBlock* pSrc, SArray* pIndexMap);
|
||||||
int32_t blockDataSplitRows(SSDataBlock* pBlock, bool hasVarCol, int32_t startIndex, int32_t* stopIndex,
|
int32_t blockDataSplitRows(SSDataBlock* pBlock, bool hasVarCol, int32_t startIndex, int32_t* stopIndex,
|
||||||
int32_t pageSize);
|
int32_t pageSize);
|
||||||
int32_t blockDataToBuf(char* buf, const SSDataBlock* pBlock);
|
int32_t blockDataToBuf(char* buf, const SSDataBlock* pBlock);
|
||||||
int32_t blockDataFromBuf(SSDataBlock* pBlock, const char* buf);
|
int32_t blockDataFromBuf(SSDataBlock* pBlock, const char* buf);
|
||||||
|
int32_t blockDataFromBuf1(SSDataBlock* pBlock, const char* buf, size_t capacity);
|
||||||
|
|
||||||
SSDataBlock* blockDataExtractBlock(SSDataBlock* pBlock, int32_t startIndex, int32_t rowCount);
|
SSDataBlock* blockDataExtractBlock(SSDataBlock* pBlock, int32_t startIndex, int32_t rowCount);
|
||||||
|
|
||||||
|
@ -179,12 +194,14 @@ size_t blockDataGetSerialMetaSize(const SSDataBlock* pBlock);
|
||||||
int32_t blockDataSort(SSDataBlock* pDataBlock, SArray* pOrderInfo);
|
int32_t blockDataSort(SSDataBlock* pDataBlock, SArray* pOrderInfo);
|
||||||
int32_t blockDataSort_rv(SSDataBlock* pDataBlock, SArray* pOrderInfo, bool nullFirst);
|
int32_t blockDataSort_rv(SSDataBlock* pDataBlock, SArray* pOrderInfo, bool nullFirst);
|
||||||
|
|
||||||
int32_t blockDataEnsureColumnCapacity(SColumnInfoData* pColumn, uint32_t numOfRows);
|
int32_t colInfoDataEnsureCapacity(SColumnInfoData* pColumn, uint32_t numOfRows);
|
||||||
int32_t blockDataEnsureCapacity(SSDataBlock* pDataBlock, uint32_t numOfRows);
|
int32_t blockDataEnsureCapacity(SSDataBlock* pDataBlock, uint32_t numOfRows);
|
||||||
void blockDataCleanup(SSDataBlock* pDataBlock);
|
void blockDataCleanup(SSDataBlock* pDataBlock);
|
||||||
size_t blockDataGetCapacityInRow(const SSDataBlock* pBlock, size_t pageSize);
|
size_t blockDataGetCapacityInRow(const SSDataBlock* pBlock, size_t pageSize);
|
||||||
void* blockDataDestroy(SSDataBlock* pBlock);
|
void* blockDataDestroy(SSDataBlock* pBlock);
|
||||||
|
|
||||||
|
int32_t blockDataTrimFirstNRows(SSDataBlock *pBlock, size_t n);
|
||||||
|
|
||||||
SSDataBlock* createOneDataBlock(const SSDataBlock* pDataBlock);
|
SSDataBlock* createOneDataBlock(const SSDataBlock* pDataBlock);
|
||||||
|
|
||||||
void blockDebugShowData(const SArray* dataBlocks);
|
void blockDebugShowData(const SArray* dataBlocks);
|
||||||
|
|
|
@ -70,11 +70,13 @@ typedef struct {
|
||||||
#pragma pack(pop)
|
#pragma pack(pop)
|
||||||
|
|
||||||
#define colType(col) ((col)->type)
|
#define colType(col) ((col)->type)
|
||||||
|
#define colSma(col) ((col)->sma)
|
||||||
#define colColId(col) ((col)->colId)
|
#define colColId(col) ((col)->colId)
|
||||||
#define colBytes(col) ((col)->bytes)
|
#define colBytes(col) ((col)->bytes)
|
||||||
#define colOffset(col) ((col)->offset)
|
#define colOffset(col) ((col)->offset)
|
||||||
|
|
||||||
#define colSetType(col, t) (colType(col) = (t))
|
#define colSetType(col, t) (colType(col) = (t))
|
||||||
|
#define colSetSma(col, s) (colSma(col) = (s))
|
||||||
#define colSetColId(col, id) (colColId(col) = (id))
|
#define colSetColId(col, id) (colColId(col) = (id))
|
||||||
#define colSetBytes(col, b) (colBytes(col) = (b))
|
#define colSetBytes(col, b) (colBytes(col) = (b))
|
||||||
#define colSetOffset(col, o) (colOffset(col) = (o))
|
#define colSetOffset(col, o) (colOffset(col) = (o))
|
||||||
|
@ -133,13 +135,13 @@ typedef struct {
|
||||||
#define TD_VTYPE_PARTS 4 // 8 bits / TD_VTYPE_BITS = 4
|
#define TD_VTYPE_PARTS 4 // 8 bits / TD_VTYPE_BITS = 4
|
||||||
#define TD_VTYPE_OPTR 3 // TD_VTYPE_PARTS - 1, utilize to get remainder
|
#define TD_VTYPE_OPTR 3 // TD_VTYPE_PARTS - 1, utilize to get remainder
|
||||||
|
|
||||||
#define TD_BITMAP_BYTES(cnt) (ceil((double)cnt / TD_VTYPE_PARTS))
|
#define TD_BITMAP_BYTES(cnt) (ceil((double)(cnt) / TD_VTYPE_PARTS))
|
||||||
#define TD_BIT_TO_BYTES(cnt) (ceil((double)cnt / 8))
|
#define TD_BIT_TO_BYTES(cnt) (ceil((double)(cnt) / 8))
|
||||||
|
|
||||||
int32_t tdInitTSchemaBuilder(STSchemaBuilder *pBuilder, schema_ver_t version);
|
int32_t tdInitTSchemaBuilder(STSchemaBuilder *pBuilder, schema_ver_t version);
|
||||||
void tdDestroyTSchemaBuilder(STSchemaBuilder *pBuilder);
|
void tdDestroyTSchemaBuilder(STSchemaBuilder *pBuilder);
|
||||||
void tdResetTSchemaBuilder(STSchemaBuilder *pBuilder, schema_ver_t version);
|
void tdResetTSchemaBuilder(STSchemaBuilder *pBuilder, schema_ver_t version);
|
||||||
int32_t tdAddColToSchema(STSchemaBuilder *pBuilder, int8_t type, col_id_t colId, col_bytes_t bytes);
|
int32_t tdAddColToSchema(STSchemaBuilder *pBuilder, int8_t type, int8_t sma, col_id_t colId, col_bytes_t bytes);
|
||||||
STSchema *tdGetSchemaFromBuilder(STSchemaBuilder *pBuilder);
|
STSchema *tdGetSchemaFromBuilder(STSchemaBuilder *pBuilder);
|
||||||
|
|
||||||
// ----------------- Semantic timestamp key definition
|
// ----------------- Semantic timestamp key definition
|
||||||
|
@ -363,6 +365,7 @@ static FORCE_INLINE void tdCopyColOfRowBySchema(SDataRow dst, STSchema *pDstSche
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
// ----------------- Data column structure
|
// ----------------- Data column structure
|
||||||
|
// SDataCol arrangement: data => bitmap => dataOffset
|
||||||
typedef struct SDataCol {
|
typedef struct SDataCol {
|
||||||
int8_t type; // column type
|
int8_t type; // column type
|
||||||
uint8_t bitmap : 1; // 0: has bitmap if has NULL/NORM rows, 1: no bitmap if all rows are NORM
|
uint8_t bitmap : 1; // 0: has bitmap if has NULL/NORM rows, 1: no bitmap if all rows are NORM
|
||||||
|
|
|
@ -41,9 +41,6 @@ extern int32_t tsMaxConnections;
|
||||||
extern int32_t tsMaxShellConns;
|
extern int32_t tsMaxShellConns;
|
||||||
extern int32_t tsShellActivityTimer;
|
extern int32_t tsShellActivityTimer;
|
||||||
extern int32_t tsMaxTmrCtrl;
|
extern int32_t tsMaxTmrCtrl;
|
||||||
extern float tsNumOfThreadsPerCore;
|
|
||||||
extern int32_t tsNumOfCommitThreads;
|
|
||||||
extern float tsRatioOfQueryCores;
|
|
||||||
extern int32_t tsCompressMsgSize;
|
extern int32_t tsCompressMsgSize;
|
||||||
extern int32_t tsCompressColData;
|
extern int32_t tsCompressColData;
|
||||||
extern int32_t tsMaxNumOfDistinctResults;
|
extern int32_t tsMaxNumOfDistinctResults;
|
||||||
|
@ -51,7 +48,30 @@ extern int32_t tsCompatibleModel;
|
||||||
extern bool tsEnableSlaveQuery;
|
extern bool tsEnableSlaveQuery;
|
||||||
extern bool tsPrintAuth;
|
extern bool tsPrintAuth;
|
||||||
extern int64_t tsTickPerDay[3];
|
extern int64_t tsTickPerDay[3];
|
||||||
|
|
||||||
|
// multi-process
|
||||||
extern bool tsMultiProcess;
|
extern bool tsMultiProcess;
|
||||||
|
extern int32_t tsMnodeShmSize;
|
||||||
|
extern int32_t tsVnodeShmSize;
|
||||||
|
extern int32_t tsQnodeShmSize;
|
||||||
|
extern int32_t tsSnodeShmSize;
|
||||||
|
extern int32_t tsBnodeShmSize;
|
||||||
|
|
||||||
|
// queue & threads
|
||||||
|
extern int32_t tsNumOfRpcThreads;
|
||||||
|
extern int32_t tsNumOfCommitThreads;
|
||||||
|
extern int32_t tsNumOfTaskQueueThreads;
|
||||||
|
extern int32_t tsNumOfMnodeQueryThreads;
|
||||||
|
extern int32_t tsNumOfMnodeReadThreads;
|
||||||
|
extern int32_t tsNumOfVnodeQueryThreads;
|
||||||
|
extern int32_t tsNumOfVnodeFetchThreads;
|
||||||
|
extern int32_t tsNumOfVnodeWriteThreads;
|
||||||
|
extern int32_t tsNumOfVnodeSyncThreads;
|
||||||
|
extern int32_t tsNumOfVnodeMergeThreads;
|
||||||
|
extern int32_t tsNumOfQnodeQueryThreads;
|
||||||
|
extern int32_t tsNumOfQnodeFetchThreads;
|
||||||
|
extern int32_t tsNumOfSnodeSharedThreads;
|
||||||
|
extern int32_t tsNumOfSnodeUniqueThreads;
|
||||||
|
|
||||||
// monitor
|
// monitor
|
||||||
extern bool tsEnableMonitor;
|
extern bool tsEnableMonitor;
|
||||||
|
|
|
@ -265,6 +265,20 @@ typedef struct SSchema {
|
||||||
char name[TSDB_COL_NAME_LEN];
|
char name[TSDB_COL_NAME_LEN];
|
||||||
} SSchema;
|
} SSchema;
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
int8_t type;
|
||||||
|
int8_t sma; // ETsdbBSmaType and default is TSDB_BSMA_TYPE_I
|
||||||
|
col_id_t colId;
|
||||||
|
int32_t bytes;
|
||||||
|
char name[TSDB_COL_NAME_LEN];
|
||||||
|
} SSchemaEx;
|
||||||
|
|
||||||
|
#define SSCHMEA_TYPE(s) ((s)->type)
|
||||||
|
#define SSCHMEA_SMA(s) ((s)->sma)
|
||||||
|
#define SSCHMEA_COLID(s) ((s)->colId)
|
||||||
|
#define SSCHMEA_BYTES(s) ((s)->bytes)
|
||||||
|
#define SSCHMEA_NAME(s) ((s)->name)
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
char name[TSDB_TABLE_FNAME_LEN];
|
char name[TSDB_TABLE_FNAME_LEN];
|
||||||
int8_t igExists;
|
int8_t igExists;
|
||||||
|
@ -469,7 +483,8 @@ typedef struct {
|
||||||
int32_t tz; // query client timezone
|
int32_t tz; // query client timezone
|
||||||
char intervalUnit;
|
char intervalUnit;
|
||||||
char slidingUnit;
|
char slidingUnit;
|
||||||
char offsetUnit; // TODO Remove it, the offset is the number of precision tickle, and it must be a immutable duration.
|
char
|
||||||
|
offsetUnit; // TODO Remove it, the offset is the number of precision tickle, and it must be a immutable duration.
|
||||||
int8_t precision;
|
int8_t precision;
|
||||||
int64_t interval;
|
int64_t interval;
|
||||||
int64_t sliding;
|
int64_t sliding;
|
||||||
|
@ -497,6 +512,7 @@ typedef struct {
|
||||||
int32_t maxRows;
|
int32_t maxRows;
|
||||||
int32_t commitTime;
|
int32_t commitTime;
|
||||||
int32_t fsyncPeriod;
|
int32_t fsyncPeriod;
|
||||||
|
int32_t ttl;
|
||||||
int8_t walLevel;
|
int8_t walLevel;
|
||||||
int8_t precision; // time resolution
|
int8_t precision; // time resolution
|
||||||
int8_t compression;
|
int8_t compression;
|
||||||
|
@ -506,6 +522,7 @@ typedef struct {
|
||||||
int8_t cacheLastRow;
|
int8_t cacheLastRow;
|
||||||
int8_t ignoreExist;
|
int8_t ignoreExist;
|
||||||
int8_t streamMode;
|
int8_t streamMode;
|
||||||
|
int8_t singleSTable;
|
||||||
int32_t numOfRetensions;
|
int32_t numOfRetensions;
|
||||||
SArray* pRetensions; // SRetention
|
SArray* pRetensions; // SRetention
|
||||||
} SCreateDbReq;
|
} SCreateDbReq;
|
||||||
|
@ -524,6 +541,7 @@ typedef struct {
|
||||||
int8_t walLevel;
|
int8_t walLevel;
|
||||||
int8_t quorum;
|
int8_t quorum;
|
||||||
int8_t cacheLastRow;
|
int8_t cacheLastRow;
|
||||||
|
int8_t replications;
|
||||||
} SAlterDbReq;
|
} SAlterDbReq;
|
||||||
|
|
||||||
int32_t tSerializeSAlterDbReq(void* buf, int32_t bufLen, SAlterDbReq* pReq);
|
int32_t tSerializeSAlterDbReq(void* buf, int32_t bufLen, SAlterDbReq* pReq);
|
||||||
|
@ -570,6 +588,41 @@ int32_t tSerializeSUseDbRspImp(SCoder* pEncoder, const SUseDbRsp* pRsp);
|
||||||
int32_t tDeserializeSUseDbRspImp(SCoder* pDecoder, SUseDbRsp* pRsp);
|
int32_t tDeserializeSUseDbRspImp(SCoder* pDecoder, SUseDbRsp* pRsp);
|
||||||
void tFreeSUsedbRsp(SUseDbRsp* pRsp);
|
void tFreeSUsedbRsp(SUseDbRsp* pRsp);
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
char db[TSDB_DB_FNAME_LEN];
|
||||||
|
} SDbCfgReq;
|
||||||
|
|
||||||
|
int32_t tSerializeSDbCfgReq(void* buf, int32_t bufLen, SDbCfgReq* pReq);
|
||||||
|
int32_t tDeserializeSDbCfgReq(void* buf, int32_t bufLen, SDbCfgReq* pReq);
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
int32_t numOfVgroups;
|
||||||
|
int32_t cacheBlockSize;
|
||||||
|
int32_t totalBlocks;
|
||||||
|
int32_t daysPerFile;
|
||||||
|
int32_t daysToKeep0;
|
||||||
|
int32_t daysToKeep1;
|
||||||
|
int32_t daysToKeep2;
|
||||||
|
int32_t minRows;
|
||||||
|
int32_t maxRows;
|
||||||
|
int32_t commitTime;
|
||||||
|
int32_t fsyncPeriod;
|
||||||
|
int32_t ttl;
|
||||||
|
int8_t walLevel;
|
||||||
|
int8_t precision;
|
||||||
|
int8_t compression;
|
||||||
|
int8_t replications;
|
||||||
|
int8_t quorum;
|
||||||
|
int8_t update;
|
||||||
|
int8_t cacheLastRow;
|
||||||
|
int8_t streamMode;
|
||||||
|
int8_t singleSTable;
|
||||||
|
} SDbCfgRsp;
|
||||||
|
|
||||||
|
int32_t tSerializeSDbCfgRsp(void* buf, int32_t bufLen, const SDbCfgRsp* pRsp);
|
||||||
|
int32_t tDeserializeSDbCfgRsp(void* buf, int32_t bufLen, SDbCfgRsp* pRsp);
|
||||||
|
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
int32_t rowNum;
|
int32_t rowNum;
|
||||||
} SQnodeListReq;
|
} SQnodeListReq;
|
||||||
|
@ -664,6 +717,18 @@ typedef struct {
|
||||||
char charset[TD_LOCALE_LEN]; // tsCharset
|
char charset[TD_LOCALE_LEN]; // tsCharset
|
||||||
} SClusterCfg;
|
} SClusterCfg;
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
int32_t openVnodes;
|
||||||
|
int32_t totalVnodes;
|
||||||
|
int32_t masterNum;
|
||||||
|
int64_t numOfSelectReqs;
|
||||||
|
int64_t numOfInsertReqs;
|
||||||
|
int64_t numOfInsertSuccessReqs;
|
||||||
|
int64_t numOfBatchInsertReqs;
|
||||||
|
int64_t numOfBatchInsertSuccessReqs;
|
||||||
|
int64_t errors;
|
||||||
|
} SVnodesStat;
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
int32_t vgId;
|
int32_t vgId;
|
||||||
int8_t role;
|
int8_t role;
|
||||||
|
@ -915,6 +980,21 @@ typedef struct {
|
||||||
char data[];
|
char data[];
|
||||||
} SRetrieveMetaTableRsp;
|
} SRetrieveMetaTableRsp;
|
||||||
|
|
||||||
|
typedef struct SExplainExecInfo {
|
||||||
|
uint64_t startupCost;
|
||||||
|
uint64_t totalCost;
|
||||||
|
uint64_t numOfRows;
|
||||||
|
void* verboseInfo;
|
||||||
|
} SExplainExecInfo;
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
int32_t numOfPlans;
|
||||||
|
SExplainExecInfo* subplanInfo;
|
||||||
|
} SExplainRsp;
|
||||||
|
|
||||||
|
int32_t tSerializeSExplainRsp(void* buf, int32_t bufLen, SExplainRsp* pRsp);
|
||||||
|
int32_t tDeserializeSExplainRsp(void* buf, int32_t bufLen, SExplainRsp* pRsp);
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
char fqdn[TSDB_FQDN_LEN]; // end point, hostname:port
|
char fqdn[TSDB_FQDN_LEN]; // end point, hostname:port
|
||||||
int32_t port;
|
int32_t port;
|
||||||
|
@ -1052,6 +1132,7 @@ typedef struct SSubQueryMsg {
|
||||||
uint64_t taskId;
|
uint64_t taskId;
|
||||||
int64_t refId;
|
int64_t refId;
|
||||||
int8_t taskType;
|
int8_t taskType;
|
||||||
|
int8_t explain;
|
||||||
uint32_t sqlLen; // the query sql,
|
uint32_t sqlLen; // the query sql,
|
||||||
uint32_t phyLen;
|
uint32_t phyLen;
|
||||||
char msg[];
|
char msg[];
|
||||||
|
@ -1381,10 +1462,9 @@ typedef struct {
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
float xFilesFactor;
|
float xFilesFactor;
|
||||||
int8_t delayUnit;
|
int32_t delay;
|
||||||
int8_t nFuncIds;
|
int8_t nFuncIds;
|
||||||
int32_t* pFuncIds;
|
func_id_t* pFuncIds;
|
||||||
int64_t delay;
|
|
||||||
} SRSmaParam;
|
} SRSmaParam;
|
||||||
|
|
||||||
typedef struct SVCreateTbReq {
|
typedef struct SVCreateTbReq {
|
||||||
|
@ -1403,12 +1483,11 @@ typedef struct SVCreateTbReq {
|
||||||
union {
|
union {
|
||||||
struct {
|
struct {
|
||||||
tb_uid_t suid;
|
tb_uid_t suid;
|
||||||
uint32_t nCols;
|
col_id_t nCols;
|
||||||
SSchema* pSchema;
|
|
||||||
uint32_t nTagCols;
|
|
||||||
SSchema* pTagSchema;
|
|
||||||
col_id_t nBSmaCols;
|
col_id_t nBSmaCols;
|
||||||
col_id_t* pBSmaCols;
|
SSchemaEx* pSchema;
|
||||||
|
col_id_t nTagCols;
|
||||||
|
SSchema* pTagSchema;
|
||||||
SRSmaParam* pRSmaParam;
|
SRSmaParam* pRSmaParam;
|
||||||
} stbCfg;
|
} stbCfg;
|
||||||
struct {
|
struct {
|
||||||
|
@ -1416,10 +1495,9 @@ typedef struct SVCreateTbReq {
|
||||||
SKVRow pTag;
|
SKVRow pTag;
|
||||||
} ctbCfg;
|
} ctbCfg;
|
||||||
struct {
|
struct {
|
||||||
uint32_t nCols;
|
col_id_t nCols;
|
||||||
SSchema* pSchema;
|
|
||||||
col_id_t nBSmaCols;
|
col_id_t nBSmaCols;
|
||||||
col_id_t* pBSmaCols;
|
SSchemaEx* pSchema;
|
||||||
SRSmaParam* pRSmaParam;
|
SRSmaParam* pRSmaParam;
|
||||||
} ntbCfg;
|
} ntbCfg;
|
||||||
};
|
};
|
||||||
|
@ -1799,6 +1877,7 @@ static FORCE_INLINE void* taosDecodeSMqMsg(void* buf, SMqHbMsg* pMsg) {
|
||||||
typedef struct {
|
typedef struct {
|
||||||
int64_t leftForVer;
|
int64_t leftForVer;
|
||||||
int32_t vgId;
|
int32_t vgId;
|
||||||
|
int32_t epoch;
|
||||||
int64_t consumerId;
|
int64_t consumerId;
|
||||||
char topicName[TSDB_TOPIC_FNAME_LEN];
|
char topicName[TSDB_TOPIC_FNAME_LEN];
|
||||||
char cgroup[TSDB_CGROUP_LEN];
|
char cgroup[TSDB_CGROUP_LEN];
|
||||||
|
@ -1812,6 +1891,7 @@ static FORCE_INLINE int32_t tEncodeSMqSetCVgReq(void** buf, const SMqSetCVgReq*
|
||||||
int32_t tlen = 0;
|
int32_t tlen = 0;
|
||||||
tlen += taosEncodeFixedI64(buf, pReq->leftForVer);
|
tlen += taosEncodeFixedI64(buf, pReq->leftForVer);
|
||||||
tlen += taosEncodeFixedI32(buf, pReq->vgId);
|
tlen += taosEncodeFixedI32(buf, pReq->vgId);
|
||||||
|
tlen += taosEncodeFixedI32(buf, pReq->epoch);
|
||||||
tlen += taosEncodeFixedI64(buf, pReq->consumerId);
|
tlen += taosEncodeFixedI64(buf, pReq->consumerId);
|
||||||
tlen += taosEncodeString(buf, pReq->topicName);
|
tlen += taosEncodeString(buf, pReq->topicName);
|
||||||
tlen += taosEncodeString(buf, pReq->cgroup);
|
tlen += taosEncodeString(buf, pReq->cgroup);
|
||||||
|
@ -1825,6 +1905,7 @@ static FORCE_INLINE int32_t tEncodeSMqSetCVgReq(void** buf, const SMqSetCVgReq*
|
||||||
static FORCE_INLINE void* tDecodeSMqSetCVgReq(void* buf, SMqSetCVgReq* pReq) {
|
static FORCE_INLINE void* tDecodeSMqSetCVgReq(void* buf, SMqSetCVgReq* pReq) {
|
||||||
buf = taosDecodeFixedI64(buf, &pReq->leftForVer);
|
buf = taosDecodeFixedI64(buf, &pReq->leftForVer);
|
||||||
buf = taosDecodeFixedI32(buf, &pReq->vgId);
|
buf = taosDecodeFixedI32(buf, &pReq->vgId);
|
||||||
|
buf = taosDecodeFixedI32(buf, &pReq->epoch);
|
||||||
buf = taosDecodeFixedI64(buf, &pReq->consumerId);
|
buf = taosDecodeFixedI64(buf, &pReq->consumerId);
|
||||||
buf = taosDecodeStringTo(buf, pReq->topicName);
|
buf = taosDecodeStringTo(buf, pReq->topicName);
|
||||||
buf = taosDecodeStringTo(buf, pReq->cgroup);
|
buf = taosDecodeStringTo(buf, pReq->cgroup);
|
||||||
|
@ -1835,11 +1916,43 @@ static FORCE_INLINE void* tDecodeSMqSetCVgReq(void* buf, SMqSetCVgReq* pReq) {
|
||||||
return buf;
|
return buf;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
int64_t leftForVer;
|
||||||
|
int32_t vgId;
|
||||||
|
int32_t epoch;
|
||||||
|
int64_t consumerId;
|
||||||
|
char topicName[TSDB_TOPIC_FNAME_LEN];
|
||||||
|
} SMqCancelConnReq;
|
||||||
|
|
||||||
|
static FORCE_INLINE int32_t tEncodeSMqCancelConnReq(void** buf, const SMqCancelConnReq* pReq) {
|
||||||
|
int32_t tlen = 0;
|
||||||
|
tlen += taosEncodeFixedI64(buf, pReq->leftForVer);
|
||||||
|
tlen += taosEncodeFixedI32(buf, pReq->vgId);
|
||||||
|
tlen += taosEncodeFixedI32(buf, pReq->epoch);
|
||||||
|
tlen += taosEncodeFixedI64(buf, pReq->consumerId);
|
||||||
|
tlen += taosEncodeString(buf, pReq->topicName);
|
||||||
|
return tlen;
|
||||||
|
}
|
||||||
|
|
||||||
|
static FORCE_INLINE void* tDecodeSMqCancelConnReq(void* buf, SMqCancelConnReq* pReq) {
|
||||||
|
buf = taosDecodeFixedI64(buf, &pReq->leftForVer);
|
||||||
|
buf = taosDecodeFixedI32(buf, &pReq->vgId);
|
||||||
|
buf = taosDecodeFixedI32(buf, &pReq->epoch);
|
||||||
|
buf = taosDecodeFixedI64(buf, &pReq->consumerId);
|
||||||
|
buf = taosDecodeStringTo(buf, pReq->topicName);
|
||||||
|
return buf;
|
||||||
|
}
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
int8_t reserved;
|
||||||
|
} SMqCancelConnRsp;
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
int64_t leftForVer;
|
int64_t leftForVer;
|
||||||
int32_t vgId;
|
int32_t vgId;
|
||||||
int64_t oldConsumerId;
|
int64_t oldConsumerId;
|
||||||
int64_t newConsumerId;
|
int64_t newConsumerId;
|
||||||
|
char* topic;
|
||||||
} SMqMVRebReq;
|
} SMqMVRebReq;
|
||||||
|
|
||||||
static FORCE_INLINE int32_t tEncodeSMqMVRebReq(void** buf, const SMqMVRebReq* pReq) {
|
static FORCE_INLINE int32_t tEncodeSMqMVRebReq(void** buf, const SMqMVRebReq* pReq) {
|
||||||
|
@ -1848,6 +1961,7 @@ static FORCE_INLINE int32_t tEncodeSMqMVRebReq(void** buf, const SMqMVRebReq* pR
|
||||||
tlen += taosEncodeFixedI32(buf, pReq->vgId);
|
tlen += taosEncodeFixedI32(buf, pReq->vgId);
|
||||||
tlen += taosEncodeFixedI64(buf, pReq->oldConsumerId);
|
tlen += taosEncodeFixedI64(buf, pReq->oldConsumerId);
|
||||||
tlen += taosEncodeFixedI64(buf, pReq->newConsumerId);
|
tlen += taosEncodeFixedI64(buf, pReq->newConsumerId);
|
||||||
|
tlen += taosEncodeString(buf, pReq->topic);
|
||||||
return tlen;
|
return tlen;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1856,6 +1970,7 @@ static FORCE_INLINE void* tDecodeSMqMVRebReq(void* buf, SMqMVRebReq* pReq) {
|
||||||
buf = taosDecodeFixedI32(buf, &pReq->vgId);
|
buf = taosDecodeFixedI32(buf, &pReq->vgId);
|
||||||
buf = taosDecodeFixedI64(buf, &pReq->oldConsumerId);
|
buf = taosDecodeFixedI64(buf, &pReq->oldConsumerId);
|
||||||
buf = taosDecodeFixedI64(buf, &pReq->newConsumerId);
|
buf = taosDecodeFixedI64(buf, &pReq->newConsumerId);
|
||||||
|
buf = taosDecodeString(buf, &pReq->topic);
|
||||||
return buf;
|
return buf;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1898,7 +2013,10 @@ int32_t tDecodeSMqCMCommitOffsetReq(SCoder* decoder, SMqCMCommitOffsetReq* pReq)
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
uint32_t nCols;
|
uint32_t nCols;
|
||||||
|
union {
|
||||||
SSchema* pSchema;
|
SSchema* pSchema;
|
||||||
|
SSchemaEx* pSchemaEx;
|
||||||
|
};
|
||||||
} SSchemaWrapper;
|
} SSchemaWrapper;
|
||||||
|
|
||||||
static FORCE_INLINE int32_t taosEncodeSSchema(void** buf, const SSchema* pSchema) {
|
static FORCE_INLINE int32_t taosEncodeSSchema(void** buf, const SSchema* pSchema) {
|
||||||
|
@ -2187,6 +2305,24 @@ static FORCE_INLINE void* tDecodeTSmaWrapper(void* buf, STSmaWrapper* pSW) {
|
||||||
return buf;
|
return buf;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
char indexFName[TSDB_INDEX_FNAME_LEN];
|
||||||
|
} SUserIndexReq;
|
||||||
|
|
||||||
|
int32_t tSerializeSUserIndexReq(void* buf, int32_t bufLen, SUserIndexReq* pReq);
|
||||||
|
int32_t tDeserializeSUserIndexReq(void* buf, int32_t bufLen, SUserIndexReq* pReq);
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
char dbFName[TSDB_DB_FNAME_LEN];
|
||||||
|
char tblFName[TSDB_TABLE_FNAME_LEN];
|
||||||
|
char colName[TSDB_COL_NAME_LEN];
|
||||||
|
char indexType[TSDB_INDEX_TYPE_LEN];
|
||||||
|
char indexExts[TSDB_INDEX_EXTS_LEN];
|
||||||
|
} SUserIndexRsp;
|
||||||
|
|
||||||
|
int32_t tSerializeSUserIndexRsp(void* buf, int32_t bufLen, const SUserIndexRsp* pRsp);
|
||||||
|
int32_t tDeserializeSUserIndexRsp(void* buf, int32_t bufLen, SUserIndexRsp* pRsp);
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
int8_t mqMsgType;
|
int8_t mqMsgType;
|
||||||
int32_t code;
|
int32_t code;
|
||||||
|
@ -2204,6 +2340,7 @@ typedef struct {
|
||||||
char cgroup[TSDB_CGROUP_LEN];
|
char cgroup[TSDB_CGROUP_LEN];
|
||||||
|
|
||||||
int64_t currentOffset;
|
int64_t currentOffset;
|
||||||
|
uint64_t reqId;
|
||||||
char topic[TSDB_TOPIC_FNAME_LEN];
|
char topic[TSDB_TOPIC_FNAME_LEN];
|
||||||
} SMqPollReq;
|
} SMqPollReq;
|
||||||
|
|
||||||
|
|
|
@ -50,7 +50,6 @@ typedef struct {
|
||||||
PutToQueueFp queueFps[QUEUE_MAX];
|
PutToQueueFp queueFps[QUEUE_MAX];
|
||||||
GetQueueSizeFp qsizeFp;
|
GetQueueSizeFp qsizeFp;
|
||||||
SendReqFp sendReqFp;
|
SendReqFp sendReqFp;
|
||||||
SendMnodeReqFp sendMnodeReqFp;
|
|
||||||
SendRspFp sendRspFp;
|
SendRspFp sendRspFp;
|
||||||
RegisterBrokenLinkArgFp registerBrokenLinkArgFp;
|
RegisterBrokenLinkArgFp registerBrokenLinkArgFp;
|
||||||
ReleaseHandleFp releaseHandleFp;
|
ReleaseHandleFp releaseHandleFp;
|
||||||
|
@ -60,7 +59,6 @@ void tmsgSetDefaultMsgCb(const SMsgCb* pMsgCb);
|
||||||
int32_t tmsgPutToQueue(const SMsgCb* pMsgCb, EQueueType qtype, SRpcMsg* pReq);
|
int32_t tmsgPutToQueue(const SMsgCb* pMsgCb, EQueueType qtype, SRpcMsg* pReq);
|
||||||
int32_t tmsgGetQueueSize(const SMsgCb* pMsgCb, int32_t vgId, EQueueType qtype);
|
int32_t tmsgGetQueueSize(const SMsgCb* pMsgCb, int32_t vgId, EQueueType qtype);
|
||||||
int32_t tmsgSendReq(const SMsgCb* pMsgCb, const SEpSet* epSet, SRpcMsg* pReq);
|
int32_t tmsgSendReq(const SMsgCb* pMsgCb, const SEpSet* epSet, SRpcMsg* pReq);
|
||||||
int32_t tmsgSendMnodeReq(const SMsgCb* pMsgCb, SRpcMsg* pReq);
|
|
||||||
void tmsgSendRsp(const SRpcMsg* pRsp);
|
void tmsgSendRsp(const SRpcMsg* pRsp);
|
||||||
void tmsgRegisterBrokenLinkArg(const SMsgCb* pMsgCb, SRpcMsg* pMsg);
|
void tmsgRegisterBrokenLinkArg(const SMsgCb* pMsgCb, SRpcMsg* pMsg);
|
||||||
void tmsgReleaseHandle(void* handle, int8_t type);
|
void tmsgReleaseHandle(void* handle, int8_t type);
|
||||||
|
|
|
@ -155,6 +155,8 @@ enum {
|
||||||
TD_DEF_MSG_TYPE(TDMT_MND_CREATE_STREAM, "mnode-create-stream", SCMCreateStreamReq, SCMCreateStreamRsp)
|
TD_DEF_MSG_TYPE(TDMT_MND_CREATE_STREAM, "mnode-create-stream", SCMCreateStreamReq, SCMCreateStreamRsp)
|
||||||
TD_DEF_MSG_TYPE(TDMT_MND_ALTER_STREAM, "mnode-alter-stream", NULL, NULL)
|
TD_DEF_MSG_TYPE(TDMT_MND_ALTER_STREAM, "mnode-alter-stream", NULL, NULL)
|
||||||
TD_DEF_MSG_TYPE(TDMT_MND_DROP_STREAM, "mnode-drop-stream", NULL, NULL)
|
TD_DEF_MSG_TYPE(TDMT_MND_DROP_STREAM, "mnode-drop-stream", NULL, NULL)
|
||||||
|
TD_DEF_MSG_TYPE(TDMT_MND_GET_DB_CFG, "mnode-get-db-cfg", NULL, NULL)
|
||||||
|
TD_DEF_MSG_TYPE(TDMT_MND_GET_INDEX, "mnode-get-index", NULL, NULL)
|
||||||
|
|
||||||
// Requests handled by VNODE
|
// Requests handled by VNODE
|
||||||
TD_NEW_MSG_SEG(TDMT_VND_MSG)
|
TD_NEW_MSG_SEG(TDMT_VND_MSG)
|
||||||
|
@ -176,6 +178,7 @@ enum {
|
||||||
TD_DEF_MSG_TYPE(TDMT_VND_MQ_DISCONNECT, "vnode-mq-disconnect", NULL, NULL)
|
TD_DEF_MSG_TYPE(TDMT_VND_MQ_DISCONNECT, "vnode-mq-disconnect", NULL, NULL)
|
||||||
TD_DEF_MSG_TYPE(TDMT_VND_MQ_SET_CONN, "vnode-mq-set-conn", SMqSetCVgReq, SMqSetCVgRsp)
|
TD_DEF_MSG_TYPE(TDMT_VND_MQ_SET_CONN, "vnode-mq-set-conn", SMqSetCVgReq, SMqSetCVgRsp)
|
||||||
TD_DEF_MSG_TYPE(TDMT_VND_MQ_REB, "vnode-mq-mv-rebalance", SMqMVRebReq, SMqMVRebRsp)
|
TD_DEF_MSG_TYPE(TDMT_VND_MQ_REB, "vnode-mq-mv-rebalance", SMqMVRebReq, SMqMVRebRsp)
|
||||||
|
TD_DEF_MSG_TYPE(TDMT_VND_MQ_CANCEL_CONN, "vnode-mq-mv-cancel-conn", SMqCancelConnReq, SMqCancelConnRsp)
|
||||||
TD_DEF_MSG_TYPE(TDMT_VND_MQ_SET_CUR, "vnode-mq-set-cur", NULL, NULL)
|
TD_DEF_MSG_TYPE(TDMT_VND_MQ_SET_CUR, "vnode-mq-set-cur", NULL, NULL)
|
||||||
TD_DEF_MSG_TYPE(TDMT_VND_RES_READY, "vnode-res-ready", NULL, NULL)
|
TD_DEF_MSG_TYPE(TDMT_VND_RES_READY, "vnode-res-ready", NULL, NULL)
|
||||||
TD_DEF_MSG_TYPE(TDMT_VND_TASKS_STATUS, "vnode-tasks-status", NULL, NULL)
|
TD_DEF_MSG_TYPE(TDMT_VND_TASKS_STATUS, "vnode-tasks-status", NULL, NULL)
|
||||||
|
@ -188,6 +191,7 @@ enum {
|
||||||
TD_DEF_MSG_TYPE(TDMT_VND_SHOW_TABLES_FETCH, "vnode-show-tables-fetch", SVShowTablesFetchReq, SVShowTablesFetchRsp)
|
TD_DEF_MSG_TYPE(TDMT_VND_SHOW_TABLES_FETCH, "vnode-show-tables-fetch", SVShowTablesFetchReq, SVShowTablesFetchRsp)
|
||||||
TD_DEF_MSG_TYPE(TDMT_VND_QUERY_CONTINUE, "vnode-query-continue", NULL, NULL)
|
TD_DEF_MSG_TYPE(TDMT_VND_QUERY_CONTINUE, "vnode-query-continue", NULL, NULL)
|
||||||
TD_DEF_MSG_TYPE(TDMT_VND_QUERY_HEARTBEAT, "vnode-query-heartbeat", NULL, NULL)
|
TD_DEF_MSG_TYPE(TDMT_VND_QUERY_HEARTBEAT, "vnode-query-heartbeat", NULL, NULL)
|
||||||
|
TD_DEF_MSG_TYPE(TDMT_VND_EXPLAIN, "vnode-explain", NULL, NULL)
|
||||||
|
|
||||||
TD_DEF_MSG_TYPE(TDMT_VND_SUBSCRIBE, "vnode-subscribe", SMVSubscribeReq, SMVSubscribeRsp)
|
TD_DEF_MSG_TYPE(TDMT_VND_SUBSCRIBE, "vnode-subscribe", SMVSubscribeReq, SMVSubscribeRsp)
|
||||||
TD_DEF_MSG_TYPE(TDMT_VND_CONSUME, "vnode-consume", SMqCVConsumeReq, SMqCVConsumeRsp)
|
TD_DEF_MSG_TYPE(TDMT_VND_CONSUME, "vnode-consume", SMqCVConsumeReq, SMqCVConsumeRsp)
|
||||||
|
@ -215,6 +219,15 @@ enum {
|
||||||
TD_NEW_MSG_SEG(TDMT_SCH_MSG)
|
TD_NEW_MSG_SEG(TDMT_SCH_MSG)
|
||||||
TD_DEF_MSG_TYPE(TDMT_SCH_LINK_BROKEN, "scheduler-link-broken", NULL, NULL)
|
TD_DEF_MSG_TYPE(TDMT_SCH_LINK_BROKEN, "scheduler-link-broken", NULL, NULL)
|
||||||
|
|
||||||
|
// Monitor info exchange between processes
|
||||||
|
TD_NEW_MSG_SEG(TDMT_MON_MSG)
|
||||||
|
TD_DEF_MSG_TYPE(TDMT_MON_MM_INFO, "monitor-minfo", NULL, NULL)
|
||||||
|
TD_DEF_MSG_TYPE(TDMT_MON_VM_INFO, "monitor-vinfo", NULL, NULL)
|
||||||
|
TD_DEF_MSG_TYPE(TDMT_MON_QM_INFO, "monitor-qinfo", NULL, NULL)
|
||||||
|
TD_DEF_MSG_TYPE(TDMT_MON_SM_INFO, "monitor-sinfo", NULL, NULL)
|
||||||
|
TD_DEF_MSG_TYPE(TDMT_MON_BM_INFO, "monitor-binfo", NULL, NULL)
|
||||||
|
TD_DEF_MSG_TYPE(TDMT_MON_VM_LOAD, "monitor-vload", NULL, NULL)
|
||||||
|
|
||||||
#if defined(TD_MSG_NUMBER_)
|
#if defined(TD_MSG_NUMBER_)
|
||||||
TDMT_MAX
|
TDMT_MAX
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -148,15 +148,15 @@ typedef struct {
|
||||||
typedef struct {
|
typedef struct {
|
||||||
// basic info
|
// basic info
|
||||||
int8_t rowType;
|
int8_t rowType;
|
||||||
int16_t sver;
|
schema_ver_t sver;
|
||||||
STSRow *pBuf;
|
STSRow *pBuf;
|
||||||
|
|
||||||
// extended info
|
// extended info
|
||||||
int32_t flen;
|
int32_t flen;
|
||||||
int16_t nBoundCols;
|
col_id_t nBoundCols;
|
||||||
int16_t nCols;
|
col_id_t nCols;
|
||||||
int16_t nBitmaps;
|
col_id_t nBitmaps;
|
||||||
int16_t nBoundBitmaps;
|
col_id_t nBoundBitmaps;
|
||||||
int32_t offset;
|
int32_t offset;
|
||||||
void *pBitmap;
|
void *pBitmap;
|
||||||
void *pOffset;
|
void *pOffset;
|
||||||
|
@ -448,9 +448,9 @@ static FORCE_INLINE int32_t tdSRowSetExtendedInfo(SRowBuilder *pBuilder, int32_t
|
||||||
}
|
}
|
||||||
#ifdef TD_SUPPORT_BITMAP
|
#ifdef TD_SUPPORT_BITMAP
|
||||||
// the primary TS key is stored separatedly
|
// the primary TS key is stored separatedly
|
||||||
pBuilder->nBitmaps = (int16_t)TD_BITMAP_BYTES(pBuilder->nCols - 1);
|
pBuilder->nBitmaps = (col_id_t)TD_BITMAP_BYTES(pBuilder->nCols - 1);
|
||||||
if (nBoundCols > 0) {
|
if (nBoundCols > 0) {
|
||||||
pBuilder->nBoundBitmaps = (int16_t)TD_BITMAP_BYTES(pBuilder->nBoundCols - 1);
|
pBuilder->nBoundBitmaps = (col_id_t)TD_BITMAP_BYTES(pBuilder->nBoundCols - 1);
|
||||||
} else {
|
} else {
|
||||||
pBuilder->nBoundBitmaps = 0;
|
pBuilder->nBoundBitmaps = 0;
|
||||||
}
|
}
|
||||||
|
|
|
@ -60,8 +60,10 @@ int32_t parseNatualDuration(const char* token, int32_t tokenLen, int64_t* durati
|
||||||
|
|
||||||
int32_t taosParseTime(const char* timestr, int64_t* time, int32_t len, int32_t timePrec, int8_t dayligth);
|
int32_t taosParseTime(const char* timestr, int64_t* time, int32_t len, int32_t timePrec, int8_t dayligth);
|
||||||
void deltaToUtcInitOnce();
|
void deltaToUtcInitOnce();
|
||||||
|
char getPrecisionUnit(int32_t precision);
|
||||||
|
|
||||||
int64_t convertTimePrecision(int64_t time, int32_t fromPrecision, int32_t toPrecision);
|
int64_t convertTimePrecision(int64_t time, int32_t fromPrecision, int32_t toPrecision);
|
||||||
|
int64_t convertTimeFromPrecisionToUnit(int64_t time, int32_t fromPrecision, char toUnit);
|
||||||
|
|
||||||
void taosFormatUtcTime(char *buf, int32_t bufLen, int64_t time, int32_t precision);
|
void taosFormatUtcTime(char *buf, int32_t bufLen, int64_t time, int32_t precision);
|
||||||
|
|
||||||
|
|
|
@ -69,128 +69,154 @@
|
||||||
#define TK_CACHELAST 51
|
#define TK_CACHELAST 51
|
||||||
#define TK_COMP 52
|
#define TK_COMP 52
|
||||||
#define TK_DAYS 53
|
#define TK_DAYS 53
|
||||||
#define TK_FSYNC 54
|
#define TK_NK_VARIABLE 54
|
||||||
#define TK_MAXROWS 55
|
#define TK_FSYNC 55
|
||||||
#define TK_MINROWS 56
|
#define TK_MAXROWS 56
|
||||||
#define TK_KEEP 57
|
#define TK_MINROWS 57
|
||||||
#define TK_PRECISION 58
|
#define TK_KEEP 58
|
||||||
#define TK_QUORUM 59
|
#define TK_PRECISION 59
|
||||||
#define TK_REPLICA 60
|
#define TK_QUORUM 60
|
||||||
#define TK_TTL 61
|
#define TK_REPLICA 61
|
||||||
#define TK_WAL 62
|
#define TK_TTL 62
|
||||||
#define TK_VGROUPS 63
|
#define TK_WAL 63
|
||||||
#define TK_SINGLE_STABLE 64
|
#define TK_VGROUPS 64
|
||||||
#define TK_STREAM_MODE 65
|
#define TK_SINGLE_STABLE 65
|
||||||
#define TK_RETENTIONS 66
|
#define TK_STREAM_MODE 66
|
||||||
#define TK_TABLE 67
|
#define TK_RETENTIONS 67
|
||||||
#define TK_NK_LP 68
|
#define TK_NK_COMMA 68
|
||||||
#define TK_NK_RP 69
|
#define TK_NK_COLON 69
|
||||||
#define TK_STABLE 70
|
#define TK_TABLE 70
|
||||||
#define TK_ADD 71
|
#define TK_NK_LP 71
|
||||||
#define TK_COLUMN 72
|
#define TK_NK_RP 72
|
||||||
#define TK_MODIFY 73
|
#define TK_STABLE 73
|
||||||
#define TK_RENAME 74
|
#define TK_ADD 74
|
||||||
#define TK_TAG 75
|
#define TK_COLUMN 75
|
||||||
#define TK_SET 76
|
#define TK_MODIFY 76
|
||||||
#define TK_NK_EQ 77
|
#define TK_RENAME 77
|
||||||
#define TK_USING 78
|
#define TK_TAG 78
|
||||||
#define TK_TAGS 79
|
#define TK_SET 79
|
||||||
#define TK_NK_DOT 80
|
#define TK_NK_EQ 80
|
||||||
#define TK_NK_COMMA 81
|
#define TK_USING 81
|
||||||
#define TK_COMMENT 82
|
#define TK_TAGS 82
|
||||||
#define TK_BOOL 83
|
#define TK_NK_DOT 83
|
||||||
#define TK_TINYINT 84
|
#define TK_COMMENT 84
|
||||||
#define TK_SMALLINT 85
|
#define TK_BOOL 85
|
||||||
#define TK_INT 86
|
#define TK_TINYINT 86
|
||||||
#define TK_INTEGER 87
|
#define TK_SMALLINT 87
|
||||||
#define TK_BIGINT 88
|
#define TK_INT 88
|
||||||
#define TK_FLOAT 89
|
#define TK_INTEGER 89
|
||||||
#define TK_DOUBLE 90
|
#define TK_BIGINT 90
|
||||||
#define TK_BINARY 91
|
#define TK_FLOAT 91
|
||||||
#define TK_TIMESTAMP 92
|
#define TK_DOUBLE 92
|
||||||
#define TK_NCHAR 93
|
#define TK_BINARY 93
|
||||||
#define TK_UNSIGNED 94
|
#define TK_TIMESTAMP 94
|
||||||
#define TK_JSON 95
|
#define TK_NCHAR 95
|
||||||
#define TK_VARCHAR 96
|
#define TK_UNSIGNED 96
|
||||||
#define TK_MEDIUMBLOB 97
|
#define TK_JSON 97
|
||||||
#define TK_BLOB 98
|
#define TK_VARCHAR 98
|
||||||
#define TK_VARBINARY 99
|
#define TK_MEDIUMBLOB 99
|
||||||
#define TK_DECIMAL 100
|
#define TK_BLOB 100
|
||||||
#define TK_SMA 101
|
#define TK_VARBINARY 101
|
||||||
#define TK_ROLLUP 102
|
#define TK_DECIMAL 102
|
||||||
#define TK_FILE_FACTOR 103
|
#define TK_SMA 103
|
||||||
#define TK_NK_FLOAT 104
|
#define TK_ROLLUP 104
|
||||||
#define TK_DELAY 105
|
#define TK_FILE_FACTOR 105
|
||||||
#define TK_SHOW 106
|
#define TK_NK_FLOAT 106
|
||||||
#define TK_DATABASES 107
|
#define TK_DELAY 107
|
||||||
#define TK_TABLES 108
|
#define TK_SHOW 108
|
||||||
#define TK_STABLES 109
|
#define TK_DATABASES 109
|
||||||
#define TK_MNODES 110
|
#define TK_TABLES 110
|
||||||
#define TK_MODULES 111
|
#define TK_STABLES 111
|
||||||
#define TK_QNODES 112
|
#define TK_MNODES 112
|
||||||
#define TK_FUNCTIONS 113
|
#define TK_MODULES 113
|
||||||
#define TK_INDEXES 114
|
#define TK_QNODES 114
|
||||||
#define TK_FROM 115
|
#define TK_FUNCTIONS 115
|
||||||
#define TK_LIKE 116
|
#define TK_INDEXES 116
|
||||||
#define TK_INDEX 117
|
#define TK_FROM 117
|
||||||
#define TK_FULLTEXT 118
|
#define TK_ACCOUNTS 118
|
||||||
#define TK_FUNCTION 119
|
#define TK_APPS 119
|
||||||
#define TK_INTERVAL 120
|
#define TK_CONNECTIONS 120
|
||||||
#define TK_TOPIC 121
|
#define TK_LICENCE 121
|
||||||
#define TK_AS 122
|
#define TK_QUERIES 122
|
||||||
#define TK_EXPLAIN 123
|
#define TK_SCORES 123
|
||||||
#define TK_ANALYZE 124
|
#define TK_TOPICS 124
|
||||||
#define TK_VERBOSE 125
|
#define TK_VARIABLES 125
|
||||||
#define TK_NK_BOOL 126
|
#define TK_LIKE 126
|
||||||
#define TK_RATIO 127
|
#define TK_INDEX 127
|
||||||
#define TK_NULL 128
|
#define TK_FULLTEXT 128
|
||||||
#define TK_NK_VARIABLE 129
|
#define TK_FUNCTION 129
|
||||||
#define TK_NK_UNDERLINE 130
|
#define TK_INTERVAL 130
|
||||||
#define TK_ROWTS 131
|
#define TK_TOPIC 131
|
||||||
#define TK_TBNAME 132
|
#define TK_AS 132
|
||||||
#define TK_QSTARTTS 133
|
#define TK_DESC 133
|
||||||
#define TK_QENDTS 134
|
#define TK_DESCRIBE 134
|
||||||
#define TK_WSTARTTS 135
|
#define TK_RESET 135
|
||||||
#define TK_WENDTS 136
|
#define TK_QUERY 136
|
||||||
#define TK_WDURATION 137
|
#define TK_EXPLAIN 137
|
||||||
#define TK_BETWEEN 138
|
#define TK_ANALYZE 138
|
||||||
#define TK_IS 139
|
#define TK_VERBOSE 139
|
||||||
#define TK_NK_LT 140
|
#define TK_NK_BOOL 140
|
||||||
#define TK_NK_GT 141
|
#define TK_RATIO 141
|
||||||
#define TK_NK_LE 142
|
#define TK_COMPACT 142
|
||||||
#define TK_NK_GE 143
|
#define TK_VNODES 143
|
||||||
#define TK_NK_NE 144
|
#define TK_IN 144
|
||||||
#define TK_MATCH 145
|
#define TK_OUTPUTTYPE 145
|
||||||
#define TK_NMATCH 146
|
#define TK_AGGREGATE 146
|
||||||
#define TK_IN 147
|
#define TK_BUFSIZE 147
|
||||||
#define TK_JOIN 148
|
#define TK_STREAM 148
|
||||||
#define TK_INNER 149
|
#define TK_INTO 149
|
||||||
#define TK_SELECT 150
|
#define TK_KILL 150
|
||||||
#define TK_DISTINCT 151
|
#define TK_CONNECTION 151
|
||||||
#define TK_WHERE 152
|
#define TK_MERGE 152
|
||||||
#define TK_PARTITION 153
|
#define TK_VGROUP 153
|
||||||
#define TK_BY 154
|
#define TK_REDISTRIBUTE 154
|
||||||
#define TK_SESSION 155
|
#define TK_SPLIT 155
|
||||||
#define TK_STATE_WINDOW 156
|
#define TK_SYNCDB 156
|
||||||
#define TK_SLIDING 157
|
#define TK_NULL 157
|
||||||
#define TK_FILL 158
|
#define TK_FIRST 158
|
||||||
#define TK_VALUE 159
|
#define TK_LAST 159
|
||||||
#define TK_NONE 160
|
#define TK_NOW 160
|
||||||
#define TK_PREV 161
|
#define TK_ROWTS 161
|
||||||
#define TK_LINEAR 162
|
#define TK_TBNAME 162
|
||||||
#define TK_NEXT 163
|
#define TK_QSTARTTS 163
|
||||||
#define TK_GROUP 164
|
#define TK_QENDTS 164
|
||||||
#define TK_HAVING 165
|
#define TK_WSTARTTS 165
|
||||||
#define TK_ORDER 166
|
#define TK_WENDTS 166
|
||||||
#define TK_SLIMIT 167
|
#define TK_WDURATION 167
|
||||||
#define TK_SOFFSET 168
|
#define TK_BETWEEN 168
|
||||||
#define TK_LIMIT 169
|
#define TK_IS 169
|
||||||
#define TK_OFFSET 170
|
#define TK_NK_LT 170
|
||||||
#define TK_ASC 171
|
#define TK_NK_GT 171
|
||||||
#define TK_DESC 172
|
#define TK_NK_LE 172
|
||||||
#define TK_NULLS 173
|
#define TK_NK_GE 173
|
||||||
#define TK_FIRST 174
|
#define TK_NK_NE 174
|
||||||
#define TK_LAST 175
|
#define TK_MATCH 175
|
||||||
|
#define TK_NMATCH 176
|
||||||
|
#define TK_JOIN 177
|
||||||
|
#define TK_INNER 178
|
||||||
|
#define TK_SELECT 179
|
||||||
|
#define TK_DISTINCT 180
|
||||||
|
#define TK_WHERE 181
|
||||||
|
#define TK_PARTITION 182
|
||||||
|
#define TK_BY 183
|
||||||
|
#define TK_SESSION 184
|
||||||
|
#define TK_STATE_WINDOW 185
|
||||||
|
#define TK_SLIDING 186
|
||||||
|
#define TK_FILL 187
|
||||||
|
#define TK_VALUE 188
|
||||||
|
#define TK_NONE 189
|
||||||
|
#define TK_PREV 190
|
||||||
|
#define TK_LINEAR 191
|
||||||
|
#define TK_NEXT 192
|
||||||
|
#define TK_GROUP 193
|
||||||
|
#define TK_HAVING 194
|
||||||
|
#define TK_ORDER 195
|
||||||
|
#define TK_SLIMIT 196
|
||||||
|
#define TK_SOFFSET 197
|
||||||
|
#define TK_LIMIT 198
|
||||||
|
#define TK_OFFSET 199
|
||||||
|
#define TK_ASC 200
|
||||||
|
#define TK_NULLS 201
|
||||||
|
|
||||||
#define TK_NK_SPACE 300
|
#define TK_NK_SPACE 300
|
||||||
#define TK_NK_COMMENT 301
|
#define TK_NK_COMMENT 301
|
||||||
|
@ -201,13 +227,10 @@
|
||||||
#define TK_NK_FILE 306
|
#define TK_NK_FILE 306
|
||||||
#define TK_NK_QUESTION 307 // denoting the placeholder of "?",when invoking statement bind query
|
#define TK_NK_QUESTION 307 // denoting the placeholder of "?",when invoking statement bind query
|
||||||
|
|
||||||
#define TK_NK_COLON 500
|
|
||||||
#define TK_NK_BITNOT 501
|
#define TK_NK_BITNOT 501
|
||||||
#define TK_INSERT 502
|
#define TK_INSERT 502
|
||||||
#define TK_INTO 503
|
|
||||||
#define TK_NOW 504
|
|
||||||
#define TK_VALUES 507
|
#define TK_VALUES 507
|
||||||
#define TK_IMPORT 507
|
#define TK_IMPORT 509
|
||||||
#define TK_NK_SEMI 508
|
#define TK_NK_SEMI 508
|
||||||
|
|
||||||
#define TK_NK_NIL 65535
|
#define TK_NK_NIL 65535
|
||||||
|
|
|
@ -31,6 +31,7 @@ typedef int16_t col_id_t;
|
||||||
typedef int8_t col_type_t;
|
typedef int8_t col_type_t;
|
||||||
typedef int32_t col_bytes_t;
|
typedef int32_t col_bytes_t;
|
||||||
typedef uint16_t schema_ver_t;
|
typedef uint16_t schema_ver_t;
|
||||||
|
typedef int32_t func_id_t;
|
||||||
|
|
||||||
#pragma pack(push, 1)
|
#pragma pack(push, 1)
|
||||||
typedef struct {
|
typedef struct {
|
||||||
|
@ -145,6 +146,7 @@ typedef struct {
|
||||||
#define IS_FLOAT_TYPE(_t) ((_t) == TSDB_DATA_TYPE_FLOAT || (_t) == TSDB_DATA_TYPE_DOUBLE)
|
#define IS_FLOAT_TYPE(_t) ((_t) == TSDB_DATA_TYPE_FLOAT || (_t) == TSDB_DATA_TYPE_DOUBLE)
|
||||||
|
|
||||||
#define IS_NUMERIC_TYPE(_t) ((IS_SIGNED_NUMERIC_TYPE(_t)) || (IS_UNSIGNED_NUMERIC_TYPE(_t)) || (IS_FLOAT_TYPE(_t)))
|
#define IS_NUMERIC_TYPE(_t) ((IS_SIGNED_NUMERIC_TYPE(_t)) || (IS_UNSIGNED_NUMERIC_TYPE(_t)) || (IS_FLOAT_TYPE(_t)))
|
||||||
|
#define IS_MATHABLE_TYPE(_t) (IS_NUMERIC_TYPE(_t) || (_t) == (TSDB_DATA_TYPE_BOOL) || (_t) == (TSDB_DATA_TYPE_TIMESTAMP))
|
||||||
|
|
||||||
#define IS_VALID_TINYINT(_t) ((_t) > INT8_MIN && (_t) <= INT8_MAX)
|
#define IS_VALID_TINYINT(_t) ((_t) > INT8_MIN && (_t) <= INT8_MAX)
|
||||||
#define IS_VALID_SMALLINT(_t) ((_t) > INT16_MIN && (_t) <= INT16_MAX)
|
#define IS_VALID_SMALLINT(_t) ((_t) > INT16_MIN && (_t) <= INT16_MAX)
|
||||||
|
|
|
@ -59,6 +59,7 @@ int32_t taosVariantDumpEx(SVariant *pVariant, char *payload, int16_t type, bool
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
int32_t taosVariantTypeSetType(SVariant *pVariant, char type);
|
int32_t taosVariantTypeSetType(SVariant *pVariant, char type);
|
||||||
|
char * taosVariantGet(SVariant *pVar, int32_t type);
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
|
|
|
@ -29,8 +29,7 @@ extern "C" {
|
||||||
typedef struct SMnode SMnode;
|
typedef struct SMnode SMnode;
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
int32_t dnodeId;
|
bool deploy;
|
||||||
int64_t clusterId;
|
|
||||||
int8_t replica;
|
int8_t replica;
|
||||||
int8_t selfIndex;
|
int8_t selfIndex;
|
||||||
SReplica replicas[TSDB_MAX_REPLICA];
|
SReplica replicas[TSDB_MAX_REPLICA];
|
||||||
|
|
|
@ -77,6 +77,9 @@ typedef struct SDbVgVersion {
|
||||||
int32_t numOfTable; // unit is TSDB_TABLE_NUM_UNIT
|
int32_t numOfTable; // unit is TSDB_TABLE_NUM_UNIT
|
||||||
} SDbVgVersion;
|
} SDbVgVersion;
|
||||||
|
|
||||||
|
typedef SDbCfgRsp SDbCfgInfo;
|
||||||
|
typedef SUserIndexRsp SIndexInfo;
|
||||||
|
|
||||||
int32_t catalogInit(SCatalogCfg *cfg);
|
int32_t catalogInit(SCatalogCfg *cfg);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -217,6 +220,10 @@ int32_t catalogGetExpiredSTables(SCatalog* pCatalog, SSTableMetaVersion **stable
|
||||||
|
|
||||||
int32_t catalogGetExpiredDBs(SCatalog* pCatalog, SDbVgVersion **dbs, uint32_t *num);
|
int32_t catalogGetExpiredDBs(SCatalog* pCatalog, SDbVgVersion **dbs, uint32_t *num);
|
||||||
|
|
||||||
|
int32_t catalogGetDBCfg(SCatalog* pCtg, void *pRpc, const SEpSet* pMgmtEps, const char* dbFName, SDbCfgInfo* pDbCfg);
|
||||||
|
|
||||||
|
int32_t catalogGetIndexInfo(SCatalog* pCtg, void *pRpc, const SEpSet* pMgmtEps, const char* indexName, SIndexInfo* pInfo);
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Destroy catalog and relase all resources
|
* Destroy catalog and relase all resources
|
||||||
|
|
|
@ -13,19 +13,18 @@
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef _TD_DND_BNODE_H_
|
#include "cmdnodes.h"
|
||||||
#define _TD_DND_BNODE_H_
|
#include "tmsg.h"
|
||||||
|
#include "plannodes.h"
|
||||||
|
|
||||||
#include "dnd.h"
|
typedef struct SExplainCtx SExplainCtx;
|
||||||
|
|
||||||
#ifdef __cplusplus
|
int32_t qExecCommand(SNode* pStmt, SRetrieveTableRsp** pRsp);
|
||||||
extern "C" {
|
|
||||||
#endif
|
|
||||||
|
|
||||||
void bmGetMgmtFp(SMgmtWrapper *pWrapper);
|
int32_t qExecStaticExplain(SQueryPlan *pDag, SRetrieveTableRsp **pRsp);
|
||||||
|
int32_t qExecExplainBegin(SQueryPlan *pDag, SExplainCtx **pCtx, int32_t startTs);
|
||||||
|
int32_t qExecExplainEnd(SExplainCtx *pCtx, SRetrieveTableRsp **pRsp);
|
||||||
|
int32_t qExplainUpdateExecInfo(SExplainCtx *pCtx, SExplainRsp *pRspMsg, int32_t groupId, SRetrieveTableRsp **pRsp);
|
||||||
|
void qExplainFreeCtx(SExplainCtx *pCtx);
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif /*_TD_DND_BNODE_H_*/
|
|
|
@ -174,6 +174,8 @@ void** qReleaseTask(void* pMgmt, void* pQInfo, bool freeHandle);
|
||||||
|
|
||||||
void qProcessFetchRsp(void* parent, struct SRpcMsg* pMsg, struct SEpSet* pEpSet);
|
void qProcessFetchRsp(void* parent, struct SRpcMsg* pMsg, struct SEpSet* pEpSet);
|
||||||
|
|
||||||
|
int32_t qGetExplainExecInfo(qTaskInfo_t tinfo, int32_t *resNum, SExplainExecInfo **pRes);
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -36,7 +36,7 @@ typedef struct SFuncExecEnv {
|
||||||
|
|
||||||
typedef bool (*FExecGetEnv)(struct SFunctionNode* pFunc, SFuncExecEnv* pEnv);
|
typedef bool (*FExecGetEnv)(struct SFunctionNode* pFunc, SFuncExecEnv* pEnv);
|
||||||
typedef bool (*FExecInit)(struct SqlFunctionCtx *pCtx, struct SResultRowEntryInfo* pResultCellInfo);
|
typedef bool (*FExecInit)(struct SqlFunctionCtx *pCtx, struct SResultRowEntryInfo* pResultCellInfo);
|
||||||
typedef void (*FExecProcess)(struct SqlFunctionCtx *pCtx);
|
typedef int32_t (*FExecProcess)(struct SqlFunctionCtx *pCtx);
|
||||||
typedef void (*FExecFinalize)(struct SqlFunctionCtx *pCtx);
|
typedef void (*FExecFinalize)(struct SqlFunctionCtx *pCtx);
|
||||||
typedef int32_t (*FScalarExecProcess)(SScalarParam *pInput, int32_t inputNum, SScalarParam *pOutput);
|
typedef int32_t (*FScalarExecProcess)(SScalarParam *pInput, int32_t inputNum, SScalarParam *pOutput);
|
||||||
|
|
||||||
|
@ -52,6 +52,11 @@ typedef struct SFuncExecFuncs {
|
||||||
FExecFinalize finalize;
|
FExecFinalize finalize;
|
||||||
} SFuncExecFuncs;
|
} SFuncExecFuncs;
|
||||||
|
|
||||||
|
typedef struct SFileBlockInfo {
|
||||||
|
int32_t numBlocksOfStep;
|
||||||
|
} SFileBlockInfo;
|
||||||
|
|
||||||
|
#define TSDB_BLOCK_DIST_STEP_ROWS 8
|
||||||
#define MAX_INTERVAL_TIME_WINDOW 1000000 // maximum allowed time windows in final results
|
#define MAX_INTERVAL_TIME_WINDOW 1000000 // maximum allowed time windows in final results
|
||||||
|
|
||||||
#define FUNCTION_TYPE_SCALAR 1
|
#define FUNCTION_TYPE_SCALAR 1
|
||||||
|
@ -101,18 +106,15 @@ typedef struct SFuncExecFuncs {
|
||||||
#define FUNCTION_DERIVATIVE 32
|
#define FUNCTION_DERIVATIVE 32
|
||||||
#define FUNCTION_BLKINFO 33
|
#define FUNCTION_BLKINFO 33
|
||||||
|
|
||||||
#define FUNCTION_HISTOGRAM 34
|
|
||||||
#define FUNCTION_HLL 35
|
|
||||||
#define FUNCTION_MODE 36
|
|
||||||
#define FUNCTION_SAMPLE 37
|
|
||||||
|
|
||||||
#define FUNCTION_COV 38
|
#define FUNCTION_COV 38
|
||||||
|
|
||||||
typedef struct SResultRowEntryInfo {
|
typedef struct SResultRowEntryInfo {
|
||||||
int8_t hasResult; // result generated, not NULL value
|
// int8_t hasResult:6; // result generated, not NULL value
|
||||||
bool initialized; // output buffer has been initialized
|
bool initialized:1; // output buffer has been initialized
|
||||||
bool complete; // query has completed
|
bool complete:1; // query has completed
|
||||||
uint32_t numOfRes; // num of output result in current buffer
|
uint8_t isNullRes:6; // the result is null
|
||||||
|
uint8_t numOfRes; // num of output result in current buffer
|
||||||
} SResultRowEntryInfo;
|
} SResultRowEntryInfo;
|
||||||
|
|
||||||
// determine the real data need to calculated the result
|
// determine the real data need to calculated the result
|
||||||
|
@ -154,6 +156,7 @@ typedef struct SResultDataInfo {
|
||||||
} SResultDataInfo;
|
} SResultDataInfo;
|
||||||
|
|
||||||
#define GET_RES_INFO(ctx) ((ctx)->resultInfo)
|
#define GET_RES_INFO(ctx) ((ctx)->resultInfo)
|
||||||
|
#define GET_ROWCELL_INTERBUF(_c) ((void*) ((char*)(_c) + sizeof(SResultRowEntryInfo)))
|
||||||
|
|
||||||
typedef struct SInputColumnInfoData {
|
typedef struct SInputColumnInfoData {
|
||||||
int32_t totalRows; // total rows in current columnar data
|
int32_t totalRows; // total rows in current columnar data
|
||||||
|
@ -183,15 +186,16 @@ typedef struct SqlFunctionCtx {
|
||||||
int32_t columnIndex; // TODO remove it
|
int32_t columnIndex; // TODO remove it
|
||||||
uint8_t currentStage; // record current running step, default: 0
|
uint8_t currentStage; // record current running step, default: 0
|
||||||
bool isAggSet;
|
bool isAggSet;
|
||||||
|
int64_t startTs; // timestamp range of current query when function is executed on a specific data block, TODO remove it
|
||||||
/////////////////////////////////////////////////////////////////
|
/////////////////////////////////////////////////////////////////
|
||||||
bool stableQuery;
|
bool stableQuery;
|
||||||
int16_t functionId; // function id
|
int16_t functionId; // function id
|
||||||
char * pOutput; // final result output buffer, point to sdata->data
|
char * pOutput; // final result output buffer, point to sdata->data
|
||||||
int64_t startTs; // timestamp range of current query when function is executed on a specific data block
|
|
||||||
int32_t numOfParams;
|
int32_t numOfParams;
|
||||||
SVariant param[4]; // input parameter, e.g., top(k, 20), the number of results for top query is kept in param
|
SVariant param[4]; // input parameter, e.g., top(k, 20), the number of results for top query is kept in param
|
||||||
int64_t *ptsList; // corresponding timestamp array list
|
int64_t *ptsList; // corresponding timestamp array list
|
||||||
void *ptsOutputBuf; // corresponding output buffer for timestamp of each result, e.g., top/bottom*/
|
SColumnInfoData *pTsOutput; // corresponding output buffer for timestamp of each result, e.g., top/bottom*/
|
||||||
|
int32_t offset;
|
||||||
SVariant tag;
|
SVariant tag;
|
||||||
struct SResultRowEntryInfo *resultInfo;
|
struct SResultRowEntryInfo *resultInfo;
|
||||||
SSubsidiaryResInfo subsidiaryRes;
|
SSubsidiaryResInfo subsidiaryRes;
|
||||||
|
|
|
@ -72,10 +72,15 @@ typedef enum EFunctionType {
|
||||||
FUNCTION_TYPE_ATAN,
|
FUNCTION_TYPE_ATAN,
|
||||||
|
|
||||||
// string function
|
// string function
|
||||||
FUNCTION_TYPE_CHAR_LENGTH = 1500,
|
FUNCTION_TYPE_LENGTH = 1500,
|
||||||
|
FUNCTION_TYPE_CHAR_LENGTH,
|
||||||
FUNCTION_TYPE_CONCAT,
|
FUNCTION_TYPE_CONCAT,
|
||||||
FUNCTION_TYPE_CONCAT_WS,
|
FUNCTION_TYPE_CONCAT_WS,
|
||||||
FUNCTION_TYPE_LENGTH,
|
FUNCTION_TYPE_LOWER,
|
||||||
|
FUNCTION_TYPE_UPPER,
|
||||||
|
FUNCTION_TYPE_LTRIM,
|
||||||
|
FUNCTION_TYPE_RTRIM,
|
||||||
|
FUNCTION_TYPE_SUBSTR,
|
||||||
|
|
||||||
// conversion function
|
// conversion function
|
||||||
FUNCTION_TYPE_CAST = 2000,
|
FUNCTION_TYPE_CAST = 2000,
|
||||||
|
@ -127,6 +132,7 @@ bool fmIsStringFunc(int32_t funcId);
|
||||||
bool fmIsDatetimeFunc(int32_t funcId);
|
bool fmIsDatetimeFunc(int32_t funcId);
|
||||||
bool fmIsTimelineFunc(int32_t funcId);
|
bool fmIsTimelineFunc(int32_t funcId);
|
||||||
bool fmIsTimeorderFunc(int32_t funcId);
|
bool fmIsTimeorderFunc(int32_t funcId);
|
||||||
|
bool fmIsPseudoColumnFunc(int32_t funcId);
|
||||||
bool fmIsWindowPseudoColumnFunc(int32_t funcId);
|
bool fmIsWindowPseudoColumnFunc(int32_t funcId);
|
||||||
bool fmIsWindowClauseFunc(int32_t funcId);
|
bool fmIsWindowClauseFunc(int32_t funcId);
|
||||||
|
|
||||||
|
|
|
@ -19,6 +19,7 @@
|
||||||
#include "tarray.h"
|
#include "tarray.h"
|
||||||
#include "tdef.h"
|
#include "tdef.h"
|
||||||
#include "tlog.h"
|
#include "tlog.h"
|
||||||
|
#include "tmsg.h"
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
extern "C" {
|
extern "C" {
|
||||||
|
@ -29,6 +30,44 @@ extern "C" {
|
||||||
#define MON_VER_LEN 12
|
#define MON_VER_LEN 12
|
||||||
#define MON_LOG_LEN 1024
|
#define MON_LOG_LEN 1024
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
int64_t ts;
|
||||||
|
ELogLevel level;
|
||||||
|
char content[MON_LOG_LEN];
|
||||||
|
} SMonLogItem;
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
SArray *logs; // array of SMonLogItem
|
||||||
|
int32_t numOfErrorLogs;
|
||||||
|
int32_t numOfInfoLogs;
|
||||||
|
int32_t numOfDebugLogs;
|
||||||
|
int32_t numOfTraceLogs;
|
||||||
|
} SMonLogs;
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
char name[TSDB_FILENAME_LEN];
|
||||||
|
int8_t level;
|
||||||
|
SDiskSize size;
|
||||||
|
} SMonDiskDesc;
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
double cpu_engine;
|
||||||
|
double cpu_system;
|
||||||
|
float cpu_cores;
|
||||||
|
int64_t mem_engine; // KB
|
||||||
|
int64_t mem_system; // KB
|
||||||
|
int64_t mem_total; // KB
|
||||||
|
int64_t disk_engine; // Byte
|
||||||
|
int64_t disk_used; // Byte
|
||||||
|
int64_t disk_total; // Byte
|
||||||
|
int64_t net_in; // bytes
|
||||||
|
int64_t net_out; // bytes
|
||||||
|
int64_t io_read; // bytes
|
||||||
|
int64_t io_write; // bytes
|
||||||
|
int64_t io_read_disk; // bytes
|
||||||
|
int64_t io_write_disk; // bytes
|
||||||
|
} SMonSysInfo;
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
int32_t dnode_id;
|
int32_t dnode_id;
|
||||||
char dnode_ep[TSDB_EP_LEN];
|
char dnode_ep[TSDB_EP_LEN];
|
||||||
|
@ -36,6 +75,19 @@ typedef struct {
|
||||||
int32_t protocol;
|
int32_t protocol;
|
||||||
} SMonBasicInfo;
|
} SMonBasicInfo;
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
float uptime; // day
|
||||||
|
int8_t has_mnode;
|
||||||
|
SMonDiskDesc logdir;
|
||||||
|
SMonDiskDesc tempdir;
|
||||||
|
} SMonDnodeInfo;
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
SMonBasicInfo basic;
|
||||||
|
SMonDnodeInfo dnode;
|
||||||
|
SMonSysInfo sys;
|
||||||
|
} SMonDmInfo;
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
int32_t dnode_id;
|
int32_t dnode_id;
|
||||||
char dnode_ep[TSDB_EP_LEN];
|
char dnode_ep[TSDB_EP_LEN];
|
||||||
|
@ -87,46 +139,65 @@ typedef struct {
|
||||||
} SMonGrantInfo;
|
} SMonGrantInfo;
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
float uptime; // day
|
SMonClusterInfo cluster;
|
||||||
double cpu_engine;
|
SMonVgroupInfo vgroup;
|
||||||
double cpu_system;
|
SMonGrantInfo grant;
|
||||||
float cpu_cores;
|
SMonSysInfo sys;
|
||||||
int64_t mem_engine; // KB
|
SMonLogs log;
|
||||||
int64_t mem_system; // KB
|
} SMonMmInfo;
|
||||||
int64_t mem_total; // KB
|
|
||||||
int64_t disk_engine; // Byte
|
|
||||||
int64_t disk_used; // Byte
|
|
||||||
int64_t disk_total; // Byte
|
|
||||||
int64_t net_in; // bytes
|
|
||||||
int64_t net_out; // bytes
|
|
||||||
int64_t io_read; // bytes
|
|
||||||
int64_t io_write; // bytes
|
|
||||||
int64_t io_read_disk; // bytes
|
|
||||||
int64_t io_write_disk; // bytes
|
|
||||||
int64_t req_select;
|
|
||||||
int64_t req_insert;
|
|
||||||
int64_t req_insert_success;
|
|
||||||
int64_t req_insert_batch;
|
|
||||||
int64_t req_insert_batch_success;
|
|
||||||
int32_t errors;
|
|
||||||
int32_t vnodes_num;
|
|
||||||
int32_t masters;
|
|
||||||
int8_t has_mnode;
|
|
||||||
} SMonDnodeInfo;
|
|
||||||
|
|
||||||
typedef struct {
|
int32_t tSerializeSMonMmInfo(void *buf, int32_t bufLen, SMonMmInfo *pInfo);
|
||||||
char name[TSDB_FILENAME_LEN];
|
int32_t tDeserializeSMonMmInfo(void *buf, int32_t bufLen, SMonMmInfo *pInfo);
|
||||||
int8_t level;
|
void tFreeSMonMmInfo(SMonMmInfo *pInfo);
|
||||||
SDiskSize size;
|
|
||||||
} SMonDiskDesc;
|
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
SArray *datadirs; // array of SMonDiskDesc
|
SArray *datadirs; // array of SMonDiskDesc
|
||||||
SMonDiskDesc logdir;
|
|
||||||
SMonDiskDesc tempdir;
|
|
||||||
} SMonDiskInfo;
|
} SMonDiskInfo;
|
||||||
|
|
||||||
typedef struct SMonInfo SMonInfo;
|
typedef struct {
|
||||||
|
SMonDiskInfo tfs;
|
||||||
|
SVnodesStat vstat;
|
||||||
|
SMonSysInfo sys;
|
||||||
|
SMonLogs log;
|
||||||
|
} SMonVmInfo;
|
||||||
|
|
||||||
|
int32_t tSerializeSMonVmInfo(void *buf, int32_t bufLen, SMonVmInfo *pInfo);
|
||||||
|
int32_t tDeserializeSMonVmInfo(void *buf, int32_t bufLen, SMonVmInfo *pInfo);
|
||||||
|
void tFreeSMonVmInfo(SMonVmInfo *pInfo);
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
SMonSysInfo sys;
|
||||||
|
SMonLogs log;
|
||||||
|
} SMonQmInfo;
|
||||||
|
|
||||||
|
int32_t tSerializeSMonQmInfo(void *buf, int32_t bufLen, SMonQmInfo *pInfo);
|
||||||
|
int32_t tDeserializeSMonQmInfo(void *buf, int32_t bufLen, SMonQmInfo *pInfo);
|
||||||
|
void tFreeSMonQmInfo(SMonQmInfo *pInfo);
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
SMonSysInfo sys;
|
||||||
|
SMonLogs log;
|
||||||
|
} SMonSmInfo;
|
||||||
|
|
||||||
|
int32_t tSerializeSMonSmInfo(void *buf, int32_t bufLen, SMonSmInfo *pInfo);
|
||||||
|
int32_t tDeserializeSMonSmInfo(void *buf, int32_t bufLen, SMonSmInfo *pInfo);
|
||||||
|
void tFreeSMonSmInfo(SMonSmInfo *pInfo);
|
||||||
|
typedef struct {
|
||||||
|
SMonSysInfo sys;
|
||||||
|
SMonLogs log;
|
||||||
|
} SMonBmInfo;
|
||||||
|
|
||||||
|
int32_t tSerializeSMonBmInfo(void *buf, int32_t bufLen, SMonBmInfo *pInfo);
|
||||||
|
int32_t tDeserializeSMonBmInfo(void *buf, int32_t bufLen, SMonBmInfo *pInfo);
|
||||||
|
void tFreeSMonBmInfo(SMonBmInfo *pInfo);
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
SArray *pVloads; // SVnodeLoad
|
||||||
|
} SMonVloadInfo;
|
||||||
|
|
||||||
|
int32_t tSerializeSMonVloadInfo(void *buf, int32_t bufLen, SMonVloadInfo *pInfo);
|
||||||
|
int32_t tDeserializeSMonVloadInfo(void *buf, int32_t bufLen, SMonVloadInfo *pInfo);
|
||||||
|
void tFreeSMonVloadInfo(SMonVloadInfo *pInfo);
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
const char *server;
|
const char *server;
|
||||||
|
@ -138,16 +209,14 @@ typedef struct {
|
||||||
int32_t monInit(const SMonCfg *pCfg);
|
int32_t monInit(const SMonCfg *pCfg);
|
||||||
void monCleanup();
|
void monCleanup();
|
||||||
void monRecordLog(int64_t ts, ELogLevel level, const char *content);
|
void monRecordLog(int64_t ts, ELogLevel level, const char *content);
|
||||||
|
int32_t monGetLogs(SMonLogs *logs);
|
||||||
SMonInfo *monCreateMonitorInfo();
|
void monSetDmInfo(SMonDmInfo *pInfo);
|
||||||
void monSetBasicInfo(SMonInfo *pMonitor, SMonBasicInfo *pInfo);
|
void monSetMmInfo(SMonMmInfo *pInfo);
|
||||||
void monSetClusterInfo(SMonInfo *pMonitor, SMonClusterInfo *pInfo);
|
void monSetVmInfo(SMonVmInfo *pInfo);
|
||||||
void monSetVgroupInfo(SMonInfo *pMonitor, SMonVgroupInfo *pInfo);
|
void monSetQmInfo(SMonQmInfo *pInfo);
|
||||||
void monSetGrantInfo(SMonInfo *pMonitor, SMonGrantInfo *pInfo);
|
void monSetSmInfo(SMonSmInfo *pInfo);
|
||||||
void monSetDnodeInfo(SMonInfo *pMonitor, SMonDnodeInfo *pInfo);
|
void monSetBmInfo(SMonBmInfo *pInfo);
|
||||||
void monSetDiskInfo(SMonInfo *pMonitor, SMonDiskInfo *pInfo);
|
void monSendReport();
|
||||||
void monSendReport(SMonInfo *pMonitor);
|
|
||||||
void monCleanupMonitorInfo(SMonInfo *pMonitor);
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
|
|
|
@ -20,27 +20,33 @@
|
||||||
extern "C" {
|
extern "C" {
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#include "query.h"
|
||||||
#include "querynodes.h"
|
#include "querynodes.h"
|
||||||
|
|
||||||
|
#define DESCRIBE_RESULT_COLS 4
|
||||||
|
#define DESCRIBE_RESULT_FIELD_LEN (TSDB_COL_NAME_LEN - 1 + VARSTR_HEADER_SIZE)
|
||||||
|
#define DESCRIBE_RESULT_TYPE_LEN (20 + VARSTR_HEADER_SIZE)
|
||||||
|
#define DESCRIBE_RESULT_NOTE_LEN (8 + VARSTR_HEADER_SIZE)
|
||||||
|
|
||||||
typedef struct SDatabaseOptions {
|
typedef struct SDatabaseOptions {
|
||||||
ENodeType type;
|
ENodeType type;
|
||||||
int32_t numOfBlocks;
|
SValueNode* pNumOfBlocks;
|
||||||
int32_t cacheBlockSize;
|
SValueNode* pCacheBlockSize;
|
||||||
int8_t cachelast;
|
SValueNode* pCachelast;
|
||||||
int32_t compressionLevel;
|
SValueNode* pCompressionLevel;
|
||||||
int32_t daysPerFile;
|
SValueNode* pDaysPerFile;
|
||||||
int32_t fsyncPeriod;
|
SValueNode* pFsyncPeriod;
|
||||||
int32_t maxRowsPerBlock;
|
SValueNode* pMaxRowsPerBlock;
|
||||||
int32_t minRowsPerBlock;
|
SValueNode* pMinRowsPerBlock;
|
||||||
int32_t keep;
|
SNodeList* pKeep;
|
||||||
int32_t precision;
|
SValueNode* pPrecision;
|
||||||
int32_t quorum;
|
SValueNode* pQuorum;
|
||||||
int32_t replica;
|
SValueNode* pReplica;
|
||||||
int32_t ttl;
|
SValueNode* pTtl;
|
||||||
int32_t walLevel;
|
SValueNode* pWalLevel;
|
||||||
int32_t numOfVgroups;
|
SValueNode* pNumOfVgroups;
|
||||||
int8_t singleStable;
|
SValueNode* pSingleStable;
|
||||||
int8_t streamMode;
|
SValueNode* pStreamMode;
|
||||||
SNodeList* pRetentions;
|
SNodeList* pRetentions;
|
||||||
} SDatabaseOptions;
|
} SDatabaseOptions;
|
||||||
|
|
||||||
|
@ -70,13 +76,13 @@ typedef struct SAlterDatabaseStmt {
|
||||||
|
|
||||||
typedef struct STableOptions {
|
typedef struct STableOptions {
|
||||||
ENodeType type;
|
ENodeType type;
|
||||||
int32_t keep;
|
SNodeList* pKeep;
|
||||||
int32_t ttl;
|
SValueNode* pTtl;
|
||||||
char comments[TSDB_STB_COMMENT_LEN];
|
SValueNode* pComments;
|
||||||
SNodeList* pSma;
|
SNodeList* pSma;
|
||||||
SNodeList* pFuncs;
|
SNodeList* pFuncs;
|
||||||
float filesFactor;
|
SValueNode* pFilesFactor;
|
||||||
int32_t delay;
|
SValueNode* pDelay;
|
||||||
} STableOptions;
|
} STableOptions;
|
||||||
|
|
||||||
typedef struct SColumnDefNode {
|
typedef struct SColumnDefNode {
|
||||||
|
@ -84,6 +90,7 @@ typedef struct SColumnDefNode {
|
||||||
char colName[TSDB_COL_NAME_LEN];
|
char colName[TSDB_COL_NAME_LEN];
|
||||||
SDataType dataType;
|
SDataType dataType;
|
||||||
char comments[TSDB_STB_COMMENT_LEN];
|
char comments[TSDB_STB_COMMENT_LEN];
|
||||||
|
bool sma;
|
||||||
} SColumnDefNode;
|
} SColumnDefNode;
|
||||||
|
|
||||||
typedef struct SCreateTableStmt {
|
typedef struct SCreateTableStmt {
|
||||||
|
@ -187,6 +194,12 @@ typedef struct SShowStmt {
|
||||||
SNode* pTbNamePattern; // SValueNode
|
SNode* pTbNamePattern; // SValueNode
|
||||||
} SShowStmt;
|
} SShowStmt;
|
||||||
|
|
||||||
|
typedef struct SShowCreatStmt {
|
||||||
|
ENodeType type;
|
||||||
|
char dbName[TSDB_DB_NAME_LEN];
|
||||||
|
char tableName[TSDB_TABLE_NAME_LEN];
|
||||||
|
} SShowCreatStmt;
|
||||||
|
|
||||||
typedef enum EIndexType {
|
typedef enum EIndexType {
|
||||||
INDEX_TYPE_SMA = 1,
|
INDEX_TYPE_SMA = 1,
|
||||||
INDEX_TYPE_FULLTEXT
|
INDEX_TYPE_FULLTEXT
|
||||||
|
@ -247,6 +260,13 @@ typedef struct SAlterLocalStmt {
|
||||||
char value[TSDB_DNODE_VALUE_LEN];
|
char value[TSDB_DNODE_VALUE_LEN];
|
||||||
} SAlterLocalStmt;
|
} SAlterLocalStmt;
|
||||||
|
|
||||||
|
typedef struct SDescribeStmt {
|
||||||
|
ENodeType type;
|
||||||
|
char dbName[TSDB_DB_NAME_LEN];
|
||||||
|
char tableName[TSDB_TABLE_NAME_LEN];
|
||||||
|
STableMeta* pMeta;
|
||||||
|
} SDescribeStmt;
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -30,11 +30,19 @@ extern "C" {
|
||||||
#define FOREACH(node, list) \
|
#define FOREACH(node, list) \
|
||||||
for (SListCell* cell = (NULL != (list) ? (list)->pHead : NULL); (NULL != cell ? (node = cell->pNode, true) : (node = NULL, false)); cell = cell->pNext)
|
for (SListCell* cell = (NULL != (list) ? (list)->pHead : NULL); (NULL != cell ? (node = cell->pNode, true) : (node = NULL, false)); cell = cell->pNext)
|
||||||
|
|
||||||
// only be use in FOREACH
|
|
||||||
#define ERASE_NODE(list) cell = nodesListErase(list, cell);
|
|
||||||
|
|
||||||
#define REPLACE_NODE(newNode) cell->pNode = (SNode*)(newNode)
|
#define REPLACE_NODE(newNode) cell->pNode = (SNode*)(newNode)
|
||||||
|
|
||||||
|
#define INSERT_LIST(target, src) nodesListInsertList((target), cell, src)
|
||||||
|
|
||||||
|
#define WHERE_EACH(node, list) \
|
||||||
|
SListCell* cell = (NULL != (list) ? (list)->pHead : NULL); \
|
||||||
|
while (NULL != cell ? (node = cell->pNode, true) : (node = NULL, false))
|
||||||
|
|
||||||
|
#define WHERE_NEXT cell = cell->pNext
|
||||||
|
|
||||||
|
// only be use in WHERE_EACH
|
||||||
|
#define ERASE_NODE(list) cell = nodesListErase((list), cell)
|
||||||
|
|
||||||
#define FORBOTH(node1, list1, node2, list2) \
|
#define FORBOTH(node1, list1, node2, list2) \
|
||||||
for (SListCell* cell1 = (NULL != (list1) ? (list1)->pHead : NULL), *cell2 = (NULL != (list2) ? (list2)->pHead : NULL); \
|
for (SListCell* cell1 = (NULL != (list1) ? (list1)->pHead : NULL), *cell2 = (NULL != (list2) ? (list2)->pHead : NULL); \
|
||||||
(NULL == cell1 ? (node1 = NULL, false) : (node1 = cell1->pNode, true)), (NULL == cell2 ? (node2 = NULL, false) : (node2 = cell2->pNode, true)), (node1 != NULL && node2 != NULL); \
|
(NULL == cell1 ? (node1 = NULL, false) : (node1 = cell1->pNode, true)), (NULL == cell2 ? (node2 = NULL, false) : (node2 = cell2->pNode, true)), (node1 != NULL && node2 != NULL); \
|
||||||
|
@ -101,6 +109,17 @@ typedef enum ENodeType {
|
||||||
QUERY_NODE_DROP_TOPIC_STMT,
|
QUERY_NODE_DROP_TOPIC_STMT,
|
||||||
QUERY_NODE_ALTER_LOCAL_STMT,
|
QUERY_NODE_ALTER_LOCAL_STMT,
|
||||||
QUERY_NODE_EXPLAIN_STMT,
|
QUERY_NODE_EXPLAIN_STMT,
|
||||||
|
QUERY_NODE_DESCRIBE_STMT,
|
||||||
|
QUERY_NODE_RESET_QUERY_CACHE_STMT,
|
||||||
|
QUERY_NODE_COMPACT_STMT,
|
||||||
|
QUERY_NODE_CREATE_FUNCTION_STMT,
|
||||||
|
QUERY_NODE_DROP_FUNCTION_STMT,
|
||||||
|
QUERY_NODE_CREATE_STREAM_STMT,
|
||||||
|
QUERY_NODE_DROP_STREAM_STMT,
|
||||||
|
QUERY_NODE_MERGE_VGROUP_STMT,
|
||||||
|
QUERY_NODE_REDISTRIBUTE_VGROUP_STMT,
|
||||||
|
QUERY_NODE_SPLIT_VGROUP_STMT,
|
||||||
|
QUERY_NODE_SYNCDB_STMT,
|
||||||
QUERY_NODE_SHOW_DATABASES_STMT,
|
QUERY_NODE_SHOW_DATABASES_STMT,
|
||||||
QUERY_NODE_SHOW_TABLES_STMT,
|
QUERY_NODE_SHOW_TABLES_STMT,
|
||||||
QUERY_NODE_SHOW_STABLES_STMT,
|
QUERY_NODE_SHOW_STABLES_STMT,
|
||||||
|
@ -113,6 +132,18 @@ typedef enum ENodeType {
|
||||||
QUERY_NODE_SHOW_FUNCTIONS_STMT,
|
QUERY_NODE_SHOW_FUNCTIONS_STMT,
|
||||||
QUERY_NODE_SHOW_INDEXES_STMT,
|
QUERY_NODE_SHOW_INDEXES_STMT,
|
||||||
QUERY_NODE_SHOW_STREAMS_STMT,
|
QUERY_NODE_SHOW_STREAMS_STMT,
|
||||||
|
QUERY_NODE_SHOW_APPS_STMT,
|
||||||
|
QUERY_NODE_SHOW_CONNECTIONS_STMT,
|
||||||
|
QUERY_NODE_SHOW_LICENCE_STMT,
|
||||||
|
QUERY_NODE_SHOW_CREATE_DATABASE_STMT,
|
||||||
|
QUERY_NODE_SHOW_CREATE_TABLE_STMT,
|
||||||
|
QUERY_NODE_SHOW_CREATE_STABLE_STMT,
|
||||||
|
QUERY_NODE_SHOW_QUERIES_STMT,
|
||||||
|
QUERY_NODE_SHOW_SCORES_STMT,
|
||||||
|
QUERY_NODE_SHOW_TOPICS_STMT,
|
||||||
|
QUERY_NODE_SHOW_VARIABLE_STMT,
|
||||||
|
QUERY_NODE_KILL_CONNECTION_STMT,
|
||||||
|
QUERY_NODE_KILL_QUERY_STMT,
|
||||||
|
|
||||||
// logic plan node
|
// logic plan node
|
||||||
QUERY_NODE_LOGIC_PLAN_SCAN,
|
QUERY_NODE_LOGIC_PLAN_SCAN,
|
||||||
|
@ -140,6 +171,8 @@ typedef enum ENodeType {
|
||||||
QUERY_NODE_PHYSICAL_PLAN_SORT,
|
QUERY_NODE_PHYSICAL_PLAN_SORT,
|
||||||
QUERY_NODE_PHYSICAL_PLAN_INTERVAL,
|
QUERY_NODE_PHYSICAL_PLAN_INTERVAL,
|
||||||
QUERY_NODE_PHYSICAL_PLAN_SESSION_WINDOW,
|
QUERY_NODE_PHYSICAL_PLAN_SESSION_WINDOW,
|
||||||
|
QUERY_NODE_PHYSICAL_PLAN_STATE_WINDOW,
|
||||||
|
QUERY_NODE_PHYSICAL_PLAN_PARTITION,
|
||||||
QUERY_NODE_PHYSICAL_PLAN_DISPATCH,
|
QUERY_NODE_PHYSICAL_PLAN_DISPATCH,
|
||||||
QUERY_NODE_PHYSICAL_PLAN_INSERT,
|
QUERY_NODE_PHYSICAL_PLAN_INSERT,
|
||||||
QUERY_NODE_PHYSICAL_SUBPLAN,
|
QUERY_NODE_PHYSICAL_SUBPLAN,
|
||||||
|
@ -178,7 +211,9 @@ int32_t nodesListStrictAppend(SNodeList* pList, SNodeptr pNode);
|
||||||
int32_t nodesListMakeAppend(SNodeList** pList, SNodeptr pNode);
|
int32_t nodesListMakeAppend(SNodeList** pList, SNodeptr pNode);
|
||||||
int32_t nodesListAppendList(SNodeList* pTarget, SNodeList* pSrc);
|
int32_t nodesListAppendList(SNodeList* pTarget, SNodeList* pSrc);
|
||||||
int32_t nodesListStrictAppendList(SNodeList* pTarget, SNodeList* pSrc);
|
int32_t nodesListStrictAppendList(SNodeList* pTarget, SNodeList* pSrc);
|
||||||
|
int32_t nodesListPushFront(SNodeList* pList, SNodeptr pNode);
|
||||||
SListCell* nodesListErase(SNodeList* pList, SListCell* pCell);
|
SListCell* nodesListErase(SNodeList* pList, SListCell* pCell);
|
||||||
|
void nodesListInsertList(SNodeList* pTarget, SListCell* pPos, SNodeList* pSrc);
|
||||||
SNodeptr nodesListGetNode(SNodeList* pList, int32_t index);
|
SNodeptr nodesListGetNode(SNodeList* pList, int32_t index);
|
||||||
void nodesDestroyList(SNodeList* pList);
|
void nodesDestroyList(SNodeList* pList);
|
||||||
// Only clear the linked list structure, without releasing the elements inside
|
// Only clear the linked list structure, without releasing the elements inside
|
||||||
|
@ -191,16 +226,16 @@ typedef enum EDealRes {
|
||||||
} EDealRes;
|
} EDealRes;
|
||||||
|
|
||||||
typedef EDealRes (*FNodeWalker)(SNode* pNode, void* pContext);
|
typedef EDealRes (*FNodeWalker)(SNode* pNode, void* pContext);
|
||||||
void nodesWalkNode(SNodeptr pNode, FNodeWalker walker, void* pContext);
|
void nodesWalkExpr(SNodeptr pNode, FNodeWalker walker, void* pContext);
|
||||||
void nodesWalkList(SNodeList* pList, FNodeWalker walker, void* pContext);
|
void nodesWalkExprs(SNodeList* pList, FNodeWalker walker, void* pContext);
|
||||||
void nodesWalkNodePostOrder(SNodeptr pNode, FNodeWalker walker, void* pContext);
|
void nodesWalkExprPostOrder(SNodeptr pNode, FNodeWalker walker, void* pContext);
|
||||||
void nodesWalkListPostOrder(SNodeList* pList, FNodeWalker walker, void* pContext);
|
void nodesWalkExprsPostOrder(SNodeList* pList, FNodeWalker walker, void* pContext);
|
||||||
|
|
||||||
typedef EDealRes (*FNodeRewriter)(SNode** pNode, void* pContext);
|
typedef EDealRes (*FNodeRewriter)(SNode** pNode, void* pContext);
|
||||||
void nodesRewriteNode(SNode** pNode, FNodeRewriter rewriter, void* pContext);
|
void nodesRewriteExpr(SNode** pNode, FNodeRewriter rewriter, void* pContext);
|
||||||
void nodesRewriteList(SNodeList* pList, FNodeRewriter rewriter, void* pContext);
|
void nodesRewriteExprs(SNodeList* pList, FNodeRewriter rewriter, void* pContext);
|
||||||
void nodesRewriteNodePostOrder(SNode** pNode, FNodeRewriter rewriter, void* pContext);
|
void nodesRewriteExprPostOrder(SNode** pNode, FNodeRewriter rewriter, void* pContext);
|
||||||
void nodesRewriteListPostOrder(SNodeList* pList, FNodeRewriter rewriter, void* pContext);
|
void nodesRewriteExprsPostOrder(SNodeList* pList, FNodeRewriter rewriter, void* pContext);
|
||||||
|
|
||||||
bool nodesEqualNode(const SNodeptr a, const SNodeptr b);
|
bool nodesEqualNode(const SNodeptr a, const SNodeptr b);
|
||||||
|
|
||||||
|
@ -214,6 +249,10 @@ int32_t nodesStringToNode(const char* pStr, SNode** pNode);
|
||||||
int32_t nodesListToString(const SNodeList* pList, bool format, char** pStr, int32_t* pLen);
|
int32_t nodesListToString(const SNodeList* pList, bool format, char** pStr, int32_t* pLen);
|
||||||
int32_t nodesStringToList(const char* pStr, SNodeList** pList);
|
int32_t nodesStringToList(const char* pStr, SNodeList** pList);
|
||||||
|
|
||||||
|
int32_t nodesNodeToSQL(SNode *pNode, char *buf, int32_t bufSize, int32_t *len);
|
||||||
|
char *nodesGetNameFromColumnNode(SNode *pNode);
|
||||||
|
int32_t nodesGetOutputNumFromSlotList(SNodeList* pSlots);
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -104,6 +104,7 @@ typedef struct SWindowLogicNode {
|
||||||
SFillNode* pFill;
|
SFillNode* pFill;
|
||||||
int64_t sessionGap;
|
int64_t sessionGap;
|
||||||
SNode* pTspk;
|
SNode* pTspk;
|
||||||
|
SNode* pStateExpr;
|
||||||
} SWindowLogicNode;
|
} SWindowLogicNode;
|
||||||
|
|
||||||
typedef struct SSortLogicNode {
|
typedef struct SSortLogicNode {
|
||||||
|
@ -194,11 +195,20 @@ typedef struct SSystemTableScanPhysiNode {
|
||||||
int32_t accountId;
|
int32_t accountId;
|
||||||
} SSystemTableScanPhysiNode;
|
} SSystemTableScanPhysiNode;
|
||||||
|
|
||||||
|
typedef enum EScanRequired {
|
||||||
|
SCAN_REQUIRED_DATA_NO_NEEDED = 1,
|
||||||
|
SCAN_REQUIRED_DATA_STATIS_NEEDED,
|
||||||
|
SCAN_REQUIRED_DATA_ALL_NEEDED,
|
||||||
|
SCAN_REQUIRED_DATA_DISCARD,
|
||||||
|
} EScanRequired;
|
||||||
|
|
||||||
typedef struct STableScanPhysiNode {
|
typedef struct STableScanPhysiNode {
|
||||||
SScanPhysiNode scan;
|
SScanPhysiNode scan;
|
||||||
uint8_t scanFlag; // denotes reversed scan of data or not
|
uint8_t scanFlag; // denotes reversed scan of data or not
|
||||||
STimeWindow scanRange;
|
STimeWindow scanRange;
|
||||||
double ratio;
|
double ratio;
|
||||||
|
EScanRequired scanRequired;
|
||||||
|
SNodeList* pScanReferFuncs;
|
||||||
} STableScanPhysiNode;
|
} STableScanPhysiNode;
|
||||||
|
|
||||||
typedef STableScanPhysiNode STableSeqScanPhysiNode;
|
typedef STableScanPhysiNode STableSeqScanPhysiNode;
|
||||||
|
@ -257,17 +267,35 @@ typedef struct SIntervalPhysiNode {
|
||||||
SFillNode* pFill;
|
SFillNode* pFill;
|
||||||
} SIntervalPhysiNode;
|
} SIntervalPhysiNode;
|
||||||
|
|
||||||
|
typedef struct SMultiTableIntervalPhysiNode {
|
||||||
|
SIntervalPhysiNode interval;
|
||||||
|
SNodeList* pPartitionKeys;
|
||||||
|
} SMultiTableIntervalPhysiNode;
|
||||||
|
|
||||||
typedef struct SSessionWinodwPhysiNode {
|
typedef struct SSessionWinodwPhysiNode {
|
||||||
SWinodwPhysiNode window;
|
SWinodwPhysiNode window;
|
||||||
int64_t gap;
|
int64_t gap;
|
||||||
} SSessionWinodwPhysiNode;
|
} SSessionWinodwPhysiNode;
|
||||||
|
|
||||||
|
typedef struct SStateWinodwPhysiNode {
|
||||||
|
SWinodwPhysiNode window;
|
||||||
|
SNode* pStateKey;
|
||||||
|
} SStateWinodwPhysiNode;
|
||||||
|
|
||||||
typedef struct SSortPhysiNode {
|
typedef struct SSortPhysiNode {
|
||||||
SPhysiNode node;
|
SPhysiNode node;
|
||||||
SNodeList* pExprs; // these are expression list of order_by_clause and parameter expression of aggregate function
|
SNodeList* pExprs; // these are expression list of order_by_clause and parameter expression of aggregate function
|
||||||
SNodeList* pSortKeys; // element is SOrderByExprNode, and SOrderByExprNode::pExpr is SColumnNode
|
SNodeList* pSortKeys; // element is SOrderByExprNode, and SOrderByExprNode::pExpr is SColumnNode
|
||||||
|
SNodeList* pTargets;
|
||||||
} SSortPhysiNode;
|
} SSortPhysiNode;
|
||||||
|
|
||||||
|
typedef struct SPartitionPhysiNode {
|
||||||
|
SPhysiNode node;
|
||||||
|
SNodeList* pExprs; // these are expression list of partition_by_clause
|
||||||
|
SNodeList* pPartitionKeys;
|
||||||
|
SNodeList* pTargets;
|
||||||
|
} SPartitionPhysiNode;
|
||||||
|
|
||||||
typedef struct SDataSinkNode {
|
typedef struct SDataSinkNode {
|
||||||
ENodeType type;
|
ENodeType type;
|
||||||
SDataBlockDescNode* pInputDataBlockDesc;
|
SDataBlockDescNode* pInputDataBlockDesc;
|
||||||
|
@ -308,6 +336,7 @@ typedef enum EExplainMode {
|
||||||
typedef struct SExplainInfo {
|
typedef struct SExplainInfo {
|
||||||
EExplainMode mode;
|
EExplainMode mode;
|
||||||
bool verbose;
|
bool verbose;
|
||||||
|
double ratio;
|
||||||
} SExplainInfo;
|
} SExplainInfo;
|
||||||
|
|
||||||
typedef struct SQueryPlan {
|
typedef struct SQueryPlan {
|
||||||
|
|
|
@ -22,6 +22,7 @@ extern "C" {
|
||||||
|
|
||||||
#include "nodes.h"
|
#include "nodes.h"
|
||||||
#include "tmsg.h"
|
#include "tmsg.h"
|
||||||
|
#include "tvariant.h"
|
||||||
|
|
||||||
#define TABLE_TOTAL_COL_NUM(pMeta) ((pMeta)->tableInfo.numOfColumns + (pMeta)->tableInfo.numOfTags)
|
#define TABLE_TOTAL_COL_NUM(pMeta) ((pMeta)->tableInfo.numOfColumns + (pMeta)->tableInfo.numOfTags)
|
||||||
#define TABLE_META_SIZE(pMeta) (NULL == (pMeta) ? 0 : (sizeof(STableMeta) + TABLE_TOTAL_COL_NUM((pMeta)) * sizeof(SSchema)))
|
#define TABLE_META_SIZE(pMeta) (NULL == (pMeta) ? 0 : (sizeof(STableMeta) + TABLE_TOTAL_COL_NUM((pMeta)) * sizeof(SSchema)))
|
||||||
|
@ -79,6 +80,7 @@ typedef struct SValueNode {
|
||||||
char* literal;
|
char* literal;
|
||||||
bool isDuration;
|
bool isDuration;
|
||||||
bool translate;
|
bool translate;
|
||||||
|
bool genByCalc;
|
||||||
union {
|
union {
|
||||||
bool b;
|
bool b;
|
||||||
int64_t i;
|
int64_t i;
|
||||||
|
@ -122,6 +124,7 @@ typedef struct STableNode {
|
||||||
char dbName[TSDB_DB_NAME_LEN];
|
char dbName[TSDB_DB_NAME_LEN];
|
||||||
char tableName[TSDB_TABLE_NAME_LEN];
|
char tableName[TSDB_TABLE_NAME_LEN];
|
||||||
char tableAlias[TSDB_TABLE_NAME_LEN];
|
char tableAlias[TSDB_TABLE_NAME_LEN];
|
||||||
|
uint8_t precision;
|
||||||
} STableNode;
|
} STableNode;
|
||||||
|
|
||||||
struct STableMeta;
|
struct STableMeta;
|
||||||
|
@ -187,7 +190,7 @@ typedef struct SLimitNode {
|
||||||
|
|
||||||
typedef struct SStateWindowNode {
|
typedef struct SStateWindowNode {
|
||||||
ENodeType type; // QUERY_NODE_STATE_WINDOW
|
ENodeType type; // QUERY_NODE_STATE_WINDOW
|
||||||
SNode* pCol;
|
SNode* pExpr;
|
||||||
} SStateWindowNode;
|
} SStateWindowNode;
|
||||||
|
|
||||||
typedef struct SSessionWindowNode {
|
typedef struct SSessionWindowNode {
|
||||||
|
@ -234,6 +237,8 @@ typedef struct SSelectStmt {
|
||||||
SNode* pLimit;
|
SNode* pLimit;
|
||||||
SNode* pSlimit;
|
SNode* pSlimit;
|
||||||
char stmtName[TSDB_TABLE_NAME_LEN];
|
char stmtName[TSDB_TABLE_NAME_LEN];
|
||||||
|
uint8_t precision;
|
||||||
|
bool isEmptyResult;
|
||||||
} SSelectStmt;
|
} SSelectStmt;
|
||||||
|
|
||||||
typedef enum ESetOperatorType {
|
typedef enum ESetOperatorType {
|
||||||
|
@ -256,6 +261,7 @@ typedef enum ESqlClause {
|
||||||
SQL_CLAUSE_WINDOW,
|
SQL_CLAUSE_WINDOW,
|
||||||
SQL_CLAUSE_GROUP_BY,
|
SQL_CLAUSE_GROUP_BY,
|
||||||
SQL_CLAUSE_HAVING,
|
SQL_CLAUSE_HAVING,
|
||||||
|
SQL_CLAUSE_DISTINCT,
|
||||||
SQL_CLAUSE_SELECT,
|
SQL_CLAUSE_SELECT,
|
||||||
SQL_CLAUSE_ORDER_BY
|
SQL_CLAUSE_ORDER_BY
|
||||||
} ESqlClause;
|
} ESqlClause;
|
||||||
|
@ -277,7 +283,6 @@ typedef struct SVnodeModifOpStmt {
|
||||||
ENodeType nodeType;
|
ENodeType nodeType;
|
||||||
ENodeType sqlNodeType;
|
ENodeType sqlNodeType;
|
||||||
SArray* pDataBlocks; // data block for each vgroup, SArray<SVgDataBlocks*>.
|
SArray* pDataBlocks; // data block for each vgroup, SArray<SVgDataBlocks*>.
|
||||||
int8_t schemaAttache; // denote if submit block is built with table schema or not
|
|
||||||
uint8_t payloadType; // EPayloadType. 0: K-V payload for non-prepare insert, 1: rawPayload for prepare insert
|
uint8_t payloadType; // EPayloadType. 0: K-V payload for non-prepare insert, 1: rawPayload for prepare insert
|
||||||
uint32_t insertType; // insert data from [file|sql statement| bound statement]
|
uint32_t insertType; // insert data from [file|sql statement| bound statement]
|
||||||
const char* sql; // current sql statement position
|
const char* sql; // current sql statement position
|
||||||
|
@ -306,6 +311,7 @@ int32_t nodesCollectFuncs(SSelectStmt* pSelect, FFuncClassifier classifier, SNod
|
||||||
|
|
||||||
bool nodesIsExprNode(const SNode* pNode);
|
bool nodesIsExprNode(const SNode* pNode);
|
||||||
|
|
||||||
|
bool nodesIsUnaryOp(const SOperatorNode* pOp);
|
||||||
bool nodesIsArithmeticOp(const SOperatorNode* pOp);
|
bool nodesIsArithmeticOp(const SOperatorNode* pOp);
|
||||||
bool nodesIsComparisonOp(const SOperatorNode* pOp);
|
bool nodesIsComparisonOp(const SOperatorNode* pOp);
|
||||||
bool nodesIsJsonOp(const SOperatorNode* pOp);
|
bool nodesIsJsonOp(const SOperatorNode* pOp);
|
||||||
|
@ -314,6 +320,9 @@ bool nodesIsTimeorderQuery(const SNode* pQuery);
|
||||||
bool nodesIsTimelineQuery(const SNode* pQuery);
|
bool nodesIsTimelineQuery(const SNode* pQuery);
|
||||||
|
|
||||||
void* nodesGetValueFromNode(SValueNode *pNode);
|
void* nodesGetValueFromNode(SValueNode *pNode);
|
||||||
|
char* nodesGetStrValueFromNode(SValueNode *pNode);
|
||||||
|
char *getFillModeString(EFillMode mode);
|
||||||
|
void valueNodeToVariant(const SValueNode* pNode, SVariant* pVal);
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
|
|
|
@ -44,8 +44,15 @@ typedef struct SCmdMsgInfo {
|
||||||
void* pExtension; // todo remove it soon
|
void* pExtension; // todo remove it soon
|
||||||
} SCmdMsgInfo;
|
} SCmdMsgInfo;
|
||||||
|
|
||||||
|
typedef enum EQueryExecMode {
|
||||||
|
QUERY_EXEC_MODE_LOCAL = 1,
|
||||||
|
QUERY_EXEC_MODE_RPC,
|
||||||
|
QUERY_EXEC_MODE_SCHEDULE,
|
||||||
|
QUERY_EXEC_MODE_EMPTY_RESULT
|
||||||
|
} EQueryExecMode;
|
||||||
|
|
||||||
typedef struct SQuery {
|
typedef struct SQuery {
|
||||||
bool directRpc;
|
EQueryExecMode execMode;
|
||||||
bool haveResultSet;
|
bool haveResultSet;
|
||||||
SNode* pRoot;
|
SNode* pRoot;
|
||||||
int32_t numOfResCols;
|
int32_t numOfResCols;
|
||||||
|
|
|
@ -53,6 +53,7 @@ typedef struct SIndexMeta {
|
||||||
|
|
||||||
} SIndexMeta;
|
} SIndexMeta;
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* ASSERT(sizeof(SCTableMeta) == 24)
|
* ASSERT(sizeof(SCTableMeta) == 24)
|
||||||
* ASSERT(tableType == TSDB_CHILD_TABLE)
|
* ASSERT(tableType == TSDB_CHILD_TABLE)
|
||||||
|
@ -235,6 +236,11 @@ extern int32_t (*queryProcessMsgRsp[TDMT_MAX])(void* output, char* msg, int32_t
|
||||||
} \
|
} \
|
||||||
} while (0)
|
} while (0)
|
||||||
|
|
||||||
|
#define QRY_ERR_RET(c) do { int32_t _code = c; if (_code != TSDB_CODE_SUCCESS) { terrno = _code; return _code; } } while (0)
|
||||||
|
#define QRY_RET(c) do { int32_t _code = c; if (_code != TSDB_CODE_SUCCESS) { terrno = _code; } return _code; } while (0)
|
||||||
|
#define QRY_ERR_JRET(c) do { code = c; if (code != TSDB_CODE_SUCCESS) { terrno = code; goto _return; } } while (0)
|
||||||
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -40,7 +40,7 @@ extern int32_t filterInitFromNode(SNode *pNode, SFilterInfo **pinfo, uint32_t op
|
||||||
extern bool filterExecute(SFilterInfo *info, SSDataBlock *pSrc, int8_t** p, SColumnDataAgg *statis, int16_t numOfCols);
|
extern bool filterExecute(SFilterInfo *info, SSDataBlock *pSrc, int8_t** p, SColumnDataAgg *statis, int16_t numOfCols);
|
||||||
extern int32_t filterSetDataFromSlotId(SFilterInfo *info, void *param);
|
extern int32_t filterSetDataFromSlotId(SFilterInfo *info, void *param);
|
||||||
extern int32_t filterSetDataFromColId(SFilterInfo *info, void *param);
|
extern int32_t filterSetDataFromColId(SFilterInfo *info, void *param);
|
||||||
extern int32_t filterGetTimeRange(SFilterInfo *info, STimeWindow *win);
|
extern int32_t filterGetTimeRange(SNode *pNode, STimeWindow *win, bool *isStrict);
|
||||||
extern int32_t filterConverNcharColumns(SFilterInfo* pFilterInfo, int32_t rows, bool *gotNchar);
|
extern int32_t filterConverNcharColumns(SFilterInfo* pFilterInfo, int32_t rows, bool *gotNchar);
|
||||||
extern int32_t filterFreeNcharColumns(SFilterInfo* pFilterInfo);
|
extern int32_t filterFreeNcharColumns(SFilterInfo* pFilterInfo);
|
||||||
extern void filterFreeInfo(SFilterInfo *info);
|
extern void filterFreeInfo(SFilterInfo *info);
|
||||||
|
|
|
@ -42,6 +42,7 @@ int32_t scalarGenerateSetFromList(void **data, void *pNode, uint32_t type);
|
||||||
int32_t vectorGetConvertType(int32_t type1, int32_t type2);
|
int32_t vectorGetConvertType(int32_t type1, int32_t type2);
|
||||||
int32_t vectorConvertImpl(const SScalarParam* pIn, SScalarParam* pOut);
|
int32_t vectorConvertImpl(const SScalarParam* pIn, SScalarParam* pOut);
|
||||||
|
|
||||||
|
/* Math functions */
|
||||||
int32_t absFunction(SScalarParam *pInput, int32_t inputNum, SScalarParam *pOutput);
|
int32_t absFunction(SScalarParam *pInput, int32_t inputNum, SScalarParam *pOutput);
|
||||||
int32_t logFunction(SScalarParam *pInput, int32_t inputNum, SScalarParam *pOutput);
|
int32_t logFunction(SScalarParam *pInput, int32_t inputNum, SScalarParam *pOutput);
|
||||||
int32_t powFunction(SScalarParam *pInput, int32_t inputNum, SScalarParam *pOutput);
|
int32_t powFunction(SScalarParam *pInput, int32_t inputNum, SScalarParam *pOutput);
|
||||||
|
@ -58,6 +59,17 @@ int32_t ceilFunction(SScalarParam *pInput, int32_t inputNum, SScalarParam *pOutp
|
||||||
int32_t floorFunction(SScalarParam *pInput, int32_t inputNum, SScalarParam *pOutput);
|
int32_t floorFunction(SScalarParam *pInput, int32_t inputNum, SScalarParam *pOutput);
|
||||||
int32_t roundFunction(SScalarParam *pInput, int32_t inputNum, SScalarParam *pOutput);
|
int32_t roundFunction(SScalarParam *pInput, int32_t inputNum, SScalarParam *pOutput);
|
||||||
|
|
||||||
|
/* String functions */
|
||||||
|
int32_t lengthFunction(SScalarParam *pInput, int32_t inputNum, SScalarParam *pOutput);
|
||||||
|
int32_t charLengthFunction(SScalarParam *pInput, int32_t inputNum, SScalarParam *pOutput);
|
||||||
|
int32_t concatFunction(SScalarParam *pInput, int32_t inputNum, SScalarParam *pOutput);
|
||||||
|
int32_t concatWsFunction(SScalarParam *pInput, int32_t inputNum, SScalarParam *pOutput);
|
||||||
|
int32_t lowerFunction(SScalarParam *pInput, int32_t inputNum, SScalarParam *pOutput);
|
||||||
|
int32_t upperFunction(SScalarParam *pInput, int32_t inputNum, SScalarParam *pOutput);
|
||||||
|
int32_t ltrimFunction(SScalarParam *pInput, int32_t inputNum, SScalarParam *pOutput);
|
||||||
|
int32_t rtrimFunction(SScalarParam *pInput, int32_t inputNum, SScalarParam *pOutput);
|
||||||
|
int32_t substrFunction(SScalarParam *pInput, int32_t inputNum, SScalarParam *pOutput);
|
||||||
|
|
||||||
bool getTimePseudoFuncEnv(struct SFunctionNode* pFunc, SFuncExecEnv* pEnv);
|
bool getTimePseudoFuncEnv(struct SFunctionNode* pFunc, SFuncExecEnv* pEnv);
|
||||||
|
|
||||||
int32_t winStartTsFunction(SScalarParam *pInput, int32_t inputNum, SScalarParam *pOutput);
|
int32_t winStartTsFunction(SScalarParam *pInput, int32_t inputNum, SScalarParam *pOutput);
|
||||||
|
|
|
@ -71,7 +71,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 schedulerExecJob(void *transport, SArray *nodeList, SQueryPlan* pDag, int64_t* pJob, const char* sql, SQueryResult *pRes);
|
int32_t schedulerExecJob(void *transport, SArray *nodeList, SQueryPlan *pDag, int64_t *pJob, const char *sql, int64_t startTs, SQueryResult *pRes);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Process the query job, generated according to the query physical plan.
|
* Process the query job, generated according to the query physical plan.
|
||||||
|
|
|
@ -58,6 +58,9 @@ typedef struct {
|
||||||
void *pNode;
|
void *pNode;
|
||||||
} SNodeMsg;
|
} SNodeMsg;
|
||||||
|
|
||||||
|
typedef void (*RpcCfp)(void *parent, SRpcMsg *, SEpSet *);
|
||||||
|
typedef int (*RpcAfp)(void *parent, char *tableId, char *spi, char *encrypt, char *secret, char *ckey);
|
||||||
|
|
||||||
typedef struct SRpcInit {
|
typedef struct SRpcInit {
|
||||||
uint16_t localPort; // local port
|
uint16_t localPort; // local port
|
||||||
char * label; // for debug purpose
|
char * label; // for debug purpose
|
||||||
|
@ -74,10 +77,10 @@ typedef struct SRpcInit {
|
||||||
char *ckey; // ciphering key
|
char *ckey; // ciphering key
|
||||||
|
|
||||||
// call back to process incoming msg, code shall be ignored by server app
|
// call back to process incoming msg, code shall be ignored by server app
|
||||||
void (*cfp)(void *parent, SRpcMsg *, SEpSet *);
|
RpcCfp cfp;
|
||||||
|
|
||||||
// call back to retrieve the client auth info, for server app only
|
// call back to retrieve the client auth info, for server app only
|
||||||
int (*afp)(void *parent, char *tableId, char *spi, char *encrypt, char *secret, char *ckey);
|
RpcAfp afp;;
|
||||||
|
|
||||||
void *parent;
|
void *parent;
|
||||||
} SRpcInit;
|
} SRpcInit;
|
||||||
|
|
|
@ -157,6 +157,7 @@ typedef struct SWalReadHandle {
|
||||||
int64_t curVersion;
|
int64_t curVersion;
|
||||||
int64_t capacity;
|
int64_t capacity;
|
||||||
int64_t status; // if cursor valid
|
int64_t status; // if cursor valid
|
||||||
|
TdThreadMutex mutex;
|
||||||
SWalHead *pHead;
|
SWalHead *pHead;
|
||||||
} SWalReadHandle;
|
} SWalReadHandle;
|
||||||
#pragma pack(pop)
|
#pragma pack(pop)
|
||||||
|
@ -191,6 +192,7 @@ int32_t walEndSnapshot(SWal *);
|
||||||
SWalReadHandle *walOpenReadHandle(SWal *);
|
SWalReadHandle *walOpenReadHandle(SWal *);
|
||||||
void walCloseReadHandle(SWalReadHandle *);
|
void walCloseReadHandle(SWalReadHandle *);
|
||||||
int32_t walReadWithHandle(SWalReadHandle *pRead, int64_t ver);
|
int32_t walReadWithHandle(SWalReadHandle *pRead, int64_t ver);
|
||||||
|
int32_t walReadWithHandle_s(SWalReadHandle *pRead, int64_t ver, SWalReadHead **ppHead);
|
||||||
|
|
||||||
// deprecated
|
// deprecated
|
||||||
#if 0
|
#if 0
|
||||||
|
|
|
@ -56,6 +56,12 @@ extern "C" {
|
||||||
__typeof(b) __b = (b); \
|
__typeof(b) __b = (b); \
|
||||||
(__a < __b) ? __a : __b; \
|
(__a < __b) ? __a : __b; \
|
||||||
})
|
})
|
||||||
|
|
||||||
|
#define TRANGE(a, b, c) \
|
||||||
|
({ \
|
||||||
|
a = TMAX(a, b); \
|
||||||
|
a = TMIN(a, c); \
|
||||||
|
})
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
|
|
|
@ -32,13 +32,16 @@ extern "C" {
|
||||||
void *taosMemoryMalloc(int32_t size);
|
void *taosMemoryMalloc(int32_t size);
|
||||||
void *taosMemoryCalloc(int32_t num, int32_t size);
|
void *taosMemoryCalloc(int32_t num, int32_t size);
|
||||||
void *taosMemoryRealloc(void *ptr, int32_t size);
|
void *taosMemoryRealloc(void *ptr, int32_t size);
|
||||||
|
void *taosMemoryStrDup(void *ptr);
|
||||||
void taosMemoryFree(const void *ptr);
|
void taosMemoryFree(const void *ptr);
|
||||||
int32_t taosMemorySize(void *ptr);
|
int32_t taosMemorySize(void *ptr);
|
||||||
|
|
||||||
#define taosMemoryFreeClear(ptr) \
|
#define taosMemoryFreeClear(ptr) \
|
||||||
do { \
|
do { \
|
||||||
|
if (ptr) { \
|
||||||
taosMemoryFree(ptr); \
|
taosMemoryFree(ptr); \
|
||||||
(ptr) = NULL; \
|
(ptr) = NULL; \
|
||||||
|
} \
|
||||||
} while (0)
|
} while (0)
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
|
|
|
@ -20,11 +20,12 @@
|
||||||
extern "C" {
|
extern "C" {
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// start a copy of itself
|
int32_t taosNewProc(char **args);
|
||||||
int32_t taosNewProc(const char *args);
|
void taosWaitProc(int32_t pid);
|
||||||
|
void taosKillProc(int32_t pid);
|
||||||
// the length of the new name must be less than the original name to take effect
|
bool taosProcExist(int32_t pid);
|
||||||
void taosSetProcName(char **argv, const char *name);
|
void taosSetProcName(int32_t argc, char **argv, const char *name);
|
||||||
|
void taosSetProcPath(int32_t argc, char **argv);
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
|
|
|
@ -26,7 +26,7 @@ typedef struct {
|
||||||
void* ptr;
|
void* ptr;
|
||||||
} SShm;
|
} SShm;
|
||||||
|
|
||||||
int32_t taosCreateShm(SShm *pShm, int32_t shmsize) ;
|
int32_t taosCreateShm(SShm *pShm, int32_t key, int32_t shmsize) ;
|
||||||
void taosDropShm(SShm *pShm);
|
void taosDropShm(SShm *pShm);
|
||||||
int32_t taosAttachShm(SShm *pShm);
|
int32_t taosAttachShm(SShm *pShm);
|
||||||
|
|
||||||
|
|
|
@ -49,7 +49,7 @@ void taosSetSignal(int32_t signum, FSignalHandler sigfp);
|
||||||
void taosIgnSignal(int32_t signum);
|
void taosIgnSignal(int32_t signum);
|
||||||
void taosDflSignal(int32_t signum);
|
void taosDflSignal(int32_t signum);
|
||||||
|
|
||||||
void taosKillChildOnSelfStopped();
|
void taosKillChildOnParentStopped();
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
|
|
|
@ -44,8 +44,8 @@ int32_t taosGetTotalMemory(int64_t *totalKB);
|
||||||
int32_t taosGetProcMemory(int64_t *usedKB);
|
int32_t taosGetProcMemory(int64_t *usedKB);
|
||||||
int32_t taosGetSysMemory(int64_t *usedKB);
|
int32_t taosGetSysMemory(int64_t *usedKB);
|
||||||
int32_t taosGetDiskSize(char *dataDir, SDiskSize *diskSize);
|
int32_t taosGetDiskSize(char *dataDir, SDiskSize *diskSize);
|
||||||
int32_t taosGetProcIO(int64_t *rchars, int64_t *wchars, int64_t *read_bytes, int64_t *write_bytes);
|
void taosGetProcIODelta(int64_t *rchars, int64_t *wchars, int64_t *read_bytes, int64_t *write_bytes);
|
||||||
int32_t taosGetCardInfo(int64_t *receive_bytes, int64_t *transmit_bytes);
|
void taosGetCardInfoDelta(int64_t *receive_bytes, int64_t *transmit_bytes);
|
||||||
|
|
||||||
void taosKillSystem();
|
void taosKillSystem();
|
||||||
int32_t taosGetSystemUUID(char *uid, int32_t uidlen);
|
int32_t taosGetSystemUUID(char *uid, int32_t uidlen);
|
||||||
|
|
|
@ -46,6 +46,14 @@ extern "C" {
|
||||||
#define MILLISECOND_PER_DAY (MILLISECOND_PER_HOUR * 24)
|
#define MILLISECOND_PER_DAY (MILLISECOND_PER_HOUR * 24)
|
||||||
#define MILLISECOND_PER_WEEK (MILLISECOND_PER_DAY * 7)
|
#define MILLISECOND_PER_WEEK (MILLISECOND_PER_DAY * 7)
|
||||||
|
|
||||||
|
#define NANOSECOND_PER_USEC (1000L)
|
||||||
|
#define NANOSECOND_PER_MSEC (1000000L)
|
||||||
|
#define NANOSECOND_PER_SEC (1000000000L)
|
||||||
|
#define NANOSECOND_PER_MINUTE (NANOSECOND_PER_SEC * 60)
|
||||||
|
#define NANOSECOND_PER_HOUR (NANOSECOND_PER_MINUTE * 60)
|
||||||
|
#define NANOSECOND_PER_DAY (NANOSECOND_PER_HOUR * 24)
|
||||||
|
#define NANOSECOND_PER_WEEK (NANOSECOND_PER_DAY * 7)
|
||||||
|
|
||||||
int32_t taosGetTimeOfDay(struct timeval *tv);
|
int32_t taosGetTimeOfDay(struct timeval *tv);
|
||||||
|
|
||||||
//@return timestamp in second
|
//@return timestamp in second
|
||||||
|
|
|
@ -217,6 +217,7 @@ int32_t* taosGetErrno();
|
||||||
#define TSDB_CODE_MND_INVALID_DB_OPTION TAOS_DEF_ERROR_CODE(0, 0x0385)
|
#define TSDB_CODE_MND_INVALID_DB_OPTION TAOS_DEF_ERROR_CODE(0, 0x0385)
|
||||||
#define TSDB_CODE_MND_INVALID_DB_ACCT TAOS_DEF_ERROR_CODE(0, 0x0386)
|
#define TSDB_CODE_MND_INVALID_DB_ACCT TAOS_DEF_ERROR_CODE(0, 0x0386)
|
||||||
#define TSDB_CODE_MND_DB_OPTION_UNCHANGED TAOS_DEF_ERROR_CODE(0, 0x0387)
|
#define TSDB_CODE_MND_DB_OPTION_UNCHANGED TAOS_DEF_ERROR_CODE(0, 0x0387)
|
||||||
|
#define TSDB_CODE_MND_DB_INDEX_NOT_EXIST TAOS_DEF_ERROR_CODE(0, 0x0388)
|
||||||
|
|
||||||
// mnode-vgroup
|
// mnode-vgroup
|
||||||
#define TSDB_CODE_MND_VGROUP_NOT_EXIST TAOS_DEF_ERROR_CODE(0, 0x0390)
|
#define TSDB_CODE_MND_VGROUP_NOT_EXIST TAOS_DEF_ERROR_CODE(0, 0x0390)
|
||||||
|
@ -479,6 +480,24 @@ int32_t* taosGetErrno();
|
||||||
#define TSDB_CODE_PAR_INVALID_ENDPOINT TAOS_DEF_ERROR_CODE(0, 0x2613)
|
#define TSDB_CODE_PAR_INVALID_ENDPOINT TAOS_DEF_ERROR_CODE(0, 0x2613)
|
||||||
#define TSDB_CODE_PAR_EXPRIE_STATEMENT TAOS_DEF_ERROR_CODE(0, 0x2614)
|
#define TSDB_CODE_PAR_EXPRIE_STATEMENT TAOS_DEF_ERROR_CODE(0, 0x2614)
|
||||||
#define TSDB_CODE_PAR_INTERVAL_VALUE_TOO_SMALL TAOS_DEF_ERROR_CODE(0, 0x2615)
|
#define TSDB_CODE_PAR_INTERVAL_VALUE_TOO_SMALL TAOS_DEF_ERROR_CODE(0, 0x2615)
|
||||||
|
#define TSDB_CODE_PAR_DB_NOT_SPECIFIED TAOS_DEF_ERROR_CODE(0, 0x2616)
|
||||||
|
#define TSDB_CODE_PAR_INVALID_IDENTIFIER_NAME TAOS_DEF_ERROR_CODE(0, 0x2617)
|
||||||
|
#define TSDB_CODE_PAR_CORRESPONDING_STABLE_ERR TAOS_DEF_ERROR_CODE(0, 0x2618)
|
||||||
|
#define TSDB_CODE_PAR_INVALID_RANGE_OPTION TAOS_DEF_ERROR_CODE(0, 0x2619)
|
||||||
|
#define TSDB_CODE_PAR_INVALID_STR_OPTION TAOS_DEF_ERROR_CODE(0, 0x261A)
|
||||||
|
#define TSDB_CODE_PAR_INVALID_ENUM_OPTION TAOS_DEF_ERROR_CODE(0, 0x261B)
|
||||||
|
#define TSDB_CODE_PAR_INVALID_TTL_OPTION TAOS_DEF_ERROR_CODE(0, 0x261C)
|
||||||
|
#define TSDB_CODE_PAR_INVALID_KEEP_NUM TAOS_DEF_ERROR_CODE(0, 0x261D)
|
||||||
|
#define TSDB_CODE_PAR_INVALID_KEEP_ORDER TAOS_DEF_ERROR_CODE(0, 0x261E)
|
||||||
|
#define TSDB_CODE_PAR_INVALID_KEEP_VALUE TAOS_DEF_ERROR_CODE(0, 0x261F)
|
||||||
|
#define TSDB_CODE_PAR_INVALID_COMMENT_OPTION TAOS_DEF_ERROR_CODE(0, 0x2620)
|
||||||
|
#define TSDB_CODE_PAR_INVALID_F_RANGE_OPTION TAOS_DEF_ERROR_CODE(0, 0x2621)
|
||||||
|
#define TSDB_CODE_PAR_INVALID_ROLLUP_OPTION TAOS_DEF_ERROR_CODE(0, 0x2622)
|
||||||
|
#define TSDB_CODE_PAR_INVALID_RETENTIONS_OPTION TAOS_DEF_ERROR_CODE(0, 0x2623)
|
||||||
|
#define TSDB_CODE_PAR_GROUPBY_WINDOW_COEXIST TAOS_DEF_ERROR_CODE(0, 0x2624)
|
||||||
|
|
||||||
|
//planner
|
||||||
|
#define TSDB_CODE_PLAN_INTERNAL_ERROR TAOS_DEF_ERROR_CODE(0, 0x2700)
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
|
|
|
@ -57,6 +57,8 @@ static FORCE_INLINE void *taosDecodeFixedI8(const void *buf, int8_t *value) {
|
||||||
return POINTER_SHIFT(buf, sizeof(*value));
|
return POINTER_SHIFT(buf, sizeof(*value));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static FORCE_INLINE void *taosSkipFixedLen(const void *buf, size_t len) { return POINTER_SHIFT(buf, len); }
|
||||||
|
|
||||||
// ---- Fixed U16
|
// ---- Fixed U16
|
||||||
static FORCE_INLINE int32_t taosEncodeFixedU16(void **buf, uint16_t value) {
|
static FORCE_INLINE int32_t taosEncodeFixedU16(void **buf, uint16_t value) {
|
||||||
if (buf != NULL) {
|
if (buf != NULL) {
|
||||||
|
|
|
@ -109,6 +109,9 @@ extern const int32_t TYPE_BYTES[15];
|
||||||
#define TSDB_INS_TABLE_USER_USERS "user_users"
|
#define TSDB_INS_TABLE_USER_USERS "user_users"
|
||||||
#define TSDB_INS_TABLE_VGROUPS "vgroups"
|
#define TSDB_INS_TABLE_VGROUPS "vgroups"
|
||||||
|
|
||||||
|
#define TSDB_INDEX_TYPE_SMA "SMA"
|
||||||
|
#define TSDB_INDEX_TYPE_FULLTEXT "FULLTEXT"
|
||||||
|
|
||||||
#define TSDB_INS_USER_STABLES_DBNAME_COLID 2
|
#define TSDB_INS_USER_STABLES_DBNAME_COLID 2
|
||||||
|
|
||||||
#define TSDB_TICK_PER_SECOND(precision) \
|
#define TSDB_TICK_PER_SECOND(precision) \
|
||||||
|
@ -128,18 +131,20 @@ extern const int32_t TYPE_BYTES[15];
|
||||||
} while (0)
|
} while (0)
|
||||||
|
|
||||||
typedef enum EOperatorType {
|
typedef enum EOperatorType {
|
||||||
// arithmetic operator
|
// binary arithmetic operator
|
||||||
OP_TYPE_ADD = 1,
|
OP_TYPE_ADD = 1,
|
||||||
OP_TYPE_SUB,
|
OP_TYPE_SUB,
|
||||||
OP_TYPE_MULTI,
|
OP_TYPE_MULTI,
|
||||||
OP_TYPE_DIV,
|
OP_TYPE_DIV,
|
||||||
OP_TYPE_MOD,
|
OP_TYPE_MOD,
|
||||||
|
// unary arithmetic operator
|
||||||
|
OP_TYPE_MINUS,
|
||||||
|
|
||||||
// bit operator
|
// bit operator
|
||||||
OP_TYPE_BIT_AND,
|
OP_TYPE_BIT_AND,
|
||||||
OP_TYPE_BIT_OR,
|
OP_TYPE_BIT_OR,
|
||||||
|
|
||||||
// comparison operator
|
// binary comparison operator
|
||||||
OP_TYPE_GREATER_THAN,
|
OP_TYPE_GREATER_THAN,
|
||||||
OP_TYPE_GREATER_EQUAL,
|
OP_TYPE_GREATER_EQUAL,
|
||||||
OP_TYPE_LOWER_THAN,
|
OP_TYPE_LOWER_THAN,
|
||||||
|
@ -152,6 +157,7 @@ typedef enum EOperatorType {
|
||||||
OP_TYPE_NOT_LIKE,
|
OP_TYPE_NOT_LIKE,
|
||||||
OP_TYPE_MATCH,
|
OP_TYPE_MATCH,
|
||||||
OP_TYPE_NMATCH,
|
OP_TYPE_NMATCH,
|
||||||
|
// unary comparison operator
|
||||||
OP_TYPE_IS_NULL,
|
OP_TYPE_IS_NULL,
|
||||||
OP_TYPE_IS_NOT_NULL,
|
OP_TYPE_IS_NOT_NULL,
|
||||||
OP_TYPE_IS_TRUE,
|
OP_TYPE_IS_TRUE,
|
||||||
|
@ -210,6 +216,9 @@ typedef enum ELogicConditionType {
|
||||||
#define TSDB_FUNC_MAX_RETRIEVE 1024
|
#define TSDB_FUNC_MAX_RETRIEVE 1024
|
||||||
|
|
||||||
#define TSDB_INDEX_NAME_LEN 65 // 64 + 1 '\0'
|
#define TSDB_INDEX_NAME_LEN 65 // 64 + 1 '\0'
|
||||||
|
#define TSDB_INDEX_TYPE_LEN 10
|
||||||
|
#define TSDB_INDEX_EXTS_LEN 256
|
||||||
|
#define TSDB_INDEX_FNAME_LEN (TSDB_DB_FNAME_LEN + TSDB_INDEX_NAME_LEN + TSDB_NAME_DELIMITER_LEN)
|
||||||
#define TSDB_TYPE_STR_MAX_LEN 32
|
#define TSDB_TYPE_STR_MAX_LEN 32
|
||||||
#define TSDB_TABLE_FNAME_LEN (TSDB_DB_FNAME_LEN + TSDB_TABLE_NAME_LEN + TSDB_NAME_DELIMITER_LEN)
|
#define TSDB_TABLE_FNAME_LEN (TSDB_DB_FNAME_LEN + TSDB_TABLE_NAME_LEN + TSDB_NAME_DELIMITER_LEN)
|
||||||
#define TSDB_TOPIC_FNAME_LEN TSDB_TABLE_FNAME_LEN
|
#define TSDB_TOPIC_FNAME_LEN TSDB_TABLE_FNAME_LEN
|
||||||
|
@ -224,6 +233,7 @@ typedef enum ELogicConditionType {
|
||||||
|
|
||||||
#define TSDB_APP_NAME_LEN TSDB_UNI_LEN
|
#define TSDB_APP_NAME_LEN TSDB_UNI_LEN
|
||||||
#define TSDB_STB_COMMENT_LEN 1024
|
#define TSDB_STB_COMMENT_LEN 1024
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* In some scenarios uint16_t (0~65535) is used to store the row len.
|
* In some scenarios uint16_t (0~65535) is used to store the row len.
|
||||||
* - Firstly, we use 65531(65535 - 4), as the SDataRow/SKVRow contains 4 bits header.
|
* - Firstly, we use 65531(65535 - 4), as the SDataRow/SKVRow contains 4 bits header.
|
||||||
|
@ -303,13 +313,13 @@ typedef enum ELogicConditionType {
|
||||||
#define TSDB_MAX_TOTAL_BLOCKS 10000
|
#define TSDB_MAX_TOTAL_BLOCKS 10000
|
||||||
#define TSDB_DEFAULT_TOTAL_BLOCKS 6
|
#define TSDB_DEFAULT_TOTAL_BLOCKS 6
|
||||||
|
|
||||||
#define TSDB_MIN_DAYS_PER_FILE 1
|
#define TSDB_MIN_DAYS_PER_FILE 60 // unit minute
|
||||||
#define TSDB_MAX_DAYS_PER_FILE 3650
|
#define TSDB_MAX_DAYS_PER_FILE (3650 * 1440)
|
||||||
#define TSDB_DEFAULT_DAYS_PER_FILE 10
|
#define TSDB_DEFAULT_DAYS_PER_FILE (10 * 1440)
|
||||||
|
|
||||||
#define TSDB_MIN_KEEP 1 // data in db to be reserved.
|
#define TSDB_MIN_KEEP (1 * 1440) // data in db to be reserved. unit minute
|
||||||
#define TSDB_MAX_KEEP 365000 // data in db to be reserved.
|
#define TSDB_MAX_KEEP (365000 * 1440) // data in db to be reserved.
|
||||||
#define TSDB_DEFAULT_KEEP 3650 // ten years
|
#define TSDB_DEFAULT_KEEP (3650 * 1440) // ten years
|
||||||
|
|
||||||
#define TSDB_MIN_MIN_ROW_FBLOCK 10
|
#define TSDB_MIN_MIN_ROW_FBLOCK 10
|
||||||
#define TSDB_MAX_MIN_ROW_FBLOCK 1000
|
#define TSDB_MAX_MIN_ROW_FBLOCK 1000
|
||||||
|
@ -327,7 +337,7 @@ typedef enum ELogicConditionType {
|
||||||
#define TSDB_MAX_FSYNC_PERIOD 180000 // millisecond
|
#define TSDB_MAX_FSYNC_PERIOD 180000 // millisecond
|
||||||
#define TSDB_DEFAULT_FSYNC_PERIOD 3000 // three second
|
#define TSDB_DEFAULT_FSYNC_PERIOD 3000 // three second
|
||||||
|
|
||||||
#define TSDB_MIN_WAL_LEVEL 0
|
#define TSDB_MIN_WAL_LEVEL 1
|
||||||
#define TSDB_MAX_WAL_LEVEL 2
|
#define TSDB_MAX_WAL_LEVEL 2
|
||||||
#define TSDB_DEFAULT_WAL_LEVEL 1
|
#define TSDB_DEFAULT_WAL_LEVEL 1
|
||||||
|
|
||||||
|
@ -388,6 +398,7 @@ typedef enum ELogicConditionType {
|
||||||
#define TSDB_DEFAULT_EXPLAIN_RATIO 0.001
|
#define TSDB_DEFAULT_EXPLAIN_RATIO 0.001
|
||||||
|
|
||||||
#define TSDB_EXPLAIN_RESULT_ROW_SIZE 1024
|
#define TSDB_EXPLAIN_RESULT_ROW_SIZE 1024
|
||||||
|
#define TSDB_EXPLAIN_RESULT_COLUMN_NAME "QUERY PLAN"
|
||||||
|
|
||||||
#define TSDB_MAX_JOIN_TABLE_NUM 10
|
#define TSDB_MAX_JOIN_TABLE_NUM 10
|
||||||
#define TSDB_MAX_UNION_CLAUSE 5
|
#define TSDB_MAX_UNION_CLAUSE 5
|
||||||
|
@ -467,17 +478,17 @@ typedef struct {
|
||||||
|
|
||||||
#define TMQ_SEPARATOR ':'
|
#define TMQ_SEPARATOR ':'
|
||||||
|
|
||||||
#define SND_UNIQUE_THREAD_NUM 2
|
|
||||||
#define SND_SHARED_THREAD_NUM 2
|
|
||||||
|
|
||||||
enum {
|
enum {
|
||||||
SND_WORKER_TYPE__SHARED = 1,
|
SND_WORKER_TYPE__SHARED = 1,
|
||||||
SND_WORKER_TYPE__UNIQUE,
|
SND_WORKER_TYPE__UNIQUE,
|
||||||
};
|
};
|
||||||
|
|
||||||
#define MND_VGID -1
|
#define MNODE_HANDLE -1
|
||||||
#define QND_VGID 1
|
#define QNODE_HANDLE 1
|
||||||
#define VND_VGID 0
|
#define DEFAULT_HANDLE 0
|
||||||
|
|
||||||
|
#define MAX_NUM_STR_SIZE 40
|
||||||
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
|
|
|
@ -76,6 +76,7 @@ void taosWLockLatch(SRWLatch *pLatch);
|
||||||
void taosWUnLockLatch(SRWLatch *pLatch);
|
void taosWUnLockLatch(SRWLatch *pLatch);
|
||||||
void taosRLockLatch(SRWLatch *pLatch);
|
void taosRLockLatch(SRWLatch *pLatch);
|
||||||
void taosRUnLockLatch(SRWLatch *pLatch);
|
void taosRUnLockLatch(SRWLatch *pLatch);
|
||||||
|
int32_t taosWTryLockLatch(SRWLatch *pLatch);
|
||||||
|
|
||||||
// copy on read
|
// copy on read
|
||||||
#define taosCorBeginRead(x) \
|
#define taosCorBeginRead(x) \
|
||||||
|
|
|
@ -22,13 +22,12 @@
|
||||||
extern "C" {
|
extern "C" {
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
typedef enum { PROC_REQ, PROC_RSP, PROC_REG, PROC_RELEASE } ProcFuncType;
|
typedef enum { PROC_REQ = 1, PROC_RSP, PROC_REGIST, PROC_RELEASE } ProcFuncType;
|
||||||
|
|
||||||
typedef struct SProcQueue SProcQueue;
|
|
||||||
typedef struct SProcObj SProcObj;
|
typedef struct SProcObj SProcObj;
|
||||||
typedef void *(*ProcMallocFp)(int32_t contLen);
|
typedef void *(*ProcMallocFp)(int32_t contLen);
|
||||||
typedef void *(*ProcFreeFp)(void *pCont);
|
typedef void *(*ProcFreeFp)(void *pCont);
|
||||||
typedef void *(*ProcConsumeFp)(void *pParent, void *pHead, int16_t headLen, void *pBody, int32_t bodyLen,
|
typedef void (*ProcConsumeFp)(void *parent, void *pHead, int16_t headLen, void *pBody, int32_t bodyLen,
|
||||||
ProcFuncType ftype);
|
ProcFuncType ftype);
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
|
@ -43,7 +42,7 @@ typedef struct {
|
||||||
ProcMallocFp parentMallocBodyFp;
|
ProcMallocFp parentMallocBodyFp;
|
||||||
ProcFreeFp parentFreeBodyFp;
|
ProcFreeFp parentFreeBodyFp;
|
||||||
SShm shm;
|
SShm shm;
|
||||||
void *pParent;
|
void *parent;
|
||||||
const char *name;
|
const char *name;
|
||||||
bool isChild;
|
bool isChild;
|
||||||
} SProcCfg;
|
} SProcCfg;
|
||||||
|
@ -51,9 +50,13 @@ typedef struct {
|
||||||
SProcObj *taosProcInit(const SProcCfg *pCfg);
|
SProcObj *taosProcInit(const SProcCfg *pCfg);
|
||||||
void taosProcCleanup(SProcObj *pProc);
|
void taosProcCleanup(SProcObj *pProc);
|
||||||
int32_t taosProcRun(SProcObj *pProc);
|
int32_t taosProcRun(SProcObj *pProc);
|
||||||
|
void taosProcStop(SProcObj *pProc);
|
||||||
|
|
||||||
int32_t taosProcPutToChildQ(SProcObj *pProc, const void *pHead, int16_t headLen, const void *pBody, int32_t bodyLen,
|
int32_t taosProcPutToChildQ(SProcObj *pProc, const void *pHead, int16_t headLen, const void *pBody, int32_t bodyLen,
|
||||||
ProcFuncType ftype);
|
void *handle, ProcFuncType ftype);
|
||||||
int32_t taosProcPutToParentQ(SProcObj *pProc, const void *pHead, int16_t headLen, const void *pBody, int32_t bodyLen,
|
void taosProcRemoveHandle(SProcObj *pProc, void *handle);
|
||||||
|
void taosProcCloseHandles(SProcObj *pProc, void (*HandleFp)(void *handle));
|
||||||
|
void taosProcPutToParentQ(SProcObj *pProc, const void *pHead, int16_t headLen, const void *pBody, int32_t bodyLen,
|
||||||
ProcFuncType ftype);
|
ProcFuncType ftype);
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
|
|
|
@ -0,0 +1,536 @@
|
||||||
|
#!/bin/bash
|
||||||
|
#
|
||||||
|
# This file is used to install database on linux systems. The operating system
|
||||||
|
# is required to use systemd to manage services at boot
|
||||||
|
|
||||||
|
set -e
|
||||||
|
#set -x
|
||||||
|
|
||||||
|
# -----------------------Variables definition---------------------
|
||||||
|
script_dir=$(dirname $(readlink -f "$0"))
|
||||||
|
# Dynamic directory
|
||||||
|
data_dir="/var/lib/taos"
|
||||||
|
log_dir="/var/log/taos"
|
||||||
|
|
||||||
|
data_link_dir="/usr/local/taos/data"
|
||||||
|
log_link_dir="/usr/local/taos/log"
|
||||||
|
|
||||||
|
cfg_install_dir="/etc/taos"
|
||||||
|
|
||||||
|
bin_link_dir="/usr/bin"
|
||||||
|
lib_link_dir="/usr/lib"
|
||||||
|
lib64_link_dir="/usr/lib64"
|
||||||
|
inc_link_dir="/usr/include"
|
||||||
|
|
||||||
|
#install main path
|
||||||
|
install_main_dir="/usr/local/taos"
|
||||||
|
|
||||||
|
# old bin dir
|
||||||
|
bin_dir="/usr/local/taos/bin"
|
||||||
|
|
||||||
|
service_config_dir="/etc/systemd/system"
|
||||||
|
|
||||||
|
# Color setting
|
||||||
|
RED='\033[0;31m'
|
||||||
|
GREEN='\033[1;32m'
|
||||||
|
GREEN_DARK='\033[0;32m'
|
||||||
|
GREEN_UNDERLINE='\033[4;32m'
|
||||||
|
NC='\033[0m'
|
||||||
|
|
||||||
|
csudo=""
|
||||||
|
if command -v sudo > /dev/null; then
|
||||||
|
csudo="sudo"
|
||||||
|
fi
|
||||||
|
|
||||||
|
update_flag=0
|
||||||
|
prompt_force=0
|
||||||
|
|
||||||
|
initd_mod=0
|
||||||
|
service_mod=2
|
||||||
|
if pidof systemd &> /dev/null; then
|
||||||
|
service_mod=0
|
||||||
|
elif $(which service &> /dev/null); then
|
||||||
|
service_mod=1
|
||||||
|
service_config_dir="/etc/init.d"
|
||||||
|
if $(which chkconfig &> /dev/null); then
|
||||||
|
initd_mod=1
|
||||||
|
elif $(which insserv &> /dev/null); then
|
||||||
|
initd_mod=2
|
||||||
|
elif $(which update-rc.d &> /dev/null); then
|
||||||
|
initd_mod=3
|
||||||
|
else
|
||||||
|
service_mod=2
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
service_mod=2
|
||||||
|
fi
|
||||||
|
|
||||||
|
|
||||||
|
# get the operating system type for using the corresponding init file
|
||||||
|
# ubuntu/debian(deb), centos/fedora(rpm), others: opensuse, redhat, ..., no verification
|
||||||
|
#osinfo=$(awk -F= '/^NAME/{print $2}' /etc/os-release)
|
||||||
|
if [[ -e /etc/os-release ]]; then
|
||||||
|
osinfo=$(cat /etc/os-release | grep "NAME" | cut -d '"' -f2) ||:
|
||||||
|
else
|
||||||
|
osinfo=""
|
||||||
|
fi
|
||||||
|
#echo "osinfo: ${osinfo}"
|
||||||
|
os_type=0
|
||||||
|
if echo $osinfo | grep -qwi "ubuntu" ; then
|
||||||
|
# echo "This is ubuntu system"
|
||||||
|
os_type=1
|
||||||
|
elif echo $osinfo | grep -qwi "debian" ; then
|
||||||
|
# echo "This is debian system"
|
||||||
|
os_type=1
|
||||||
|
elif echo $osinfo | grep -qwi "Kylin" ; then
|
||||||
|
# echo "This is Kylin system"
|
||||||
|
os_type=1
|
||||||
|
elif echo $osinfo | grep -qwi "centos" ; then
|
||||||
|
# echo "This is centos system"
|
||||||
|
os_type=2
|
||||||
|
elif echo $osinfo | grep -qwi "fedora" ; then
|
||||||
|
# echo "This is fedora system"
|
||||||
|
os_type=2
|
||||||
|
elif echo $osinfo | grep -qwi "Linx" ; then
|
||||||
|
# echo "This is Linx system"
|
||||||
|
os_type=1
|
||||||
|
service_mod=0
|
||||||
|
initd_mod=0
|
||||||
|
service_config_dir="/etc/systemd/system"
|
||||||
|
else
|
||||||
|
echo " osinfo: ${osinfo}"
|
||||||
|
echo " This is an officially unverified linux system,"
|
||||||
|
echo " if there are any problems with the installation and operation, "
|
||||||
|
echo " please feel free to contact taosdata.com for support."
|
||||||
|
os_type=1
|
||||||
|
fi
|
||||||
|
|
||||||
|
|
||||||
|
# ============================= get input parameters =================================================
|
||||||
|
|
||||||
|
# install.sh -v [server | client] -e [yes | no] -i [systemd | service | ...]
|
||||||
|
|
||||||
|
# set parameters by default value
|
||||||
|
interactiveFqdn=yes # [yes | no]
|
||||||
|
verType=server # [server | client]
|
||||||
|
initType=systemd # [systemd | service | ...]
|
||||||
|
|
||||||
|
while getopts "hv:e:i:" arg
|
||||||
|
do
|
||||||
|
case $arg in
|
||||||
|
e)
|
||||||
|
#echo "interactiveFqdn=$OPTARG"
|
||||||
|
interactiveFqdn=$( echo $OPTARG )
|
||||||
|
;;
|
||||||
|
v)
|
||||||
|
#echo "verType=$OPTARG"
|
||||||
|
verType=$(echo $OPTARG)
|
||||||
|
;;
|
||||||
|
i)
|
||||||
|
#echo "initType=$OPTARG"
|
||||||
|
initType=$(echo $OPTARG)
|
||||||
|
;;
|
||||||
|
h)
|
||||||
|
echo "Usage: `basename $0` -v [server | client] -e [yes | no]"
|
||||||
|
exit 0
|
||||||
|
;;
|
||||||
|
?) #unknow option
|
||||||
|
echo "unkonw argument"
|
||||||
|
exit 1
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
done
|
||||||
|
|
||||||
|
#echo "verType=${verType} interactiveFqdn=${interactiveFqdn}"
|
||||||
|
|
||||||
|
function kill_process() {
|
||||||
|
pid=$(ps -ef | grep "$1" | grep -v "grep" | awk '{print $2}')
|
||||||
|
if [ -n "$pid" ]; then
|
||||||
|
${csudo} kill -9 $pid || :
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
function install_main_path() {
|
||||||
|
#create install main dir and all sub dir
|
||||||
|
${csudo} rm -rf ${install_main_dir} || :
|
||||||
|
${csudo} mkdir -p ${install_main_dir}
|
||||||
|
${csudo} mkdir -p ${install_main_dir}/cfg
|
||||||
|
${csudo} mkdir -p ${install_main_dir}/bin
|
||||||
|
${csudo} mkdir -p ${install_main_dir}/connector
|
||||||
|
${csudo} mkdir -p ${install_main_dir}/driver
|
||||||
|
${csudo} mkdir -p ${install_main_dir}/examples
|
||||||
|
${csudo} mkdir -p ${install_main_dir}/include
|
||||||
|
${csudo} mkdir -p ${install_main_dir}/init.d
|
||||||
|
if [ "$verMode" == "cluster" ]; then
|
||||||
|
${csudo} mkdir -p ${nginx_dir}
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [[ -e ${script_dir}/email ]]; then
|
||||||
|
${csudo} cp ${script_dir}/email ${install_main_dir}/ ||:
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
function install_bin() {
|
||||||
|
# Remove links
|
||||||
|
${csudo} rm -f ${bin_link_dir}/taos || :
|
||||||
|
${csudo} rm -f ${bin_link_dir}/taosd || :
|
||||||
|
${csudo} rm -f ${bin_link_dir}/taosadapter || :
|
||||||
|
${csudo} rm -f ${bin_link_dir}/create_table || :
|
||||||
|
${csudo} rm -f ${bin_link_dir}/tmq_sim || :
|
||||||
|
${csudo} rm -f ${bin_link_dir}/taosdump || :
|
||||||
|
${csudo} rm -f ${bin_link_dir}/rmtaos || :
|
||||||
|
#${csudo} rm -f ${bin_link_dir}/set_core || :
|
||||||
|
|
||||||
|
${csudo} cp -r ${script_dir}/bin/* ${install_main_dir}/bin && ${csudo} chmod 0555 ${install_main_dir}/bin/*
|
||||||
|
|
||||||
|
#Make link
|
||||||
|
[ -x ${install_main_dir}/bin/taos ] && ${csudo} ln -s ${install_main_dir}/bin/taos ${bin_link_dir}/taos || :
|
||||||
|
[ -x ${install_main_dir}/bin/taosd ] && ${csudo} ln -s ${install_main_dir}/bin/taosd ${bin_link_dir}/taosd || :
|
||||||
|
[ -x ${install_main_dir}/bin/create_table ] && ${csudo} ln -s ${install_main_dir}/bin/create_table ${bin_link_dir}/create_table || :
|
||||||
|
[ -x ${install_main_dir}/bin/tmq_sim ] && ${csudo} ln -s ${install_main_dir}/bin/tmq_sim ${bin_link_dir}/tmq_sim || :
|
||||||
|
# [ -x ${install_main_dir}/bin/taosdemo ] && ${csudo} ln -s ${install_main_dir}/bin/taosdemo ${bin_link_dir}/taosdemo || :
|
||||||
|
# [ -x ${install_main_dir}/bin/taosdump ] && ${csudo} ln -s ${install_main_dir}/bin/taosdump ${bin_link_dir}/taosdump || :
|
||||||
|
[ -x ${install_main_dir}/bin/remove.sh ] && ${csudo} ln -s ${install_main_dir}/bin/remove.sh ${bin_link_dir}/rmtaos || :
|
||||||
|
# [ -x ${install_main_dir}/bin/set_core.sh ] && ${csudo} ln -s ${install_main_dir}/bin/set_core.sh ${bin_link_dir}/set_core || :
|
||||||
|
}
|
||||||
|
|
||||||
|
function install_lib() {
|
||||||
|
# Remove links
|
||||||
|
${csudo} rm -f ${lib_link_dir}/libtaos.* || :
|
||||||
|
${csudo} rm -f ${lib64_link_dir}/libtaos.* || :
|
||||||
|
|
||||||
|
${csudo} ln -s ${install_main_dir}/lib/libtaos.* ${lib_link_dir}/libtaos.so.1
|
||||||
|
${csudo} ln -s ${lib_link_dir}/libtaos.so.1 ${lib_link_dir}/libtaos.so
|
||||||
|
|
||||||
|
${csudo} ln -s ${install_main_dir}/lib/libtdb.* ${lib_link_dir}/libtdb.so.1
|
||||||
|
${csudo} ln -s ${lib_link_dir}/libtdb.so.1 ${lib_link_dir}/libtdb.so
|
||||||
|
|
||||||
|
if [[ -d ${lib64_link_dir} && ! -e ${lib64_link_dir}/libtaos.so ]]; then
|
||||||
|
${csudo} ln -s ${install_main_dir}/lib/libtaos.* ${lib64_link_dir}/libtaos.so.1 || :
|
||||||
|
${csudo} ln -s ${lib64_link_dir}/libtaos.so.1 ${lib64_link_dir}/libtaos.so || :
|
||||||
|
|
||||||
|
${csudo} ln -s ${install_main_dir}/lib/libtdb.* ${lib64_link_dir}/libtdb.so.1 || :
|
||||||
|
${csudo} ln -s ${lib64_link_dir}/libtdb.so.1 ${lib64_link_dir}/libtdb.so || :
|
||||||
|
fi
|
||||||
|
|
||||||
|
${csudo} ldconfig
|
||||||
|
}
|
||||||
|
|
||||||
|
function install_header() {
|
||||||
|
${csudo} rm -f ${inc_link_dir}/taos.h ${inc_link_dir}/taosdef.h ${inc_link_dir}/taoserror.h || :
|
||||||
|
${csudo} cp -f ${script_dir}/inc/* ${install_main_dir}/include && ${csudo} chmod 644 ${install_main_dir}/include/*
|
||||||
|
${csudo} ln -s ${install_main_dir}/include/taos.h ${inc_link_dir}/taos.h
|
||||||
|
# ${csudo} ln -s ${install_main_dir}/include/taosdef.h ${inc_link_dir}/taosdef.h
|
||||||
|
${csudo} ln -s ${install_main_dir}/include/taoserror.h ${inc_link_dir}/taoserror.h
|
||||||
|
}
|
||||||
|
|
||||||
|
function add_newHostname_to_hosts() {
|
||||||
|
localIp="127.0.0.1"
|
||||||
|
OLD_IFS="$IFS"
|
||||||
|
IFS=" "
|
||||||
|
iphost=$(cat /etc/hosts | grep $1 | awk '{print $1}')
|
||||||
|
arr=($iphost)
|
||||||
|
IFS="$OLD_IFS"
|
||||||
|
for s in "${arr[@]}"
|
||||||
|
do
|
||||||
|
if [[ "$s" == "$localIp" ]]; then
|
||||||
|
return
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
${csudo} echo "127.0.0.1 $1" >> /etc/hosts ||:
|
||||||
|
}
|
||||||
|
|
||||||
|
function set_hostname() {
|
||||||
|
echo -e -n "${GREEN}Please enter one hostname(must not be 'localhost')${NC}:"
|
||||||
|
read newHostname
|
||||||
|
while true; do
|
||||||
|
if [[ ! -z "$newHostname" && "$newHostname" != "localhost" ]]; then
|
||||||
|
break
|
||||||
|
else
|
||||||
|
read -p "Please enter one hostname(must not be 'localhost'):" newHostname
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
|
||||||
|
${csudo} hostname $newHostname ||:
|
||||||
|
retval=`echo $?`
|
||||||
|
if [[ $retval != 0 ]]; then
|
||||||
|
echo
|
||||||
|
echo "set hostname fail!"
|
||||||
|
return
|
||||||
|
fi
|
||||||
|
#echo -e -n "$(hostnamectl status --static)"
|
||||||
|
#echo -e -n "$(hostnamectl status --transient)"
|
||||||
|
#echo -e -n "$(hostnamectl status --pretty)"
|
||||||
|
|
||||||
|
#ubuntu/centos /etc/hostname
|
||||||
|
if [[ -e /etc/hostname ]]; then
|
||||||
|
${csudo} echo $newHostname > /etc/hostname ||:
|
||||||
|
fi
|
||||||
|
|
||||||
|
#debian: #HOSTNAME=yourname
|
||||||
|
if [[ -e /etc/sysconfig/network ]]; then
|
||||||
|
${csudo} sed -i -r "s/#*\s*(HOSTNAME=\s*).*/\1$newHostname/" /etc/sysconfig/network ||:
|
||||||
|
fi
|
||||||
|
|
||||||
|
${csudo} sed -i -r "s/#*\s*(fqdn\s*).*/\1$newHostname/" ${cfg_install_dir}/taos.cfg
|
||||||
|
serverFqdn=$newHostname
|
||||||
|
|
||||||
|
if [[ -e /etc/hosts ]]; then
|
||||||
|
add_newHostname_to_hosts $newHostname
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
function is_correct_ipaddr() {
|
||||||
|
newIp=$1
|
||||||
|
OLD_IFS="$IFS"
|
||||||
|
IFS=" "
|
||||||
|
arr=($iplist)
|
||||||
|
IFS="$OLD_IFS"
|
||||||
|
for s in "${arr[@]}"
|
||||||
|
do
|
||||||
|
if [[ "$s" == "$newIp" ]]; then
|
||||||
|
return 0
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
|
||||||
|
return 1
|
||||||
|
}
|
||||||
|
|
||||||
|
function set_ipAsFqdn() {
|
||||||
|
iplist=$(ip address |grep inet |grep -v inet6 |grep -v 127.0.0.1 |awk '{print $2}' |awk -F "/" '{print $1}') ||:
|
||||||
|
if [ -z "$iplist" ]; then
|
||||||
|
iplist=$(ifconfig |grep inet |grep -v inet6 |grep -v 127.0.0.1 |awk '{print $2}' |awk -F ":" '{print $2}') ||:
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ -z "$iplist" ]; then
|
||||||
|
echo
|
||||||
|
echo -e -n "${GREEN}Unable to get local ip, use 127.0.0.1${NC}"
|
||||||
|
localFqdn="127.0.0.1"
|
||||||
|
# Write the local FQDN to configuration file
|
||||||
|
${csudo} sed -i -r "s/#*\s*(fqdn\s*).*/\1$localFqdn/" ${cfg_install_dir}/taos.cfg
|
||||||
|
serverFqdn=$localFqdn
|
||||||
|
echo
|
||||||
|
return
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo -e -n "${GREEN}Please choose an IP from local IP list${NC}:"
|
||||||
|
echo
|
||||||
|
echo -e -n "${GREEN}$iplist${NC}"
|
||||||
|
echo
|
||||||
|
echo
|
||||||
|
echo -e -n "${GREEN}Notes: if IP is used as the node name, data can NOT be migrated to other machine directly${NC}:"
|
||||||
|
read localFqdn
|
||||||
|
while true; do
|
||||||
|
if [ ! -z "$localFqdn" ]; then
|
||||||
|
# Check if correct ip address
|
||||||
|
is_correct_ipaddr $localFqdn
|
||||||
|
retval=`echo $?`
|
||||||
|
if [[ $retval != 0 ]]; then
|
||||||
|
read -p "Please choose an IP from local IP list:" localFqdn
|
||||||
|
else
|
||||||
|
# Write the local FQDN to configuration file
|
||||||
|
${csudo} sed -i -r "s/#*\s*(fqdn\s*).*/\1$localFqdn/" ${cfg_install_dir}/taos.cfg
|
||||||
|
serverFqdn=$localFqdn
|
||||||
|
break
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
read -p "Please choose an IP from local IP list:" localFqdn
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
}
|
||||||
|
|
||||||
|
function local_fqdn_check() {
|
||||||
|
#serverFqdn=$(hostname)
|
||||||
|
echo
|
||||||
|
echo -e -n "System hostname is: ${GREEN}$serverFqdn${NC}"
|
||||||
|
echo
|
||||||
|
if [[ "$serverFqdn" == "" ]] || [[ "$serverFqdn" == "localhost" ]]; then
|
||||||
|
echo -e -n "${GREEN}It is strongly recommended to configure a hostname for this machine ${NC}"
|
||||||
|
echo
|
||||||
|
|
||||||
|
while true
|
||||||
|
do
|
||||||
|
read -r -p "Set hostname now? [Y/n] " input
|
||||||
|
if [ ! -n "$input" ]; then
|
||||||
|
set_hostname
|
||||||
|
break
|
||||||
|
else
|
||||||
|
case $input in
|
||||||
|
[yY][eE][sS]|[yY])
|
||||||
|
set_hostname
|
||||||
|
break
|
||||||
|
;;
|
||||||
|
|
||||||
|
[nN][oO]|[nN])
|
||||||
|
set_ipAsFqdn
|
||||||
|
break
|
||||||
|
;;
|
||||||
|
|
||||||
|
*)
|
||||||
|
echo "Invalid input..."
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
function install_log() {
|
||||||
|
${csudo} rm -rf ${log_dir} || :
|
||||||
|
${csudo} mkdir -p ${log_dir} && ${csudo} chmod 777 ${log_dir}
|
||||||
|
|
||||||
|
${csudo} ln -s ${log_dir} ${install_main_dir}/log
|
||||||
|
}
|
||||||
|
|
||||||
|
function install_data() {
|
||||||
|
${csudo} mkdir -p ${data_dir}
|
||||||
|
|
||||||
|
${csudo} ln -s ${data_dir} ${install_main_dir}/data
|
||||||
|
}
|
||||||
|
|
||||||
|
function clean_service_on_systemd() {
|
||||||
|
taosd_service_config="${service_config_dir}/taosd.service"
|
||||||
|
if systemctl is-active --quiet taosd; then
|
||||||
|
echo "TDengine is running, stopping it..."
|
||||||
|
${csudo} systemctl stop taosd &> /dev/null || echo &> /dev/null
|
||||||
|
fi
|
||||||
|
${csudo} systemctl disable taosd &> /dev/null || echo &> /dev/null
|
||||||
|
${csudo} rm -f ${taosd_service_config}
|
||||||
|
|
||||||
|
tarbitratord_service_config="${service_config_dir}/tarbitratord.service"
|
||||||
|
if systemctl is-active --quiet tarbitratord; then
|
||||||
|
echo "tarbitrator is running, stopping it..."
|
||||||
|
${csudo} systemctl stop tarbitratord &> /dev/null || echo &> /dev/null
|
||||||
|
fi
|
||||||
|
${csudo} systemctl disable tarbitratord &> /dev/null || echo &> /dev/null
|
||||||
|
${csudo} rm -f ${tarbitratord_service_config}
|
||||||
|
|
||||||
|
if [ "$verMode" == "cluster" ]; then
|
||||||
|
nginx_service_config="${service_config_dir}/nginxd.service"
|
||||||
|
if systemctl is-active --quiet nginxd; then
|
||||||
|
echo "Nginx for TDengine is running, stopping it..."
|
||||||
|
${csudo} systemctl stop nginxd &> /dev/null || echo &> /dev/null
|
||||||
|
fi
|
||||||
|
${csudo} systemctl disable nginxd &> /dev/null || echo &> /dev/null
|
||||||
|
${csudo} rm -f ${nginx_service_config}
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
# taos:2345:respawn:/etc/init.d/taosd start
|
||||||
|
|
||||||
|
function install_service_on_systemd() {
|
||||||
|
clean_service_on_systemd
|
||||||
|
|
||||||
|
taosd_service_config="${service_config_dir}/taosd.service"
|
||||||
|
${csudo} bash -c "echo '[Unit]' >> ${taosd_service_config}"
|
||||||
|
${csudo} bash -c "echo 'Description=TDengine server service' >> ${taosd_service_config}"
|
||||||
|
${csudo} bash -c "echo 'After=network-online.target taosadapter.service' >> ${taosd_service_config}"
|
||||||
|
${csudo} bash -c "echo 'Wants=network-online.target taosadapter.service' >> ${taosd_service_config}"
|
||||||
|
${csudo} bash -c "echo >> ${taosd_service_config}"
|
||||||
|
${csudo} bash -c "echo '[Service]' >> ${taosd_service_config}"
|
||||||
|
${csudo} bash -c "echo 'Type=simple' >> ${taosd_service_config}"
|
||||||
|
${csudo} bash -c "echo 'ExecStart=/usr/bin/taosd' >> ${taosd_service_config}"
|
||||||
|
${csudo} bash -c "echo 'ExecStartPre=/usr/local/taos/bin/startPre.sh' >> ${taosd_service_config}"
|
||||||
|
${csudo} bash -c "echo 'TimeoutStopSec=1000000s' >> ${taosd_service_config}"
|
||||||
|
${csudo} bash -c "echo 'LimitNOFILE=infinity' >> ${taosd_service_config}"
|
||||||
|
${csudo} bash -c "echo 'LimitNPROC=infinity' >> ${taosd_service_config}"
|
||||||
|
${csudo} bash -c "echo 'LimitCORE=infinity' >> ${taosd_service_config}"
|
||||||
|
${csudo} bash -c "echo 'TimeoutStartSec=0' >> ${taosd_service_config}"
|
||||||
|
${csudo} bash -c "echo 'StandardOutput=null' >> ${taosd_service_config}"
|
||||||
|
${csudo} bash -c "echo 'Restart=always' >> ${taosd_service_config}"
|
||||||
|
${csudo} bash -c "echo 'StartLimitBurst=3' >> ${taosd_service_config}"
|
||||||
|
${csudo} bash -c "echo 'StartLimitInterval=60s' >> ${taosd_service_config}"
|
||||||
|
#${csudo} bash -c "echo 'StartLimitIntervalSec=60s' >> ${taosd_service_config}"
|
||||||
|
${csudo} bash -c "echo >> ${taosd_service_config}"
|
||||||
|
${csudo} bash -c "echo '[Install]' >> ${taosd_service_config}"
|
||||||
|
${csudo} bash -c "echo 'WantedBy=multi-user.target' >> ${taosd_service_config}"
|
||||||
|
${csudo} systemctl enable taosd
|
||||||
|
|
||||||
|
${csudo} systemctl daemon-reload
|
||||||
|
}
|
||||||
|
|
||||||
|
function install_service() {
|
||||||
|
if ((${service_mod}==0)); then
|
||||||
|
install_service_on_systemd
|
||||||
|
elif ((${service_mod}==1)); then
|
||||||
|
install_service_on_sysvinit
|
||||||
|
else
|
||||||
|
# must manual stop taosd
|
||||||
|
kill_process taosd
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
function install_TDengine() {
|
||||||
|
# Start to install
|
||||||
|
echo -e "${GREEN}Start to install TDengine...${NC}"
|
||||||
|
|
||||||
|
install_main_path
|
||||||
|
install_data
|
||||||
|
install_log
|
||||||
|
install_header
|
||||||
|
install_lib
|
||||||
|
|
||||||
|
if [ -z $1 ]; then # install service and client
|
||||||
|
# For installing new
|
||||||
|
install_bin
|
||||||
|
install_service
|
||||||
|
#install_config
|
||||||
|
|
||||||
|
# Ask if to start the service
|
||||||
|
#echo
|
||||||
|
#echo -e "\033[44;32;1mTDengine is installed successfully!${NC}"
|
||||||
|
echo
|
||||||
|
echo -e "${GREEN_DARK}To configure TDengine ${NC}: edit /etc/taos/taos.cfg"
|
||||||
|
if ((${service_mod}==0)); then
|
||||||
|
echo -e "${GREEN_DARK}To start TDengine ${NC}: ${csudo} systemctl start taosd${NC}"
|
||||||
|
elif ((${service_mod}==1)); then
|
||||||
|
echo -e "${GREEN_DARK}To start TDengine ${NC}: ${csudo} service taosd start${NC}"
|
||||||
|
else
|
||||||
|
echo -e "${GREEN_DARK}To start TDengine ${NC}: taosd${NC}"
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ ! -z "$firstEp" ]; then
|
||||||
|
tmpFqdn=${firstEp%%:*}
|
||||||
|
substr=":"
|
||||||
|
if [[ $firstEp =~ $substr ]];then
|
||||||
|
tmpPort=${firstEp#*:}
|
||||||
|
else
|
||||||
|
tmpPort=""
|
||||||
|
fi
|
||||||
|
if [[ "$tmpPort" != "" ]];then
|
||||||
|
echo -e "${GREEN_DARK}To access TDengine ${NC}: taos -h $tmpFqdn -P $tmpPort${GREEN_DARK} to login into cluster, then${NC}"
|
||||||
|
else
|
||||||
|
echo -e "${GREEN_DARK}To access TDengine ${NC}: taos -h $tmpFqdn${GREEN_DARK} to login into cluster, then${NC}"
|
||||||
|
fi
|
||||||
|
echo -e "${GREEN_DARK}execute ${NC}: create dnode 'newDnodeFQDN:port'; ${GREEN_DARK}to add this new node${NC}"
|
||||||
|
echo
|
||||||
|
elif [ ! -z "$serverFqdn" ]; then
|
||||||
|
echo -e "${GREEN_DARK}To access TDengine ${NC}: taos -h $serverFqdn${GREEN_DARK} to login into TDengine server${NC}"
|
||||||
|
echo
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo -e "\033[44;32;1mTDengine is installed successfully!${NC}"
|
||||||
|
echo
|
||||||
|
else # Only install client
|
||||||
|
install_bin
|
||||||
|
#install_config
|
||||||
|
echo
|
||||||
|
echo -e "\033[44;32;1mTDengine client is installed successfully!${NC}"
|
||||||
|
fi
|
||||||
|
|
||||||
|
touch ~/.taos_history
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
## ==============================Main program starts from here============================
|
||||||
|
serverFqdn=$(hostname)
|
||||||
|
if [ "$verType" == "server" ]; then
|
||||||
|
# Install server and client
|
||||||
|
install_TDengine
|
||||||
|
elif [ "$verType" == "client" ]; then
|
||||||
|
interactiveFqdn=no
|
||||||
|
# Only install client
|
||||||
|
install_TDengine client
|
||||||
|
else
|
||||||
|
echo "please input correct verType"
|
||||||
|
fi
|
|
@ -1,6 +1,6 @@
|
||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
#
|
#
|
||||||
# Generate the deb package for ubuntu, or rpm package for centos, or tar.gz package for other linux os
|
# Generate the tar.gz package for linux os
|
||||||
|
|
||||||
set -e
|
set -e
|
||||||
#set -x
|
#set -x
|
||||||
|
@ -17,9 +17,12 @@ echo "=======================new version number: ${verNumber}===================
|
||||||
|
|
||||||
build_time=$(date +"%F %R")
|
build_time=$(date +"%F %R")
|
||||||
|
|
||||||
|
echo "script_dir: ${script_dir}"
|
||||||
echo "top_dir: ${top_dir}"
|
echo "top_dir: ${top_dir}"
|
||||||
|
|
||||||
cd ${top_dir}
|
cd ${top_dir}
|
||||||
|
git checkout -- .
|
||||||
|
git checkout 3.0
|
||||||
git pull || :
|
git pull || :
|
||||||
|
|
||||||
echo "curr_dir: ${curr_dir}"
|
echo "curr_dir: ${curr_dir}"
|
||||||
|
@ -49,28 +52,38 @@ cd ${release_dir}
|
||||||
|
|
||||||
install_dir="${release_dir}/TDengine-server-${version}"
|
install_dir="${release_dir}/TDengine-server-${version}"
|
||||||
mkdir -p ${install_dir}
|
mkdir -p ${install_dir}
|
||||||
|
mkdir -p ${install_dir}/bin
|
||||||
mkdir -p ${install_dir}/lib
|
mkdir -p ${install_dir}/lib
|
||||||
|
mkdir -p ${install_dir}/inc
|
||||||
|
|
||||||
bin_files="${compile_dir}/source/dnode/mgmt/daemon/taosd ${compile_dir}/tools/shell/taos ${compile_dir}/tests/test/c/create_table"
|
install_files="${script_dir}/install.sh"
|
||||||
cp ${bin_files} ${install_dir}/ && chmod a+x ${install_dir}/* || :
|
chmod a+x ${script_dir}/install.sh || :
|
||||||
|
cp ${install_files} ${install_dir}
|
||||||
|
|
||||||
|
header_files="${top_dir}/include/client/taos.h ${top_dir}/include/util/taoserror.h"
|
||||||
|
cp ${header_files} ${install_dir}/inc
|
||||||
|
|
||||||
|
bin_files="${compile_dir}/source/dnode/mgmt/taosd ${compile_dir}/tools/shell/taos ${compile_dir}/tests/test/c/create_table ${compile_dir}/tests/test/c/tmq_sim ${script_dir}/remove.sh"
|
||||||
|
cp ${bin_files} ${install_dir}/bin && chmod a+x ${install_dir}/bin/* || :
|
||||||
|
|
||||||
cp ${compile_dir}/source/client/libtaos.so ${install_dir}/lib/
|
cp ${compile_dir}/source/client/libtaos.so ${install_dir}/lib/
|
||||||
cp ${compile_dir}/source/dnode/mnode/impl/libmnode.so ${install_dir}/lib/
|
cp ${compile_dir}/source/libs/tdb/libtdb.so ${install_dir}/lib/
|
||||||
cp ${compile_dir}/source/dnode/qnode/libqnode.so ${install_dir}/lib/
|
|
||||||
cp ${compile_dir}/source/dnode/snode/libsnode.so ${install_dir}/lib/
|
#cp ${compile_dir}/source/dnode/mnode/impl/libmnode.so ${install_dir}/lib/
|
||||||
cp ${compile_dir}/source/dnode/bnode/libbnode.so ${install_dir}/lib/
|
#cp ${compile_dir}/source/dnode/qnode/libqnode.so ${install_dir}/lib/
|
||||||
cp ${compile_dir}/source/libs/wal/libwal.so ${install_dir}/lib/
|
#cp ${compile_dir}/source/dnode/snode/libsnode.so ${install_dir}/lib/
|
||||||
cp ${compile_dir}/source/libs/scheduler/libscheduler.so ${install_dir}/lib/
|
#cp ${compile_dir}/source/dnode/bnode/libbnode.so ${install_dir}/lib/
|
||||||
cp ${compile_dir}/source/libs/planner/libplanner.so ${install_dir}/lib/
|
#cp ${compile_dir}/source/libs/wal/libwal.so ${install_dir}/lib/
|
||||||
cp ${compile_dir}/source/libs/parser/libparser.so ${install_dir}/lib/
|
#cp ${compile_dir}/source/libs/scheduler/libscheduler.so ${install_dir}/lib/
|
||||||
cp ${compile_dir}/source/libs/qcom/libqcom.so ${install_dir}/lib/
|
#cp ${compile_dir}/source/libs/planner/libplanner.so ${install_dir}/lib/
|
||||||
cp ${compile_dir}/source/libs/transport/libtransport.so ${install_dir}/lib/
|
#cp ${compile_dir}/source/libs/parser/libparser.so ${install_dir}/lib/
|
||||||
cp ${compile_dir}/source/libs/function/libfunction.so ${install_dir}/lib/
|
#cp ${compile_dir}/source/libs/qcom/libqcom.so ${install_dir}/lib/
|
||||||
cp ${compile_dir}/source/common/libcommon.so ${install_dir}/lib/
|
#cp ${compile_dir}/source/libs/transport/libtransport.so ${install_dir}/lib/
|
||||||
cp ${compile_dir}/source/os/libos.so ${install_dir}/lib/
|
#cp ${compile_dir}/source/libs/function/libfunction.so ${install_dir}/lib/
|
||||||
cp ${compile_dir}/source/dnode/mnode/sdb/libsdb.so ${install_dir}/lib/
|
#cp ${compile_dir}/source/common/libcommon.so ${install_dir}/lib/
|
||||||
cp ${compile_dir}/source/libs/catalog/libcatalog.so ${install_dir}/lib/
|
#cp ${compile_dir}/source/os/libos.so ${install_dir}/lib/
|
||||||
|
#cp ${compile_dir}/source/dnode/mnode/sdb/libsdb.so ${install_dir}/lib/
|
||||||
|
#cp ${compile_dir}/source/libs/catalog/libcatalog.so ${install_dir}/lib/
|
||||||
|
|
||||||
pkg_name=${install_dir}-Linux-x64
|
pkg_name=${install_dir}-Linux-x64
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,148 @@
|
||||||
|
#!/bin/bash
|
||||||
|
#
|
||||||
|
# Script to stop the service and uninstall TDengine, but retain the config, data and log files.
|
||||||
|
|
||||||
|
set -e
|
||||||
|
#set -x
|
||||||
|
|
||||||
|
verMode=edge
|
||||||
|
|
||||||
|
RED='\033[0;31m'
|
||||||
|
GREEN='\033[1;32m'
|
||||||
|
NC='\033[0m'
|
||||||
|
|
||||||
|
#install main path
|
||||||
|
install_main_dir="/usr/local/taos"
|
||||||
|
data_link_dir="/usr/local/taos/data"
|
||||||
|
log_link_dir="/usr/local/taos/log"
|
||||||
|
cfg_link_dir="/usr/local/taos/cfg"
|
||||||
|
bin_link_dir="/usr/bin"
|
||||||
|
lib_link_dir="/usr/lib"
|
||||||
|
lib64_link_dir="/usr/lib64"
|
||||||
|
inc_link_dir="/usr/include"
|
||||||
|
|
||||||
|
service_config_dir="/etc/systemd/system"
|
||||||
|
taos_service_name="taosd"
|
||||||
|
|
||||||
|
csudo=""
|
||||||
|
if command -v sudo > /dev/null; then
|
||||||
|
csudo="sudo"
|
||||||
|
fi
|
||||||
|
|
||||||
|
initd_mod=0
|
||||||
|
service_mod=2
|
||||||
|
if pidof systemd &> /dev/null; then
|
||||||
|
service_mod=0
|
||||||
|
elif $(which service &> /dev/null); then
|
||||||
|
service_mod=1
|
||||||
|
service_config_dir="/etc/init.d"
|
||||||
|
if $(which chkconfig &> /dev/null); then
|
||||||
|
initd_mod=1
|
||||||
|
elif $(which insserv &> /dev/null); then
|
||||||
|
initd_mod=2
|
||||||
|
elif $(which update-rc.d &> /dev/null); then
|
||||||
|
initd_mod=3
|
||||||
|
else
|
||||||
|
service_mod=2
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
service_mod=2
|
||||||
|
fi
|
||||||
|
|
||||||
|
|
||||||
|
function kill_taosd() {
|
||||||
|
pid=$(ps -ef | grep "taosd" | grep -v "grep" | awk '{print $2}')
|
||||||
|
if [ -n "$pid" ]; then
|
||||||
|
${csudo} kill -9 $pid || :
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
function clean_bin() {
|
||||||
|
# Remove link
|
||||||
|
${csudo} rm -f ${bin_link_dir}/taos || :
|
||||||
|
${csudo} rm -f ${bin_link_dir}/taosd || :
|
||||||
|
${csudo} rm -f ${bin_link_dir}/create_table || :
|
||||||
|
${csudo} rm -f ${bin_link_dir}/tmq_sim || :
|
||||||
|
${csudo} rm -f ${bin_link_dir}/taosdemo || :
|
||||||
|
${csudo} rm -f ${bin_link_dir}/taosdump || :
|
||||||
|
${csudo} rm -f ${bin_link_dir}/rmtaos || :
|
||||||
|
#${csudo} rm -f ${bin_link_dir}/set_core || :
|
||||||
|
}
|
||||||
|
|
||||||
|
function clean_lib() {
|
||||||
|
# Remove link
|
||||||
|
${csudo} rm -f ${lib_link_dir}/libtaos.* || :
|
||||||
|
${csudo} rm -f ${lib64_link_dir}/libtaos.* || :
|
||||||
|
|
||||||
|
${csudo} rm -f ${lib_link_dir}/libtdb.* || :
|
||||||
|
${csudo} rm -f ${lib64_link_dir}/libtdb.* || :
|
||||||
|
}
|
||||||
|
|
||||||
|
function clean_header() {
|
||||||
|
# Remove link
|
||||||
|
${csudo} rm -f ${inc_link_dir}/taos.h || :
|
||||||
|
${csudo} rm -f ${inc_link_dir}/taosdef.h || :
|
||||||
|
${csudo} rm -f ${inc_link_dir}/taoserror.h || :
|
||||||
|
}
|
||||||
|
|
||||||
|
function clean_config() {
|
||||||
|
# Remove link
|
||||||
|
${csudo} rm -f ${cfg_link_dir}/* || :
|
||||||
|
}
|
||||||
|
|
||||||
|
function clean_log() {
|
||||||
|
# Remove link
|
||||||
|
${csudo} rm -rf ${log_link_dir} || :
|
||||||
|
}
|
||||||
|
|
||||||
|
function clean_service_on_systemd() {
|
||||||
|
taosd_service_config="${service_config_dir}/${taos_service_name}.service"
|
||||||
|
if systemctl is-active --quiet ${taos_service_name}; then
|
||||||
|
echo "TDengine taosd is running, stopping it..."
|
||||||
|
${csudo} systemctl stop ${taos_service_name} &> /dev/null || echo &> /dev/null
|
||||||
|
fi
|
||||||
|
${csudo} systemctl disable ${taos_service_name} &> /dev/null || echo &> /dev/null
|
||||||
|
${csudo} rm -f ${taosd_service_config}
|
||||||
|
}
|
||||||
|
|
||||||
|
function clean_service_on_sysvinit() {
|
||||||
|
echo " "
|
||||||
|
}
|
||||||
|
|
||||||
|
function clean_service() {
|
||||||
|
if ((${service_mod}==0)); then
|
||||||
|
clean_service_on_systemd
|
||||||
|
elif ((${service_mod}==1)); then
|
||||||
|
clean_service_on_sysvinit
|
||||||
|
else
|
||||||
|
# must manual stop taosd
|
||||||
|
kill_taosd
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
# Stop service and disable booting start.
|
||||||
|
clean_service
|
||||||
|
# Remove binary file and links
|
||||||
|
clean_bin
|
||||||
|
# Remove header file.
|
||||||
|
clean_header
|
||||||
|
# Remove lib file
|
||||||
|
clean_lib
|
||||||
|
# Remove link log directory
|
||||||
|
clean_log
|
||||||
|
# Remove link configuration file
|
||||||
|
clean_config
|
||||||
|
# Remove data link directory
|
||||||
|
${csudo} rm -rf ${data_link_dir} || :
|
||||||
|
|
||||||
|
${csudo} rm -rf ${install_main_dir}
|
||||||
|
|
||||||
|
if [[ -e /etc/os-release ]]; then
|
||||||
|
osinfo=$(awk -F= '/^NAME/{print $2}' /etc/os-release)
|
||||||
|
else
|
||||||
|
osinfo=""
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo -e "${GREEN}TDengine is removed successfully!${NC}"
|
||||||
|
echo
|
|
@ -8,7 +8,7 @@ target_include_directories(
|
||||||
target_link_libraries(
|
target_link_libraries(
|
||||||
taos
|
taos
|
||||||
INTERFACE api
|
INTERFACE api
|
||||||
PRIVATE os util common transport nodes parser planner catalog scheduler function qcom
|
PRIVATE os util common transport nodes parser command planner catalog scheduler function qcom
|
||||||
)
|
)
|
||||||
|
|
||||||
if(${BUILD_TEST})
|
if(${BUILD_TEST})
|
||||||
|
|
|
@ -152,7 +152,8 @@ typedef struct SResultColumn {
|
||||||
typedef struct SReqResultInfo {
|
typedef struct SReqResultInfo {
|
||||||
const char* pRspMsg;
|
const char* pRspMsg;
|
||||||
const char* pData;
|
const char* pData;
|
||||||
TAOS_FIELD* fields;
|
TAOS_FIELD* fields; // todo, column names are not needed.
|
||||||
|
TAOS_FIELD* userFields; // the fields info that return to user
|
||||||
uint32_t numOfCols;
|
uint32_t numOfCols;
|
||||||
int32_t* length;
|
int32_t* length;
|
||||||
char** convertBuf;
|
char** convertBuf;
|
||||||
|
@ -162,6 +163,7 @@ typedef struct SReqResultInfo {
|
||||||
uint64_t totalRows;
|
uint64_t totalRows;
|
||||||
uint32_t current;
|
uint32_t current;
|
||||||
bool completed;
|
bool completed;
|
||||||
|
int32_t precision;
|
||||||
int32_t payloadLen;
|
int32_t payloadLen;
|
||||||
} SReqResultInfo;
|
} SReqResultInfo;
|
||||||
|
|
||||||
|
@ -221,6 +223,7 @@ void destroyRequest(SRequestObj* pRequest);
|
||||||
|
|
||||||
char* getDbOfConnection(STscObj* pObj);
|
char* getDbOfConnection(STscObj* pObj);
|
||||||
void setConnectionDB(STscObj* pTscObj, const char* db);
|
void setConnectionDB(STscObj* pTscObj, const char* db);
|
||||||
|
void resetConnectDB(STscObj* pTscObj);
|
||||||
|
|
||||||
void taos_init_imp(void);
|
void taos_init_imp(void);
|
||||||
int taos_options_imp(TSDB_OPTION option, const char* str);
|
int taos_options_imp(TSDB_OPTION option, const char* str);
|
||||||
|
|
|
@ -169,6 +169,7 @@ static void doFreeReqResultInfo(SReqResultInfo *pResInfo) {
|
||||||
taosMemoryFreeClear(pResInfo->row);
|
taosMemoryFreeClear(pResInfo->row);
|
||||||
taosMemoryFreeClear(pResInfo->pCol);
|
taosMemoryFreeClear(pResInfo->pCol);
|
||||||
taosMemoryFreeClear(pResInfo->fields);
|
taosMemoryFreeClear(pResInfo->fields);
|
||||||
|
taosMemoryFreeClear(pResInfo->userFields);
|
||||||
|
|
||||||
if (pResInfo->convertBuf != NULL) {
|
if (pResInfo->convertBuf != NULL) {
|
||||||
for (int32_t i = 0; i < pResInfo->numOfCols; ++i) {
|
for (int32_t i = 0; i < pResInfo->numOfCols; ++i) {
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
|
|
||||||
#include "clientInt.h"
|
#include "clientInt.h"
|
||||||
#include "clientLog.h"
|
#include "clientLog.h"
|
||||||
|
#include "command.h"
|
||||||
#include "scheduler.h"
|
#include "scheduler.h"
|
||||||
#include "tdatablock.h"
|
#include "tdatablock.h"
|
||||||
#include "tdef.h"
|
#include "tdef.h"
|
||||||
|
@ -55,7 +56,7 @@ TAOS* taos_connect_internal(const char* ip, const char* user, const char* pass,
|
||||||
}
|
}
|
||||||
|
|
||||||
char localDb[TSDB_DB_NAME_LEN] = {0};
|
char localDb[TSDB_DB_NAME_LEN] = {0};
|
||||||
if (db != NULL) {
|
if (db != NULL && strlen(db) > 0) {
|
||||||
if (!validateDbName(db)) {
|
if (!validateDbName(db)) {
|
||||||
terrno = TSDB_CODE_TSC_INVALID_DB_LENGTH;
|
terrno = TSDB_CODE_TSC_INVALID_DB_LENGTH;
|
||||||
return NULL;
|
return NULL;
|
||||||
|
@ -163,6 +164,7 @@ int32_t parseSql(SRequestObj* pRequest, bool topicQuery, SQuery** pQuery) {
|
||||||
if ((*pQuery)->haveResultSet) {
|
if ((*pQuery)->haveResultSet) {
|
||||||
setResSchemaInfo(&pRequest->body.resInfo, (*pQuery)->pResSchema, (*pQuery)->numOfResCols);
|
setResSchemaInfo(&pRequest->body.resInfo, (*pQuery)->pResSchema, (*pQuery)->numOfResCols);
|
||||||
}
|
}
|
||||||
|
|
||||||
TSWAP(pRequest->dbList, (*pQuery)->pDbList, SArray*);
|
TSWAP(pRequest->dbList, (*pQuery)->pDbList, SArray*);
|
||||||
TSWAP(pRequest->tableList, (*pQuery)->pTableList, SArray*);
|
TSWAP(pRequest->tableList, (*pQuery)->pTableList, SArray*);
|
||||||
}
|
}
|
||||||
|
@ -170,7 +172,21 @@ int32_t parseSql(SRequestObj* pRequest, bool topicQuery, SQuery** pQuery) {
|
||||||
return code;
|
return code;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int32_t execLocalCmd(SRequestObj* pRequest, SQuery* pQuery) {
|
||||||
|
SRetrieveTableRsp* pRsp = NULL;
|
||||||
|
int32_t code = qExecCommand(pQuery->pRoot, &pRsp);
|
||||||
|
if (TSDB_CODE_SUCCESS == code && NULL != pRsp) {
|
||||||
|
code = setQueryResultFromRsp(&pRequest->body.resInfo, pRsp);
|
||||||
|
}
|
||||||
|
return code;
|
||||||
|
}
|
||||||
|
|
||||||
int32_t execDdlQuery(SRequestObj* pRequest, SQuery* pQuery) {
|
int32_t execDdlQuery(SRequestObj* pRequest, SQuery* pQuery) {
|
||||||
|
// drop table if exists not_exists_table
|
||||||
|
if (NULL == pQuery->pCmdMsg) {
|
||||||
|
return TSDB_CODE_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
SCmdMsgInfo* pMsgInfo = pQuery->pCmdMsg;
|
SCmdMsgInfo* pMsgInfo = pQuery->pCmdMsg;
|
||||||
pRequest->type = pMsgInfo->msgType;
|
pRequest->type = pMsgInfo->msgType;
|
||||||
pRequest->body.requestMsg = (SDataBuf){.pData = pMsgInfo->pMsg, .len = pMsgInfo->msgLen, .handle = NULL};
|
pRequest->body.requestMsg = (SDataBuf){.pData = pMsgInfo->pMsg, .len = pMsgInfo->msgLen, .handle = NULL};
|
||||||
|
@ -213,12 +229,24 @@ void setResSchemaInfo(SReqResultInfo* pResInfo, const SSchema* pSchema, int32_t
|
||||||
assert(pSchema != NULL && numOfCols > 0);
|
assert(pSchema != NULL && numOfCols > 0);
|
||||||
|
|
||||||
pResInfo->numOfCols = numOfCols;
|
pResInfo->numOfCols = numOfCols;
|
||||||
pResInfo->fields = taosMemoryCalloc(numOfCols, sizeof(pSchema[0]));
|
pResInfo->fields = taosMemoryCalloc(numOfCols, sizeof(TAOS_FIELD));
|
||||||
|
pResInfo->userFields = taosMemoryCalloc(numOfCols, sizeof(TAOS_FIELD));
|
||||||
|
|
||||||
for (int32_t i = 0; i < pResInfo->numOfCols; ++i) {
|
for (int32_t i = 0; i < pResInfo->numOfCols; ++i) {
|
||||||
pResInfo->fields[i].bytes = pSchema[i].bytes;
|
pResInfo->fields[i].bytes = pSchema[i].bytes;
|
||||||
pResInfo->fields[i].type = pSchema[i].type;
|
pResInfo->fields[i].type = pSchema[i].type;
|
||||||
|
|
||||||
|
pResInfo->userFields[i].bytes = pSchema[i].bytes;
|
||||||
|
pResInfo->userFields[i].type = pSchema[i].type;
|
||||||
|
|
||||||
|
if (pSchema[i].type == TSDB_DATA_TYPE_VARCHAR) {
|
||||||
|
pResInfo->userFields[i].bytes -= VARSTR_HEADER_SIZE;
|
||||||
|
} else if (pSchema[i].type == TSDB_DATA_TYPE_NCHAR) {
|
||||||
|
pResInfo->userFields[i].bytes = (pResInfo->userFields[i].bytes - VARSTR_HEADER_SIZE) / TSDB_NCHAR_SIZE;
|
||||||
|
}
|
||||||
|
|
||||||
tstrncpy(pResInfo->fields[i].name, pSchema[i].name, tListLen(pResInfo->fields[i].name));
|
tstrncpy(pResInfo->fields[i].name, pSchema[i].name, tListLen(pResInfo->fields[i].name));
|
||||||
|
tstrncpy(pResInfo->userFields[i].name, pSchema[i].name, tListLen(pResInfo->userFields[i].name));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -226,7 +254,7 @@ int32_t scheduleQuery(SRequestObj* pRequest, SQueryPlan* pDag, SArray* pNodeList
|
||||||
void* pTransporter = pRequest->pTscObj->pAppInfo->pTransporter;
|
void* pTransporter = pRequest->pTscObj->pAppInfo->pTransporter;
|
||||||
|
|
||||||
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 = schedulerExecJob(pTransporter, pNodeList, pDag, &pRequest->body.queryJob, pRequest->sqlstr, &res);
|
int32_t code = schedulerExecJob(pTransporter, pNodeList, pDag, &pRequest->body.queryJob, pRequest->sqlstr, pRequest->metric.start, &res);
|
||||||
if (code != TSDB_CODE_SUCCESS) {
|
if (code != TSDB_CODE_SUCCESS) {
|
||||||
if (pRequest->body.queryJob != 0) {
|
if (pRequest->body.queryJob != 0) {
|
||||||
schedulerFreeJob(pRequest->body.queryJob);
|
schedulerFreeJob(pRequest->body.queryJob);
|
||||||
|
@ -253,20 +281,35 @@ int32_t scheduleQuery(SRequestObj* pRequest, SQueryPlan* pDag, SArray* pNodeList
|
||||||
SRequestObj* execQueryImpl(STscObj* pTscObj, const char* sql, int sqlLen) {
|
SRequestObj* execQueryImpl(STscObj* pTscObj, const char* sql, int sqlLen) {
|
||||||
SRequestObj* pRequest = NULL;
|
SRequestObj* pRequest = NULL;
|
||||||
SQuery* pQuery = NULL;
|
SQuery* pQuery = NULL;
|
||||||
int32_t code = 0;
|
|
||||||
SArray* pNodeList = taosArrayInit(4, sizeof(struct SQueryNodeAddr));
|
SArray* pNodeList = taosArrayInit(4, sizeof(struct SQueryNodeAddr));
|
||||||
|
|
||||||
CHECK_CODE_GOTO(buildRequest(pTscObj, sql, sqlLen, &pRequest), _return);
|
int32_t code = buildRequest(pTscObj, sql, sqlLen, &pRequest);
|
||||||
CHECK_CODE_GOTO(parseSql(pRequest, false, &pQuery), _return);
|
if (TSDB_CODE_SUCCESS == code) {
|
||||||
|
code = parseSql(pRequest, false, &pQuery);
|
||||||
if (pQuery->directRpc) {
|
}
|
||||||
CHECK_CODE_GOTO(execDdlQuery(pRequest, pQuery), _return);
|
|
||||||
} else {
|
if (TSDB_CODE_SUCCESS == code) {
|
||||||
CHECK_CODE_GOTO(getPlan(pRequest, pQuery, &pRequest->body.pDag, pNodeList), _return);
|
switch (pQuery->execMode) {
|
||||||
CHECK_CODE_GOTO(scheduleQuery(pRequest, pRequest->body.pDag, pNodeList), _return);
|
case QUERY_EXEC_MODE_LOCAL:
|
||||||
|
code = execLocalCmd(pRequest, pQuery);
|
||||||
|
break;
|
||||||
|
case QUERY_EXEC_MODE_RPC:
|
||||||
|
code = execDdlQuery(pRequest, pQuery);
|
||||||
|
break;
|
||||||
|
case QUERY_EXEC_MODE_SCHEDULE:
|
||||||
|
code = getPlan(pRequest, pQuery, &pRequest->body.pDag, pNodeList);
|
||||||
|
if (TSDB_CODE_SUCCESS == code) {
|
||||||
|
code = scheduleQuery(pRequest, pRequest->body.pDag, pNodeList);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case QUERY_EXEC_MODE_EMPTY_RESULT:
|
||||||
|
pRequest->type = TSDB_SQL_RETRIEVE_EMPTY_RESULT;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
_return:
|
|
||||||
taosArrayDestroy(pNodeList);
|
taosArrayDestroy(pNodeList);
|
||||||
qDestroyQuery(pQuery);
|
qDestroyQuery(pQuery);
|
||||||
if (NULL != pRequest && TSDB_CODE_SUCCESS != code) {
|
if (NULL != pRequest && TSDB_CODE_SUCCESS != code) {
|
||||||
|
@ -464,9 +507,11 @@ static void destroySendMsgInfo(SMsgSendInfo* pMsgBody) {
|
||||||
taosMemoryFreeClear(pMsgBody->msgInfo.pData);
|
taosMemoryFreeClear(pMsgBody->msgInfo.pData);
|
||||||
taosMemoryFreeClear(pMsgBody);
|
taosMemoryFreeClear(pMsgBody);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool persistConnForSpecificMsg(void* parenct, tmsg_t msgType) {
|
bool persistConnForSpecificMsg(void* parenct, tmsg_t msgType) {
|
||||||
return msgType == TDMT_VND_QUERY_RSP || msgType == TDMT_VND_FETCH_RSP || msgType == TDMT_VND_RES_READY_RSP || msgType == TDMT_VND_QUERY_HEARTBEAT_RSP;
|
return msgType == TDMT_VND_QUERY_RSP || msgType == TDMT_VND_FETCH_RSP || msgType == TDMT_VND_RES_READY_RSP || msgType == TDMT_VND_QUERY_HEARTBEAT_RSP;
|
||||||
}
|
}
|
||||||
|
|
||||||
void processMsgFromServer(void* parent, SRpcMsg* pMsg, SEpSet* pEpSet) {
|
void processMsgFromServer(void* parent, SRpcMsg* pMsg, SEpSet* pEpSet) {
|
||||||
SMsgSendInfo* pSendInfo = (SMsgSendInfo*)pMsg->ahandle;
|
SMsgSendInfo* pSendInfo = (SMsgSendInfo*)pMsg->ahandle;
|
||||||
assert(pMsg->ahandle != NULL);
|
assert(pMsg->ahandle != NULL);
|
||||||
|
@ -647,6 +692,11 @@ void* doFetchRow(SRequestObj* pRequest, bool setupOneRowPtr) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (pResultInfo->completed) {
|
||||||
|
pResultInfo->numOfRows = 0;
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
SMsgSendInfo* body = buildMsgInfoImpl(pRequest);
|
SMsgSendInfo* body = buildMsgInfoImpl(pRequest);
|
||||||
|
|
||||||
int64_t transporterId = 0;
|
int64_t transporterId = 0;
|
||||||
|
@ -716,6 +766,7 @@ int32_t setResultDataPtr(SReqResultInfo* pResultInfo, TAOS_FIELD* pFields, int32
|
||||||
pStart += colLength[i];
|
pStart += colLength[i];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// convert UCS4-LE encoded character to native multi-bytes character in current data block.
|
||||||
for (int32_t i = 0; i < numOfCols; ++i) {
|
for (int32_t i = 0; i < numOfCols; ++i) {
|
||||||
int32_t type = pResultInfo->fields[i].type;
|
int32_t type = pResultInfo->fields[i].type;
|
||||||
int32_t bytes = pResultInfo->fields[i].bytes;
|
int32_t bytes = pResultInfo->fields[i].bytes;
|
||||||
|
@ -742,6 +793,7 @@ int32_t setResultDataPtr(SReqResultInfo* pResultInfo, TAOS_FIELD* pFields, int32
|
||||||
}
|
}
|
||||||
|
|
||||||
pResultInfo->pCol[i].pData = pResultInfo->convertBuf[i];
|
pResultInfo->pCol[i].pData = pResultInfo->convertBuf[i];
|
||||||
|
pResultInfo->row[i] = pResultInfo->pCol[i].pData;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -767,6 +819,16 @@ void setConnectionDB(STscObj* pTscObj, const char* db) {
|
||||||
taosThreadMutexUnlock(&pTscObj->mutex);
|
taosThreadMutexUnlock(&pTscObj->mutex);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void resetConnectDB(STscObj* pTscObj) {
|
||||||
|
if (pTscObj == NULL) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
taosThreadMutexLock(&pTscObj->mutex);
|
||||||
|
pTscObj->db[0] = 0;
|
||||||
|
taosThreadMutexUnlock(&pTscObj->mutex);
|
||||||
|
}
|
||||||
|
|
||||||
int32_t setQueryResultFromRsp(SReqResultInfo* pResultInfo, const SRetrieveTableRsp* pRsp) {
|
int32_t setQueryResultFromRsp(SReqResultInfo* pResultInfo, const SRetrieveTableRsp* pRsp) {
|
||||||
assert(pResultInfo != NULL && pRsp != NULL);
|
assert(pResultInfo != NULL && pRsp != NULL);
|
||||||
|
|
||||||
|
@ -776,6 +838,7 @@ int32_t setQueryResultFromRsp(SReqResultInfo* pResultInfo, const SRetrieveTableR
|
||||||
pResultInfo->current = 0;
|
pResultInfo->current = 0;
|
||||||
pResultInfo->completed = (pRsp->completed == 1);
|
pResultInfo->completed = (pRsp->completed == 1);
|
||||||
pResultInfo->payloadLen = htonl(pRsp->compLen);
|
pResultInfo->payloadLen = htonl(pRsp->compLen);
|
||||||
|
pResultInfo->precision = pRsp->precision;
|
||||||
|
|
||||||
// TODO handle the compressed case
|
// TODO handle the compressed case
|
||||||
pResultInfo->totalRows += pResultInfo->numOfRows;
|
pResultInfo->totalRows += pResultInfo->numOfRows;
|
||||||
|
|
|
@ -146,7 +146,7 @@ TAOS_FIELD *taos_fetch_fields(TAOS_RES *res) {
|
||||||
}
|
}
|
||||||
|
|
||||||
SReqResultInfo *pResInfo = &(((SRequestObj *)res)->body.resInfo);
|
SReqResultInfo *pResInfo = &(((SRequestObj *)res)->body.resInfo);
|
||||||
return pResInfo->fields;
|
return pResInfo->userFields;
|
||||||
}
|
}
|
||||||
|
|
||||||
TAOS_RES *taos_query(TAOS *taos, const char *sql) {
|
TAOS_RES *taos_query(TAOS *taos, const char *sql) {
|
||||||
|
@ -264,10 +264,19 @@ int *taos_fetch_lengths(TAOS_RES *res) {
|
||||||
}
|
}
|
||||||
|
|
||||||
TAOS_ROW *taos_result_block(TAOS_RES *res) {
|
TAOS_ROW *taos_result_block(TAOS_RES *res) {
|
||||||
// TODO
|
SRequestObj* pRequest = (SRequestObj*) res;
|
||||||
|
if (pRequest == NULL) {
|
||||||
|
terrno = TSDB_CODE_INVALID_PARA;
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (taos_is_update_query(res)) {
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
return &pRequest->body.resInfo.row;
|
||||||
|
}
|
||||||
|
|
||||||
// todo intergrate with tDataTypes
|
// todo intergrate with tDataTypes
|
||||||
const char *taos_data_type(int type) {
|
const char *taos_data_type(int type) {
|
||||||
switch (type) {
|
switch (type) {
|
||||||
|
@ -313,7 +322,14 @@ int taos_affected_rows(TAOS_RES *res) {
|
||||||
return pResInfo->numOfRows;
|
return pResInfo->numOfRows;
|
||||||
}
|
}
|
||||||
|
|
||||||
int taos_result_precision(TAOS_RES *res) { return TSDB_TIME_PRECISION_MILLI; }
|
int taos_result_precision(TAOS_RES *res) {
|
||||||
|
SRequestObj* pRequest = (SRequestObj*) res;
|
||||||
|
if (pRequest == NULL) {
|
||||||
|
return TSDB_TIME_PRECISION_MILLI;
|
||||||
|
}
|
||||||
|
|
||||||
|
return pRequest->body.resInfo.precision;
|
||||||
|
}
|
||||||
|
|
||||||
int taos_select_db(TAOS *taos, const char *db) {
|
int taos_select_db(TAOS *taos, const char *db) {
|
||||||
STscObj *pObj = (STscObj *)taos;
|
STscObj *pObj = (STscObj *)taos;
|
||||||
|
@ -365,16 +381,24 @@ bool taos_is_null(TAOS_RES *res, int32_t row, int32_t col) {
|
||||||
}
|
}
|
||||||
|
|
||||||
bool taos_is_update_query(TAOS_RES *res) {
|
bool taos_is_update_query(TAOS_RES *res) {
|
||||||
// TODO
|
return taos_num_fields(res) == 0;
|
||||||
return true;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
int taos_fetch_block(TAOS_RES *res, TAOS_ROW *rows) {
|
int taos_fetch_block(TAOS_RES *res, TAOS_ROW *rows) {
|
||||||
if (res == NULL) {
|
int32_t numOfRows = 0;
|
||||||
|
/*int32_t code = */taos_fetch_block_s(res, &numOfRows, rows);
|
||||||
|
return numOfRows;
|
||||||
|
}
|
||||||
|
|
||||||
|
int taos_fetch_block_s(TAOS_RES *res, int* numOfRows, TAOS_ROW *rows) {
|
||||||
|
SRequestObj *pRequest = (SRequestObj *)res;
|
||||||
|
if (pRequest == NULL) {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
SRequestObj *pRequest = (SRequestObj *)res;
|
(*rows) = NULL;
|
||||||
|
(*numOfRows) = 0;
|
||||||
|
|
||||||
if (pRequest->type == TSDB_SQL_RETRIEVE_EMPTY_RESULT || pRequest->type == TSDB_SQL_INSERT ||
|
if (pRequest->type == TSDB_SQL_RETRIEVE_EMPTY_RESULT || pRequest->type == TSDB_SQL_INSERT ||
|
||||||
pRequest->code != TSDB_CODE_SUCCESS || taos_num_fields(res) == 0) {
|
pRequest->code != TSDB_CODE_SUCCESS || taos_num_fields(res) == 0) {
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -385,18 +409,63 @@ int taos_fetch_block(TAOS_RES *res, TAOS_ROW *rows) {
|
||||||
// TODO refactor
|
// TODO refactor
|
||||||
SReqResultInfo *pResultInfo = &pRequest->body.resInfo;
|
SReqResultInfo *pResultInfo = &pRequest->body.resInfo;
|
||||||
pResultInfo->current = pResultInfo->numOfRows;
|
pResultInfo->current = pResultInfo->numOfRows;
|
||||||
*rows = pResultInfo->row;
|
|
||||||
|
|
||||||
return pResultInfo->numOfRows;
|
(*rows) = pResultInfo->row;
|
||||||
|
(*numOfRows) = pResultInfo->numOfRows;
|
||||||
|
return pRequest->code;
|
||||||
|
}
|
||||||
|
|
||||||
|
int taos_fetch_raw_block(TAOS_RES *res, int* numOfRows, void** pData) {
|
||||||
|
SRequestObj *pRequest = (SRequestObj *)res;
|
||||||
|
if (pRequest == NULL) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (pRequest->type == TSDB_SQL_RETRIEVE_EMPTY_RESULT || pRequest->type == TSDB_SQL_INSERT ||
|
||||||
|
pRequest->code != TSDB_CODE_SUCCESS || taos_num_fields(res) == 0) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
doFetchRow(pRequest, false);
|
||||||
|
|
||||||
|
SReqResultInfo *pResultInfo = &pRequest->body.resInfo;
|
||||||
|
|
||||||
|
pResultInfo->current = pResultInfo->numOfRows;
|
||||||
|
(*numOfRows) = pResultInfo->numOfRows;
|
||||||
|
(*pData) = (void*) pResultInfo->pData;
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int *taos_get_column_data_offset(TAOS_RES *res, int columnIndex) {
|
||||||
|
SRequestObj *pRequest = (SRequestObj *)res;
|
||||||
|
if (pRequest == NULL) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int32_t numOfFields = taos_num_fields(pRequest);
|
||||||
|
if (columnIndex < 0 || columnIndex >= numOfFields || numOfFields == 0) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
TAOS_FIELD* pField = &pRequest->body.resInfo.userFields[columnIndex];
|
||||||
|
if (!IS_VAR_DATA_TYPE(pField->type)) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
return pRequest->body.resInfo.pCol[columnIndex].offset;
|
||||||
}
|
}
|
||||||
|
|
||||||
int taos_validate_sql(TAOS *taos, const char *sql) { return true; }
|
int taos_validate_sql(TAOS *taos, const char *sql) { return true; }
|
||||||
|
|
||||||
void taos_reset_current_db(TAOS *taos) {
|
void taos_reset_current_db(TAOS *taos) {
|
||||||
// TODO
|
if (taos == NULL) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
resetConnectDB(taos);
|
||||||
|
}
|
||||||
|
|
||||||
const char *taos_get_server_info(TAOS *taos) {
|
const char *taos_get_server_info(TAOS *taos) {
|
||||||
if (taos == NULL) {
|
if (taos == NULL) {
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
|
@ -78,6 +78,8 @@ struct tmq_t {
|
||||||
STscObj* pTscObj;
|
STscObj* pTscObj;
|
||||||
tmq_commit_cb* commit_cb;
|
tmq_commit_cb* commit_cb;
|
||||||
int32_t nextTopicIdx;
|
int32_t nextTopicIdx;
|
||||||
|
int8_t epStatus;
|
||||||
|
int32_t epSkipCnt;
|
||||||
int32_t waitingRequest;
|
int32_t waitingRequest;
|
||||||
int32_t readyRequest;
|
int32_t readyRequest;
|
||||||
SArray* clientTopics; // SArray<SMqClientTopic>
|
SArray* clientTopics; // SArray<SMqClientTopic>
|
||||||
|
@ -106,6 +108,7 @@ typedef struct {
|
||||||
// connection info
|
// connection info
|
||||||
int32_t vgId;
|
int32_t vgId;
|
||||||
int32_t vgStatus;
|
int32_t vgStatus;
|
||||||
|
int32_t vgSkipCnt;
|
||||||
SEpSet epSet;
|
SEpSet epSet;
|
||||||
} SMqClientVg;
|
} SMqClientVg;
|
||||||
|
|
||||||
|
@ -137,6 +140,7 @@ typedef struct {
|
||||||
tmq_t* tmq;
|
tmq_t* tmq;
|
||||||
SMqClientVg* pVg;
|
SMqClientVg* pVg;
|
||||||
int32_t epoch;
|
int32_t epoch;
|
||||||
|
int32_t vgId;
|
||||||
tsem_t rspSem;
|
tsem_t rspSem;
|
||||||
tmq_message_t** msg;
|
tmq_message_t** msg;
|
||||||
int32_t sync;
|
int32_t sync;
|
||||||
|
@ -255,6 +259,7 @@ void tmqClearUnhandleMsg(tmq_t* tmq) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
msg = NULL;
|
||||||
taosReadAllQitems(tmq->mqueue, tmq->qall);
|
taosReadAllQitems(tmq->mqueue, tmq->qall);
|
||||||
while (1) {
|
while (1) {
|
||||||
taosGetQitem(tmq->qall, (void**)&msg);
|
taosGetQitem(tmq->qall, (void**)&msg);
|
||||||
|
@ -310,6 +315,8 @@ tmq_t* tmq_consumer_new(void* conn, tmq_conf_t* conf, char* errstr, int32_t errs
|
||||||
pTmq->epoch = 0;
|
pTmq->epoch = 0;
|
||||||
pTmq->waitingRequest = 0;
|
pTmq->waitingRequest = 0;
|
||||||
pTmq->readyRequest = 0;
|
pTmq->readyRequest = 0;
|
||||||
|
pTmq->epStatus = 0;
|
||||||
|
pTmq->epSkipCnt = 0;
|
||||||
// set conf
|
// set conf
|
||||||
strcpy(pTmq->clientId, conf->clientId);
|
strcpy(pTmq->clientId, conf->clientId);
|
||||||
strcpy(pTmq->groupId, conf->groupId);
|
strcpy(pTmq->groupId, conf->groupId);
|
||||||
|
@ -345,6 +352,8 @@ tmq_t* tmq_consumer_new1(tmq_conf_t* conf, char* errstr, int32_t errstrLen) {
|
||||||
pTmq->epoch = 0;
|
pTmq->epoch = 0;
|
||||||
pTmq->waitingRequest = 0;
|
pTmq->waitingRequest = 0;
|
||||||
pTmq->readyRequest = 0;
|
pTmq->readyRequest = 0;
|
||||||
|
pTmq->epStatus = 0;
|
||||||
|
pTmq->epSkipCnt = 0;
|
||||||
// set conf
|
// set conf
|
||||||
strcpy(pTmq->clientId, conf->clientId);
|
strcpy(pTmq->clientId, conf->clientId);
|
||||||
strcpy(pTmq->groupId, conf->groupId);
|
strcpy(pTmq->groupId, conf->groupId);
|
||||||
|
@ -787,7 +796,7 @@ void tmqShowMsg(tmq_message_t* tmq_message) {
|
||||||
static bool noPrintSchema;
|
static bool noPrintSchema;
|
||||||
char pBuf[128];
|
char pBuf[128];
|
||||||
SMqPollRsp* pRsp = &tmq_message->msg;
|
SMqPollRsp* pRsp = &tmq_message->msg;
|
||||||
int32_t colNum = pRsp->schema->nCols;
|
int32_t colNum = 2;
|
||||||
if (!noPrintSchema) {
|
if (!noPrintSchema) {
|
||||||
printf("|");
|
printf("|");
|
||||||
for (int32_t i = 0; i < colNum; i++) {
|
for (int32_t i = 0; i < colNum; i++) {
|
||||||
|
@ -831,20 +840,21 @@ int32_t tmqPollCb(void* param, const SDataBuf* pMsg, int32_t code) {
|
||||||
SMqClientVg* pVg = pParam->pVg;
|
SMqClientVg* pVg = pParam->pVg;
|
||||||
tmq_t* tmq = pParam->tmq;
|
tmq_t* tmq = pParam->tmq;
|
||||||
if (code != 0) {
|
if (code != 0) {
|
||||||
tscWarn("msg discard, code:%x", code);
|
tscWarn("msg discard from vg %d, epoch %d, code:%x", pParam->vgId, pParam->epoch, code);
|
||||||
goto WRITE_QUEUE_FAIL;
|
goto CREATE_MSG_FAIL;
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t msgEpoch = ((SMqRspHead*)pMsg->pData)->epoch;
|
int32_t msgEpoch = ((SMqRspHead*)pMsg->pData)->epoch;
|
||||||
int32_t tmqEpoch = atomic_load_32(&tmq->epoch);
|
int32_t tmqEpoch = atomic_load_32(&tmq->epoch);
|
||||||
if (msgEpoch < tmqEpoch) {
|
if (msgEpoch < tmqEpoch) {
|
||||||
tsem_post(&tmq->rspSem);
|
/*printf("discard rsp epoch %d, current epoch %d\n", msgEpoch, tmqEpoch);*/
|
||||||
tscWarn("discard rsp epoch %d, current epoch %d", msgEpoch, tmqEpoch);
|
/*tsem_post(&tmq->rspSem);*/
|
||||||
|
tscWarn("msg discard from vg %d since from earlier epoch, rsp epoch %d, current epoch %d", pParam->vgId, msgEpoch, tmqEpoch);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (msgEpoch != tmqEpoch) {
|
if (msgEpoch != tmqEpoch) {
|
||||||
tscWarn("mismatch rsp epoch %d, current epoch %d", msgEpoch, tmqEpoch);
|
tscWarn("mismatch rsp from vg %d, epoch %d, current epoch %d", pParam->vgId, msgEpoch, tmqEpoch);
|
||||||
} else {
|
} else {
|
||||||
atomic_sub_fetch_32(&tmq->waitingRequest, 1);
|
atomic_sub_fetch_32(&tmq->waitingRequest, 1);
|
||||||
}
|
}
|
||||||
|
@ -871,7 +881,8 @@ int32_t tmqPollCb(void* param, const SDataBuf* pMsg, int32_t code) {
|
||||||
/*SMqConsumeRsp* pRsp = taosMemoryCalloc(1, sizeof(SMqConsumeRsp));*/
|
/*SMqConsumeRsp* pRsp = taosMemoryCalloc(1, sizeof(SMqConsumeRsp));*/
|
||||||
tmq_message_t* pRsp = taosAllocateQitem(sizeof(tmq_message_t));
|
tmq_message_t* pRsp = taosAllocateQitem(sizeof(tmq_message_t));
|
||||||
if (pRsp == NULL) {
|
if (pRsp == NULL) {
|
||||||
goto WRITE_QUEUE_FAIL;
|
tscWarn("msg discard from vg %d, epoch %d since out of memory", pParam->vgId, pParam->epoch);
|
||||||
|
goto CREATE_MSG_FAIL;
|
||||||
}
|
}
|
||||||
memcpy(pRsp, pMsg->pData, sizeof(SMqRspHead));
|
memcpy(pRsp, pMsg->pData, sizeof(SMqRspHead));
|
||||||
tDecodeSMqPollRsp(POINTER_SHIFT(pMsg->pData, sizeof(SMqRspHead)), &pRsp->msg);
|
tDecodeSMqPollRsp(POINTER_SHIFT(pMsg->pData, sizeof(SMqRspHead)), &pRsp->msg);
|
||||||
|
@ -880,23 +891,28 @@ int32_t tmqPollCb(void* param, const SDataBuf* pMsg, int32_t code) {
|
||||||
// TODO: alloc mem
|
// TODO: alloc mem
|
||||||
/*pRsp->*/
|
/*pRsp->*/
|
||||||
/*printf("rsp commit off:%ld rsp off:%ld has data:%d\n", pRsp->committedOffset, pRsp->rspOffset, pRsp->numOfTopics);*/
|
/*printf("rsp commit off:%ld rsp off:%ld has data:%d\n", pRsp->committedOffset, pRsp->rspOffset, pRsp->numOfTopics);*/
|
||||||
|
#if 0
|
||||||
if (pRsp->msg.numOfTopics == 0) {
|
if (pRsp->msg.numOfTopics == 0) {
|
||||||
/*printf("no data\n");*/
|
/*printf("no data\n");*/
|
||||||
taosFreeQitem(pRsp);
|
taosFreeQitem(pRsp);
|
||||||
goto WRITE_QUEUE_FAIL;
|
goto CREATE_MSG_FAIL;
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
tscDebug("consumer %ld recv poll: vg %d, req offset %ld, rsp offset %ld", tmq->consumerId, pParam->pVg->vgId, pRsp->msg.reqOffset,
|
||||||
|
pRsp->msg.rspOffset);
|
||||||
|
|
||||||
pRsp->vg = pParam->pVg;
|
pRsp->vg = pParam->pVg;
|
||||||
taosWriteQitem(tmq->mqueue, pRsp);
|
taosWriteQitem(tmq->mqueue, pRsp);
|
||||||
atomic_add_fetch_32(&tmq->readyRequest, 1);
|
atomic_add_fetch_32(&tmq->readyRequest, 1);
|
||||||
tsem_post(&tmq->rspSem);
|
/*tsem_post(&tmq->rspSem);*/
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
WRITE_QUEUE_FAIL:
|
CREATE_MSG_FAIL:
|
||||||
if (pParam->epoch == tmq->epoch) {
|
if (pParam->epoch == tmq->epoch) {
|
||||||
atomic_store_32(&pVg->vgStatus, TMQ_VG_STATUS__IDLE);
|
atomic_store_32(&pVg->vgStatus, TMQ_VG_STATUS__IDLE);
|
||||||
}
|
}
|
||||||
tsem_post(&tmq->rspSem);
|
/*tsem_post(&tmq->rspSem);*/
|
||||||
return code;
|
return code;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -905,6 +921,7 @@ bool tmqUpdateEp(tmq_t* tmq, int32_t epoch, SMqCMGetSubEpRsp* pRsp) {
|
||||||
bool set = false;
|
bool set = false;
|
||||||
int32_t topicNumGet = taosArrayGetSize(pRsp->topics);
|
int32_t topicNumGet = taosArrayGetSize(pRsp->topics);
|
||||||
char vgKey[TSDB_TOPIC_FNAME_LEN + 22];
|
char vgKey[TSDB_TOPIC_FNAME_LEN + 22];
|
||||||
|
tscDebug("consumer %ld update ep epoch %d to epoch %d, topic num: %d", tmq->consumerId, tmq->epoch, epoch, topicNumGet);
|
||||||
SArray* newTopics = taosArrayInit(topicNumGet, sizeof(SMqClientTopic));
|
SArray* newTopics = taosArrayInit(topicNumGet, sizeof(SMqClientTopic));
|
||||||
if (newTopics == NULL) {
|
if (newTopics == NULL) {
|
||||||
return false;
|
return false;
|
||||||
|
@ -922,16 +939,19 @@ bool tmqUpdateEp(tmq_t* tmq, int32_t epoch, SMqCMGetSubEpRsp* pRsp) {
|
||||||
taosHashClear(pHash);
|
taosHashClear(pHash);
|
||||||
topic.topicName = strdup(pTopicEp->topic);
|
topic.topicName = strdup(pTopicEp->topic);
|
||||||
|
|
||||||
|
tscDebug("consumer %ld update topic: %s", tmq->consumerId, topic.topicName);
|
||||||
int32_t topicNumCur = taosArrayGetSize(tmq->clientTopics);
|
int32_t topicNumCur = taosArrayGetSize(tmq->clientTopics);
|
||||||
for (int32_t j = 0; j < topicNumCur; j++) {
|
for (int32_t j = 0; j < topicNumCur; j++) {
|
||||||
// find old topic
|
// find old topic
|
||||||
SMqClientTopic* pTopicCur = taosArrayGet(tmq->clientTopics, j);
|
SMqClientTopic* pTopicCur = taosArrayGet(tmq->clientTopics, j);
|
||||||
if (pTopicCur->vgs && strcmp(pTopicCur->topicName, pTopicEp->topic) == 0) {
|
if (pTopicCur->vgs && strcmp(pTopicCur->topicName, pTopicEp->topic) == 0) {
|
||||||
int32_t vgNumCur = taosArrayGetSize(pTopicCur->vgs);
|
int32_t vgNumCur = taosArrayGetSize(pTopicCur->vgs);
|
||||||
|
tscDebug("consumer %ld new vg num: %d", tmq->consumerId, vgNumCur);
|
||||||
if (vgNumCur == 0) break;
|
if (vgNumCur == 0) break;
|
||||||
for (int32_t k = 0; k < vgNumCur; k++) {
|
for (int32_t k = 0; k < vgNumCur; k++) {
|
||||||
SMqClientVg* pVgCur = taosArrayGet(pTopicCur->vgs, k);
|
SMqClientVg* pVgCur = taosArrayGet(pTopicCur->vgs, k);
|
||||||
sprintf(vgKey, "%s:%d", topic.topicName, pVgCur->vgId);
|
sprintf(vgKey, "%s:%d", topic.topicName, pVgCur->vgId);
|
||||||
|
tscDebug("consumer %ld epoch %d vg %d build %s", tmq->consumerId, epoch, pVgCur->vgId, vgKey);
|
||||||
taosHashPut(pHash, vgKey, strlen(vgKey), &pVgCur->currentOffset, sizeof(int64_t));
|
taosHashPut(pHash, vgKey, strlen(vgKey), &pVgCur->currentOffset, sizeof(int64_t));
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
@ -945,15 +965,19 @@ bool tmqUpdateEp(tmq_t* tmq, int32_t epoch, SMqCMGetSubEpRsp* pRsp) {
|
||||||
sprintf(vgKey, "%s:%d", topic.topicName, pVgEp->vgId);
|
sprintf(vgKey, "%s:%d", topic.topicName, pVgEp->vgId);
|
||||||
int64_t* pOffset = taosHashGet(pHash, vgKey, strlen(vgKey));
|
int64_t* pOffset = taosHashGet(pHash, vgKey, strlen(vgKey));
|
||||||
int64_t offset = pVgEp->offset;
|
int64_t offset = pVgEp->offset;
|
||||||
|
tscDebug("consumer %ld epoch %d vg %d offset og to %ld", tmq->consumerId, epoch, pVgEp->vgId, offset);
|
||||||
if (pOffset != NULL) {
|
if (pOffset != NULL) {
|
||||||
offset = *pOffset;
|
offset = *pOffset;
|
||||||
|
tscDebug("consumer %ld epoch %d vg %d found %s", tmq->consumerId, epoch, pVgEp->vgId, vgKey);
|
||||||
}
|
}
|
||||||
|
tscDebug("consumer %ld epoch %d vg %d offset set to %ld", tmq->consumerId, epoch, pVgEp->vgId, offset);
|
||||||
SMqClientVg clientVg = {
|
SMqClientVg clientVg = {
|
||||||
.pollCnt = 0,
|
.pollCnt = 0,
|
||||||
.currentOffset = offset,
|
.currentOffset = offset,
|
||||||
.vgId = pVgEp->vgId,
|
.vgId = pVgEp->vgId,
|
||||||
.epSet = pVgEp->epSet,
|
.epSet = pVgEp->epSet,
|
||||||
.vgStatus = TMQ_VG_STATUS__IDLE,
|
.vgStatus = TMQ_VG_STATUS__IDLE,
|
||||||
|
.vgSkipCnt = 0,
|
||||||
};
|
};
|
||||||
taosArrayPush(topic.vgs, &clientVg);
|
taosArrayPush(topic.vgs, &clientVg);
|
||||||
set = true;
|
set = true;
|
||||||
|
@ -971,7 +995,7 @@ int32_t tmqAskEpCb(void* param, const SDataBuf* pMsg, int32_t code) {
|
||||||
SMqAskEpCbParam* pParam = (SMqAskEpCbParam*)param;
|
SMqAskEpCbParam* pParam = (SMqAskEpCbParam*)param;
|
||||||
tmq_t* tmq = pParam->tmq;
|
tmq_t* tmq = pParam->tmq;
|
||||||
if (code != 0) {
|
if (code != 0) {
|
||||||
tscError("get topic endpoint error, not ready, wait:%d\n", pParam->sync);
|
tscError("consumer %ld get topic endpoint error, not ready, wait:%d", tmq->consumerId, pParam->sync);
|
||||||
goto END;
|
goto END;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -980,6 +1004,7 @@ int32_t tmqAskEpCb(void* param, const SDataBuf* pMsg, int32_t code) {
|
||||||
// Epoch will only increase when received newer epoch ep msg
|
// Epoch will only increase when received newer epoch ep msg
|
||||||
SMqRspHead* head = pMsg->pData;
|
SMqRspHead* head = pMsg->pData;
|
||||||
int32_t epoch = atomic_load_32(&tmq->epoch);
|
int32_t epoch = atomic_load_32(&tmq->epoch);
|
||||||
|
tscDebug("consumer %ld recv ep, msg epoch %d, current epoch %d", tmq->consumerId, head->epoch, epoch);
|
||||||
if (head->epoch <= epoch) {
|
if (head->epoch <= epoch) {
|
||||||
goto END;
|
goto END;
|
||||||
}
|
}
|
||||||
|
@ -1004,10 +1029,11 @@ int32_t tmqAskEpCb(void* param, const SDataBuf* pMsg, int32_t code) {
|
||||||
tDecodeSMqCMGetSubEpRsp(POINTER_SHIFT(pMsg->pData, sizeof(SMqRspHead)), pRsp);
|
tDecodeSMqCMGetSubEpRsp(POINTER_SHIFT(pMsg->pData, sizeof(SMqRspHead)), pRsp);
|
||||||
|
|
||||||
taosWriteQitem(tmq->mqueue, pRsp);
|
taosWriteQitem(tmq->mqueue, pRsp);
|
||||||
tsem_post(&tmq->rspSem);
|
/*tsem_post(&tmq->rspSem);*/
|
||||||
}
|
}
|
||||||
|
|
||||||
END:
|
END:
|
||||||
|
atomic_store_8(&tmq->epStatus, 0);
|
||||||
if (pParam->sync) {
|
if (pParam->sync) {
|
||||||
tsem_post(&pParam->rspSem);
|
tsem_post(&pParam->rspSem);
|
||||||
}
|
}
|
||||||
|
@ -1015,10 +1041,18 @@ END:
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t tmqAskEp(tmq_t* tmq, bool sync) {
|
int32_t tmqAskEp(tmq_t* tmq, bool sync) {
|
||||||
|
int8_t epStatus = atomic_val_compare_exchange_8(&tmq->epStatus, 0, 1);
|
||||||
|
if (epStatus == 1) {
|
||||||
|
int32_t epSkipCnt = atomic_add_fetch_32(&tmq->epSkipCnt, 1);
|
||||||
|
tscTrace("consumer %ld skip ask ep cnt %d", tmq->consumerId, epSkipCnt);
|
||||||
|
if (epSkipCnt < 5000) return 0;
|
||||||
|
}
|
||||||
|
atomic_store_32(&tmq->epSkipCnt, 0);
|
||||||
int32_t tlen = sizeof(SMqCMGetSubEpReq);
|
int32_t tlen = sizeof(SMqCMGetSubEpReq);
|
||||||
SMqCMGetSubEpReq* req = taosMemoryMalloc(tlen);
|
SMqCMGetSubEpReq* req = taosMemoryMalloc(tlen);
|
||||||
if (req == NULL) {
|
if (req == NULL) {
|
||||||
tscError("failed to malloc get subscribe ep buf");
|
tscError("failed to malloc get subscribe ep buf");
|
||||||
|
atomic_store_8(&tmq->epStatus, 0);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
req->consumerId = htobe64(tmq->consumerId);
|
req->consumerId = htobe64(tmq->consumerId);
|
||||||
|
@ -1029,6 +1063,7 @@ int32_t tmqAskEp(tmq_t* tmq, bool sync) {
|
||||||
if (pParam == NULL) {
|
if (pParam == NULL) {
|
||||||
tscError("failed to malloc subscribe param");
|
tscError("failed to malloc subscribe param");
|
||||||
taosMemoryFree(req);
|
taosMemoryFree(req);
|
||||||
|
atomic_store_8(&tmq->epStatus, 0);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
pParam->tmq = tmq;
|
pParam->tmq = tmq;
|
||||||
|
@ -1040,6 +1075,7 @@ int32_t tmqAskEp(tmq_t* tmq, bool sync) {
|
||||||
tsem_destroy(&pParam->rspSem);
|
tsem_destroy(&pParam->rspSem);
|
||||||
taosMemoryFree(pParam);
|
taosMemoryFree(pParam);
|
||||||
taosMemoryFree(req);
|
taosMemoryFree(req);
|
||||||
|
atomic_store_8(&tmq->epStatus, 0);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1057,6 +1093,8 @@ int32_t tmqAskEp(tmq_t* tmq, bool sync) {
|
||||||
|
|
||||||
SEpSet epSet = getEpSet_s(&tmq->pTscObj->pAppInfo->mgmtEp);
|
SEpSet epSet = getEpSet_s(&tmq->pTscObj->pAppInfo->mgmtEp);
|
||||||
|
|
||||||
|
tscDebug("consumer %ld ask ep", tmq->consumerId);
|
||||||
|
|
||||||
int64_t transporterId = 0;
|
int64_t transporterId = 0;
|
||||||
asyncSendMsgToServer(tmq->pTscObj->pAppInfo->pTransporter, &epSet, &transporterId, sendInfo);
|
asyncSendMsgToServer(tmq->pTscObj->pAppInfo->pTransporter, &epSet, &transporterId, sendInfo);
|
||||||
|
|
||||||
|
@ -1111,6 +1149,7 @@ SMqPollReq* tmqBuildConsumeReqImpl(tmq_t* tmq, int64_t blockingTime, SMqClientTo
|
||||||
pReq->consumerId = tmq->consumerId;
|
pReq->consumerId = tmq->consumerId;
|
||||||
pReq->epoch = tmq->epoch;
|
pReq->epoch = tmq->epoch;
|
||||||
pReq->currentOffset = reqOffset;
|
pReq->currentOffset = reqOffset;
|
||||||
|
pReq->reqId = generateRequestId();
|
||||||
|
|
||||||
pReq->head.vgId = htonl(pVg->vgId);
|
pReq->head.vgId = htonl(pVg->vgId);
|
||||||
pReq->head.contLen = htonl(sizeof(SMqPollReq));
|
pReq->head.contLen = htonl(sizeof(SMqPollReq));
|
||||||
|
@ -1195,23 +1234,35 @@ int32_t tmqPollImpl(tmq_t* tmq, int64_t blockingTime) {
|
||||||
SMqClientVg* pVg = taosArrayGet(pTopic->vgs, j);
|
SMqClientVg* pVg = taosArrayGet(pTopic->vgs, j);
|
||||||
int32_t vgStatus = atomic_val_compare_exchange_32(&pVg->vgStatus, TMQ_VG_STATUS__IDLE, TMQ_VG_STATUS__WAIT);
|
int32_t vgStatus = atomic_val_compare_exchange_32(&pVg->vgStatus, TMQ_VG_STATUS__IDLE, TMQ_VG_STATUS__WAIT);
|
||||||
if (vgStatus != TMQ_VG_STATUS__IDLE) {
|
if (vgStatus != TMQ_VG_STATUS__IDLE) {
|
||||||
|
int32_t vgSkipCnt = atomic_add_fetch_32(&pVg->vgSkipCnt, 1);
|
||||||
|
tscTrace("consumer %ld epoch %d skip vg %d skip cnt %d", tmq->consumerId, tmq->epoch, pVg->vgId, vgSkipCnt);
|
||||||
continue;
|
continue;
|
||||||
|
/*if (vgSkipCnt < 10000) continue;*/
|
||||||
|
#if 0
|
||||||
|
if (skipCnt < 30000) {
|
||||||
|
continue;
|
||||||
|
} else {
|
||||||
|
tscDebug("consumer %ld skip vg %d skip too much reset", tmq->consumerId, pVg->vgId);
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
atomic_store_32(&pVg->vgSkipCnt, 0);
|
||||||
SMqPollReq* pReq = tmqBuildConsumeReqImpl(tmq, blockingTime, pTopic, pVg);
|
SMqPollReq* pReq = tmqBuildConsumeReqImpl(tmq, blockingTime, pTopic, pVg);
|
||||||
if (pReq == NULL) {
|
if (pReq == NULL) {
|
||||||
atomic_store_32(&pVg->vgStatus, TMQ_VG_STATUS__IDLE);
|
atomic_store_32(&pVg->vgStatus, TMQ_VG_STATUS__IDLE);
|
||||||
tsem_post(&tmq->rspSem);
|
/*tsem_post(&tmq->rspSem);*/
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
SMqPollCbParam* pParam = taosMemoryMalloc(sizeof(SMqPollCbParam));
|
SMqPollCbParam* pParam = taosMemoryMalloc(sizeof(SMqPollCbParam));
|
||||||
if (pParam == NULL) {
|
if (pParam == NULL) {
|
||||||
taosMemoryFree(pReq);
|
taosMemoryFree(pReq);
|
||||||
atomic_store_32(&pVg->vgStatus, TMQ_VG_STATUS__IDLE);
|
atomic_store_32(&pVg->vgStatus, TMQ_VG_STATUS__IDLE);
|
||||||
tsem_post(&tmq->rspSem);
|
/*tsem_post(&tmq->rspSem);*/
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
pParam->tmq = tmq;
|
pParam->tmq = tmq;
|
||||||
pParam->pVg = pVg;
|
pParam->pVg = pVg;
|
||||||
|
pParam->vgId = pVg->vgId;
|
||||||
pParam->epoch = tmq->epoch;
|
pParam->epoch = tmq->epoch;
|
||||||
pParam->sync = 0;
|
pParam->sync = 0;
|
||||||
|
|
||||||
|
@ -1220,7 +1271,7 @@ int32_t tmqPollImpl(tmq_t* tmq, int64_t blockingTime) {
|
||||||
taosMemoryFree(pReq);
|
taosMemoryFree(pReq);
|
||||||
taosMemoryFree(pParam);
|
taosMemoryFree(pParam);
|
||||||
atomic_store_32(&pVg->vgStatus, TMQ_VG_STATUS__IDLE);
|
atomic_store_32(&pVg->vgStatus, TMQ_VG_STATUS__IDLE);
|
||||||
tsem_post(&tmq->rspSem);
|
/*tsem_post(&tmq->rspSem);*/
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1229,7 +1280,7 @@ int32_t tmqPollImpl(tmq_t* tmq, int64_t blockingTime) {
|
||||||
.len = sizeof(SMqPollReq),
|
.len = sizeof(SMqPollReq),
|
||||||
.handle = NULL,
|
.handle = NULL,
|
||||||
};
|
};
|
||||||
sendInfo->requestId = generateRequestId();
|
sendInfo->requestId = pReq->reqId;
|
||||||
sendInfo->requestObjRefId = 0;
|
sendInfo->requestObjRefId = 0;
|
||||||
sendInfo->param = pParam;
|
sendInfo->param = pParam;
|
||||||
sendInfo->fp = tmqPollCb;
|
sendInfo->fp = tmqPollCb;
|
||||||
|
@ -1238,6 +1289,8 @@ int32_t tmqPollImpl(tmq_t* tmq, int64_t blockingTime) {
|
||||||
int64_t transporterId = 0;
|
int64_t transporterId = 0;
|
||||||
/*printf("send poll\n");*/
|
/*printf("send poll\n");*/
|
||||||
atomic_add_fetch_32(&tmq->waitingRequest, 1);
|
atomic_add_fetch_32(&tmq->waitingRequest, 1);
|
||||||
|
tscDebug("consumer %ld send poll to %s : vg %d, epoch %d, req offset %ld, reqId %lu", tmq->consumerId, pTopic->topicName, pVg->vgId, tmq->epoch, pVg->currentOffset, pReq->reqId);
|
||||||
|
/*printf("send vg %d %ld\n", pVg->vgId, pVg->currentOffset);*/
|
||||||
asyncSendMsgToServer(tmq->pTscObj->pAppInfo->pTransporter, &pVg->epSet, &transporterId, sendInfo);
|
asyncSendMsgToServer(tmq->pTscObj->pAppInfo->pTransporter, &pVg->epSet, &transporterId, sendInfo);
|
||||||
pVg->pollCnt++;
|
pVg->pollCnt++;
|
||||||
tmq->pollCnt++;
|
tmq->pollCnt++;
|
||||||
|
@ -1247,13 +1300,13 @@ int32_t tmqPollImpl(tmq_t* tmq, int64_t blockingTime) {
|
||||||
}
|
}
|
||||||
|
|
||||||
// return
|
// return
|
||||||
int32_t tmqHandleRes(tmq_t* tmq, SMqRspHead* rspHead, bool* pReset) {
|
int32_t tmqHandleNoPollRsp(tmq_t* tmq, SMqRspHead* rspHead, bool* pReset) {
|
||||||
if (rspHead->mqMsgType == TMQ_MSG_TYPE__EP_RSP) {
|
if (rspHead->mqMsgType == TMQ_MSG_TYPE__EP_RSP) {
|
||||||
/*printf("ep %d %d\n", rspMsg->head.epoch, tmq->epoch);*/
|
/*printf("ep %d %d\n", rspMsg->head.epoch, tmq->epoch);*/
|
||||||
if (rspHead->epoch > atomic_load_32(&tmq->epoch)) {
|
if (rspHead->epoch > atomic_load_32(&tmq->epoch)) {
|
||||||
SMqCMGetSubEpRsp* rspMsg = (SMqCMGetSubEpRsp*)rspHead;
|
SMqCMGetSubEpRsp* rspMsg = (SMqCMGetSubEpRsp*)rspHead;
|
||||||
tmqUpdateEp(tmq, rspHead->epoch, rspMsg);
|
tmqUpdateEp(tmq, rspHead->epoch, rspMsg);
|
||||||
tmqClearUnhandleMsg(tmq);
|
/*tmqClearUnhandleMsg(tmq);*/
|
||||||
*pReset = true;
|
*pReset = true;
|
||||||
} else {
|
} else {
|
||||||
*pReset = false;
|
*pReset = false;
|
||||||
|
@ -1284,6 +1337,11 @@ tmq_message_t* tmqHandleAllRsp(tmq_t* tmq, int64_t blockingTime, bool pollIfRese
|
||||||
/*printf("vg %d offset %ld up to %ld\n", pVg->vgId, pVg->currentOffset, rspMsg->msg.rspOffset);*/
|
/*printf("vg %d offset %ld up to %ld\n", pVg->vgId, pVg->currentOffset, rspMsg->msg.rspOffset);*/
|
||||||
pVg->currentOffset = rspMsg->msg.rspOffset;
|
pVg->currentOffset = rspMsg->msg.rspOffset;
|
||||||
atomic_store_32(&pVg->vgStatus, TMQ_VG_STATUS__IDLE);
|
atomic_store_32(&pVg->vgStatus, TMQ_VG_STATUS__IDLE);
|
||||||
|
if (rspMsg->msg.numOfTopics == 0) {
|
||||||
|
taosFreeQitem(rspMsg);
|
||||||
|
rspHead = NULL;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
return rspMsg;
|
return rspMsg;
|
||||||
} else {
|
} else {
|
||||||
/*printf("epoch mismatch\n");*/
|
/*printf("epoch mismatch\n");*/
|
||||||
|
@ -1292,10 +1350,10 @@ tmq_message_t* tmqHandleAllRsp(tmq_t* tmq, int64_t blockingTime, bool pollIfRese
|
||||||
} else {
|
} else {
|
||||||
/*printf("handle ep rsp %d\n", rspMsg->head.mqMsgType);*/
|
/*printf("handle ep rsp %d\n", rspMsg->head.mqMsgType);*/
|
||||||
bool reset = false;
|
bool reset = false;
|
||||||
tmqHandleRes(tmq, rspHead, &reset);
|
tmqHandleNoPollRsp(tmq, rspHead, &reset);
|
||||||
taosFreeQitem(rspHead);
|
taosFreeQitem(rspHead);
|
||||||
if (pollIfReset && reset) {
|
if (pollIfReset && reset) {
|
||||||
printf("reset and repoll\n");
|
tscDebug("consumer %ld reset and repoll", tmq->consumerId);
|
||||||
tmqPollImpl(tmq, blockingTime);
|
tmqPollImpl(tmq, blockingTime);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1345,7 +1403,7 @@ tmq_message_t* tmq_consumer_poll(tmq_t* tmq, int64_t blocking_time) {
|
||||||
tmqAskEp(tmq, false);
|
tmqAskEp(tmq, false);
|
||||||
tmqPollImpl(tmq, blocking_time);
|
tmqPollImpl(tmq, blocking_time);
|
||||||
|
|
||||||
tsem_wait(&tmq->rspSem);
|
/*tsem_wait(&tmq->rspSem);*/
|
||||||
|
|
||||||
rspMsg = tmqHandleAllRsp(tmq, blocking_time, false);
|
rspMsg = tmqHandleAllRsp(tmq, blocking_time, false);
|
||||||
if (rspMsg) {
|
if (rspMsg) {
|
||||||
|
@ -1354,6 +1412,7 @@ tmq_message_t* tmq_consumer_poll(tmq_t* tmq, int64_t blocking_time) {
|
||||||
if (blocking_time != 0) {
|
if (blocking_time != 0) {
|
||||||
int64_t endTime = taosGetTimestampMs();
|
int64_t endTime = taosGetTimestampMs();
|
||||||
if (endTime - startTime > blocking_time) {
|
if (endTime - startTime > blocking_time) {
|
||||||
|
tscDebug("consumer %ld (epoch %d) timeout, no rsp", tmq->consumerId, tmq->epoch);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1534,24 +1593,3 @@ TAOS_ROW tmq_get_row(tmq_message_t* message) {
|
||||||
}
|
}
|
||||||
|
|
||||||
char* tmq_get_topic_name(tmq_message_t* message) { return "not implemented yet"; }
|
char* tmq_get_topic_name(tmq_message_t* message) { return "not implemented yet"; }
|
||||||
|
|
||||||
#if 0
|
|
||||||
tmq_t* tmqCreateConsumerImpl(TAOS* conn, tmq_conf_t* conf) {
|
|
||||||
tmq_t* pTmq = taosMemoryMalloc(sizeof(tmq_t));
|
|
||||||
if (pTmq == NULL) {
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
strcpy(pTmq->groupId, conf->groupId);
|
|
||||||
strcpy(pTmq->clientId, conf->clientId);
|
|
||||||
pTmq->pTscObj = (STscObj*)conn;
|
|
||||||
pTmq->pTscObj->connType = HEARTBEAT_TYPE_MQ;
|
|
||||||
return pTmq;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
static void destroySendMsgInfo(SMsgSendInfo* pMsgBody) {
|
|
||||||
assert(pMsgBody != NULL);
|
|
||||||
taosMemoryFreeClear(pMsgBody->msgInfo.pData);
|
|
||||||
taosMemoryFreeClear(pMsgBody);
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
|
@ -400,6 +400,7 @@ TEST(testCase, show_vgroup_Test) {
|
||||||
taos_free_result(pRes);
|
taos_free_result(pRes);
|
||||||
taos_close(pConn);
|
taos_close(pConn);
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
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);
|
||||||
|
@ -458,7 +459,7 @@ TEST(testCase, create_multiple_tables) {
|
||||||
|
|
||||||
taos_free_result(pRes);
|
taos_free_result(pRes);
|
||||||
|
|
||||||
for (int32_t i = 0; i < 20; ++i) {
|
for (int32_t i = 0; i < 25000; ++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,
|
||||||
|
@ -652,7 +653,6 @@ TEST(testCase, projection_query_stables) {
|
||||||
taos_free_result(pRes);
|
taos_free_result(pRes);
|
||||||
taos_close(pConn);
|
taos_close(pConn);
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
|
|
||||||
TEST(testCase, agg_query_tables) {
|
TEST(testCase, agg_query_tables) {
|
||||||
TAOS* pConn = taos_connect("localhost", "root", "taosdata", NULL, 0);
|
TAOS* pConn = taos_connect("localhost", "root", "taosdata", NULL, 0);
|
||||||
|
|
|
@ -17,6 +17,7 @@
|
||||||
#include "tdatablock.h"
|
#include "tdatablock.h"
|
||||||
#include "tcompare.h"
|
#include "tcompare.h"
|
||||||
#include "tglobal.h"
|
#include "tglobal.h"
|
||||||
|
#include "tlog.h"
|
||||||
|
|
||||||
int32_t taosGetFqdnPortFromEp(const char* ep, SEp* pEp) {
|
int32_t taosGetFqdnPortFromEp(const char* ep, SEp* pEp) {
|
||||||
pEp->port = 0;
|
pEp->port = 0;
|
||||||
|
@ -130,44 +131,7 @@ int32_t colDataAppend(SColumnInfoData* pColumnInfoData, uint32_t currentRow, con
|
||||||
memcpy(pColumnInfoData->pData + len, pData, varDataTLen(pData));
|
memcpy(pColumnInfoData->pData + len, pData, varDataTLen(pData));
|
||||||
pColumnInfoData->varmeta.length += varDataTLen(pData);
|
pColumnInfoData->varmeta.length += varDataTLen(pData);
|
||||||
} else {
|
} else {
|
||||||
char* p = pColumnInfoData->pData + pColumnInfoData->info.bytes * currentRow;
|
memcpy(pColumnInfoData->pData + pColumnInfoData->info.bytes * currentRow, pData, pColumnInfoData->info.bytes);
|
||||||
switch (type) {
|
|
||||||
case TSDB_DATA_TYPE_BOOL: {
|
|
||||||
*(bool*)p = *(bool*)pData;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case TSDB_DATA_TYPE_TINYINT:
|
|
||||||
case TSDB_DATA_TYPE_UTINYINT: {
|
|
||||||
*(int8_t*)p = *(int8_t*)pData;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case TSDB_DATA_TYPE_SMALLINT:
|
|
||||||
case TSDB_DATA_TYPE_USMALLINT: {
|
|
||||||
*(int16_t*)p = *(int16_t*)pData;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case TSDB_DATA_TYPE_INT:
|
|
||||||
case TSDB_DATA_TYPE_UINT: {
|
|
||||||
*(int32_t*)p = *(int32_t*)pData;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case TSDB_DATA_TYPE_TIMESTAMP:
|
|
||||||
case TSDB_DATA_TYPE_BIGINT:
|
|
||||||
case TSDB_DATA_TYPE_UBIGINT: {
|
|
||||||
*(int64_t*)p = *(int64_t*)pData;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case TSDB_DATA_TYPE_FLOAT: {
|
|
||||||
*(float*)p = *(float*)pData;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case TSDB_DATA_TYPE_DOUBLE: {
|
|
||||||
*(double*)p = *(double*)pData;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
default:
|
|
||||||
assert(0);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -175,6 +139,8 @@ int32_t colDataAppend(SColumnInfoData* pColumnInfoData, uint32_t currentRow, con
|
||||||
|
|
||||||
static void doBitmapMerge(SColumnInfoData* pColumnInfoData, int32_t numOfRow1, const SColumnInfoData* pSource,
|
static void doBitmapMerge(SColumnInfoData* pColumnInfoData, int32_t numOfRow1, const SColumnInfoData* pSource,
|
||||||
int32_t numOfRow2) {
|
int32_t numOfRow2) {
|
||||||
|
if (numOfRow2 <= 0) return;
|
||||||
|
|
||||||
uint32_t total = numOfRow1 + numOfRow2;
|
uint32_t total = numOfRow1 + numOfRow2;
|
||||||
|
|
||||||
if (BitmapLen(numOfRow1) < BitmapLen(total)) {
|
if (BitmapLen(numOfRow1) < BitmapLen(total)) {
|
||||||
|
@ -189,22 +155,32 @@ static void doBitmapMerge(SColumnInfoData* pColumnInfoData, int32_t numOfRow1, c
|
||||||
|
|
||||||
if (remindBits == 0) { // no need to shift bits of bitmap
|
if (remindBits == 0) { // no need to shift bits of bitmap
|
||||||
memcpy(pColumnInfoData->nullbitmap + BitmapLen(numOfRow1), pSource->nullbitmap, BitmapLen(numOfRow2));
|
memcpy(pColumnInfoData->nullbitmap + BitmapLen(numOfRow1), pSource->nullbitmap, BitmapLen(numOfRow2));
|
||||||
} else {
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
uint8_t* p = (uint8_t*)pSource->nullbitmap;
|
||||||
|
pColumnInfoData->nullbitmap[BitmapLen(numOfRow1) - 1] |= (p[0] >> remindBits); // copy remind bits
|
||||||
|
|
||||||
|
if (BitmapLen(numOfRow1) == BitmapLen(total)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
int32_t len = BitmapLen(numOfRow2);
|
int32_t len = BitmapLen(numOfRow2);
|
||||||
int32_t i = 0;
|
int32_t i = 0;
|
||||||
|
|
||||||
uint8_t* p = (uint8_t*)pSource->nullbitmap;
|
|
||||||
pColumnInfoData->nullbitmap[BitmapLen(numOfRow1) - 1] |= (p[0] >> remindBits);
|
|
||||||
|
|
||||||
uint8_t* start = (uint8_t*)&pColumnInfoData->nullbitmap[BitmapLen(numOfRow1)];
|
uint8_t* start = (uint8_t*)&pColumnInfoData->nullbitmap[BitmapLen(numOfRow1)];
|
||||||
while (i < len) {
|
int32_t overCount = BitmapLen(total) - BitmapLen(numOfRow1);
|
||||||
start[i] |= (p[i] << shiftBits);
|
while (i < len) { // size limit of pSource->nullbitmap
|
||||||
i += 1;
|
if (i >= 1) {
|
||||||
|
start[i - 1] |= (p[i] >> remindBits); //copy remind bits
|
||||||
|
}
|
||||||
|
|
||||||
if (i > 1) {
|
if (i >= overCount) { // size limit of pColumnInfoData->nullbitmap
|
||||||
start[i - 1] |= (p[i] >> remindBits);
|
return;
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
start[i] |= (p[i] << shiftBits); //copy shift bits
|
||||||
|
i += 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -216,6 +192,9 @@ int32_t colDataMergeCol(SColumnInfoData* pColumnInfoData, uint32_t numOfRow1, co
|
||||||
return numOfRow1;
|
return numOfRow1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (pSource->hasNull) {
|
||||||
|
pColumnInfoData->hasNull = pSource->hasNull;
|
||||||
|
}
|
||||||
if (IS_VAR_DATA_TYPE(pColumnInfoData->info.type)) {
|
if (IS_VAR_DATA_TYPE(pColumnInfoData->info.type)) {
|
||||||
// Handle the bitmap
|
// Handle the bitmap
|
||||||
char* p = taosMemoryRealloc(pColumnInfoData->varmeta.offset, sizeof(int32_t) * (numOfRow1 + numOfRow2));
|
char* p = taosMemoryRealloc(pColumnInfoData->varmeta.offset, sizeof(int32_t) * (numOfRow1 + numOfRow2));
|
||||||
|
@ -336,13 +315,18 @@ int32_t blockDataUpdateTsWindow(SSDataBlock* pDataBlock) {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t blockDataMerge(SSDataBlock* pDest, const SSDataBlock* pSrc) {
|
// if pIndexMap = NULL, merger one column by on column
|
||||||
assert(pSrc != NULL && pDest != NULL && pDest->info.numOfCols == pSrc->info.numOfCols);
|
int32_t blockDataMerge(SSDataBlock* pDest, const SSDataBlock* pSrc, SArray* pIndexMap) {
|
||||||
|
assert(pSrc != NULL && pDest != NULL);
|
||||||
|
|
||||||
int32_t numOfCols = pSrc->info.numOfCols;
|
int32_t numOfCols = pDest->info.numOfCols;
|
||||||
for (int32_t i = 0; i < numOfCols; ++i) {
|
for (int32_t i = 0; i < numOfCols; ++i) {
|
||||||
|
int32_t mapIndex = i;
|
||||||
|
if(pIndexMap) {
|
||||||
|
mapIndex = *(int32_t*)taosArrayGet(pIndexMap, i);
|
||||||
|
}
|
||||||
SColumnInfoData* pCol2 = taosArrayGet(pDest->pDataBlock, i);
|
SColumnInfoData* pCol2 = taosArrayGet(pDest->pDataBlock, i);
|
||||||
SColumnInfoData* pCol1 = taosArrayGet(pSrc->pDataBlock, i);
|
SColumnInfoData* pCol1 = taosArrayGet(pSrc->pDataBlock, mapIndex);
|
||||||
|
|
||||||
uint32_t oldLen = colDataGetLength(pCol2, pDest->info.rows);
|
uint32_t oldLen = colDataGetLength(pCol2, pDest->info.rows);
|
||||||
uint32_t newLen = colDataGetLength(pCol1, pSrc->info.rows);
|
uint32_t newLen = colDataGetLength(pCol1, pSrc->info.rows);
|
||||||
|
@ -399,26 +383,23 @@ int32_t blockDataSplitRows(SSDataBlock* pBlock, bool hasVarCol, int32_t startInd
|
||||||
// TODO speedup by checking if the whole page can fit in firstly.
|
// TODO speedup by checking if the whole page can fit in firstly.
|
||||||
if (!hasVarCol) {
|
if (!hasVarCol) {
|
||||||
size_t rowSize = blockDataGetRowSize(pBlock);
|
size_t rowSize = blockDataGetRowSize(pBlock);
|
||||||
int32_t capacity = (payloadSize / (rowSize * 8 + bitmapChar * numOfCols)) * 8;
|
int32_t capacity = payloadSize / (rowSize + numOfCols * bitmapChar / 8.0);
|
||||||
|
ASSERT(capacity > 0);
|
||||||
|
|
||||||
*stopIndex = startIndex + capacity;
|
*stopIndex = startIndex + capacity - 1;
|
||||||
if (*stopIndex >= numOfRows) {
|
if (*stopIndex >= numOfRows) {
|
||||||
*stopIndex = numOfRows - 1;
|
*stopIndex = numOfRows - 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
} else {
|
}
|
||||||
// iterate the rows that can be fit in this buffer page
|
// iterate the rows that can be fit in this buffer page
|
||||||
int32_t size = (headerSize + colHeaderSize);
|
int32_t size = (headerSize + colHeaderSize);
|
||||||
|
|
||||||
for (int32_t j = startIndex; j < numOfRows; ++j) {
|
for (int32_t j = startIndex; j < numOfRows; ++j) {
|
||||||
for (int32_t i = 0; i < numOfCols; ++i) {
|
for (int32_t i = 0; i < numOfCols; ++i) {
|
||||||
SColumnInfoData* pColInfoData = TARRAY_GET_ELEM(pBlock->pDataBlock, i);
|
SColumnInfoData* pColInfoData = TARRAY_GET_ELEM(pBlock->pDataBlock, i);
|
||||||
if (IS_VAR_DATA_TYPE(pColInfoData->info.type)) {
|
if (IS_VAR_DATA_TYPE(pColInfoData->info.type)) {
|
||||||
bool isNull = colDataIsNull(pColInfoData, numOfRows, j, NULL);
|
if (pColInfoData->varmeta.offset[j] != -1) {
|
||||||
if (isNull) {
|
|
||||||
// do nothing
|
|
||||||
} else {
|
|
||||||
char* p = colDataGetData(pColInfoData, j);
|
char* p = colDataGetData(pColInfoData, j);
|
||||||
size += varDataTLen(p);
|
size += varDataTLen(p);
|
||||||
}
|
}
|
||||||
|
@ -433,9 +414,9 @@ int32_t blockDataSplitRows(SSDataBlock* pBlock, bool hasVarCol, int32_t startInd
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (size > pageSize) {
|
if (size > pageSize) { // pageSize must be able to hold one row
|
||||||
*stopIndex = j - 1;
|
*stopIndex = j - 1;
|
||||||
ASSERT(*stopIndex > startIndex);
|
ASSERT(*stopIndex >= startIndex);
|
||||||
|
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
|
@ -444,7 +425,7 @@ int32_t blockDataSplitRows(SSDataBlock* pBlock, bool hasVarCol, int32_t startInd
|
||||||
// all fit in
|
// all fit in
|
||||||
*stopIndex = numOfRows - 1;
|
*stopIndex = numOfRows - 1;
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
SSDataBlock* blockDataExtractBlock(SSDataBlock* pBlock, int32_t startIndex, int32_t rowCount) {
|
SSDataBlock* blockDataExtractBlock(SSDataBlock* pBlock, int32_t startIndex, int32_t rowCount) {
|
||||||
|
@ -547,8 +528,13 @@ int32_t blockDataFromBuf(SSDataBlock* pBlock, const char* buf) {
|
||||||
for (int32_t i = 0; i < numOfCols; ++i) {
|
for (int32_t i = 0; i < numOfCols; ++i) {
|
||||||
SColumnInfoData* pCol = taosArrayGet(pBlock->pDataBlock, i);
|
SColumnInfoData* pCol = taosArrayGet(pBlock->pDataBlock, i);
|
||||||
|
|
||||||
size_t metaSize = pBlock->info.rows * sizeof(int32_t);
|
|
||||||
if (IS_VAR_DATA_TYPE(pCol->info.type)) {
|
if (IS_VAR_DATA_TYPE(pCol->info.type)) {
|
||||||
|
size_t metaSize = pBlock->info.rows * sizeof(int32_t);
|
||||||
|
char* tmp = taosMemoryRealloc(pCol->varmeta.offset, metaSize); // preview calloc is too small
|
||||||
|
if (tmp == NULL) {
|
||||||
|
return TSDB_CODE_OUT_OF_MEMORY;
|
||||||
|
}
|
||||||
|
pCol->varmeta.offset = (int32_t*)tmp;
|
||||||
memcpy(pCol->varmeta.offset, pStart, metaSize);
|
memcpy(pCol->varmeta.offset, pStart, metaSize);
|
||||||
pStart += metaSize;
|
pStart += metaSize;
|
||||||
} else {
|
} else {
|
||||||
|
@ -581,6 +567,49 @@ int32_t blockDataFromBuf(SSDataBlock* pBlock, const char* buf) {
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int32_t blockDataFromBuf1(SSDataBlock* pBlock, const char* buf, size_t capacity) {
|
||||||
|
pBlock->info.rows = *(int32_t*)buf;
|
||||||
|
|
||||||
|
int32_t numOfCols = pBlock->info.numOfCols;
|
||||||
|
const char* pStart = buf + sizeof(uint32_t);
|
||||||
|
|
||||||
|
for (int32_t i = 0; i < numOfCols; ++i) {
|
||||||
|
SColumnInfoData* pCol = taosArrayGet(pBlock->pDataBlock, i);
|
||||||
|
|
||||||
|
if (IS_VAR_DATA_TYPE(pCol->info.type)) {
|
||||||
|
size_t metaSize = capacity * sizeof(int32_t);
|
||||||
|
memcpy(pCol->varmeta.offset, pStart, metaSize);
|
||||||
|
pStart += metaSize;
|
||||||
|
} else {
|
||||||
|
memcpy(pCol->nullbitmap, pStart, BitmapLen(capacity));
|
||||||
|
pStart += BitmapLen(capacity);
|
||||||
|
}
|
||||||
|
|
||||||
|
int32_t colLength = *(int32_t*)pStart;
|
||||||
|
pStart += sizeof(int32_t);
|
||||||
|
|
||||||
|
if (IS_VAR_DATA_TYPE(pCol->info.type)) {
|
||||||
|
if (pCol->varmeta.allocLen < colLength) {
|
||||||
|
char* tmp = taosMemoryRealloc(pCol->pData, colLength);
|
||||||
|
if (tmp == NULL) {
|
||||||
|
return TSDB_CODE_OUT_OF_MEMORY;
|
||||||
|
}
|
||||||
|
|
||||||
|
pCol->pData = tmp;
|
||||||
|
pCol->varmeta.allocLen = colLength;
|
||||||
|
}
|
||||||
|
|
||||||
|
pCol->varmeta.length = colLength;
|
||||||
|
ASSERT(pCol->varmeta.length <= pCol->varmeta.allocLen);
|
||||||
|
}
|
||||||
|
|
||||||
|
memcpy(pCol->pData, pStart, colLength);
|
||||||
|
pStart += pCol->info.bytes * capacity;
|
||||||
|
}
|
||||||
|
|
||||||
|
return TSDB_CODE_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
size_t blockDataGetRowSize(SSDataBlock* pBlock) {
|
size_t blockDataGetRowSize(SSDataBlock* pBlock) {
|
||||||
ASSERT(pBlock != NULL);
|
ASSERT(pBlock != NULL);
|
||||||
if (pBlock->info.rowSize == 0) {
|
if (pBlock->info.rowSize == 0) {
|
||||||
|
@ -627,6 +656,10 @@ double blockDataGetSerialRowSize(const SSDataBlock* pBlock) {
|
||||||
return rowSize;
|
return rowSize;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int32_t getAllowedRowsForPage(const SSDataBlock* pBlock, size_t pgSize) {
|
||||||
|
return (int32_t) ((pgSize - blockDataGetSerialMetaSize(pBlock))/ blockDataGetSerialRowSize(pBlock));
|
||||||
|
}
|
||||||
|
|
||||||
typedef struct SSDataBlockSortHelper {
|
typedef struct SSDataBlockSortHelper {
|
||||||
SArray* orderInfo; // SArray<SBlockOrderInfo>
|
SArray* orderInfo; // SArray<SBlockOrderInfo>
|
||||||
SSDataBlock* pDataBlock;
|
SSDataBlock* pDataBlock;
|
||||||
|
@ -665,23 +698,13 @@ int32_t dataBlockCompar(const void* p1, const void* p2, const void* param) {
|
||||||
void* left1 = colDataGetData(pColInfoData, left);
|
void* left1 = colDataGetData(pColInfoData, left);
|
||||||
void* right1 = colDataGetData(pColInfoData, right);
|
void* right1 = colDataGetData(pColInfoData, right);
|
||||||
|
|
||||||
switch (pColInfoData->info.type) {
|
__compar_fn_t fn = getKeyComparFunc(pColInfoData->info.type, pOrder->order);
|
||||||
case TSDB_DATA_TYPE_INT: {
|
|
||||||
int32_t leftx = *(int32_t*)left1;
|
|
||||||
int32_t rightx = *(int32_t*)right1;
|
|
||||||
|
|
||||||
if (leftx == rightx) {
|
int ret = fn(left1, right1);
|
||||||
break;
|
if (ret == 0) {
|
||||||
|
continue;
|
||||||
} else {
|
} else {
|
||||||
if (pOrder->order == TSDB_ORDER_ASC) {
|
return ret;
|
||||||
return (leftx < rightx) ? -1 : 1;
|
|
||||||
} else {
|
|
||||||
return (leftx < rightx) ? 1 : -1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
default:
|
|
||||||
assert(0);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -735,61 +758,12 @@ static int32_t blockDataAssign(SColumnInfoData* pCols, const SSDataBlock* pDataB
|
||||||
pDst->varmeta.offset[j] = pSrc->varmeta.offset[index[j]];
|
pDst->varmeta.offset[j] = pSrc->varmeta.offset[index[j]];
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
switch (pSrc->info.type) {
|
|
||||||
case TSDB_DATA_TYPE_UINT:
|
|
||||||
case TSDB_DATA_TYPE_INT: {
|
|
||||||
for (int32_t j = 0; j < pDataBlock->info.rows; ++j) {
|
for (int32_t j = 0; j < pDataBlock->info.rows; ++j) {
|
||||||
int32_t* p = (int32_t*)pDst->pData;
|
|
||||||
int32_t* srclist = (int32_t*)pSrc->pData;
|
|
||||||
|
|
||||||
p[j] = srclist[index[j]];
|
|
||||||
if (colDataIsNull_f(pSrc->nullbitmap, index[j])) {
|
if (colDataIsNull_f(pSrc->nullbitmap, index[j])) {
|
||||||
colDataSetNull_f(pDst->nullbitmap, j);
|
colDataSetNull_f(pDst->nullbitmap, j);
|
||||||
|
continue;
|
||||||
}
|
}
|
||||||
}
|
memcpy(pDst->pData + j * pDst->info.bytes, pSrc->pData + index[j] * pDst->info.bytes, pDst->info.bytes);
|
||||||
break;
|
|
||||||
}
|
|
||||||
case TSDB_DATA_TYPE_UTINYINT:
|
|
||||||
case TSDB_DATA_TYPE_TINYINT: {
|
|
||||||
for (int32_t j = 0; j < pDataBlock->info.rows; ++j) {
|
|
||||||
int32_t* p = (int32_t*)pDst->pData;
|
|
||||||
int32_t* srclist = (int32_t*)pSrc->pData;
|
|
||||||
|
|
||||||
p[j] = srclist[index[j]];
|
|
||||||
if (colDataIsNull_f(pSrc->nullbitmap, index[j])) {
|
|
||||||
colDataSetNull_f(pDst->nullbitmap, j);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case TSDB_DATA_TYPE_USMALLINT:
|
|
||||||
case TSDB_DATA_TYPE_SMALLINT: {
|
|
||||||
for (int32_t j = 0; j < pDataBlock->info.rows; ++j) {
|
|
||||||
int32_t* p = (int32_t*)pDst->pData;
|
|
||||||
int32_t* srclist = (int32_t*)pSrc->pData;
|
|
||||||
|
|
||||||
p[j] = srclist[index[j]];
|
|
||||||
if (colDataIsNull_f(pSrc->nullbitmap, index[j])) {
|
|
||||||
colDataSetNull_f(pDst->nullbitmap, j);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case TSDB_DATA_TYPE_UBIGINT:
|
|
||||||
case TSDB_DATA_TYPE_BIGINT: {
|
|
||||||
for (int32_t j = 0; j < pDataBlock->info.rows; ++j) {
|
|
||||||
int32_t* p = (int32_t*)pDst->pData;
|
|
||||||
int32_t* srclist = (int32_t*)pSrc->pData;
|
|
||||||
|
|
||||||
p[j] = srclist[index[j]];
|
|
||||||
if (colDataIsNull_f(pSrc->nullbitmap, index[j])) {
|
|
||||||
colDataSetNull_f(pDst->nullbitmap, j);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
default:
|
|
||||||
assert(0);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -862,33 +836,6 @@ static int32_t* createTupleIndex(size_t rows) {
|
||||||
|
|
||||||
static void destroyTupleIndex(int32_t* index) { taosMemoryFreeClear(index); }
|
static void destroyTupleIndex(int32_t* index) { taosMemoryFreeClear(index); }
|
||||||
|
|
||||||
static __compar_fn_t getComparFn(int32_t type, int32_t order) {
|
|
||||||
switch (type) {
|
|
||||||
case TSDB_DATA_TYPE_TINYINT:
|
|
||||||
return order == TSDB_ORDER_ASC ? compareInt8Val : compareInt8ValDesc;
|
|
||||||
case TSDB_DATA_TYPE_SMALLINT:
|
|
||||||
return order == TSDB_ORDER_ASC ? compareInt16Val : compareInt16ValDesc;
|
|
||||||
case TSDB_DATA_TYPE_INT:
|
|
||||||
return order == TSDB_ORDER_ASC ? compareInt32Val : compareInt32ValDesc;
|
|
||||||
case TSDB_DATA_TYPE_BIGINT:
|
|
||||||
return order == TSDB_ORDER_ASC ? compareInt64Val : compareInt64ValDesc;
|
|
||||||
case TSDB_DATA_TYPE_FLOAT:
|
|
||||||
return order == TSDB_ORDER_ASC ? compareFloatVal : compareFloatValDesc;
|
|
||||||
case TSDB_DATA_TYPE_DOUBLE:
|
|
||||||
return order == TSDB_ORDER_ASC ? compareDoubleVal : compareDoubleValDesc;
|
|
||||||
case TSDB_DATA_TYPE_UTINYINT:
|
|
||||||
return order == TSDB_ORDER_ASC ? compareUint8Val : compareUint8ValDesc;
|
|
||||||
case TSDB_DATA_TYPE_USMALLINT:
|
|
||||||
return order == TSDB_ORDER_ASC ? compareUint16Val : compareUint16ValDesc;
|
|
||||||
case TSDB_DATA_TYPE_UINT:
|
|
||||||
return order == TSDB_ORDER_ASC ? compareUint32Val : compareUint32ValDesc;
|
|
||||||
case TSDB_DATA_TYPE_UBIGINT:
|
|
||||||
return order == TSDB_ORDER_ASC ? compareUint64Val : compareUint64ValDesc;
|
|
||||||
default:
|
|
||||||
return order == TSDB_ORDER_ASC ? compareInt32Val : compareInt32ValDesc;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
int32_t blockDataSort(SSDataBlock* pDataBlock, SArray* pOrderInfo) {
|
int32_t blockDataSort(SSDataBlock* pDataBlock, SArray* pOrderInfo) {
|
||||||
ASSERT(pDataBlock != NULL && pOrderInfo != NULL);
|
ASSERT(pDataBlock != NULL && pOrderInfo != NULL);
|
||||||
if (pDataBlock->info.rows <= 1) {
|
if (pDataBlock->info.rows <= 1) {
|
||||||
|
@ -922,11 +869,11 @@ int32_t blockDataSort(SSDataBlock* pDataBlock, SArray* pOrderInfo) {
|
||||||
|
|
||||||
int64_t p0 = taosGetTimestampUs();
|
int64_t p0 = taosGetTimestampUs();
|
||||||
|
|
||||||
__compar_fn_t fn = getComparFn(pColInfoData->info.type, pOrder->order);
|
__compar_fn_t fn = getKeyComparFunc(pColInfoData->info.type, pOrder->order);
|
||||||
qsort(pColInfoData->pData, pDataBlock->info.rows, pColInfoData->info.bytes, fn);
|
qsort(pColInfoData->pData, pDataBlock->info.rows, pColInfoData->info.bytes, fn);
|
||||||
|
|
||||||
int64_t p1 = taosGetTimestampUs();
|
int64_t p1 = taosGetTimestampUs();
|
||||||
printf("sort:%" PRId64 ", rows:%d\n", p1 - p0, pDataBlock->info.rows);
|
uDebug("blockDataSort easy cost:%" PRId64 ", rows:%d\n", p1 - p0, pDataBlock->info.rows);
|
||||||
|
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
} else { // var data type
|
} else { // var data type
|
||||||
|
@ -955,24 +902,21 @@ int32_t blockDataSort(SSDataBlock* pDataBlock, SArray* pOrderInfo) {
|
||||||
|
|
||||||
SColumnInfoData* pCols = createHelpColInfoData(pDataBlock);
|
SColumnInfoData* pCols = createHelpColInfoData(pDataBlock);
|
||||||
if (pCols == NULL) {
|
if (pCols == NULL) {
|
||||||
|
destroyTupleIndex(index);
|
||||||
terrno = TSDB_CODE_OUT_OF_MEMORY;
|
terrno = TSDB_CODE_OUT_OF_MEMORY;
|
||||||
return terrno;
|
return terrno;
|
||||||
}
|
}
|
||||||
|
|
||||||
int64_t p2 = taosGetTimestampUs();
|
int64_t p2 = taosGetTimestampUs();
|
||||||
|
|
||||||
int32_t code = blockDataAssign(pCols, pDataBlock, index);
|
blockDataAssign(pCols, pDataBlock, index);
|
||||||
if (code != TSDB_CODE_SUCCESS) {
|
|
||||||
terrno = code;
|
|
||||||
return code;
|
|
||||||
}
|
|
||||||
|
|
||||||
int64_t p3 = taosGetTimestampUs();
|
int64_t p3 = taosGetTimestampUs();
|
||||||
|
|
||||||
copyBackToBlock(pDataBlock, pCols);
|
copyBackToBlock(pDataBlock, pCols);
|
||||||
int64_t p4 = taosGetTimestampUs();
|
int64_t p4 = taosGetTimestampUs();
|
||||||
|
|
||||||
printf("sort:%" PRId64 ", create:%" PRId64 ", assign:%" PRId64 ", copyback:%" PRId64 ", rows:%d\n", p1 - p0, p2 - p1,
|
uDebug("blockDataSort complex sort:%" PRId64 ", create:%" PRId64 ", assign:%" PRId64 ", copyback:%" PRId64 ", rows:%d\n", p1 - p0, p2 - p1,
|
||||||
p3 - p2, p4 - p3, rows);
|
p3 - p2, p4 - p3, rows);
|
||||||
destroyTupleIndex(index);
|
destroyTupleIndex(index);
|
||||||
|
|
||||||
|
@ -1139,7 +1083,7 @@ void blockDataCleanup(SSDataBlock* pDataBlock) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t blockDataEnsureColumnCapacity(SColumnInfoData* pColumn, uint32_t numOfRows) {
|
int32_t colInfoDataEnsureCapacity(SColumnInfoData* pColumn, uint32_t numOfRows) {
|
||||||
if (0 == numOfRows) {
|
if (0 == numOfRows) {
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
|
@ -1178,10 +1122,13 @@ int32_t blockDataEnsureColumnCapacity(SColumnInfoData* pColumn, uint32_t numOfRo
|
||||||
|
|
||||||
int32_t blockDataEnsureCapacity(SSDataBlock* pDataBlock, uint32_t numOfRows) {
|
int32_t blockDataEnsureCapacity(SSDataBlock* pDataBlock, uint32_t numOfRows) {
|
||||||
int32_t code = 0;
|
int32_t code = 0;
|
||||||
|
if (numOfRows == 0) {
|
||||||
|
return TSDB_CODE_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
for (int32_t i = 0; i < pDataBlock->info.numOfCols; ++i) {
|
for (int32_t i = 0; i < pDataBlock->info.numOfCols; ++i) {
|
||||||
SColumnInfoData* p = taosArrayGet(pDataBlock->pDataBlock, i);
|
SColumnInfoData* p = taosArrayGet(pDataBlock->pDataBlock, i);
|
||||||
code = blockDataEnsureColumnCapacity(p, numOfRows);
|
code = colInfoDataEnsureCapacity(p, numOfRows);
|
||||||
if (code) {
|
if (code) {
|
||||||
return code;
|
return code;
|
||||||
}
|
}
|
||||||
|
@ -1201,6 +1148,9 @@ void* blockDataDestroy(SSDataBlock* pBlock) {
|
||||||
}
|
}
|
||||||
|
|
||||||
SSDataBlock* createOneDataBlock(const SSDataBlock* pDataBlock) {
|
SSDataBlock* createOneDataBlock(const SSDataBlock* pDataBlock) {
|
||||||
|
if(pDataBlock == NULL){
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
int32_t numOfCols = pDataBlock->info.numOfCols;
|
int32_t numOfCols = pDataBlock->info.numOfCols;
|
||||||
|
|
||||||
SSDataBlock* pBlock = taosMemoryCalloc(1, sizeof(SSDataBlock));
|
SSDataBlock* pBlock = taosMemoryCalloc(1, sizeof(SSDataBlock));
|
||||||
|
@ -1220,7 +1170,7 @@ SSDataBlock* createOneDataBlock(const SSDataBlock* pDataBlock) {
|
||||||
}
|
}
|
||||||
|
|
||||||
size_t blockDataGetCapacityInRow(const SSDataBlock* pBlock, size_t pageSize) {
|
size_t blockDataGetCapacityInRow(const SSDataBlock* pBlock, size_t pageSize) {
|
||||||
return pageSize / (blockDataGetSerialRowSize(pBlock) + blockDataGetSerialMetaSize(pBlock));
|
return (int32_t) ((pageSize - blockDataGetSerialMetaSize(pBlock))/ blockDataGetSerialRowSize(pBlock));
|
||||||
}
|
}
|
||||||
|
|
||||||
void colDataDestroy(SColumnInfoData* pColData) {
|
void colDataDestroy(SColumnInfoData* pColData) {
|
||||||
|
@ -1233,6 +1183,63 @@ void colDataDestroy(SColumnInfoData* pColData) {
|
||||||
taosMemoryFree(pColData->pData);
|
taosMemoryFree(pColData->pData);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static void doShiftBitmap(char* nullBitmap, size_t n, size_t total) {
|
||||||
|
int32_t len = BitmapLen(total);
|
||||||
|
|
||||||
|
int32_t newLen = BitmapLen(total - n);
|
||||||
|
if (n%8 == 0) {
|
||||||
|
memmove(nullBitmap, nullBitmap + n/8, newLen);
|
||||||
|
} else {
|
||||||
|
int32_t tail = n % 8;
|
||||||
|
int32_t i = 0;
|
||||||
|
|
||||||
|
uint8_t* p = (uint8_t*) nullBitmap;
|
||||||
|
while(i < len) {
|
||||||
|
uint8_t v = p[i];
|
||||||
|
|
||||||
|
p[i] = 0;
|
||||||
|
p[i] = (v << tail);
|
||||||
|
|
||||||
|
if (i < len - 1) {
|
||||||
|
uint8_t next = p[i + 1];
|
||||||
|
p[i] |= (next >> (8 - tail));
|
||||||
|
}
|
||||||
|
|
||||||
|
i += 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void colDataTrimFirstNRows(SColumnInfoData* pColInfoData, size_t n, size_t total) {
|
||||||
|
if (IS_VAR_DATA_TYPE(pColInfoData->info.type)) {
|
||||||
|
memmove(pColInfoData->varmeta.offset, &pColInfoData->varmeta.offset[n], (total - n));
|
||||||
|
memset(&pColInfoData->varmeta.offset[total - n - 1], 0, n);
|
||||||
|
} else {
|
||||||
|
int32_t bytes = pColInfoData->info.bytes;
|
||||||
|
memmove(pColInfoData->pData, ((char*)pColInfoData->pData + n * bytes), (total - n) * bytes);
|
||||||
|
doShiftBitmap(pColInfoData->nullbitmap, n, total);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
int32_t blockDataTrimFirstNRows(SSDataBlock *pBlock, size_t n) {
|
||||||
|
if (n == 0) {
|
||||||
|
return TSDB_CODE_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (pBlock->info.rows <= n) {
|
||||||
|
blockDataCleanup(pBlock);
|
||||||
|
} else {
|
||||||
|
for(int32_t i = 0; i < pBlock->info.numOfCols; ++i) {
|
||||||
|
SColumnInfoData* pColInfoData = taosArrayGet(pBlock->pDataBlock, i);
|
||||||
|
colDataTrimFirstNRows(pColInfoData, n, pBlock->info.rows);
|
||||||
|
}
|
||||||
|
|
||||||
|
pBlock->info.rows -= n;
|
||||||
|
}
|
||||||
|
return TSDB_CODE_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
int32_t tEncodeDataBlock(void** buf, const SSDataBlock* pBlock) {
|
int32_t tEncodeDataBlock(void** buf, const SSDataBlock* pBlock) {
|
||||||
int64_t tbUid = pBlock->info.uid;
|
int64_t tbUid = pBlock->info.uid;
|
||||||
int16_t numOfCols = pBlock->info.numOfCols;
|
int16_t numOfCols = pBlock->info.numOfCols;
|
||||||
|
@ -1372,6 +1379,7 @@ static char* formatTimestamp(char* buf, int64_t val, int precision) {
|
||||||
|
|
||||||
return buf;
|
return buf;
|
||||||
}
|
}
|
||||||
|
|
||||||
void blockDebugShowData(const SArray* dataBlocks) {
|
void blockDebugShowData(const SArray* dataBlocks) {
|
||||||
char pBuf[128];
|
char pBuf[128];
|
||||||
int32_t sz = taosArrayGetSize(dataBlocks);
|
int32_t sz = taosArrayGetSize(dataBlocks);
|
||||||
|
|
|
@ -33,7 +33,8 @@ int tdAllocMemForCol(SDataCol *pCol, int maxPoints) {
|
||||||
spaceNeeded += (int)nBitmapBytes;
|
spaceNeeded += (int)nBitmapBytes;
|
||||||
// TODO: Currently, the compression of bitmap parts is affiliated to the column data parts, thus allocate 1 more
|
// TODO: Currently, the compression of bitmap parts is affiliated to the column data parts, thus allocate 1 more
|
||||||
// TYPE_BYTES as to comprise complete TYPE_BYTES. Otherwise, invalid read/write would be triggered.
|
// TYPE_BYTES as to comprise complete TYPE_BYTES. Otherwise, invalid read/write would be triggered.
|
||||||
spaceNeeded += TYPE_BYTES[pCol->type];
|
// spaceNeeded += TYPE_BYTES[pCol->type]; // the bitmap part is append as a single part since 2022.04.03, thus remove
|
||||||
|
// the additional space
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
if (pCol->spaceSize < spaceNeeded) {
|
if (pCol->spaceSize < spaceNeeded) {
|
||||||
|
@ -47,6 +48,7 @@ int tdAllocMemForCol(SDataCol *pCol, int maxPoints) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#ifdef TD_SUPPORT_BITMAP
|
#ifdef TD_SUPPORT_BITMAP
|
||||||
|
|
||||||
if (IS_VAR_DATA_TYPE(pCol->type)) {
|
if (IS_VAR_DATA_TYPE(pCol->type)) {
|
||||||
pCol->pBitmap = POINTER_SHIFT(pCol->pData, pCol->bytes * maxPoints);
|
pCol->pBitmap = POINTER_SHIFT(pCol->pData, pCol->bytes * maxPoints);
|
||||||
pCol->dataOff = POINTER_SHIFT(pCol->pBitmap, nBitmapBytes);
|
pCol->dataOff = POINTER_SHIFT(pCol->pBitmap, nBitmapBytes);
|
||||||
|
@ -85,6 +87,7 @@ int tdEncodeSchema(void **buf, STSchema *pSchema) {
|
||||||
for (int i = 0; i < schemaNCols(pSchema); i++) {
|
for (int i = 0; i < schemaNCols(pSchema); i++) {
|
||||||
STColumn *pCol = schemaColAt(pSchema, i);
|
STColumn *pCol = schemaColAt(pSchema, i);
|
||||||
tlen += taosEncodeFixedI8(buf, colType(pCol));
|
tlen += taosEncodeFixedI8(buf, colType(pCol));
|
||||||
|
tlen += taosEncodeFixedI8(buf, colSma(pCol));
|
||||||
tlen += taosEncodeFixedI16(buf, colColId(pCol));
|
tlen += taosEncodeFixedI16(buf, colColId(pCol));
|
||||||
tlen += taosEncodeFixedI16(buf, colBytes(pCol));
|
tlen += taosEncodeFixedI16(buf, colBytes(pCol));
|
||||||
}
|
}
|
||||||
|
@ -107,12 +110,14 @@ void *tdDecodeSchema(void *buf, STSchema **pRSchema) {
|
||||||
|
|
||||||
for (int i = 0; i < numOfCols; i++) {
|
for (int i = 0; i < numOfCols; i++) {
|
||||||
col_type_t type = 0;
|
col_type_t type = 0;
|
||||||
|
int8_t sma = TSDB_BSMA_TYPE_NONE;
|
||||||
col_id_t colId = 0;
|
col_id_t colId = 0;
|
||||||
col_bytes_t bytes = 0;
|
col_bytes_t bytes = 0;
|
||||||
buf = taosDecodeFixedI8(buf, &type);
|
buf = taosDecodeFixedI8(buf, &type);
|
||||||
|
buf = taosDecodeFixedI8(buf, &sma);
|
||||||
buf = taosDecodeFixedI16(buf, &colId);
|
buf = taosDecodeFixedI16(buf, &colId);
|
||||||
buf = taosDecodeFixedI32(buf, &bytes);
|
buf = taosDecodeFixedI32(buf, &bytes);
|
||||||
if (tdAddColToSchema(&schemaBuilder, type, colId, bytes) < 0) {
|
if (tdAddColToSchema(&schemaBuilder, type, sma, colId, bytes) < 0) {
|
||||||
tdDestroyTSchemaBuilder(&schemaBuilder);
|
tdDestroyTSchemaBuilder(&schemaBuilder);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
@ -148,7 +153,7 @@ void tdResetTSchemaBuilder(STSchemaBuilder *pBuilder, schema_ver_t version) {
|
||||||
pBuilder->version = version;
|
pBuilder->version = version;
|
||||||
}
|
}
|
||||||
|
|
||||||
int tdAddColToSchema(STSchemaBuilder *pBuilder, int8_t type, col_id_t colId, col_bytes_t bytes) {
|
int32_t tdAddColToSchema(STSchemaBuilder *pBuilder, int8_t type, int8_t sma, col_id_t colId, col_bytes_t bytes) {
|
||||||
if (!isValidDataType(type)) return -1;
|
if (!isValidDataType(type)) return -1;
|
||||||
|
|
||||||
if (pBuilder->nCols >= pBuilder->tCols) {
|
if (pBuilder->nCols >= pBuilder->tCols) {
|
||||||
|
@ -161,6 +166,7 @@ int tdAddColToSchema(STSchemaBuilder *pBuilder, int8_t type, col_id_t colId, col
|
||||||
STColumn *pCol = &(pBuilder->columns[pBuilder->nCols]);
|
STColumn *pCol = &(pBuilder->columns[pBuilder->nCols]);
|
||||||
colSetType(pCol, type);
|
colSetType(pCol, type);
|
||||||
colSetColId(pCol, colId);
|
colSetColId(pCol, colId);
|
||||||
|
colSetSma(pCol, sma);
|
||||||
if (pBuilder->nCols == 0) {
|
if (pBuilder->nCols == 0) {
|
||||||
colSetOffset(pCol, 0);
|
colSetOffset(pCol, 0);
|
||||||
} else {
|
} else {
|
||||||
|
@ -168,9 +174,6 @@ int tdAddColToSchema(STSchemaBuilder *pBuilder, int8_t type, col_id_t colId, col
|
||||||
colSetOffset(pCol, pTCol->offset + TYPE_BYTES[pTCol->type]);
|
colSetOffset(pCol, pTCol->offset + TYPE_BYTES[pTCol->type]);
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO: set sma value by user input
|
|
||||||
pCol->sma = 1;
|
|
||||||
|
|
||||||
if (IS_VAR_DATA_TYPE(type)) {
|
if (IS_VAR_DATA_TYPE(type)) {
|
||||||
colSetBytes(pCol, bytes);
|
colSetBytes(pCol, bytes);
|
||||||
pBuilder->tlen += (TYPE_BYTES[type] + bytes);
|
pBuilder->tlen += (TYPE_BYTES[type] + bytes);
|
||||||
|
@ -305,7 +308,7 @@ static FORCE_INLINE const void *tdGetColDataOfRowUnsafe(SDataCol *pCol, int row)
|
||||||
|
|
||||||
bool isNEleNull(SDataCol *pCol, int nEle) {
|
bool isNEleNull(SDataCol *pCol, int nEle) {
|
||||||
if (isAllRowsNull(pCol)) return true;
|
if (isAllRowsNull(pCol)) return true;
|
||||||
for (int i = 0; i < nEle; i++) {
|
for (int i = 0; i < nEle; ++i) {
|
||||||
if (!isNull(tdGetColDataOfRowUnsafe(pCol, i), pCol->type)) return false;
|
if (!isNull(tdGetColDataOfRowUnsafe(pCol, i), pCol->type)) return false;
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
|
@ -326,7 +329,7 @@ static FORCE_INLINE void dataColSetNullAt(SDataCol *pCol, int index) {
|
||||||
static void dataColSetNEleNull(SDataCol *pCol, int nEle) {
|
static void dataColSetNEleNull(SDataCol *pCol, int nEle) {
|
||||||
if (IS_VAR_DATA_TYPE(pCol->type)) {
|
if (IS_VAR_DATA_TYPE(pCol->type)) {
|
||||||
pCol->len = 0;
|
pCol->len = 0;
|
||||||
for (int i = 0; i < nEle; i++) {
|
for (int i = 0; i < nEle; ++i) {
|
||||||
dataColSetNullAt(pCol, i);
|
dataColSetNullAt(pCol, i);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
@ -342,7 +345,7 @@ void *dataColSetOffset(SDataCol *pCol, int nEle) {
|
||||||
// char *tptr = (char *)(pCol->pData);
|
// char *tptr = (char *)(pCol->pData);
|
||||||
|
|
||||||
VarDataOffsetT offset = 0;
|
VarDataOffsetT offset = 0;
|
||||||
for (int i = 0; i < nEle; i++) {
|
for (int i = 0; i < nEle; ++i) {
|
||||||
pCol->dataOff[i] = offset;
|
pCol->dataOff[i] = offset;
|
||||||
offset += varDataTLen(tptr);
|
offset += varDataTLen(tptr);
|
||||||
tptr = POINTER_SHIFT(tptr, varDataTLen(tptr));
|
tptr = POINTER_SHIFT(tptr, varDataTLen(tptr));
|
||||||
|
@ -370,6 +373,7 @@ SDataCols *tdNewDataCols(int maxCols, int maxRows) {
|
||||||
tdFreeDataCols(pCols);
|
tdFreeDataCols(pCols);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
#if 0 // no need as calloc used
|
||||||
int i;
|
int i;
|
||||||
for (i = 0; i < maxCols; i++) {
|
for (i = 0; i < maxCols; i++) {
|
||||||
pCols->cols[i].spaceSize = 0;
|
pCols->cols[i].spaceSize = 0;
|
||||||
|
@ -377,6 +381,7 @@ SDataCols *tdNewDataCols(int maxCols, int maxRows) {
|
||||||
pCols->cols[i].pData = NULL;
|
pCols->cols[i].pData = NULL;
|
||||||
pCols->cols[i].dataOff = NULL;
|
pCols->cols[i].dataOff = NULL;
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
return pCols;
|
return pCols;
|
||||||
|
@ -390,17 +395,21 @@ int tdInitDataCols(SDataCols *pCols, STSchema *pSchema) {
|
||||||
void *ptr = (SDataCol *)taosMemoryRealloc(pCols->cols, sizeof(SDataCol) * pCols->maxCols);
|
void *ptr = (SDataCol *)taosMemoryRealloc(pCols->cols, sizeof(SDataCol) * pCols->maxCols);
|
||||||
if (ptr == NULL) return -1;
|
if (ptr == NULL) return -1;
|
||||||
pCols->cols = ptr;
|
pCols->cols = ptr;
|
||||||
for (i = oldMaxCols; i < pCols->maxCols; i++) {
|
for (i = oldMaxCols; i < pCols->maxCols; ++i) {
|
||||||
pCols->cols[i].pData = NULL;
|
pCols->cols[i].pData = NULL;
|
||||||
pCols->cols[i].dataOff = NULL;
|
pCols->cols[i].dataOff = NULL;
|
||||||
|
pCols->cols[i].pBitmap = NULL;
|
||||||
pCols->cols[i].spaceSize = 0;
|
pCols->cols[i].spaceSize = 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
#if 0
|
||||||
|
tdResetDataCols(pCols); // redundant loop to reset len/blen to 0, already reset in following dataColInit(...)
|
||||||
|
#endif
|
||||||
|
|
||||||
tdResetDataCols(pCols);
|
pCols->numOfRows = 0;
|
||||||
pCols->numOfCols = schemaNCols(pSchema);
|
pCols->numOfCols = schemaNCols(pSchema);
|
||||||
|
|
||||||
for (i = 0; i < schemaNCols(pSchema); i++) {
|
for (i = 0; i < schemaNCols(pSchema); ++i) {
|
||||||
dataColInit(pCols->cols + i, schemaColAt(pSchema, i), pCols->maxPoints);
|
dataColInit(pCols->cols + i, schemaColAt(pSchema, i), pCols->maxPoints);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -412,7 +421,7 @@ SDataCols *tdFreeDataCols(SDataCols *pCols) {
|
||||||
if (pCols) {
|
if (pCols) {
|
||||||
if (pCols->cols) {
|
if (pCols->cols) {
|
||||||
int maxCols = pCols->maxCols;
|
int maxCols = pCols->maxCols;
|
||||||
for (i = 0; i < maxCols; i++) {
|
for (i = 0; i < maxCols; ++i) {
|
||||||
SDataCol *pCol = &pCols->cols[i];
|
SDataCol *pCol = &pCols->cols[i];
|
||||||
taosMemoryFreeClear(pCol->pData);
|
taosMemoryFreeClear(pCol->pData);
|
||||||
}
|
}
|
||||||
|
@ -463,7 +472,7 @@ SDataCols *tdDupDataCols(SDataCols *pDataCols, bool keepData) {
|
||||||
void tdResetDataCols(SDataCols *pCols) {
|
void tdResetDataCols(SDataCols *pCols) {
|
||||||
if (pCols != NULL) {
|
if (pCols != NULL) {
|
||||||
pCols->numOfRows = 0;
|
pCols->numOfRows = 0;
|
||||||
for (int i = 0; i < pCols->maxCols; i++) {
|
for (int i = 0; i < pCols->maxCols; ++i) {
|
||||||
dataColReset(pCols->cols + i);
|
dataColReset(pCols->cols + i);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -30,25 +30,45 @@ char tsLocalEp[TSDB_EP_LEN] = {0}; // Local End Point, hostname:port
|
||||||
uint16_t tsServerPort = 6030;
|
uint16_t tsServerPort = 6030;
|
||||||
int32_t tsVersion = 30000000;
|
int32_t tsVersion = 30000000;
|
||||||
int32_t tsStatusInterval = 1; // second
|
int32_t tsStatusInterval = 1; // second
|
||||||
bool tsEnableTelemetryReporting = 0;
|
bool tsEnableTelemetryReporting = false;
|
||||||
|
|
||||||
// common
|
// common
|
||||||
int32_t tsRpcTimer = 300;
|
int32_t tsRpcTimer = 300;
|
||||||
int32_t tsRpcMaxTime = 600; // seconds;
|
int32_t tsRpcMaxTime = 600; // seconds;
|
||||||
bool tsRpcForceTcp = 1; // disable this, means query, show command use udp protocol as default
|
bool tsRpcForceTcp = true; // disable this, means query, show command use udp protocol as default
|
||||||
int32_t tsMaxShellConns = 50000;
|
int32_t tsMaxShellConns = 50000;
|
||||||
int32_t tsMaxConnections = 50000;
|
int32_t tsMaxConnections = 50000;
|
||||||
int32_t tsShellActivityTimer = 3; // second
|
int32_t tsShellActivityTimer = 3; // second
|
||||||
float tsNumOfThreadsPerCore = 1.0f;
|
|
||||||
int32_t tsNumOfCommitThreads = 4;
|
|
||||||
float tsRatioOfQueryCores = 1.0f;
|
|
||||||
int32_t tsMaxBinaryDisplayWidth = 30;
|
int32_t tsMaxBinaryDisplayWidth = 30;
|
||||||
bool tsEnableSlaveQuery = 1;
|
bool tsEnableSlaveQuery = true;
|
||||||
bool tsPrintAuth = 0;
|
bool tsPrintAuth = false;
|
||||||
bool tsMultiProcess = 0;
|
|
||||||
|
// multi process
|
||||||
|
bool tsMultiProcess = false;
|
||||||
|
int32_t tsMnodeShmSize = TSDB_MAX_WAL_SIZE * 2;
|
||||||
|
int32_t tsVnodeShmSize = TSDB_MAX_WAL_SIZE * 10;
|
||||||
|
int32_t tsQnodeShmSize = TSDB_MAX_WAL_SIZE * 4;
|
||||||
|
int32_t tsSnodeShmSize = TSDB_MAX_WAL_SIZE * 4;
|
||||||
|
int32_t tsBnodeShmSize = TSDB_MAX_WAL_SIZE * 4;
|
||||||
|
|
||||||
|
// queue & threads
|
||||||
|
int32_t tsNumOfRpcThreads = 1;
|
||||||
|
int32_t tsNumOfCommitThreads = 2;
|
||||||
|
int32_t tsNumOfTaskQueueThreads = 1;
|
||||||
|
int32_t tsNumOfMnodeQueryThreads = 1;
|
||||||
|
int32_t tsNumOfMnodeReadThreads = 1;
|
||||||
|
int32_t tsNumOfVnodeQueryThreads = 2;
|
||||||
|
int32_t tsNumOfVnodeFetchThreads = 2;
|
||||||
|
int32_t tsNumOfVnodeWriteThreads = 2;
|
||||||
|
int32_t tsNumOfVnodeSyncThreads = 2;
|
||||||
|
int32_t tsNumOfVnodeMergeThreads = 2;
|
||||||
|
int32_t tsNumOfQnodeQueryThreads = 2;
|
||||||
|
int32_t tsNumOfQnodeFetchThreads = 2;
|
||||||
|
int32_t tsNumOfSnodeSharedThreads = 2;
|
||||||
|
int32_t tsNumOfSnodeUniqueThreads = 2;
|
||||||
|
|
||||||
// monitor
|
// monitor
|
||||||
bool tsEnableMonitor = 1;
|
bool tsEnableMonitor = true;
|
||||||
int32_t tsMonitorInterval = 30;
|
int32_t tsMonitorInterval = 30;
|
||||||
char tsMonitorFqdn[TSDB_FQDN_LEN] = {0};
|
char tsMonitorFqdn[TSDB_FQDN_LEN] = {0};
|
||||||
uint16_t tsMonitorPort = 6043;
|
uint16_t tsMonitorPort = 6043;
|
||||||
|
@ -117,13 +137,13 @@ int32_t tsQueryBufferSize = -1;
|
||||||
int64_t tsQueryBufferSizeBytes = -1;
|
int64_t tsQueryBufferSizeBytes = -1;
|
||||||
|
|
||||||
// in retrieve blocking model, the retrieve threads will wait for the completion of the query processing.
|
// in retrieve blocking model, the retrieve threads will wait for the completion of the query processing.
|
||||||
bool tsRetrieveBlockingModel = 0;
|
bool tsRetrieveBlockingModel = false;
|
||||||
|
|
||||||
// last_row(*), first(*), last_row(ts, col1, col2) query, the result fields will be the original column name
|
// last_row(*), first(*), last_row(ts, col1, col2) query, the result fields will be the original column name
|
||||||
bool tsKeepOriginalColumnName = 0;
|
bool tsKeepOriginalColumnName = false;
|
||||||
|
|
||||||
// kill long query
|
// kill long query
|
||||||
bool tsDeadLockKillQuery = 0;
|
bool tsDeadLockKillQuery = false;
|
||||||
|
|
||||||
// tsdb config
|
// tsdb config
|
||||||
// For backward compatibility
|
// For backward compatibility
|
||||||
|
@ -283,7 +303,6 @@ static int32_t taosAddClientCfg(SConfig *pCfg) {
|
||||||
if (cfgAddInt32(pCfg, "serverPort", defaultServerPort, 1, 65056, 1) != 0) return -1;
|
if (cfgAddInt32(pCfg, "serverPort", defaultServerPort, 1, 65056, 1) != 0) return -1;
|
||||||
if (cfgAddDir(pCfg, "tempDir", tsTempDir, 1) != 0) return -1;
|
if (cfgAddDir(pCfg, "tempDir", tsTempDir, 1) != 0) return -1;
|
||||||
if (cfgAddFloat(pCfg, "minimalTempDirGB", 1.0f, 0.001f, 10000000, 1) != 0) return -1;
|
if (cfgAddFloat(pCfg, "minimalTempDirGB", 1.0f, 0.001f, 10000000, 1) != 0) return -1;
|
||||||
if (cfgAddFloat(pCfg, "numOfThreadsPerCore", tsNumOfThreadsPerCore, 0, 10, 1) != 0) return -1;
|
|
||||||
if (cfgAddInt32(pCfg, "maxTmrCtrl", tsMaxTmrCtrl, 8, 2048, 1) != 0) return -1;
|
if (cfgAddInt32(pCfg, "maxTmrCtrl", tsMaxTmrCtrl, 8, 2048, 1) != 0) return -1;
|
||||||
if (cfgAddInt32(pCfg, "rpcTimer", tsRpcTimer, 100, 3000, 1) != 0) return -1;
|
if (cfgAddInt32(pCfg, "rpcTimer", tsRpcTimer, 100, 3000, 1) != 0) return -1;
|
||||||
if (cfgAddInt32(pCfg, "rpcMaxTime", tsRpcMaxTime, 100, 7200, 1) != 0) return -1;
|
if (cfgAddInt32(pCfg, "rpcMaxTime", tsRpcMaxTime, 100, 7200, 1) != 0) return -1;
|
||||||
|
@ -297,6 +316,11 @@ static int32_t taosAddClientCfg(SConfig *pCfg) {
|
||||||
return -1;
|
return -1;
|
||||||
if (cfgAddBool(pCfg, "keepColumnName", tsKeepOriginalColumnName, 1) != 0) return -1;
|
if (cfgAddBool(pCfg, "keepColumnName", tsKeepOriginalColumnName, 1) != 0) return -1;
|
||||||
if (cfgAddInt32(pCfg, "maxBinaryDisplayWidth", tsMaxBinaryDisplayWidth, 1, 65536, 1) != 0) return -1;
|
if (cfgAddInt32(pCfg, "maxBinaryDisplayWidth", tsMaxBinaryDisplayWidth, 1, 65536, 1) != 0) return -1;
|
||||||
|
|
||||||
|
tsNumOfTaskQueueThreads = tsNumOfCores / 4;
|
||||||
|
tsNumOfTaskQueueThreads = TRANGE(tsNumOfTaskQueueThreads, 1, 2);
|
||||||
|
if (cfgAddInt32(pCfg, "numOfTaskQueueThreads", tsNumOfTaskQueueThreads, 1, 1024, 0) != 0) return -1;
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -329,8 +353,6 @@ static int32_t taosAddServerCfg(SConfig *pCfg) {
|
||||||
if (cfgAddInt32(pCfg, "supportVnodes", 256, 0, 65536, 0) != 0) return -1;
|
if (cfgAddInt32(pCfg, "supportVnodes", 256, 0, 65536, 0) != 0) return -1;
|
||||||
if (cfgAddDir(pCfg, "dataDir", tsDataDir, 0) != 0) return -1;
|
if (cfgAddDir(pCfg, "dataDir", tsDataDir, 0) != 0) return -1;
|
||||||
if (cfgAddFloat(pCfg, "minimalDataDirGB", 2.0f, 0.001f, 10000000, 0) != 0) return -1;
|
if (cfgAddFloat(pCfg, "minimalDataDirGB", 2.0f, 0.001f, 10000000, 0) != 0) return -1;
|
||||||
if (cfgAddInt32(pCfg, "numOfCommitThreads", tsNumOfCommitThreads, 1, 100, 0) != 0) return -1;
|
|
||||||
if (cfgAddFloat(pCfg, "ratioOfQueryCores", tsRatioOfQueryCores, 0, 2, 0) != 0) return -1;
|
|
||||||
if (cfgAddInt32(pCfg, "maxNumOfDistinctRes", tsMaxNumOfDistinctResults, 10 * 10000, 10000 * 10000, 0) != 0) return -1;
|
if (cfgAddInt32(pCfg, "maxNumOfDistinctRes", tsMaxNumOfDistinctResults, 10 * 10000, 10000 * 10000, 0) != 0) return -1;
|
||||||
if (cfgAddBool(pCfg, "telemetryReporting", tsEnableTelemetryReporting, 0) != 0) return -1;
|
if (cfgAddBool(pCfg, "telemetryReporting", tsEnableTelemetryReporting, 0) != 0) return -1;
|
||||||
if (cfgAddInt32(pCfg, "maxConnections", tsMaxConnections, 1, 100000, 0) != 0) return -1;
|
if (cfgAddInt32(pCfg, "maxConnections", tsMaxConnections, 1, 100000, 0) != 0) return -1;
|
||||||
|
@ -347,7 +369,65 @@ static int32_t taosAddServerCfg(SConfig *pCfg) {
|
||||||
if (cfgAddBool(pCfg, "printAuth", tsPrintAuth, 0) != 0) return -1;
|
if (cfgAddBool(pCfg, "printAuth", tsPrintAuth, 0) != 0) return -1;
|
||||||
if (cfgAddBool(pCfg, "slaveQuery", tsEnableSlaveQuery, 0) != 0) return -1;
|
if (cfgAddBool(pCfg, "slaveQuery", tsEnableSlaveQuery, 0) != 0) return -1;
|
||||||
if (cfgAddBool(pCfg, "deadLockKillQuery", tsDeadLockKillQuery, 0) != 0) return -1;
|
if (cfgAddBool(pCfg, "deadLockKillQuery", tsDeadLockKillQuery, 0) != 0) return -1;
|
||||||
|
|
||||||
if (cfgAddBool(pCfg, "multiProcess", tsMultiProcess, 0) != 0) return -1;
|
if (cfgAddBool(pCfg, "multiProcess", tsMultiProcess, 0) != 0) return -1;
|
||||||
|
if (cfgAddInt32(pCfg, "mnodeShmSize", tsMnodeShmSize, 4096, INT32_MAX, 0) != 0) return -1;
|
||||||
|
if (cfgAddInt32(pCfg, "vnodeShmSize", tsVnodeShmSize, 4096, INT32_MAX, 0) != 0) return -1;
|
||||||
|
if (cfgAddInt32(pCfg, "qnodeShmSize", tsQnodeShmSize, 4096, INT32_MAX, 0) != 0) return -1;
|
||||||
|
if (cfgAddInt32(pCfg, "snodeShmSize", tsSnodeShmSize, 4096, INT32_MAX, 0) != 0) return -1;
|
||||||
|
if (cfgAddInt32(pCfg, "bnodeShmSize", tsBnodeShmSize, 4096, INT32_MAX, 0) != 0) return -1;
|
||||||
|
|
||||||
|
tsNumOfRpcThreads = tsNumOfCores / 2;
|
||||||
|
tsNumOfRpcThreads = TRANGE(tsNumOfRpcThreads, 1, 4);
|
||||||
|
if (cfgAddInt32(pCfg, "numOfRpcThreads", tsNumOfRpcThreads, 1, 1024, 0) != 0) return -1;
|
||||||
|
|
||||||
|
tsNumOfCommitThreads = tsNumOfCores / 2;
|
||||||
|
tsNumOfCommitThreads = TRANGE(tsNumOfCommitThreads, 2, 4);
|
||||||
|
if (cfgAddInt32(pCfg, "numOfCommitThreads", tsNumOfCommitThreads, 1, 1024, 0) != 0) return -1;
|
||||||
|
|
||||||
|
tsNumOfMnodeQueryThreads = tsNumOfCores / 8;
|
||||||
|
tsNumOfMnodeQueryThreads = TRANGE(tsNumOfMnodeQueryThreads, 1, 4);
|
||||||
|
if (cfgAddInt32(pCfg, "numOfMnodeQueryThreads", tsNumOfMnodeQueryThreads, 1, 1024, 0) != 0) return -1;
|
||||||
|
|
||||||
|
tsNumOfMnodeReadThreads = tsNumOfCores / 8;
|
||||||
|
tsNumOfMnodeReadThreads = TRANGE(tsNumOfMnodeReadThreads, 1, 4);
|
||||||
|
if (cfgAddInt32(pCfg, "numOfMnodeReadThreads", tsNumOfMnodeReadThreads, 1, 1024, 0) != 0) return -1;
|
||||||
|
|
||||||
|
tsNumOfVnodeQueryThreads = tsNumOfCores / 2;
|
||||||
|
tsNumOfVnodeQueryThreads = TMAX(tsNumOfVnodeQueryThreads, 1);
|
||||||
|
if (cfgAddInt32(pCfg, "numOfVnodeQueryThreads", tsNumOfVnodeQueryThreads, 1, 1024, 0) != 0) return -1;
|
||||||
|
|
||||||
|
tsNumOfVnodeFetchThreads = tsNumOfCores / 2;
|
||||||
|
tsNumOfVnodeFetchThreads = TRANGE(tsNumOfVnodeFetchThreads, 2, 4);
|
||||||
|
if (cfgAddInt32(pCfg, "numOfVnodeFetchThreads", tsNumOfVnodeFetchThreads, 1, 1024, 0) != 0) return -1;
|
||||||
|
|
||||||
|
tsNumOfVnodeWriteThreads = tsNumOfCores;
|
||||||
|
tsNumOfVnodeWriteThreads = TMAX(tsNumOfVnodeWriteThreads, 1);
|
||||||
|
if (cfgAddInt32(pCfg, "numOfVnodeWriteThreads", tsNumOfVnodeWriteThreads, 1, 1024, 0) != 0) return -1;
|
||||||
|
|
||||||
|
tsNumOfVnodeSyncThreads = tsNumOfCores / 2;
|
||||||
|
tsNumOfVnodeSyncThreads = TMAX(tsNumOfVnodeSyncThreads, 1);
|
||||||
|
if (cfgAddInt32(pCfg, "numOfVnodeSyncThreads", tsNumOfVnodeSyncThreads, 1, 1024, 0) != 0) return -1;
|
||||||
|
|
||||||
|
tsNumOfVnodeMergeThreads = tsNumOfCores / 8;
|
||||||
|
tsNumOfVnodeMergeThreads = TRANGE(tsNumOfVnodeMergeThreads, 1, 1);
|
||||||
|
if (cfgAddInt32(pCfg, "numOfVnodeMergeThreads", tsNumOfVnodeMergeThreads, 1, 1024, 0) != 0) return -1;
|
||||||
|
|
||||||
|
tsNumOfQnodeQueryThreads = tsNumOfCores / 2;
|
||||||
|
tsNumOfQnodeQueryThreads = TMAX(tsNumOfQnodeQueryThreads, 1);
|
||||||
|
if (cfgAddInt32(pCfg, "numOfQnodeQueryThreads", tsNumOfQnodeQueryThreads, 1, 1024, 0) != 0) return -1;
|
||||||
|
|
||||||
|
tsNumOfQnodeFetchThreads = tsNumOfCores / 2;
|
||||||
|
tsNumOfQnodeFetchThreads = TRANGE(tsNumOfQnodeFetchThreads, 2, 4);
|
||||||
|
if (cfgAddInt32(pCfg, "numOfQnodeFetchThreads", tsNumOfQnodeFetchThreads, 1, 1024, 0) != 0) return -1;
|
||||||
|
|
||||||
|
tsNumOfSnodeSharedThreads = tsNumOfCores / 4;
|
||||||
|
tsNumOfSnodeSharedThreads = TRANGE(tsNumOfSnodeSharedThreads, 2, 4);
|
||||||
|
if (cfgAddInt32(pCfg, "numOfSnodeSharedThreads", tsNumOfSnodeSharedThreads, 1, 1024, 0) != 0) return -1;
|
||||||
|
|
||||||
|
tsNumOfSnodeUniqueThreads = tsNumOfCores / 4;
|
||||||
|
tsNumOfSnodeUniqueThreads = TRANGE(tsNumOfSnodeUniqueThreads, 2, 4);
|
||||||
|
if (cfgAddInt32(pCfg, "numOfSnodeUniqueThreads", tsNumOfSnodeUniqueThreads, 1, 1024, 0) != 0) return -1;
|
||||||
|
|
||||||
if (cfgAddBool(pCfg, "monitor", tsEnableMonitor, 0) != 0) return -1;
|
if (cfgAddBool(pCfg, "monitor", tsEnableMonitor, 0) != 0) return -1;
|
||||||
if (cfgAddInt32(pCfg, "monitorInterval", tsMonitorInterval, 1, 360000, 0) != 0) return -1;
|
if (cfgAddInt32(pCfg, "monitorInterval", tsMonitorInterval, 1, 360000, 0) != 0) return -1;
|
||||||
|
@ -411,7 +491,6 @@ static int32_t taosSetClientCfg(SConfig *pCfg) {
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
tsNumOfThreadsPerCore = cfgGetItem(pCfg, "numOfThreadsPerCore")->fval;
|
|
||||||
tsMaxTmrCtrl = cfgGetItem(pCfg, "maxTmrCtrl")->i32;
|
tsMaxTmrCtrl = cfgGetItem(pCfg, "maxTmrCtrl")->i32;
|
||||||
tsRpcTimer = cfgGetItem(pCfg, "rpcTimer")->i32;
|
tsRpcTimer = cfgGetItem(pCfg, "rpcTimer")->i32;
|
||||||
tsRpcMaxTime = cfgGetItem(pCfg, "rpcMaxTime")->i32;
|
tsRpcMaxTime = cfgGetItem(pCfg, "rpcMaxTime")->i32;
|
||||||
|
@ -424,7 +503,7 @@ static int32_t taosSetClientCfg(SConfig *pCfg) {
|
||||||
tsMaxNumOfOrderedResults = cfgGetItem(pCfg, "maxNumOfOrderedRes")->i32;
|
tsMaxNumOfOrderedResults = cfgGetItem(pCfg, "maxNumOfOrderedRes")->i32;
|
||||||
tsKeepOriginalColumnName = cfgGetItem(pCfg, "keepColumnName")->bval;
|
tsKeepOriginalColumnName = cfgGetItem(pCfg, "keepColumnName")->bval;
|
||||||
tsMaxBinaryDisplayWidth = cfgGetItem(pCfg, "maxBinaryDisplayWidth")->i32;
|
tsMaxBinaryDisplayWidth = cfgGetItem(pCfg, "maxBinaryDisplayWidth")->i32;
|
||||||
|
tsNumOfTaskQueueThreads = cfgGetItem(pCfg, "numOfTaskQueueThreads")->i32;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -448,8 +527,6 @@ static void taosSetSystemCfg(SConfig *pCfg) {
|
||||||
|
|
||||||
static int32_t taosSetServerCfg(SConfig *pCfg) {
|
static int32_t taosSetServerCfg(SConfig *pCfg) {
|
||||||
tsDataSpace.reserved = cfgGetItem(pCfg, "minimalDataDirGB")->fval;
|
tsDataSpace.reserved = cfgGetItem(pCfg, "minimalDataDirGB")->fval;
|
||||||
tsNumOfCommitThreads = cfgGetItem(pCfg, "numOfCommitThreads")->i32;
|
|
||||||
tsRatioOfQueryCores = cfgGetItem(pCfg, "ratioOfQueryCores")->fval;
|
|
||||||
tsMaxNumOfDistinctResults = cfgGetItem(pCfg, "maxNumOfDistinctRes")->i32;
|
tsMaxNumOfDistinctResults = cfgGetItem(pCfg, "maxNumOfDistinctRes")->i32;
|
||||||
tsEnableTelemetryReporting = cfgGetItem(pCfg, "telemetryReporting")->bval;
|
tsEnableTelemetryReporting = cfgGetItem(pCfg, "telemetryReporting")->bval;
|
||||||
tsMaxConnections = cfgGetItem(pCfg, "maxConnections")->i32;
|
tsMaxConnections = cfgGetItem(pCfg, "maxConnections")->i32;
|
||||||
|
@ -466,7 +543,27 @@ static int32_t taosSetServerCfg(SConfig *pCfg) {
|
||||||
tsPrintAuth = cfgGetItem(pCfg, "printAuth")->bval;
|
tsPrintAuth = cfgGetItem(pCfg, "printAuth")->bval;
|
||||||
tsEnableSlaveQuery = cfgGetItem(pCfg, "slaveQuery")->bval;
|
tsEnableSlaveQuery = cfgGetItem(pCfg, "slaveQuery")->bval;
|
||||||
tsDeadLockKillQuery = cfgGetItem(pCfg, "deadLockKillQuery")->bval;
|
tsDeadLockKillQuery = cfgGetItem(pCfg, "deadLockKillQuery")->bval;
|
||||||
|
|
||||||
tsMultiProcess = cfgGetItem(pCfg, "multiProcess")->bval;
|
tsMultiProcess = cfgGetItem(pCfg, "multiProcess")->bval;
|
||||||
|
tsMnodeShmSize = cfgGetItem(pCfg, "mnodeShmSize")->i32;
|
||||||
|
tsVnodeShmSize = cfgGetItem(pCfg, "vnodeShmSize")->i32;
|
||||||
|
tsQnodeShmSize = cfgGetItem(pCfg, "qnodeShmSize")->i32;
|
||||||
|
tsSnodeShmSize = cfgGetItem(pCfg, "snodeShmSize")->i32;
|
||||||
|
tsBnodeShmSize = cfgGetItem(pCfg, "bnodeShmSize")->i32;
|
||||||
|
|
||||||
|
tsNumOfRpcThreads = cfgGetItem(pCfg, "numOfRpcThreads")->i32;
|
||||||
|
tsNumOfCommitThreads = cfgGetItem(pCfg, "numOfCommitThreads")->i32;
|
||||||
|
tsNumOfMnodeQueryThreads = cfgGetItem(pCfg, "numOfMnodeQueryThreads")->i32;
|
||||||
|
tsNumOfMnodeReadThreads = cfgGetItem(pCfg, "numOfMnodeReadThreads")->i32;
|
||||||
|
tsNumOfVnodeQueryThreads = cfgGetItem(pCfg, "numOfVnodeQueryThreads")->i32;
|
||||||
|
tsNumOfVnodeFetchThreads = cfgGetItem(pCfg, "numOfVnodeFetchThreads")->i32;
|
||||||
|
tsNumOfVnodeWriteThreads = cfgGetItem(pCfg, "numOfVnodeWriteThreads")->i32;
|
||||||
|
tsNumOfVnodeSyncThreads = cfgGetItem(pCfg, "numOfVnodeSyncThreads")->i32;
|
||||||
|
tsNumOfVnodeMergeThreads = cfgGetItem(pCfg, "numOfVnodeMergeThreads")->i32;
|
||||||
|
tsNumOfQnodeQueryThreads = cfgGetItem(pCfg, "numOfQnodeQueryThreads")->i32;
|
||||||
|
tsNumOfQnodeFetchThreads = cfgGetItem(pCfg, "numOfQnodeFetchThreads")->i32;
|
||||||
|
tsNumOfSnodeSharedThreads = cfgGetItem(pCfg, "numOfSnodeSharedThreads")->i32;
|
||||||
|
tsNumOfSnodeUniqueThreads = cfgGetItem(pCfg, "numOfSnodeUniqueThreads")->i32;
|
||||||
|
|
||||||
tsEnableMonitor = cfgGetItem(pCfg, "monitor")->bval;
|
tsEnableMonitor = cfgGetItem(pCfg, "monitor")->bval;
|
||||||
tsMonitorInterval = cfgGetItem(pCfg, "monitorInterval")->i32;
|
tsMonitorInterval = cfgGetItem(pCfg, "monitorInterval")->i32;
|
||||||
|
|
|
@ -296,33 +296,30 @@ int32_t tSerializeSVCreateTbReq(void **buf, SVCreateTbReq *pReq) {
|
||||||
switch (pReq->type) {
|
switch (pReq->type) {
|
||||||
case TD_SUPER_TABLE:
|
case TD_SUPER_TABLE:
|
||||||
tlen += taosEncodeFixedI64(buf, pReq->stbCfg.suid);
|
tlen += taosEncodeFixedI64(buf, pReq->stbCfg.suid);
|
||||||
tlen += taosEncodeFixedU32(buf, pReq->stbCfg.nCols);
|
tlen += taosEncodeFixedI16(buf, pReq->stbCfg.nCols);
|
||||||
for (uint32_t i = 0; i < pReq->stbCfg.nCols; i++) {
|
tlen += taosEncodeFixedI16(buf, pReq->stbCfg.nBSmaCols);
|
||||||
|
for (col_id_t i = 0; i < pReq->stbCfg.nCols; ++i) {
|
||||||
tlen += taosEncodeFixedI8(buf, pReq->stbCfg.pSchema[i].type);
|
tlen += taosEncodeFixedI8(buf, pReq->stbCfg.pSchema[i].type);
|
||||||
|
tlen += taosEncodeFixedI8(buf, pReq->stbCfg.pSchema[i].sma);
|
||||||
tlen += taosEncodeFixedI16(buf, pReq->stbCfg.pSchema[i].colId);
|
tlen += taosEncodeFixedI16(buf, pReq->stbCfg.pSchema[i].colId);
|
||||||
tlen += taosEncodeFixedI32(buf, pReq->stbCfg.pSchema[i].bytes);
|
tlen += taosEncodeFixedI32(buf, pReq->stbCfg.pSchema[i].bytes);
|
||||||
tlen += taosEncodeString(buf, pReq->stbCfg.pSchema[i].name);
|
tlen += taosEncodeString(buf, pReq->stbCfg.pSchema[i].name);
|
||||||
}
|
}
|
||||||
tlen += taosEncodeFixedU32(buf, pReq->stbCfg.nTagCols);
|
tlen += taosEncodeFixedI16(buf, pReq->stbCfg.nTagCols);
|
||||||
for (uint32_t i = 0; i < pReq->stbCfg.nTagCols; i++) {
|
for (col_id_t i = 0; i < pReq->stbCfg.nTagCols; ++i) {
|
||||||
tlen += taosEncodeFixedI8(buf, pReq->stbCfg.pTagSchema[i].type);
|
tlen += taosEncodeFixedI8(buf, pReq->stbCfg.pTagSchema[i].type);
|
||||||
tlen += taosEncodeFixedI16(buf, pReq->stbCfg.pTagSchema[i].colId);
|
tlen += taosEncodeFixedI16(buf, pReq->stbCfg.pTagSchema[i].colId);
|
||||||
tlen += taosEncodeFixedI32(buf, pReq->stbCfg.pTagSchema[i].bytes);
|
tlen += taosEncodeFixedI32(buf, pReq->stbCfg.pTagSchema[i].bytes);
|
||||||
tlen += taosEncodeString(buf, pReq->stbCfg.pTagSchema[i].name);
|
tlen += taosEncodeString(buf, pReq->stbCfg.pTagSchema[i].name);
|
||||||
}
|
}
|
||||||
tlen += taosEncodeFixedI16(buf, pReq->stbCfg.nBSmaCols);
|
|
||||||
for (col_id_t i = 0; i < pReq->stbCfg.nBSmaCols; ++i) {
|
|
||||||
tlen += taosEncodeFixedI16(buf, pReq->stbCfg.pBSmaCols[i]);
|
|
||||||
}
|
|
||||||
if (pReq->rollup && pReq->stbCfg.pRSmaParam) {
|
if (pReq->rollup && pReq->stbCfg.pRSmaParam) {
|
||||||
SRSmaParam *param = pReq->stbCfg.pRSmaParam;
|
SRSmaParam *param = pReq->stbCfg.pRSmaParam;
|
||||||
tlen += taosEncodeFixedU32(buf, (uint32_t)param->xFilesFactor);
|
tlen += taosEncodeBinary(buf, (const void *)¶m->xFilesFactor, sizeof(param->xFilesFactor));
|
||||||
tlen += taosEncodeFixedI8(buf, param->delayUnit);
|
tlen += taosEncodeFixedI32(buf, param->delay);
|
||||||
tlen += taosEncodeFixedI8(buf, param->nFuncIds);
|
tlen += taosEncodeFixedI8(buf, param->nFuncIds);
|
||||||
for (int8_t i = 0; i < param->nFuncIds; ++i) {
|
for (int8_t i = 0; i < param->nFuncIds; ++i) {
|
||||||
tlen += taosEncodeFixedI32(buf, param->pFuncIds[i]);
|
tlen += taosEncodeFixedI32(buf, param->pFuncIds[i]);
|
||||||
}
|
}
|
||||||
tlen += taosEncodeFixedI64(buf, param->delay);
|
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case TD_CHILD_TABLE:
|
case TD_CHILD_TABLE:
|
||||||
|
@ -330,26 +327,23 @@ int32_t tSerializeSVCreateTbReq(void **buf, SVCreateTbReq *pReq) {
|
||||||
tlen += tdEncodeKVRow(buf, pReq->ctbCfg.pTag);
|
tlen += tdEncodeKVRow(buf, pReq->ctbCfg.pTag);
|
||||||
break;
|
break;
|
||||||
case TD_NORMAL_TABLE:
|
case TD_NORMAL_TABLE:
|
||||||
tlen += taosEncodeFixedU32(buf, pReq->ntbCfg.nCols);
|
tlen += taosEncodeFixedI16(buf, pReq->ntbCfg.nCols);
|
||||||
for (uint32_t i = 0; i < pReq->ntbCfg.nCols; i++) {
|
tlen += taosEncodeFixedI16(buf, pReq->ntbCfg.nBSmaCols);
|
||||||
|
for (col_id_t i = 0; i < pReq->ntbCfg.nCols; ++i) {
|
||||||
tlen += taosEncodeFixedI8(buf, pReq->ntbCfg.pSchema[i].type);
|
tlen += taosEncodeFixedI8(buf, pReq->ntbCfg.pSchema[i].type);
|
||||||
|
tlen += taosEncodeFixedI8(buf, pReq->ntbCfg.pSchema[i].sma);
|
||||||
tlen += taosEncodeFixedI16(buf, pReq->ntbCfg.pSchema[i].colId);
|
tlen += taosEncodeFixedI16(buf, pReq->ntbCfg.pSchema[i].colId);
|
||||||
tlen += taosEncodeFixedI32(buf, pReq->ntbCfg.pSchema[i].bytes);
|
tlen += taosEncodeFixedI32(buf, pReq->ntbCfg.pSchema[i].bytes);
|
||||||
tlen += taosEncodeString(buf, pReq->ntbCfg.pSchema[i].name);
|
tlen += taosEncodeString(buf, pReq->ntbCfg.pSchema[i].name);
|
||||||
}
|
}
|
||||||
tlen += taosEncodeFixedI16(buf, pReq->ntbCfg.nBSmaCols);
|
|
||||||
for (col_id_t i = 0; i < pReq->ntbCfg.nBSmaCols; ++i) {
|
|
||||||
tlen += taosEncodeFixedI16(buf, pReq->ntbCfg.pBSmaCols[i]);
|
|
||||||
}
|
|
||||||
if (pReq->rollup && pReq->ntbCfg.pRSmaParam) {
|
if (pReq->rollup && pReq->ntbCfg.pRSmaParam) {
|
||||||
SRSmaParam *param = pReq->ntbCfg.pRSmaParam;
|
SRSmaParam *param = pReq->ntbCfg.pRSmaParam;
|
||||||
tlen += taosEncodeFixedU32(buf, (uint32_t)param->xFilesFactor);
|
tlen += taosEncodeBinary(buf, (const void *)¶m->xFilesFactor, sizeof(param->xFilesFactor));
|
||||||
tlen += taosEncodeFixedI8(buf, param->delayUnit);
|
tlen += taosEncodeFixedI32(buf, param->delay);
|
||||||
tlen += taosEncodeFixedI8(buf, param->nFuncIds);
|
tlen += taosEncodeFixedI8(buf, param->nFuncIds);
|
||||||
for (int8_t i = 0; i < param->nFuncIds; ++i) {
|
for (int8_t i = 0; i < param->nFuncIds; ++i) {
|
||||||
tlen += taosEncodeFixedI32(buf, param->pFuncIds[i]);
|
tlen += taosEncodeFixedI32(buf, param->pFuncIds[i]);
|
||||||
}
|
}
|
||||||
tlen += taosEncodeFixedI64(buf, param->delay);
|
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
|
@ -370,45 +364,38 @@ void *tDeserializeSVCreateTbReq(void *buf, SVCreateTbReq *pReq) {
|
||||||
switch (pReq->type) {
|
switch (pReq->type) {
|
||||||
case TD_SUPER_TABLE:
|
case TD_SUPER_TABLE:
|
||||||
buf = taosDecodeFixedI64(buf, &(pReq->stbCfg.suid));
|
buf = taosDecodeFixedI64(buf, &(pReq->stbCfg.suid));
|
||||||
buf = taosDecodeFixedU32(buf, &(pReq->stbCfg.nCols));
|
buf = taosDecodeFixedI16(buf, &(pReq->stbCfg.nCols));
|
||||||
pReq->stbCfg.pSchema = (SSchema *)taosMemoryMalloc(pReq->stbCfg.nCols * sizeof(SSchema));
|
buf = taosDecodeFixedI16(buf, &(pReq->stbCfg.nBSmaCols));
|
||||||
for (uint32_t i = 0; i < pReq->stbCfg.nCols; i++) {
|
pReq->stbCfg.pSchema = (SSchemaEx *)taosMemoryMalloc(pReq->stbCfg.nCols * sizeof(SSchemaEx));
|
||||||
|
for (col_id_t i = 0; i < pReq->stbCfg.nCols; ++i) {
|
||||||
buf = taosDecodeFixedI8(buf, &(pReq->stbCfg.pSchema[i].type));
|
buf = taosDecodeFixedI8(buf, &(pReq->stbCfg.pSchema[i].type));
|
||||||
|
buf = taosDecodeFixedI8(buf, &(pReq->stbCfg.pSchema[i].sma));
|
||||||
buf = taosDecodeFixedI16(buf, &(pReq->stbCfg.pSchema[i].colId));
|
buf = taosDecodeFixedI16(buf, &(pReq->stbCfg.pSchema[i].colId));
|
||||||
buf = taosDecodeFixedI32(buf, &(pReq->stbCfg.pSchema[i].bytes));
|
buf = taosDecodeFixedI32(buf, &(pReq->stbCfg.pSchema[i].bytes));
|
||||||
buf = taosDecodeStringTo(buf, pReq->stbCfg.pSchema[i].name);
|
buf = taosDecodeStringTo(buf, pReq->stbCfg.pSchema[i].name);
|
||||||
}
|
}
|
||||||
buf = taosDecodeFixedU32(buf, &pReq->stbCfg.nTagCols);
|
buf = taosDecodeFixedI16(buf, &pReq->stbCfg.nTagCols);
|
||||||
pReq->stbCfg.pTagSchema = (SSchema *)taosMemoryMalloc(pReq->stbCfg.nTagCols * sizeof(SSchema));
|
pReq->stbCfg.pTagSchema = (SSchema *)taosMemoryMalloc(pReq->stbCfg.nTagCols * sizeof(SSchema));
|
||||||
for (uint32_t i = 0; i < pReq->stbCfg.nTagCols; i++) {
|
for (col_id_t i = 0; i < pReq->stbCfg.nTagCols; ++i) {
|
||||||
buf = taosDecodeFixedI8(buf, &(pReq->stbCfg.pTagSchema[i].type));
|
buf = taosDecodeFixedI8(buf, &(pReq->stbCfg.pTagSchema[i].type));
|
||||||
buf = taosDecodeFixedI16(buf, &pReq->stbCfg.pTagSchema[i].colId);
|
buf = taosDecodeFixedI16(buf, &pReq->stbCfg.pTagSchema[i].colId);
|
||||||
buf = taosDecodeFixedI32(buf, &pReq->stbCfg.pTagSchema[i].bytes);
|
buf = taosDecodeFixedI32(buf, &pReq->stbCfg.pTagSchema[i].bytes);
|
||||||
buf = taosDecodeStringTo(buf, pReq->stbCfg.pTagSchema[i].name);
|
buf = taosDecodeStringTo(buf, pReq->stbCfg.pTagSchema[i].name);
|
||||||
}
|
}
|
||||||
buf = taosDecodeFixedI16(buf, &(pReq->stbCfg.nBSmaCols));
|
|
||||||
if (pReq->stbCfg.nBSmaCols > 0) {
|
|
||||||
pReq->stbCfg.pBSmaCols = (col_id_t *)taosMemoryMalloc(pReq->stbCfg.nBSmaCols * sizeof(col_id_t));
|
|
||||||
for (col_id_t i = 0; i < pReq->stbCfg.nBSmaCols; ++i) {
|
|
||||||
buf = taosDecodeFixedI16(buf, pReq->stbCfg.pBSmaCols + i);
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
pReq->stbCfg.pBSmaCols = NULL;
|
|
||||||
}
|
|
||||||
if (pReq->rollup) {
|
if (pReq->rollup) {
|
||||||
pReq->stbCfg.pRSmaParam = (SRSmaParam *)taosMemoryMalloc(sizeof(SRSmaParam));
|
pReq->stbCfg.pRSmaParam = (SRSmaParam *)taosMemoryMalloc(sizeof(SRSmaParam));
|
||||||
SRSmaParam *param = pReq->stbCfg.pRSmaParam;
|
SRSmaParam *param = pReq->stbCfg.pRSmaParam;
|
||||||
buf = taosDecodeFixedU32(buf, (uint32_t *)¶m->xFilesFactor);
|
buf = taosDecodeBinaryTo(buf, (void*)¶m->xFilesFactor, sizeof(param->xFilesFactor));
|
||||||
buf = taosDecodeFixedI8(buf, ¶m->delayUnit);
|
buf = taosDecodeFixedI32(buf, ¶m->delay);
|
||||||
buf = taosDecodeFixedI8(buf, ¶m->nFuncIds);
|
buf = taosDecodeFixedI8(buf, ¶m->nFuncIds);
|
||||||
if (param->nFuncIds > 0) {
|
if (param->nFuncIds > 0) {
|
||||||
|
param->pFuncIds = (func_id_t *)taosMemoryMalloc(param->nFuncIds * sizeof(func_id_t));
|
||||||
for (int8_t i = 0; i < param->nFuncIds; ++i) {
|
for (int8_t i = 0; i < param->nFuncIds; ++i) {
|
||||||
buf = taosDecodeFixedI32(buf, param->pFuncIds + i);
|
buf = taosDecodeFixedI32(buf, param->pFuncIds + i);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
param->pFuncIds = NULL;
|
param->pFuncIds = NULL;
|
||||||
}
|
}
|
||||||
buf = taosDecodeFixedI64(buf, ¶m->delay);
|
|
||||||
} else {
|
} else {
|
||||||
pReq->stbCfg.pRSmaParam = NULL;
|
pReq->stbCfg.pRSmaParam = NULL;
|
||||||
}
|
}
|
||||||
|
@ -418,37 +405,30 @@ void *tDeserializeSVCreateTbReq(void *buf, SVCreateTbReq *pReq) {
|
||||||
buf = tdDecodeKVRow(buf, &pReq->ctbCfg.pTag);
|
buf = tdDecodeKVRow(buf, &pReq->ctbCfg.pTag);
|
||||||
break;
|
break;
|
||||||
case TD_NORMAL_TABLE:
|
case TD_NORMAL_TABLE:
|
||||||
buf = taosDecodeFixedU32(buf, &pReq->ntbCfg.nCols);
|
buf = taosDecodeFixedI16(buf, &pReq->ntbCfg.nCols);
|
||||||
pReq->ntbCfg.pSchema = (SSchema *)taosMemoryMalloc(pReq->ntbCfg.nCols * sizeof(SSchema));
|
buf = taosDecodeFixedI16(buf, &(pReq->ntbCfg.nBSmaCols));
|
||||||
for (uint32_t i = 0; i < pReq->ntbCfg.nCols; i++) {
|
pReq->ntbCfg.pSchema = (SSchemaEx *)taosMemoryMalloc(pReq->ntbCfg.nCols * sizeof(SSchemaEx));
|
||||||
|
for (col_id_t i = 0; i < pReq->ntbCfg.nCols; ++i) {
|
||||||
buf = taosDecodeFixedI8(buf, &pReq->ntbCfg.pSchema[i].type);
|
buf = taosDecodeFixedI8(buf, &pReq->ntbCfg.pSchema[i].type);
|
||||||
|
buf = taosDecodeFixedI8(buf, &pReq->ntbCfg.pSchema[i].sma);
|
||||||
buf = taosDecodeFixedI16(buf, &pReq->ntbCfg.pSchema[i].colId);
|
buf = taosDecodeFixedI16(buf, &pReq->ntbCfg.pSchema[i].colId);
|
||||||
buf = taosDecodeFixedI32(buf, &pReq->ntbCfg.pSchema[i].bytes);
|
buf = taosDecodeFixedI32(buf, &pReq->ntbCfg.pSchema[i].bytes);
|
||||||
buf = taosDecodeStringTo(buf, pReq->ntbCfg.pSchema[i].name);
|
buf = taosDecodeStringTo(buf, pReq->ntbCfg.pSchema[i].name);
|
||||||
}
|
}
|
||||||
buf = taosDecodeFixedI16(buf, &(pReq->ntbCfg.nBSmaCols));
|
|
||||||
if (pReq->ntbCfg.nBSmaCols > 0) {
|
|
||||||
pReq->ntbCfg.pBSmaCols = (col_id_t *)taosMemoryMalloc(pReq->ntbCfg.nBSmaCols * sizeof(col_id_t));
|
|
||||||
for (col_id_t i = 0; i < pReq->ntbCfg.nBSmaCols; ++i) {
|
|
||||||
buf = taosDecodeFixedI16(buf, pReq->ntbCfg.pBSmaCols + i);
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
pReq->ntbCfg.pBSmaCols = NULL;
|
|
||||||
}
|
|
||||||
if (pReq->rollup) {
|
if (pReq->rollup) {
|
||||||
pReq->ntbCfg.pRSmaParam = (SRSmaParam *)taosMemoryMalloc(sizeof(SRSmaParam));
|
pReq->ntbCfg.pRSmaParam = (SRSmaParam *)taosMemoryMalloc(sizeof(SRSmaParam));
|
||||||
SRSmaParam *param = pReq->ntbCfg.pRSmaParam;
|
SRSmaParam *param = pReq->ntbCfg.pRSmaParam;
|
||||||
buf = taosDecodeFixedU32(buf, (uint32_t *)¶m->xFilesFactor);
|
buf = taosDecodeBinaryTo(buf, (void*)¶m->xFilesFactor, sizeof(param->xFilesFactor));
|
||||||
buf = taosDecodeFixedI8(buf, ¶m->delayUnit);
|
buf = taosDecodeFixedI32(buf, ¶m->delay);
|
||||||
buf = taosDecodeFixedI8(buf, ¶m->nFuncIds);
|
buf = taosDecodeFixedI8(buf, ¶m->nFuncIds);
|
||||||
if (param->nFuncIds > 0) {
|
if (param->nFuncIds > 0) {
|
||||||
|
param->pFuncIds = (func_id_t *)taosMemoryMalloc(param->nFuncIds * sizeof(func_id_t));
|
||||||
for (int8_t i = 0; i < param->nFuncIds; ++i) {
|
for (int8_t i = 0; i < param->nFuncIds; ++i) {
|
||||||
buf = taosDecodeFixedI32(buf, param->pFuncIds + i);
|
buf = taosDecodeFixedI32(buf, param->pFuncIds + i);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
param->pFuncIds = NULL;
|
param->pFuncIds = NULL;
|
||||||
}
|
}
|
||||||
buf = taosDecodeFixedI64(buf, ¶m->delay);
|
|
||||||
} else {
|
} else {
|
||||||
pReq->ntbCfg.pRSmaParam = NULL;
|
pReq->ntbCfg.pRSmaParam = NULL;
|
||||||
}
|
}
|
||||||
|
@ -1535,6 +1515,7 @@ int32_t tSerializeSCreateDbReq(void *buf, int32_t bufLen, SCreateDbReq *pReq) {
|
||||||
if (tEncodeI32(&encoder, pReq->maxRows) < 0) return -1;
|
if (tEncodeI32(&encoder, pReq->maxRows) < 0) return -1;
|
||||||
if (tEncodeI32(&encoder, pReq->commitTime) < 0) return -1;
|
if (tEncodeI32(&encoder, pReq->commitTime) < 0) return -1;
|
||||||
if (tEncodeI32(&encoder, pReq->fsyncPeriod) < 0) return -1;
|
if (tEncodeI32(&encoder, pReq->fsyncPeriod) < 0) return -1;
|
||||||
|
if (tEncodeI32(&encoder, pReq->ttl) < 0) return -1;
|
||||||
if (tEncodeI8(&encoder, pReq->walLevel) < 0) return -1;
|
if (tEncodeI8(&encoder, pReq->walLevel) < 0) return -1;
|
||||||
if (tEncodeI8(&encoder, pReq->precision) < 0) return -1;
|
if (tEncodeI8(&encoder, pReq->precision) < 0) return -1;
|
||||||
if (tEncodeI8(&encoder, pReq->compression) < 0) return -1;
|
if (tEncodeI8(&encoder, pReq->compression) < 0) return -1;
|
||||||
|
@ -1544,6 +1525,7 @@ int32_t tSerializeSCreateDbReq(void *buf, int32_t bufLen, SCreateDbReq *pReq) {
|
||||||
if (tEncodeI8(&encoder, pReq->cacheLastRow) < 0) return -1;
|
if (tEncodeI8(&encoder, pReq->cacheLastRow) < 0) return -1;
|
||||||
if (tEncodeI8(&encoder, pReq->ignoreExist) < 0) return -1;
|
if (tEncodeI8(&encoder, pReq->ignoreExist) < 0) return -1;
|
||||||
if (tEncodeI8(&encoder, pReq->streamMode) < 0) return -1;
|
if (tEncodeI8(&encoder, pReq->streamMode) < 0) return -1;
|
||||||
|
if (tEncodeI8(&encoder, pReq->singleSTable) < 0) return -1;
|
||||||
if (tEncodeI32(&encoder, pReq->numOfRetensions) < 0) return -1;
|
if (tEncodeI32(&encoder, pReq->numOfRetensions) < 0) return -1;
|
||||||
for (int32_t i = 0; i < pReq->numOfRetensions; ++i) {
|
for (int32_t i = 0; i < pReq->numOfRetensions; ++i) {
|
||||||
SRetention *pRetension = taosArrayGet(pReq->pRetensions, i);
|
SRetention *pRetension = taosArrayGet(pReq->pRetensions, i);
|
||||||
|
@ -1576,6 +1558,7 @@ int32_t tDeserializeSCreateDbReq(void *buf, int32_t bufLen, SCreateDbReq *pReq)
|
||||||
if (tDecodeI32(&decoder, &pReq->maxRows) < 0) return -1;
|
if (tDecodeI32(&decoder, &pReq->maxRows) < 0) return -1;
|
||||||
if (tDecodeI32(&decoder, &pReq->commitTime) < 0) return -1;
|
if (tDecodeI32(&decoder, &pReq->commitTime) < 0) return -1;
|
||||||
if (tDecodeI32(&decoder, &pReq->fsyncPeriod) < 0) return -1;
|
if (tDecodeI32(&decoder, &pReq->fsyncPeriod) < 0) return -1;
|
||||||
|
if (tDecodeI32(&decoder, &pReq->ttl) < 0) return -1;
|
||||||
if (tDecodeI8(&decoder, &pReq->walLevel) < 0) return -1;
|
if (tDecodeI8(&decoder, &pReq->walLevel) < 0) return -1;
|
||||||
if (tDecodeI8(&decoder, &pReq->precision) < 0) return -1;
|
if (tDecodeI8(&decoder, &pReq->precision) < 0) return -1;
|
||||||
if (tDecodeI8(&decoder, &pReq->compression) < 0) return -1;
|
if (tDecodeI8(&decoder, &pReq->compression) < 0) return -1;
|
||||||
|
@ -1585,6 +1568,7 @@ int32_t tDeserializeSCreateDbReq(void *buf, int32_t bufLen, SCreateDbReq *pReq)
|
||||||
if (tDecodeI8(&decoder, &pReq->cacheLastRow) < 0) return -1;
|
if (tDecodeI8(&decoder, &pReq->cacheLastRow) < 0) return -1;
|
||||||
if (tDecodeI8(&decoder, &pReq->ignoreExist) < 0) return -1;
|
if (tDecodeI8(&decoder, &pReq->ignoreExist) < 0) return -1;
|
||||||
if (tDecodeI8(&decoder, &pReq->streamMode) < 0) return -1;
|
if (tDecodeI8(&decoder, &pReq->streamMode) < 0) return -1;
|
||||||
|
if (tDecodeI8(&decoder, &pReq->singleSTable) < 0) return -1;
|
||||||
if (tDecodeI32(&decoder, &pReq->numOfRetensions) < 0) return -1;
|
if (tDecodeI32(&decoder, &pReq->numOfRetensions) < 0) return -1;
|
||||||
pReq->pRetensions = taosArrayInit(pReq->numOfRetensions, sizeof(SRetention));
|
pReq->pRetensions = taosArrayInit(pReq->numOfRetensions, sizeof(SRetention));
|
||||||
if (pReq->pRetensions == NULL) {
|
if (pReq->pRetensions == NULL) {
|
||||||
|
@ -1629,6 +1613,7 @@ int32_t tSerializeSAlterDbReq(void *buf, int32_t bufLen, SAlterDbReq *pReq) {
|
||||||
if (tEncodeI8(&encoder, pReq->walLevel) < 0) return -1;
|
if (tEncodeI8(&encoder, pReq->walLevel) < 0) return -1;
|
||||||
if (tEncodeI8(&encoder, pReq->quorum) < 0) return -1;
|
if (tEncodeI8(&encoder, pReq->quorum) < 0) return -1;
|
||||||
if (tEncodeI8(&encoder, pReq->cacheLastRow) < 0) return -1;
|
if (tEncodeI8(&encoder, pReq->cacheLastRow) < 0) return -1;
|
||||||
|
if (tEncodeI8(&encoder, pReq->replications) < 0) return -1;
|
||||||
tEndEncode(&encoder);
|
tEndEncode(&encoder);
|
||||||
|
|
||||||
int32_t tlen = encoder.pos;
|
int32_t tlen = encoder.pos;
|
||||||
|
@ -1650,6 +1635,7 @@ int32_t tDeserializeSAlterDbReq(void *buf, int32_t bufLen, SAlterDbReq *pReq) {
|
||||||
if (tDecodeI8(&decoder, &pReq->walLevel) < 0) return -1;
|
if (tDecodeI8(&decoder, &pReq->walLevel) < 0) return -1;
|
||||||
if (tDecodeI8(&decoder, &pReq->quorum) < 0) return -1;
|
if (tDecodeI8(&decoder, &pReq->quorum) < 0) return -1;
|
||||||
if (tDecodeI8(&decoder, &pReq->cacheLastRow) < 0) return -1;
|
if (tDecodeI8(&decoder, &pReq->cacheLastRow) < 0) return -1;
|
||||||
|
if (tDecodeI8(&decoder, &pReq->replications) < 0) return -1;
|
||||||
tEndDecode(&decoder);
|
tEndDecode(&decoder);
|
||||||
|
|
||||||
tCoderClear(&decoder);
|
tCoderClear(&decoder);
|
||||||
|
@ -1960,6 +1946,152 @@ void tFreeSUseDbBatchRsp(SUseDbBatchRsp *pRsp) {
|
||||||
taosArrayDestroy(pRsp->pArray);
|
taosArrayDestroy(pRsp->pArray);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int32_t tSerializeSDbCfgReq(void* buf, int32_t bufLen, SDbCfgReq* pReq) {
|
||||||
|
SCoder encoder = {0};
|
||||||
|
tCoderInit(&encoder, TD_LITTLE_ENDIAN, buf, bufLen, TD_ENCODER);
|
||||||
|
|
||||||
|
if (tStartEncode(&encoder) < 0) return -1;
|
||||||
|
if (tEncodeCStr(&encoder, pReq->db) < 0) return -1;
|
||||||
|
tEndEncode(&encoder);
|
||||||
|
|
||||||
|
int32_t tlen = encoder.pos;
|
||||||
|
tCoderClear(&encoder);
|
||||||
|
return tlen;
|
||||||
|
}
|
||||||
|
|
||||||
|
int32_t tDeserializeSDbCfgReq(void* buf, int32_t bufLen, SDbCfgReq* pReq) {
|
||||||
|
SCoder decoder = {0};
|
||||||
|
tCoderInit(&decoder, TD_LITTLE_ENDIAN, buf, bufLen, TD_DECODER);
|
||||||
|
|
||||||
|
if (tStartDecode(&decoder) < 0) return -1;
|
||||||
|
if (tDecodeCStrTo(&decoder, pReq->db) < 0) return -1;
|
||||||
|
tEndDecode(&decoder);
|
||||||
|
|
||||||
|
tCoderClear(&decoder);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int32_t tSerializeSDbCfgRsp(void* buf, int32_t bufLen, const SDbCfgRsp* pRsp) {
|
||||||
|
SCoder encoder = {0};
|
||||||
|
tCoderInit(&encoder, TD_LITTLE_ENDIAN, buf, bufLen, TD_ENCODER);
|
||||||
|
|
||||||
|
if (tStartEncode(&encoder) < 0) return -1;
|
||||||
|
if (tEncodeI32(&encoder, pRsp->numOfVgroups) < 0) return -1;
|
||||||
|
if (tEncodeI32(&encoder, pRsp->cacheBlockSize) < 0) return -1;
|
||||||
|
if (tEncodeI32(&encoder, pRsp->totalBlocks) < 0) return -1;
|
||||||
|
if (tEncodeI32(&encoder, pRsp->daysPerFile) < 0) return -1;
|
||||||
|
if (tEncodeI32(&encoder, pRsp->daysToKeep0) < 0) return -1;
|
||||||
|
if (tEncodeI32(&encoder, pRsp->daysToKeep1) < 0) return -1;
|
||||||
|
if (tEncodeI32(&encoder, pRsp->daysToKeep2) < 0) return -1;
|
||||||
|
if (tEncodeI32(&encoder, pRsp->minRows) < 0) return -1;
|
||||||
|
if (tEncodeI32(&encoder, pRsp->maxRows) < 0) return -1;
|
||||||
|
if (tEncodeI32(&encoder, pRsp->commitTime) < 0) return -1;
|
||||||
|
if (tEncodeI32(&encoder, pRsp->fsyncPeriod) < 0) return -1;
|
||||||
|
if (tEncodeI8(&encoder, pRsp->walLevel) < 0) return -1;
|
||||||
|
if (tEncodeI8(&encoder, pRsp->precision) < 0) return -1;
|
||||||
|
if (tEncodeI8(&encoder, pRsp->compression) < 0) return -1;
|
||||||
|
if (tEncodeI8(&encoder, pRsp->replications) < 0) return -1;
|
||||||
|
if (tEncodeI8(&encoder, pRsp->quorum) < 0) return -1;
|
||||||
|
if (tEncodeI8(&encoder, pRsp->update) < 0) return -1;
|
||||||
|
if (tEncodeI8(&encoder, pRsp->cacheLastRow) < 0) return -1;
|
||||||
|
if (tEncodeI8(&encoder, pRsp->streamMode) < 0) return -1;
|
||||||
|
tEndEncode(&encoder);
|
||||||
|
|
||||||
|
int32_t tlen = encoder.pos;
|
||||||
|
tCoderClear(&encoder);
|
||||||
|
return tlen;
|
||||||
|
}
|
||||||
|
|
||||||
|
int32_t tDeserializeSDbCfgRsp(void* buf, int32_t bufLen, SDbCfgRsp* pRsp) {
|
||||||
|
SCoder decoder = {0};
|
||||||
|
tCoderInit(&decoder, TD_LITTLE_ENDIAN, buf, bufLen, TD_DECODER);
|
||||||
|
|
||||||
|
if (tStartDecode(&decoder) < 0) return -1;
|
||||||
|
if (tDecodeI32(&decoder, &pRsp->numOfVgroups) < 0) return -1;
|
||||||
|
if (tDecodeI32(&decoder, &pRsp->cacheBlockSize) < 0) return -1;
|
||||||
|
if (tDecodeI32(&decoder, &pRsp->totalBlocks) < 0) return -1;
|
||||||
|
if (tDecodeI32(&decoder, &pRsp->daysPerFile) < 0) return -1;
|
||||||
|
if (tDecodeI32(&decoder, &pRsp->daysToKeep0) < 0) return -1;
|
||||||
|
if (tDecodeI32(&decoder, &pRsp->daysToKeep1) < 0) return -1;
|
||||||
|
if (tDecodeI32(&decoder, &pRsp->daysToKeep2) < 0) return -1;
|
||||||
|
if (tDecodeI32(&decoder, &pRsp->minRows) < 0) return -1;
|
||||||
|
if (tDecodeI32(&decoder, &pRsp->maxRows) < 0) return -1;
|
||||||
|
if (tDecodeI32(&decoder, &pRsp->commitTime) < 0) return -1;
|
||||||
|
if (tDecodeI32(&decoder, &pRsp->fsyncPeriod) < 0) return -1;
|
||||||
|
if (tDecodeI8(&decoder, &pRsp->walLevel) < 0) return -1;
|
||||||
|
if (tDecodeI8(&decoder, &pRsp->precision) < 0) return -1;
|
||||||
|
if (tDecodeI8(&decoder, &pRsp->compression) < 0) return -1;
|
||||||
|
if (tDecodeI8(&decoder, &pRsp->replications) < 0) return -1;
|
||||||
|
if (tDecodeI8(&decoder, &pRsp->quorum) < 0) return -1;
|
||||||
|
if (tDecodeI8(&decoder, &pRsp->update) < 0) return -1;
|
||||||
|
if (tDecodeI8(&decoder, &pRsp->cacheLastRow) < 0) return -1;
|
||||||
|
if (tDecodeI8(&decoder, &pRsp->streamMode) < 0) return -1;
|
||||||
|
|
||||||
|
tEndDecode(&decoder);
|
||||||
|
|
||||||
|
tCoderClear(&decoder);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int32_t tSerializeSUserIndexReq(void* buf, int32_t bufLen, SUserIndexReq* pReq) {
|
||||||
|
SCoder encoder = {0};
|
||||||
|
tCoderInit(&encoder, TD_LITTLE_ENDIAN, buf, bufLen, TD_ENCODER);
|
||||||
|
|
||||||
|
if (tStartEncode(&encoder) < 0) return -1;
|
||||||
|
if (tEncodeCStr(&encoder, pReq->indexFName) < 0) return -1;
|
||||||
|
tEndEncode(&encoder);
|
||||||
|
|
||||||
|
int32_t tlen = encoder.pos;
|
||||||
|
tCoderClear(&encoder);
|
||||||
|
return tlen;
|
||||||
|
}
|
||||||
|
|
||||||
|
int32_t tDeserializeSUserIndexReq(void* buf, int32_t bufLen, SUserIndexReq* pReq) {
|
||||||
|
SCoder decoder = {0};
|
||||||
|
tCoderInit(&decoder, TD_LITTLE_ENDIAN, buf, bufLen, TD_DECODER);
|
||||||
|
|
||||||
|
if (tStartDecode(&decoder) < 0) return -1;
|
||||||
|
if (tDecodeCStrTo(&decoder, pReq->indexFName) < 0) return -1;
|
||||||
|
tEndDecode(&decoder);
|
||||||
|
|
||||||
|
tCoderClear(&decoder);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int32_t tSerializeSUserIndexRsp(void* buf, int32_t bufLen, const SUserIndexRsp* pRsp) {
|
||||||
|
SCoder encoder = {0};
|
||||||
|
tCoderInit(&encoder, TD_LITTLE_ENDIAN, buf, bufLen, TD_ENCODER);
|
||||||
|
|
||||||
|
if (tStartEncode(&encoder) < 0) return -1;
|
||||||
|
if (tEncodeCStr(&encoder, pRsp->dbFName) < 0) return -1;
|
||||||
|
if (tEncodeCStr(&encoder, pRsp->tblFName) < 0) return -1;
|
||||||
|
if (tEncodeCStr(&encoder, pRsp->colName) < 0) return -1;
|
||||||
|
if (tEncodeCStr(&encoder, pRsp->indexType) < 0) return -1;
|
||||||
|
if (tEncodeCStr(&encoder, pRsp->indexExts) < 0) return -1;
|
||||||
|
tEndEncode(&encoder);
|
||||||
|
|
||||||
|
int32_t tlen = encoder.pos;
|
||||||
|
tCoderClear(&encoder);
|
||||||
|
return tlen;
|
||||||
|
}
|
||||||
|
|
||||||
|
int32_t tDeserializeSUserIndexRsp(void* buf, int32_t bufLen, SUserIndexRsp* pRsp) {
|
||||||
|
SCoder decoder = {0};
|
||||||
|
tCoderInit(&decoder, TD_LITTLE_ENDIAN, buf, bufLen, TD_DECODER);
|
||||||
|
|
||||||
|
if (tStartDecode(&decoder) < 0) return -1;
|
||||||
|
if (tDecodeCStrTo(&decoder, pRsp->dbFName) < 0) return -1;
|
||||||
|
if (tDecodeCStrTo(&decoder, pRsp->tblFName) < 0) return -1;
|
||||||
|
if (tDecodeCStrTo(&decoder, pRsp->colName) < 0) return -1;
|
||||||
|
if (tDecodeCStrTo(&decoder, pRsp->indexType) < 0) return -1;
|
||||||
|
if (tDecodeCStrTo(&decoder, pRsp->indexExts) < 0) return -1;
|
||||||
|
tEndDecode(&decoder);
|
||||||
|
|
||||||
|
tCoderClear(&decoder);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
int32_t tSerializeSShowReq(void *buf, int32_t bufLen, SShowReq *pReq) {
|
int32_t tSerializeSShowReq(void *buf, int32_t bufLen, SShowReq *pReq) {
|
||||||
SCoder encoder = {0};
|
SCoder encoder = {0};
|
||||||
tCoderInit(&encoder, TD_LITTLE_ENDIAN, buf, bufLen, TD_ENCODER);
|
tCoderInit(&encoder, TD_LITTLE_ENDIAN, buf, bufLen, TD_ENCODER);
|
||||||
|
@ -2571,6 +2703,7 @@ int32_t tDeserializeSCreateVnodeReq(void *buf, int32_t bufLen, SCreateVnodeReq *
|
||||||
int32_t tFreeSCreateVnodeReq(SCreateVnodeReq *pReq) {
|
int32_t tFreeSCreateVnodeReq(SCreateVnodeReq *pReq) {
|
||||||
taosArrayDestroy(pReq->pRetensions);
|
taosArrayDestroy(pReq->pRetensions);
|
||||||
pReq->pRetensions = NULL;
|
pReq->pRetensions = NULL;
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t tSerializeSDropVnodeReq(void *buf, int32_t bufLen, SDropVnodeReq *pReq) {
|
int32_t tSerializeSDropVnodeReq(void *buf, int32_t bufLen, SDropVnodeReq *pReq) {
|
||||||
|
@ -2787,6 +2920,48 @@ int32_t tDecodeSMqCMCommitOffsetReq(SCoder *decoder, SMqCMCommitOffsetReq *pReq)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int32_t tSerializeSExplainRsp(void* buf, int32_t bufLen, SExplainRsp* pRsp) {
|
||||||
|
SCoder encoder = {0};
|
||||||
|
tCoderInit(&encoder, TD_LITTLE_ENDIAN, buf, bufLen, TD_ENCODER);
|
||||||
|
|
||||||
|
if (tStartEncode(&encoder) < 0) return -1;
|
||||||
|
if (tEncodeI32(&encoder, pRsp->numOfPlans) < 0) return -1;
|
||||||
|
for (int32_t i = 0; i < pRsp->numOfPlans; ++i) {
|
||||||
|
SExplainExecInfo *info = &pRsp->subplanInfo[i];
|
||||||
|
if (tEncodeU64(&encoder, info->startupCost) < 0) return -1;
|
||||||
|
if (tEncodeU64(&encoder, info->totalCost) < 0) return -1;
|
||||||
|
if (tEncodeU64(&encoder, info->numOfRows) < 0) return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
tEndEncode(&encoder);
|
||||||
|
|
||||||
|
int32_t tlen = encoder.pos;
|
||||||
|
tCoderClear(&encoder);
|
||||||
|
return tlen;
|
||||||
|
}
|
||||||
|
|
||||||
|
int32_t tDeserializeSExplainRsp(void* buf, int32_t bufLen, SExplainRsp* pRsp) {
|
||||||
|
SCoder decoder = {0};
|
||||||
|
tCoderInit(&decoder, TD_LITTLE_ENDIAN, buf, bufLen, TD_DECODER);
|
||||||
|
|
||||||
|
if (tStartDecode(&decoder) < 0) return -1;
|
||||||
|
if (tDecodeI32(&decoder, &pRsp->numOfPlans) < 0) return -1;
|
||||||
|
if (pRsp->numOfPlans > 0) {
|
||||||
|
pRsp->subplanInfo = taosMemoryMalloc(pRsp->numOfPlans * sizeof(SExplainExecInfo));
|
||||||
|
if (pRsp->subplanInfo == NULL) return -1;
|
||||||
|
}
|
||||||
|
for (int32_t i = 0; i < pRsp->numOfPlans; ++i) {
|
||||||
|
if (tDecodeU64(&decoder, &pRsp->subplanInfo[i].startupCost) < 0) return -1;
|
||||||
|
if (tDecodeU64(&decoder, &pRsp->subplanInfo[i].totalCost) < 0) return -1;
|
||||||
|
if (tDecodeU64(&decoder, &pRsp->subplanInfo[i].numOfRows) < 0) return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
tEndDecode(&decoder);
|
||||||
|
|
||||||
|
tCoderClear(&decoder);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
int32_t tSerializeSSchedulerHbReq(void *buf, int32_t bufLen, SSchedulerHbReq *pReq) {
|
int32_t tSerializeSSchedulerHbReq(void *buf, int32_t bufLen, SSchedulerHbReq *pReq) {
|
||||||
int32_t headLen = sizeof(SMsgHead);
|
int32_t headLen = sizeof(SMsgHead);
|
||||||
if (buf != NULL) {
|
if (buf != NULL) {
|
||||||
|
|
|
@ -32,10 +32,6 @@ int32_t tmsgSendReq(const SMsgCb* pMsgCb, const SEpSet* epSet, SRpcMsg* pReq) {
|
||||||
return (*pMsgCb->sendReqFp)(pMsgCb->pWrapper, epSet, pReq);
|
return (*pMsgCb->sendReqFp)(pMsgCb->pWrapper, epSet, pReq);
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t tmsgSendMnodeReq(const SMsgCb* pMsgCb, SRpcMsg* pReq) {
|
|
||||||
return (*pMsgCb->sendMnodeReqFp)(pMsgCb->pWrapper, pReq);
|
|
||||||
}
|
|
||||||
|
|
||||||
void tmsgSendRsp(const SRpcMsg* pRsp) { return (*tsDefaultMsgCb.sendRspFp)(tsDefaultMsgCb.pWrapper, pRsp); }
|
void tmsgSendRsp(const SRpcMsg* pRsp) { return (*tsDefaultMsgCb.sendRspFp)(tsDefaultMsgCb.pWrapper, pRsp); }
|
||||||
|
|
||||||
void tmsgRegisterBrokenLinkArg(const SMsgCb* pMsgCb, SRpcMsg* pMsg) {
|
void tmsgRegisterBrokenLinkArg(const SMsgCb* pMsgCb, SRpcMsg* pMsg) {
|
||||||
|
|
|
@ -503,7 +503,7 @@ SDataCols *tdDupDataCols(SDataCols *pDataCols, bool keepData) {
|
||||||
memcpy(pRet->cols[i].dataOff, pDataCols->cols[i].dataOff, dataOffSize);
|
memcpy(pRet->cols[i].dataOff, pDataCols->cols[i].dataOff, dataOffSize);
|
||||||
}
|
}
|
||||||
if (!TD_COL_ROWS_NORM(pRet->cols + i)) {
|
if (!TD_COL_ROWS_NORM(pRet->cols + i)) {
|
||||||
int32_t nBitmapBytes = (int32_t)TD_BITMAP_BYTES(pDataCols->maxPoints);
|
int32_t nBitmapBytes = (int32_t)TD_BITMAP_BYTES(pDataCols->numOfRows);
|
||||||
memcpy(pRet->cols[i].pBitmap, pDataCols->cols[i].pBitmap, nBitmapBytes);
|
memcpy(pRet->cols[i].pBitmap, pDataCols->cols[i].pBitmap, nBitmapBytes);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -361,6 +361,18 @@ int32_t parseLocaltimeDst(char* timestr, int64_t* time, int32_t timePrec) {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
char getPrecisionUnit(int32_t precision) {
|
||||||
|
static char units[3] = {TIME_UNIT_MILLISECOND, TIME_UNIT_MICROSECOND, TIME_UNIT_NANOSECOND};
|
||||||
|
switch (precision) {
|
||||||
|
case TSDB_TIME_PRECISION_MILLI:
|
||||||
|
case TSDB_TIME_PRECISION_MICRO:
|
||||||
|
case TSDB_TIME_PRECISION_NANO:
|
||||||
|
return units[precision];
|
||||||
|
default:
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
int64_t convertTimePrecision(int64_t time, int32_t fromPrecision, int32_t toPrecision) {
|
int64_t convertTimePrecision(int64_t time, int32_t fromPrecision, int32_t toPrecision) {
|
||||||
assert(fromPrecision == TSDB_TIME_PRECISION_MILLI || fromPrecision == TSDB_TIME_PRECISION_MICRO ||
|
assert(fromPrecision == TSDB_TIME_PRECISION_MILLI || fromPrecision == TSDB_TIME_PRECISION_MICRO ||
|
||||||
fromPrecision == TSDB_TIME_PRECISION_NANO);
|
fromPrecision == TSDB_TIME_PRECISION_NANO);
|
||||||
|
@ -370,6 +382,33 @@ int64_t convertTimePrecision(int64_t time, int32_t fromPrecision, int32_t toPrec
|
||||||
return (int64_t)((double)time * factors[fromPrecision][toPrecision]);
|
return (int64_t)((double)time * factors[fromPrecision][toPrecision]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int64_t convertTimeFromPrecisionToUnit(int64_t time, int32_t fromPrecision, char toUnit) {
|
||||||
|
assert(fromPrecision == TSDB_TIME_PRECISION_MILLI || fromPrecision == TSDB_TIME_PRECISION_MICRO ||
|
||||||
|
fromPrecision == TSDB_TIME_PRECISION_NANO);
|
||||||
|
static double factors[3] = {1000000., 1000., 1.};
|
||||||
|
switch (toUnit) {
|
||||||
|
case 's':
|
||||||
|
return time * factors[fromPrecision] / NANOSECOND_PER_SEC;
|
||||||
|
case 'm':
|
||||||
|
return time * factors[fromPrecision] / NANOSECOND_PER_MINUTE;
|
||||||
|
case 'h':
|
||||||
|
return time * factors[fromPrecision] / NANOSECOND_PER_HOUR;
|
||||||
|
case 'd':
|
||||||
|
return time * factors[fromPrecision] / NANOSECOND_PER_DAY;
|
||||||
|
case 'w':
|
||||||
|
return time * factors[fromPrecision] / NANOSECOND_PER_WEEK;
|
||||||
|
case 'a':
|
||||||
|
return time * factors[fromPrecision] / NANOSECOND_PER_MSEC;
|
||||||
|
case 'u':
|
||||||
|
return time * factors[fromPrecision] / NANOSECOND_PER_USEC;
|
||||||
|
case 'b':
|
||||||
|
return time * factors[fromPrecision];
|
||||||
|
default: {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static int32_t getDuration(int64_t val, char unit, int64_t* result, int32_t timePrecision) {
|
static int32_t getDuration(int64_t val, char unit, int64_t* result, int32_t timePrecision) {
|
||||||
switch (unit) {
|
switch (unit) {
|
||||||
case 's':
|
case 's':
|
||||||
|
|
|
@ -431,7 +431,7 @@ FORCE_INLINE void *getDataMax(int32_t type) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
bool isValidDataType(int32_t type) { return type >= TSDB_DATA_TYPE_NULL && type <= TSDB_DATA_TYPE_UBIGINT; }
|
bool isValidDataType(int32_t type) { return type >= TSDB_DATA_TYPE_NULL && type < TSDB_DATA_TYPE_MAX; }
|
||||||
|
|
||||||
void setVardataNull(void *val, int32_t type) {
|
void setVardataNull(void *val, int32_t type) {
|
||||||
if (type == TSDB_DATA_TYPE_BINARY) {
|
if (type == TSDB_DATA_TYPE_BINARY) {
|
||||||
|
|
|
@ -512,6 +512,16 @@ static FORCE_INLINE int32_t convertToInteger(SVariant *pVariant, int64_t *result
|
||||||
setNull((char *)result, type, tDataTypes[type].bytes);
|
setNull((char *)result, type, tDataTypes[type].bytes);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (IS_SIGNED_NUMERIC_TYPE(pVariant->nType) || (pVariant->nType == TSDB_DATA_TYPE_BOOL)) {
|
||||||
|
*result = pVariant->i;
|
||||||
|
} else if (IS_UNSIGNED_NUMERIC_TYPE(pVariant->nType)) {
|
||||||
|
*result = pVariant->u;
|
||||||
|
} else if (IS_FLOAT_TYPE(pVariant->nType)) {
|
||||||
|
*result = (int64_t) pVariant->d;
|
||||||
|
} else {
|
||||||
|
//TODO: handling var types
|
||||||
|
}
|
||||||
#if 0
|
#if 0
|
||||||
errno = 0;
|
errno = 0;
|
||||||
if (IS_SIGNED_NUMERIC_TYPE(pVariant->nType) || (pVariant->nType == TSDB_DATA_TYPE_BOOL)) {
|
if (IS_SIGNED_NUMERIC_TYPE(pVariant->nType) || (pVariant->nType == TSDB_DATA_TYPE_BOOL)) {
|
||||||
|
@ -1015,3 +1025,26 @@ int32_t taosVariantTypeSetType(SVariant *pVariant, char type) {
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
char * taosVariantGet(SVariant *pVar, int32_t type) {
|
||||||
|
switch (type) {
|
||||||
|
case TSDB_DATA_TYPE_BOOL:
|
||||||
|
case TSDB_DATA_TYPE_TINYINT:
|
||||||
|
case TSDB_DATA_TYPE_SMALLINT:
|
||||||
|
case TSDB_DATA_TYPE_BIGINT:
|
||||||
|
case TSDB_DATA_TYPE_INT:
|
||||||
|
case TSDB_DATA_TYPE_TIMESTAMP:
|
||||||
|
return (char *)&pVar->i;
|
||||||
|
case TSDB_DATA_TYPE_DOUBLE:
|
||||||
|
case TSDB_DATA_TYPE_FLOAT:
|
||||||
|
return (char *)&pVar->d;
|
||||||
|
case TSDB_DATA_TYPE_BINARY:
|
||||||
|
return (char *)pVar->pz;
|
||||||
|
case TSDB_DATA_TYPE_NCHAR:
|
||||||
|
return (char *)pVar->ucs4;
|
||||||
|
default:
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
|
@ -1,10 +1,10 @@
|
||||||
aux_source_directory(dm/src DNODE_SRC)
|
aux_source_directory(dm DNODE_SRC)
|
||||||
aux_source_directory(qm/src DNODE_SRC)
|
aux_source_directory(qm DNODE_SRC)
|
||||||
aux_source_directory(bm/src DNODE_SRC)
|
aux_source_directory(bm DNODE_SRC)
|
||||||
aux_source_directory(sm/src DNODE_SRC)
|
aux_source_directory(sm DNODE_SRC)
|
||||||
aux_source_directory(vm/src DNODE_SRC)
|
aux_source_directory(vm DNODE_SRC)
|
||||||
aux_source_directory(mm/src DNODE_SRC)
|
aux_source_directory(mm DNODE_SRC)
|
||||||
aux_source_directory(main/src DNODE_SRC)
|
aux_source_directory(main DNODE_SRC)
|
||||||
add_library(dnode STATIC ${DNODE_SRC})
|
add_library(dnode STATIC ${DNODE_SRC})
|
||||||
target_link_libraries(
|
target_link_libraries(
|
||||||
dnode cjson mnode vnode qnode snode bnode wal sync taos tfs monitor
|
dnode cjson mnode vnode qnode snode bnode wal sync taos tfs monitor
|
||||||
|
@ -12,20 +12,14 @@ target_link_libraries(
|
||||||
target_include_directories(
|
target_include_directories(
|
||||||
dnode
|
dnode
|
||||||
PUBLIC "${CMAKE_SOURCE_DIR}/include/dnode/mgmt"
|
PUBLIC "${CMAKE_SOURCE_DIR}/include/dnode/mgmt"
|
||||||
PRIVATE "${CMAKE_CURRENT_SOURCE_DIR}/dm/inc"
|
PRIVATE "${CMAKE_CURRENT_SOURCE_DIR}/inc"
|
||||||
PRIVATE "${CMAKE_CURRENT_SOURCE_DIR}/qm/inc"
|
|
||||||
PRIVATE "${CMAKE_CURRENT_SOURCE_DIR}/bm/inc"
|
|
||||||
PRIVATE "${CMAKE_CURRENT_SOURCE_DIR}/sm/inc"
|
|
||||||
PRIVATE "${CMAKE_CURRENT_SOURCE_DIR}/vm/inc"
|
|
||||||
PRIVATE "${CMAKE_CURRENT_SOURCE_DIR}/mm/inc"
|
|
||||||
PRIVATE "${CMAKE_CURRENT_SOURCE_DIR}/main/inc"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
aux_source_directory(main/exe EXEC_SRC)
|
aux_source_directory(exe EXEC_SRC)
|
||||||
add_executable(taosd ${EXEC_SRC})
|
add_executable(taosd ${EXEC_SRC})
|
||||||
target_include_directories(
|
target_include_directories(
|
||||||
taosd
|
taosd
|
||||||
PRIVATE "${CMAKE_CURRENT_SOURCE_DIR}/main/inc"
|
PRIVATE "${CMAKE_CURRENT_SOURCE_DIR}/inc"
|
||||||
)
|
)
|
||||||
target_link_libraries(taosd dnode)
|
target_link_libraries(taosd dnode)
|
||||||
|
|
||||||
|
|
|
@ -16,6 +16,34 @@
|
||||||
#define _DEFAULT_SOURCE
|
#define _DEFAULT_SOURCE
|
||||||
#include "bmInt.h"
|
#include "bmInt.h"
|
||||||
|
|
||||||
|
void bmGetMonitorInfo(SMgmtWrapper *pWrapper, SMonBmInfo *bmInfo) {
|
||||||
|
}
|
||||||
|
|
||||||
|
int32_t bmProcessGetMonBmInfoReq(SMgmtWrapper *pWrapper, SNodeMsg *pReq) {
|
||||||
|
SMonBmInfo bmInfo = {0};
|
||||||
|
bmGetMonitorInfo(pWrapper, &bmInfo);
|
||||||
|
dmGetMonitorSysInfo(&bmInfo.sys);
|
||||||
|
monGetLogs(&bmInfo.log);
|
||||||
|
|
||||||
|
int32_t rspLen = tSerializeSMonBmInfo(NULL, 0, &bmInfo);
|
||||||
|
if (rspLen < 0) {
|
||||||
|
terrno = TSDB_CODE_INVALID_MSG;
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
void *pRsp = rpcMallocCont(rspLen);
|
||||||
|
if (pRsp == NULL) {
|
||||||
|
terrno = TSDB_CODE_OUT_OF_MEMORY;
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
tSerializeSMonBmInfo(pRsp, rspLen, &bmInfo);
|
||||||
|
pReq->pRsp = pRsp;
|
||||||
|
pReq->rspLen = rspLen;
|
||||||
|
tFreeSMonBmInfo(&bmInfo);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
int32_t bmProcessCreateReq(SMgmtWrapper *pWrapper, SNodeMsg *pMsg) {
|
int32_t bmProcessCreateReq(SMgmtWrapper *pWrapper, SNodeMsg *pMsg) {
|
||||||
SDnode *pDnode = pWrapper->pDnode;
|
SDnode *pDnode = pWrapper->pDnode;
|
||||||
SRpcMsg *pReq = &pMsg->rpcMsg;
|
SRpcMsg *pReq = &pMsg->rpcMsg;
|
||||||
|
@ -54,4 +82,6 @@ int32_t bmProcessDropReq(SMgmtWrapper *pWrapper, SNodeMsg *pMsg) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void bmInitMsgHandles(SMgmtWrapper *pWrapper) {}
|
void bmInitMsgHandle(SMgmtWrapper *pWrapper) {
|
||||||
|
dndSetMsgHandle(pWrapper, TDMT_MON_BM_INFO, bmProcessMonitorMsg, DEFAULT_HANDLE);
|
||||||
|
}
|
|
@ -19,12 +19,7 @@
|
||||||
static int32_t bmRequire(SMgmtWrapper *pWrapper, bool *required) { return dndReadFile(pWrapper, required); }
|
static int32_t bmRequire(SMgmtWrapper *pWrapper, bool *required) { return dndReadFile(pWrapper, required); }
|
||||||
|
|
||||||
static void bmInitOption(SBnodeMgmt *pMgmt, SBnodeOpt *pOption) {
|
static void bmInitOption(SBnodeMgmt *pMgmt, SBnodeOpt *pOption) {
|
||||||
SMsgCb msgCb = {0};
|
SMsgCb msgCb = dndCreateMsgcb(pMgmt->pWrapper);
|
||||||
msgCb.pWrapper = pMgmt->pWrapper;
|
|
||||||
msgCb.sendReqFp = dndSendReqToDnode;
|
|
||||||
msgCb.sendMnodeReqFp = dndSendReqToMnode;
|
|
||||||
msgCb.sendRspFp = dndSendRsp;
|
|
||||||
msgCb.registerBrokenLinkArgFp = dndRegisterBrokenLinkArg;
|
|
||||||
pOption->msgCb = msgCb;
|
pOption->msgCb = msgCb;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -114,7 +109,7 @@ int32_t bmOpen(SMgmtWrapper *pWrapper) {
|
||||||
return code;
|
return code;
|
||||||
}
|
}
|
||||||
|
|
||||||
void bmGetMgmtFp(SMgmtWrapper *pWrapper) {
|
void bmSetMgmtFp(SMgmtWrapper *pWrapper) {
|
||||||
SMgmtFp mgmtFp = {0};
|
SMgmtFp mgmtFp = {0};
|
||||||
mgmtFp.openFp = bmOpen;
|
mgmtFp.openFp = bmOpen;
|
||||||
mgmtFp.closeFp = bmClose;
|
mgmtFp.closeFp = bmClose;
|
||||||
|
@ -122,7 +117,7 @@ void bmGetMgmtFp(SMgmtWrapper *pWrapper) {
|
||||||
mgmtFp.dropMsgFp = bmProcessDropReq;
|
mgmtFp.dropMsgFp = bmProcessDropReq;
|
||||||
mgmtFp.requiredFp = bmRequire;
|
mgmtFp.requiredFp = bmRequire;
|
||||||
|
|
||||||
bmInitMsgHandles(pWrapper);
|
bmInitMsgHandle(pWrapper);
|
||||||
pWrapper->name = "bnode";
|
pWrapper->name = "bnode";
|
||||||
pWrapper->fp = mgmtFp;
|
pWrapper->fp = mgmtFp;
|
||||||
}
|
}
|
|
@ -18,7 +18,7 @@
|
||||||
|
|
||||||
static void bmSendErrorRsp(SMgmtWrapper *pWrapper, SNodeMsg *pMsg, int32_t code) {
|
static void bmSendErrorRsp(SMgmtWrapper *pWrapper, SNodeMsg *pMsg, int32_t code) {
|
||||||
SRpcMsg rpcRsp = {.handle = pMsg->rpcMsg.handle, .ahandle = pMsg->rpcMsg.ahandle, .code = code};
|
SRpcMsg rpcRsp = {.handle = pMsg->rpcMsg.handle, .ahandle = pMsg->rpcMsg.ahandle, .code = code};
|
||||||
dndSendRsp(pWrapper, &rpcRsp);
|
tmsgSendRsp(&rpcRsp);
|
||||||
|
|
||||||
dTrace("msg:%p, is freed", pMsg);
|
dTrace("msg:%p, is freed", pMsg);
|
||||||
rpcFreeCont(pMsg->rpcMsg.pCont);
|
rpcFreeCont(pMsg->rpcMsg.pCont);
|
||||||
|
@ -33,7 +33,37 @@ static void bmSendErrorRsps(SMgmtWrapper *pWrapper, STaosQall *qall, int32_t num
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void bmProcessQueue(SQueueInfo *pInfo, STaosQall *qall, int32_t numOfMsgs) {
|
static inline void bmSendRsp(SMgmtWrapper *pWrapper, SNodeMsg *pMsg, int32_t code) {
|
||||||
|
SRpcMsg rsp = {.handle = pMsg->rpcMsg.handle,
|
||||||
|
.ahandle = pMsg->rpcMsg.ahandle,
|
||||||
|
.code = code,
|
||||||
|
.pCont = pMsg->pRsp,
|
||||||
|
.contLen = pMsg->rspLen};
|
||||||
|
tmsgSendRsp(&rsp);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void bmProcessMonQueue(SQueueInfo *pInfo, SNodeMsg *pMsg) {
|
||||||
|
SBnodeMgmt *pMgmt = pInfo->ahandle;
|
||||||
|
|
||||||
|
dTrace("msg:%p, get from bnode monitor queue", pMsg);
|
||||||
|
SRpcMsg *pRpc = &pMsg->rpcMsg;
|
||||||
|
int32_t code = -1;
|
||||||
|
|
||||||
|
if (pMsg->rpcMsg.msgType == TDMT_MON_BM_INFO) {
|
||||||
|
code = bmProcessGetMonBmInfoReq(pMgmt->pWrapper, pMsg);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (pRpc->msgType & 1U) {
|
||||||
|
if (code != 0 && terrno != 0) code = terrno;
|
||||||
|
bmSendRsp(pMgmt->pWrapper, pMsg, code);
|
||||||
|
}
|
||||||
|
|
||||||
|
dTrace("msg:%p, is freed, result:0x%04x:%s", pMsg, code & 0XFFFF, tstrerror(code));
|
||||||
|
rpcFreeCont(pRpc->pCont);
|
||||||
|
taosFreeQitem(pMsg);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void bmProcessWriteQueue(SQueueInfo *pInfo, STaosQall *qall, int32_t numOfMsgs) {
|
||||||
SBnodeMgmt *pMgmt = pInfo->ahandle;
|
SBnodeMgmt *pMgmt = pInfo->ahandle;
|
||||||
SMgmtWrapper *pWrapper = pMgmt->pWrapper;
|
SMgmtWrapper *pWrapper = pMgmt->pWrapper;
|
||||||
|
|
||||||
|
@ -72,18 +102,37 @@ int32_t bmProcessWriteMsg(SMgmtWrapper *pWrapper, SNodeMsg *pMsg) {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int32_t bmProcessMonitorMsg(SMgmtWrapper *pWrapper, SNodeMsg *pMsg) {
|
||||||
|
SBnodeMgmt *pMgmt = pWrapper->pMgmt;
|
||||||
|
SSingleWorker *pWorker = &pMgmt->monitorWorker;
|
||||||
|
|
||||||
|
dTrace("msg:%p, put into worker:%s", pMsg, pWorker->name);
|
||||||
|
taosWriteQitem(pWorker->queue, pMsg);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
int32_t bmStartWorker(SBnodeMgmt *pMgmt) {
|
int32_t bmStartWorker(SBnodeMgmt *pMgmt) {
|
||||||
SMultiWorkerCfg cfg = {.max = 1, .name = "bnode-write", .fp = (FItems)bmProcessQueue, .param = pMgmt};
|
SMultiWorkerCfg cfg = {.max = 1, .name = "bnode-write", .fp = (FItems)bmProcessWriteQueue, .param = pMgmt};
|
||||||
if (tMultiWorkerInit(&pMgmt->writeWorker, &cfg) != 0) {
|
if (tMultiWorkerInit(&pMgmt->writeWorker, &cfg) != 0) {
|
||||||
dError("failed to start bnode write worker since %s", terrstr());
|
dError("failed to start bnode-write worker since %s", terrstr());
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (tsMultiProcess) {
|
||||||
|
SSingleWorkerCfg mCfg = {
|
||||||
|
.min = 1, .max = 1, .name = "bnode-monitor", .fp = (FItem)bmProcessMonQueue, .param = pMgmt};
|
||||||
|
if (tSingleWorkerInit(&pMgmt->monitorWorker, &mCfg) != 0) {
|
||||||
|
dError("failed to start bnode-monitor worker since %s", terrstr());
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
dDebug("bnode workers are initialized");
|
dDebug("bnode workers are initialized");
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
void bmStopWorker(SBnodeMgmt *pMgmt) {
|
void bmStopWorker(SBnodeMgmt *pMgmt) {
|
||||||
|
tSingleWorkerCleanup(&pMgmt->monitorWorker);
|
||||||
tMultiWorkerCleanup(&pMgmt->writeWorker);
|
tMultiWorkerCleanup(&pMgmt->writeWorker);
|
||||||
dDebug("bnode workers are closed");
|
dDebug("bnode workers are closed");
|
||||||
}
|
}
|
|
@ -200,7 +200,7 @@ int32_t dmWriteFile(SDnodeMgmt *pMgmt) {
|
||||||
taosMemoryFree(content);
|
taosMemoryFree(content);
|
||||||
|
|
||||||
char realfile[PATH_MAX];
|
char realfile[PATH_MAX];
|
||||||
snprintf(realfile, sizeof(realfile), "%s%smnode.json", pMgmt->path, TD_DIRSEP);
|
snprintf(realfile, sizeof(realfile), "%s%sdnode.json", pMgmt->path, TD_DIRSEP);
|
||||||
|
|
||||||
if (taosRenameFile(file, realfile) != 0) {
|
if (taosRenameFile(file, realfile) != 0) {
|
||||||
terrno = TAOS_SYSTEM_ERROR(errno);
|
terrno = TAOS_SYSTEM_ERROR(errno);
|
|
@ -15,7 +15,6 @@
|
||||||
|
|
||||||
#define _DEFAULT_SOURCE
|
#define _DEFAULT_SOURCE
|
||||||
#include "dmInt.h"
|
#include "dmInt.h"
|
||||||
#include "vm.h"
|
|
||||||
|
|
||||||
void dmSendStatusReq(SDnodeMgmt *pMgmt) {
|
void dmSendStatusReq(SDnodeMgmt *pMgmt) {
|
||||||
SDnode *pDnode = pMgmt->pDnode;
|
SDnode *pDnode = pMgmt->pDnode;
|
||||||
|
@ -43,8 +42,9 @@ void dmSendStatusReq(SDnodeMgmt *pMgmt) {
|
||||||
|
|
||||||
SMgmtWrapper *pWrapper = dndAcquireWrapper(pDnode, VNODES);
|
SMgmtWrapper *pWrapper = dndAcquireWrapper(pDnode, VNODES);
|
||||||
if (pWrapper != NULL) {
|
if (pWrapper != NULL) {
|
||||||
req.pVloads = taosArrayInit(TSDB_MAX_VNODES, sizeof(SVnodeLoad));
|
SMonVloadInfo info = {0};
|
||||||
vmMonitorVnodeLoads(pWrapper, req.pVloads);
|
dmGetVnodeLoads(pWrapper, &info);
|
||||||
|
req.pVloads = info.pVloads;
|
||||||
dndReleaseWrapper(pWrapper);
|
dndReleaseWrapper(pWrapper);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -53,11 +53,13 @@ void dmSendStatusReq(SDnodeMgmt *pMgmt) {
|
||||||
tSerializeSStatusReq(pHead, contLen, &req);
|
tSerializeSStatusReq(pHead, contLen, &req);
|
||||||
taosArrayDestroy(req.pVloads);
|
taosArrayDestroy(req.pVloads);
|
||||||
|
|
||||||
SRpcMsg rpcMsg = {.pCont = pHead, .contLen = contLen, .msgType = TDMT_MND_STATUS, .ahandle = (void *)9527};
|
SRpcMsg rpcMsg = {.pCont = pHead, .contLen = contLen, .msgType = TDMT_MND_STATUS, .ahandle = (void *)0x9527};
|
||||||
pMgmt->statusSent = 1;
|
pMgmt->statusSent = 1;
|
||||||
|
|
||||||
dTrace("send req:%s to mnode, app:%p", TMSG_INFO(rpcMsg.msgType), rpcMsg.ahandle);
|
dTrace("send req:%s to mnode, app:%p", TMSG_INFO(rpcMsg.msgType), rpcMsg.ahandle);
|
||||||
dndSendReqToMnode(pMgmt->pWrapper, &rpcMsg);
|
SEpSet epSet = {0};
|
||||||
|
dmGetMnodeEpSet(pMgmt, &epSet);
|
||||||
|
tmsgSendReq(&pMgmt->msgCb, &epSet, &rpcMsg);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void dmUpdateDnodeCfg(SDnodeMgmt *pMgmt, SDnodeCfg *pCfg) {
|
static void dmUpdateDnodeCfg(SDnodeMgmt *pMgmt, SDnodeCfg *pCfg) {
|
||||||
|
@ -95,6 +97,7 @@ int32_t dmProcessStatusRsp(SDnodeMgmt *pMgmt, SNodeMsg *pMsg) {
|
||||||
}
|
}
|
||||||
|
|
||||||
pMgmt->statusSent = 0;
|
pMgmt->statusSent = 0;
|
||||||
|
return TSDB_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t dmProcessAuthRsp(SDnodeMgmt *pMgmt, SNodeMsg *pMsg) {
|
int32_t dmProcessAuthRsp(SDnodeMgmt *pMgmt, SNodeMsg *pMsg) {
|
||||||
|
@ -116,21 +119,98 @@ int32_t dmProcessConfigReq(SDnodeMgmt *pMgmt, SNodeMsg *pMsg) {
|
||||||
return TSDB_CODE_OPS_NOT_SUPPORT;
|
return TSDB_CODE_OPS_NOT_SUPPORT;
|
||||||
}
|
}
|
||||||
|
|
||||||
void dmInitMsgHandles(SMgmtWrapper *pWrapper) {
|
static int32_t dmProcessCreateNodeMsg(SDnode *pDnode, EDndType ntype, SNodeMsg *pMsg) {
|
||||||
|
SMgmtWrapper *pWrapper = dndAcquireWrapper(pDnode, ntype);
|
||||||
|
if (pWrapper != NULL) {
|
||||||
|
dndReleaseWrapper(pWrapper);
|
||||||
|
terrno = TSDB_CODE_NODE_ALREADY_DEPLOYED;
|
||||||
|
dError("failed to create node since %s", terrstr());
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
pWrapper = &pDnode->wrappers[ntype];
|
||||||
|
|
||||||
|
if (taosMkDir(pWrapper->path) != 0) {
|
||||||
|
terrno = TAOS_SYSTEM_ERROR(errno);
|
||||||
|
dError("failed to create dir:%s since %s", pWrapper->path, terrstr());
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
int32_t code = (*pWrapper->fp.createMsgFp)(pWrapper, pMsg);
|
||||||
|
if (code != 0) {
|
||||||
|
dError("node:%s, failed to open since %s", pWrapper->name, terrstr());
|
||||||
|
} else {
|
||||||
|
dDebug("node:%s, has been opened", pWrapper->name);
|
||||||
|
pWrapper->deployed = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
return code;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int32_t dmProcessDropNodeMsg(SDnode *pDnode, EDndType ntype, SNodeMsg *pMsg) {
|
||||||
|
SMgmtWrapper *pWrapper = dndAcquireWrapper(pDnode, ntype);
|
||||||
|
if (pWrapper == NULL) {
|
||||||
|
terrno = TSDB_CODE_NODE_NOT_DEPLOYED;
|
||||||
|
dError("failed to drop node since %s", terrstr());
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
taosWLockLatch(&pWrapper->latch);
|
||||||
|
pWrapper->deployed = false;
|
||||||
|
|
||||||
|
int32_t code = (*pWrapper->fp.dropMsgFp)(pWrapper, pMsg);
|
||||||
|
if (code != 0) {
|
||||||
|
pWrapper->deployed = true;
|
||||||
|
dError("node:%s, failed to drop since %s", pWrapper->name, terrstr());
|
||||||
|
} else {
|
||||||
|
pWrapper->deployed = false;
|
||||||
|
dDebug("node:%s, has been dropped", pWrapper->name);
|
||||||
|
}
|
||||||
|
|
||||||
|
taosWUnLockLatch(&pWrapper->latch);
|
||||||
|
dndReleaseWrapper(pWrapper);
|
||||||
|
return code;
|
||||||
|
}
|
||||||
|
|
||||||
|
int32_t dmProcessCDnodeReq(SDnode *pDnode, SNodeMsg *pMsg) {
|
||||||
|
switch (pMsg->rpcMsg.msgType) {
|
||||||
|
case TDMT_DND_CREATE_MNODE:
|
||||||
|
return dmProcessCreateNodeMsg(pDnode, MNODE, pMsg);
|
||||||
|
case TDMT_DND_DROP_MNODE:
|
||||||
|
return dmProcessDropNodeMsg(pDnode, MNODE, pMsg);
|
||||||
|
case TDMT_DND_CREATE_QNODE:
|
||||||
|
return dmProcessCreateNodeMsg(pDnode, QNODE, pMsg);
|
||||||
|
case TDMT_DND_DROP_QNODE:
|
||||||
|
return dmProcessDropNodeMsg(pDnode, QNODE, pMsg);
|
||||||
|
case TDMT_DND_CREATE_SNODE:
|
||||||
|
return dmProcessCreateNodeMsg(pDnode, SNODE, pMsg);
|
||||||
|
case TDMT_DND_DROP_SNODE:
|
||||||
|
return dmProcessDropNodeMsg(pDnode, SNODE, pMsg);
|
||||||
|
case TDMT_DND_CREATE_BNODE:
|
||||||
|
return dmProcessCreateNodeMsg(pDnode, BNODE, pMsg);
|
||||||
|
case TDMT_DND_DROP_BNODE:
|
||||||
|
return dmProcessDropNodeMsg(pDnode, BNODE, pMsg);
|
||||||
|
default:
|
||||||
|
terrno = TSDB_CODE_MSG_NOT_PROCESSED;
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void dmInitMsgHandle(SMgmtWrapper *pWrapper) {
|
||||||
// Requests handled by DNODE
|
// Requests handled by DNODE
|
||||||
dndSetMsgHandle(pWrapper, TDMT_DND_CREATE_MNODE, dmProcessMgmtMsg, VND_VGID);
|
dndSetMsgHandle(pWrapper, TDMT_DND_CREATE_MNODE, dmProcessMgmtMsg, DEFAULT_HANDLE);
|
||||||
dndSetMsgHandle(pWrapper, TDMT_DND_DROP_MNODE, dmProcessMgmtMsg, VND_VGID);
|
dndSetMsgHandle(pWrapper, TDMT_DND_DROP_MNODE, dmProcessMgmtMsg, DEFAULT_HANDLE);
|
||||||
dndSetMsgHandle(pWrapper, TDMT_DND_CREATE_QNODE, dmProcessMgmtMsg, VND_VGID);
|
dndSetMsgHandle(pWrapper, TDMT_DND_CREATE_QNODE, dmProcessMgmtMsg, DEFAULT_HANDLE);
|
||||||
dndSetMsgHandle(pWrapper, TDMT_DND_DROP_QNODE, dmProcessMgmtMsg, VND_VGID);
|
dndSetMsgHandle(pWrapper, TDMT_DND_DROP_QNODE, dmProcessMgmtMsg, DEFAULT_HANDLE);
|
||||||
dndSetMsgHandle(pWrapper, TDMT_DND_CREATE_SNODE, dmProcessMgmtMsg, VND_VGID);
|
dndSetMsgHandle(pWrapper, TDMT_DND_CREATE_SNODE, dmProcessMgmtMsg, DEFAULT_HANDLE);
|
||||||
dndSetMsgHandle(pWrapper, TDMT_DND_DROP_SNODE, dmProcessMgmtMsg, VND_VGID);
|
dndSetMsgHandle(pWrapper, TDMT_DND_DROP_SNODE, dmProcessMgmtMsg, DEFAULT_HANDLE);
|
||||||
dndSetMsgHandle(pWrapper, TDMT_DND_CREATE_BNODE, dmProcessMgmtMsg, VND_VGID);
|
dndSetMsgHandle(pWrapper, TDMT_DND_CREATE_BNODE, dmProcessMgmtMsg, DEFAULT_HANDLE);
|
||||||
dndSetMsgHandle(pWrapper, TDMT_DND_DROP_BNODE, dmProcessMgmtMsg, VND_VGID);
|
dndSetMsgHandle(pWrapper, TDMT_DND_DROP_BNODE, dmProcessMgmtMsg, DEFAULT_HANDLE);
|
||||||
dndSetMsgHandle(pWrapper, TDMT_DND_CONFIG_DNODE, dmProcessMgmtMsg, VND_VGID);
|
dndSetMsgHandle(pWrapper, TDMT_DND_CONFIG_DNODE, dmProcessMgmtMsg, DEFAULT_HANDLE);
|
||||||
dndSetMsgHandle(pWrapper, TDMT_DND_NETWORK_TEST, dmProcessMgmtMsg, VND_VGID);
|
dndSetMsgHandle(pWrapper, TDMT_DND_NETWORK_TEST, dmProcessMgmtMsg, DEFAULT_HANDLE);
|
||||||
|
|
||||||
// Requests handled by MNODE
|
// Requests handled by MNODE
|
||||||
dndSetMsgHandle(pWrapper, TDMT_MND_STATUS_RSP, dmProcessMgmtMsg, VND_VGID);
|
dndSetMsgHandle(pWrapper, TDMT_MND_STATUS_RSP, dmProcessMonitorMsg, DEFAULT_HANDLE);
|
||||||
dndSetMsgHandle(pWrapper, TDMT_MND_GRANT_RSP, dmProcessMgmtMsg, VND_VGID);
|
dndSetMsgHandle(pWrapper, TDMT_MND_GRANT_RSP, dmProcessMgmtMsg, DEFAULT_HANDLE);
|
||||||
dndSetMsgHandle(pWrapper, TDMT_MND_AUTH_RSP, dmProcessMgmtMsg, VND_VGID);
|
dndSetMsgHandle(pWrapper, TDMT_MND_AUTH_RSP, dmProcessMgmtMsg, DEFAULT_HANDLE);
|
||||||
}
|
}
|
|
@ -78,7 +78,7 @@ static int32_t dmStart(SMgmtWrapper *pWrapper) {
|
||||||
return dmStartThread(pWrapper->pMgmt);
|
return dmStartThread(pWrapper->pMgmt);
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t dmInit(SMgmtWrapper *pWrapper) {
|
static int32_t dmInit(SMgmtWrapper *pWrapper) {
|
||||||
SDnode *pDnode = pWrapper->pDnode;
|
SDnode *pDnode = pWrapper->pDnode;
|
||||||
SDnodeMgmt *pMgmt = taosMemoryCalloc(1, sizeof(SDnodeMgmt));
|
SDnodeMgmt *pMgmt = taosMemoryCalloc(1, sizeof(SDnodeMgmt));
|
||||||
dInfo("dnode-mgmt start to init");
|
dInfo("dnode-mgmt start to init");
|
||||||
|
@ -112,22 +112,19 @@ int32_t dmInit(SMgmtWrapper *pWrapper) {
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (dndInitServer(pDnode) != 0) {
|
if (dndInitTrans(pDnode) != 0) {
|
||||||
dError("failed to init trans server since %s", terrstr());
|
dError("failed to init transport since %s", terrstr());
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (dndInitClient(pDnode) != 0) {
|
|
||||||
dError("failed to init trans client since %s", terrstr());
|
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
pWrapper->pMgmt = pMgmt;
|
pWrapper->pMgmt = pMgmt;
|
||||||
|
pMgmt->msgCb = dndCreateMsgcb(pWrapper);
|
||||||
|
|
||||||
dInfo("dnode-mgmt is initialized");
|
dInfo("dnode-mgmt is initialized");
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
void dmCleanup(SMgmtWrapper *pWrapper) {
|
static void dmCleanup(SMgmtWrapper *pWrapper) {
|
||||||
SDnodeMgmt *pMgmt = pWrapper->pMgmt;
|
SDnodeMgmt *pMgmt = pWrapper->pMgmt;
|
||||||
if (pMgmt == NULL) return;
|
if (pMgmt == NULL) return;
|
||||||
|
|
||||||
|
@ -151,25 +148,24 @@ void dmCleanup(SMgmtWrapper *pWrapper) {
|
||||||
|
|
||||||
taosMemoryFree(pMgmt);
|
taosMemoryFree(pMgmt);
|
||||||
pWrapper->pMgmt = NULL;
|
pWrapper->pMgmt = NULL;
|
||||||
dndCleanupServer(pDnode);
|
dndCleanupTrans(pDnode);
|
||||||
dndCleanupClient(pDnode);
|
|
||||||
|
|
||||||
dInfo("dnode-mgmt is cleaned up");
|
dInfo("dnode-mgmt is cleaned up");
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t dmRequire(SMgmtWrapper *pWrapper, bool *required) {
|
static int32_t dmRequire(SMgmtWrapper *pWrapper, bool *required) {
|
||||||
*required = true;
|
*required = true;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
void dmGetMgmtFp(SMgmtWrapper *pWrapper) {
|
void dmSetMgmtFp(SMgmtWrapper *pWrapper) {
|
||||||
SMgmtFp mgmtFp = {0};
|
SMgmtFp mgmtFp = {0};
|
||||||
mgmtFp.openFp = dmInit;
|
mgmtFp.openFp = dmInit;
|
||||||
mgmtFp.closeFp = dmCleanup;
|
mgmtFp.closeFp = dmCleanup;
|
||||||
mgmtFp.startFp = dmStart;
|
mgmtFp.startFp = dmStart;
|
||||||
mgmtFp.requiredFp = dmRequire;
|
mgmtFp.requiredFp = dmRequire;
|
||||||
|
|
||||||
dmInitMsgHandles(pWrapper);
|
dmInitMsgHandle(pWrapper);
|
||||||
pWrapper->name = "dnode";
|
pWrapper->name = "dnode";
|
||||||
pWrapper->fp = mgmtFp;
|
pWrapper->fp = mgmtFp;
|
||||||
}
|
}
|
|
@ -0,0 +1,195 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2019 TAOS Data, Inc. <jhtao@taosdata.com>
|
||||||
|
*
|
||||||
|
* This program is free software: you can use, redistribute, and/or modify
|
||||||
|
* it under the terms of the GNU Affero General Public License, version 3
|
||||||
|
* or later ("AGPL"), as published by the Free Software Foundation.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful, but WITHOUT
|
||||||
|
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||||
|
* FITNESS FOR A PARTICULAR PURPOSE.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Affero General Public License
|
||||||
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#define _DEFAULT_SOURCE
|
||||||
|
#include "dmInt.h"
|
||||||
|
|
||||||
|
static void dmGetMonitorBasicInfo(SDnode *pDnode, SMonBasicInfo *pInfo) {
|
||||||
|
pInfo->protocol = 1;
|
||||||
|
pInfo->dnode_id = pDnode->dnodeId;
|
||||||
|
pInfo->cluster_id = pDnode->clusterId;
|
||||||
|
tstrncpy(pInfo->dnode_ep, tsLocalEp, TSDB_EP_LEN);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void dmGetMonitorDnodeInfo(SDnode *pDnode, SMonDnodeInfo *pInfo) {
|
||||||
|
pInfo->uptime = (taosGetTimestampMs() - pDnode->rebootTime) / (86400000.0f);
|
||||||
|
SMgmtWrapper *pWrapper = dndAcquireWrapper(pDnode, MNODE);
|
||||||
|
if (pWrapper != NULL) {
|
||||||
|
pInfo->has_mnode = pWrapper->required;
|
||||||
|
dndReleaseWrapper(pWrapper);
|
||||||
|
}
|
||||||
|
tstrncpy(pInfo->logdir.name, tsLogDir, sizeof(pInfo->logdir.name));
|
||||||
|
pInfo->logdir.size = tsLogSpace.size;
|
||||||
|
tstrncpy(pInfo->tempdir.name, tsTempDir, sizeof(pInfo->tempdir.name));
|
||||||
|
pInfo->tempdir.size = tsTempSpace.size;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void dmGetMonitorInfo(SDnode *pDnode, SMonDmInfo *pInfo) {
|
||||||
|
dmGetMonitorBasicInfo(pDnode, &pInfo->basic);
|
||||||
|
dmGetMonitorSysInfo(&pInfo->sys);
|
||||||
|
dmGetMonitorDnodeInfo(pDnode, &pInfo->dnode);
|
||||||
|
}
|
||||||
|
|
||||||
|
void dmSendMonitorReport(SDnode *pDnode) {
|
||||||
|
if (!tsEnableMonitor || tsMonitorFqdn[0] == 0 || tsMonitorPort == 0) return;
|
||||||
|
dTrace("send monitor report to %s:%u", tsMonitorFqdn, tsMonitorPort);
|
||||||
|
|
||||||
|
SMonDmInfo dmInfo = {0};
|
||||||
|
SMonMmInfo mmInfo = {0};
|
||||||
|
SMonVmInfo vmInfo = {0};
|
||||||
|
SMonQmInfo qmInfo = {0};
|
||||||
|
SMonSmInfo smInfo = {0};
|
||||||
|
SMonBmInfo bmInfo = {0};
|
||||||
|
|
||||||
|
SRpcMsg req = {0};
|
||||||
|
SRpcMsg rsp;
|
||||||
|
SEpSet epset = {.inUse = 0, .numOfEps = 1};
|
||||||
|
tstrncpy(epset.eps[0].fqdn, tsLocalFqdn, TSDB_FQDN_LEN);
|
||||||
|
epset.eps[0].port = tsServerPort;
|
||||||
|
|
||||||
|
SMgmtWrapper *pWrapper = NULL;
|
||||||
|
dmGetMonitorInfo(pDnode, &dmInfo);
|
||||||
|
|
||||||
|
bool getFromAPI = !tsMultiProcess;
|
||||||
|
pWrapper = &pDnode->wrappers[MNODE];
|
||||||
|
if (getFromAPI) {
|
||||||
|
if (dndMarkWrapper(pWrapper) != 0) {
|
||||||
|
mmGetMonitorInfo(pWrapper, &mmInfo);
|
||||||
|
dndReleaseWrapper(pWrapper);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if (pWrapper->required) {
|
||||||
|
req.msgType = TDMT_MON_MM_INFO;
|
||||||
|
dndSendRecv(pDnode, &epset, &req, &rsp);
|
||||||
|
if (rsp.code == 0 && rsp.contLen > 0) {
|
||||||
|
tDeserializeSMonMmInfo(rsp.pCont, rsp.contLen, &mmInfo);
|
||||||
|
}
|
||||||
|
rpcFreeCont(rsp.pCont);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pWrapper = &pDnode->wrappers[VNODES];
|
||||||
|
if (getFromAPI) {
|
||||||
|
if (dndMarkWrapper(pWrapper) != 0) {
|
||||||
|
vmGetMonitorInfo(pWrapper, &vmInfo);
|
||||||
|
dndReleaseWrapper(pWrapper);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if (pWrapper->required) {
|
||||||
|
req.msgType = TDMT_MON_VM_INFO;
|
||||||
|
dndSendRecv(pDnode, &epset, &req, &rsp);
|
||||||
|
if (rsp.code == 0 && rsp.contLen > 0) {
|
||||||
|
tDeserializeSMonVmInfo(rsp.pCont, rsp.contLen, &vmInfo);
|
||||||
|
}
|
||||||
|
rpcFreeCont(rsp.pCont);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pWrapper = &pDnode->wrappers[QNODE];
|
||||||
|
if (getFromAPI) {
|
||||||
|
if (dndMarkWrapper(pWrapper) != 0) {
|
||||||
|
qmGetMonitorInfo(pWrapper, &qmInfo);
|
||||||
|
dndReleaseWrapper(pWrapper);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if (pWrapper->required) {
|
||||||
|
req.msgType = TDMT_MON_QM_INFO;
|
||||||
|
dndSendRecv(pDnode, &epset, &req, &rsp);
|
||||||
|
if (rsp.code == 0 && rsp.contLen > 0) {
|
||||||
|
tDeserializeSMonQmInfo(rsp.pCont, rsp.contLen, &qmInfo);
|
||||||
|
}
|
||||||
|
rpcFreeCont(rsp.pCont);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pWrapper = &pDnode->wrappers[SNODE];
|
||||||
|
if (getFromAPI) {
|
||||||
|
if (dndMarkWrapper(pWrapper) != 0) {
|
||||||
|
smGetMonitorInfo(pWrapper, &smInfo);
|
||||||
|
dndReleaseWrapper(pWrapper);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if (pWrapper->required) {
|
||||||
|
req.msgType = TDMT_MON_SM_INFO;
|
||||||
|
dndSendRecv(pDnode, &epset, &req, &rsp);
|
||||||
|
if (rsp.code == 0 && rsp.contLen > 0) {
|
||||||
|
tDeserializeSMonSmInfo(rsp.pCont, rsp.contLen, &smInfo);
|
||||||
|
}
|
||||||
|
rpcFreeCont(rsp.pCont);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pWrapper = &pDnode->wrappers[BNODE];
|
||||||
|
if (getFromAPI) {
|
||||||
|
if (dndMarkWrapper(pWrapper) != 0) {
|
||||||
|
bmGetMonitorInfo(pWrapper, &bmInfo);
|
||||||
|
dndReleaseWrapper(pWrapper);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if (pWrapper->required) {
|
||||||
|
req.msgType = TDMT_MON_BM_INFO;
|
||||||
|
dndSendRecv(pDnode, &epset, &req, &rsp);
|
||||||
|
if (rsp.code == 0 && rsp.contLen > 0) {
|
||||||
|
tDeserializeSMonBmInfo(rsp.pCont, rsp.contLen, &bmInfo);
|
||||||
|
}
|
||||||
|
rpcFreeCont(rsp.pCont);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
monSetDmInfo(&dmInfo);
|
||||||
|
monSetMmInfo(&mmInfo);
|
||||||
|
monSetVmInfo(&vmInfo);
|
||||||
|
monSetQmInfo(&qmInfo);
|
||||||
|
monSetSmInfo(&smInfo);
|
||||||
|
monSetBmInfo(&bmInfo);
|
||||||
|
tFreeSMonMmInfo(&mmInfo);
|
||||||
|
tFreeSMonVmInfo(&vmInfo);
|
||||||
|
tFreeSMonQmInfo(&qmInfo);
|
||||||
|
tFreeSMonSmInfo(&smInfo);
|
||||||
|
tFreeSMonBmInfo(&bmInfo);
|
||||||
|
monSendReport();
|
||||||
|
}
|
||||||
|
|
||||||
|
void dmGetVnodeLoads(SMgmtWrapper *pWrapper, SMonVloadInfo *pInfo) {
|
||||||
|
bool getFromAPI = !tsMultiProcess;
|
||||||
|
if (getFromAPI) {
|
||||||
|
vmGetVnodeLoads(pWrapper, pInfo);
|
||||||
|
} else {
|
||||||
|
SRpcMsg req = {.msgType = TDMT_MON_VM_LOAD};
|
||||||
|
SRpcMsg rsp = {0};
|
||||||
|
SEpSet epset = {.inUse = 0, .numOfEps = 1};
|
||||||
|
tstrncpy(epset.eps[0].fqdn, tsLocalFqdn, TSDB_FQDN_LEN);
|
||||||
|
epset.eps[0].port = tsServerPort;
|
||||||
|
|
||||||
|
dndSendRecv(pWrapper->pDnode, &epset, &req, &rsp);
|
||||||
|
if (rsp.code == 0 && rsp.contLen > 0) {
|
||||||
|
tDeserializeSMonVloadInfo(rsp.pCont, rsp.contLen, pInfo);
|
||||||
|
}
|
||||||
|
rpcFreeCont(rsp.pCont);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void dmGetMonitorSysInfo(SMonSysInfo *pInfo) {
|
||||||
|
taosGetCpuUsage(&pInfo->cpu_engine, &pInfo->cpu_system);
|
||||||
|
taosGetCpuCores(&pInfo->cpu_cores);
|
||||||
|
taosGetProcMemory(&pInfo->mem_engine);
|
||||||
|
taosGetSysMemory(&pInfo->mem_system);
|
||||||
|
pInfo->mem_total = tsTotalMemoryKB;
|
||||||
|
pInfo->disk_engine = 0;
|
||||||
|
pInfo->disk_used = tsDataSpace.size.used;
|
||||||
|
pInfo->disk_total = tsDataSpace.size.total;
|
||||||
|
taosGetCardInfoDelta(&pInfo->net_in, &pInfo->net_out);
|
||||||
|
taosGetProcIODelta(&pInfo->io_read, &pInfo->io_write, &pInfo->io_read_disk, &pInfo->io_write_disk);
|
||||||
|
}
|
|
@ -14,12 +14,7 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#define _DEFAULT_SOURCE
|
#define _DEFAULT_SOURCE
|
||||||
#include "bm.h"
|
|
||||||
#include "dmInt.h"
|
#include "dmInt.h"
|
||||||
#include "mm.h"
|
|
||||||
#include "qm.h"
|
|
||||||
#include "sm.h"
|
|
||||||
#include "vm.h"
|
|
||||||
|
|
||||||
static void *dmThreadRoutine(void *param) {
|
static void *dmThreadRoutine(void *param) {
|
||||||
SDnodeMgmt *pMgmt = param;
|
SDnodeMgmt *pMgmt = param;
|
||||||
|
@ -37,7 +32,6 @@ static void *dmThreadRoutine(void *param) {
|
||||||
}
|
}
|
||||||
|
|
||||||
int64_t curTime = taosGetTimestampMs();
|
int64_t curTime = taosGetTimestampMs();
|
||||||
|
|
||||||
float statusInterval = (curTime - lastStatusTime) / 1000.0f;
|
float statusInterval = (curTime - lastStatusTime) / 1000.0f;
|
||||||
if (statusInterval >= tsStatusInterval && !pMgmt->statusSent) {
|
if (statusInterval >= tsStatusInterval && !pMgmt->statusSent) {
|
||||||
dmSendStatusReq(pMgmt);
|
dmSendStatusReq(pMgmt);
|
||||||
|
@ -46,10 +40,22 @@ static void *dmThreadRoutine(void *param) {
|
||||||
|
|
||||||
float monitorInterval = (curTime - lastMonitorTime) / 1000.0f;
|
float monitorInterval = (curTime - lastMonitorTime) / 1000.0f;
|
||||||
if (monitorInterval >= tsMonitorInterval) {
|
if (monitorInterval >= tsMonitorInterval) {
|
||||||
dndSendMonitorReport(pDnode);
|
dmSendMonitorReport(pDnode);
|
||||||
lastMonitorTime = curTime;
|
lastMonitorTime = curTime;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
return TSDB_CODE_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
int32_t dmStartThread(SDnodeMgmt *pMgmt) {
|
||||||
|
pMgmt->threadId = taosCreateThread(dmThreadRoutine, pMgmt);
|
||||||
|
if (pMgmt->threadId == NULL) {
|
||||||
|
dError("failed to init dnode thread");
|
||||||
|
terrno = TSDB_CODE_OUT_OF_MEMORY;
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void dmProcessQueue(SQueueInfo *pInfo, SNodeMsg *pMsg) {
|
static void dmProcessQueue(SQueueInfo *pInfo, SNodeMsg *pMsg) {
|
||||||
|
@ -61,16 +67,6 @@ static void dmProcessQueue(SQueueInfo *pInfo, SNodeMsg *pMsg) {
|
||||||
dTrace("msg:%p, will be processed in dnode queue", pMsg);
|
dTrace("msg:%p, will be processed in dnode queue", pMsg);
|
||||||
|
|
||||||
switch (pRpc->msgType) {
|
switch (pRpc->msgType) {
|
||||||
case TDMT_DND_CREATE_MNODE:
|
|
||||||
case TDMT_DND_CREATE_QNODE:
|
|
||||||
case TDMT_DND_CREATE_SNODE:
|
|
||||||
case TDMT_DND_CREATE_BNODE:
|
|
||||||
case TDMT_DND_DROP_MNODE:
|
|
||||||
case TDMT_DND_DROP_QNODE:
|
|
||||||
case TDMT_DND_DROP_SNODE:
|
|
||||||
case TDMT_DND_DROP_BNODE:
|
|
||||||
code = dndProcessNodeMsg(pMgmt->pDnode, pMsg);
|
|
||||||
break;
|
|
||||||
case TDMT_DND_CONFIG_DNODE:
|
case TDMT_DND_CONFIG_DNODE:
|
||||||
code = dmProcessConfigReq(pMgmt, pMsg);
|
code = dmProcessConfigReq(pMgmt, pMsg);
|
||||||
break;
|
break;
|
||||||
|
@ -84,8 +80,8 @@ static void dmProcessQueue(SQueueInfo *pInfo, SNodeMsg *pMsg) {
|
||||||
code = dmProcessGrantRsp(pMgmt, pMsg);
|
code = dmProcessGrantRsp(pMgmt, pMsg);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
terrno = TSDB_CODE_MSG_NOT_PROCESSED;
|
code = dmProcessCDnodeReq(pMgmt->pDnode, pMsg);
|
||||||
dError("msg:%p, type:%s not processed in dnode queue", pRpc->handle, TMSG_INFO(pRpc->msgType));
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (pRpc->msgType & 1u) {
|
if (pRpc->msgType & 1u) {
|
||||||
|
@ -100,17 +96,15 @@ static void dmProcessQueue(SQueueInfo *pInfo, SNodeMsg *pMsg) {
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t dmStartWorker(SDnodeMgmt *pMgmt) {
|
int32_t dmStartWorker(SDnodeMgmt *pMgmt) {
|
||||||
SSingleWorkerCfg mgmtCfg = {
|
SSingleWorkerCfg mcfg = {.min = 1, .max = 1, .name = "dnode-mgmt", .fp = (FItem)dmProcessQueue, .param = pMgmt};
|
||||||
.min = 1, .max = 1, .name = "dnode-mgmt", .fp = (FItem)dmProcessQueue, .param = pMgmt};
|
if (tSingleWorkerInit(&pMgmt->mgmtWorker, &mcfg) != 0) {
|
||||||
if (tSingleWorkerInit(&pMgmt->mgmtWorker, &mgmtCfg) != 0) {
|
|
||||||
dError("failed to start dnode mgmt worker since %s", terrstr());
|
dError("failed to start dnode mgmt worker since %s", terrstr());
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
SSingleWorkerCfg statusCfg = {
|
SSingleWorkerCfg scfg = {.min = 1, .max = 1, .name = "dnode-monitor", .fp = (FItem)dmProcessQueue, .param = pMgmt};
|
||||||
.min = 1, .max = 1, .name = "dnode-status", .fp = (FItem)dmProcessQueue, .param = pMgmt};
|
if (tSingleWorkerInit(&pMgmt->monitorWorker, &scfg) != 0) {
|
||||||
if (tSingleWorkerInit(&pMgmt->statusWorker, &statusCfg) != 0) {
|
dError("failed to start dnode monitor worker since %s", terrstr());
|
||||||
dError("failed to start dnode status worker since %s", terrstr());
|
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -118,20 +112,9 @@ int32_t dmStartWorker(SDnodeMgmt *pMgmt) {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t dmStartThread(SDnodeMgmt *pMgmt) {
|
|
||||||
pMgmt->threadId = taosCreateThread(dmThreadRoutine, pMgmt);
|
|
||||||
if (pMgmt->threadId == NULL) {
|
|
||||||
dError("failed to init dnode thread");
|
|
||||||
terrno = TSDB_CODE_OUT_OF_MEMORY;
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
void dmStopWorker(SDnodeMgmt *pMgmt) {
|
void dmStopWorker(SDnodeMgmt *pMgmt) {
|
||||||
tSingleWorkerCleanup(&pMgmt->mgmtWorker);
|
tSingleWorkerCleanup(&pMgmt->mgmtWorker);
|
||||||
tSingleWorkerCleanup(&pMgmt->statusWorker);
|
tSingleWorkerCleanup(&pMgmt->monitorWorker);
|
||||||
|
|
||||||
if (pMgmt->threadId != NULL) {
|
if (pMgmt->threadId != NULL) {
|
||||||
taosDestoryThread(pMgmt->threadId);
|
taosDestoryThread(pMgmt->threadId);
|
||||||
|
@ -143,9 +126,15 @@ void dmStopWorker(SDnodeMgmt *pMgmt) {
|
||||||
int32_t dmProcessMgmtMsg(SMgmtWrapper *pWrapper, SNodeMsg *pMsg) {
|
int32_t dmProcessMgmtMsg(SMgmtWrapper *pWrapper, SNodeMsg *pMsg) {
|
||||||
SDnodeMgmt *pMgmt = pWrapper->pMgmt;
|
SDnodeMgmt *pMgmt = pWrapper->pMgmt;
|
||||||
SSingleWorker *pWorker = &pMgmt->mgmtWorker;
|
SSingleWorker *pWorker = &pMgmt->mgmtWorker;
|
||||||
if (pMsg->rpcMsg.msgType == TDMT_MND_STATUS_RSP) {
|
|
||||||
pWorker = &pMgmt->statusWorker;
|
dTrace("msg:%p, put into worker %s", pMsg, pWorker->name);
|
||||||
}
|
taosWriteQitem(pWorker->queue, pMsg);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int32_t dmProcessMonitorMsg(SMgmtWrapper *pWrapper, SNodeMsg *pMsg) {
|
||||||
|
SDnodeMgmt *pMgmt = pWrapper->pMgmt;
|
||||||
|
SSingleWorker *pWorker = &pMgmt->monitorWorker;
|
||||||
|
|
||||||
dTrace("msg:%p, put into worker %s", pMsg, pWorker->name);
|
dTrace("msg:%p, put into worker %s", pMsg, pWorker->name);
|
||||||
taosWriteQitem(pWorker->queue, pMsg);
|
taosWriteQitem(pWorker->queue, pMsg);
|
|
@ -1,38 +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_DND_DNODE_H_
|
|
||||||
#define _TD_DND_DNODE_H_
|
|
||||||
|
|
||||||
#include "dnd.h"
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
extern "C" {
|
|
||||||
#endif
|
|
||||||
|
|
||||||
typedef struct SDnodeMgmt SDnodeMgmt;
|
|
||||||
|
|
||||||
void dmGetMgmtFp(SMgmtWrapper *pWrapper);
|
|
||||||
void dmInitMsgHandles(SMgmtWrapper *pWrapper);
|
|
||||||
|
|
||||||
void dmGetMnodeEpSet(SDnodeMgmt *pMgmt, SEpSet *pEpSet);
|
|
||||||
void dmUpdateMnodeEpSet(SDnodeMgmt *pMgmt, SEpSet *pEpSet);
|
|
||||||
void dmSendRedirectRsp(SDnodeMgmt *pMgmt, const SRpcMsg *pMsg);
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif /*_TD_DND_DNODE_H_*/
|
|
|
@ -14,7 +14,7 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#define _DEFAULT_SOURCE
|
#define _DEFAULT_SOURCE
|
||||||
#include "dnd.h"
|
#include "dndInt.h"
|
||||||
#include "tconfig.h"
|
#include "tconfig.h"
|
||||||
|
|
||||||
static struct {
|
static struct {
|
||||||
|
@ -26,37 +26,30 @@ static struct {
|
||||||
char apolloUrl[PATH_MAX];
|
char apolloUrl[PATH_MAX];
|
||||||
SArray *pArgs; // SConfigPair
|
SArray *pArgs; // SConfigPair
|
||||||
SDnode *pDnode;
|
SDnode *pDnode;
|
||||||
ENodeType ntype;
|
EDndType ntype;
|
||||||
} global = {0};
|
} global = {0};
|
||||||
|
|
||||||
static void dndStopDnode(int signum, void *info, void *ctx) {
|
static void dndStopDnode(int signum, void *info, void *ctx) {
|
||||||
dInfo("signal:%d is received", signum);
|
|
||||||
SDnode *pDnode = atomic_val_compare_exchange_ptr(&global.pDnode, 0, global.pDnode);
|
SDnode *pDnode = atomic_val_compare_exchange_ptr(&global.pDnode, 0, global.pDnode);
|
||||||
if (pDnode != NULL) {
|
if (pDnode != NULL) {
|
||||||
dndHandleEvent(pDnode, DND_EVENT_STOP);
|
dndHandleEvent(pDnode, DND_EVENT_STOP);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void dndHandleChild(int signum, void *info, void *ctx) {
|
|
||||||
dInfo("signal:%d is received", signum);
|
|
||||||
dndHandleEvent(global.pDnode, DND_EVENT_CHILD);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void dndSetSignalHandle() {
|
static void dndSetSignalHandle() {
|
||||||
taosSetSignal(SIGTERM, dndStopDnode);
|
taosSetSignal(SIGTERM, dndStopDnode);
|
||||||
taosSetSignal(SIGHUP, dndStopDnode);
|
taosSetSignal(SIGHUP, dndStopDnode);
|
||||||
taosSetSignal(SIGINT, dndStopDnode);
|
taosSetSignal(SIGINT, dndStopDnode);
|
||||||
|
taosSetSignal(SIGTSTP, dndStopDnode);
|
||||||
taosSetSignal(SIGABRT, dndStopDnode);
|
taosSetSignal(SIGABRT, dndStopDnode);
|
||||||
taosSetSignal(SIGBREAK, dndStopDnode);
|
taosSetSignal(SIGBREAK, dndStopDnode);
|
||||||
|
taosSetSignal(SIGQUIT, dndStopDnode);
|
||||||
|
|
||||||
if (!tsMultiProcess) {
|
if (!tsMultiProcess) {
|
||||||
// Set the single process signal
|
} else if (global.ntype == DNODE || global.ntype == NODE_MAX) {
|
||||||
} else if (global.ntype == DNODE) {
|
taosIgnSignal(SIGCHLD);
|
||||||
// When the child process exits, the parent process receives a signal
|
|
||||||
taosSetSignal(SIGCHLD, dndHandleChild);
|
|
||||||
} else {
|
} else {
|
||||||
// When the parent process exits, the child process will receive the SIGKILL signal
|
taosKillChildOnParentStopped();
|
||||||
taosKillChildOnSelfStopped();
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -77,14 +70,14 @@ static int32_t dndParseArgs(int32_t argc, char const *argv[]) {
|
||||||
tstrncpy(global.apolloUrl, argv[++i], PATH_MAX);
|
tstrncpy(global.apolloUrl, argv[++i], PATH_MAX);
|
||||||
} else if (strcmp(argv[i], "-e") == 0) {
|
} else if (strcmp(argv[i], "-e") == 0) {
|
||||||
tstrncpy(global.envFile, argv[++i], PATH_MAX);
|
tstrncpy(global.envFile, argv[++i], PATH_MAX);
|
||||||
} else if (strcmp(argv[i], "-k") == 0) {
|
|
||||||
global.generateGrant = true;
|
|
||||||
} else if (strcmp(argv[i], "-n") == 0) {
|
} else if (strcmp(argv[i], "-n") == 0) {
|
||||||
global.ntype = atoi(argv[++i]);
|
global.ntype = atoi(argv[++i]);
|
||||||
if (global.ntype <= DNODE || global.ntype > NODE_MAX) {
|
if (global.ntype <= DNODE || global.ntype > NODE_MAX) {
|
||||||
printf("'-n' range is [1-5], default is 0\n");
|
printf("'-n' range is [1 - %d], default is 0\n", NODE_MAX - 1);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
} else if (strcmp(argv[i], "-k") == 0) {
|
||||||
|
global.generateGrant = true;
|
||||||
} else if (strcmp(argv[i], "-C") == 0) {
|
} else if (strcmp(argv[i], "-C") == 0) {
|
||||||
global.dumpConfig = true;
|
global.dumpConfig = true;
|
||||||
} else if (strcmp(argv[i], "-V") == 0) {
|
} else if (strcmp(argv[i], "-V") == 0) {
|
||||||
|
@ -140,23 +133,24 @@ static int32_t dndInitLog() {
|
||||||
return taosCreateLog(logName, 1, configDir, global.envFile, global.apolloUrl, global.pArgs, 0);
|
return taosCreateLog(logName, 1, configDir, global.envFile, global.apolloUrl, global.pArgs, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void dndSetProcName(char **argv) {
|
static void dndSetProcInfo(int32_t argc, char **argv) {
|
||||||
if (global.ntype != DNODE) {
|
taosSetProcPath(argc, argv);
|
||||||
|
if (global.ntype != DNODE && global.ntype != NODE_MAX) {
|
||||||
const char *name = dndNodeProcStr(global.ntype);
|
const char *name = dndNodeProcStr(global.ntype);
|
||||||
taosSetProcName(argv, name);
|
taosSetProcName(argc, argv, name);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static int32_t dndRunDnode() {
|
static int32_t dndRunDnode() {
|
||||||
if (dndInit() != 0) {
|
if (dndInit() != 0) {
|
||||||
dError("failed to initialize environment since %s", terrstr());
|
dError("failed to init environment since %s", terrstr());
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
SDnodeOpt option = dndGetOpt();
|
SDnodeOpt option = dndGetOpt();
|
||||||
SDnode *pDnode = dndCreate(&option);
|
SDnode *pDnode = dndCreate(&option);
|
||||||
if (pDnode == NULL) {
|
if (pDnode == NULL) {
|
||||||
dError("failed to to create dnode object since %s", terrstr());
|
dError("failed to to create dnode since %s", terrstr());
|
||||||
return -1;
|
return -1;
|
||||||
} else {
|
} else {
|
||||||
global.pDnode = pDnode;
|
global.pDnode = pDnode;
|
||||||
|
@ -213,6 +207,6 @@ int main(int argc, char const *argv[]) {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
dndSetProcName((char **)argv);
|
dndSetProcInfo(argc, (char **)argv);
|
||||||
return dndRunDnode();
|
return dndRunDnode();
|
||||||
}
|
}
|
|
@ -16,7 +16,8 @@
|
||||||
#ifndef _TD_DND_BNODE_INT_H_
|
#ifndef _TD_DND_BNODE_INT_H_
|
||||||
#define _TD_DND_BNODE_INT_H_
|
#define _TD_DND_BNODE_INT_H_
|
||||||
|
|
||||||
#include "bm.h"
|
#include "dndInt.h"
|
||||||
|
|
||||||
#include "bnode.h"
|
#include "bnode.h"
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
|
@ -29,21 +30,24 @@ typedef struct SBnodeMgmt {
|
||||||
SMgmtWrapper *pWrapper;
|
SMgmtWrapper *pWrapper;
|
||||||
const char *path;
|
const char *path;
|
||||||
SMultiWorker writeWorker;
|
SMultiWorker writeWorker;
|
||||||
|
SSingleWorker monitorWorker;
|
||||||
} SBnodeMgmt;
|
} SBnodeMgmt;
|
||||||
|
|
||||||
// bmInt.c
|
// bmInt.c
|
||||||
int32_t bmOpen(SMgmtWrapper *pWrapper);
|
int32_t bmOpen(SMgmtWrapper *pWrapper);
|
||||||
int32_t bmDrop(SMgmtWrapper *pWrapper);
|
int32_t bmDrop(SMgmtWrapper *pWrapper);
|
||||||
|
|
||||||
// bmMsg.c
|
// bmHandle.c
|
||||||
void bmInitMsgHandles(SMgmtWrapper *pWrapper);
|
void bmInitMsgHandle(SMgmtWrapper *pWrapper);
|
||||||
int32_t bmProcessCreateReq(SMgmtWrapper *pWrapper, SNodeMsg *pMsg);
|
int32_t bmProcessCreateReq(SMgmtWrapper *pWrapper, SNodeMsg *pMsg);
|
||||||
int32_t bmProcessDropReq(SMgmtWrapper *pWrapper, SNodeMsg *pMsg);
|
int32_t bmProcessDropReq(SMgmtWrapper *pWrapper, SNodeMsg *pMsg);
|
||||||
|
int32_t bmProcessGetMonBmInfoReq(SMgmtWrapper *pWrapper, SNodeMsg *pReq);
|
||||||
|
|
||||||
// bmWorker.c
|
// bmWorker.c
|
||||||
int32_t bmStartWorker(SBnodeMgmt *pMgmt);
|
int32_t bmStartWorker(SBnodeMgmt *pMgmt);
|
||||||
void bmStopWorker(SBnodeMgmt *pMgmt);
|
void bmStopWorker(SBnodeMgmt *pMgmt);
|
||||||
int32_t bmProcessWriteMsg(SMgmtWrapper *pWrapper, SNodeMsg *pMsg);
|
int32_t bmProcessWriteMsg(SMgmtWrapper *pWrapper, SNodeMsg *pMsg);
|
||||||
|
int32_t bmProcessMonitorMsg(SMgmtWrapper *pWrapper, SNodeMsg *pMsg);
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
|
@ -16,7 +16,7 @@
|
||||||
#ifndef _TD_DND_DNODE_INT_H_
|
#ifndef _TD_DND_DNODE_INT_H_
|
||||||
#define _TD_DND_DNODE_INT_H_
|
#define _TD_DND_DNODE_INT_H_
|
||||||
|
|
||||||
#include "dm.h"
|
#include "dndInt.h"
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
extern "C" {
|
extern "C" {
|
||||||
|
@ -32,7 +32,8 @@ typedef struct SDnodeMgmt {
|
||||||
TdThread *threadId;
|
TdThread *threadId;
|
||||||
SRWLatch latch;
|
SRWLatch latch;
|
||||||
SSingleWorker mgmtWorker;
|
SSingleWorker mgmtWorker;
|
||||||
SSingleWorker statusWorker;
|
SSingleWorker monitorWorker;
|
||||||
|
SMsgCb msgCb;
|
||||||
const char *path;
|
const char *path;
|
||||||
SDnode *pDnode;
|
SDnode *pDnode;
|
||||||
SMgmtWrapper *pWrapper;
|
SMgmtWrapper *pWrapper;
|
||||||
|
@ -43,18 +44,25 @@ int32_t dmReadFile(SDnodeMgmt *pMgmt);
|
||||||
int32_t dmWriteFile(SDnodeMgmt *pMgmt);
|
int32_t dmWriteFile(SDnodeMgmt *pMgmt);
|
||||||
void dmUpdateDnodeEps(SDnodeMgmt *pMgmt, SArray *pDnodeEps);
|
void dmUpdateDnodeEps(SDnodeMgmt *pMgmt, SArray *pDnodeEps);
|
||||||
|
|
||||||
// dmMsg.c
|
// dmHandle.c
|
||||||
|
void dmInitMsgHandle(SMgmtWrapper *pWrapper);
|
||||||
void dmSendStatusReq(SDnodeMgmt *pMgmt);
|
void dmSendStatusReq(SDnodeMgmt *pMgmt);
|
||||||
int32_t dmProcessConfigReq(SDnodeMgmt *pMgmt, SNodeMsg *pMsg);
|
int32_t dmProcessConfigReq(SDnodeMgmt *pMgmt, SNodeMsg *pMsg);
|
||||||
int32_t dmProcessStatusRsp(SDnodeMgmt *pMgmt, SNodeMsg *pMsg);
|
int32_t dmProcessStatusRsp(SDnodeMgmt *pMgmt, SNodeMsg *pMsg);
|
||||||
int32_t dmProcessAuthRsp(SDnodeMgmt *pMgmt, SNodeMsg *pMsg);
|
int32_t dmProcessAuthRsp(SDnodeMgmt *pMgmt, SNodeMsg *pMsg);
|
||||||
int32_t dmProcessGrantRsp(SDnodeMgmt *pMgmt, SNodeMsg *pMsg);
|
int32_t dmProcessGrantRsp(SDnodeMgmt *pMgmt, SNodeMsg *pMsg);
|
||||||
|
int32_t dmProcessCDnodeReq(SDnode *pDnode, SNodeMsg *pMsg);
|
||||||
|
|
||||||
|
// dmMonitor.c
|
||||||
|
void dmGetVnodeLoads(SMgmtWrapper *pWrapper, SMonVloadInfo *pInfo);
|
||||||
|
void dmSendMonitorReport(SDnode *pDnode);
|
||||||
|
|
||||||
// dmWorker.c
|
// dmWorker.c
|
||||||
|
int32_t dmStartThread(SDnodeMgmt *pMgmt);
|
||||||
int32_t dmStartWorker(SDnodeMgmt *pMgmt);
|
int32_t dmStartWorker(SDnodeMgmt *pMgmt);
|
||||||
void dmStopWorker(SDnodeMgmt *pMgmt);
|
void dmStopWorker(SDnodeMgmt *pMgmt);
|
||||||
int32_t dmStartThread(SDnodeMgmt *pMgmt);
|
|
||||||
int32_t dmProcessMgmtMsg(SMgmtWrapper *pWrapper, SNodeMsg *pMsg);
|
int32_t dmProcessMgmtMsg(SMgmtWrapper *pWrapper, SNodeMsg *pMsg);
|
||||||
|
int32_t dmProcessMonitorMsg(SMgmtWrapper *pWrapper, SNodeMsg *pMsg);
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
|
@ -13,8 +13,8 @@
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef _TD_DND_H_
|
#ifndef _TD_DND_INT_H_
|
||||||
#define _TD_DND_H_
|
#define _TD_DND_INT_H_
|
||||||
|
|
||||||
#include "os.h"
|
#include "os.h"
|
||||||
|
|
||||||
|
@ -27,13 +27,13 @@
|
||||||
#include "tlockfree.h"
|
#include "tlockfree.h"
|
||||||
#include "tlog.h"
|
#include "tlog.h"
|
||||||
#include "tmsg.h"
|
#include "tmsg.h"
|
||||||
|
#include "tmsgcb.h"
|
||||||
#include "tprocess.h"
|
#include "tprocess.h"
|
||||||
#include "tqueue.h"
|
#include "tqueue.h"
|
||||||
#include "trpc.h"
|
#include "trpc.h"
|
||||||
#include "tthread.h"
|
#include "tthread.h"
|
||||||
#include "ttime.h"
|
#include "ttime.h"
|
||||||
#include "tworker.h"
|
#include "tworker.h"
|
||||||
#include "tmsgcb.h"
|
|
||||||
|
|
||||||
#include "dnode.h"
|
#include "dnode.h"
|
||||||
#include "monitor.h"
|
#include "monitor.h"
|
||||||
|
@ -49,7 +49,7 @@ extern "C" {
|
||||||
#define dDebug(...) { if (dDebugFlag & DEBUG_DEBUG) { taosPrintLog("DND ", DEBUG_DEBUG, dDebugFlag, __VA_ARGS__); }}
|
#define dDebug(...) { if (dDebugFlag & DEBUG_DEBUG) { taosPrintLog("DND ", DEBUG_DEBUG, dDebugFlag, __VA_ARGS__); }}
|
||||||
#define dTrace(...) { if (dDebugFlag & DEBUG_TRACE) { taosPrintLog("DND ", DEBUG_TRACE, dDebugFlag, __VA_ARGS__); }}
|
#define dTrace(...) { if (dDebugFlag & DEBUG_TRACE) { taosPrintLog("DND ", DEBUG_TRACE, dDebugFlag, __VA_ARGS__); }}
|
||||||
|
|
||||||
typedef enum { DNODE, VNODES, QNODE, SNODE, MNODE, BNODE, NODE_MAX } ENodeType;
|
typedef enum { DNODE, VNODES, QNODE, SNODE, MNODE, BNODE, NODE_MAX } EDndType;
|
||||||
typedef enum { DND_STAT_INIT, DND_STAT_RUNNING, DND_STAT_STOPPED } EDndStatus;
|
typedef enum { DND_STAT_INIT, DND_STAT_RUNNING, DND_STAT_STOPPED } EDndStatus;
|
||||||
typedef enum { DND_ENV_INIT, DND_ENV_READY, DND_ENV_CLEANUP } EEnvStatus;
|
typedef enum { DND_ENV_INIT, DND_ENV_READY, DND_ENV_CLEANUP } EEnvStatus;
|
||||||
typedef enum { PROC_SINGLE, PROC_CHILD, PROC_PARENT } EProcType;
|
typedef enum { PROC_SINGLE, PROC_CHILD, PROC_PARENT } EProcType;
|
||||||
|
@ -92,6 +92,7 @@ typedef struct SMgmtWrapper {
|
||||||
char *path;
|
char *path;
|
||||||
int32_t refCount;
|
int32_t refCount;
|
||||||
SRWLatch latch;
|
SRWLatch latch;
|
||||||
|
EDndType ntype;
|
||||||
bool deployed;
|
bool deployed;
|
||||||
bool required;
|
bool required;
|
||||||
EProcType procType;
|
EProcType procType;
|
||||||
|
@ -125,7 +126,7 @@ typedef struct SDnode {
|
||||||
int32_t numOfDisks;
|
int32_t numOfDisks;
|
||||||
uint16_t serverPort;
|
uint16_t serverPort;
|
||||||
bool dropped;
|
bool dropped;
|
||||||
ENodeType ntype;
|
EDndType ntype;
|
||||||
EDndStatus status;
|
EDndStatus status;
|
||||||
EDndEvent event;
|
EDndEvent event;
|
||||||
SStartupReq startup;
|
SStartupReq startup;
|
||||||
|
@ -134,34 +135,64 @@ typedef struct SDnode {
|
||||||
SMgmtWrapper wrappers[NODE_MAX];
|
SMgmtWrapper wrappers[NODE_MAX];
|
||||||
} SDnode;
|
} SDnode;
|
||||||
|
|
||||||
const char *dndNodeLogStr(ENodeType ntype);
|
// dndEnv.c
|
||||||
const char *dndNodeProcStr(ENodeType ntype);
|
const char *dndStatStr(EDndStatus stat);
|
||||||
|
const char *dndNodeLogStr(EDndType ntype);
|
||||||
|
const char *dndNodeProcStr(EDndType ntype);
|
||||||
|
const char *dndEventStr(EDndEvent ev);
|
||||||
|
|
||||||
|
// dndExec.c
|
||||||
|
int32_t dndOpenNode(SMgmtWrapper *pWrapper);
|
||||||
|
void dndCloseNode(SMgmtWrapper *pWrapper);
|
||||||
|
|
||||||
|
// dndFile.c
|
||||||
|
int32_t dndReadFile(SMgmtWrapper *pWrapper, bool *pDeployed);
|
||||||
|
int32_t dndWriteFile(SMgmtWrapper *pWrapper, bool deployed);
|
||||||
|
TdFilePtr dndCheckRunning(const char *dataDir);
|
||||||
|
int32_t dndReadShmFile(SDnode *pDnode);
|
||||||
|
int32_t dndWriteShmFile(SDnode *pDnode);
|
||||||
|
|
||||||
|
// dndInt.c
|
||||||
EDndStatus dndGetStatus(SDnode *pDnode);
|
EDndStatus dndGetStatus(SDnode *pDnode);
|
||||||
void dndSetStatus(SDnode *pDnode, EDndStatus stat);
|
void dndSetStatus(SDnode *pDnode, EDndStatus stat);
|
||||||
void dndSetMsgHandle(SMgmtWrapper *pWrapper, tmsg_t msgType, NodeMsgFp nodeMsgFp, int8_t vgId);
|
void dndSetMsgHandle(SMgmtWrapper *pWrapper, tmsg_t msgType, NodeMsgFp nodeMsgFp, int8_t vgId);
|
||||||
void dndReportStartup(SDnode *pDnode, const char *pName, const char *pDesc);
|
SMgmtWrapper *dndAcquireWrapper(SDnode *pDnode, EDndType nType);
|
||||||
void dndSendMonitorReport(SDnode *pDnode);
|
|
||||||
|
|
||||||
int32_t dndInitServer(SDnode *pDnode);
|
|
||||||
void dndCleanupServer(SDnode *pDnode);
|
|
||||||
int32_t dndInitClient(SDnode *pDnode);
|
|
||||||
void dndCleanupClient(SDnode *pDnode);
|
|
||||||
int32_t dndProcessNodeMsg(SDnode *pDnode, SNodeMsg *pMsg);
|
|
||||||
int32_t dndSendReqToMnode(SMgmtWrapper *pWrapper, SRpcMsg *pMsg);
|
|
||||||
int32_t dndSendReqToDnode(SMgmtWrapper *pWrapper, const SEpSet *pEpSet, SRpcMsg *pMsg);
|
|
||||||
void dndSendRsp(SMgmtWrapper *pWrapper, const SRpcMsg *pRsp);
|
|
||||||
void dndRegisterBrokenLinkArg(SMgmtWrapper *pWrapper, SRpcMsg *pMsg);
|
|
||||||
SMsgCb dndCreateMsgcb(SMgmtWrapper *pWrapper);
|
|
||||||
|
|
||||||
int32_t dndReadFile(SMgmtWrapper *pWrapper, bool *pDeployed);
|
|
||||||
int32_t dndWriteFile(SMgmtWrapper *pWrapper, bool deployed);
|
|
||||||
|
|
||||||
SMgmtWrapper *dndAcquireWrapper(SDnode *pDnode, ENodeType nodeType);
|
|
||||||
int32_t dndMarkWrapper(SMgmtWrapper *pWrapper);
|
int32_t dndMarkWrapper(SMgmtWrapper *pWrapper);
|
||||||
void dndReleaseWrapper(SMgmtWrapper *pWrapper);
|
void dndReleaseWrapper(SMgmtWrapper *pWrapper);
|
||||||
|
void dndHandleEvent(SDnode *pDnode, EDndEvent event);
|
||||||
|
void dndReportStartup(SDnode *pDnode, const char *pName, const char *pDesc);
|
||||||
|
void dndProcessStartupReq(SDnode *pDnode, SRpcMsg *pMsg);
|
||||||
|
|
||||||
|
// dndTransport.c
|
||||||
|
int32_t dndInitTrans(SDnode *pDnode);
|
||||||
|
void dndCleanupTrans(SDnode *pDnode);
|
||||||
|
SMsgCb dndCreateMsgcb(SMgmtWrapper *pWrapper);
|
||||||
|
SProcCfg dndGenProcCfg(SMgmtWrapper *pWrapper);
|
||||||
|
int32_t dndInitMsgHandle(SDnode *pDnode);
|
||||||
|
void dndSendRecv(SDnode *pDnode, SEpSet *pEpSet, SRpcMsg *pReq, SRpcMsg *pRsp);
|
||||||
|
|
||||||
|
// mgmt
|
||||||
|
void dmSetMgmtFp(SMgmtWrapper *pWrapper);
|
||||||
|
void bmSetMgmtFp(SMgmtWrapper *pWrapper);
|
||||||
|
void qmSetMgmtFp(SMgmtWrapper *pMgmt);
|
||||||
|
void smSetMgmtFp(SMgmtWrapper *pWrapper);
|
||||||
|
void vmSetMgmtFp(SMgmtWrapper *pWrapper);
|
||||||
|
void mmSetMgmtFp(SMgmtWrapper *pMgmt);
|
||||||
|
|
||||||
|
void dmGetMnodeEpSet(SDnodeMgmt *pMgmt, SEpSet *pEpSet);
|
||||||
|
void dmUpdateMnodeEpSet(SDnodeMgmt *pMgmt, SEpSet *pEpSet);
|
||||||
|
void dmSendRedirectRsp(SDnodeMgmt *pMgmt, const SRpcMsg *pMsg);
|
||||||
|
|
||||||
|
void dmGetMonitorSysInfo(SMonSysInfo *pInfo);
|
||||||
|
void vmGetVnodeLoads(SMgmtWrapper *pWrapper, SMonVloadInfo *pInfo);
|
||||||
|
void mmGetMonitorInfo(SMgmtWrapper *pWrapper, SMonMmInfo *mmInfo);
|
||||||
|
void vmGetMonitorInfo(SMgmtWrapper *pWrapper, SMonVmInfo *vmInfo);
|
||||||
|
void qmGetMonitorInfo(SMgmtWrapper *pWrapper, SMonQmInfo *qmInfo);
|
||||||
|
void smGetMonitorInfo(SMgmtWrapper *pWrapper, SMonSmInfo *smInfo);
|
||||||
|
void bmGetMonitorInfo(SMgmtWrapper *pWrapper, SMonBmInfo *bmInfo);
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#endif /*_TD_DND_H_*/
|
#endif /*_TD_DND_INT_H_*/
|
|
@ -16,7 +16,7 @@
|
||||||
#ifndef _TD_DND_MNODE_INT_H_
|
#ifndef _TD_DND_MNODE_INT_H_
|
||||||
#define _TD_DND_MNODE_INT_H_
|
#define _TD_DND_MNODE_INT_H_
|
||||||
|
|
||||||
#include "mm.h"
|
#include "dndInt.h"
|
||||||
#include "mnode.h"
|
#include "mnode.h"
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
|
@ -32,6 +32,7 @@ typedef struct SMnodeMgmt {
|
||||||
SSingleWorker readWorker;
|
SSingleWorker readWorker;
|
||||||
SSingleWorker writeWorker;
|
SSingleWorker writeWorker;
|
||||||
SSingleWorker syncWorker;
|
SSingleWorker syncWorker;
|
||||||
|
SSingleWorker monitorWorker;
|
||||||
SReplica replicas[TSDB_MAX_REPLICA];
|
SReplica replicas[TSDB_MAX_REPLICA];
|
||||||
int8_t replica;
|
int8_t replica;
|
||||||
int8_t selfIndex;
|
int8_t selfIndex;
|
||||||
|
@ -46,11 +47,12 @@ int32_t mmOpenFromMsg(SMgmtWrapper *pWrapper, SDCreateMnodeReq *pReq);
|
||||||
int32_t mmDrop(SMgmtWrapper *pWrapper);
|
int32_t mmDrop(SMgmtWrapper *pWrapper);
|
||||||
int32_t mmAlter(SMnodeMgmt *pMgmt, SDAlterMnodeReq *pReq);
|
int32_t mmAlter(SMnodeMgmt *pMgmt, SDAlterMnodeReq *pReq);
|
||||||
|
|
||||||
// mmMsg.c
|
// mmHandle.c
|
||||||
void mmInitMsgHandles(SMgmtWrapper *pWrapper);
|
void mmInitMsgHandle(SMgmtWrapper *pWrapper);
|
||||||
int32_t mmProcessCreateReq(SMgmtWrapper *pWrapper, SNodeMsg *pMsg);
|
int32_t mmProcessCreateReq(SMgmtWrapper *pWrapper, SNodeMsg *pMsg);
|
||||||
int32_t mmProcessDropReq(SMgmtWrapper *pWrapper, SNodeMsg *pMsg);
|
int32_t mmProcessDropReq(SMgmtWrapper *pWrapper, SNodeMsg *pMsg);
|
||||||
int32_t mmProcessAlterReq(SMnodeMgmt *pMgmt, SNodeMsg *pMsg);
|
int32_t mmProcessAlterReq(SMnodeMgmt *pMgmt, SNodeMsg *pMsg);
|
||||||
|
int32_t mmProcessGetMonMmInfoReq(SMgmtWrapper *pWrapper, SNodeMsg *pReq);
|
||||||
|
|
||||||
// mmWorker.c
|
// mmWorker.c
|
||||||
int32_t mmStartWorker(SMnodeMgmt *pMgmt);
|
int32_t mmStartWorker(SMnodeMgmt *pMgmt);
|
||||||
|
@ -59,6 +61,7 @@ int32_t mmProcessWriteMsg(SMgmtWrapper *pWrapper, SNodeMsg *pMsg);
|
||||||
int32_t mmProcessSyncMsg(SMgmtWrapper *pWrapper, SNodeMsg *pMsg);
|
int32_t mmProcessSyncMsg(SMgmtWrapper *pWrapper, SNodeMsg *pMsg);
|
||||||
int32_t mmProcessReadMsg(SMgmtWrapper *pWrapper, SNodeMsg *pMsg);
|
int32_t mmProcessReadMsg(SMgmtWrapper *pWrapper, SNodeMsg *pMsg);
|
||||||
int32_t mmProcessQueryMsg(SMgmtWrapper *pWrapper, SNodeMsg *pMsg);
|
int32_t mmProcessQueryMsg(SMgmtWrapper *pWrapper, SNodeMsg *pMsg);
|
||||||
|
int32_t mmProcessMonitorMsg(SMgmtWrapper *pWrapper, SNodeMsg *pMsg);
|
||||||
int32_t mmPutMsgToQueryQueue(SMgmtWrapper *pWrapper, SRpcMsg *pRpc);
|
int32_t mmPutMsgToQueryQueue(SMgmtWrapper *pWrapper, SRpcMsg *pRpc);
|
||||||
int32_t mmPutMsgToReadQueue(SMgmtWrapper *pWrapper, SRpcMsg *pRpc);
|
int32_t mmPutMsgToReadQueue(SMgmtWrapper *pWrapper, SRpcMsg *pRpc);
|
||||||
int32_t mmPutMsgToWriteQueue(SMgmtWrapper *pWrapper, SRpcMsg *pRpc);
|
int32_t mmPutMsgToWriteQueue(SMgmtWrapper *pWrapper, SRpcMsg *pRpc);
|
|
@ -16,7 +16,7 @@
|
||||||
#ifndef _TD_DND_QNODE_INT_H_
|
#ifndef _TD_DND_QNODE_INT_H_
|
||||||
#define _TD_DND_QNODE_INT_H_
|
#define _TD_DND_QNODE_INT_H_
|
||||||
|
|
||||||
#include "qm.h"
|
#include "dndInt.h"
|
||||||
#include "qnode.h"
|
#include "qnode.h"
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
|
@ -30,16 +30,18 @@ typedef struct SQnodeMgmt {
|
||||||
const char *path;
|
const char *path;
|
||||||
SSingleWorker queryWorker;
|
SSingleWorker queryWorker;
|
||||||
SSingleWorker fetchWorker;
|
SSingleWorker fetchWorker;
|
||||||
|
SSingleWorker monitorWorker;
|
||||||
} SQnodeMgmt;
|
} SQnodeMgmt;
|
||||||
|
|
||||||
// qmInt.c
|
// qmInt.c
|
||||||
int32_t qmOpen(SMgmtWrapper *pWrapper);
|
int32_t qmOpen(SMgmtWrapper *pWrapper);
|
||||||
int32_t qmDrop(SMgmtWrapper *pWrapper);
|
int32_t qmDrop(SMgmtWrapper *pWrapper);
|
||||||
|
|
||||||
// qmMsg.c
|
// qmHandle.c
|
||||||
void qmInitMsgHandles(SMgmtWrapper *pWrapper);
|
void qmInitMsgHandle(SMgmtWrapper *pWrapper);
|
||||||
int32_t qmProcessCreateReq(SMgmtWrapper *pWrapper, SNodeMsg *pMsg);
|
int32_t qmProcessCreateReq(SMgmtWrapper *pWrapper, SNodeMsg *pMsg);
|
||||||
int32_t qmProcessDropReq(SMgmtWrapper *pWrapper, SNodeMsg *pMsg);
|
int32_t qmProcessDropReq(SMgmtWrapper *pWrapper, SNodeMsg *pMsg);
|
||||||
|
int32_t qmProcessGetMonQmInfoReq(SMgmtWrapper *pWrapper, SNodeMsg *pReq);
|
||||||
|
|
||||||
// qmWorker.c
|
// qmWorker.c
|
||||||
int32_t qmPutMsgToQueryQueue(SMgmtWrapper *pWrapper, SRpcMsg *pMsg);
|
int32_t qmPutMsgToQueryQueue(SMgmtWrapper *pWrapper, SRpcMsg *pMsg);
|
||||||
|
@ -50,6 +52,7 @@ int32_t qmStartWorker(SQnodeMgmt *pMgmt);
|
||||||
void qmStopWorker(SQnodeMgmt *pMgmt);
|
void qmStopWorker(SQnodeMgmt *pMgmt);
|
||||||
int32_t qmProcessQueryMsg(SMgmtWrapper *pWrapper, SNodeMsg *pMsg);
|
int32_t qmProcessQueryMsg(SMgmtWrapper *pWrapper, SNodeMsg *pMsg);
|
||||||
int32_t qmProcessFetchMsg(SMgmtWrapper *pWrapper, SNodeMsg *pMsg);
|
int32_t qmProcessFetchMsg(SMgmtWrapper *pWrapper, SNodeMsg *pMsg);
|
||||||
|
int32_t qmProcessMonitorMsg(SMgmtWrapper *pWrapper, SNodeMsg *pMsg);
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
|
@ -16,7 +16,7 @@
|
||||||
#ifndef _TD_DND_SNODE_INT_H_
|
#ifndef _TD_DND_SNODE_INT_H_
|
||||||
#define _TD_DND_SNODE_INT_H_
|
#define _TD_DND_SNODE_INT_H_
|
||||||
|
|
||||||
#include "sm.h"
|
#include "dndInt.h"
|
||||||
#include "snode.h"
|
#include "snode.h"
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
|
@ -32,16 +32,18 @@ typedef struct SSnodeMgmt {
|
||||||
int8_t uniqueWorkerInUse;
|
int8_t uniqueWorkerInUse;
|
||||||
SArray *uniqueWorkers; // SArray<SMultiWorker*>
|
SArray *uniqueWorkers; // SArray<SMultiWorker*>
|
||||||
SSingleWorker sharedWorker;
|
SSingleWorker sharedWorker;
|
||||||
|
SSingleWorker monitorWorker;
|
||||||
} SSnodeMgmt;
|
} SSnodeMgmt;
|
||||||
|
|
||||||
// smInt.c
|
// smInt.c
|
||||||
int32_t smOpen(SMgmtWrapper *pWrapper);
|
int32_t smOpen(SMgmtWrapper *pWrapper);
|
||||||
int32_t smDrop(SMgmtWrapper *pWrapper);
|
int32_t smDrop(SMgmtWrapper *pWrapper);
|
||||||
|
|
||||||
// smMsg.c
|
// smHandle.c
|
||||||
void smInitMsgHandles(SMgmtWrapper *pWrapper);
|
void smInitMsgHandle(SMgmtWrapper *pWrapper);
|
||||||
int32_t smProcessCreateReq(SMgmtWrapper *pWrapper, SNodeMsg *pMsg);
|
int32_t smProcessCreateReq(SMgmtWrapper *pWrapper, SNodeMsg *pMsg);
|
||||||
int32_t smProcessDropReq(SMgmtWrapper *pWrapper, SNodeMsg *pMsg);
|
int32_t smProcessDropReq(SMgmtWrapper *pWrapper, SNodeMsg *pMsg);
|
||||||
|
int32_t smProcessGetMonSmInfoReq(SMgmtWrapper *pWrapper, SNodeMsg *pReq);
|
||||||
|
|
||||||
// smWorker.c
|
// smWorker.c
|
||||||
int32_t smStartWorker(SSnodeMgmt *pMgmt);
|
int32_t smStartWorker(SSnodeMgmt *pMgmt);
|
||||||
|
@ -50,6 +52,7 @@ int32_t smProcessMgmtMsg(SMgmtWrapper *pWrapper, SNodeMsg *pMsg);
|
||||||
int32_t smProcessUniqueMsg(SMgmtWrapper *pWrapper, SNodeMsg *pMsg);
|
int32_t smProcessUniqueMsg(SMgmtWrapper *pWrapper, SNodeMsg *pMsg);
|
||||||
int32_t smProcessSharedMsg(SMgmtWrapper *pWrapper, SNodeMsg *pMsg);
|
int32_t smProcessSharedMsg(SMgmtWrapper *pWrapper, SNodeMsg *pMsg);
|
||||||
int32_t smProcessExecMsg(SMgmtWrapper *pWrapper, SNodeMsg *pMsg);
|
int32_t smProcessExecMsg(SMgmtWrapper *pWrapper, SNodeMsg *pMsg);
|
||||||
|
int32_t smProcessMonitorMsg(SMgmtWrapper *pWrapper, SNodeMsg *pMsg);
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
|
@ -17,7 +17,7 @@
|
||||||
#define _TD_DND_VNODES_INT_H_
|
#define _TD_DND_VNODES_INT_H_
|
||||||
|
|
||||||
#include "sync.h"
|
#include "sync.h"
|
||||||
#include "vm.h"
|
#include "dndInt.h"
|
||||||
#include "vnode.h"
|
#include "vnode.h"
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
|
@ -28,6 +28,7 @@ typedef struct SVnodesMgmt {
|
||||||
SHashObj *hash;
|
SHashObj *hash;
|
||||||
SRWLatch latch;
|
SRWLatch latch;
|
||||||
SVnodesStat state;
|
SVnodesStat state;
|
||||||
|
SVnodesStat lastState;
|
||||||
STfs *pTfs;
|
STfs *pTfs;
|
||||||
SQWorkerPool queryPool;
|
SQWorkerPool queryPool;
|
||||||
SQWorkerPool fetchPool;
|
SQWorkerPool fetchPool;
|
||||||
|
@ -38,6 +39,7 @@ typedef struct SVnodesMgmt {
|
||||||
SDnode *pDnode;
|
SDnode *pDnode;
|
||||||
SMgmtWrapper *pWrapper;
|
SMgmtWrapper *pWrapper;
|
||||||
SSingleWorker mgmtWorker;
|
SSingleWorker mgmtWorker;
|
||||||
|
SSingleWorker monitorWorker;
|
||||||
} SVnodesMgmt;
|
} SVnodesMgmt;
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
|
@ -84,13 +86,15 @@ void vmReleaseVnode(SVnodesMgmt *pMgmt, SVnodeObj *pVnode);
|
||||||
int32_t vmOpenVnode(SVnodesMgmt *pMgmt, SWrapperCfg *pCfg, SVnode *pImpl);
|
int32_t vmOpenVnode(SVnodesMgmt *pMgmt, SWrapperCfg *pCfg, SVnode *pImpl);
|
||||||
void vmCloseVnode(SVnodesMgmt *pMgmt, SVnodeObj *pVnode);
|
void vmCloseVnode(SVnodesMgmt *pMgmt, SVnodeObj *pVnode);
|
||||||
|
|
||||||
// vmMsg.c
|
// vmHandle.c
|
||||||
void vmInitMsgHandles(SMgmtWrapper *pWrapper);
|
void vmInitMsgHandle(SMgmtWrapper *pWrapper);
|
||||||
int32_t vmProcessCreateVnodeReq(SVnodesMgmt *pMgmt, SNodeMsg *pReq);
|
int32_t vmProcessCreateVnodeReq(SVnodesMgmt *pMgmt, SNodeMsg *pReq);
|
||||||
int32_t vmProcessAlterVnodeReq(SVnodesMgmt *pMgmt, SNodeMsg *pReq);
|
int32_t vmProcessAlterVnodeReq(SVnodesMgmt *pMgmt, SNodeMsg *pReq);
|
||||||
int32_t vmProcessDropVnodeReq(SVnodesMgmt *pMgmt, SNodeMsg *pReq);
|
int32_t vmProcessDropVnodeReq(SVnodesMgmt *pMgmt, SNodeMsg *pReq);
|
||||||
int32_t vmProcessSyncVnodeReq(SVnodesMgmt *pMgmt, SNodeMsg *pReq);
|
int32_t vmProcessSyncVnodeReq(SVnodesMgmt *pMgmt, SNodeMsg *pReq);
|
||||||
int32_t vmProcessCompactVnodeReq(SVnodesMgmt *pMgmt, SNodeMsg *pReq);
|
int32_t vmProcessCompactVnodeReq(SVnodesMgmt *pMgmt, SNodeMsg *pReq);
|
||||||
|
int32_t vmProcessGetMonVmInfoReq(SMgmtWrapper *pWrapper, SNodeMsg *pReq);
|
||||||
|
int32_t vmProcessGetVnodeLoadsReq(SMgmtWrapper *pWrapper, SNodeMsg *pReq);
|
||||||
|
|
||||||
// vmFile.c
|
// vmFile.c
|
||||||
int32_t vmGetVnodesFromFile(SVnodesMgmt *pMgmt, SWrapperCfg **ppCfgs, int32_t *numOfVnodes);
|
int32_t vmGetVnodesFromFile(SVnodesMgmt *pMgmt, SWrapperCfg **ppCfgs, int32_t *numOfVnodes);
|
||||||
|
@ -114,6 +118,7 @@ int32_t vmProcessQueryMsg(SMgmtWrapper *pWrapper, SNodeMsg *pMsg);
|
||||||
int32_t vmProcessFetchMsg(SMgmtWrapper *pWrapper, SNodeMsg *pMsg);
|
int32_t vmProcessFetchMsg(SMgmtWrapper *pWrapper, SNodeMsg *pMsg);
|
||||||
int32_t vmProcessMergeMsg(SMgmtWrapper *pWrapper, SNodeMsg *pMsg);
|
int32_t vmProcessMergeMsg(SMgmtWrapper *pWrapper, SNodeMsg *pMsg);
|
||||||
int32_t vmProcessMgmtMsg(SMgmtWrapper *pWrappert, SNodeMsg *pMsg);
|
int32_t vmProcessMgmtMsg(SMgmtWrapper *pWrappert, SNodeMsg *pMsg);
|
||||||
|
int32_t vmProcessMonitorMsg(SMgmtWrapper *pWrapper, SNodeMsg *pMsg);
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
|
@ -58,39 +58,62 @@ void dndCleanup() {
|
||||||
dInfo("dnode env is cleaned up");
|
dInfo("dnode env is cleaned up");
|
||||||
}
|
}
|
||||||
|
|
||||||
void dndSetMsgHandle(SMgmtWrapper *pWrapper, tmsg_t msgType, NodeMsgFp nodeMsgFp, int8_t vgId) {
|
const char *dndStatStr(EDndStatus status) {
|
||||||
pWrapper->msgFps[TMSG_INDEX(msgType)] = nodeMsgFp;
|
switch (status) {
|
||||||
pWrapper->msgVgIds[TMSG_INDEX(msgType)] = vgId;
|
case DND_STAT_INIT:
|
||||||
}
|
return "init";
|
||||||
|
case DND_STAT_RUNNING:
|
||||||
EDndStatus dndGetStatus(SDnode *pDnode) { return pDnode->status; }
|
return "running";
|
||||||
|
case DND_STAT_STOPPED:
|
||||||
void dndSetStatus(SDnode *pDnode, EDndStatus status) {
|
return "stopped";
|
||||||
if (pDnode->status != status) {
|
default:
|
||||||
dDebug("dnode status set from %s to %s", dndStatStr(pDnode->status), dndStatStr(status));
|
return "UNKNOWN";
|
||||||
pDnode->status = status;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void dndReportStartup(SDnode *pDnode, const char *pName, const char *pDesc) {
|
const char *dndNodeLogStr(EDndType ntype) {
|
||||||
SStartupReq *pStartup = &pDnode->startup;
|
switch (ntype) {
|
||||||
tstrncpy(pStartup->name, pName, TSDB_STEP_NAME_LEN);
|
case VNODES:
|
||||||
tstrncpy(pStartup->desc, pDesc, TSDB_STEP_DESC_LEN);
|
return "vnode";
|
||||||
pStartup->finished = 0;
|
case QNODE:
|
||||||
|
return "qnode";
|
||||||
|
case SNODE:
|
||||||
|
return "snode";
|
||||||
|
case MNODE:
|
||||||
|
return "mnode";
|
||||||
|
case BNODE:
|
||||||
|
return "bnode";
|
||||||
|
default:
|
||||||
|
return "taosd";
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void dndGetStartup(SDnode *pDnode, SStartupReq *pStartup) {
|
const char *dndNodeProcStr(EDndType ntype) {
|
||||||
memcpy(pStartup, &pDnode->startup, sizeof(SStartupReq));
|
switch (ntype) {
|
||||||
pStartup->finished = (dndGetStatus(pDnode) == DND_STAT_RUNNING);
|
case VNODES:
|
||||||
|
return "taosv";
|
||||||
|
case QNODE:
|
||||||
|
return "taosq";
|
||||||
|
case SNODE:
|
||||||
|
return "taoss";
|
||||||
|
case MNODE:
|
||||||
|
return "taosm";
|
||||||
|
case BNODE:
|
||||||
|
return "taosb";
|
||||||
|
default:
|
||||||
|
return "taosd";
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void dndProcessStartupReq(SDnode *pDnode, SRpcMsg *pReq) {
|
const char *dndEventStr(EDndEvent ev) {
|
||||||
dDebug("startup req is received");
|
switch (ev) {
|
||||||
SStartupReq *pStartup = rpcMallocCont(sizeof(SStartupReq));
|
case DND_EVENT_START:
|
||||||
dndGetStartup(pDnode, pStartup);
|
return "start";
|
||||||
|
case DND_EVENT_STOP:
|
||||||
dDebug("startup req is sent, step:%s desc:%s finished:%d", pStartup->name, pStartup->desc, pStartup->finished);
|
return "stop";
|
||||||
SRpcMsg rpcRsp = {
|
case DND_EVENT_CHILD:
|
||||||
.handle = pReq->handle, .pCont = pStartup, .contLen = sizeof(SStartupReq), .ahandle = pReq->ahandle};
|
return "child";
|
||||||
rpcSendResponse(&rpcRsp);
|
default:
|
||||||
|
return "UNKNOWN";
|
||||||
|
}
|
||||||
}
|
}
|
|
@ -20,9 +20,9 @@ static bool dndRequireNode(SMgmtWrapper *pWrapper) {
|
||||||
bool required = false;
|
bool required = false;
|
||||||
int32_t code = (*pWrapper->fp.requiredFp)(pWrapper, &required);
|
int32_t code = (*pWrapper->fp.requiredFp)(pWrapper, &required);
|
||||||
if (!required) {
|
if (!required) {
|
||||||
dDebug("node:%s, no need to start", pWrapper->name);
|
dDebug("node:%s, does not require startup", pWrapper->name);
|
||||||
} else {
|
} else {
|
||||||
dDebug("node:%s, need to start", pWrapper->name);
|
dDebug("node:%s, needs to be started", pWrapper->name);
|
||||||
}
|
}
|
||||||
return required;
|
return required;
|
||||||
}
|
}
|
||||||
|
@ -45,7 +45,7 @@ int32_t dndOpenNode(SMgmtWrapper *pWrapper) {
|
||||||
}
|
}
|
||||||
|
|
||||||
void dndCloseNode(SMgmtWrapper *pWrapper) {
|
void dndCloseNode(SMgmtWrapper *pWrapper) {
|
||||||
dDebug("node:%s, start to close", pWrapper->name);
|
dDebug("node:%s, mgmt start to close", pWrapper->name);
|
||||||
pWrapper->required = false;
|
pWrapper->required = false;
|
||||||
taosWLockLatch(&pWrapper->latch);
|
taosWLockLatch(&pWrapper->latch);
|
||||||
if (pWrapper->deployed) {
|
if (pWrapper->deployed) {
|
||||||
|
@ -62,13 +62,42 @@ void dndCloseNode(SMgmtWrapper *pWrapper) {
|
||||||
taosProcCleanup(pWrapper->pProc);
|
taosProcCleanup(pWrapper->pProc);
|
||||||
pWrapper->pProc = NULL;
|
pWrapper->pProc = NULL;
|
||||||
}
|
}
|
||||||
dDebug("node:%s, has been closed", pWrapper->name);
|
dDebug("node:%s, mgmt has been closed", pWrapper->name);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static int32_t dndNewProc(SMgmtWrapper *pWrapper, EDndType n) {
|
||||||
|
char tstr[8] = {0};
|
||||||
|
char *args[6] = {0};
|
||||||
|
snprintf(tstr, sizeof(tstr), "%d", n);
|
||||||
|
args[1] = "-c";
|
||||||
|
args[2] = configDir;
|
||||||
|
args[3] = "-n";
|
||||||
|
args[4] = tstr;
|
||||||
|
args[5] = NULL;
|
||||||
|
|
||||||
|
int32_t pid = taosNewProc(args);
|
||||||
|
if (pid <= 0) {
|
||||||
|
terrno = TAOS_SYSTEM_ERROR(errno);
|
||||||
|
dError("node:%s, failed to exec in new process since %s", pWrapper->name, terrstr());
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
pWrapper->procId = pid;
|
||||||
|
dInfo("node:%s, continue running in new process:%d", pWrapper->name, pid);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void dndProcessProcHandle(void *handle) {
|
||||||
|
dWarn("handle:%p, the child process dies and send an offline rsp", handle);
|
||||||
|
SRpcMsg rpcMsg = {.handle = handle, .code = TSDB_CODE_DND_OFFLINE};
|
||||||
|
rpcSendResponse(&rpcMsg);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int32_t dndRunInSingleProcess(SDnode *pDnode) {
|
static int32_t dndRunInSingleProcess(SDnode *pDnode) {
|
||||||
dInfo("dnode start to run in single process");
|
dInfo("dnode run in single process");
|
||||||
|
|
||||||
for (ENodeType n = DNODE; n < NODE_MAX; ++n) {
|
for (EDndType n = DNODE; n < NODE_MAX; ++n) {
|
||||||
SMgmtWrapper *pWrapper = &pDnode->wrappers[n];
|
SMgmtWrapper *pWrapper = &pDnode->wrappers[n];
|
||||||
pWrapper->required = dndRequireNode(pWrapper);
|
pWrapper->required = dndRequireNode(pWrapper);
|
||||||
if (!pWrapper->required) continue;
|
if (!pWrapper->required) continue;
|
||||||
|
@ -81,7 +110,7 @@ static int32_t dndRunInSingleProcess(SDnode *pDnode) {
|
||||||
|
|
||||||
dndSetStatus(pDnode, DND_STAT_RUNNING);
|
dndSetStatus(pDnode, DND_STAT_RUNNING);
|
||||||
|
|
||||||
for (ENodeType n = 0; n < NODE_MAX; ++n) {
|
for (EDndType n = 0; n < NODE_MAX; ++n) {
|
||||||
SMgmtWrapper *pWrapper = &pDnode->wrappers[n];
|
SMgmtWrapper *pWrapper = &pDnode->wrappers[n];
|
||||||
if (!pWrapper->required) continue;
|
if (!pWrapper->required) continue;
|
||||||
if (pWrapper->fp.startFp == NULL) continue;
|
if (pWrapper->fp.startFp == NULL) continue;
|
||||||
|
@ -91,90 +120,56 @@ static int32_t dndRunInSingleProcess(SDnode *pDnode) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
dInfo("dnode running in single process");
|
dInfo("TDengine initialized successfully");
|
||||||
|
dndReportStartup(pDnode, "TDengine", "initialized successfully");
|
||||||
|
while (1) {
|
||||||
|
if (pDnode->event == DND_EVENT_STOP) {
|
||||||
|
dInfo("dnode is about to stop");
|
||||||
|
dndSetStatus(pDnode, DND_STAT_STOPPED);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
taosMsleep(100);
|
||||||
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void dndConsumeChildQueue(SMgmtWrapper *pWrapper, SNodeMsg *pMsg, int16_t msgLen, void *pCont, int32_t contLen,
|
|
||||||
ProcFuncType ftype) {
|
|
||||||
SRpcMsg *pRpc = &pMsg->rpcMsg;
|
|
||||||
pRpc->pCont = pCont;
|
|
||||||
dTrace("msg:%p, get from child queue, handle:%p app:%p", pMsg, pRpc->handle, pRpc->ahandle);
|
|
||||||
|
|
||||||
NodeMsgFp msgFp = pWrapper->msgFps[TMSG_INDEX(pRpc->msgType)];
|
|
||||||
int32_t code = (*msgFp)(pWrapper, pMsg);
|
|
||||||
|
|
||||||
if (code != 0) {
|
|
||||||
dError("msg:%p, failed to process since code:0x%04x:%s", pMsg, code & 0XFFFF, tstrerror(code));
|
|
||||||
if (pRpc->msgType & 1U) {
|
|
||||||
SRpcMsg rsp = {.handle = pRpc->handle, .ahandle = pRpc->ahandle, .code = terrno};
|
|
||||||
dndSendRsp(pWrapper, &rsp);
|
|
||||||
}
|
|
||||||
|
|
||||||
dTrace("msg:%p, is freed", pMsg);
|
|
||||||
taosFreeQitem(pMsg);
|
|
||||||
rpcFreeCont(pCont);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static void dndConsumeParentQueue(SMgmtWrapper *pWrapper, SRpcMsg *pMsg, int16_t msgLen, void *pCont, int32_t contLen,
|
|
||||||
ProcFuncType ftype) {
|
|
||||||
pMsg->pCont = pCont;
|
|
||||||
dTrace("msg:%p, get from parent queue, handle:%p app:%p", pMsg, pMsg->handle, pMsg->ahandle);
|
|
||||||
|
|
||||||
switch (ftype) {
|
|
||||||
case PROC_REG:
|
|
||||||
rpcRegisterBrokenLinkArg(pMsg);
|
|
||||||
break;
|
|
||||||
case PROC_RELEASE:
|
|
||||||
rpcReleaseHandle(pMsg->handle, (int8_t)pMsg->code);
|
|
||||||
rpcFreeCont(pCont);
|
|
||||||
break;
|
|
||||||
case PROC_REQ:
|
|
||||||
// todo send to dnode
|
|
||||||
dndSendReqToMnode(pWrapper, pMsg);
|
|
||||||
default:
|
|
||||||
dndSendRpcRsp(pWrapper, pMsg);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
taosMemoryFree(pMsg);
|
|
||||||
}
|
|
||||||
|
|
||||||
static int32_t dndRunInParentProcess(SDnode *pDnode) {
|
static int32_t dndRunInParentProcess(SDnode *pDnode) {
|
||||||
dInfo("dnode start to run in parent process");
|
dInfo("dnode run in parent process");
|
||||||
SMgmtWrapper *pDWrapper = &pDnode->wrappers[DNODE];
|
SMgmtWrapper *pDWrapper = &pDnode->wrappers[DNODE];
|
||||||
if (dndOpenNode(pDWrapper) != 0) {
|
if (dndOpenNode(pDWrapper) != 0) {
|
||||||
dError("node:%s, failed to start since %s", pDWrapper->name, terrstr());
|
dError("node:%s, failed to start since %s", pDWrapper->name, terrstr());
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
for (ENodeType n = DNODE + 1; n < NODE_MAX; ++n) {
|
for (EDndType n = DNODE + 1; n < NODE_MAX; ++n) {
|
||||||
SMgmtWrapper *pWrapper = &pDnode->wrappers[n];
|
SMgmtWrapper *pWrapper = &pDnode->wrappers[n];
|
||||||
pWrapper->required = dndRequireNode(pWrapper);
|
pWrapper->required = dndRequireNode(pWrapper);
|
||||||
if (!pWrapper->required) continue;
|
if (!pWrapper->required) continue;
|
||||||
|
|
||||||
int64_t shmsize = 1024 * 1024 * 2; // size will be a configuration item
|
int32_t shmsize = tsMnodeShmSize;
|
||||||
if (taosCreateShm(&pWrapper->shm, shmsize) != 0) {
|
if (n == VNODES) {
|
||||||
terrno = TAOS_SYSTEM_ERROR(terrno);
|
shmsize = tsVnodeShmSize;
|
||||||
dError("node:%s, failed to create shm size:%" PRId64 " since %s", pWrapper->name, shmsize, terrstr());
|
} else if (n == QNODE) {
|
||||||
return -1;
|
shmsize = tsQnodeShmSize;
|
||||||
|
} else if (n == SNODE) {
|
||||||
|
shmsize = tsSnodeShmSize;
|
||||||
|
} else if (n == MNODE) {
|
||||||
|
shmsize = tsMnodeShmSize;
|
||||||
|
} else if (n == BNODE) {
|
||||||
|
shmsize = tsBnodeShmSize;
|
||||||
|
} else {
|
||||||
}
|
}
|
||||||
|
|
||||||
SProcCfg cfg = {.childConsumeFp = (ProcConsumeFp)dndConsumeChildQueue,
|
if (taosCreateShm(&pWrapper->shm, n, shmsize) != 0) {
|
||||||
.childMallocHeadFp = (ProcMallocFp)taosAllocateQitem,
|
terrno = TAOS_SYSTEM_ERROR(terrno);
|
||||||
.childFreeHeadFp = (ProcFreeFp)taosFreeQitem,
|
dError("node:%s, failed to create shm size:%d since %s", pWrapper->name, shmsize, terrstr());
|
||||||
.childMallocBodyFp = (ProcMallocFp)rpcMallocCont,
|
return -1;
|
||||||
.childFreeBodyFp = (ProcFreeFp)rpcFreeCont,
|
}
|
||||||
.parentConsumeFp = (ProcConsumeFp)dndConsumeParentQueue,
|
dInfo("node:%s, shm:%d is created, size:%d", pWrapper->name, pWrapper->shm.id, shmsize);
|
||||||
.parentMallocHeadFp = (ProcMallocFp)taosMemoryMalloc,
|
|
||||||
.parentFreeHeadFp = (ProcFreeFp)taosMemoryFree,
|
|
||||||
.parentMallocBodyFp = (ProcMallocFp)rpcMallocCont,
|
|
||||||
.parentFreeBodyFp = (ProcFreeFp)rpcFreeCont,
|
|
||||||
.shm = pWrapper->shm,
|
|
||||||
.pParent = pWrapper,
|
|
||||||
.isChild = false,
|
|
||||||
.name = pWrapper->name};
|
|
||||||
|
|
||||||
|
SProcCfg cfg = dndGenProcCfg(pWrapper);
|
||||||
|
cfg.isChild = false;
|
||||||
pWrapper->procType = PROC_PARENT;
|
pWrapper->procType = PROC_PARENT;
|
||||||
pWrapper->pProc = taosProcInit(&cfg);
|
pWrapper->pProc = taosProcInit(&cfg);
|
||||||
if (pWrapper->pProc == NULL) {
|
if (pWrapper->pProc == NULL) {
|
||||||
|
@ -188,22 +183,16 @@ static int32_t dndRunInParentProcess(SDnode *pDnode) {
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
for (ENodeType n = DNODE + 1; n < NODE_MAX; ++n) {
|
for (EDndType n = DNODE + 1; n < NODE_MAX; ++n) {
|
||||||
SMgmtWrapper *pWrapper = &pDnode->wrappers[n];
|
SMgmtWrapper *pWrapper = &pDnode->wrappers[n];
|
||||||
if (!pWrapper->required) continue;
|
if (!pWrapper->required) continue;
|
||||||
|
|
||||||
if (pDnode->ntype == NODE_MAX) {
|
if (pDnode->ntype == NODE_MAX) {
|
||||||
dInfo("node:%s, should be started manually", pWrapper->name);
|
dInfo("node:%s, should be started manually", pWrapper->name);
|
||||||
} else {
|
} else {
|
||||||
char args[PATH_MAX];
|
if (dndNewProc(pWrapper, n) != 0) {
|
||||||
int32_t pid = taosNewProc(args);
|
|
||||||
if (pid <= 0) {
|
|
||||||
terrno = TAOS_SYSTEM_ERROR(errno);
|
|
||||||
dError("node:%s, failed to exec in new process since %s", pWrapper->name, terrstr());
|
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
pWrapper->procId = pid;
|
|
||||||
dInfo("node:%s, run in new process, pid:%d", pWrapper->name, pid);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (taosProcRun(pWrapper->pProc) != 0) {
|
if (taosProcRun(pWrapper->pProc) != 0) {
|
||||||
|
@ -219,13 +208,57 @@ static int32_t dndRunInParentProcess(SDnode *pDnode) {
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
dInfo("dnode running in parent process");
|
dInfo("TDengine initialized successfully");
|
||||||
|
dndReportStartup(pDnode, "TDengine", "initialized successfully");
|
||||||
|
|
||||||
|
while (1) {
|
||||||
|
if (pDnode->event == DND_EVENT_STOP) {
|
||||||
|
dInfo("dnode is about to stop");
|
||||||
|
dndSetStatus(pDnode, DND_STAT_STOPPED);
|
||||||
|
|
||||||
|
for (EDndType n = DNODE + 1; n < NODE_MAX; ++n) {
|
||||||
|
SMgmtWrapper *pWrapper = &pDnode->wrappers[n];
|
||||||
|
if (!pWrapper->required) continue;
|
||||||
|
if (pDnode->ntype == NODE_MAX) continue;
|
||||||
|
|
||||||
|
if (pWrapper->procId > 0 && taosProcExist(pWrapper->procId)) {
|
||||||
|
dInfo("node:%s, send kill signal to the child process:%d", pWrapper->name, pWrapper->procId);
|
||||||
|
taosKillProc(pWrapper->procId);
|
||||||
|
dInfo("node:%s, wait for child process:%d to stop", pWrapper->name, pWrapper->procId);
|
||||||
|
taosWaitProc(pWrapper->procId);
|
||||||
|
dInfo("node:%s, child process:%d is stopped", pWrapper->name, pWrapper->procId);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
} else {
|
||||||
|
for (EDndType n = DNODE + 1; n < NODE_MAX; ++n) {
|
||||||
|
SMgmtWrapper *pWrapper = &pDnode->wrappers[n];
|
||||||
|
if (!pWrapper->required) continue;
|
||||||
|
if (pDnode->ntype == NODE_MAX) continue;
|
||||||
|
|
||||||
|
if (pWrapper->procId <= 0 || !taosProcExist(pWrapper->procId)) {
|
||||||
|
dWarn("node:%s, process:%d is killed and needs to be restarted", pWrapper->name, pWrapper->procId);
|
||||||
|
taosProcCloseHandles(pWrapper->pProc, dndProcessProcHandle);
|
||||||
|
dndNewProc(pWrapper, n);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
taosMsleep(100);
|
||||||
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int32_t dndRunInChildProcess(SDnode *pDnode) {
|
static int32_t dndRunInChildProcess(SDnode *pDnode) {
|
||||||
dInfo("dnode start to run in child process");
|
|
||||||
SMgmtWrapper *pWrapper = &pDnode->wrappers[pDnode->ntype];
|
SMgmtWrapper *pWrapper = &pDnode->wrappers[pDnode->ntype];
|
||||||
|
dInfo("%s run in child process", pWrapper->name);
|
||||||
|
|
||||||
|
pWrapper->required = dndRequireNode(pWrapper);
|
||||||
|
if (!pWrapper->required) {
|
||||||
|
dError("%s does not require startup", pWrapper->name);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
SMsgCb msgCb = dndCreateMsgcb(pWrapper);
|
SMsgCb msgCb = dndCreateMsgcb(pWrapper);
|
||||||
tmsgSetDefaultMsgCb(&msgCb);
|
tmsgSetDefaultMsgCb(&msgCb);
|
||||||
|
@ -236,21 +269,8 @@ static int32_t dndRunInChildProcess(SDnode *pDnode) {
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
SProcCfg cfg = {.childConsumeFp = (ProcConsumeFp)dndConsumeChildQueue,
|
SProcCfg cfg = dndGenProcCfg(pWrapper);
|
||||||
.childMallocHeadFp = (ProcMallocFp)taosAllocateQitem,
|
cfg.isChild = true;
|
||||||
.childFreeHeadFp = (ProcFreeFp)taosFreeQitem,
|
|
||||||
.childMallocBodyFp = (ProcMallocFp)rpcMallocCont,
|
|
||||||
.childFreeBodyFp = (ProcFreeFp)rpcFreeCont,
|
|
||||||
.parentConsumeFp = (ProcConsumeFp)dndConsumeParentQueue,
|
|
||||||
.parentMallocHeadFp = (ProcMallocFp)taosMemoryMalloc,
|
|
||||||
.parentFreeHeadFp = (ProcFreeFp)taosMemoryFree,
|
|
||||||
.parentMallocBodyFp = (ProcMallocFp)rpcMallocCont,
|
|
||||||
.parentFreeBodyFp = (ProcFreeFp)rpcFreeCont,
|
|
||||||
.shm = pWrapper->shm,
|
|
||||||
.pParent = pWrapper,
|
|
||||||
.isChild = true,
|
|
||||||
.name = pWrapper->name};
|
|
||||||
|
|
||||||
pWrapper->pProc = taosProcInit(&cfg);
|
pWrapper->pProc = taosProcInit(&cfg);
|
||||||
if (pWrapper->pProc == NULL) {
|
if (pWrapper->pProc == NULL) {
|
||||||
dError("node:%s, failed to create proc since %s", pWrapper->name, terrstr());
|
dError("node:%s, failed to create proc since %s", pWrapper->name, terrstr());
|
||||||
|
@ -264,39 +284,19 @@ static int32_t dndRunInChildProcess(SDnode *pDnode) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
dndSetStatus(pDnode, DND_STAT_RUNNING);
|
||||||
|
|
||||||
if (taosProcRun(pWrapper->pProc) != 0) {
|
if (taosProcRun(pWrapper->pProc) != 0) {
|
||||||
dError("node:%s, failed to run proc since %s", pWrapper->name, terrstr());
|
dError("node:%s, failed to run proc since %s", pWrapper->name, terrstr());
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
dInfo("dnode running in child process");
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
int32_t dndRun(SDnode * pDnode) {
|
|
||||||
if (!tsMultiProcess) {
|
|
||||||
if (dndRunInSingleProcess(pDnode) != 0) {
|
|
||||||
dError("failed to run dnode since %s", terrstr());
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
} else if (pDnode->ntype == DNODE || pDnode->ntype == NODE_MAX) {
|
|
||||||
if (dndRunInParentProcess(pDnode) != 0) {
|
|
||||||
dError("failed to run dnode in parent process since %s", terrstr());
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
if (dndRunInChildProcess(pDnode) != 0) {
|
|
||||||
dError("failed to run dnode in child process since %s", terrstr());
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
dndReportStartup(pDnode, "TDengine", "initialized successfully");
|
|
||||||
dInfo("TDengine initialized successfully");
|
dInfo("TDengine initialized successfully");
|
||||||
|
dndReportStartup(pDnode, "TDengine", "initialized successfully");
|
||||||
while (1) {
|
while (1) {
|
||||||
if (pDnode->event == DND_EVENT_STOP) {
|
if (pDnode->event == DND_EVENT_STOP) {
|
||||||
dInfo("dnode is about to stop");
|
dInfo("%s is about to stop", pWrapper->name);
|
||||||
|
dndSetStatus(pDnode, DND_STAT_STOPPED);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
taosMsleep(100);
|
taosMsleep(100);
|
||||||
|
@ -304,3 +304,15 @@ int32_t dndRun(SDnode * pDnode) {
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int32_t dndRun(SDnode *pDnode) {
|
||||||
|
if (!tsMultiProcess) {
|
||||||
|
return dndRunInSingleProcess(pDnode);
|
||||||
|
} else if (pDnode->ntype == DNODE || pDnode->ntype == NODE_MAX) {
|
||||||
|
return dndRunInParentProcess(pDnode);
|
||||||
|
} else {
|
||||||
|
return dndRunInChildProcess(pDnode);
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
|
@ -164,7 +164,7 @@ int32_t dndReadShmFile(SDnode *pDnode) {
|
||||||
goto _OVER;
|
goto _OVER;
|
||||||
}
|
}
|
||||||
|
|
||||||
for (ENodeType ntype = DNODE + 1; ntype < NODE_MAX; ++ntype) {
|
for (EDndType ntype = DNODE + 1; ntype < NODE_MAX; ++ntype) {
|
||||||
snprintf(itemName, sizeof(itemName), "%s_shmid", dndNodeProcStr(ntype));
|
snprintf(itemName, sizeof(itemName), "%s_shmid", dndNodeProcStr(ntype));
|
||||||
cJSON *shmid = cJSON_GetObjectItem(root, itemName);
|
cJSON *shmid = cJSON_GetObjectItem(root, itemName);
|
||||||
if (shmid && shmid->type == cJSON_Number) {
|
if (shmid && shmid->type == cJSON_Number) {
|
||||||
|
@ -179,8 +179,8 @@ int32_t dndReadShmFile(SDnode *pDnode) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!tsMultiProcess || pDnode->ntype == DNODE || pDnode->ntype == DNODE) {
|
if (!tsMultiProcess || pDnode->ntype == DNODE || pDnode->ntype == NODE_MAX) {
|
||||||
for (ENodeType ntype = DNODE; ntype < NODE_MAX; ++ntype) {
|
for (EDndType ntype = DNODE; ntype < NODE_MAX; ++ntype) {
|
||||||
SMgmtWrapper *pWrapper = &pDnode->wrappers[ntype];
|
SMgmtWrapper *pWrapper = &pDnode->wrappers[ntype];
|
||||||
if (pWrapper->shm.id >= 0) {
|
if (pWrapper->shm.id >= 0) {
|
||||||
dDebug("shmid:%d, is closed, size:%d", pWrapper->shm.id, pWrapper->shm.size);
|
dDebug("shmid:%d, is closed, size:%d", pWrapper->shm.id, pWrapper->shm.size);
|
||||||
|
@ -194,10 +194,10 @@ int32_t dndReadShmFile(SDnode *pDnode) {
|
||||||
dError("shmid:%d, failed to attach shm since %s", pWrapper->shm.id, terrstr());
|
dError("shmid:%d, failed to attach shm since %s", pWrapper->shm.id, terrstr());
|
||||||
goto _OVER;
|
goto _OVER;
|
||||||
}
|
}
|
||||||
dDebug("shmid:%d, is attached, size:%d", pWrapper->shm.id, pWrapper->shm.size);
|
dInfo("node:%s, shmid:%d is attached, size:%d", pWrapper->name, pWrapper->shm.id, pWrapper->shm.size);
|
||||||
}
|
}
|
||||||
|
|
||||||
dDebug("successed to open %s", file);
|
dDebug("successed to load %s", file);
|
||||||
code = 0;
|
code = 0;
|
||||||
|
|
||||||
_OVER:
|
_OVER:
|
||||||
|
@ -226,7 +226,7 @@ int32_t dndWriteShmFile(SDnode *pDnode) {
|
||||||
}
|
}
|
||||||
|
|
||||||
len += snprintf(content + len, MAXLEN - len, "{\n");
|
len += snprintf(content + len, MAXLEN - len, "{\n");
|
||||||
for (ENodeType ntype = DNODE + 1; ntype < NODE_MAX; ++ntype) {
|
for (EDndType ntype = DNODE + 1; ntype < NODE_MAX; ++ntype) {
|
||||||
SMgmtWrapper *pWrapper = &pDnode->wrappers[ntype];
|
SMgmtWrapper *pWrapper = &pDnode->wrappers[ntype];
|
||||||
len += snprintf(content + len, MAXLEN - len, " \"%s_shmid\":%d,\n", dndNodeProcStr(ntype), pWrapper->shm.id);
|
len += snprintf(content + len, MAXLEN - len, " \"%s_shmid\":%d,\n", dndNodeProcStr(ntype), pWrapper->shm.id);
|
||||||
if (ntype == NODE_MAX - 1) {
|
if (ntype == NODE_MAX - 1) {
|
|
@ -46,7 +46,7 @@ static int32_t dndInitVars(SDnode *pDnode, const SDnodeOpt *pOption) {
|
||||||
}
|
}
|
||||||
|
|
||||||
static void dndClearVars(SDnode *pDnode) {
|
static void dndClearVars(SDnode *pDnode) {
|
||||||
for (ENodeType n = 0; n < NODE_MAX; ++n) {
|
for (EDndType n = 0; n < NODE_MAX; ++n) {
|
||||||
SMgmtWrapper *pMgmt = &pDnode->wrappers[n];
|
SMgmtWrapper *pMgmt = &pDnode->wrappers[n];
|
||||||
taosMemoryFreeClear(pMgmt->path);
|
taosMemoryFreeClear(pMgmt->path);
|
||||||
}
|
}
|
||||||
|
@ -61,7 +61,7 @@ static void dndClearVars(SDnode *pDnode) {
|
||||||
taosMemoryFreeClear(pDnode->secondEp);
|
taosMemoryFreeClear(pDnode->secondEp);
|
||||||
taosMemoryFreeClear(pDnode->dataDir);
|
taosMemoryFreeClear(pDnode->dataDir);
|
||||||
taosMemoryFree(pDnode);
|
taosMemoryFree(pDnode);
|
||||||
dDebug("dnode object memory is cleared, data:%p", pDnode);
|
dDebug("dnode memory is cleared, data:%p", pDnode);
|
||||||
}
|
}
|
||||||
|
|
||||||
SDnode *dndCreate(const SDnodeOpt *pOption) {
|
SDnode *dndCreate(const SDnodeOpt *pOption) {
|
||||||
|
@ -82,19 +82,20 @@ SDnode *dndCreate(const SDnodeOpt *pOption) {
|
||||||
}
|
}
|
||||||
|
|
||||||
dndSetStatus(pDnode, DND_STAT_INIT);
|
dndSetStatus(pDnode, DND_STAT_INIT);
|
||||||
dmGetMgmtFp(&pDnode->wrappers[DNODE]);
|
dmSetMgmtFp(&pDnode->wrappers[DNODE]);
|
||||||
mmGetMgmtFp(&pDnode->wrappers[MNODE]);
|
mmSetMgmtFp(&pDnode->wrappers[MNODE]);
|
||||||
vmGetMgmtFp(&pDnode->wrappers[VNODES]);
|
vmSetMgmtFp(&pDnode->wrappers[VNODES]);
|
||||||
qmGetMgmtFp(&pDnode->wrappers[QNODE]);
|
qmSetMgmtFp(&pDnode->wrappers[QNODE]);
|
||||||
smGetMgmtFp(&pDnode->wrappers[SNODE]);
|
smSetMgmtFp(&pDnode->wrappers[SNODE]);
|
||||||
bmGetMgmtFp(&pDnode->wrappers[BNODE]);
|
bmSetMgmtFp(&pDnode->wrappers[BNODE]);
|
||||||
|
|
||||||
for (ENodeType n = 0; n < NODE_MAX; ++n) {
|
for (EDndType n = 0; n < NODE_MAX; ++n) {
|
||||||
SMgmtWrapper *pWrapper = &pDnode->wrappers[n];
|
SMgmtWrapper *pWrapper = &pDnode->wrappers[n];
|
||||||
snprintf(path, sizeof(path), "%s%s%s", pDnode->dataDir, TD_DIRSEP, pWrapper->name);
|
snprintf(path, sizeof(path), "%s%s%s", pDnode->dataDir, TD_DIRSEP, pWrapper->name);
|
||||||
pWrapper->path = strdup(path);
|
pWrapper->path = strdup(path);
|
||||||
pWrapper->shm.id = -1;
|
pWrapper->shm.id = -1;
|
||||||
pWrapper->pDnode = pDnode;
|
pWrapper->pDnode = pDnode;
|
||||||
|
pWrapper->ntype = n;
|
||||||
if (pWrapper->path == NULL) {
|
if (pWrapper->path == NULL) {
|
||||||
terrno = TSDB_CODE_OUT_OF_MEMORY;
|
terrno = TSDB_CODE_OUT_OF_MEMORY;
|
||||||
goto _OVER;
|
goto _OVER;
|
||||||
|
@ -105,7 +106,7 @@ SDnode *dndCreate(const SDnodeOpt *pOption) {
|
||||||
}
|
}
|
||||||
|
|
||||||
if (dndInitMsgHandle(pDnode) != 0) {
|
if (dndInitMsgHandle(pDnode) != 0) {
|
||||||
dError("failed to msg handles since %s", terrstr());
|
dError("failed to init msg handles since %s", terrstr());
|
||||||
goto _OVER;
|
goto _OVER;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -117,14 +118,14 @@ SDnode *dndCreate(const SDnodeOpt *pOption) {
|
||||||
SMsgCb msgCb = dndCreateMsgcb(&pDnode->wrappers[0]);
|
SMsgCb msgCb = dndCreateMsgcb(&pDnode->wrappers[0]);
|
||||||
tmsgSetDefaultMsgCb(&msgCb);
|
tmsgSetDefaultMsgCb(&msgCb);
|
||||||
|
|
||||||
dInfo("dnode object is created, data:%p", pDnode);
|
dInfo("dnode is created, data:%p", pDnode);
|
||||||
code = 0;
|
code = 0;
|
||||||
|
|
||||||
_OVER:
|
_OVER:
|
||||||
if (code != 0 && pDnode) {
|
if (code != 0 && pDnode) {
|
||||||
dndClearVars(pDnode);
|
dndClearVars(pDnode);
|
||||||
pDnode = NULL;
|
pDnode = NULL;
|
||||||
dError("failed to create dnode object since %s", terrstr());
|
dError("failed to create dnode since %s", terrstr());
|
||||||
}
|
}
|
||||||
|
|
||||||
return pDnode;
|
return pDnode;
|
||||||
|
@ -133,29 +134,22 @@ _OVER:
|
||||||
void dndClose(SDnode *pDnode) {
|
void dndClose(SDnode *pDnode) {
|
||||||
if (pDnode == NULL) return;
|
if (pDnode == NULL) return;
|
||||||
|
|
||||||
if (dndGetStatus(pDnode) == DND_STAT_STOPPED) {
|
for (EDndType n = 0; n < NODE_MAX; ++n) {
|
||||||
dError("dnode is shutting down, data:%p", pDnode);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
dInfo("start to close dnode, data:%p", pDnode);
|
|
||||||
dndSetStatus(pDnode, DND_STAT_STOPPED);
|
|
||||||
|
|
||||||
for (ENodeType n = 0; n < NODE_MAX; ++n) {
|
|
||||||
SMgmtWrapper *pWrapper = &pDnode->wrappers[n];
|
SMgmtWrapper *pWrapper = &pDnode->wrappers[n];
|
||||||
dndCloseNode(pWrapper);
|
dndCloseNode(pWrapper);
|
||||||
}
|
}
|
||||||
|
|
||||||
dndClearVars(pDnode);
|
dndClearVars(pDnode);
|
||||||
dInfo("dnode object is closed, data:%p", pDnode);
|
dInfo("dnode is closed, data:%p", pDnode);
|
||||||
}
|
}
|
||||||
|
|
||||||
void dndHandleEvent(SDnode *pDnode, EDndEvent event) {
|
void dndHandleEvent(SDnode *pDnode, EDndEvent event) {
|
||||||
dInfo("dnode object receive event %d, data:%p", event, pDnode);
|
if (event == DND_EVENT_STOP) {
|
||||||
pDnode->event = event;
|
pDnode->event = event;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
SMgmtWrapper *dndAcquireWrapper(SDnode *pDnode, ENodeType ntype) {
|
SMgmtWrapper *dndAcquireWrapper(SDnode *pDnode, EDndType ntype) {
|
||||||
SMgmtWrapper *pWrapper = &pDnode->wrappers[ntype];
|
SMgmtWrapper *pWrapper = &pDnode->wrappers[ntype];
|
||||||
SMgmtWrapper *pRetWrapper = pWrapper;
|
SMgmtWrapper *pRetWrapper = pWrapper;
|
||||||
|
|
||||||
|
@ -196,3 +190,40 @@ void dndReleaseWrapper(SMgmtWrapper *pWrapper) {
|
||||||
taosRUnLockLatch(&pWrapper->latch);
|
taosRUnLockLatch(&pWrapper->latch);
|
||||||
dTrace("node:%s, is released, refCount:%d", pWrapper->name, refCount);
|
dTrace("node:%s, is released, refCount:%d", pWrapper->name, refCount);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void dndSetMsgHandle(SMgmtWrapper *pWrapper, tmsg_t msgType, NodeMsgFp nodeMsgFp, int8_t vgId) {
|
||||||
|
pWrapper->msgFps[TMSG_INDEX(msgType)] = nodeMsgFp;
|
||||||
|
pWrapper->msgVgIds[TMSG_INDEX(msgType)] = vgId;
|
||||||
|
}
|
||||||
|
|
||||||
|
EDndStatus dndGetStatus(SDnode *pDnode) { return pDnode->status; }
|
||||||
|
|
||||||
|
void dndSetStatus(SDnode *pDnode, EDndStatus status) {
|
||||||
|
if (pDnode->status != status) {
|
||||||
|
dDebug("dnode status set from %s to %s", dndStatStr(pDnode->status), dndStatStr(status));
|
||||||
|
pDnode->status = status;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void dndReportStartup(SDnode *pDnode, const char *pName, const char *pDesc) {
|
||||||
|
SStartupReq *pStartup = &pDnode->startup;
|
||||||
|
tstrncpy(pStartup->name, pName, TSDB_STEP_NAME_LEN);
|
||||||
|
tstrncpy(pStartup->desc, pDesc, TSDB_STEP_DESC_LEN);
|
||||||
|
pStartup->finished = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void dndGetStartup(SDnode *pDnode, SStartupReq *pStartup) {
|
||||||
|
memcpy(pStartup, &pDnode->startup, sizeof(SStartupReq));
|
||||||
|
pStartup->finished = (dndGetStatus(pDnode) == DND_STAT_RUNNING);
|
||||||
|
}
|
||||||
|
|
||||||
|
void dndProcessStartupReq(SDnode *pDnode, SRpcMsg *pReq) {
|
||||||
|
dDebug("startup req is received");
|
||||||
|
SStartupReq *pStartup = rpcMallocCont(sizeof(SStartupReq));
|
||||||
|
dndGetStartup(pDnode, pStartup);
|
||||||
|
|
||||||
|
dDebug("startup req is sent, step:%s desc:%s finished:%d", pStartup->name, pStartup->desc, pStartup->finished);
|
||||||
|
SRpcMsg rpcRsp = {
|
||||||
|
.handle = pReq->handle, .pCont = pStartup, .contLen = sizeof(SStartupReq), .ahandle = pReq->ahandle};
|
||||||
|
rpcSendResponse(&rpcRsp);
|
||||||
|
}
|
|
@ -0,0 +1,489 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2019 TAOS Data, Inc. <jhtao@taosdata.com>
|
||||||
|
*
|
||||||
|
* This program is free software: you can use, redistribute, and/or modify
|
||||||
|
* it under the terms of the GNU Affero General Public License, version 3
|
||||||
|
* or later ("AGPL"), as published by the Free Software Foundation.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful, but WITHOUT
|
||||||
|
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||||
|
* FITNESS FOR A PARTICULAR PURPOSE.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Affero General Public License
|
||||||
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#define _DEFAULT_SOURCE
|
||||||
|
#include "dndInt.h"
|
||||||
|
|
||||||
|
#define INTERNAL_USER "_dnd"
|
||||||
|
#define INTERNAL_CKEY "_key"
|
||||||
|
#define INTERNAL_SECRET "_pwd"
|
||||||
|
|
||||||
|
static void dndUpdateMnodeEpSet(SDnode *pDnode, SEpSet *pEpSet) {
|
||||||
|
SMgmtWrapper *pWrapper = &pDnode->wrappers[DNODE];
|
||||||
|
dmUpdateMnodeEpSet(pWrapper->pMgmt, pEpSet);
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline NodeMsgFp dndGetMsgFp(SMgmtWrapper *pWrapper, SRpcMsg *pRpc) {
|
||||||
|
NodeMsgFp msgFp = pWrapper->msgFps[TMSG_INDEX(pRpc->msgType)];
|
||||||
|
if (msgFp == NULL) {
|
||||||
|
terrno = TSDB_CODE_MSG_NOT_PROCESSED;
|
||||||
|
}
|
||||||
|
|
||||||
|
return msgFp;
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline int32_t dndBuildMsg(SNodeMsg *pMsg, SRpcMsg *pRpc) {
|
||||||
|
SRpcConnInfo connInfo = {0};
|
||||||
|
if ((pRpc->msgType & 1U) && rpcGetConnInfo(pRpc->handle, &connInfo) != 0) {
|
||||||
|
terrno = TSDB_CODE_MND_NO_USER_FROM_CONN;
|
||||||
|
dError("failed to build msg since %s, app:%p handle:%p", terrstr(), pRpc->ahandle, pRpc->handle);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
memcpy(pMsg->user, connInfo.user, TSDB_USER_LEN);
|
||||||
|
pMsg->clientIp = connInfo.clientIp;
|
||||||
|
pMsg->clientPort = connInfo.clientPort;
|
||||||
|
memcpy(&pMsg->rpcMsg, pRpc, sizeof(SRpcMsg));
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void dndProcessRpcMsg(SMgmtWrapper *pWrapper, SRpcMsg *pRpc, SEpSet *pEpSet) {
|
||||||
|
int32_t code = -1;
|
||||||
|
SNodeMsg *pMsg = NULL;
|
||||||
|
NodeMsgFp msgFp = NULL;
|
||||||
|
|
||||||
|
if (pEpSet && pEpSet->numOfEps > 0 && pRpc->msgType == TDMT_MND_STATUS_RSP) {
|
||||||
|
dndUpdateMnodeEpSet(pWrapper->pDnode, pEpSet);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (dndMarkWrapper(pWrapper) != 0) goto _OVER;
|
||||||
|
if ((msgFp = dndGetMsgFp(pWrapper, pRpc)) == NULL) goto _OVER;
|
||||||
|
if ((pMsg = taosAllocateQitem(sizeof(SNodeMsg))) == NULL) goto _OVER;
|
||||||
|
if (dndBuildMsg(pMsg, pRpc) != 0) goto _OVER;
|
||||||
|
|
||||||
|
if (pWrapper->procType == PROC_SINGLE) {
|
||||||
|
dTrace("msg:%p, is created, handle:%p user:%s", pMsg, pRpc->handle, pMsg->user);
|
||||||
|
code = (*msgFp)(pWrapper, pMsg);
|
||||||
|
} else if (pWrapper->procType == PROC_PARENT) {
|
||||||
|
dTrace("msg:%p, is created and put into child queue, handle:%p user:%s", pMsg, pRpc->handle, pMsg->user);
|
||||||
|
code = taosProcPutToChildQ(pWrapper->pProc, pMsg, sizeof(SNodeMsg), pRpc->pCont, pRpc->contLen, pRpc->handle,
|
||||||
|
PROC_REQ);
|
||||||
|
} else {
|
||||||
|
dTrace("msg:%p, should not processed in child process, handle:%p user:%s", pMsg, pRpc->handle, pMsg->user);
|
||||||
|
ASSERT(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
_OVER:
|
||||||
|
if (code == 0) {
|
||||||
|
if (pWrapper->procType == PROC_PARENT) {
|
||||||
|
dTrace("msg:%p, is freed in parent process", pMsg);
|
||||||
|
taosFreeQitem(pMsg);
|
||||||
|
rpcFreeCont(pRpc->pCont);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
dError("msg:%p, failed to process since 0x%04x:%s", pMsg, code & 0XFFFF, terrstr());
|
||||||
|
if (pRpc->msgType & 1U) {
|
||||||
|
SRpcMsg rsp = {.handle = pRpc->handle, .ahandle = pRpc->ahandle, .code = terrno};
|
||||||
|
tmsgSendRsp(&rsp);
|
||||||
|
}
|
||||||
|
dTrace("msg:%p, is freed", pMsg);
|
||||||
|
taosFreeQitem(pMsg);
|
||||||
|
rpcFreeCont(pRpc->pCont);
|
||||||
|
}
|
||||||
|
|
||||||
|
dndReleaseWrapper(pWrapper);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void dndProcessMsg(SDnode *pDnode, SRpcMsg *pMsg, SEpSet *pEpSet) {
|
||||||
|
STransMgmt *pMgmt = &pDnode->trans;
|
||||||
|
tmsg_t msgType = pMsg->msgType;
|
||||||
|
bool isReq = msgType & 1u;
|
||||||
|
SMsgHandle *pHandle = &pMgmt->msgHandles[TMSG_INDEX(msgType)];
|
||||||
|
SMgmtWrapper *pWrapper = pHandle->pWrapper;
|
||||||
|
|
||||||
|
if (msgType == TDMT_DND_NETWORK_TEST) {
|
||||||
|
dTrace("network test req will be processed, handle:%p, app:%p", pMsg->handle, pMsg->ahandle);
|
||||||
|
dndProcessStartupReq(pDnode, pMsg);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (dndGetStatus(pDnode) != DND_STAT_RUNNING) {
|
||||||
|
dError("msg:%s ignored since dnode not running, handle:%p app:%p", TMSG_INFO(msgType), pMsg->handle, pMsg->ahandle);
|
||||||
|
if (isReq) {
|
||||||
|
SRpcMsg rspMsg = {.handle = pMsg->handle, .code = TSDB_CODE_APP_NOT_READY, .ahandle = pMsg->ahandle};
|
||||||
|
rpcSendResponse(&rspMsg);
|
||||||
|
}
|
||||||
|
rpcFreeCont(pMsg->pCont);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (isReq && pMsg->pCont == NULL) {
|
||||||
|
dError("req:%s not processed since its empty, handle:%p app:%p", TMSG_INFO(msgType), pMsg->handle, pMsg->ahandle);
|
||||||
|
SRpcMsg rspMsg = {.handle = pMsg->handle, .code = TSDB_CODE_DND_INVALID_MSG_LEN, .ahandle = pMsg->ahandle};
|
||||||
|
rpcSendResponse(&rspMsg);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (pWrapper == NULL) {
|
||||||
|
dError("msg:%s not processed since no handle, handle:%p app:%p", TMSG_INFO(msgType), pMsg->handle, pMsg->ahandle);
|
||||||
|
if (isReq) {
|
||||||
|
SRpcMsg rspMsg = {.handle = pMsg->handle, .code = TSDB_CODE_MSG_NOT_PROCESSED, .ahandle = pMsg->ahandle};
|
||||||
|
rpcSendResponse(&rspMsg);
|
||||||
|
}
|
||||||
|
rpcFreeCont(pMsg->pCont);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (pHandle->pMndWrapper != NULL || pHandle->pQndWrapper != NULL) {
|
||||||
|
SMsgHead *pHead = pMsg->pCont;
|
||||||
|
int32_t vgId = ntohl(pHead->vgId);
|
||||||
|
if (vgId == QNODE_HANDLE) {
|
||||||
|
pWrapper = pHandle->pQndWrapper;
|
||||||
|
} else if (vgId == MNODE_HANDLE) {
|
||||||
|
pWrapper = pHandle->pMndWrapper;
|
||||||
|
} else {
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
dTrace("msg:%s will be processed by %s, app:%p", TMSG_INFO(msgType), pWrapper->name, pMsg->ahandle);
|
||||||
|
dndProcessRpcMsg(pWrapper, pMsg, pEpSet);
|
||||||
|
}
|
||||||
|
|
||||||
|
static int32_t dndInitClient(SDnode *pDnode) {
|
||||||
|
STransMgmt *pMgmt = &pDnode->trans;
|
||||||
|
|
||||||
|
SRpcInit rpcInit;
|
||||||
|
memset(&rpcInit, 0, sizeof(rpcInit));
|
||||||
|
rpcInit.label = "DND";
|
||||||
|
rpcInit.numOfThreads = 1;
|
||||||
|
rpcInit.cfp = (RpcCfp)dndProcessMsg;
|
||||||
|
rpcInit.sessions = 1024;
|
||||||
|
rpcInit.connType = TAOS_CONN_CLIENT;
|
||||||
|
rpcInit.idleTime = tsShellActivityTimer * 1000;
|
||||||
|
rpcInit.user = INTERNAL_USER;
|
||||||
|
rpcInit.ckey = INTERNAL_CKEY;
|
||||||
|
rpcInit.spi = 1;
|
||||||
|
rpcInit.parent = pDnode;
|
||||||
|
|
||||||
|
char pass[TSDB_PASSWORD_LEN + 1] = {0};
|
||||||
|
taosEncryptPass_c((uint8_t *)(INTERNAL_SECRET), strlen(INTERNAL_SECRET), pass);
|
||||||
|
rpcInit.secret = pass;
|
||||||
|
|
||||||
|
pMgmt->clientRpc = rpcOpen(&rpcInit);
|
||||||
|
if (pMgmt->clientRpc == NULL) {
|
||||||
|
dError("failed to init dnode rpc client");
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
dDebug("dnode rpc client is initialized");
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void dndCleanupClient(SDnode *pDnode) {
|
||||||
|
STransMgmt *pMgmt = &pDnode->trans;
|
||||||
|
if (pMgmt->clientRpc) {
|
||||||
|
rpcClose(pMgmt->clientRpc);
|
||||||
|
pMgmt->clientRpc = NULL;
|
||||||
|
dDebug("dnode rpc client is closed");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline void dndSendMsgToMnodeRecv(SDnode *pDnode, SRpcMsg *pReq, SRpcMsg *pRsp) {
|
||||||
|
SEpSet epSet = {0};
|
||||||
|
SMgmtWrapper *pWrapper = &pDnode->wrappers[DNODE];
|
||||||
|
dmGetMnodeEpSet(pWrapper->pMgmt, &epSet);
|
||||||
|
rpcSendRecv(pDnode->trans.clientRpc, &epSet, pReq, pRsp);
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline int32_t dndGetHideUserAuth(SDnode *pDnode, char *user, char *spi, char *encrypt, char *secret,
|
||||||
|
char *ckey) {
|
||||||
|
int32_t code = 0;
|
||||||
|
char pass[TSDB_PASSWORD_LEN + 1] = {0};
|
||||||
|
|
||||||
|
if (strcmp(user, INTERNAL_USER) == 0) {
|
||||||
|
taosEncryptPass_c((uint8_t *)(INTERNAL_SECRET), strlen(INTERNAL_SECRET), pass);
|
||||||
|
} else if (strcmp(user, TSDB_NETTEST_USER) == 0) {
|
||||||
|
taosEncryptPass_c((uint8_t *)(TSDB_NETTEST_USER), strlen(TSDB_NETTEST_USER), pass);
|
||||||
|
} else {
|
||||||
|
code = -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (code == 0) {
|
||||||
|
memcpy(secret, pass, TSDB_PASSWORD_LEN);
|
||||||
|
*spi = 1;
|
||||||
|
*encrypt = 0;
|
||||||
|
*ckey = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
return code;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int32_t dndRetrieveUserAuthInfo(SDnode *pDnode, char *user, char *spi, char *encrypt, char *secret, char *ckey) {
|
||||||
|
if (dndGetHideUserAuth(pDnode, user, spi, encrypt, secret, ckey) == 0) {
|
||||||
|
dTrace("user:%s, get auth from mnode, spi:%d encrypt:%d", user, *spi, *encrypt);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
SAuthReq authReq = {0};
|
||||||
|
tstrncpy(authReq.user, user, TSDB_USER_LEN);
|
||||||
|
int32_t contLen = tSerializeSAuthReq(NULL, 0, &authReq);
|
||||||
|
void *pReq = rpcMallocCont(contLen);
|
||||||
|
tSerializeSAuthReq(pReq, contLen, &authReq);
|
||||||
|
|
||||||
|
SRpcMsg rpcMsg = {.pCont = pReq, .contLen = contLen, .msgType = TDMT_MND_AUTH, .ahandle = (void *)9528};
|
||||||
|
SRpcMsg rpcRsp = {0};
|
||||||
|
dTrace("user:%s, send user auth req to other mnodes, spi:%d encrypt:%d", user, authReq.spi, authReq.encrypt);
|
||||||
|
dndSendMsgToMnodeRecv(pDnode, &rpcMsg, &rpcRsp);
|
||||||
|
|
||||||
|
if (rpcRsp.code != 0) {
|
||||||
|
terrno = rpcRsp.code;
|
||||||
|
dError("user:%s, failed to get user auth from other mnodes since %s", user, terrstr());
|
||||||
|
} else {
|
||||||
|
SAuthRsp authRsp = {0};
|
||||||
|
tDeserializeSAuthReq(rpcRsp.pCont, rpcRsp.contLen, &authRsp);
|
||||||
|
memcpy(secret, authRsp.secret, TSDB_PASSWORD_LEN);
|
||||||
|
memcpy(ckey, authRsp.ckey, TSDB_PASSWORD_LEN);
|
||||||
|
*spi = authRsp.spi;
|
||||||
|
*encrypt = authRsp.encrypt;
|
||||||
|
dTrace("user:%s, success to get user auth from other mnodes, spi:%d encrypt:%d", user, authRsp.spi,
|
||||||
|
authRsp.encrypt);
|
||||||
|
}
|
||||||
|
|
||||||
|
rpcFreeCont(rpcRsp.pCont);
|
||||||
|
return rpcRsp.code;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int32_t dndInitServer(SDnode *pDnode) {
|
||||||
|
STransMgmt *pMgmt = &pDnode->trans;
|
||||||
|
|
||||||
|
SRpcInit rpcInit;
|
||||||
|
memset(&rpcInit, 0, sizeof(rpcInit));
|
||||||
|
rpcInit.localPort = pDnode->serverPort;
|
||||||
|
rpcInit.label = "DND";
|
||||||
|
rpcInit.numOfThreads = tsNumOfRpcThreads;
|
||||||
|
rpcInit.cfp = (RpcCfp)dndProcessMsg;
|
||||||
|
rpcInit.sessions = tsMaxShellConns;
|
||||||
|
rpcInit.connType = TAOS_CONN_SERVER;
|
||||||
|
rpcInit.idleTime = tsShellActivityTimer * 1000;
|
||||||
|
rpcInit.afp = (RpcAfp)dndRetrieveUserAuthInfo;
|
||||||
|
rpcInit.parent = pDnode;
|
||||||
|
|
||||||
|
pMgmt->serverRpc = rpcOpen(&rpcInit);
|
||||||
|
if (pMgmt->serverRpc == NULL) {
|
||||||
|
dError("failed to init dnode rpc server");
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
dDebug("dnode rpc server is initialized");
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void dndCleanupServer(SDnode *pDnode) {
|
||||||
|
STransMgmt *pMgmt = &pDnode->trans;
|
||||||
|
if (pMgmt->serverRpc) {
|
||||||
|
rpcClose(pMgmt->serverRpc);
|
||||||
|
pMgmt->serverRpc = NULL;
|
||||||
|
dDebug("dnode rpc server is closed");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
int32_t dndInitTrans(SDnode *pDnode) {
|
||||||
|
if (dndInitServer(pDnode) != 0) return -1;
|
||||||
|
if (dndInitClient(pDnode) != 0) return -1;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
void dndCleanupTrans(SDnode *pDnode) {
|
||||||
|
dndCleanupServer(pDnode);
|
||||||
|
dndCleanupClient(pDnode);
|
||||||
|
}
|
||||||
|
|
||||||
|
int32_t dndInitMsgHandle(SDnode *pDnode) {
|
||||||
|
STransMgmt *pMgmt = &pDnode->trans;
|
||||||
|
|
||||||
|
for (EDndType n = 0; n < NODE_MAX; ++n) {
|
||||||
|
SMgmtWrapper *pWrapper = &pDnode->wrappers[n];
|
||||||
|
|
||||||
|
for (int32_t msgIndex = 0; msgIndex < TDMT_MAX; ++msgIndex) {
|
||||||
|
NodeMsgFp msgFp = pWrapper->msgFps[msgIndex];
|
||||||
|
int8_t vgId = pWrapper->msgVgIds[msgIndex];
|
||||||
|
if (msgFp == NULL) continue;
|
||||||
|
|
||||||
|
SMsgHandle *pHandle = &pMgmt->msgHandles[msgIndex];
|
||||||
|
if (vgId == QNODE_HANDLE) {
|
||||||
|
if (pHandle->pQndWrapper != NULL) {
|
||||||
|
dError("msg:%s has multiple process nodes", tMsgInfo[msgIndex]);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
pHandle->pQndWrapper = pWrapper;
|
||||||
|
} else if (vgId == MNODE_HANDLE) {
|
||||||
|
if (pHandle->pMndWrapper != NULL) {
|
||||||
|
dError("msg:%s has multiple process nodes", tMsgInfo[msgIndex]);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
pHandle->pMndWrapper = pWrapper;
|
||||||
|
} else {
|
||||||
|
if (pHandle->pWrapper != NULL) {
|
||||||
|
dError("msg:%s has multiple process nodes", tMsgInfo[msgIndex]);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
pHandle->pWrapper = pWrapper;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int32_t dndSendRpcReq(STransMgmt *pMgmt, const SEpSet *pEpSet, SRpcMsg *pReq) {
|
||||||
|
if (pMgmt->clientRpc == NULL) {
|
||||||
|
terrno = TSDB_CODE_DND_OFFLINE;
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
rpcSendRequest(pMgmt->clientRpc, pEpSet, pReq, NULL);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void dndSendRpcRsp(SMgmtWrapper *pWrapper, const SRpcMsg *pRsp) {
|
||||||
|
if (pRsp->code == TSDB_CODE_APP_NOT_READY) {
|
||||||
|
if (pWrapper->ntype == MNODE) {
|
||||||
|
dmSendRedirectRsp(pWrapper->pMgmt, pRsp);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
rpcSendResponse(pRsp);
|
||||||
|
}
|
||||||
|
|
||||||
|
static int32_t dndSendReq(SMgmtWrapper *pWrapper, const SEpSet *pEpSet, SRpcMsg *pReq) {
|
||||||
|
if (dndGetStatus(pWrapper->pDnode) != DND_STAT_RUNNING) {
|
||||||
|
terrno = TSDB_CODE_DND_OFFLINE;
|
||||||
|
dError("failed to send rpc msg since %s, handle:%p", terrstr(), pReq->handle);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (pWrapper->procType != PROC_CHILD) {
|
||||||
|
return dndSendRpcReq(&pWrapper->pDnode->trans, pEpSet, pReq);
|
||||||
|
} else {
|
||||||
|
char *pHead = taosMemoryMalloc(sizeof(SRpcMsg) + sizeof(SEpSet));
|
||||||
|
if (pHead == NULL) {
|
||||||
|
terrno = TSDB_CODE_OUT_OF_MEMORY;
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
memcpy(pHead, pReq, sizeof(SRpcMsg));
|
||||||
|
memcpy(pHead + sizeof(SRpcMsg), pEpSet, sizeof(SEpSet));
|
||||||
|
taosProcPutToParentQ(pWrapper->pProc, pHead, sizeof(SRpcMsg) + sizeof(SEpSet), pReq->pCont, pReq->contLen,
|
||||||
|
PROC_REQ);
|
||||||
|
taosMemoryFree(pHead);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void dndSendRsp(SMgmtWrapper *pWrapper, const SRpcMsg *pRsp) {
|
||||||
|
if (pWrapper->procType != PROC_CHILD) {
|
||||||
|
dndSendRpcRsp(pWrapper, pRsp);
|
||||||
|
} else {
|
||||||
|
taosProcPutToParentQ(pWrapper->pProc, pRsp, sizeof(SRpcMsg), pRsp->pCont, pRsp->contLen, PROC_RSP);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void dndRegisterBrokenLinkArg(SMgmtWrapper *pWrapper, SRpcMsg *pMsg) {
|
||||||
|
if (pWrapper->procType != PROC_CHILD) {
|
||||||
|
rpcRegisterBrokenLinkArg(pMsg);
|
||||||
|
} else {
|
||||||
|
taosProcPutToParentQ(pWrapper->pProc, pMsg, sizeof(SRpcMsg), pMsg->pCont, pMsg->contLen, PROC_REGIST);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void dndReleaseHandle(SMgmtWrapper *pWrapper, void *handle, int8_t type) {
|
||||||
|
if (pWrapper->procType != PROC_CHILD) {
|
||||||
|
rpcReleaseHandle(handle, type);
|
||||||
|
} else {
|
||||||
|
SRpcMsg msg = {.handle = handle, .code = type};
|
||||||
|
taosProcPutToParentQ(pWrapper->pProc, &msg, sizeof(SRpcMsg), NULL, 0, PROC_RELEASE);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
SMsgCb dndCreateMsgcb(SMgmtWrapper *pWrapper) {
|
||||||
|
SMsgCb msgCb = {
|
||||||
|
.pWrapper = pWrapper,
|
||||||
|
.sendReqFp = dndSendReq,
|
||||||
|
.sendRspFp = dndSendRsp,
|
||||||
|
.registerBrokenLinkArgFp = dndRegisterBrokenLinkArg,
|
||||||
|
.releaseHandleFp = dndReleaseHandle,
|
||||||
|
};
|
||||||
|
return msgCb;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void dndConsumeChildQueue(SMgmtWrapper *pWrapper, SNodeMsg *pMsg, int16_t msgLen, void *pCont, int32_t contLen,
|
||||||
|
ProcFuncType ftype) {
|
||||||
|
SRpcMsg *pRpc = &pMsg->rpcMsg;
|
||||||
|
pRpc->pCont = pCont;
|
||||||
|
dTrace("msg:%p, get from child queue, handle:%p app:%p", pMsg, pRpc->handle, pRpc->ahandle);
|
||||||
|
|
||||||
|
NodeMsgFp msgFp = pWrapper->msgFps[TMSG_INDEX(pRpc->msgType)];
|
||||||
|
int32_t code = (*msgFp)(pWrapper, pMsg);
|
||||||
|
|
||||||
|
if (code != 0) {
|
||||||
|
dError("msg:%p, failed to process since code:0x%04x:%s", pMsg, code & 0XFFFF, tstrerror(code));
|
||||||
|
if (pRpc->msgType & 1U) {
|
||||||
|
SRpcMsg rsp = {.handle = pRpc->handle, .ahandle = pRpc->ahandle, .code = terrno};
|
||||||
|
dndSendRsp(pWrapper, &rsp);
|
||||||
|
}
|
||||||
|
|
||||||
|
dTrace("msg:%p, is freed", pMsg);
|
||||||
|
taosFreeQitem(pMsg);
|
||||||
|
rpcFreeCont(pCont);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void dndConsumeParentQueue(SMgmtWrapper *pWrapper, SRpcMsg *pMsg, int16_t msgLen, void *pCont, int32_t contLen,
|
||||||
|
ProcFuncType ftype) {
|
||||||
|
pMsg->pCont = pCont;
|
||||||
|
dTrace("msg:%p, get from parent queue, ftype:%d handle:%p, app:%p", pMsg, ftype, pMsg->handle, pMsg->ahandle);
|
||||||
|
|
||||||
|
switch (ftype) {
|
||||||
|
case PROC_REGIST:
|
||||||
|
rpcRegisterBrokenLinkArg(pMsg);
|
||||||
|
break;
|
||||||
|
case PROC_RELEASE:
|
||||||
|
taosProcRemoveHandle(pWrapper->pProc, pMsg->handle);
|
||||||
|
rpcReleaseHandle(pMsg->handle, (int8_t)pMsg->code);
|
||||||
|
rpcFreeCont(pCont);
|
||||||
|
break;
|
||||||
|
case PROC_REQ:
|
||||||
|
dndSendRpcReq(&pWrapper->pDnode->trans, (SEpSet *)((char *)pMsg + sizeof(SRpcMsg)), pMsg);
|
||||||
|
break;
|
||||||
|
case PROC_RSP:
|
||||||
|
taosProcRemoveHandle(pWrapper->pProc, pMsg->handle);
|
||||||
|
dndSendRpcRsp(pWrapper, pMsg);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
taosMemoryFree(pMsg);
|
||||||
|
}
|
||||||
|
|
||||||
|
SProcCfg dndGenProcCfg(SMgmtWrapper *pWrapper) {
|
||||||
|
SProcCfg cfg = {.childConsumeFp = (ProcConsumeFp)dndConsumeChildQueue,
|
||||||
|
.childMallocHeadFp = (ProcMallocFp)taosAllocateQitem,
|
||||||
|
.childFreeHeadFp = (ProcFreeFp)taosFreeQitem,
|
||||||
|
.childMallocBodyFp = (ProcMallocFp)rpcMallocCont,
|
||||||
|
.childFreeBodyFp = (ProcFreeFp)rpcFreeCont,
|
||||||
|
.parentConsumeFp = (ProcConsumeFp)dndConsumeParentQueue,
|
||||||
|
.parentMallocHeadFp = (ProcMallocFp)taosMemoryMalloc,
|
||||||
|
.parentFreeHeadFp = (ProcFreeFp)taosMemoryFree,
|
||||||
|
.parentMallocBodyFp = (ProcMallocFp)rpcMallocCont,
|
||||||
|
.parentFreeBodyFp = (ProcFreeFp)rpcFreeCont,
|
||||||
|
.shm = pWrapper->shm,
|
||||||
|
.parent = pWrapper,
|
||||||
|
.name = pWrapper->name};
|
||||||
|
return cfg;
|
||||||
|
}
|
||||||
|
|
||||||
|
void dndSendRecv(SDnode *pDnode, SEpSet *pEpSet, SRpcMsg *pReq, SRpcMsg *pRsp) {
|
||||||
|
rpcSendRecv(pDnode->trans.clientRpc, pEpSet, pReq, pRsp);
|
||||||
|
}
|
|
@ -1,65 +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_DND_INT_H_
|
|
||||||
#define _TD_DND_INT_H_
|
|
||||||
|
|
||||||
#include "dnd.h"
|
|
||||||
|
|
||||||
#include "bm.h"
|
|
||||||
#include "dm.h"
|
|
||||||
#include "mm.h"
|
|
||||||
#include "qm.h"
|
|
||||||
#include "sm.h"
|
|
||||||
#include "vm.h"
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
extern "C" {
|
|
||||||
#endif
|
|
||||||
|
|
||||||
// dndInt.c
|
|
||||||
int32_t dndInit();
|
|
||||||
void dndCleanup();
|
|
||||||
const char *dndStatStr(EDndStatus stat);
|
|
||||||
void dndGetStartup(SDnode *pDnode, SStartupReq *pStartup);
|
|
||||||
void dndProcessStartupReq(SDnode *pDnode, SRpcMsg *pMsg);
|
|
||||||
|
|
||||||
// dndMsg.c
|
|
||||||
void dndProcessRpcMsg(SMgmtWrapper *pWrapper, SRpcMsg *pMsg, SEpSet *pEpSet);
|
|
||||||
|
|
||||||
// dndExec.c
|
|
||||||
int32_t dndOpenNode(SMgmtWrapper *pWrapper);
|
|
||||||
void dndCloseNode(SMgmtWrapper *pWrapper);
|
|
||||||
int32_t dndRun(SDnode *pDnode);
|
|
||||||
|
|
||||||
// dndObj.c
|
|
||||||
SDnode *dndCreate(const SDnodeOpt *pOption);
|
|
||||||
void dndClose(SDnode *pDnode);
|
|
||||||
void dndHandleEvent(SDnode *pDnode, EDndEvent event);
|
|
||||||
|
|
||||||
// dndTransport.c
|
|
||||||
int32_t dndInitMsgHandle(SDnode *pDnode);
|
|
||||||
void dndSendRpcRsp(SMgmtWrapper *pWrapper, const SRpcMsg *pRsp);
|
|
||||||
|
|
||||||
// dndFile.c
|
|
||||||
TdFilePtr dndCheckRunning(const char *dataDir);
|
|
||||||
int32_t dndReadShmFile(SDnode *pDnode);
|
|
||||||
int32_t dndWriteShmFile(SDnode *pDnode);
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif /*_TD_DND_INT_H_*/
|
|
|
@ -1,107 +0,0 @@
|
||||||
/*
|
|
||||||
* Copyright (c) 2019 TAOS Data, Inc. <jhtao@taosdata.com>
|
|
||||||
*
|
|
||||||
* This program is free software: you can use, redistribute, and/or modify
|
|
||||||
* it under the terms of the GNU Affero General Public License, version 3
|
|
||||||
* or later ("AGPL"), as published by the Free Software Foundation.
|
|
||||||
*
|
|
||||||
* This program is distributed in the hope that it will be useful, but WITHOUT
|
|
||||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
|
||||||
* FITNESS FOR A PARTICULAR PURPOSE.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU Affero General Public License
|
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#define _DEFAULT_SOURCE
|
|
||||||
#include "dndInt.h"
|
|
||||||
|
|
||||||
static int32_t dndGetMonitorDiskInfo(SDnode *pDnode, SMonDiskInfo *pInfo) {
|
|
||||||
tstrncpy(pInfo->logdir.name, tsLogDir, sizeof(pInfo->logdir.name));
|
|
||||||
pInfo->logdir.size = tsLogSpace.size;
|
|
||||||
tstrncpy(pInfo->tempdir.name, tsTempDir, sizeof(pInfo->tempdir.name));
|
|
||||||
pInfo->tempdir.size = tsTempSpace.size;
|
|
||||||
|
|
||||||
SMgmtWrapper *pWrapper = dndAcquireWrapper(pDnode, VNODES);
|
|
||||||
if (pWrapper != NULL) {
|
|
||||||
vmMonitorTfsInfo(pWrapper, pInfo);
|
|
||||||
dndReleaseWrapper(pWrapper);
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void dndGetMonitorBasicInfo(SDnode *pDnode, SMonBasicInfo *pInfo) {
|
|
||||||
pInfo->protocol = 1;
|
|
||||||
pInfo->dnode_id = pDnode->dnodeId;
|
|
||||||
pInfo->cluster_id = pDnode->clusterId;
|
|
||||||
tstrncpy(pInfo->dnode_ep, tsLocalEp, TSDB_EP_LEN);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void dndGetMonitorDnodeInfo(SDnode *pDnode, SMonDnodeInfo *pInfo) {
|
|
||||||
pInfo->uptime = (taosGetTimestampMs() - pDnode->rebootTime) / (86400000.0f);
|
|
||||||
taosGetCpuUsage(&pInfo->cpu_engine, &pInfo->cpu_system);
|
|
||||||
taosGetCpuCores(&pInfo->cpu_cores);
|
|
||||||
taosGetProcMemory(&pInfo->mem_engine);
|
|
||||||
taosGetSysMemory(&pInfo->mem_system);
|
|
||||||
pInfo->mem_total = tsTotalMemoryKB;
|
|
||||||
pInfo->disk_engine = 0;
|
|
||||||
pInfo->disk_used = tsDataSpace.size.used;
|
|
||||||
pInfo->disk_total = tsDataSpace.size.total;
|
|
||||||
taosGetCardInfo(&pInfo->net_in, &pInfo->net_out);
|
|
||||||
taosGetProcIO(&pInfo->io_read, &pInfo->io_write, &pInfo->io_read_disk, &pInfo->io_write_disk);
|
|
||||||
|
|
||||||
SMgmtWrapper *pWrapper = dndAcquireWrapper(pDnode, VNODES);
|
|
||||||
if (pWrapper != NULL) {
|
|
||||||
vmMonitorVnodeReqs(pWrapper, pInfo);
|
|
||||||
dndReleaseWrapper(pWrapper);
|
|
||||||
}
|
|
||||||
|
|
||||||
pWrapper = dndAcquireWrapper(pDnode, MNODE);
|
|
||||||
if (pWrapper != NULL) {
|
|
||||||
pInfo->has_mnode = pWrapper->required;
|
|
||||||
dndReleaseWrapper(pWrapper);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void dndSendMonitorReport(SDnode *pDnode) {
|
|
||||||
if (!tsEnableMonitor || tsMonitorFqdn[0] == 0 || tsMonitorPort == 0) return;
|
|
||||||
dTrace("send monitor report to %s:%u", tsMonitorFqdn, tsMonitorPort);
|
|
||||||
|
|
||||||
SMonInfo *pMonitor = monCreateMonitorInfo();
|
|
||||||
if (pMonitor == NULL) return;
|
|
||||||
|
|
||||||
SMonBasicInfo basicInfo = {0};
|
|
||||||
dndGetMonitorBasicInfo(pDnode, &basicInfo);
|
|
||||||
monSetBasicInfo(pMonitor, &basicInfo);
|
|
||||||
|
|
||||||
SMonClusterInfo clusterInfo = {0};
|
|
||||||
SMonVgroupInfo vgroupInfo = {0};
|
|
||||||
SMonGrantInfo grantInfo = {0};
|
|
||||||
|
|
||||||
SMgmtWrapper *pWrapper = dndAcquireWrapper(pDnode, MNODE);
|
|
||||||
if (pWrapper != NULL) {
|
|
||||||
if (mmMonitorMnodeInfo(pWrapper, &clusterInfo, &vgroupInfo, &grantInfo) == 0) {
|
|
||||||
monSetClusterInfo(pMonitor, &clusterInfo);
|
|
||||||
monSetVgroupInfo(pMonitor, &vgroupInfo);
|
|
||||||
monSetGrantInfo(pMonitor, &grantInfo);
|
|
||||||
}
|
|
||||||
dndReleaseWrapper(pWrapper);
|
|
||||||
}
|
|
||||||
|
|
||||||
SMonDnodeInfo dnodeInfo = {0};
|
|
||||||
dndGetMonitorDnodeInfo(pDnode, &dnodeInfo);
|
|
||||||
monSetDnodeInfo(pMonitor, &dnodeInfo);
|
|
||||||
|
|
||||||
SMonDiskInfo diskInfo = {0};
|
|
||||||
if (dndGetMonitorDiskInfo(pDnode, &diskInfo) == 0) {
|
|
||||||
monSetDiskInfo(pMonitor, &diskInfo);
|
|
||||||
}
|
|
||||||
|
|
||||||
taosArrayDestroy(clusterInfo.dnodes);
|
|
||||||
taosArrayDestroy(clusterInfo.mnodes);
|
|
||||||
taosArrayDestroy(vgroupInfo.vgroups);
|
|
||||||
taosArrayDestroy(diskInfo.datadirs);
|
|
||||||
|
|
||||||
monSendReport(pMonitor);
|
|
||||||
monCleanupMonitorInfo(pMonitor);
|
|
||||||
}
|
|
|
@ -1,174 +0,0 @@
|
||||||
/*
|
|
||||||
* Copyright (c) 2019 TAOS Data, Inc. <jhtao@taosdata.com>
|
|
||||||
*
|
|
||||||
* This program is free software: you can use, redistribute, and/or modify
|
|
||||||
* it under the terms of the GNU Affero General Public License, version 3
|
|
||||||
* or later ("AGPL"), as published by the Free Software Foundation.
|
|
||||||
*
|
|
||||||
* This program is distributed in the hope that it will be useful, but WITHOUT
|
|
||||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
|
||||||
* FITNESS FOR A PARTICULAR PURPOSE.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU Affero General Public License
|
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#define _DEFAULT_SOURCE
|
|
||||||
#include "dndInt.h"
|
|
||||||
|
|
||||||
static void dndUpdateMnodeEpSet(SDnode *pDnode, SEpSet *pEpSet) {
|
|
||||||
SMgmtWrapper *pWrapper = dndAcquireWrapper(pDnode, DNODE);
|
|
||||||
if (pWrapper != NULL) {
|
|
||||||
dmUpdateMnodeEpSet(pWrapper->pMgmt, pEpSet);
|
|
||||||
dndReleaseWrapper(pWrapper);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline NodeMsgFp dndGetMsgFp(SMgmtWrapper *pWrapper, SRpcMsg *pRpc) {
|
|
||||||
NodeMsgFp msgFp = pWrapper->msgFps[TMSG_INDEX(pRpc->msgType)];
|
|
||||||
if (msgFp == NULL) {
|
|
||||||
terrno = TSDB_CODE_MSG_NOT_PROCESSED;
|
|
||||||
}
|
|
||||||
|
|
||||||
return msgFp;
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline int32_t dndBuildMsg(SNodeMsg *pMsg, SRpcMsg *pRpc) {
|
|
||||||
SRpcConnInfo connInfo = {0};
|
|
||||||
if ((pRpc->msgType & 1U) && rpcGetConnInfo(pRpc->handle, &connInfo) != 0) {
|
|
||||||
terrno = TSDB_CODE_MND_NO_USER_FROM_CONN;
|
|
||||||
dError("failed to build msg since %s, app:%p RPC:%p", terrstr(), pRpc->ahandle, pRpc->handle);
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
memcpy(pMsg->user, connInfo.user, TSDB_USER_LEN);
|
|
||||||
pMsg->clientIp = connInfo.clientIp;
|
|
||||||
pMsg->clientPort = connInfo.clientPort;
|
|
||||||
memcpy(&pMsg->rpcMsg, pRpc, sizeof(SRpcMsg));
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
void dndProcessRpcMsg(SMgmtWrapper *pWrapper, SRpcMsg *pRpc, SEpSet *pEpSet) {
|
|
||||||
int32_t code = -1;
|
|
||||||
SNodeMsg *pMsg = NULL;
|
|
||||||
NodeMsgFp msgFp = NULL;
|
|
||||||
|
|
||||||
if (pEpSet && pEpSet->numOfEps > 0 && pRpc->msgType == TDMT_MND_STATUS_RSP) {
|
|
||||||
dndUpdateMnodeEpSet(pWrapper->pDnode, pEpSet);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (dndMarkWrapper(pWrapper) != 0) goto _OVER;
|
|
||||||
if ((msgFp = dndGetMsgFp(pWrapper, pRpc)) == NULL) goto _OVER;
|
|
||||||
if ((pMsg = taosAllocateQitem(sizeof(SNodeMsg))) == NULL) goto _OVER;
|
|
||||||
if (dndBuildMsg(pMsg, pRpc) != 0) goto _OVER;
|
|
||||||
|
|
||||||
if (pWrapper->procType == PROC_SINGLE) {
|
|
||||||
dTrace("msg:%p, is created, handle:%p app:%p user:%s", pMsg, pRpc->handle, pRpc->ahandle, pMsg->user);
|
|
||||||
code = (*msgFp)(pWrapper, pMsg);
|
|
||||||
} else if (pWrapper->procType == PROC_PARENT) {
|
|
||||||
dTrace("msg:%p, is created and will put into child queue, handle:%p app:%p user:%s", pMsg, pRpc->handle,
|
|
||||||
pRpc->ahandle, pMsg->user);
|
|
||||||
code = taosProcPutToChildQ(pWrapper->pProc, pMsg, sizeof(SNodeMsg), pRpc->pCont, pRpc->contLen, PROC_REQ);
|
|
||||||
} else {
|
|
||||||
dTrace("msg:%p, should not processed in child process, handle:%p app:%p user:%s", pMsg, pRpc->handle, pRpc->ahandle,
|
|
||||||
pMsg->user);
|
|
||||||
ASSERT(1);
|
|
||||||
}
|
|
||||||
|
|
||||||
_OVER:
|
|
||||||
if (code == 0) {
|
|
||||||
if (pWrapper->procType == PROC_PARENT) {
|
|
||||||
dTrace("msg:%p, is freed in parent process", pMsg);
|
|
||||||
taosFreeQitem(pMsg);
|
|
||||||
rpcFreeCont(pRpc->pCont);
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
dError("msg:%p, failed to process since 0x%04x:%s", pMsg, code & 0XFFFF, terrstr());
|
|
||||||
if (pRpc->msgType & 1U) {
|
|
||||||
SRpcMsg rsp = {.handle = pRpc->handle, .ahandle = pRpc->ahandle, .code = terrno};
|
|
||||||
dndSendRsp(pWrapper, &rsp);
|
|
||||||
}
|
|
||||||
dTrace("msg:%p, is freed", pMsg);
|
|
||||||
taosFreeQitem(pMsg);
|
|
||||||
rpcFreeCont(pRpc->pCont);
|
|
||||||
}
|
|
||||||
|
|
||||||
dndReleaseWrapper(pWrapper);
|
|
||||||
}
|
|
||||||
|
|
||||||
static int32_t dndProcessCreateNodeMsg(SDnode *pDnode, ENodeType ntype, SNodeMsg *pMsg) {
|
|
||||||
SMgmtWrapper *pWrapper = dndAcquireWrapper(pDnode, ntype);
|
|
||||||
if (pWrapper != NULL) {
|
|
||||||
dndReleaseWrapper(pWrapper);
|
|
||||||
terrno = TSDB_CODE_NODE_ALREADY_DEPLOYED;
|
|
||||||
dError("failed to create node since %s", terrstr());
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
pWrapper = &pDnode->wrappers[ntype];
|
|
||||||
|
|
||||||
if (taosMkDir(pWrapper->path) != 0) {
|
|
||||||
terrno = TAOS_SYSTEM_ERROR(errno);
|
|
||||||
dError("failed to create dir:%s since %s", pWrapper->path, terrstr());
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
int32_t code = (*pWrapper->fp.createMsgFp)(pWrapper, pMsg);
|
|
||||||
if (code != 0) {
|
|
||||||
dError("node:%s, failed to open since %s", pWrapper->name, terrstr());
|
|
||||||
} else {
|
|
||||||
dDebug("node:%s, has been opened", pWrapper->name);
|
|
||||||
pWrapper->deployed = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
return code;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int32_t dndProcessDropNodeMsg(SDnode *pDnode, ENodeType ntype, SNodeMsg *pMsg) {
|
|
||||||
SMgmtWrapper *pWrapper = dndAcquireWrapper(pDnode, ntype);
|
|
||||||
if (pWrapper == NULL) {
|
|
||||||
terrno = TSDB_CODE_NODE_NOT_DEPLOYED;
|
|
||||||
dError("failed to drop node since %s", terrstr());
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
taosWLockLatch(&pWrapper->latch);
|
|
||||||
pWrapper->deployed = false;
|
|
||||||
|
|
||||||
int32_t code = (*pWrapper->fp.dropMsgFp)(pWrapper, pMsg);
|
|
||||||
if (code != 0) {
|
|
||||||
pWrapper->deployed = true;
|
|
||||||
dError("node:%s, failed to drop since %s", pWrapper->name, terrstr());
|
|
||||||
} else {
|
|
||||||
pWrapper->deployed = false;
|
|
||||||
dDebug("node:%s, has been dropped", pWrapper->name);
|
|
||||||
}
|
|
||||||
|
|
||||||
taosWUnLockLatch(&pWrapper->latch);
|
|
||||||
dndReleaseWrapper(pWrapper);
|
|
||||||
return code;
|
|
||||||
}
|
|
||||||
|
|
||||||
int32_t dndProcessNodeMsg(SDnode *pDnode, SNodeMsg *pMsg) {
|
|
||||||
switch (pMsg->rpcMsg.msgType) {
|
|
||||||
case TDMT_DND_CREATE_MNODE:
|
|
||||||
return dndProcessCreateNodeMsg(pDnode, MNODE, pMsg);
|
|
||||||
case TDMT_DND_DROP_MNODE:
|
|
||||||
return dndProcessDropNodeMsg(pDnode, MNODE, pMsg);
|
|
||||||
case TDMT_DND_CREATE_QNODE:
|
|
||||||
return dndProcessCreateNodeMsg(pDnode, QNODE, pMsg);
|
|
||||||
case TDMT_DND_DROP_QNODE:
|
|
||||||
return dndProcessDropNodeMsg(pDnode, QNODE, pMsg);
|
|
||||||
case TDMT_DND_CREATE_SNODE:
|
|
||||||
return dndProcessCreateNodeMsg(pDnode, SNODE, pMsg);
|
|
||||||
case TDMT_DND_DROP_SNODE:
|
|
||||||
return dndProcessDropNodeMsg(pDnode, SNODE, pMsg);
|
|
||||||
case TDMT_DND_CREATE_BNODE:
|
|
||||||
return dndProcessCreateNodeMsg(pDnode, BNODE, pMsg);
|
|
||||||
case TDMT_DND_DROP_BNODE:
|
|
||||||
return dndProcessDropNodeMsg(pDnode, BNODE, pMsg);
|
|
||||||
default:
|
|
||||||
terrno = TSDB_CODE_MSG_NOT_PROCESSED;
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -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/>.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#define _DEFAULT_SOURCE
|
|
||||||
#include "dndInt.h"
|
|
||||||
|
|
||||||
const char *dndStatStr(EDndStatus status) {
|
|
||||||
switch (status) {
|
|
||||||
case DND_STAT_INIT:
|
|
||||||
return "init";
|
|
||||||
case DND_STAT_RUNNING:
|
|
||||||
return "running";
|
|
||||||
case DND_STAT_STOPPED:
|
|
||||||
return "stopped";
|
|
||||||
default:
|
|
||||||
return "unknown";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
const char *dndNodeLogStr(ENodeType ntype) {
|
|
||||||
switch (ntype) {
|
|
||||||
case VNODES:
|
|
||||||
return "vnode";
|
|
||||||
case QNODE:
|
|
||||||
return "qnode";
|
|
||||||
case SNODE:
|
|
||||||
return "snode";
|
|
||||||
case MNODE:
|
|
||||||
return "mnode";
|
|
||||||
case BNODE:
|
|
||||||
return "bnode";
|
|
||||||
default:
|
|
||||||
return "taosd";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
const char *dndNodeProcStr(ENodeType ntype) {
|
|
||||||
switch (ntype) {
|
|
||||||
case VNODES:
|
|
||||||
return "taosv";
|
|
||||||
case QNODE:
|
|
||||||
return "taosq";
|
|
||||||
case SNODE:
|
|
||||||
return "taoss";
|
|
||||||
case MNODE:
|
|
||||||
return "taosm";
|
|
||||||
case BNODE:
|
|
||||||
return "taosb";
|
|
||||||
default:
|
|
||||||
return "taosd";
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,406 +0,0 @@
|
||||||
/*
|
|
||||||
* Copyright (c) 2019 TAOS Data, Inc. <jhtao@taosdata.com>
|
|
||||||
*
|
|
||||||
* This program is free software: you can use, redistribute, and/or modify
|
|
||||||
* it under the terms of the GNU Affero General Public License, version 3
|
|
||||||
* or later ("AGPL"), as published by the Free Software Foundation.
|
|
||||||
*
|
|
||||||
* This program is distributed in the hope that it will be useful, but WITHOUT
|
|
||||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
|
||||||
* FITNESS FOR A PARTICULAR PURPOSE.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU Affero General Public License
|
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#define _DEFAULT_SOURCE
|
|
||||||
#include "dndInt.h"
|
|
||||||
|
|
||||||
#define INTERNAL_USER "_dnd"
|
|
||||||
#define INTERNAL_CKEY "_key"
|
|
||||||
#define INTERNAL_SECRET "_pwd"
|
|
||||||
|
|
||||||
static inline void dndProcessQMVnodeRpcMsg(SMsgHandle *pHandle, SRpcMsg *pMsg, SEpSet *pEpSet) {
|
|
||||||
SMsgHead *pHead = pMsg->pCont;
|
|
||||||
int32_t vgId = htonl(pHead->vgId);
|
|
||||||
|
|
||||||
SMgmtWrapper *pWrapper = pHandle->pWrapper;
|
|
||||||
if (vgId == QND_VGID) {
|
|
||||||
pWrapper = pHandle->pQndWrapper;
|
|
||||||
} else if (vgId == MND_VGID) {
|
|
||||||
pWrapper = pHandle->pMndWrapper;
|
|
||||||
}
|
|
||||||
|
|
||||||
dTrace("msg:%s will be processed by %s, handle:%p app:%p vgId:%d", TMSG_INFO(pMsg->msgType), pWrapper->name,
|
|
||||||
pMsg->handle, pMsg->ahandle, vgId);
|
|
||||||
dndProcessRpcMsg(pWrapper, pMsg, pEpSet);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void dndProcessResponse(void *parent, SRpcMsg *pRsp, SEpSet *pEpSet) {
|
|
||||||
SDnode *pDnode = parent;
|
|
||||||
STransMgmt *pMgmt = &pDnode->trans;
|
|
||||||
tmsg_t msgType = pRsp->msgType;
|
|
||||||
|
|
||||||
if (dndGetStatus(pDnode) != DND_STAT_RUNNING) {
|
|
||||||
dTrace("rsp:%s ignored since dnode not running, handle:%p app:%p", TMSG_INFO(msgType), pRsp->handle, pRsp->ahandle);
|
|
||||||
rpcFreeCont(pRsp->pCont);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
SMsgHandle *pHandle = &pMgmt->msgHandles[TMSG_INDEX(msgType)];
|
|
||||||
if (pHandle->pWrapper != NULL) {
|
|
||||||
if (pHandle->pMndWrapper == NULL && pHandle->pQndWrapper == NULL) {
|
|
||||||
dTrace("rsp:%s will be processed by %s, handle:%p app:%p code:0x%04x:%s", TMSG_INFO(msgType),
|
|
||||||
pHandle->pWrapper->name, pRsp->handle, pRsp->ahandle, pRsp->code & 0XFFFF, tstrerror(pRsp->code));
|
|
||||||
dndProcessRpcMsg(pHandle->pWrapper, pRsp, pEpSet);
|
|
||||||
} else {
|
|
||||||
dndProcessQMVnodeRpcMsg(pHandle, pRsp, pEpSet);
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
dError("rsp:%s not processed since no handle, handle:%p app:%p", TMSG_INFO(msgType), pRsp->handle, pRsp->ahandle);
|
|
||||||
rpcFreeCont(pRsp->pCont);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
int32_t dndInitClient(SDnode *pDnode) {
|
|
||||||
STransMgmt *pMgmt = &pDnode->trans;
|
|
||||||
|
|
||||||
SRpcInit rpcInit;
|
|
||||||
memset(&rpcInit, 0, sizeof(rpcInit));
|
|
||||||
rpcInit.label = "DND";
|
|
||||||
rpcInit.numOfThreads = 1;
|
|
||||||
rpcInit.cfp = dndProcessResponse;
|
|
||||||
rpcInit.sessions = 1024;
|
|
||||||
rpcInit.connType = TAOS_CONN_CLIENT;
|
|
||||||
rpcInit.idleTime = tsShellActivityTimer * 1000;
|
|
||||||
rpcInit.user = INTERNAL_USER;
|
|
||||||
rpcInit.ckey = INTERNAL_CKEY;
|
|
||||||
rpcInit.spi = 1;
|
|
||||||
rpcInit.parent = pDnode;
|
|
||||||
|
|
||||||
char pass[TSDB_PASSWORD_LEN + 1] = {0};
|
|
||||||
taosEncryptPass_c((uint8_t *)(INTERNAL_SECRET), strlen(INTERNAL_SECRET), pass);
|
|
||||||
rpcInit.secret = pass;
|
|
||||||
|
|
||||||
pMgmt->clientRpc = rpcOpen(&rpcInit);
|
|
||||||
if (pMgmt->clientRpc == NULL) {
|
|
||||||
dError("failed to init dnode rpc client");
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
dDebug("dnode rpc client is initialized");
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
void dndCleanupClient(SDnode *pDnode) {
|
|
||||||
STransMgmt *pMgmt = &pDnode->trans;
|
|
||||||
if (pMgmt->clientRpc) {
|
|
||||||
rpcClose(pMgmt->clientRpc);
|
|
||||||
pMgmt->clientRpc = NULL;
|
|
||||||
dDebug("dnode rpc client is closed");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static void dndProcessRequest(void *param, SRpcMsg *pReq, SEpSet *pEpSet) {
|
|
||||||
SDnode *pDnode = param;
|
|
||||||
STransMgmt *pMgmt = &pDnode->trans;
|
|
||||||
tmsg_t msgType = pReq->msgType;
|
|
||||||
|
|
||||||
if (msgType == TDMT_DND_NETWORK_TEST) {
|
|
||||||
dTrace("network test req will be processed, handle:%p, app:%p", pReq->handle, pReq->ahandle);
|
|
||||||
dndProcessStartupReq(pDnode, pReq);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (dndGetStatus(pDnode) != DND_STAT_RUNNING) {
|
|
||||||
dError("req:%s ignored since dnode not running, handle:%p app:%p", TMSG_INFO(msgType), pReq->handle, pReq->ahandle);
|
|
||||||
SRpcMsg rspMsg = {.handle = pReq->handle, .code = TSDB_CODE_APP_NOT_READY, .ahandle = pReq->ahandle};
|
|
||||||
rpcSendResponse(&rspMsg);
|
|
||||||
rpcFreeCont(pReq->pCont);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (pReq->pCont == NULL) {
|
|
||||||
dTrace("req:%s not processed since its empty, handle:%p app:%p", TMSG_INFO(msgType), pReq->handle, pReq->ahandle);
|
|
||||||
SRpcMsg rspMsg = {.handle = pReq->handle, .code = TSDB_CODE_DND_INVALID_MSG_LEN, .ahandle = pReq->ahandle};
|
|
||||||
rpcSendResponse(&rspMsg);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
SMsgHandle *pHandle = &pMgmt->msgHandles[TMSG_INDEX(msgType)];
|
|
||||||
if (pHandle->pWrapper != NULL) {
|
|
||||||
if (pHandle->pMndWrapper == NULL && pHandle->pQndWrapper == NULL) {
|
|
||||||
dTrace("req:%s will be processed by %s, handle:%p app:%p", TMSG_INFO(msgType), pHandle->pWrapper->name,
|
|
||||||
pReq->handle, pReq->ahandle);
|
|
||||||
dndProcessRpcMsg(pHandle->pWrapper, pReq, pEpSet);
|
|
||||||
} else {
|
|
||||||
dndProcessQMVnodeRpcMsg(pHandle, pReq, pEpSet);
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
dError("req:%s not processed since no handle, handle:%p app:%p", TMSG_INFO(msgType), pReq->handle, pReq->ahandle);
|
|
||||||
SRpcMsg rspMsg = {.handle = pReq->handle, .code = TSDB_CODE_MSG_NOT_PROCESSED, .ahandle = pReq->ahandle};
|
|
||||||
rpcSendResponse(&rspMsg);
|
|
||||||
rpcFreeCont(pReq->pCont);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static void dndSendMsgToMnodeRecv(SDnode *pDnode, SRpcMsg *pRpcMsg, SRpcMsg *pRpcRsp) {
|
|
||||||
STransMgmt *pMgmt = &pDnode->trans;
|
|
||||||
SEpSet epSet = {0};
|
|
||||||
|
|
||||||
SMgmtWrapper *pWrapper = dndAcquireWrapper(pDnode, DNODE);
|
|
||||||
if (pWrapper != NULL) {
|
|
||||||
dmGetMnodeEpSet(pWrapper->pMgmt, &epSet);
|
|
||||||
dndReleaseWrapper(pWrapper);
|
|
||||||
}
|
|
||||||
|
|
||||||
rpcSendRecv(pMgmt->clientRpc, &epSet, pRpcMsg, pRpcRsp);
|
|
||||||
}
|
|
||||||
|
|
||||||
static int32_t dndGetHideUserAuth(SDnode *pDnode, char *user, char *spi, char *encrypt, char *secret, char *ckey) {
|
|
||||||
int32_t code = 0;
|
|
||||||
char pass[TSDB_PASSWORD_LEN + 1] = {0};
|
|
||||||
|
|
||||||
if (strcmp(user, INTERNAL_USER) == 0) {
|
|
||||||
taosEncryptPass_c((uint8_t *)(INTERNAL_SECRET), strlen(INTERNAL_SECRET), pass);
|
|
||||||
} else if (strcmp(user, TSDB_NETTEST_USER) == 0) {
|
|
||||||
taosEncryptPass_c((uint8_t *)(TSDB_NETTEST_USER), strlen(TSDB_NETTEST_USER), pass);
|
|
||||||
} else {
|
|
||||||
code = -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (code == 0) {
|
|
||||||
memcpy(secret, pass, TSDB_PASSWORD_LEN);
|
|
||||||
*spi = 1;
|
|
||||||
*encrypt = 0;
|
|
||||||
*ckey = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
return code;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int32_t dndRetrieveUserAuthInfo(void *parent, char *user, char *spi, char *encrypt, char *secret, char *ckey) {
|
|
||||||
SDnode *pDnode = parent;
|
|
||||||
|
|
||||||
if (dndGetHideUserAuth(parent, user, spi, encrypt, secret, ckey) == 0) {
|
|
||||||
dTrace("user:%s, get auth from mnode, spi:%d encrypt:%d", user, *spi, *encrypt);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
SMgmtWrapper *pWrapper = dndAcquireWrapper(pDnode, MNODE);
|
|
||||||
if (pWrapper != NULL) {
|
|
||||||
if (mmGetUserAuth(pWrapper, user, spi, encrypt, secret, ckey) == 0) {
|
|
||||||
dndReleaseWrapper(pWrapper);
|
|
||||||
dTrace("user:%s, get auth from mnode, spi:%d encrypt:%d", user, *spi, *encrypt);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
dndReleaseWrapper(pWrapper);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (terrno != TSDB_CODE_APP_NOT_READY) {
|
|
||||||
dTrace("failed to get user auth from mnode since %s", terrstr());
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
SAuthReq authReq = {0};
|
|
||||||
tstrncpy(authReq.user, user, TSDB_USER_LEN);
|
|
||||||
int32_t contLen = tSerializeSAuthReq(NULL, 0, &authReq);
|
|
||||||
void *pReq = rpcMallocCont(contLen);
|
|
||||||
tSerializeSAuthReq(pReq, contLen, &authReq);
|
|
||||||
|
|
||||||
SRpcMsg rpcMsg = {.pCont = pReq, .contLen = contLen, .msgType = TDMT_MND_AUTH, .ahandle = (void *)9528};
|
|
||||||
SRpcMsg rpcRsp = {0};
|
|
||||||
dTrace("user:%s, send user auth req to other mnodes, spi:%d encrypt:%d", user, authReq.spi, authReq.encrypt);
|
|
||||||
dndSendMsgToMnodeRecv(pDnode, &rpcMsg, &rpcRsp);
|
|
||||||
|
|
||||||
if (rpcRsp.code != 0) {
|
|
||||||
terrno = rpcRsp.code;
|
|
||||||
dError("user:%s, failed to get user auth from other mnodes since %s", user, terrstr());
|
|
||||||
} else {
|
|
||||||
SAuthRsp authRsp = {0};
|
|
||||||
tDeserializeSAuthReq(rpcRsp.pCont, rpcRsp.contLen, &authRsp);
|
|
||||||
memcpy(secret, authRsp.secret, TSDB_PASSWORD_LEN);
|
|
||||||
memcpy(ckey, authRsp.ckey, TSDB_PASSWORD_LEN);
|
|
||||||
*spi = authRsp.spi;
|
|
||||||
*encrypt = authRsp.encrypt;
|
|
||||||
dTrace("user:%s, success to get user auth from other mnodes, spi:%d encrypt:%d", user, authRsp.spi,
|
|
||||||
authRsp.encrypt);
|
|
||||||
}
|
|
||||||
|
|
||||||
rpcFreeCont(rpcRsp.pCont);
|
|
||||||
return rpcRsp.code;
|
|
||||||
}
|
|
||||||
|
|
||||||
int32_t dndInitServer(SDnode *pDnode) {
|
|
||||||
STransMgmt *pMgmt = &pDnode->trans;
|
|
||||||
|
|
||||||
int32_t numOfThreads = (int32_t)((tsNumOfCores * tsNumOfThreadsPerCore) / 2.0);
|
|
||||||
if (numOfThreads < 1) {
|
|
||||||
numOfThreads = 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
SRpcInit rpcInit;
|
|
||||||
memset(&rpcInit, 0, sizeof(rpcInit));
|
|
||||||
rpcInit.localPort = pDnode->serverPort;
|
|
||||||
rpcInit.label = "DND";
|
|
||||||
rpcInit.numOfThreads = numOfThreads;
|
|
||||||
rpcInit.cfp = dndProcessRequest;
|
|
||||||
rpcInit.sessions = tsMaxShellConns;
|
|
||||||
rpcInit.connType = TAOS_CONN_SERVER;
|
|
||||||
rpcInit.idleTime = tsShellActivityTimer * 1000;
|
|
||||||
rpcInit.afp = dndRetrieveUserAuthInfo;
|
|
||||||
rpcInit.parent = pDnode;
|
|
||||||
|
|
||||||
pMgmt->serverRpc = rpcOpen(&rpcInit);
|
|
||||||
if (pMgmt->serverRpc == NULL) {
|
|
||||||
dError("failed to init dnode rpc server");
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
dDebug("dnode rpc server is initialized");
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
void dndCleanupServer(SDnode *pDnode) {
|
|
||||||
STransMgmt *pMgmt = &pDnode->trans;
|
|
||||||
if (pMgmt->serverRpc) {
|
|
||||||
rpcClose(pMgmt->serverRpc);
|
|
||||||
pMgmt->serverRpc = NULL;
|
|
||||||
dDebug("dnode rpc server is closed");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
int32_t dndInitMsgHandle(SDnode *pDnode) {
|
|
||||||
STransMgmt *pMgmt = &pDnode->trans;
|
|
||||||
|
|
||||||
for (ENodeType n = 0; n < NODE_MAX; ++n) {
|
|
||||||
SMgmtWrapper *pWrapper = &pDnode->wrappers[n];
|
|
||||||
|
|
||||||
for (int32_t msgIndex = 0; msgIndex < TDMT_MAX; ++msgIndex) {
|
|
||||||
NodeMsgFp msgFp = pWrapper->msgFps[msgIndex];
|
|
||||||
int32_t vgId = pWrapper->msgVgIds[msgIndex];
|
|
||||||
if (msgFp == NULL) continue;
|
|
||||||
|
|
||||||
// dTrace("msg:%s will be processed by %s, vgId:%d", tMsgInfo[msgIndex], pWrapper->name, vgId);
|
|
||||||
|
|
||||||
SMsgHandle *pHandle = &pMgmt->msgHandles[msgIndex];
|
|
||||||
if (vgId == QND_VGID) {
|
|
||||||
if (pHandle->pQndWrapper != NULL) {
|
|
||||||
dError("msg:%s has multiple process nodes", tMsgInfo[msgIndex]);
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
pHandle->pQndWrapper = pWrapper;
|
|
||||||
} else if (vgId == MND_VGID) {
|
|
||||||
if (pHandle->pMndWrapper != NULL) {
|
|
||||||
dError("msg:%s has multiple process nodes", tMsgInfo[msgIndex]);
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
pHandle->pMndWrapper = pWrapper;
|
|
||||||
} else {
|
|
||||||
if (pHandle->pWrapper != NULL) {
|
|
||||||
dError("msg:%s has multiple process nodes", tMsgInfo[msgIndex]);
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
pHandle->pWrapper = pWrapper;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int32_t dndSendRpcReq(STransMgmt *pMgmt, const SEpSet *pEpSet, SRpcMsg *pReq) {
|
|
||||||
if (pMgmt->clientRpc == NULL) {
|
|
||||||
terrno = TSDB_CODE_DND_OFFLINE;
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
rpcSendRequest(pMgmt->clientRpc, pEpSet, pReq, NULL);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
int32_t dndSendReqToDnode(SMgmtWrapper *pWrapper, const SEpSet *pEpSet, SRpcMsg *pReq) {
|
|
||||||
if (pWrapper->procType != PROC_CHILD) {
|
|
||||||
SDnode *pDnode = pWrapper->pDnode;
|
|
||||||
if (dndGetStatus(pDnode) != DND_STAT_RUNNING) {
|
|
||||||
terrno = TSDB_CODE_DND_OFFLINE;
|
|
||||||
dError("failed to send rpc msg since %s, handle:%p", terrstr(), pReq->handle);
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
return dndSendRpcReq(&pDnode->trans, pEpSet, pReq);
|
|
||||||
} else {
|
|
||||||
while (taosProcPutToParentQ(pWrapper->pProc, pReq, sizeof(SRpcMsg), pReq->pCont, pReq->contLen, PROC_REQ) != 0) {
|
|
||||||
taosMsleep(1);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
int32_t dndSendReqToMnode(SMgmtWrapper *pWrapper, SRpcMsg *pReq) {
|
|
||||||
SDnode *pDnode = pWrapper->pDnode;
|
|
||||||
STransMgmt *pTrans = &pDnode->trans;
|
|
||||||
SEpSet epSet = {0};
|
|
||||||
|
|
||||||
SMgmtWrapper *pWrapper2 = dndAcquireWrapper(pDnode, DNODE);
|
|
||||||
if (pWrapper2 != NULL) {
|
|
||||||
dmGetMnodeEpSet(pWrapper2->pMgmt, &epSet);
|
|
||||||
dndReleaseWrapper(pWrapper2);
|
|
||||||
}
|
|
||||||
return dndSendRpcReq(pTrans, &epSet, pReq);
|
|
||||||
}
|
|
||||||
|
|
||||||
void dndSendRpcRsp(SMgmtWrapper *pWrapper, const SRpcMsg *pRsp) {
|
|
||||||
if (pRsp->code == TSDB_CODE_APP_NOT_READY) {
|
|
||||||
SMgmtWrapper *pDnodeWrapper = dndAcquireWrapper(pWrapper->pDnode, DNODE);
|
|
||||||
if (pDnodeWrapper != NULL) {
|
|
||||||
dmSendRedirectRsp(pDnodeWrapper->pMgmt, pRsp);
|
|
||||||
dndReleaseWrapper(pDnodeWrapper);
|
|
||||||
} else {
|
|
||||||
rpcSendResponse(pRsp);
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
rpcSendResponse(pRsp);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void dndSendRsp(SMgmtWrapper *pWrapper, const SRpcMsg *pRsp) {
|
|
||||||
if (pWrapper->procType != PROC_CHILD) {
|
|
||||||
dndSendRpcRsp(pWrapper, pRsp);
|
|
||||||
} else {
|
|
||||||
while (taosProcPutToParentQ(pWrapper->pProc, pRsp, sizeof(SRpcMsg), pRsp->pCont, pRsp->contLen, PROC_RSP) != 0) {
|
|
||||||
taosMsleep(1);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void dndRegisterBrokenLinkArg(SMgmtWrapper *pWrapper, SRpcMsg *pMsg) {
|
|
||||||
if (pWrapper->procType != PROC_CHILD) {
|
|
||||||
rpcRegisterBrokenLinkArg(pMsg);
|
|
||||||
} else {
|
|
||||||
while (taosProcPutToParentQ(pWrapper->pProc, pMsg, sizeof(SRpcMsg), pMsg->pCont, pMsg->contLen, PROC_REG) != 0) {
|
|
||||||
taosMsleep(1);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static void dndReleaseHandle(SMgmtWrapper *pWrapper, void *handle, int8_t type) {
|
|
||||||
if (pWrapper->procType != PROC_CHILD) {
|
|
||||||
rpcReleaseHandle(handle, type);
|
|
||||||
} else {
|
|
||||||
SRpcMsg msg = {.handle = handle, .code = type};
|
|
||||||
while (taosProcPutToParentQ(pWrapper->pProc, &msg, sizeof(SRpcMsg), NULL, 0, PROC_RELEASE) != 0) {
|
|
||||||
taosMsleep(1);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
SMsgCb dndCreateMsgcb(SMgmtWrapper *pWrapper) {
|
|
||||||
SMsgCb msgCb = {
|
|
||||||
.pWrapper = pWrapper,
|
|
||||||
.registerBrokenLinkArgFp = dndRegisterBrokenLinkArg,
|
|
||||||
.releaseHandleFp = dndReleaseHandle,
|
|
||||||
.sendMnodeReqFp = dndSendReqToMnode,
|
|
||||||
.sendReqFp = dndSendReqToDnode,
|
|
||||||
.sendRspFp = dndSendRsp,
|
|
||||||
};
|
|
||||||
return msgCb;
|
|
||||||
}
|
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue