Merge branch 'main' of https://github.com/taosdata/TDengine into main
This commit is contained in:
commit
c489e0dfc6
|
@ -10,6 +10,8 @@ if (NOT DEFINED TD_SOURCE_DIR)
|
||||||
set( TD_SOURCE_DIR ${PROJECT_SOURCE_DIR} )
|
set( TD_SOURCE_DIR ${PROJECT_SOURCE_DIR} )
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
|
SET(TD_COMMUNITY_DIR ${PROJECT_SOURCE_DIR})
|
||||||
|
|
||||||
set(TD_SUPPORT_DIR "${TD_SOURCE_DIR}/cmake")
|
set(TD_SUPPORT_DIR "${TD_SOURCE_DIR}/cmake")
|
||||||
set(TD_CONTRIB_DIR "${TD_SOURCE_DIR}/contrib")
|
set(TD_CONTRIB_DIR "${TD_SOURCE_DIR}/contrib")
|
||||||
|
|
||||||
|
|
|
@ -16,7 +16,7 @@ find_program(HAVE_GIT NAMES git)
|
||||||
IF (DEFINED GITINFO)
|
IF (DEFINED GITINFO)
|
||||||
SET(TD_VER_GIT ${GITINFO})
|
SET(TD_VER_GIT ${GITINFO})
|
||||||
ELSEIF (HAVE_GIT)
|
ELSEIF (HAVE_GIT)
|
||||||
execute_process(COMMAND git log -1 --format=%H WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} OUTPUT_VARIABLE GIT_COMMITID)
|
execute_process(COMMAND git log -1 --format=%H WORKING_DIRECTORY ${TD_COMMUNITY_DIR} OUTPUT_VARIABLE GIT_COMMITID)
|
||||||
#message(STATUS "git log result:${GIT_COMMITID}")
|
#message(STATUS "git log result:${GIT_COMMITID}")
|
||||||
IF (GIT_COMMITID)
|
IF (GIT_COMMITID)
|
||||||
string (REGEX REPLACE "[\n\t\r]" "" GIT_COMMITID ${GIT_COMMITID})
|
string (REGEX REPLACE "[\n\t\r]" "" GIT_COMMITID ${GIT_COMMITID})
|
||||||
|
@ -30,6 +30,23 @@ ELSE ()
|
||||||
SET(TD_VER_GIT "no git commit id")
|
SET(TD_VER_GIT "no git commit id")
|
||||||
ENDIF ()
|
ENDIF ()
|
||||||
|
|
||||||
|
IF (DEFINED GITINFOI)
|
||||||
|
SET(TD_VER_GIT_INTERNAL ${GITINFOI})
|
||||||
|
ELSEIF (HAVE_GIT)
|
||||||
|
execute_process(COMMAND git log -1 --format=%H WORKING_DIRECTORY ${PROJECT_SOURCE_DIR} OUTPUT_VARIABLE GIT_COMMITID)
|
||||||
|
message(STATUS "git log result:${GIT_COMMITID}")
|
||||||
|
IF (GIT_COMMITID)
|
||||||
|
string (REGEX REPLACE "[\n\t\r]" "" GIT_COMMITID ${GIT_COMMITID})
|
||||||
|
SET(TD_VER_GIT_INTERNAL ${GIT_COMMITID})
|
||||||
|
ELSE ()
|
||||||
|
message(STATUS "not a git repository")
|
||||||
|
SET(TD_VER_GIT "no git commit id")
|
||||||
|
ENDIF ()
|
||||||
|
ELSE ()
|
||||||
|
message(STATUS "no git cmd")
|
||||||
|
SET(TD_VER_GIT_INTERNAL "no git commit id")
|
||||||
|
ENDIF ()
|
||||||
|
|
||||||
IF (DEFINED VERDATE)
|
IF (DEFINED VERDATE)
|
||||||
SET(TD_VER_DATE ${VERDATE})
|
SET(TD_VER_DATE ${VERDATE})
|
||||||
ELSE ()
|
ELSE ()
|
||||||
|
|
|
@ -2,7 +2,7 @@
|
||||||
# taosadapter
|
# taosadapter
|
||||||
ExternalProject_Add(taosadapter
|
ExternalProject_Add(taosadapter
|
||||||
GIT_REPOSITORY https://github.com/taosdata/taosadapter.git
|
GIT_REPOSITORY https://github.com/taosdata/taosadapter.git
|
||||||
GIT_TAG d8059ff
|
GIT_TAG cb1e89c
|
||||||
SOURCE_DIR "${TD_SOURCE_DIR}/tools/taosadapter"
|
SOURCE_DIR "${TD_SOURCE_DIR}/tools/taosadapter"
|
||||||
BINARY_DIR ""
|
BINARY_DIR ""
|
||||||
#BUILD_IN_SOURCE TRUE
|
#BUILD_IN_SOURCE TRUE
|
||||||
|
|
|
@ -2,7 +2,7 @@
|
||||||
# taos-tools
|
# taos-tools
|
||||||
ExternalProject_Add(taos-tools
|
ExternalProject_Add(taos-tools
|
||||||
GIT_REPOSITORY https://github.com/taosdata/taos-tools.git
|
GIT_REPOSITORY https://github.com/taosdata/taos-tools.git
|
||||||
GIT_TAG 04296a5
|
GIT_TAG d194dc9
|
||||||
SOURCE_DIR "${TD_SOURCE_DIR}/tools/taos-tools"
|
SOURCE_DIR "${TD_SOURCE_DIR}/tools/taos-tools"
|
||||||
BINARY_DIR ""
|
BINARY_DIR ""
|
||||||
#BUILD_IN_SOURCE TRUE
|
#BUILD_IN_SOURCE TRUE
|
||||||
|
|
|
@ -293,7 +293,6 @@ You configure the following parameters when creating a consumer:
|
||||||
| `auto.offset.reset` | enum | Initial offset for the consumer group | Specify `earliest`, `latest`, or `none`(default) |
|
| `auto.offset.reset` | enum | Initial offset for the consumer group | Specify `earliest`, `latest`, or `none`(default) |
|
||||||
| `enable.auto.commit` | boolean | Commit automatically | Specify `true` or `false`. |
|
| `enable.auto.commit` | boolean | Commit automatically | Specify `true` or `false`. |
|
||||||
| `auto.commit.interval.ms` | integer | Interval for automatic commits, in milliseconds |
|
| `auto.commit.interval.ms` | integer | Interval for automatic commits, in milliseconds |
|
||||||
| `enable.heartbeat.background` | boolean | Backend heartbeat; if enabled, the consumer does not go offline even if it has not polled for a long time | |
|
|
||||||
| `experimental.snapshot.enable` | boolean | Specify whether to consume messages from the WAL or from TSBS | |
|
| `experimental.snapshot.enable` | boolean | Specify whether to consume messages from the WAL or from TSBS | |
|
||||||
| `msg.with.table.name` | boolean | Specify whether to deserialize table names from messages |
|
| `msg.with.table.name` | boolean | Specify whether to deserialize table names from messages |
|
||||||
|
|
||||||
|
@ -368,7 +367,6 @@ conf := &tmq.ConfigMap{
|
||||||
"td.connect.port": "6030",
|
"td.connect.port": "6030",
|
||||||
"client.id": "test_tmq_c",
|
"client.id": "test_tmq_c",
|
||||||
"enable.auto.commit": "false",
|
"enable.auto.commit": "false",
|
||||||
"enable.heartbeat.background": "true",
|
|
||||||
"experimental.snapshot.enable": "true",
|
"experimental.snapshot.enable": "true",
|
||||||
"msg.with.table.name": "true",
|
"msg.with.table.name": "true",
|
||||||
}
|
}
|
||||||
|
@ -418,7 +416,6 @@ Python programs use the following parameters:
|
||||||
| `auto.commit.interval.ms` | string | Interval for automatic commits, in milliseconds | |
|
| `auto.commit.interval.ms` | string | Interval for automatic commits, in milliseconds | |
|
||||||
| `auto.offset.reset` | string | Initial offset for the consumer group | Specify `earliest`, `latest`, or `none`(default) |
|
| `auto.offset.reset` | string | Initial offset for the consumer group | Specify `earliest`, `latest`, or `none`(default) |
|
||||||
| `experimental.snapshot.enable` | string | Specify whether to consume messages from the WAL or from TSDB | Specify `true` or `false` |
|
| `experimental.snapshot.enable` | string | Specify whether to consume messages from the WAL or from TSDB | Specify `true` or `false` |
|
||||||
| `enable.heartbeat.background` | string | Backend heartbeat; if enabled, the consumer does not go offline even if it has not polled for a long time | Specify `true` or `false` |
|
|
||||||
|
|
||||||
</TabItem>
|
</TabItem>
|
||||||
|
|
||||||
|
|
|
@ -35,7 +35,6 @@ func main() {
|
||||||
"td.connect.port": "6030",
|
"td.connect.port": "6030",
|
||||||
"client.id": "test_tmq_client",
|
"client.id": "test_tmq_client",
|
||||||
"enable.auto.commit": "false",
|
"enable.auto.commit": "false",
|
||||||
"enable.heartbeat.background": "true",
|
|
||||||
"experimental.snapshot.enable": "true",
|
"experimental.snapshot.enable": "true",
|
||||||
"msg.with.table.name": "true",
|
"msg.with.table.name": "true",
|
||||||
})
|
})
|
||||||
|
|
|
@ -291,7 +291,6 @@ CREATE TOPIC topic_name AS DATABASE db_name;
|
||||||
| `auto.offset.reset` | enum | 消费组订阅的初始位置 | 可选:`earliest`(default), `latest`, `none` |
|
| `auto.offset.reset` | enum | 消费组订阅的初始位置 | 可选:`earliest`(default), `latest`, `none` |
|
||||||
| `enable.auto.commit` | boolean | 是否启用消费位点自动提交 | 合法值:`true`, `false`。 |
|
| `enable.auto.commit` | boolean | 是否启用消费位点自动提交 | 合法值:`true`, `false`。 |
|
||||||
| `auto.commit.interval.ms` | integer | 以毫秒为单位的消费记录自动提交消费位点时间间 | 默认 5000 m |
|
| `auto.commit.interval.ms` | integer | 以毫秒为单位的消费记录自动提交消费位点时间间 | 默认 5000 m |
|
||||||
| `enable.heartbeat.background` | boolean | 启用后台心跳,启用后即使长时间不 poll 消息也不会造成离线 | 默认开启 |
|
|
||||||
| `experimental.snapshot.enable` | boolean | 是否允许从 TSDB 消费数据 | 实验功能,默认关闭 |
|
| `experimental.snapshot.enable` | boolean | 是否允许从 TSDB 消费数据 | 实验功能,默认关闭 |
|
||||||
| `msg.with.table.name` | boolean | 是否允许从消息中解析表名, 不适用于列订阅(列订阅时可将 tbname 作为列写入 subquery 语句) | |
|
| `msg.with.table.name` | boolean | 是否允许从消息中解析表名, 不适用于列订阅(列订阅时可将 tbname 作为列写入 subquery 语句) | |
|
||||||
|
|
||||||
|
@ -366,7 +365,6 @@ conf := &tmq.ConfigMap{
|
||||||
"td.connect.port": "6030",
|
"td.connect.port": "6030",
|
||||||
"client.id": "test_tmq_c",
|
"client.id": "test_tmq_c",
|
||||||
"enable.auto.commit": "false",
|
"enable.auto.commit": "false",
|
||||||
"enable.heartbeat.background": "true",
|
|
||||||
"experimental.snapshot.enable": "true",
|
"experimental.snapshot.enable": "true",
|
||||||
"msg.with.table.name": "true",
|
"msg.with.table.name": "true",
|
||||||
}
|
}
|
||||||
|
@ -418,7 +416,6 @@ consumer = Consumer({"group.id": "local", "td.connect.ip": "127.0.0.1"})
|
||||||
| `auto.commit.interval.ms` | string | 以毫秒为单位的自动提交时间间隔 | 默认值:5000 ms |
|
| `auto.commit.interval.ms` | string | 以毫秒为单位的自动提交时间间隔 | 默认值:5000 ms |
|
||||||
| `auto.offset.reset` | string | 消费组订阅的初始位置 | 可选:`earliest`(default), `latest`, `none` |
|
| `auto.offset.reset` | string | 消费组订阅的初始位置 | 可选:`earliest`(default), `latest`, `none` |
|
||||||
| `experimental.snapshot.enable` | string | 是否允许从 TSDB 消费数据 | 合法值:`true`, `false` |
|
| `experimental.snapshot.enable` | string | 是否允许从 TSDB 消费数据 | 合法值:`true`, `false` |
|
||||||
| `enable.heartbeat.background` | string | 启用后台心跳,启用后即使长时间不 poll 消息也不会造成离线 | 合法值:`true`, `false` |
|
|
||||||
|
|
||||||
</TabItem>
|
</TabItem>
|
||||||
|
|
||||||
|
|
|
@ -185,7 +185,7 @@ typedef struct SBlockID {
|
||||||
typedef struct SDataBlockInfo {
|
typedef struct SDataBlockInfo {
|
||||||
STimeWindow window;
|
STimeWindow window;
|
||||||
int32_t rowSize;
|
int32_t rowSize;
|
||||||
int32_t rows; // todo hide this attribute
|
int64_t rows; // todo hide this attribute
|
||||||
uint32_t capacity;
|
uint32_t capacity;
|
||||||
SBlockID id;
|
SBlockID id;
|
||||||
int16_t hasVarCol;
|
int16_t hasVarCol;
|
||||||
|
|
|
@ -178,7 +178,7 @@ int32_t getJsonValueLen(const char* data);
|
||||||
|
|
||||||
int32_t colDataSetVal(SColumnInfoData* pColumnInfoData, uint32_t rowIndex, const char* pData, bool isNull);
|
int32_t colDataSetVal(SColumnInfoData* pColumnInfoData, uint32_t rowIndex, const char* pData, bool isNull);
|
||||||
int32_t colDataAppend(SColumnInfoData* pColumnInfoData, uint32_t rowIndex, const char* pData, bool isNull);
|
int32_t colDataAppend(SColumnInfoData* pColumnInfoData, uint32_t rowIndex, const char* pData, bool isNull);
|
||||||
int32_t colDataSetNItems(SColumnInfoData* pColumnInfoData, uint32_t rowIndex, const char* pData, uint32_t numOfRows);
|
int32_t colDataSetNItems(SColumnInfoData* pColumnInfoData, uint32_t rowIndex, const char* pData, uint32_t numOfRows, bool trimValue);
|
||||||
int32_t colDataMergeCol(SColumnInfoData* pColumnInfoData, int32_t numOfRow1, int32_t* capacity,
|
int32_t colDataMergeCol(SColumnInfoData* pColumnInfoData, int32_t numOfRow1, int32_t* capacity,
|
||||||
const SColumnInfoData* pSource, int32_t numOfRow2);
|
const SColumnInfoData* pSource, int32_t numOfRow2);
|
||||||
int32_t colDataAssign(SColumnInfoData* pColumnInfoData, const SColumnInfoData* pSource, int32_t numOfRows,
|
int32_t colDataAssign(SColumnInfoData* pColumnInfoData, const SColumnInfoData* pSource, int32_t numOfRows,
|
||||||
|
|
|
@ -34,7 +34,7 @@ typedef enum {
|
||||||
WRITE_QUEUE,
|
WRITE_QUEUE,
|
||||||
APPLY_QUEUE,
|
APPLY_QUEUE,
|
||||||
SYNC_QUEUE,
|
SYNC_QUEUE,
|
||||||
SYNC_CTRL_QUEUE,
|
SYNC_RD_QUEUE,
|
||||||
STREAM_QUEUE,
|
STREAM_QUEUE,
|
||||||
QUEUE_MAX,
|
QUEUE_MAX,
|
||||||
} EQueueType;
|
} EQueueType;
|
||||||
|
|
|
@ -259,7 +259,7 @@ enum {
|
||||||
|
|
||||||
TD_NEW_MSG_SEG(TDMT_SYNC_MSG)
|
TD_NEW_MSG_SEG(TDMT_SYNC_MSG)
|
||||||
TD_DEF_MSG_TYPE(TDMT_SYNC_TIMEOUT, "sync-timer", NULL, NULL)
|
TD_DEF_MSG_TYPE(TDMT_SYNC_TIMEOUT, "sync-timer", NULL, NULL)
|
||||||
TD_DEF_MSG_TYPE(TDMT_SYNC_PING, "sync-ping", NULL, NULL) // no longer used
|
TD_DEF_MSG_TYPE(TDMT_SYNC_TIMEOUT_ELECTION, "sync-elect", NULL, NULL)
|
||||||
TD_DEF_MSG_TYPE(TDMT_SYNC_PING_REPLY, "sync-ping-reply", NULL, NULL) // no longer used
|
TD_DEF_MSG_TYPE(TDMT_SYNC_PING_REPLY, "sync-ping-reply", NULL, NULL) // no longer used
|
||||||
TD_DEF_MSG_TYPE(TDMT_SYNC_CLIENT_REQUEST, "sync-client-request", NULL, NULL)
|
TD_DEF_MSG_TYPE(TDMT_SYNC_CLIENT_REQUEST, "sync-client-request", NULL, NULL)
|
||||||
TD_DEF_MSG_TYPE(TDMT_SYNC_CLIENT_REQUEST_BATCH, "sync-client-request-batch", NULL, NULL)
|
TD_DEF_MSG_TYPE(TDMT_SYNC_CLIENT_REQUEST_BATCH, "sync-client-request-batch", NULL, NULL)
|
||||||
|
|
|
@ -78,7 +78,7 @@ qTaskInfo_t qCreateStreamExecTaskInfo(void* msg, SReadHandle* readers, int32_t v
|
||||||
* @param SReadHandle
|
* @param SReadHandle
|
||||||
* @return
|
* @return
|
||||||
*/
|
*/
|
||||||
qTaskInfo_t qCreateQueueExecTaskInfo(void* msg, SReadHandle* pReaderHandle, int32_t vgId, int32_t* numOfCols, SSchemaWrapper** pSchema);
|
qTaskInfo_t qCreateQueueExecTaskInfo(void* msg, SReadHandle* pReaderHandle, int32_t vgId, int32_t* numOfCols, uint64_t id);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* set the task Id, usually used by message queue process
|
* set the task Id, usually used by message queue process
|
||||||
|
@ -89,6 +89,7 @@ qTaskInfo_t qCreateQueueExecTaskInfo(void* msg, SReadHandle* pReaderHandle, int3
|
||||||
void qSetTaskId(qTaskInfo_t tinfo, uint64_t taskId, uint64_t queryId);
|
void qSetTaskId(qTaskInfo_t tinfo, uint64_t taskId, uint64_t queryId);
|
||||||
|
|
||||||
int32_t qSetStreamOpOpen(qTaskInfo_t tinfo);
|
int32_t qSetStreamOpOpen(qTaskInfo_t tinfo);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Set multiple input data blocks for the stream scan.
|
* Set multiple input data blocks for the stream scan.
|
||||||
* @param tinfo
|
* @param tinfo
|
||||||
|
@ -149,7 +150,6 @@ int32_t qGetQueryTableSchemaVersion(qTaskInfo_t tinfo, char* dbName, char* table
|
||||||
* @param handle
|
* @param handle
|
||||||
* @return
|
* @return
|
||||||
*/
|
*/
|
||||||
|
|
||||||
int32_t qExecTaskOpt(qTaskInfo_t tinfo, SArray* pResList, uint64_t* useconds, bool* hasMore, SLocalFetch* pLocal);
|
int32_t qExecTaskOpt(qTaskInfo_t tinfo, SArray* pResList, uint64_t* useconds, bool* hasMore, SLocalFetch* pLocal);
|
||||||
|
|
||||||
int32_t qExecTask(qTaskInfo_t tinfo, SSDataBlock** pBlock, uint64_t* useconds);
|
int32_t qExecTask(qTaskInfo_t tinfo, SSDataBlock** pBlock, uint64_t* useconds);
|
||||||
|
@ -162,6 +162,7 @@ void qCleanExecTaskBlockBuf(qTaskInfo_t tinfo);
|
||||||
* @return
|
* @return
|
||||||
*/
|
*/
|
||||||
int32_t qAsyncKillTask(qTaskInfo_t tinfo, int32_t rspCode);
|
int32_t qAsyncKillTask(qTaskInfo_t tinfo, int32_t rspCode);
|
||||||
|
int32_t qKillTask(qTaskInfo_t tinfo, int32_t rspCode);
|
||||||
|
|
||||||
bool qTaskIsExecuting(qTaskInfo_t qinfo);
|
bool qTaskIsExecuting(qTaskInfo_t qinfo);
|
||||||
|
|
||||||
|
@ -171,14 +172,6 @@ bool qTaskIsExecuting(qTaskInfo_t qinfo);
|
||||||
*/
|
*/
|
||||||
void qDestroyTask(qTaskInfo_t tinfo);
|
void qDestroyTask(qTaskInfo_t tinfo);
|
||||||
|
|
||||||
/**
|
|
||||||
* Extract the qualified table id list, and than pass them to the TSDB driver to load the required table data blocks.
|
|
||||||
*
|
|
||||||
* @param iter the table iterator to traverse all tables belongs to a super table, or an invert index
|
|
||||||
* @return
|
|
||||||
*/
|
|
||||||
int32_t qGetQualifiedTableIdList(void* pTableList, const char* tagCond, int32_t tagCondLen, SArray* pTableIdList);
|
|
||||||
|
|
||||||
void qProcessRspMsg(void* parent, struct SRpcMsg* pMsg, struct SEpSet* pEpSet);
|
void qProcessRspMsg(void* parent, struct SRpcMsg* pMsg, struct SEpSet* pEpSet);
|
||||||
|
|
||||||
int32_t qGetExplainExecInfo(qTaskInfo_t tinfo, SArray* pExecInfoList /*,int32_t* resNum, SExplainExecInfo** pRes*/);
|
int32_t qGetExplainExecInfo(qTaskInfo_t tinfo, SArray* pExecInfoList /*,int32_t* resNum, SExplainExecInfo** pRes*/);
|
||||||
|
|
|
@ -112,7 +112,7 @@ typedef struct SResultDataInfo {
|
||||||
typedef struct SInputColumnInfoData {
|
typedef struct SInputColumnInfoData {
|
||||||
int32_t totalRows; // total rows in current columnar data
|
int32_t totalRows; // total rows in current columnar data
|
||||||
int32_t startRowIndex; // handle started row index
|
int32_t startRowIndex; // handle started row index
|
||||||
int32_t numOfRows; // the number of rows needs to be handled
|
int64_t numOfRows; // the number of rows needs to be handled
|
||||||
int32_t numOfInputCols; // PTS is not included
|
int32_t numOfInputCols; // PTS is not included
|
||||||
bool colDataSMAIsSet; // if agg is set or not
|
bool colDataSMAIsSet; // if agg is set or not
|
||||||
SColumnInfoData *pPTS; // primary timestamp column
|
SColumnInfoData *pPTS; // primary timestamp column
|
||||||
|
|
|
@ -241,6 +241,7 @@ int32_t fmGetUdafExecFuncs(int32_t funcId, SFuncExecFuncs* pFpSet);
|
||||||
int32_t fmSetInvertFunc(int32_t funcId, SFuncExecFuncs* pFpSet);
|
int32_t fmSetInvertFunc(int32_t funcId, SFuncExecFuncs* pFpSet);
|
||||||
int32_t fmSetNormalFunc(int32_t funcId, SFuncExecFuncs* pFpSet);
|
int32_t fmSetNormalFunc(int32_t funcId, SFuncExecFuncs* pFpSet);
|
||||||
bool fmIsInvertible(int32_t funcId);
|
bool fmIsInvertible(int32_t funcId);
|
||||||
|
char* fmGetFuncName(int32_t funcId);
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
|
|
|
@ -23,20 +23,19 @@ extern "C" {
|
||||||
#ifndef _STREAM_STATE_H_
|
#ifndef _STREAM_STATE_H_
|
||||||
#define _STREAM_STATE_H_
|
#define _STREAM_STATE_H_
|
||||||
|
|
||||||
typedef struct SStreamTask SStreamTask;
|
|
||||||
|
|
||||||
typedef bool (*state_key_cmpr_fn)(void* pKey1, void* pKey2);
|
typedef bool (*state_key_cmpr_fn)(void* pKey1, void* pKey2);
|
||||||
|
|
||||||
typedef struct STdbState {
|
typedef struct STdbState {
|
||||||
SStreamTask* pOwner;
|
struct SStreamTask* pOwner;
|
||||||
TDB* db;
|
|
||||||
TTB* pStateDb;
|
TDB* db;
|
||||||
TTB* pFuncStateDb;
|
TTB* pStateDb;
|
||||||
TTB* pFillStateDb; // todo refactor
|
TTB* pFuncStateDb;
|
||||||
TTB* pSessionStateDb;
|
TTB* pFillStateDb; // todo refactor
|
||||||
TTB* pParNameDb;
|
TTB* pSessionStateDb;
|
||||||
TTB* pParTagDb;
|
TTB* pParNameDb;
|
||||||
TXN* txn;
|
TTB* pParTagDb;
|
||||||
|
TXN* txn;
|
||||||
} STdbState;
|
} STdbState;
|
||||||
|
|
||||||
// incremental state storage
|
// incremental state storage
|
||||||
|
@ -45,7 +44,7 @@ typedef struct {
|
||||||
int32_t number;
|
int32_t number;
|
||||||
} SStreamState;
|
} SStreamState;
|
||||||
|
|
||||||
SStreamState* streamStateOpen(char* path, SStreamTask* pTask, bool specPath, int32_t szPage, int32_t pages);
|
SStreamState* streamStateOpen(char* path, struct SStreamTask* pTask, bool specPath, int32_t szPage, int32_t pages);
|
||||||
void streamStateClose(SStreamState* pState);
|
void streamStateClose(SStreamState* pState);
|
||||||
int32_t streamStateBegin(SStreamState* pState);
|
int32_t streamStateBegin(SStreamState* pState);
|
||||||
int32_t streamStateCommit(SStreamState* pState);
|
int32_t streamStateCommit(SStreamState* pState);
|
||||||
|
|
|
@ -295,7 +295,7 @@ typedef struct {
|
||||||
SEpSet epSet;
|
SEpSet epSet;
|
||||||
} SStreamChildEpInfo;
|
} SStreamChildEpInfo;
|
||||||
|
|
||||||
typedef struct SStreamTask {
|
struct SStreamTask {
|
||||||
int64_t streamId;
|
int64_t streamId;
|
||||||
int32_t taskId;
|
int32_t taskId;
|
||||||
int32_t totalLevel;
|
int32_t totalLevel;
|
||||||
|
@ -362,8 +362,7 @@ typedef struct SStreamTask {
|
||||||
|
|
||||||
int64_t checkpointingId;
|
int64_t checkpointingId;
|
||||||
int32_t checkpointAlignCnt;
|
int32_t checkpointAlignCnt;
|
||||||
|
};
|
||||||
} SStreamTask;
|
|
||||||
|
|
||||||
int32_t tEncodeStreamEpInfo(SEncoder* pEncoder, const SStreamChildEpInfo* pInfo);
|
int32_t tEncodeStreamEpInfo(SEncoder* pEncoder, const SStreamChildEpInfo* pInfo);
|
||||||
int32_t tDecodeStreamEpInfo(SDecoder* pDecoder, SStreamChildEpInfo* pInfo);
|
int32_t tDecodeStreamEpInfo(SDecoder* pDecoder, SStreamChildEpInfo* pInfo);
|
||||||
|
@ -587,7 +586,7 @@ int32_t streamProcessDispatchReq(SStreamTask* pTask, SStreamDispatchReq* pReq, S
|
||||||
int32_t streamProcessDispatchRsp(SStreamTask* pTask, SStreamDispatchRsp* pRsp, int32_t code);
|
int32_t streamProcessDispatchRsp(SStreamTask* pTask, SStreamDispatchRsp* pRsp, int32_t code);
|
||||||
|
|
||||||
int32_t streamProcessRetrieveReq(SStreamTask* pTask, SStreamRetrieveReq* pReq, SRpcMsg* pMsg);
|
int32_t streamProcessRetrieveReq(SStreamTask* pTask, SStreamRetrieveReq* pReq, SRpcMsg* pMsg);
|
||||||
int32_t streamProcessRetrieveRsp(SStreamTask* pTask, SStreamRetrieveRsp* pRsp);
|
// int32_t streamProcessRetrieveRsp(SStreamTask* pTask, SStreamRetrieveRsp* pRsp);
|
||||||
|
|
||||||
int32_t streamTryExec(SStreamTask* pTask);
|
int32_t streamTryExec(SStreamTask* pTask);
|
||||||
int32_t streamSchedExec(SStreamTask* pTask);
|
int32_t streamSchedExec(SStreamTask* pTask);
|
||||||
|
|
|
@ -48,7 +48,7 @@ extern "C" {
|
||||||
#define SYNC_HEARTBEAT_REPLY_SLOW_MS 1500
|
#define SYNC_HEARTBEAT_REPLY_SLOW_MS 1500
|
||||||
#define SYNC_SNAP_RESEND_MS 1000 * 60
|
#define SYNC_SNAP_RESEND_MS 1000 * 60
|
||||||
|
|
||||||
#define SYNC_VND_COMMIT_MIN_MS 1000
|
#define SYNC_VND_COMMIT_MIN_MS 3000
|
||||||
|
|
||||||
#define SYNC_MAX_BATCH_SIZE 1
|
#define SYNC_MAX_BATCH_SIZE 1
|
||||||
#define SYNC_INDEX_BEGIN 0
|
#define SYNC_INDEX_BEGIN 0
|
||||||
|
|
|
@ -69,14 +69,6 @@ void* taosArrayAddBatch(SArray* pArray, const void* pData, int32_t nEles);
|
||||||
*/
|
*/
|
||||||
void taosArrayRemoveDuplicate(SArray* pArray, __compar_fn_t comparFn, void (*fp)(void*));
|
void taosArrayRemoveDuplicate(SArray* pArray, __compar_fn_t comparFn, void (*fp)(void*));
|
||||||
|
|
||||||
/**
|
|
||||||
*
|
|
||||||
* @param pArray
|
|
||||||
* @param comparFn
|
|
||||||
* @param fp
|
|
||||||
*/
|
|
||||||
void taosArrayRemoveDuplicateP(SArray* pArray, __compar_fn_t comparFn, void (*fp)(void*));
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* add all element from the source array list into the destination
|
* add all element from the source array list into the destination
|
||||||
* @param pArray
|
* @param pArray
|
||||||
|
@ -216,6 +208,8 @@ void taosArrayDestroyP(SArray* pArray, FDelete fp);
|
||||||
|
|
||||||
void taosArrayDestroyEx(SArray* pArray, FDelete fp);
|
void taosArrayDestroyEx(SArray* pArray, FDelete fp);
|
||||||
|
|
||||||
|
void taosArraySwap(SArray* a, SArray* b);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* sort the array
|
* sort the array
|
||||||
* @param pArray
|
* @param pArray
|
||||||
|
@ -252,14 +246,6 @@ void taosArraySortPWithExt(SArray* pArray, __ext_compar_fn_t fn, const void* par
|
||||||
int32_t taosEncodeArray(void** buf, const SArray* pArray, FEncode encode);
|
int32_t taosEncodeArray(void** buf, const SArray* pArray, FEncode encode);
|
||||||
void* taosDecodeArray(const void* buf, SArray** pArray, FDecode decode, int32_t dataSz);
|
void* taosDecodeArray(const void* buf, SArray** pArray, FDecode decode, int32_t dataSz);
|
||||||
|
|
||||||
/**
|
|
||||||
* swap array
|
|
||||||
* @param a
|
|
||||||
* @param b
|
|
||||||
* @return
|
|
||||||
*/
|
|
||||||
void taosArraySwap(SArray* a, SArray* b);
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -48,6 +48,13 @@ SSHashObj *tSimpleHashInit(size_t capacity, _hash_fn_t fn);
|
||||||
*/
|
*/
|
||||||
int32_t tSimpleHashGetSize(const SSHashObj *pHashObj);
|
int32_t tSimpleHashGetSize(const SSHashObj *pHashObj);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* set the free function pointer
|
||||||
|
* @param pHashObj
|
||||||
|
* @param freeFp
|
||||||
|
*/
|
||||||
|
void tSimpleHashSetFreeFp(SSHashObj* pHashObj, _hash_free_fn_t freeFp);
|
||||||
|
|
||||||
int32_t tSimpleHashPrint(const SSHashObj *pHashObj);
|
int32_t tSimpleHashPrint(const SSHashObj *pHashObj);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -23,6 +23,7 @@ extern "C" {
|
||||||
extern char version[];
|
extern char version[];
|
||||||
extern char compatible_version[];
|
extern char compatible_version[];
|
||||||
extern char gitinfo[];
|
extern char gitinfo[];
|
||||||
|
extern char gitinfoOfInternal[];
|
||||||
extern char buildinfo[];
|
extern char buildinfo[];
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
|
|
|
@ -90,45 +90,33 @@ cp %{_compiledir}/../include/libs/function/taosudf.h %{buildroot}%{homepat
|
||||||
cp -r %{_compiledir}/../examples/* %{buildroot}%{homepath}/examples
|
cp -r %{_compiledir}/../examples/* %{buildroot}%{homepath}/examples
|
||||||
|
|
||||||
if [ -f %{_compiledir}/build/bin/jemalloc-config ]; then
|
if [ -f %{_compiledir}/build/bin/jemalloc-config ]; then
|
||||||
mkdir -p %{buildroot}%{userlocalpath}/bin
|
mkdir -p %{buildroot}%{homepath}/jemalloc/ ||:
|
||||||
mkdir -p %{buildroot}%{userlocalpath}/lib
|
mkdir -p %{buildroot}%{homepath}/jemalloc/include/jemalloc/ ||:
|
||||||
mkdir -p %{buildroot}%{userlocalpath}/lib/pkgconfig
|
mkdir -p %{buildroot}%{homepath}/jemalloc/lib/ ||:
|
||||||
mkdir -p %{buildroot}%{userlocalpath}/include
|
mkdir -p %{buildroot}%{homepath}/jemalloc/lib/pkgconfig ||:
|
||||||
mkdir -p %{buildroot}%{userlocalpath}/include/jemalloc
|
|
||||||
mkdir -p %{buildroot}%{userlocalpath}/share
|
|
||||||
mkdir -p %{buildroot}%{userlocalpath}/share/doc
|
|
||||||
mkdir -p %{buildroot}%{userlocalpath}/share/doc/jemalloc
|
|
||||||
mkdir -p %{buildroot}%{userlocalpath}/share/man
|
|
||||||
mkdir -p %{buildroot}%{userlocalpath}/share/man/man3
|
|
||||||
|
|
||||||
cp %{_compiledir}/build/bin/jemalloc-config %{buildroot}%{userlocalpath}/bin/
|
cp %{_compiledir}/build/bin/jemalloc-config %{buildroot}%{homepath}/jemalloc/bin
|
||||||
if [ -f %{_compiledir}/build/bin/jemalloc.sh ]; then
|
if [ -f %{_compiledir}/build/bin/jemalloc.sh ]; then
|
||||||
cp %{_compiledir}/build/bin/jemalloc.sh %{buildroot}%{userlocalpath}/bin/
|
cp %{_compiledir}/build/bin/jemalloc.sh %{buildroot}%{homepath}/jemalloc/bin
|
||||||
fi
|
fi
|
||||||
if [ -f %{_compiledir}/build/bin/jeprof ]; then
|
if [ -f %{_compiledir}/build/bin/jeprof ]; then
|
||||||
cp %{_compiledir}/build/bin/jeprof %{buildroot}%{userlocalpath}/bin/
|
cp %{_compiledir}/build/bin/jeprof %{buildroot}%{homepath}/jemalloc/bin
|
||||||
fi
|
fi
|
||||||
if [ -f %{_compiledir}/build/include/jemalloc/jemalloc.h ]; then
|
if [ -f %{_compiledir}/build/include/jemalloc/jemalloc.h ]; then
|
||||||
cp %{_compiledir}/build/include/jemalloc/jemalloc.h %{buildroot}%{userlocalpath}/include/jemalloc/
|
cp %{_compiledir}/build/include/jemalloc/jemalloc.h %{buildroot}%{homepath}/jemalloc/include/jemalloc/
|
||||||
fi
|
fi
|
||||||
if [ -f %{_compiledir}/build/lib/libjemalloc.so.2 ]; then
|
if [ -f %{_compiledir}/build/lib/libjemalloc.so.2 ]; then
|
||||||
cp %{_compiledir}/build/lib/libjemalloc.so.2 %{buildroot}%{userlocalpath}/lib/
|
cp %{_compiledir}/build/lib/libjemalloc.so.2 %{buildroot}%{homepath}/jemalloc/lib
|
||||||
ln -sf libjemalloc.so.2 %{buildroot}%{userlocalpath}/lib/libjemalloc.so
|
ln -sf libjemalloc.so.2 %{buildroot}%{homepath}/jemalloc/lib/libjemalloc.so
|
||||||
fi
|
fi
|
||||||
if [ -f %{_compiledir}/build/lib/libjemalloc.a ]; then
|
if [ -f %{_compiledir}/build/lib/libjemalloc.a ]; then
|
||||||
cp %{_compiledir}/build/lib/libjemalloc.a %{buildroot}%{userlocalpath}/lib/
|
cp %{_compiledir}/build/lib/libjemalloc.a %{buildroot}%{homepath}/jemalloc/lib
|
||||||
fi
|
fi
|
||||||
if [ -f %{_compiledir}/build/lib/libjemalloc_pic.a ]; then
|
if [ -f %{_compiledir}/build/lib/libjemalloc_pic.a ]; then
|
||||||
cp %{_compiledir}/build/lib/libjemalloc_pic.a %{buildroot}%{userlocalpath}/lib/
|
cp %{_compiledir}/build/lib/libjemalloc_pic.a %{buildroot}%{homepath}/jemalloc/lib
|
||||||
fi
|
fi
|
||||||
if [ -f %{_compiledir}/build/lib/pkgconfig/jemalloc.pc ]; then
|
if [ -f %{_compiledir}/build/lib/pkgconfig/jemalloc.pc ]; then
|
||||||
cp %{_compiledir}/build/lib/pkgconfig/jemalloc.pc %{buildroot}%{userlocalpath}/lib/pkgconfig/
|
cp %{_compiledir}/build/lib/pkgconfig/jemalloc.pc %{buildroot}%{homepath}/jemalloc/lib/pkgconfig
|
||||||
fi
|
|
||||||
if [ -f %{_compiledir}/build/share/doc/jemalloc/jemalloc.html ]; then
|
|
||||||
cp %{_compiledir}/build/share/doc/jemalloc/jemalloc.html %{buildroot}%{userlocalpath}/share/doc/jemalloc/
|
|
||||||
fi
|
|
||||||
if [ -f %{_compiledir}/build/share/man/man3/jemalloc.3 ]; then
|
|
||||||
cp %{_compiledir}/build/share/man/man3/jemalloc.3 %{buildroot}%{userlocalpath}/share/man/man3/
|
|
||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
|
|
@ -51,9 +51,9 @@ fi
|
||||||
|
|
||||||
if [ -d ${top_dir}/tools/taos-tools/packaging/deb ]; then
|
if [ -d ${top_dir}/tools/taos-tools/packaging/deb ]; then
|
||||||
cd ${top_dir}/tools/taos-tools/packaging/deb
|
cd ${top_dir}/tools/taos-tools/packaging/deb
|
||||||
[ -z "$taos_tools_ver" ] && taos_tools_ver="0.1.0"
|
|
||||||
|
|
||||||
taostools_ver=$(git for-each-ref --sort=taggerdate --format '%(tag)' refs/tags|grep -v taos | tail -1)
|
taostools_ver=$(git for-each-ref --sort=taggerdate --format '%(tag)' refs/tags|grep -v taos | tail -1)
|
||||||
|
[ -z "$taos_tools_ver" ] && taos_tools_ver="0.1.0"
|
||||||
taostools_install_dir="${release_dir}/${clientName2}Tools-${taostools_ver}"
|
taostools_install_dir="${release_dir}/${clientName2}Tools-${taostools_ver}"
|
||||||
|
|
||||||
cd ${curr_dir}
|
cd ${curr_dir}
|
||||||
|
|
|
@ -145,6 +145,59 @@ function install_include() {
|
||||||
log_print "install include success"
|
log_print "install include success"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function install_jemalloc() {
|
||||||
|
jemalloc_dir=${script_dir}/../jemalloc
|
||||||
|
|
||||||
|
if [ -d ${jemalloc_dir} ]; then
|
||||||
|
${csudo}/usr/bin/install -c -d /usr/local/bin
|
||||||
|
|
||||||
|
if [ -f ${jemalloc_dir}/bin/jemalloc-config ]; then
|
||||||
|
${csudo}/usr/bin/install -c -m 755 ${jemalloc_dir}/bin/jemalloc-config /usr/local/bin
|
||||||
|
fi
|
||||||
|
if [ -f ${jemalloc_dir}/bin/jemalloc.sh ]; then
|
||||||
|
${csudo}/usr/bin/install -c -m 755 ${jemalloc_dir}/bin/jemalloc.sh /usr/local/bin
|
||||||
|
fi
|
||||||
|
if [ -f ${jemalloc_dir}/bin/jeprof ]; then
|
||||||
|
${csudo}/usr/bin/install -c -m 755 ${jemalloc_dir}/bin/jeprof /usr/local/bin
|
||||||
|
fi
|
||||||
|
if [ -f ${jemalloc_dir}/include/jemalloc/jemalloc.h ]; then
|
||||||
|
${csudo}/usr/bin/install -c -d /usr/local/include/jemalloc
|
||||||
|
${csudo}/usr/bin/install -c -m 644 ${jemalloc_dir}/include/jemalloc/jemalloc.h /usr/local/include/jemalloc
|
||||||
|
fi
|
||||||
|
if [ -f ${jemalloc_dir}/lib/libjemalloc.so.2 ]; then
|
||||||
|
${csudo}/usr/bin/install -c -d /usr/local/lib
|
||||||
|
${csudo}/usr/bin/install -c -m 755 ${jemalloc_dir}/lib/libjemalloc.so.2 /usr/local/lib
|
||||||
|
${csudo}ln -sf libjemalloc.so.2 /usr/local/lib/libjemalloc.so
|
||||||
|
${csudo}/usr/bin/install -c -d /usr/local/lib
|
||||||
|
if [ -f ${jemalloc_dir}/lib/libjemalloc.a ]; then
|
||||||
|
${csudo}/usr/bin/install -c -m 755 ${jemalloc_dir}/lib/libjemalloc.a /usr/local/lib
|
||||||
|
fi
|
||||||
|
if [ -f ${jemalloc_dir}/lib/libjemalloc_pic.a ]; then
|
||||||
|
${csudo}/usr/bin/install -c -m 755 ${jemalloc_dir}/lib/libjemalloc_pic.a /usr/local/lib
|
||||||
|
fi
|
||||||
|
if [ -f ${jemalloc_dir}/lib/libjemalloc_pic.a ]; then
|
||||||
|
${csudo}/usr/bin/install -c -d /usr/local/lib/pkgconfig
|
||||||
|
${csudo}/usr/bin/install -c -m 644 ${jemalloc_dir}/lib/pkgconfig/jemalloc.pc /usr/local/lib/pkgconfig
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
if [ -f ${jemalloc_dir}/share/doc/jemalloc/jemalloc.html ]; then
|
||||||
|
${csudo}/usr/bin/install -c -d /usr/local/share/doc/jemalloc
|
||||||
|
${csudo}/usr/bin/install -c -m 644 ${jemalloc_dir}/share/doc/jemalloc/jemalloc.html /usr/local/share/doc/jemalloc
|
||||||
|
fi
|
||||||
|
if [ -f ${jemalloc_dir}/share/man/man3/jemalloc.3 ]; then
|
||||||
|
${csudo}/usr/bin/install -c -d /usr/local/share/man/man3
|
||||||
|
${csudo}/usr/bin/install -c -m 644 ${jemalloc_dir}/share/man/man3/jemalloc.3 /usr/local/share/man/man3
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ -d /etc/ld.so.conf.d ]; then
|
||||||
|
echo "/usr/local/lib" | ${csudo}tee /etc/ld.so.conf.d/jemalloc.conf >/dev/null || echo -e "failed to write /etc/ld.so.conf.d/jemalloc.conf"
|
||||||
|
${csudo}ldconfig
|
||||||
|
else
|
||||||
|
echo "/etc/ld.so.conf.d not found!"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
function install_lib() {
|
function install_lib() {
|
||||||
log_print "start install lib from ${lib_dir} to ${lib_link_dir}"
|
log_print "start install lib from ${lib_dir} to ${lib_link_dir}"
|
||||||
${csudo}rm -f ${lib_link_dir}/libtaos* || :
|
${csudo}rm -f ${lib_link_dir}/libtaos* || :
|
||||||
|
@ -663,6 +716,7 @@ function install_TDengine() {
|
||||||
# Install include, lib, binary and service
|
# Install include, lib, binary and service
|
||||||
install_include &&
|
install_include &&
|
||||||
install_lib &&
|
install_lib &&
|
||||||
|
install_jemalloc
|
||||||
install_bin
|
install_bin
|
||||||
|
|
||||||
if [[ "$?" != 0 ]];then
|
if [[ "$?" != 0 ]];then
|
||||||
|
|
|
@ -76,7 +76,7 @@ int32_t processConnectRsp(void* param, SDataBuf* pMsg, int32_t code) {
|
||||||
goto End;
|
goto End;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((code = taosCheckVersionCompatibleFromStr(version, connectRsp.sVer, 2)) != 0) {
|
if ((code = taosCheckVersionCompatibleFromStr(version, connectRsp.sVer, 3)) != 0) {
|
||||||
setErrno(pRequest, code);
|
setErrno(pRequest, code);
|
||||||
tsem_post(&pRequest->body.rspSem);
|
tsem_post(&pRequest->body.rspSem);
|
||||||
goto End;
|
goto End;
|
||||||
|
@ -506,7 +506,7 @@ int32_t processShowVariablesRsp(void* param, SDataBuf* pMsg, int32_t code) {
|
||||||
code = setQueryResultFromRsp(&pRequest->body.resInfo, pRes, false, true);
|
code = setQueryResultFromRsp(&pRequest->body.resInfo, pRes, false, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
if(code != 0){
|
if (code != 0) {
|
||||||
taosMemoryFree(pRes);
|
taosMemoryFree(pRes);
|
||||||
}
|
}
|
||||||
tFreeSShowVariablesRsp(&rsp);
|
tFreeSShowVariablesRsp(&rsp);
|
||||||
|
|
|
@ -183,7 +183,7 @@ static char* buildAlterSTableJson(void* alterData, int32_t alterDataLen) {
|
||||||
}
|
}
|
||||||
string = cJSON_PrintUnformatted(json);
|
string = cJSON_PrintUnformatted(json);
|
||||||
|
|
||||||
end:
|
end:
|
||||||
cJSON_Delete(json);
|
cJSON_Delete(json);
|
||||||
tFreeSMAltertbReq(&req);
|
tFreeSMAltertbReq(&req);
|
||||||
return string;
|
return string;
|
||||||
|
@ -205,7 +205,7 @@ static char* processCreateStb(SMqMetaRsp* metaRsp) {
|
||||||
}
|
}
|
||||||
string = buildCreateTableJson(&req.schemaRow, &req.schemaTag, req.name, req.suid, TSDB_SUPER_TABLE);
|
string = buildCreateTableJson(&req.schemaRow, &req.schemaTag, req.name, req.suid, TSDB_SUPER_TABLE);
|
||||||
uDebug("processCreateStb %s", string);
|
uDebug("processCreateStb %s", string);
|
||||||
_err:
|
_err:
|
||||||
tDecoderClear(&coder);
|
tDecoderClear(&coder);
|
||||||
return string;
|
return string;
|
||||||
}
|
}
|
||||||
|
@ -227,7 +227,7 @@ static char* processAlterStb(SMqMetaRsp* metaRsp) {
|
||||||
string = buildAlterSTableJson(req.alterOriData, req.alterOriDataLen);
|
string = buildAlterSTableJson(req.alterOriData, req.alterOriDataLen);
|
||||||
uDebug("processAlterStb %s", string);
|
uDebug("processAlterStb %s", string);
|
||||||
|
|
||||||
_err:
|
_err:
|
||||||
tDecoderClear(&coder);
|
tDecoderClear(&coder);
|
||||||
return string;
|
return string;
|
||||||
}
|
}
|
||||||
|
@ -309,7 +309,7 @@ static void buildChildElement(cJSON* json, SVCreateTbReq* pCreateReq) {
|
||||||
cJSON_AddItemToArray(tags, tag);
|
cJSON_AddItemToArray(tags, tag);
|
||||||
}
|
}
|
||||||
|
|
||||||
end:
|
end:
|
||||||
cJSON_AddItemToObject(json, "tags", tags);
|
cJSON_AddItemToObject(json, "tags", tags);
|
||||||
taosArrayDestroy(pTagVals);
|
taosArrayDestroy(pTagVals);
|
||||||
}
|
}
|
||||||
|
@ -368,7 +368,7 @@ static char* processCreateTable(SMqMetaRsp* metaRsp) {
|
||||||
uDebug("processCreateTable :%s", string);
|
uDebug("processCreateTable :%s", string);
|
||||||
}
|
}
|
||||||
|
|
||||||
_exit:
|
_exit:
|
||||||
for (int32_t iReq = 0; iReq < req.nReqs; iReq++) {
|
for (int32_t iReq = 0; iReq < req.nReqs; iReq++) {
|
||||||
pCreateReq = req.pReqs + iReq;
|
pCreateReq = req.pReqs + iReq;
|
||||||
taosMemoryFreeClear(pCreateReq->comment);
|
taosMemoryFreeClear(pCreateReq->comment);
|
||||||
|
@ -408,7 +408,7 @@ static char* processAutoCreateTable(STaosxRsp* rsp) {
|
||||||
}
|
}
|
||||||
string = buildCreateCTableJson(pCreateReq, rsp->createTableNum);
|
string = buildCreateCTableJson(pCreateReq, rsp->createTableNum);
|
||||||
uDebug("processAutoCreateTable :%s", string);
|
uDebug("processAutoCreateTable :%s", string);
|
||||||
_exit:
|
_exit:
|
||||||
for (int i = 0; i < rsp->createTableNum; i++) {
|
for (int i = 0; i < rsp->createTableNum; i++) {
|
||||||
tDecoderClear(&decoder[i]);
|
tDecoderClear(&decoder[i]);
|
||||||
taosMemoryFreeClear(pCreateReq[i].comment);
|
taosMemoryFreeClear(pCreateReq[i].comment);
|
||||||
|
@ -535,7 +535,7 @@ static char* processAlterTable(SMqMetaRsp* metaRsp) {
|
||||||
string = cJSON_PrintUnformatted(json);
|
string = cJSON_PrintUnformatted(json);
|
||||||
uDebug("processAlterTable :%s", string);
|
uDebug("processAlterTable :%s", string);
|
||||||
|
|
||||||
_exit:
|
_exit:
|
||||||
cJSON_Delete(json);
|
cJSON_Delete(json);
|
||||||
tDecoderClear(&decoder);
|
tDecoderClear(&decoder);
|
||||||
return string;
|
return string;
|
||||||
|
@ -569,7 +569,7 @@ static char* processDropSTable(SMqMetaRsp* metaRsp) {
|
||||||
|
|
||||||
string = cJSON_PrintUnformatted(json);
|
string = cJSON_PrintUnformatted(json);
|
||||||
uDebug("processDropSTable :%s", string);
|
uDebug("processDropSTable :%s", string);
|
||||||
_exit:
|
_exit:
|
||||||
cJSON_Delete(json);
|
cJSON_Delete(json);
|
||||||
tDecoderClear(&decoder);
|
tDecoderClear(&decoder);
|
||||||
return string;
|
return string;
|
||||||
|
@ -609,7 +609,7 @@ static char* processDeleteTable(SMqMetaRsp* metaRsp) {
|
||||||
|
|
||||||
string = cJSON_PrintUnformatted(json);
|
string = cJSON_PrintUnformatted(json);
|
||||||
uDebug("processDeleteTable :%s", string);
|
uDebug("processDeleteTable :%s", string);
|
||||||
_exit:
|
_exit:
|
||||||
cJSON_Delete(json);
|
cJSON_Delete(json);
|
||||||
tDecoderClear(&coder);
|
tDecoderClear(&coder);
|
||||||
return string;
|
return string;
|
||||||
|
@ -652,7 +652,7 @@ static char* processDropTable(SMqMetaRsp* metaRsp) {
|
||||||
|
|
||||||
string = cJSON_PrintUnformatted(json);
|
string = cJSON_PrintUnformatted(json);
|
||||||
uDebug("processDropTable :%s", string);
|
uDebug("processDropTable :%s", string);
|
||||||
_exit:
|
_exit:
|
||||||
cJSON_Delete(json);
|
cJSON_Delete(json);
|
||||||
tDecoderClear(&decoder);
|
tDecoderClear(&decoder);
|
||||||
return string;
|
return string;
|
||||||
|
@ -742,7 +742,7 @@ static int32_t taosCreateStb(TAOS* taos, void* meta, int32_t metaLen) {
|
||||||
code = pRequest->code;
|
code = pRequest->code;
|
||||||
taosMemoryFree(pCmdMsg.pMsg);
|
taosMemoryFree(pCmdMsg.pMsg);
|
||||||
|
|
||||||
end:
|
end:
|
||||||
destroyRequest(pRequest);
|
destroyRequest(pRequest);
|
||||||
tFreeSMCreateStbReq(&pReq);
|
tFreeSMCreateStbReq(&pReq);
|
||||||
tDecoderClear(&coder);
|
tDecoderClear(&coder);
|
||||||
|
@ -839,7 +839,7 @@ static int32_t taosDropStb(TAOS* taos, void* meta, int32_t metaLen) {
|
||||||
code = pRequest->code;
|
code = pRequest->code;
|
||||||
taosMemoryFree(pCmdMsg.pMsg);
|
taosMemoryFree(pCmdMsg.pMsg);
|
||||||
|
|
||||||
end:
|
end:
|
||||||
destroyRequest(pRequest);
|
destroyRequest(pRequest);
|
||||||
tDecoderClear(&coder);
|
tDecoderClear(&coder);
|
||||||
return code;
|
return code;
|
||||||
|
@ -901,9 +901,9 @@ static int32_t taosCreateTable(TAOS* taos, void* meta, int32_t metaLen) {
|
||||||
taosHashSetFreeFp(pVgroupHashmap, destroyCreateTbReqBatch);
|
taosHashSetFreeFp(pVgroupHashmap, destroyCreateTbReqBatch);
|
||||||
|
|
||||||
SRequestConnInfo conn = {.pTrans = pTscObj->pAppInfo->pTransporter,
|
SRequestConnInfo conn = {.pTrans = pTscObj->pAppInfo->pTransporter,
|
||||||
.requestId = pRequest->requestId,
|
.requestId = pRequest->requestId,
|
||||||
.requestObjRefId = pRequest->self,
|
.requestObjRefId = pRequest->self,
|
||||||
.mgmtEps = getEpSet_s(&pTscObj->pAppInfo->mgmtEp)};
|
.mgmtEps = getEpSet_s(&pTscObj->pAppInfo->mgmtEp)};
|
||||||
|
|
||||||
pRequest->tableList = taosArrayInit(req.nReqs, sizeof(SName));
|
pRequest->tableList = taosArrayInit(req.nReqs, sizeof(SName));
|
||||||
// loop to create table
|
// loop to create table
|
||||||
|
@ -987,7 +987,7 @@ static int32_t taosCreateTable(TAOS* taos, void* meta, int32_t metaLen) {
|
||||||
|
|
||||||
code = pRequest->code;
|
code = pRequest->code;
|
||||||
|
|
||||||
end:
|
end:
|
||||||
for (int32_t iReq = 0; iReq < req.nReqs; iReq++) {
|
for (int32_t iReq = 0; iReq < req.nReqs; iReq++) {
|
||||||
pCreateReq = req.pReqs + iReq;
|
pCreateReq = req.pReqs + iReq;
|
||||||
taosMemoryFreeClear(pCreateReq->comment);
|
taosMemoryFreeClear(pCreateReq->comment);
|
||||||
|
@ -1058,9 +1058,9 @@ static int32_t taosDropTable(TAOS* taos, void* meta, int32_t metaLen) {
|
||||||
taosHashSetFreeFp(pVgroupHashmap, destroyDropTbReqBatch);
|
taosHashSetFreeFp(pVgroupHashmap, destroyDropTbReqBatch);
|
||||||
|
|
||||||
SRequestConnInfo conn = {.pTrans = pTscObj->pAppInfo->pTransporter,
|
SRequestConnInfo conn = {.pTrans = pTscObj->pAppInfo->pTransporter,
|
||||||
.requestId = pRequest->requestId,
|
.requestId = pRequest->requestId,
|
||||||
.requestObjRefId = pRequest->self,
|
.requestObjRefId = pRequest->self,
|
||||||
.mgmtEps = getEpSet_s(&pTscObj->pAppInfo->mgmtEp)};
|
.mgmtEps = getEpSet_s(&pTscObj->pAppInfo->mgmtEp)};
|
||||||
pRequest->tableList = taosArrayInit(req.nReqs, sizeof(SName));
|
pRequest->tableList = taosArrayInit(req.nReqs, sizeof(SName));
|
||||||
// loop to create table
|
// loop to create table
|
||||||
for (int32_t iReq = 0; iReq < req.nReqs; iReq++) {
|
for (int32_t iReq = 0; iReq < req.nReqs; iReq++) {
|
||||||
|
@ -1132,7 +1132,7 @@ static int32_t taosDropTable(TAOS* taos, void* meta, int32_t metaLen) {
|
||||||
}
|
}
|
||||||
code = pRequest->code;
|
code = pRequest->code;
|
||||||
|
|
||||||
end:
|
end:
|
||||||
taosHashCleanup(pVgroupHashmap);
|
taosHashCleanup(pVgroupHashmap);
|
||||||
destroyRequest(pRequest);
|
destroyRequest(pRequest);
|
||||||
tDecoderClear(&coder);
|
tDecoderClear(&coder);
|
||||||
|
@ -1201,7 +1201,7 @@ static int32_t taosDeleteData(TAOS* taos, void* meta, int32_t metaLen) {
|
||||||
}
|
}
|
||||||
taos_free_result(res);
|
taos_free_result(res);
|
||||||
|
|
||||||
end:
|
end:
|
||||||
tDecoderClear(&coder);
|
tDecoderClear(&coder);
|
||||||
return code;
|
return code;
|
||||||
}
|
}
|
||||||
|
@ -1249,9 +1249,9 @@ static int32_t taosAlterTable(TAOS* taos, void* meta, int32_t metaLen) {
|
||||||
}
|
}
|
||||||
|
|
||||||
SRequestConnInfo conn = {.pTrans = pTscObj->pAppInfo->pTransporter,
|
SRequestConnInfo conn = {.pTrans = pTscObj->pAppInfo->pTransporter,
|
||||||
.requestId = pRequest->requestId,
|
.requestId = pRequest->requestId,
|
||||||
.requestObjRefId = pRequest->self,
|
.requestObjRefId = pRequest->self,
|
||||||
.mgmtEps = getEpSet_s(&pTscObj->pAppInfo->mgmtEp)};
|
.mgmtEps = getEpSet_s(&pTscObj->pAppInfo->mgmtEp)};
|
||||||
|
|
||||||
SVgroupInfo pInfo = {0};
|
SVgroupInfo pInfo = {0};
|
||||||
SName pName = {0};
|
SName pName = {0};
|
||||||
|
@ -1311,7 +1311,7 @@ static int32_t taosAlterTable(TAOS* taos, void* meta, int32_t metaLen) {
|
||||||
code = handleAlterTbExecRes(pRes->res, pCatalog);
|
code = handleAlterTbExecRes(pRes->res, pCatalog);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
end:
|
end:
|
||||||
taosArrayDestroy(pArray);
|
taosArrayDestroy(pArray);
|
||||||
if (pVgData) taosMemoryFreeClear(pVgData->pData);
|
if (pVgData) taosMemoryFreeClear(pVgData->pData);
|
||||||
taosMemoryFreeClear(pVgData);
|
taosMemoryFreeClear(pVgData);
|
||||||
|
@ -1399,7 +1399,7 @@ int taos_write_raw_block_with_fields(TAOS* taos, int rows, char* pData, const ch
|
||||||
launchQueryImpl(pRequest, pQuery, true, NULL);
|
launchQueryImpl(pRequest, pQuery, true, NULL);
|
||||||
code = pRequest->code;
|
code = pRequest->code;
|
||||||
|
|
||||||
end:
|
end:
|
||||||
taosMemoryFreeClear(pTableMeta);
|
taosMemoryFreeClear(pTableMeta);
|
||||||
qDestroyQuery(pQuery);
|
qDestroyQuery(pQuery);
|
||||||
destroyRequest(pRequest);
|
destroyRequest(pRequest);
|
||||||
|
@ -1481,7 +1481,7 @@ int taos_write_raw_block(TAOS* taos, int rows, char* pData, const char* tbname)
|
||||||
launchQueryImpl(pRequest, pQuery, true, NULL);
|
launchQueryImpl(pRequest, pQuery, true, NULL);
|
||||||
code = pRequest->code;
|
code = pRequest->code;
|
||||||
|
|
||||||
end:
|
end:
|
||||||
taosMemoryFreeClear(pTableMeta);
|
taosMemoryFreeClear(pTableMeta);
|
||||||
qDestroyQuery(pQuery);
|
qDestroyQuery(pQuery);
|
||||||
destroyRequest(pRequest);
|
destroyRequest(pRequest);
|
||||||
|
@ -1601,6 +1601,7 @@ static int32_t tmqWriteRawDataImpl(TAOS* taos, void* data, int32_t dataLen) {
|
||||||
uError("WriteRaw:rawBlockBindData failed");
|
uError("WriteRaw:rawBlockBindData failed");
|
||||||
goto end;
|
goto end;
|
||||||
}
|
}
|
||||||
|
taosMemoryFreeClear(pTableMeta);
|
||||||
}
|
}
|
||||||
|
|
||||||
code = smlBuildOutput(pQuery, pVgHash);
|
code = smlBuildOutput(pQuery, pVgHash);
|
||||||
|
@ -1612,7 +1613,7 @@ static int32_t tmqWriteRawDataImpl(TAOS* taos, void* data, int32_t dataLen) {
|
||||||
launchQueryImpl(pRequest, pQuery, true, NULL);
|
launchQueryImpl(pRequest, pQuery, true, NULL);
|
||||||
code = pRequest->code;
|
code = pRequest->code;
|
||||||
|
|
||||||
end:
|
end:
|
||||||
tDeleteSMqDataRsp(&rspObj.rsp);
|
tDeleteSMqDataRsp(&rspObj.rsp);
|
||||||
tDecoderClear(&decoder);
|
tDecoderClear(&decoder);
|
||||||
qDestroyQuery(pQuery);
|
qDestroyQuery(pQuery);
|
||||||
|
@ -1707,6 +1708,7 @@ static int32_t tmqWriteRawMetaDataImpl(TAOS* taos, void* data, int32_t dataLen)
|
||||||
tDecoderInit(&decoderTmp, *dataTmp, *lenTmp);
|
tDecoderInit(&decoderTmp, *dataTmp, *lenTmp);
|
||||||
if (tDecodeSVCreateTbReq(&decoderTmp, &pCreateReq) < 0) {
|
if (tDecodeSVCreateTbReq(&decoderTmp, &pCreateReq) < 0) {
|
||||||
tDecoderClear(&decoderTmp);
|
tDecoderClear(&decoderTmp);
|
||||||
|
tDestroySVCreateTbReq(&pCreateReq, TSDB_MSG_FLG_DECODE);
|
||||||
uError("WriteRaw: tDecodeSVCreateTbReq error");
|
uError("WriteRaw: tDecodeSVCreateTbReq error");
|
||||||
code = TSDB_CODE_TMQ_INVALID_MSG;
|
code = TSDB_CODE_TMQ_INVALID_MSG;
|
||||||
goto end;
|
goto end;
|
||||||
|
@ -1715,15 +1717,19 @@ static int32_t tmqWriteRawMetaDataImpl(TAOS* taos, void* data, int32_t dataLen)
|
||||||
if (pCreateReq.type != TSDB_CHILD_TABLE) {
|
if (pCreateReq.type != TSDB_CHILD_TABLE) {
|
||||||
uError("WriteRaw:pCreateReq.type != TSDB_CHILD_TABLE. table name: %s", tbName);
|
uError("WriteRaw:pCreateReq.type != TSDB_CHILD_TABLE. table name: %s", tbName);
|
||||||
code = TSDB_CODE_TSC_INVALID_VALUE;
|
code = TSDB_CODE_TSC_INVALID_VALUE;
|
||||||
|
tDecoderClear(&decoderTmp);
|
||||||
|
tDestroySVCreateTbReq(&pCreateReq, TSDB_MSG_FLG_DECODE);
|
||||||
goto end;
|
goto end;
|
||||||
}
|
}
|
||||||
if (strcmp(tbName, pCreateReq.name) == 0) {
|
if (strcmp(tbName, pCreateReq.name) == 0) {
|
||||||
cloneSVreateTbReq(&pCreateReq, &pCreateReqDst);
|
cloneSVreateTbReq(&pCreateReq, &pCreateReqDst);
|
||||||
// pCreateReqDst->ctb.suid = processSuid(pCreateReqDst->ctb.suid, pRequest->pDb);
|
// pCreateReqDst->ctb.suid = processSuid(pCreateReqDst->ctb.suid, pRequest->pDb);
|
||||||
tDecoderClear(&decoderTmp);
|
tDecoderClear(&decoderTmp);
|
||||||
|
tDestroySVCreateTbReq(&pCreateReq, TSDB_MSG_FLG_DECODE);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
tDecoderClear(&decoderTmp);
|
tDecoderClear(&decoderTmp);
|
||||||
|
tDestroySVCreateTbReq(&pCreateReq, TSDB_MSG_FLG_DECODE);
|
||||||
}
|
}
|
||||||
|
|
||||||
SVgroupInfo vg;
|
SVgroupInfo vg;
|
||||||
|
@ -1774,6 +1780,7 @@ static int32_t tmqWriteRawMetaDataImpl(TAOS* taos, void* data, int32_t dataLen)
|
||||||
goto end;
|
goto end;
|
||||||
}
|
}
|
||||||
pCreateReqDst = NULL;
|
pCreateReqDst = NULL;
|
||||||
|
taosMemoryFreeClear(pTableMeta);
|
||||||
}
|
}
|
||||||
|
|
||||||
code = smlBuildOutput(pQuery, pVgHash);
|
code = smlBuildOutput(pQuery, pVgHash);
|
||||||
|
@ -1785,7 +1792,7 @@ static int32_t tmqWriteRawMetaDataImpl(TAOS* taos, void* data, int32_t dataLen)
|
||||||
launchQueryImpl(pRequest, pQuery, true, NULL);
|
launchQueryImpl(pRequest, pQuery, true, NULL);
|
||||||
code = pRequest->code;
|
code = pRequest->code;
|
||||||
|
|
||||||
end:
|
end:
|
||||||
tDeleteSTaosxRsp(&rspObj.rsp);
|
tDeleteSTaosxRsp(&rspObj.rsp);
|
||||||
tDecoderClear(&decoder);
|
tDecoderClear(&decoder);
|
||||||
qDestroyQuery(pQuery);
|
qDestroyQuery(pQuery);
|
||||||
|
|
|
@ -257,19 +257,14 @@ cleanup:
|
||||||
kvVal->f = (float)result;
|
kvVal->f = (float)result;
|
||||||
|
|
||||||
#define SET_BIGINT \
|
#define SET_BIGINT \
|
||||||
if (smlDoubleToInt64OverFlow(result)) { \
|
errno = 0; \
|
||||||
errno = 0; \
|
int64_t tmp = taosStr2Int64(pVal, &endptr, 10); \
|
||||||
int64_t tmp = taosStr2Int64(pVal, &endptr, 10); \
|
if (errno == ERANGE) { \
|
||||||
if (errno == ERANGE) { \
|
smlBuildInvalidDataMsg(msg, "big int out of range[-9223372036854775808,9223372036854775807]", pVal); \
|
||||||
smlBuildInvalidDataMsg(msg, "big int out of range[-9223372036854775808,9223372036854775807]", pVal); \
|
return false; \
|
||||||
return false; \
|
} \
|
||||||
} \
|
kvVal->type = TSDB_DATA_TYPE_BIGINT; \
|
||||||
kvVal->type = TSDB_DATA_TYPE_BIGINT; \
|
kvVal->i = tmp;
|
||||||
kvVal->i = tmp; \
|
|
||||||
return true; \
|
|
||||||
} \
|
|
||||||
kvVal->type = TSDB_DATA_TYPE_BIGINT; \
|
|
||||||
kvVal->i = (int64_t)result;
|
|
||||||
|
|
||||||
#define SET_INT \
|
#define SET_INT \
|
||||||
if (!IS_VALID_INT(result)) { \
|
if (!IS_VALID_INT(result)) { \
|
||||||
|
@ -288,19 +283,14 @@ cleanup:
|
||||||
kvVal->i = result;
|
kvVal->i = result;
|
||||||
|
|
||||||
#define SET_UBIGINT \
|
#define SET_UBIGINT \
|
||||||
if (result >= (double)UINT64_MAX || result < 0) { \
|
errno = 0; \
|
||||||
errno = 0; \
|
uint64_t tmp = taosStr2UInt64(pVal, &endptr, 10); \
|
||||||
uint64_t tmp = taosStr2UInt64(pVal, &endptr, 10); \
|
if (errno == ERANGE || result < 0) { \
|
||||||
if (errno == ERANGE || result < 0) { \
|
smlBuildInvalidDataMsg(msg, "unsigned big int out of range[0,18446744073709551615]", pVal); \
|
||||||
smlBuildInvalidDataMsg(msg, "unsigned big int out of range[0,18446744073709551615]", pVal); \
|
return false; \
|
||||||
return false; \
|
} \
|
||||||
} \
|
kvVal->type = TSDB_DATA_TYPE_UBIGINT; \
|
||||||
kvVal->type = TSDB_DATA_TYPE_UBIGINT; \
|
kvVal->u = tmp;
|
||||||
kvVal->u = tmp; \
|
|
||||||
return true; \
|
|
||||||
} \
|
|
||||||
kvVal->type = TSDB_DATA_TYPE_UBIGINT; \
|
|
||||||
kvVal->u = result;
|
|
||||||
|
|
||||||
#define SET_UINT \
|
#define SET_UINT \
|
||||||
if (!IS_VALID_UINT(result)) { \
|
if (!IS_VALID_UINT(result)) { \
|
||||||
|
|
|
@ -320,15 +320,16 @@ tmq_conf_res_t tmq_conf_set(tmq_conf_t* conf, const char* key, const char* value
|
||||||
}
|
}
|
||||||
|
|
||||||
if (strcasecmp(key, "enable.heartbeat.background") == 0) {
|
if (strcasecmp(key, "enable.heartbeat.background") == 0) {
|
||||||
if (strcasecmp(value, "true") == 0) {
|
// if (strcasecmp(value, "true") == 0) {
|
||||||
conf->hbBgEnable = true;
|
// conf->hbBgEnable = true;
|
||||||
return TMQ_CONF_OK;
|
// return TMQ_CONF_OK;
|
||||||
} else if (strcasecmp(value, "false") == 0) {
|
// } else if (strcasecmp(value, "false") == 0) {
|
||||||
conf->hbBgEnable = false;
|
// conf->hbBgEnable = false;
|
||||||
return TMQ_CONF_OK;
|
// return TMQ_CONF_OK;
|
||||||
} else {
|
// } else {
|
||||||
|
tscError("the default value of enable.heartbeat.background is true, can not be seted");
|
||||||
return TMQ_CONF_INVALID;
|
return TMQ_CONF_INVALID;
|
||||||
}
|
// }
|
||||||
}
|
}
|
||||||
|
|
||||||
if (strcasecmp(key, "td.connect.ip") == 0) {
|
if (strcasecmp(key, "td.connect.ip") == 0) {
|
||||||
|
@ -535,10 +536,14 @@ static int32_t doSendCommitMsg(tmq_t* tmq, SMqClientVg* pVg, const char* pTopicN
|
||||||
atomic_add_fetch_32(&pParamSet->totalRspNum, 1);
|
atomic_add_fetch_32(&pParamSet->totalRspNum, 1);
|
||||||
|
|
||||||
SEp* pEp = GET_ACTIVE_EP(&pVg->epSet);
|
SEp* pEp = GET_ACTIVE_EP(&pVg->epSet);
|
||||||
tscDebug("consumer:0x%" PRIx64 " topic:%s on vgId:%d send offset:%" PRId64 " prev:%" PRId64
|
char offsetBuf[80] = {0};
|
||||||
", ep:%s:%d, ordinal:%d/%d, req:0x%" PRIx64,
|
tFormatOffset(offsetBuf, tListLen(offsetBuf), &pOffset->val);
|
||||||
tmq->consumerId, pOffset->subKey, pVg->vgId, pOffset->val.version, pVg->committedOffset.version, pEp->fqdn,
|
|
||||||
pEp->port, index + 1, totalVgroups, pMsgSendInfo->requestId);
|
char commitBuf[80] = {0};
|
||||||
|
tFormatOffset(commitBuf, tListLen(commitBuf), &pVg->committedOffset);
|
||||||
|
tscDebug("consumer:0x%" PRIx64 " topic:%s on vgId:%d send offset:%s prev:%s, ep:%s:%d, ordinal:%d/%d, req:0x%" PRIx64,
|
||||||
|
tmq->consumerId, pOffset->subKey, pVg->vgId, offsetBuf, commitBuf, pEp->fqdn, pEp->port, index + 1,
|
||||||
|
totalVgroups, pMsgSendInfo->requestId);
|
||||||
|
|
||||||
int64_t transporterId = 0;
|
int64_t transporterId = 0;
|
||||||
asyncSendMsgToServer(tmq->pTscObj->pAppInfo->pTransporter, &pVg->epSet, &transporterId, pMsgSendInfo);
|
asyncSendMsgToServer(tmq->pTscObj->pAppInfo->pTransporter, &pVg->epSet, &transporterId, pMsgSendInfo);
|
||||||
|
|
|
@ -998,7 +998,8 @@ TEST(clientCase, sub_db_test) {
|
||||||
|
|
||||||
// 创建订阅 topics 列表
|
// 创建订阅 topics 列表
|
||||||
tmq_list_t* topicList = tmq_list_new();
|
tmq_list_t* topicList = tmq_list_new();
|
||||||
tmq_list_append(topicList, "topic_db1");
|
tmq_list_append(topicList, "topic_t1");
|
||||||
|
tmq_list_append(topicList, "topic_s2");
|
||||||
|
|
||||||
// 启动订阅
|
// 启动订阅
|
||||||
tmq_subscribe(tmq, topicList);
|
tmq_subscribe(tmq, topicList);
|
||||||
|
|
|
@ -147,9 +147,17 @@ int32_t colDataReserve(SColumnInfoData* pColumnInfoData, size_t newSize) {
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void doCopyNItems(struct SColumnInfoData* pColumnInfoData, int32_t currentRow, const char* pData,
|
static int32_t doCopyNItems(struct SColumnInfoData* pColumnInfoData, int32_t currentRow, const char* pData,
|
||||||
int32_t itemLen, int32_t numOfRows) {
|
int32_t itemLen, int32_t numOfRows, bool trimValue) {
|
||||||
ASSERT(pColumnInfoData->info.bytes >= itemLen);
|
if (pColumnInfoData->info.bytes < itemLen) {
|
||||||
|
uWarn("column/tag actual data len %d is bigger than schema len %d, trim it:%d", itemLen, pColumnInfoData->info.bytes, trimValue);
|
||||||
|
if (trimValue) {
|
||||||
|
itemLen = pColumnInfoData->info.bytes;
|
||||||
|
} else {
|
||||||
|
return TSDB_CODE_TDB_INVALID_TABLE_SCHEMA_VER;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
size_t start = 1;
|
size_t start = 1;
|
||||||
|
|
||||||
// the first item
|
// the first item
|
||||||
|
@ -178,10 +186,12 @@ static void doCopyNItems(struct SColumnInfoData* pColumnInfoData, int32_t curren
|
||||||
|
|
||||||
pColumnInfoData->varmeta.length += numOfRows * itemLen;
|
pColumnInfoData->varmeta.length += numOfRows * itemLen;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return TSDB_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t colDataSetNItems(SColumnInfoData* pColumnInfoData, uint32_t currentRow, const char* pData,
|
int32_t colDataSetNItems(SColumnInfoData* pColumnInfoData, uint32_t currentRow, const char* pData,
|
||||||
uint32_t numOfRows) {
|
uint32_t numOfRows, bool trimValue) {
|
||||||
int32_t len = pColumnInfoData->info.bytes;
|
int32_t len = pColumnInfoData->info.bytes;
|
||||||
if (IS_VAR_DATA_TYPE(pColumnInfoData->info.type)) {
|
if (IS_VAR_DATA_TYPE(pColumnInfoData->info.type)) {
|
||||||
len = varDataTLen(pData);
|
len = varDataTLen(pData);
|
||||||
|
@ -193,8 +203,7 @@ int32_t colDataSetNItems(SColumnInfoData* pColumnInfoData, uint32_t currentRow,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
doCopyNItems(pColumnInfoData, currentRow, pData, len, numOfRows);
|
return doCopyNItems(pColumnInfoData, currentRow, pData, len, numOfRows, trimValue);
|
||||||
return TSDB_CODE_SUCCESS;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void doBitmapMerge(SColumnInfoData* pColumnInfoData, int32_t numOfRow1, const SColumnInfoData* pSource,
|
static void doBitmapMerge(SColumnInfoData* pColumnInfoData, int32_t numOfRow1, const SColumnInfoData* pSource,
|
||||||
|
@ -973,7 +982,7 @@ int32_t blockDataSort(SSDataBlock* pDataBlock, SArray* pOrderInfo) {
|
||||||
taosSort(pColInfoData->pData, pDataBlock->info.rows, pColInfoData->info.bytes, fn);
|
taosSort(pColInfoData->pData, pDataBlock->info.rows, pColInfoData->info.bytes, fn);
|
||||||
|
|
||||||
int64_t p1 = taosGetTimestampUs();
|
int64_t p1 = taosGetTimestampUs();
|
||||||
uDebug("blockDataSort easy cost:%" PRId64 ", rows:%d\n", p1 - p0, pDataBlock->info.rows);
|
uDebug("blockDataSort easy cost:%" PRId64 ", rows:%" PRId64 "\n", p1 - p0, pDataBlock->info.rows);
|
||||||
|
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
} else { // var data type
|
} else { // var data type
|
||||||
|
@ -1180,7 +1189,7 @@ void blockDataCleanup(SSDataBlock* pDataBlock) {
|
||||||
|
|
||||||
void blockDataEmpty(SSDataBlock* pDataBlock) {
|
void blockDataEmpty(SSDataBlock* pDataBlock) {
|
||||||
SDataBlockInfo* pInfo = &pDataBlock->info;
|
SDataBlockInfo* pInfo = &pDataBlock->info;
|
||||||
if (pInfo->capacity == 0 || pInfo->rows > pDataBlock->info.capacity) {
|
if (pInfo->capacity == 0) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1739,14 +1748,14 @@ int32_t tEncodeDataBlock(void** buf, const SSDataBlock* pBlock) {
|
||||||
int64_t tbUid = pBlock->info.id.uid;
|
int64_t tbUid = pBlock->info.id.uid;
|
||||||
int16_t numOfCols = taosArrayGetSize(pBlock->pDataBlock);
|
int16_t numOfCols = taosArrayGetSize(pBlock->pDataBlock);
|
||||||
int16_t hasVarCol = pBlock->info.hasVarCol;
|
int16_t hasVarCol = pBlock->info.hasVarCol;
|
||||||
int32_t rows = pBlock->info.rows;
|
int64_t rows = pBlock->info.rows;
|
||||||
int32_t sz = taosArrayGetSize(pBlock->pDataBlock);
|
int32_t sz = taosArrayGetSize(pBlock->pDataBlock);
|
||||||
|
|
||||||
int32_t tlen = 0;
|
int32_t tlen = 0;
|
||||||
tlen += taosEncodeFixedI64(buf, tbUid);
|
tlen += taosEncodeFixedI64(buf, tbUid);
|
||||||
tlen += taosEncodeFixedI16(buf, numOfCols);
|
tlen += taosEncodeFixedI16(buf, numOfCols);
|
||||||
tlen += taosEncodeFixedI16(buf, hasVarCol);
|
tlen += taosEncodeFixedI16(buf, hasVarCol);
|
||||||
tlen += taosEncodeFixedI32(buf, rows);
|
tlen += taosEncodeFixedI64(buf, rows);
|
||||||
tlen += taosEncodeFixedI32(buf, sz);
|
tlen += taosEncodeFixedI32(buf, sz);
|
||||||
for (int32_t i = 0; i < sz; i++) {
|
for (int32_t i = 0; i < sz; i++) {
|
||||||
SColumnInfoData* pColData = (SColumnInfoData*)taosArrayGet(pBlock->pDataBlock, i);
|
SColumnInfoData* pColData = (SColumnInfoData*)taosArrayGet(pBlock->pDataBlock, i);
|
||||||
|
@ -1777,7 +1786,7 @@ void* tDecodeDataBlock(const void* buf, SSDataBlock* pBlock) {
|
||||||
buf = taosDecodeFixedU64(buf, &pBlock->info.id.uid);
|
buf = taosDecodeFixedU64(buf, &pBlock->info.id.uid);
|
||||||
buf = taosDecodeFixedI16(buf, &numOfCols);
|
buf = taosDecodeFixedI16(buf, &numOfCols);
|
||||||
buf = taosDecodeFixedI16(buf, &pBlock->info.hasVarCol);
|
buf = taosDecodeFixedI16(buf, &pBlock->info.hasVarCol);
|
||||||
buf = taosDecodeFixedI32(buf, &pBlock->info.rows);
|
buf = taosDecodeFixedI64(buf, &pBlock->info.rows);
|
||||||
buf = taosDecodeFixedI32(buf, &sz);
|
buf = taosDecodeFixedI32(buf, &sz);
|
||||||
pBlock->pDataBlock = taosArrayInit(sz, sizeof(SColumnInfoData));
|
pBlock->pDataBlock = taosArrayInit(sz, sizeof(SColumnInfoData));
|
||||||
for (int32_t i = 0; i < sz; i++) {
|
for (int32_t i = 0; i < sz; i++) {
|
||||||
|
@ -1981,7 +1990,7 @@ char* dumpBlockData(SSDataBlock* pDataBlock, const char* flag, char** pDataBuf)
|
||||||
int32_t len = 0;
|
int32_t len = 0;
|
||||||
len += snprintf(dumpBuf + len, size - len,
|
len += snprintf(dumpBuf + len, size - len,
|
||||||
"===stream===%s|block type %d|child id %d|group id:%" PRIu64 "|uid:%" PRId64
|
"===stream===%s|block type %d|child id %d|group id:%" PRIu64 "|uid:%" PRId64
|
||||||
"|rows:%d|version:%" PRIu64 "|cal start:%" PRIu64 "|cal end:%" PRIu64 "|tbl:%s\n",
|
"|rows:%" PRId64 "|version:%" PRIu64 "|cal start:%" PRIu64 "|cal end:%" PRIu64 "|tbl:%s\n",
|
||||||
flag, (int32_t)pDataBlock->info.type, pDataBlock->info.childId, pDataBlock->info.id.groupId,
|
flag, (int32_t)pDataBlock->info.type, pDataBlock->info.childId, pDataBlock->info.id.groupId,
|
||||||
pDataBlock->info.id.uid, pDataBlock->info.rows, pDataBlock->info.version,
|
pDataBlock->info.id.uid, pDataBlock->info.rows, pDataBlock->info.version,
|
||||||
pDataBlock->info.calWin.skey, pDataBlock->info.calWin.ekey, pDataBlock->info.parTbName);
|
pDataBlock->info.calWin.skey, pDataBlock->info.calWin.ekey, pDataBlock->info.parTbName);
|
||||||
|
|
|
@ -2439,6 +2439,12 @@ _exit:
|
||||||
int32_t tColDataAddValueByDataBlock(SColData *pColData, int8_t type, int32_t bytes, int32_t nRows, char *lengthOrbitmap,
|
int32_t tColDataAddValueByDataBlock(SColData *pColData, int8_t type, int32_t bytes, int32_t nRows, char *lengthOrbitmap,
|
||||||
char *data) {
|
char *data) {
|
||||||
int32_t code = 0;
|
int32_t code = 0;
|
||||||
|
if(data == NULL){
|
||||||
|
for (int32_t i = 0; i < nRows; ++i) {
|
||||||
|
code = tColDataAppendValueImpl[pColData->flag][CV_FLAG_NONE](pColData, NULL, 0);
|
||||||
|
}
|
||||||
|
goto _exit;
|
||||||
|
}
|
||||||
|
|
||||||
if (IS_VAR_DATA_TYPE(type)) { // var-length data type
|
if (IS_VAR_DATA_TYPE(type)) { // var-length data type
|
||||||
for (int32_t i = 0; i < nRows; ++i) {
|
for (int32_t i = 0; i < nRows; ++i) {
|
||||||
|
@ -2447,6 +2453,11 @@ int32_t tColDataAddValueByDataBlock(SColData *pColData, int8_t type, int32_t byt
|
||||||
code = tColDataAppendValueImpl[pColData->flag][CV_FLAG_NULL](pColData, NULL, 0);
|
code = tColDataAppendValueImpl[pColData->flag][CV_FLAG_NULL](pColData, NULL, 0);
|
||||||
if (code) goto _exit;
|
if (code) goto _exit;
|
||||||
} else {
|
} else {
|
||||||
|
if(ASSERT(varDataTLen(data + offset) <= bytes)){
|
||||||
|
uError("var data length invalid, varDataTLen(data + offset):%d <= bytes:%d", (int)varDataTLen(data + offset), bytes);
|
||||||
|
code = TSDB_CODE_INVALID_PARA;
|
||||||
|
goto _exit;
|
||||||
|
}
|
||||||
code = tColDataAppendValueImpl[pColData->flag][CV_FLAG_VALUE](pColData, (uint8_t *)varDataVal(data + offset),
|
code = tColDataAppendValueImpl[pColData->flag][CV_FLAG_VALUE](pColData, (uint8_t *)varDataVal(data + offset),
|
||||||
varDataLen(data + offset));
|
varDataLen(data + offset));
|
||||||
}
|
}
|
||||||
|
|
|
@ -18,6 +18,7 @@
|
||||||
#include "mnode.h"
|
#include "mnode.h"
|
||||||
#include "tconfig.h"
|
#include "tconfig.h"
|
||||||
#include "tglobal.h"
|
#include "tglobal.h"
|
||||||
|
#include "version.h"
|
||||||
|
|
||||||
// clang-format off
|
// clang-format off
|
||||||
#define DM_APOLLO_URL "The apollo string to use when configuring the server, such as: -a 'jsonFile:./tests/cfg.json', cfg.json text can be '{\"fqdn\":\"td1\"}'."
|
#define DM_APOLLO_URL "The apollo string to use when configuring the server, such as: -a 'jsonFile:./tests/cfg.json', cfg.json text can be '{\"fqdn\":\"td1\"}'."
|
||||||
|
@ -76,28 +77,28 @@ void dmLogCrash(int signum, void *sigInfo, void *context) {
|
||||||
taosIgnSignal(SIGINT);
|
taosIgnSignal(SIGINT);
|
||||||
taosIgnSignal(SIGBREAK);
|
taosIgnSignal(SIGBREAK);
|
||||||
|
|
||||||
#ifndef WINDOWS
|
#ifndef WINDOWS
|
||||||
taosIgnSignal(SIGBUS);
|
taosIgnSignal(SIGBUS);
|
||||||
#endif
|
#endif
|
||||||
taosIgnSignal(SIGABRT);
|
taosIgnSignal(SIGABRT);
|
||||||
taosIgnSignal(SIGFPE);
|
taosIgnSignal(SIGFPE);
|
||||||
taosIgnSignal(SIGSEGV);
|
taosIgnSignal(SIGSEGV);
|
||||||
|
|
||||||
char *pMsg = NULL;
|
char *pMsg = NULL;
|
||||||
const char *flags = "UTL FATAL ";
|
const char *flags = "UTL FATAL ";
|
||||||
ELogLevel level = DEBUG_FATAL;
|
ELogLevel level = DEBUG_FATAL;
|
||||||
int32_t dflag = 255;
|
int32_t dflag = 255;
|
||||||
int64_t msgLen= -1;
|
int64_t msgLen = -1;
|
||||||
|
|
||||||
if (tsEnableCrashReport) {
|
if (tsEnableCrashReport) {
|
||||||
if (taosGenCrashJsonMsg(signum, &pMsg, dmGetClusterId(), global.startTime)) {
|
if (taosGenCrashJsonMsg(signum, &pMsg, dmGetClusterId(), global.startTime)) {
|
||||||
taosPrintLog(flags, level, dflag, "failed to generate crash json msg");
|
taosPrintLog(flags, level, dflag, "failed to generate crash json msg");
|
||||||
goto _return;
|
goto _return;
|
||||||
} else {
|
} else {
|
||||||
msgLen = strlen(pMsg);
|
msgLen = strlen(pMsg);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
_return:
|
_return:
|
||||||
|
|
||||||
taosLogCrashInfo("taosd", pMsg, msgLen, signum, sigInfo);
|
taosLogCrashInfo("taosd", pMsg, msgLen, signum, sigInfo);
|
||||||
|
@ -123,7 +124,7 @@ static void dmSetSignalHandle() {
|
||||||
|
|
||||||
#ifndef WINDOWS
|
#ifndef WINDOWS
|
||||||
taosSetSignal(SIGBUS, dmLogCrash);
|
taosSetSignal(SIGBUS, dmLogCrash);
|
||||||
#endif
|
#endif
|
||||||
taosSetSignal(SIGABRT, dmLogCrash);
|
taosSetSignal(SIGABRT, dmLogCrash);
|
||||||
taosSetSignal(SIGFPE, dmLogCrash);
|
taosSetSignal(SIGFPE, dmLogCrash);
|
||||||
taosSetSignal(SIGSEGV, dmLogCrash);
|
taosSetSignal(SIGSEGV, dmLogCrash);
|
||||||
|
@ -134,7 +135,7 @@ static int32_t dmParseArgs(int32_t argc, char const *argv[]) {
|
||||||
|
|
||||||
int32_t cmdEnvIndex = 0;
|
int32_t cmdEnvIndex = 0;
|
||||||
if (argc < 2) return 0;
|
if (argc < 2) return 0;
|
||||||
|
|
||||||
global.envCmd = taosMemoryMalloc((argc - 1) * sizeof(char *));
|
global.envCmd = taosMemoryMalloc((argc - 1) * sizeof(char *));
|
||||||
memset(global.envCmd, 0, (argc - 1) * sizeof(char *));
|
memset(global.envCmd, 0, (argc - 1) * sizeof(char *));
|
||||||
for (int32_t i = 1; i < argc; ++i) {
|
for (int32_t i = 1; i < argc; ++i) {
|
||||||
|
@ -203,6 +204,9 @@ static void dmPrintVersion() {
|
||||||
#endif
|
#endif
|
||||||
printf("%s version: %s compatible_version: %s\n", releaseName, version, compatible_version);
|
printf("%s version: %s compatible_version: %s\n", releaseName, version, compatible_version);
|
||||||
printf("gitinfo: %s\n", gitinfo);
|
printf("gitinfo: %s\n", gitinfo);
|
||||||
|
#ifdef TD_ENTERPRISE
|
||||||
|
printf("gitinfoOfInternal: %s\n", gitinfoOfInternal);
|
||||||
|
#endif
|
||||||
printf("buildInfo: %s\n", buildinfo);
|
printf("buildInfo: %s\n", buildinfo);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -284,7 +288,7 @@ int mainWindows(int argc, char **argv) {
|
||||||
printf("failed to init memory dbg, error:%s\n", tstrerror(code));
|
printf("failed to init memory dbg, error:%s\n", tstrerror(code));
|
||||||
return code;
|
return code;
|
||||||
}
|
}
|
||||||
tsAsyncLog = false;
|
tsAsyncLog = false;
|
||||||
printf("memory dbg enabled\n");
|
printf("memory dbg enabled\n");
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -34,7 +34,7 @@ typedef struct SMnodeMgmt {
|
||||||
SSingleWorker readWorker;
|
SSingleWorker readWorker;
|
||||||
SSingleWorker writeWorker;
|
SSingleWorker writeWorker;
|
||||||
SSingleWorker syncWorker;
|
SSingleWorker syncWorker;
|
||||||
SSingleWorker syncCtrlWorker;
|
SSingleWorker syncRdWorker;
|
||||||
bool stopped;
|
bool stopped;
|
||||||
int32_t refCount;
|
int32_t refCount;
|
||||||
TdThreadRwlock lock;
|
TdThreadRwlock lock;
|
||||||
|
@ -54,7 +54,7 @@ int32_t mmStartWorker(SMnodeMgmt *pMgmt);
|
||||||
void mmStopWorker(SMnodeMgmt *pMgmt);
|
void mmStopWorker(SMnodeMgmt *pMgmt);
|
||||||
int32_t mmPutMsgToWriteQueue(SMnodeMgmt *pMgmt, SRpcMsg *pMsg);
|
int32_t mmPutMsgToWriteQueue(SMnodeMgmt *pMgmt, SRpcMsg *pMsg);
|
||||||
int32_t mmPutMsgToSyncQueue(SMnodeMgmt *pMgmt, SRpcMsg *pMsg);
|
int32_t mmPutMsgToSyncQueue(SMnodeMgmt *pMgmt, SRpcMsg *pMsg);
|
||||||
int32_t mmPutMsgToSyncCtrlQueue(SMnodeMgmt *pMgmt, SRpcMsg *pMsg);
|
int32_t mmPutMsgToSyncRdQueue(SMnodeMgmt *pMgmt, SRpcMsg *pMsg);
|
||||||
int32_t mmPutMsgToReadQueue(SMnodeMgmt *pMgmt, SRpcMsg *pMsg);
|
int32_t mmPutMsgToReadQueue(SMnodeMgmt *pMgmt, SRpcMsg *pMsg);
|
||||||
int32_t mmPutMsgToQueryQueue(SMnodeMgmt *pMgmt, SRpcMsg *pMsg);
|
int32_t mmPutMsgToQueryQueue(SMnodeMgmt *pMgmt, SRpcMsg *pMsg);
|
||||||
int32_t mmPutMsgToFetchQueue(SMnodeMgmt *pMgmt, SRpcMsg *pMsg);
|
int32_t mmPutMsgToFetchQueue(SMnodeMgmt *pMgmt, SRpcMsg *pMsg);
|
||||||
|
|
|
@ -188,7 +188,8 @@ SArray *mmGetMsgHandles() {
|
||||||
if (dmSetMgmtHandle(pArray, TDMT_VND_DROP_INDEX_RSP, mmPutMsgToWriteQueue, 0) == NULL) goto _OVER;
|
if (dmSetMgmtHandle(pArray, TDMT_VND_DROP_INDEX_RSP, mmPutMsgToWriteQueue, 0) == NULL) goto _OVER;
|
||||||
if (dmSetMgmtHandle(pArray, TDMT_VND_DISABLE_WRITE_RSP, mmPutMsgToWriteQueue, 0) == NULL) goto _OVER;
|
if (dmSetMgmtHandle(pArray, TDMT_VND_DISABLE_WRITE_RSP, mmPutMsgToWriteQueue, 0) == NULL) goto _OVER;
|
||||||
|
|
||||||
if (dmSetMgmtHandle(pArray, TDMT_SYNC_TIMEOUT, mmPutMsgToSyncQueue, 1) == NULL) goto _OVER;
|
if (dmSetMgmtHandle(pArray, TDMT_SYNC_TIMEOUT_ELECTION, mmPutMsgToSyncQueue, 1) == NULL) goto _OVER;
|
||||||
|
if (dmSetMgmtHandle(pArray, TDMT_SYNC_HEARTBEAT, mmPutMsgToSyncRdQueue, 1) == NULL) goto _OVER;
|
||||||
if (dmSetMgmtHandle(pArray, TDMT_SYNC_CLIENT_REQUEST, mmPutMsgToSyncQueue, 1) == NULL) goto _OVER;
|
if (dmSetMgmtHandle(pArray, TDMT_SYNC_CLIENT_REQUEST, mmPutMsgToSyncQueue, 1) == NULL) goto _OVER;
|
||||||
if (dmSetMgmtHandle(pArray, TDMT_SYNC_CLIENT_REQUEST_BATCH, mmPutMsgToSyncQueue, 1) == NULL) goto _OVER;
|
if (dmSetMgmtHandle(pArray, TDMT_SYNC_CLIENT_REQUEST_BATCH, mmPutMsgToSyncQueue, 1) == NULL) goto _OVER;
|
||||||
if (dmSetMgmtHandle(pArray, TDMT_SYNC_CLIENT_REQUEST_REPLY, mmPutMsgToSyncQueue, 1) == NULL) goto _OVER;
|
if (dmSetMgmtHandle(pArray, TDMT_SYNC_CLIENT_REQUEST_REPLY, mmPutMsgToSyncQueue, 1) == NULL) goto _OVER;
|
||||||
|
@ -198,11 +199,12 @@ SArray *mmGetMsgHandles() {
|
||||||
if (dmSetMgmtHandle(pArray, TDMT_SYNC_APPEND_ENTRIES_BATCH, mmPutMsgToSyncQueue, 1) == NULL) goto _OVER;
|
if (dmSetMgmtHandle(pArray, TDMT_SYNC_APPEND_ENTRIES_BATCH, mmPutMsgToSyncQueue, 1) == NULL) goto _OVER;
|
||||||
if (dmSetMgmtHandle(pArray, TDMT_SYNC_APPEND_ENTRIES_REPLY, mmPutMsgToSyncQueue, 1) == NULL) goto _OVER;
|
if (dmSetMgmtHandle(pArray, TDMT_SYNC_APPEND_ENTRIES_REPLY, mmPutMsgToSyncQueue, 1) == NULL) goto _OVER;
|
||||||
if (dmSetMgmtHandle(pArray, TDMT_SYNC_SNAPSHOT_SEND, mmPutMsgToSyncQueue, 1) == NULL) goto _OVER;
|
if (dmSetMgmtHandle(pArray, TDMT_SYNC_SNAPSHOT_SEND, mmPutMsgToSyncQueue, 1) == NULL) goto _OVER;
|
||||||
if (dmSetMgmtHandle(pArray, TDMT_SYNC_SNAPSHOT_RSP, mmPutMsgToSyncQueue, 1) == NULL) goto _OVER;
|
|
||||||
if (dmSetMgmtHandle(pArray, TDMT_SYNC_PRE_SNAPSHOT, mmPutMsgToSyncQueue, 1) == NULL) goto _OVER;
|
if (dmSetMgmtHandle(pArray, TDMT_SYNC_PRE_SNAPSHOT, mmPutMsgToSyncQueue, 1) == NULL) goto _OVER;
|
||||||
if (dmSetMgmtHandle(pArray, TDMT_SYNC_PRE_SNAPSHOT_REPLY, mmPutMsgToSyncQueue, 1) == NULL) goto _OVER;
|
|
||||||
if (dmSetMgmtHandle(pArray, TDMT_SYNC_HEARTBEAT, mmPutMsgToSyncCtrlQueue, 1) == NULL) goto _OVER;
|
if (dmSetMgmtHandle(pArray, TDMT_SYNC_TIMEOUT, mmPutMsgToSyncRdQueue, 1) == NULL) goto _OVER;
|
||||||
if (dmSetMgmtHandle(pArray, TDMT_SYNC_HEARTBEAT_REPLY, mmPutMsgToSyncCtrlQueue, 1) == NULL) goto _OVER;
|
if (dmSetMgmtHandle(pArray, TDMT_SYNC_HEARTBEAT_REPLY, mmPutMsgToSyncRdQueue, 1) == NULL) goto _OVER;
|
||||||
|
if (dmSetMgmtHandle(pArray, TDMT_SYNC_SNAPSHOT_RSP, mmPutMsgToSyncRdQueue, 1) == NULL) goto _OVER;
|
||||||
|
if (dmSetMgmtHandle(pArray, TDMT_SYNC_PRE_SNAPSHOT_REPLY, mmPutMsgToSyncRdQueue, 1) == NULL) goto _OVER;
|
||||||
|
|
||||||
code = 0;
|
code = 0;
|
||||||
|
|
||||||
|
|
|
@ -111,8 +111,8 @@ int32_t mmPutMsgToSyncQueue(SMnodeMgmt *pMgmt, SRpcMsg *pMsg) {
|
||||||
return mmPutMsgToWorker(pMgmt, &pMgmt->syncWorker, pMsg);
|
return mmPutMsgToWorker(pMgmt, &pMgmt->syncWorker, pMsg);
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t mmPutMsgToSyncCtrlQueue(SMnodeMgmt *pMgmt, SRpcMsg *pMsg) {
|
int32_t mmPutMsgToSyncRdQueue(SMnodeMgmt *pMgmt, SRpcMsg *pMsg) {
|
||||||
return mmPutMsgToWorker(pMgmt, &pMgmt->syncCtrlWorker, pMsg);
|
return mmPutMsgToWorker(pMgmt, &pMgmt->syncRdWorker, pMsg);
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t mmPutMsgToReadQueue(SMnodeMgmt *pMgmt, SRpcMsg *pMsg) {
|
int32_t mmPutMsgToReadQueue(SMnodeMgmt *pMgmt, SRpcMsg *pMsg) {
|
||||||
|
@ -151,8 +151,8 @@ int32_t mmPutMsgToQueue(SMnodeMgmt *pMgmt, EQueueType qtype, SRpcMsg *pRpc) {
|
||||||
case SYNC_QUEUE:
|
case SYNC_QUEUE:
|
||||||
pWorker = &pMgmt->syncWorker;
|
pWorker = &pMgmt->syncWorker;
|
||||||
break;
|
break;
|
||||||
case SYNC_CTRL_QUEUE:
|
case SYNC_RD_QUEUE:
|
||||||
pWorker = &pMgmt->syncCtrlWorker;
|
pWorker = &pMgmt->syncRdWorker;
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
terrno = TSDB_CODE_INVALID_PARA;
|
terrno = TSDB_CODE_INVALID_PARA;
|
||||||
|
@ -238,12 +238,12 @@ int32_t mmStartWorker(SMnodeMgmt *pMgmt) {
|
||||||
SSingleWorkerCfg scCfg = {
|
SSingleWorkerCfg scCfg = {
|
||||||
.min = 1,
|
.min = 1,
|
||||||
.max = 1,
|
.max = 1,
|
||||||
.name = "mnode-sync-ctrl",
|
.name = "mnode-sync-rd",
|
||||||
.fp = (FItem)mmProcessSyncMsg,
|
.fp = (FItem)mmProcessSyncMsg,
|
||||||
.param = pMgmt,
|
.param = pMgmt,
|
||||||
};
|
};
|
||||||
if (tSingleWorkerInit(&pMgmt->syncCtrlWorker, &scCfg) != 0) {
|
if (tSingleWorkerInit(&pMgmt->syncRdWorker, &scCfg) != 0) {
|
||||||
dError("failed to start mnode mnode-sync-ctrl worker since %s", terrstr());
|
dError("failed to start mnode mnode-sync-rd worker since %s", terrstr());
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -259,6 +259,6 @@ void mmStopWorker(SMnodeMgmt *pMgmt) {
|
||||||
tSingleWorkerCleanup(&pMgmt->readWorker);
|
tSingleWorkerCleanup(&pMgmt->readWorker);
|
||||||
tSingleWorkerCleanup(&pMgmt->writeWorker);
|
tSingleWorkerCleanup(&pMgmt->writeWorker);
|
||||||
tSingleWorkerCleanup(&pMgmt->syncWorker);
|
tSingleWorkerCleanup(&pMgmt->syncWorker);
|
||||||
tSingleWorkerCleanup(&pMgmt->syncCtrlWorker);
|
tSingleWorkerCleanup(&pMgmt->syncRdWorker);
|
||||||
dDebug("mnode workers are closed");
|
dDebug("mnode workers are closed");
|
||||||
}
|
}
|
||||||
|
|
|
@ -59,7 +59,7 @@ typedef struct {
|
||||||
SVnode *pImpl;
|
SVnode *pImpl;
|
||||||
SMultiWorker pWriteW;
|
SMultiWorker pWriteW;
|
||||||
SMultiWorker pSyncW;
|
SMultiWorker pSyncW;
|
||||||
SMultiWorker pSyncCtrlW;
|
SMultiWorker pSyncRdW;
|
||||||
SMultiWorker pApplyW;
|
SMultiWorker pApplyW;
|
||||||
STaosQueue *pQueryQ;
|
STaosQueue *pQueryQ;
|
||||||
STaosQueue *pStreamQ;
|
STaosQueue *pStreamQ;
|
||||||
|
@ -107,7 +107,7 @@ int32_t vmPutRpcMsgToQueue(SVnodeMgmt *pMgmt, EQueueType qtype, SRpcMsg *pRpc);
|
||||||
|
|
||||||
int32_t vmPutMsgToWriteQueue(SVnodeMgmt *pMgmt, SRpcMsg *pMsg);
|
int32_t vmPutMsgToWriteQueue(SVnodeMgmt *pMgmt, SRpcMsg *pMsg);
|
||||||
int32_t vmPutMsgToSyncQueue(SVnodeMgmt *pMgmt, SRpcMsg *pMsg);
|
int32_t vmPutMsgToSyncQueue(SVnodeMgmt *pMgmt, SRpcMsg *pMsg);
|
||||||
int32_t vmPutMsgToSyncCtrlQueue(SVnodeMgmt *pMgmt, SRpcMsg *pMsg);
|
int32_t vmPutMsgToSyncRdQueue(SVnodeMgmt *pMgmt, SRpcMsg *pMsg);
|
||||||
int32_t vmPutMsgToQueryQueue(SVnodeMgmt *pMgmt, SRpcMsg *pMsg);
|
int32_t vmPutMsgToQueryQueue(SVnodeMgmt *pMgmt, SRpcMsg *pMsg);
|
||||||
int32_t vmPutMsgToFetchQueue(SVnodeMgmt *pMgmt, SRpcMsg *pMsg);
|
int32_t vmPutMsgToFetchQueue(SVnodeMgmt *pMgmt, SRpcMsg *pMsg);
|
||||||
int32_t vmPutMsgToStreamQueue(SVnodeMgmt *pMgmt, SRpcMsg *pMsg);
|
int32_t vmPutMsgToStreamQueue(SVnodeMgmt *pMgmt, SRpcMsg *pMsg);
|
||||||
|
|
|
@ -549,7 +549,8 @@ SArray *vmGetMsgHandles() {
|
||||||
if (dmSetMgmtHandle(pArray, TDMT_DND_CREATE_VNODE, vmPutMsgToMgmtQueue, 0) == NULL) goto _OVER;
|
if (dmSetMgmtHandle(pArray, TDMT_DND_CREATE_VNODE, vmPutMsgToMgmtQueue, 0) == NULL) goto _OVER;
|
||||||
if (dmSetMgmtHandle(pArray, TDMT_DND_DROP_VNODE, vmPutMsgToMgmtQueue, 0) == NULL) goto _OVER;
|
if (dmSetMgmtHandle(pArray, TDMT_DND_DROP_VNODE, vmPutMsgToMgmtQueue, 0) == NULL) goto _OVER;
|
||||||
|
|
||||||
if (dmSetMgmtHandle(pArray, TDMT_SYNC_TIMEOUT, vmPutMsgToSyncQueue, 0) == NULL) goto _OVER;
|
if (dmSetMgmtHandle(pArray, TDMT_SYNC_TIMEOUT_ELECTION, vmPutMsgToSyncQueue, 0) == NULL) goto _OVER;
|
||||||
|
if (dmSetMgmtHandle(pArray, TDMT_SYNC_HEARTBEAT, vmPutMsgToSyncRdQueue, 0) == NULL) goto _OVER;
|
||||||
if (dmSetMgmtHandle(pArray, TDMT_SYNC_CLIENT_REQUEST, vmPutMsgToSyncQueue, 0) == NULL) goto _OVER;
|
if (dmSetMgmtHandle(pArray, TDMT_SYNC_CLIENT_REQUEST, vmPutMsgToSyncQueue, 0) == NULL) goto _OVER;
|
||||||
if (dmSetMgmtHandle(pArray, TDMT_SYNC_CLIENT_REQUEST_BATCH, vmPutMsgToSyncQueue, 0) == NULL) goto _OVER;
|
if (dmSetMgmtHandle(pArray, TDMT_SYNC_CLIENT_REQUEST_BATCH, vmPutMsgToSyncQueue, 0) == NULL) goto _OVER;
|
||||||
if (dmSetMgmtHandle(pArray, TDMT_SYNC_CLIENT_REQUEST_REPLY, vmPutMsgToSyncQueue, 0) == NULL) goto _OVER;
|
if (dmSetMgmtHandle(pArray, TDMT_SYNC_CLIENT_REQUEST_REPLY, vmPutMsgToSyncQueue, 0) == NULL) goto _OVER;
|
||||||
|
@ -559,12 +560,12 @@ SArray *vmGetMsgHandles() {
|
||||||
if (dmSetMgmtHandle(pArray, TDMT_SYNC_APPEND_ENTRIES_BATCH, vmPutMsgToSyncQueue, 0) == NULL) goto _OVER;
|
if (dmSetMgmtHandle(pArray, TDMT_SYNC_APPEND_ENTRIES_BATCH, vmPutMsgToSyncQueue, 0) == NULL) goto _OVER;
|
||||||
if (dmSetMgmtHandle(pArray, TDMT_SYNC_APPEND_ENTRIES_REPLY, vmPutMsgToSyncQueue, 0) == NULL) goto _OVER;
|
if (dmSetMgmtHandle(pArray, TDMT_SYNC_APPEND_ENTRIES_REPLY, vmPutMsgToSyncQueue, 0) == NULL) goto _OVER;
|
||||||
if (dmSetMgmtHandle(pArray, TDMT_SYNC_SNAPSHOT_SEND, vmPutMsgToSyncQueue, 0) == NULL) goto _OVER;
|
if (dmSetMgmtHandle(pArray, TDMT_SYNC_SNAPSHOT_SEND, vmPutMsgToSyncQueue, 0) == NULL) goto _OVER;
|
||||||
if (dmSetMgmtHandle(pArray, TDMT_SYNC_SNAPSHOT_RSP, vmPutMsgToSyncQueue, 0) == NULL) goto _OVER;
|
|
||||||
if (dmSetMgmtHandle(pArray, TDMT_SYNC_PRE_SNAPSHOT, vmPutMsgToSyncQueue, 0) == NULL) goto _OVER;
|
if (dmSetMgmtHandle(pArray, TDMT_SYNC_PRE_SNAPSHOT, vmPutMsgToSyncQueue, 0) == NULL) goto _OVER;
|
||||||
if (dmSetMgmtHandle(pArray, TDMT_SYNC_PRE_SNAPSHOT_REPLY, vmPutMsgToSyncQueue, 0) == NULL) goto _OVER;
|
|
||||||
|
|
||||||
if (dmSetMgmtHandle(pArray, TDMT_SYNC_HEARTBEAT, vmPutMsgToSyncCtrlQueue, 0) == NULL) goto _OVER;
|
if (dmSetMgmtHandle(pArray, TDMT_SYNC_TIMEOUT, vmPutMsgToSyncRdQueue, 0) == NULL) goto _OVER;
|
||||||
if (dmSetMgmtHandle(pArray, TDMT_SYNC_HEARTBEAT_REPLY, vmPutMsgToSyncCtrlQueue, 0) == NULL) goto _OVER;
|
if (dmSetMgmtHandle(pArray, TDMT_SYNC_HEARTBEAT_REPLY, vmPutMsgToSyncRdQueue, 0) == NULL) goto _OVER;
|
||||||
|
if (dmSetMgmtHandle(pArray, TDMT_SYNC_SNAPSHOT_RSP, vmPutMsgToSyncRdQueue, 0) == NULL) goto _OVER;
|
||||||
|
if (dmSetMgmtHandle(pArray, TDMT_SYNC_PRE_SNAPSHOT_REPLY, vmPutMsgToSyncRdQueue, 0) == NULL) goto _OVER;
|
||||||
|
|
||||||
code = 0;
|
code = 0;
|
||||||
|
|
||||||
|
|
|
@ -98,9 +98,9 @@ void vmCloseVnode(SVnodeMgmt *pMgmt, SVnodeObj *pVnode, bool commitAndRemoveWal)
|
||||||
pVnode->pSyncW.queue->threadId);
|
pVnode->pSyncW.queue->threadId);
|
||||||
tMultiWorkerCleanup(&pVnode->pSyncW);
|
tMultiWorkerCleanup(&pVnode->pSyncW);
|
||||||
|
|
||||||
dInfo("vgId:%d, wait for vnode sync ctrl queue:%p is empty, thread:%08" PRId64, pVnode->vgId,
|
dInfo("vgId:%d, wait for vnode sync rd queue:%p is empty, thread:%08" PRId64, pVnode->vgId, pVnode->pSyncRdW.queue,
|
||||||
pVnode->pSyncCtrlW.queue, pVnode->pSyncCtrlW.queue->threadId);
|
pVnode->pSyncRdW.queue->threadId);
|
||||||
tMultiWorkerCleanup(&pVnode->pSyncCtrlW);
|
tMultiWorkerCleanup(&pVnode->pSyncRdW);
|
||||||
|
|
||||||
dInfo("vgId:%d, wait for vnode apply queue:%p is empty, thread:%08" PRId64, pVnode->vgId, pVnode->pApplyW.queue,
|
dInfo("vgId:%d, wait for vnode apply queue:%p is empty, thread:%08" PRId64, pVnode->vgId, pVnode->pApplyW.queue,
|
||||||
pVnode->pApplyW.queue->threadId);
|
pVnode->pApplyW.queue->threadId);
|
||||||
|
|
|
@ -216,9 +216,9 @@ static int32_t vmPutMsgToQueue(SVnodeMgmt *pMgmt, SRpcMsg *pMsg, EQueueType qtyp
|
||||||
dGTrace("vgId:%d, msg:%p put into vnode-sync queue", pVnode->vgId, pMsg);
|
dGTrace("vgId:%d, msg:%p put into vnode-sync queue", pVnode->vgId, pMsg);
|
||||||
taosWriteQitem(pVnode->pSyncW.queue, pMsg);
|
taosWriteQitem(pVnode->pSyncW.queue, pMsg);
|
||||||
break;
|
break;
|
||||||
case SYNC_CTRL_QUEUE:
|
case SYNC_RD_QUEUE:
|
||||||
dGTrace("vgId:%d, msg:%p put into vnode-sync-ctrl queue", pVnode->vgId, pMsg);
|
dGTrace("vgId:%d, msg:%p put into vnode-sync-rd queue", pVnode->vgId, pMsg);
|
||||||
taosWriteQitem(pVnode->pSyncCtrlW.queue, pMsg);
|
taosWriteQitem(pVnode->pSyncRdW.queue, pMsg);
|
||||||
break;
|
break;
|
||||||
case APPLY_QUEUE:
|
case APPLY_QUEUE:
|
||||||
dGTrace("vgId:%d, msg:%p put into vnode-apply queue", pVnode->vgId, pMsg);
|
dGTrace("vgId:%d, msg:%p put into vnode-apply queue", pVnode->vgId, pMsg);
|
||||||
|
@ -234,9 +234,7 @@ static int32_t vmPutMsgToQueue(SVnodeMgmt *pMgmt, SRpcMsg *pMsg, EQueueType qtyp
|
||||||
return code;
|
return code;
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t vmPutMsgToSyncCtrlQueue(SVnodeMgmt *pMgmt, SRpcMsg *pMsg) {
|
int32_t vmPutMsgToSyncRdQueue(SVnodeMgmt *pMgmt, SRpcMsg *pMsg) { return vmPutMsgToQueue(pMgmt, pMsg, SYNC_RD_QUEUE); }
|
||||||
return vmPutMsgToQueue(pMgmt, pMsg, SYNC_CTRL_QUEUE);
|
|
||||||
}
|
|
||||||
|
|
||||||
int32_t vmPutMsgToSyncQueue(SVnodeMgmt *pMgmt, SRpcMsg *pMsg) { return vmPutMsgToQueue(pMgmt, pMsg, SYNC_QUEUE); }
|
int32_t vmPutMsgToSyncQueue(SVnodeMgmt *pMgmt, SRpcMsg *pMsg) { return vmPutMsgToQueue(pMgmt, pMsg, SYNC_QUEUE); }
|
||||||
|
|
||||||
|
@ -327,18 +325,18 @@ int32_t vmGetQueueSize(SVnodeMgmt *pMgmt, int32_t vgId, EQueueType qtype) {
|
||||||
int32_t vmAllocQueue(SVnodeMgmt *pMgmt, SVnodeObj *pVnode) {
|
int32_t vmAllocQueue(SVnodeMgmt *pMgmt, SVnodeObj *pVnode) {
|
||||||
SMultiWorkerCfg wcfg = {.max = 1, .name = "vnode-write", .fp = (FItems)vnodeProposeWriteMsg, .param = pVnode->pImpl};
|
SMultiWorkerCfg wcfg = {.max = 1, .name = "vnode-write", .fp = (FItems)vnodeProposeWriteMsg, .param = pVnode->pImpl};
|
||||||
SMultiWorkerCfg scfg = {.max = 1, .name = "vnode-sync", .fp = (FItems)vmProcessSyncQueue, .param = pVnode};
|
SMultiWorkerCfg scfg = {.max = 1, .name = "vnode-sync", .fp = (FItems)vmProcessSyncQueue, .param = pVnode};
|
||||||
SMultiWorkerCfg sccfg = {.max = 1, .name = "vnode-sync-ctrl", .fp = (FItems)vmProcessSyncQueue, .param = pVnode};
|
SMultiWorkerCfg sccfg = {.max = 1, .name = "vnode-sync-rd", .fp = (FItems)vmProcessSyncQueue, .param = pVnode};
|
||||||
SMultiWorkerCfg acfg = {.max = 1, .name = "vnode-apply", .fp = (FItems)vnodeApplyWriteMsg, .param = pVnode->pImpl};
|
SMultiWorkerCfg acfg = {.max = 1, .name = "vnode-apply", .fp = (FItems)vnodeApplyWriteMsg, .param = pVnode->pImpl};
|
||||||
(void)tMultiWorkerInit(&pVnode->pWriteW, &wcfg);
|
(void)tMultiWorkerInit(&pVnode->pWriteW, &wcfg);
|
||||||
(void)tMultiWorkerInit(&pVnode->pSyncW, &scfg);
|
(void)tMultiWorkerInit(&pVnode->pSyncW, &scfg);
|
||||||
(void)tMultiWorkerInit(&pVnode->pSyncCtrlW, &sccfg);
|
(void)tMultiWorkerInit(&pVnode->pSyncRdW, &sccfg);
|
||||||
(void)tMultiWorkerInit(&pVnode->pApplyW, &acfg);
|
(void)tMultiWorkerInit(&pVnode->pApplyW, &acfg);
|
||||||
|
|
||||||
pVnode->pQueryQ = tQWorkerAllocQueue(&pMgmt->queryPool, pVnode, (FItem)vmProcessQueryQueue);
|
pVnode->pQueryQ = tQWorkerAllocQueue(&pMgmt->queryPool, pVnode, (FItem)vmProcessQueryQueue);
|
||||||
pVnode->pStreamQ = tAutoQWorkerAllocQueue(&pMgmt->streamPool, pVnode, (FItem)vmProcessStreamQueue);
|
pVnode->pStreamQ = tAutoQWorkerAllocQueue(&pMgmt->streamPool, pVnode, (FItem)vmProcessStreamQueue);
|
||||||
pVnode->pFetchQ = tWWorkerAllocQueue(&pMgmt->fetchPool, pVnode, (FItems)vmProcessFetchQueue);
|
pVnode->pFetchQ = tWWorkerAllocQueue(&pMgmt->fetchPool, pVnode, (FItems)vmProcessFetchQueue);
|
||||||
|
|
||||||
if (pVnode->pWriteW.queue == NULL || pVnode->pSyncW.queue == NULL || pVnode->pSyncCtrlW.queue == NULL ||
|
if (pVnode->pWriteW.queue == NULL || pVnode->pSyncW.queue == NULL || pVnode->pSyncRdW.queue == NULL ||
|
||||||
pVnode->pApplyW.queue == NULL || pVnode->pQueryQ == NULL || pVnode->pStreamQ == NULL || pVnode->pFetchQ == NULL) {
|
pVnode->pApplyW.queue == NULL || pVnode->pQueryQ == NULL || pVnode->pStreamQ == NULL || pVnode->pFetchQ == NULL) {
|
||||||
terrno = TSDB_CODE_OUT_OF_MEMORY;
|
terrno = TSDB_CODE_OUT_OF_MEMORY;
|
||||||
return -1;
|
return -1;
|
||||||
|
@ -348,8 +346,8 @@ int32_t vmAllocQueue(SVnodeMgmt *pMgmt, SVnodeObj *pVnode) {
|
||||||
pVnode->pWriteW.queue->threadId);
|
pVnode->pWriteW.queue->threadId);
|
||||||
dInfo("vgId:%d, sync-queue:%p is alloced, thread:%08" PRId64, pVnode->vgId, pVnode->pSyncW.queue,
|
dInfo("vgId:%d, sync-queue:%p is alloced, thread:%08" PRId64, pVnode->vgId, pVnode->pSyncW.queue,
|
||||||
pVnode->pSyncW.queue->threadId);
|
pVnode->pSyncW.queue->threadId);
|
||||||
dInfo("vgId:%d, sync-ctrl-queue:%p is alloced, thread:%08" PRId64, pVnode->vgId, pVnode->pSyncCtrlW.queue,
|
dInfo("vgId:%d, sync-rd-queue:%p is alloced, thread:%08" PRId64, pVnode->vgId, pVnode->pSyncRdW.queue,
|
||||||
pVnode->pSyncCtrlW.queue->threadId);
|
pVnode->pSyncRdW.queue->threadId);
|
||||||
dInfo("vgId:%d, apply-queue:%p is alloced, thread:%08" PRId64, pVnode->vgId, pVnode->pApplyW.queue,
|
dInfo("vgId:%d, apply-queue:%p is alloced, thread:%08" PRId64, pVnode->vgId, pVnode->pApplyW.queue,
|
||||||
pVnode->pApplyW.queue->threadId);
|
pVnode->pApplyW.queue->threadId);
|
||||||
dInfo("vgId:%d, query-queue:%p is alloced", pVnode->vgId, pVnode->pQueryQ);
|
dInfo("vgId:%d, query-queue:%p is alloced", pVnode->vgId, pVnode->pQueryQ);
|
||||||
|
|
|
@ -247,6 +247,13 @@ static SMqRebInfo *mndGetOrCreateRebSub(SHashObj *pHash, const char *key) {
|
||||||
return pRebInfo;
|
return pRebInfo;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void freeRebalanceItem(void* param) {
|
||||||
|
SMqRebInfo* pInfo = param;
|
||||||
|
taosArrayDestroy(pInfo->lostConsumers);
|
||||||
|
taosArrayDestroy(pInfo->newConsumers);
|
||||||
|
taosArrayDestroy(pInfo->removedConsumers);
|
||||||
|
}
|
||||||
|
|
||||||
static int32_t mndProcessMqTimerMsg(SRpcMsg *pMsg) {
|
static int32_t mndProcessMqTimerMsg(SRpcMsg *pMsg) {
|
||||||
SMnode *pMnode = pMsg->info.node;
|
SMnode *pMnode = pMsg->info.node;
|
||||||
SSdb *pSdb = pMnode->pSdb;
|
SSdb *pSdb = pMnode->pSdb;
|
||||||
|
@ -262,8 +269,21 @@ static int32_t mndProcessMqTimerMsg(SRpcMsg *pMsg) {
|
||||||
}
|
}
|
||||||
|
|
||||||
SMqDoRebalanceMsg *pRebMsg = rpcMallocCont(sizeof(SMqDoRebalanceMsg));
|
SMqDoRebalanceMsg *pRebMsg = rpcMallocCont(sizeof(SMqDoRebalanceMsg));
|
||||||
|
if (pRebMsg == NULL) {
|
||||||
|
mError("failed to create the rebalance msg, size:%d, quit mq timer", (int32_t) sizeof(SMqDoRebalanceMsg));
|
||||||
|
mndRebEnd();
|
||||||
|
return TSDB_CODE_OUT_OF_MEMORY;
|
||||||
|
}
|
||||||
|
|
||||||
pRebMsg->rebSubHash = taosHashInit(64, MurmurHash3_32, true, HASH_NO_LOCK);
|
pRebMsg->rebSubHash = taosHashInit(64, MurmurHash3_32, true, HASH_NO_LOCK);
|
||||||
// TODO set cleanfp
|
if (pRebMsg->rebSubHash == NULL) {
|
||||||
|
mError("failed to create rebalance hashmap");
|
||||||
|
rpcFreeCont(pRebMsg);
|
||||||
|
mndRebEnd();
|
||||||
|
return TSDB_CODE_OUT_OF_MEMORY;
|
||||||
|
}
|
||||||
|
|
||||||
|
taosHashSetFreeFp(pRebMsg->rebSubHash, freeRebalanceItem);
|
||||||
|
|
||||||
// iterate all consumers, find all modification
|
// iterate all consumers, find all modification
|
||||||
while (1) {
|
while (1) {
|
||||||
|
@ -356,7 +376,7 @@ static int32_t mndProcessMqTimerMsg(SRpcMsg *pMsg) {
|
||||||
} else {
|
} else {
|
||||||
taosHashCleanup(pRebMsg->rebSubHash);
|
taosHashCleanup(pRebMsg->rebSubHash);
|
||||||
rpcFreeCont(pRebMsg);
|
rpcFreeCont(pRebMsg);
|
||||||
mDebug("mq rebalance finished, no modification");
|
mDebug("mq timer finished, no need to re-balance");
|
||||||
mndRebEnd();
|
mndRebEnd();
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -601,6 +621,13 @@ static void* topicNameDup(void* p){
|
||||||
return taosStrdup((char*) p);
|
return taosStrdup((char*) p);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void freeItem(void* param) {
|
||||||
|
void* pItem = *(void**)param;
|
||||||
|
if (pItem != NULL) {
|
||||||
|
taosMemoryFree(pItem);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
int32_t mndProcessSubscribeReq(SRpcMsg *pMsg) {
|
int32_t mndProcessSubscribeReq(SRpcMsg *pMsg) {
|
||||||
SMnode *pMnode = pMsg->info.node;
|
SMnode *pMnode = pMsg->info.node;
|
||||||
char *msgStr = pMsg->pCont;
|
char *msgStr = pMsg->pCont;
|
||||||
|
@ -616,7 +643,7 @@ int32_t mndProcessSubscribeReq(SRpcMsg *pMsg) {
|
||||||
int32_t code = -1;
|
int32_t code = -1;
|
||||||
SArray *pTopicList = subscribe.topicNames;
|
SArray *pTopicList = subscribe.topicNames;
|
||||||
taosArraySort(pTopicList, taosArrayCompareString);
|
taosArraySort(pTopicList, taosArrayCompareString);
|
||||||
taosArrayRemoveDuplicateP(pTopicList, taosArrayCompareString, taosMemoryFree);
|
taosArrayRemoveDuplicate(pTopicList, taosArrayCompareString, freeItem);
|
||||||
|
|
||||||
int32_t newTopicNum = taosArrayGetSize(pTopicList);
|
int32_t newTopicNum = taosArrayGetSize(pTopicList);
|
||||||
|
|
||||||
|
@ -845,6 +872,53 @@ static int32_t mndConsumerActionDelete(SSdb *pSdb, SMqConsumerObj *pConsumer) {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void updateConsumerStatus(SMqConsumerObj* pConsumer) {
|
||||||
|
int32_t status = pConsumer->status;
|
||||||
|
|
||||||
|
if (taosArrayGetSize(pConsumer->rebNewTopics) == 0 && taosArrayGetSize(pConsumer->rebRemovedTopics) == 0) {
|
||||||
|
if (status == MQ_CONSUMER_STATUS__MODIFY || status == MQ_CONSUMER_STATUS__MODIFY_IN_REB) {
|
||||||
|
pConsumer->status = MQ_CONSUMER_STATUS__READY;
|
||||||
|
} else if (status == MQ_CONSUMER_STATUS__LOST_IN_REB || status == MQ_CONSUMER_STATUS__LOST) {
|
||||||
|
pConsumer->status = MQ_CONSUMER_STATUS__LOST_REBD;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if (status == MQ_CONSUMER_STATUS__MODIFY || status == MQ_CONSUMER_STATUS__MODIFY_IN_REB) {
|
||||||
|
pConsumer->status = MQ_CONSUMER_STATUS__MODIFY;
|
||||||
|
} else if (status == MQ_CONSUMER_STATUS__LOST || status == MQ_CONSUMER_STATUS__LOST_IN_REB) {
|
||||||
|
pConsumer->status = MQ_CONSUMER_STATUS__LOST;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// remove from new topic
|
||||||
|
static void removeFromNewTopicList(SMqConsumerObj* pConsumer, const char* pTopic) {
|
||||||
|
int32_t size = taosArrayGetSize(pConsumer->rebNewTopics);
|
||||||
|
for (int32_t i = 0; i < taosArrayGetSize(pConsumer->rebNewTopics); i++) {
|
||||||
|
char *p = taosArrayGetP(pConsumer->rebNewTopics, i);
|
||||||
|
if (strcmp(pTopic, p) == 0) {
|
||||||
|
taosArrayRemove(pConsumer->rebNewTopics, i);
|
||||||
|
taosMemoryFree(p);
|
||||||
|
|
||||||
|
mDebug("consumer:0x%" PRIx64 " remove new topic:%s in the topic list, remain newTopics:%d", pConsumer->consumerId,
|
||||||
|
pTopic, (int) taosArrayGetSize(pConsumer->rebNewTopics));
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// remove from removed topic
|
||||||
|
static void removeFromRemoveTopicList(SMqConsumerObj* pConsumer, const char* pTopic) {
|
||||||
|
int32_t size = taosArrayGetSize(pConsumer->rebRemovedTopics);
|
||||||
|
for (int32_t i = 0; i < size; i++) {
|
||||||
|
char *p = taosArrayGetP(pConsumer->rebRemovedTopics, i);
|
||||||
|
if (strcmp(pTopic, p) == 0) {
|
||||||
|
taosArrayRemove(pConsumer->rebRemovedTopics, i);
|
||||||
|
taosMemoryFree(p);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static int32_t mndConsumerActionUpdate(SSdb *pSdb, SMqConsumerObj *pOldConsumer, SMqConsumerObj *pNewConsumer) {
|
static int32_t mndConsumerActionUpdate(SSdb *pSdb, SMqConsumerObj *pOldConsumer, SMqConsumerObj *pNewConsumer) {
|
||||||
mDebug("consumer:0x%" PRIx64 " perform update action, update type:%d, subscribe-time:%" PRId64 ", uptime:%" PRId64,
|
mDebug("consumer:0x%" PRIx64 " perform update action, update type:%d, subscribe-time:%" PRId64 ", uptime:%" PRId64,
|
||||||
pOldConsumer->consumerId, pNewConsumer->updateType, pOldConsumer->subscribeTime, pOldConsumer->upTime);
|
pOldConsumer->consumerId, pNewConsumer->updateType, pOldConsumer->subscribeTime, pOldConsumer->upTime);
|
||||||
|
@ -855,6 +929,7 @@ static int32_t mndConsumerActionUpdate(SSdb *pSdb, SMqConsumerObj *pOldConsumer,
|
||||||
/*A(taosArrayGetSize(pOldConsumer->rebNewTopics) == 0);*/
|
/*A(taosArrayGetSize(pOldConsumer->rebNewTopics) == 0);*/
|
||||||
/*A(taosArrayGetSize(pOldConsumer->rebRemovedTopics) == 0);*/
|
/*A(taosArrayGetSize(pOldConsumer->rebRemovedTopics) == 0);*/
|
||||||
|
|
||||||
|
// this new consumer has identical topics with one existed consumers.
|
||||||
if (taosArrayGetSize(pNewConsumer->rebNewTopics) == 0 && taosArrayGetSize(pNewConsumer->rebRemovedTopics) == 0) {
|
if (taosArrayGetSize(pNewConsumer->rebNewTopics) == 0 && taosArrayGetSize(pNewConsumer->rebRemovedTopics) == 0) {
|
||||||
pOldConsumer->status = MQ_CONSUMER_STATUS__READY;
|
pOldConsumer->status = MQ_CONSUMER_STATUS__READY;
|
||||||
} else {
|
} else {
|
||||||
|
@ -871,7 +946,6 @@ static int32_t mndConsumerActionUpdate(SSdb *pSdb, SMqConsumerObj *pOldConsumer,
|
||||||
pNewConsumer->assignedTopics = tmp;
|
pNewConsumer->assignedTopics = tmp;
|
||||||
|
|
||||||
pOldConsumer->subscribeTime = pNewConsumer->upTime;
|
pOldConsumer->subscribeTime = pNewConsumer->upTime;
|
||||||
|
|
||||||
pOldConsumer->status = MQ_CONSUMER_STATUS__MODIFY;
|
pOldConsumer->status = MQ_CONSUMER_STATUS__MODIFY;
|
||||||
}
|
}
|
||||||
} else if (pNewConsumer->updateType == CONSUMER_UPDATE__LOST) {
|
} else if (pNewConsumer->updateType == CONSUMER_UPDATE__LOST) {
|
||||||
|
@ -911,71 +985,48 @@ static int32_t mndConsumerActionUpdate(SSdb *pSdb, SMqConsumerObj *pOldConsumer,
|
||||||
pOldConsumer->rebalanceTime = pNewConsumer->upTime;
|
pOldConsumer->rebalanceTime = pNewConsumer->upTime;
|
||||||
|
|
||||||
} else if (pNewConsumer->updateType == CONSUMER_UPDATE__ADD) {
|
} else if (pNewConsumer->updateType == CONSUMER_UPDATE__ADD) {
|
||||||
/*A(taosArrayGetSize(pNewConsumer->rebNewTopics) == 1);*/
|
ASSERT(taosArrayGetSize(pNewConsumer->rebNewTopics) == 1 && taosArrayGetSize(pNewConsumer->rebRemovedTopics) == 0);
|
||||||
/*A(taosArrayGetSize(pNewConsumer->rebRemovedTopics) == 0);*/
|
char *pNewTopic = taosStrdup(taosArrayGetP(pNewConsumer->rebNewTopics, 0));
|
||||||
|
|
||||||
char *addedTopic = taosStrdup(taosArrayGetP(pNewConsumer->rebNewTopics, 0));
|
|
||||||
// not exist in current topic
|
// not exist in current topic
|
||||||
|
bool existing = false;
|
||||||
bool existing = false;
|
|
||||||
#if 1
|
|
||||||
int32_t numOfExistedTopics = taosArrayGetSize(pOldConsumer->currentTopics);
|
int32_t numOfExistedTopics = taosArrayGetSize(pOldConsumer->currentTopics);
|
||||||
for (int32_t i = 0; i < numOfExistedTopics; i++) {
|
for (int32_t i = 0; i < numOfExistedTopics; i++) {
|
||||||
char *topic = taosArrayGetP(pOldConsumer->currentTopics, i);
|
char *topic = taosArrayGetP(pOldConsumer->currentTopics, i);
|
||||||
if (strcmp(topic, addedTopic) == 0) {
|
if (strcmp(topic, pNewTopic) == 0) {
|
||||||
existing = true;
|
existing = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
|
|
||||||
// remove from new topic
|
removeFromNewTopicList(pOldConsumer, pNewTopic);
|
||||||
for (int32_t i = 0; i < taosArrayGetSize(pOldConsumer->rebNewTopics); i++) {
|
|
||||||
char *topic = taosArrayGetP(pOldConsumer->rebNewTopics, i);
|
|
||||||
if (strcmp(addedTopic, topic) == 0) {
|
|
||||||
taosArrayRemove(pOldConsumer->rebNewTopics, i);
|
|
||||||
taosMemoryFree(topic);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// add to current topic
|
// add to current topic
|
||||||
if (!existing) {
|
if (!existing) {
|
||||||
taosArrayPush(pOldConsumer->currentTopics, &addedTopic);
|
taosArrayPush(pOldConsumer->currentTopics, &pNewTopic);
|
||||||
taosArraySort(pOldConsumer->currentTopics, taosArrayCompareString);
|
taosArraySort(pOldConsumer->currentTopics, taosArrayCompareString);
|
||||||
} else {
|
} else {
|
||||||
taosMemoryFree(addedTopic);
|
taosMemoryFree(pNewTopic);
|
||||||
}
|
}
|
||||||
|
|
||||||
// set status
|
// set status
|
||||||
int32_t status = pOldConsumer->status;
|
int32_t status = pOldConsumer->status;
|
||||||
if (taosArrayGetSize(pOldConsumer->rebNewTopics) == 0 && taosArrayGetSize(pOldConsumer->rebRemovedTopics) == 0) {
|
updateConsumerStatus(pOldConsumer);
|
||||||
if (status == MQ_CONSUMER_STATUS__MODIFY || status == MQ_CONSUMER_STATUS__MODIFY_IN_REB) {
|
|
||||||
pOldConsumer->status = MQ_CONSUMER_STATUS__READY;
|
|
||||||
} else if (status == MQ_CONSUMER_STATUS__LOST_IN_REB || status == MQ_CONSUMER_STATUS__LOST) {
|
|
||||||
pOldConsumer->status = MQ_CONSUMER_STATUS__LOST_REBD;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
if (status == MQ_CONSUMER_STATUS__MODIFY || status == MQ_CONSUMER_STATUS__MODIFY_IN_REB) {
|
|
||||||
pOldConsumer->status = MQ_CONSUMER_STATUS__MODIFY_IN_REB;
|
|
||||||
} else if (status == MQ_CONSUMER_STATUS__LOST || status == MQ_CONSUMER_STATUS__LOST_IN_REB) {
|
|
||||||
pOldConsumer->status = MQ_CONSUMER_STATUS__LOST_IN_REB;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// the re-balance is triggered when the new consumer is launched.
|
// the re-balance is triggered when the new consumer is launched.
|
||||||
pOldConsumer->rebalanceTime = pNewConsumer->upTime;
|
pOldConsumer->rebalanceTime = pNewConsumer->upTime;
|
||||||
|
|
||||||
atomic_add_fetch_32(&pOldConsumer->epoch, 1);
|
atomic_add_fetch_32(&pOldConsumer->epoch, 1);
|
||||||
mDebug("consumer:0x%" PRIx64 " state (%d)%s -> (%d)%s, new epoch:%d, reb-time:%" PRId64 ", current topics:%d",
|
mDebug("consumer:0x%" PRIx64 " state (%d)%s -> (%d)%s, new epoch:%d, reb-time:%" PRId64
|
||||||
|
", current topics:%d, newTopics:%d, removeTopics:%d",
|
||||||
pOldConsumer->consumerId, status, mndConsumerStatusName(status), pOldConsumer->status,
|
pOldConsumer->consumerId, status, mndConsumerStatusName(status), pOldConsumer->status,
|
||||||
mndConsumerStatusName(pOldConsumer->status),
|
mndConsumerStatusName(pOldConsumer->status), pOldConsumer->epoch, pOldConsumer->rebalanceTime,
|
||||||
pOldConsumer->epoch, pOldConsumer->rebalanceTime, (int)taosArrayGetSize(pOldConsumer->currentTopics));
|
(int)taosArrayGetSize(pOldConsumer->currentTopics), (int)taosArrayGetSize(pOldConsumer->rebNewTopics),
|
||||||
|
(int)taosArrayGetSize(pOldConsumer->rebRemovedTopics));
|
||||||
|
|
||||||
} else if (pNewConsumer->updateType == CONSUMER_UPDATE__REMOVE) {
|
} else if (pNewConsumer->updateType == CONSUMER_UPDATE__REMOVE) {
|
||||||
/*A(taosArrayGetSize(pNewConsumer->rebNewTopics) == 0);*/
|
/*A(taosArrayGetSize(pNewConsumer->rebNewTopics) == 0);*/
|
||||||
/*A(taosArrayGetSize(pNewConsumer->rebRemovedTopics) == 1);*/
|
/*A(taosArrayGetSize(pNewConsumer->rebRemovedTopics) == 1);*/
|
||||||
char *removedTopic = taosArrayGetP(pNewConsumer->rebRemovedTopics, 0);
|
char *removedTopic = taosArrayGetP(pNewConsumer->rebRemovedTopics, 0);
|
||||||
|
|
||||||
// not exist in new topic
|
|
||||||
#if 0
|
#if 0
|
||||||
for (int32_t i = 0; i < taosArrayGetSize(pOldConsumer->rebNewTopics); i++) {
|
for (int32_t i = 0; i < taosArrayGetSize(pOldConsumer->rebNewTopics); i++) {
|
||||||
char *topic = taosArrayGetP(pOldConsumer->rebNewTopics, i);
|
char *topic = taosArrayGetP(pOldConsumer->rebNewTopics, i);
|
||||||
|
@ -984,14 +1035,7 @@ static int32_t mndConsumerActionUpdate(SSdb *pSdb, SMqConsumerObj *pOldConsumer,
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// remove from removed topic
|
// remove from removed topic
|
||||||
for (int32_t i = 0; i < taosArrayGetSize(pOldConsumer->rebRemovedTopics); i++) {
|
removeFromRemoveTopicList(pOldConsumer, removedTopic);
|
||||||
char *topic = taosArrayGetP(pOldConsumer->rebRemovedTopics, i);
|
|
||||||
if (strcmp(removedTopic, topic) == 0) {
|
|
||||||
taosArrayRemove(pOldConsumer->rebRemovedTopics, i);
|
|
||||||
taosMemoryFree(topic);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// remove from current topic
|
// remove from current topic
|
||||||
int32_t i = 0;
|
int32_t i = 0;
|
||||||
|
@ -1004,32 +1048,20 @@ static int32_t mndConsumerActionUpdate(SSdb *pSdb, SMqConsumerObj *pOldConsumer,
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// must find the topic
|
|
||||||
/*A(i < sz);*/
|
|
||||||
|
|
||||||
// set status
|
// set status
|
||||||
int32_t status = pOldConsumer->status;
|
int32_t status = pOldConsumer->status;
|
||||||
if (taosArrayGetSize(pOldConsumer->rebNewTopics) == 0 && taosArrayGetSize(pOldConsumer->rebRemovedTopics) == 0) {
|
updateConsumerStatus(pOldConsumer);
|
||||||
if (status == MQ_CONSUMER_STATUS__MODIFY || status == MQ_CONSUMER_STATUS__MODIFY_IN_REB) {
|
|
||||||
pOldConsumer->status = MQ_CONSUMER_STATUS__READY;
|
|
||||||
} else if (status == MQ_CONSUMER_STATUS__LOST_IN_REB || status == MQ_CONSUMER_STATUS__LOST) {
|
|
||||||
pOldConsumer->status = MQ_CONSUMER_STATUS__LOST_REBD;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
if (status == MQ_CONSUMER_STATUS__MODIFY || status == MQ_CONSUMER_STATUS__MODIFY_IN_REB) {
|
|
||||||
pOldConsumer->status = MQ_CONSUMER_STATUS__MODIFY_IN_REB;
|
|
||||||
} else if (status == MQ_CONSUMER_STATUS__LOST || status == MQ_CONSUMER_STATUS__LOST_IN_REB) {
|
|
||||||
pOldConsumer->status = MQ_CONSUMER_STATUS__LOST_IN_REB;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
pOldConsumer->rebalanceTime = pNewConsumer->upTime;
|
pOldConsumer->rebalanceTime = pNewConsumer->upTime;
|
||||||
atomic_add_fetch_32(&pOldConsumer->epoch, 1);
|
atomic_add_fetch_32(&pOldConsumer->epoch, 1);
|
||||||
|
|
||||||
mDebug("consumer:0x%" PRIx64 " state %d(%s) -> %d(%s), new epoch:%d, reb-time:%" PRId64 ", current topics:%d",
|
mDebug("consumer:0x%" PRIx64 " state (%d)%s -> (%d)%s, new epoch:%d, reb-time:%" PRId64
|
||||||
|
", current topics:%d, newTopics:%d, removeTopics:%d",
|
||||||
pOldConsumer->consumerId, status, mndConsumerStatusName(status), pOldConsumer->status,
|
pOldConsumer->consumerId, status, mndConsumerStatusName(status), pOldConsumer->status,
|
||||||
mndConsumerStatusName(pOldConsumer->status),
|
mndConsumerStatusName(pOldConsumer->status), pOldConsumer->epoch, pOldConsumer->rebalanceTime,
|
||||||
pOldConsumer->epoch, pOldConsumer->rebalanceTime, (int)taosArrayGetSize(pOldConsumer->currentTopics));
|
(int)taosArrayGetSize(pOldConsumer->currentTopics), (int)taosArrayGetSize(pOldConsumer->rebNewTopics),
|
||||||
|
(int)taosArrayGetSize(pOldConsumer->rebRemovedTopics));
|
||||||
}
|
}
|
||||||
|
|
||||||
taosWUnLockLatch(&pOldConsumer->lock);
|
taosWUnLockLatch(&pOldConsumer->lock);
|
||||||
|
|
|
@ -226,7 +226,7 @@ static int32_t mndProcessConnectReq(SRpcMsg *pReq) {
|
||||||
goto _OVER;
|
goto _OVER;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((code = taosCheckVersionCompatibleFromStr(connReq.sVer, version, 2)) != 0) {
|
if ((code = taosCheckVersionCompatibleFromStr(connReq.sVer, version, 3)) != 0) {
|
||||||
terrno = code;
|
terrno = code;
|
||||||
goto _OVER;
|
goto _OVER;
|
||||||
}
|
}
|
||||||
|
|
|
@ -197,24 +197,20 @@ static SMqRebInfo *mndGetOrCreateRebSub(SHashObj *pHash, const char *key) {
|
||||||
return pRebSub;
|
return pRebSub;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int32_t mndDoRebalance(SMnode *pMnode, const SMqRebInputObj *pInput, SMqRebOutputObj *pOutput) {
|
static void doRemoveExistedConsumers(SMqRebOutputObj *pOutput, SHashObj *pHash, const SMqRebInputObj *pInput) {
|
||||||
int32_t totalVgNum = pOutput->pSub->vgNum;
|
int32_t numOfRemoved = taosArrayGetSize(pInput->pRebInfo->removedConsumers);
|
||||||
const char *sub = pOutput->pSub->key;
|
const char *pSubKey = pOutput->pSub->key;
|
||||||
mInfo("sub:%s mq re-balance %d vgroups", sub, pOutput->pSub->vgNum);
|
|
||||||
|
|
||||||
// 1. build temporary hash(vgId -> SMqRebOutputVg) to store modified vg
|
|
||||||
SHashObj *pHash = taosHashInit(64, taosGetDefaultHashFunction(TSDB_DATA_TYPE_INT), false, HASH_NO_LOCK);
|
|
||||||
|
|
||||||
// 2. check and get actual removed consumers, put their vg into hash
|
|
||||||
int32_t removedNum = taosArrayGetSize(pInput->pRebInfo->removedConsumers);
|
|
||||||
int32_t actualRemoved = 0;
|
int32_t actualRemoved = 0;
|
||||||
for (int32_t i = 0; i < removedNum; i++) {
|
for (int32_t i = 0; i < numOfRemoved; i++) {
|
||||||
uint64_t consumerId = *(uint64_t *)taosArrayGet(pInput->pRebInfo->removedConsumers, i);
|
uint64_t consumerId = *(uint64_t *)taosArrayGet(pInput->pRebInfo->removedConsumers, i);
|
||||||
|
|
||||||
SMqConsumerEp *pConsumerEp = taosHashGet(pOutput->pSub->consumerHash, &consumerId, sizeof(int64_t));
|
SMqConsumerEp *pConsumerEp = taosHashGet(pOutput->pSub->consumerHash, &consumerId, sizeof(int64_t));
|
||||||
|
|
||||||
|
// consumer exists till now
|
||||||
if (pConsumerEp) {
|
if (pConsumerEp) {
|
||||||
actualRemoved++;
|
actualRemoved++;
|
||||||
|
|
||||||
int32_t consumerVgNum = taosArrayGetSize(pConsumerEp->vgs);
|
int32_t consumerVgNum = taosArrayGetSize(pConsumerEp->vgs);
|
||||||
for (int32_t j = 0; j < consumerVgNum; j++) {
|
for (int32_t j = 0; j < consumerVgNum; j++) {
|
||||||
SMqVgEp *pVgEp = taosArrayGetP(pConsumerEp->vgs, j);
|
SMqVgEp *pVgEp = taosArrayGetP(pConsumerEp->vgs, j);
|
||||||
|
@ -223,52 +219,66 @@ static int32_t mndDoRebalance(SMnode *pMnode, const SMqRebInputObj *pInput, SMqR
|
||||||
.newConsumerId = -1,
|
.newConsumerId = -1,
|
||||||
.pVgEp = pVgEp,
|
.pVgEp = pVgEp,
|
||||||
};
|
};
|
||||||
|
|
||||||
taosHashPut(pHash, &pVgEp->vgId, sizeof(int32_t), &outputVg, sizeof(SMqRebOutputVg));
|
taosHashPut(pHash, &pVgEp->vgId, sizeof(int32_t), &outputVg, sizeof(SMqRebOutputVg));
|
||||||
mInfo("sub:%s mq re-balance remove vgId:%d from consumer:0x%" PRIx64, sub, pVgEp->vgId, consumerId);
|
mInfo("sub:%s mq re-balance remove vgId:%d from consumer:%" PRIx64, pSubKey, pVgEp->vgId, consumerId);
|
||||||
}
|
}
|
||||||
|
|
||||||
taosArrayDestroy(pConsumerEp->vgs);
|
taosArrayDestroy(pConsumerEp->vgs);
|
||||||
taosHashRemove(pOutput->pSub->consumerHash, &consumerId, sizeof(int64_t));
|
taosHashRemove(pOutput->pSub->consumerHash, &consumerId, sizeof(int64_t));
|
||||||
|
|
||||||
// put into removed
|
// put into removed
|
||||||
taosArrayPush(pOutput->removedConsumers, &consumerId);
|
taosArrayPush(pOutput->removedConsumers, &consumerId);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (removedNum != actualRemoved) {
|
if (numOfRemoved != actualRemoved) {
|
||||||
mError("sub:%s mq re-balance removedNum:%d not matched with actual:%d", sub, removedNum, actualRemoved);
|
mError("sub:%s mq re-balance removedNum:%d not matched with actual:%d", pSubKey, numOfRemoved, actualRemoved);
|
||||||
|
} else {
|
||||||
|
mInfo("sub:%s removed %d consumers", pSubKey, numOfRemoved);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// if previously no consumer, there are vgs not assigned
|
static void doAddNewConsumers(SMqRebOutputObj *pOutput, const SMqRebInputObj *pInput) {
|
||||||
{
|
int32_t numOfNewConsumers = taosArrayGetSize(pInput->pRebInfo->newConsumers);
|
||||||
int32_t consumerVgNum = taosArrayGetSize(pOutput->pSub->unassignedVgs);
|
const char *pSubKey = pOutput->pSub->key;
|
||||||
for (int32_t i = 0; i < consumerVgNum; i++) {
|
|
||||||
SMqVgEp *pVgEp = *(SMqVgEp **)taosArrayPop(pOutput->pSub->unassignedVgs);
|
for (int32_t i = 0; i < numOfNewConsumers; i++) {
|
||||||
SMqRebOutputVg rebOutput = {
|
int64_t consumerId = *(int64_t *)taosArrayGet(pInput->pRebInfo->newConsumers, i);
|
||||||
.oldConsumerId = -1,
|
|
||||||
.newConsumerId = -1,
|
SMqConsumerEp newConsumerEp;
|
||||||
.pVgEp = pVgEp,
|
newConsumerEp.consumerId = consumerId;
|
||||||
};
|
newConsumerEp.vgs = taosArrayInit(0, sizeof(void *));
|
||||||
taosHashPut(pHash, &pVgEp->vgId, sizeof(int32_t), &rebOutput, sizeof(SMqRebOutputVg));
|
|
||||||
mInfo("sub:%s mq re-balance remove vgId:%d from unassigned", sub, pVgEp->vgId);
|
taosHashPut(pOutput->pSub->consumerHash, &consumerId, sizeof(int64_t), &newConsumerEp, sizeof(SMqConsumerEp));
|
||||||
}
|
taosArrayPush(pOutput->newConsumers, &consumerId);
|
||||||
|
mInfo("sub:%s mq rebalance add new consumer:%" PRIx64, pSubKey, consumerId);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// 3. calc vg number of each consumer
|
static void addUnassignedVgroups(SMqRebOutputObj *pOutput, SHashObj* pHash) {
|
||||||
int32_t afterRebConsumerNum = pInput->oldConsumerNum + taosArrayGetSize(pInput->pRebInfo->newConsumers) -
|
const char *pSubKey = pOutput->pSub->key;
|
||||||
taosArrayGetSize(pInput->pRebInfo->removedConsumers);
|
int32_t numOfVgroups = taosArrayGetSize(pOutput->pSub->unassignedVgs);
|
||||||
int32_t minVgCnt = 0;
|
|
||||||
int32_t imbConsumerNum = 0;
|
for (int32_t i = 0; i < numOfVgroups; i++) {
|
||||||
// calc num
|
SMqVgEp *pVgEp = *(SMqVgEp **)taosArrayPop(pOutput->pSub->unassignedVgs);
|
||||||
if (afterRebConsumerNum) {
|
SMqRebOutputVg rebOutput = {
|
||||||
minVgCnt = totalVgNum / afterRebConsumerNum;
|
.oldConsumerId = -1,
|
||||||
imbConsumerNum = totalVgNum % afterRebConsumerNum;
|
.newConsumerId = -1,
|
||||||
|
.pVgEp = pVgEp,
|
||||||
|
};
|
||||||
|
|
||||||
|
taosHashPut(pHash, &pVgEp->vgId, sizeof(int32_t), &rebOutput, sizeof(SMqRebOutputVg));
|
||||||
|
mInfo("sub:%s mq re-balance remove vgId:%d from unassigned", pSubKey, pVgEp->vgId);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
mInfo("sub:%s mq re-balance %d consumers: at least %d vgs each, %d consumers has more vgs", sub,
|
static void transferVgroupsForConsumers(SMqRebOutputObj *pOutput, SHashObj* pHash, int32_t minVgCnt, int32_t imbConsumerNum) {
|
||||||
afterRebConsumerNum, minVgCnt, imbConsumerNum);
|
const char *pSubKey = pOutput->pSub->key;
|
||||||
|
|
||||||
// 4. first scan: remove consumer more than wanted, put to remove hash
|
|
||||||
int32_t imbCnt = 0;
|
int32_t imbCnt = 0;
|
||||||
void *pIter = NULL;
|
void *pIter = NULL;
|
||||||
|
|
||||||
while (1) {
|
while (1) {
|
||||||
pIter = taosHashIterate(pOutput->pSub->consumerHash, pIter);
|
pIter = taosHashIterate(pOutput->pSub->consumerHash, pIter);
|
||||||
if (pIter == NULL) {
|
if (pIter == NULL) {
|
||||||
|
@ -276,8 +286,8 @@ static int32_t mndDoRebalance(SMnode *pMnode, const SMqRebInputObj *pInput, SMqR
|
||||||
}
|
}
|
||||||
|
|
||||||
SMqConsumerEp *pConsumerEp = (SMqConsumerEp *)pIter;
|
SMqConsumerEp *pConsumerEp = (SMqConsumerEp *)pIter;
|
||||||
|
int32_t consumerVgNum = taosArrayGetSize(pConsumerEp->vgs);
|
||||||
|
|
||||||
int32_t consumerVgNum = taosArrayGetSize(pConsumerEp->vgs);
|
|
||||||
// all old consumers still existing are touched
|
// all old consumers still existing are touched
|
||||||
// TODO optimize: touch only consumer whose vgs changed
|
// TODO optimize: touch only consumer whose vgs changed
|
||||||
taosArrayPush(pOutput->touchedConsumers, &pConsumerEp->consumerId);
|
taosArrayPush(pOutput->touchedConsumers, &pConsumerEp->consumerId);
|
||||||
|
@ -296,13 +306,13 @@ static int32_t mndDoRebalance(SMnode *pMnode, const SMqRebInputObj *pInput, SMqR
|
||||||
.pVgEp = pVgEp,
|
.pVgEp = pVgEp,
|
||||||
};
|
};
|
||||||
taosHashPut(pHash, &pVgEp->vgId, sizeof(int32_t), &outputVg, sizeof(SMqRebOutputVg));
|
taosHashPut(pHash, &pVgEp->vgId, sizeof(int32_t), &outputVg, sizeof(SMqRebOutputVg));
|
||||||
mInfo("sub:%s mq rebalance remove vgId:%d from consumer:0x%" PRIx64 ",(first scan)", sub, pVgEp->vgId,
|
mInfo("sub:%s mq rebalance remove vgId:%d from consumer:0x%" PRIx64 ",(first scan)", pSubKey, pVgEp->vgId,
|
||||||
pConsumerEp->consumerId);
|
pConsumerEp->consumerId);
|
||||||
}
|
}
|
||||||
imbCnt++;
|
imbCnt++;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
// pop until equal minVg
|
// all the remain consumers should only have the number of vgroups, which is equalled to the value of minVg
|
||||||
while (taosArrayGetSize(pConsumerEp->vgs) > minVgCnt) {
|
while (taosArrayGetSize(pConsumerEp->vgs) > minVgCnt) {
|
||||||
SMqVgEp *pVgEp = *(SMqVgEp **)taosArrayPop(pConsumerEp->vgs);
|
SMqVgEp *pVgEp = *(SMqVgEp **)taosArrayPop(pConsumerEp->vgs);
|
||||||
SMqRebOutputVg outputVg = {
|
SMqRebOutputVg outputVg = {
|
||||||
|
@ -311,36 +321,67 @@ static int32_t mndDoRebalance(SMnode *pMnode, const SMqRebInputObj *pInput, SMqR
|
||||||
.pVgEp = pVgEp,
|
.pVgEp = pVgEp,
|
||||||
};
|
};
|
||||||
taosHashPut(pHash, &pVgEp->vgId, sizeof(int32_t), &outputVg, sizeof(SMqRebOutputVg));
|
taosHashPut(pHash, &pVgEp->vgId, sizeof(int32_t), &outputVg, sizeof(SMqRebOutputVg));
|
||||||
mInfo("sub:%s mq rebalance remove vgId:%d from consumer:0x%" PRIx64 ",(first scan)", sub, pVgEp->vgId,
|
mInfo("sub:%s mq rebalance remove vgId:%d from consumer:0x%" PRIx64 ",(first scan)", pSubKey, pVgEp->vgId,
|
||||||
pConsumerEp->consumerId);
|
pConsumerEp->consumerId);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// 5. add new consumer into sub
|
static int32_t mndDoRebalance(SMnode *pMnode, const SMqRebInputObj *pInput, SMqRebOutputObj *pOutput) {
|
||||||
{
|
int32_t totalVgNum = pOutput->pSub->vgNum;
|
||||||
int32_t consumerNum = taosArrayGetSize(pInput->pRebInfo->newConsumers);
|
const char *pSubKey = pOutput->pSub->key;
|
||||||
for (int32_t i = 0; i < consumerNum; i++) {
|
|
||||||
int64_t consumerId = *(int64_t *)taosArrayGet(pInput->pRebInfo->newConsumers, i);
|
|
||||||
|
|
||||||
SMqConsumerEp newConsumerEp;
|
int32_t numOfRemoved = taosArrayGetSize(pInput->pRebInfo->removedConsumers);
|
||||||
newConsumerEp.consumerId = consumerId;
|
int32_t numOfAdded = taosArrayGetSize(pInput->pRebInfo->newConsumers);
|
||||||
newConsumerEp.vgs = taosArrayInit(0, sizeof(void *));
|
mInfo("sub:%s mq re-balance %d vgroups, existed consumers:%d, added:%d, removed:%d", pSubKey, totalVgNum,
|
||||||
taosHashPut(pOutput->pSub->consumerHash, &consumerId, sizeof(int64_t), &newConsumerEp, sizeof(SMqConsumerEp));
|
pInput->oldConsumerNum, numOfAdded, numOfRemoved);
|
||||||
taosArrayPush(pOutput->newConsumers, &consumerId);
|
|
||||||
mInfo("sub:%s mq rebalance add new consumer:0x%" PRIx64, sub, consumerId);
|
// 1. build temporary hash(vgId -> SMqRebOutputVg) to store modified vg
|
||||||
}
|
SHashObj *pHash = taosHashInit(64, taosGetDefaultHashFunction(TSDB_DATA_TYPE_INT), false, HASH_NO_LOCK);
|
||||||
|
|
||||||
|
// 2. check and get actual removed consumers, put their vg into hash
|
||||||
|
doRemoveExistedConsumers(pOutput, pHash, pInput);
|
||||||
|
|
||||||
|
// 3. if previously no consumer, there are vgs not assigned
|
||||||
|
addUnassignedVgroups(pOutput, pHash);
|
||||||
|
|
||||||
|
// 4. calc vg number of each consumer
|
||||||
|
int32_t numOfFinal = pInput->oldConsumerNum + numOfAdded - numOfRemoved;
|
||||||
|
|
||||||
|
int32_t minVgCnt = 0;
|
||||||
|
int32_t imbConsumerNum = 0;
|
||||||
|
|
||||||
|
// calc num
|
||||||
|
if (numOfFinal) {
|
||||||
|
minVgCnt = totalVgNum / numOfFinal;
|
||||||
|
imbConsumerNum = totalVgNum % numOfFinal;
|
||||||
|
mInfo("sub:%s mq re-balance %d consumers: at least %d vgs each, %d consumers has 1 more vgroups than avg value",
|
||||||
|
pSubKey, numOfFinal, minVgCnt, imbConsumerNum);
|
||||||
|
} else {
|
||||||
|
mInfo("sub:%s no consumer subscribe this topic", pSubKey);
|
||||||
}
|
}
|
||||||
|
|
||||||
// 6. second scan: find consumer do not have enough vg, extract from temporary hash and assign to new consumer.
|
// 5. first scan: remove vgroups from te consumers, who have more vgroups than the threashold value that is
|
||||||
|
// minVgCnt, and then put them into the recycled hash list
|
||||||
|
transferVgroupsForConsumers(pOutput, pHash, minVgCnt, imbConsumerNum);
|
||||||
|
|
||||||
|
// 6. add new consumer into sub
|
||||||
|
doAddNewConsumers(pOutput, pInput);
|
||||||
|
|
||||||
|
// 7. second scan: find consumer do not have enough vgroups, extract from temporary hash and assign to them
|
||||||
// All related vg should be put into rebVgs
|
// All related vg should be put into rebVgs
|
||||||
SMqRebOutputVg *pRebVg = NULL;
|
SMqRebOutputVg *pRebVg = NULL;
|
||||||
void *pRemovedIter = NULL;
|
void *pRemovedIter = NULL;
|
||||||
pIter = NULL;
|
void *pIter = NULL;
|
||||||
|
|
||||||
while (1) {
|
while (1) {
|
||||||
pIter = taosHashIterate(pOutput->pSub->consumerHash, pIter);
|
pIter = taosHashIterate(pOutput->pSub->consumerHash, pIter);
|
||||||
if (pIter == NULL) break;
|
if (pIter == NULL) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
SMqConsumerEp *pConsumerEp = (SMqConsumerEp *)pIter;
|
SMqConsumerEp *pConsumerEp = (SMqConsumerEp *)pIter;
|
||||||
|
|
||||||
// push until equal minVg
|
// push until equal minVg
|
||||||
|
@ -348,8 +389,8 @@ static int32_t mndDoRebalance(SMnode *pMnode, const SMqRebInputObj *pInput, SMqR
|
||||||
// iter hash and find one vg
|
// iter hash and find one vg
|
||||||
pRemovedIter = taosHashIterate(pHash, pRemovedIter);
|
pRemovedIter = taosHashIterate(pHash, pRemovedIter);
|
||||||
if (pRemovedIter == NULL) {
|
if (pRemovedIter == NULL) {
|
||||||
mError("sub:%s removed iter is null", sub);
|
mError("sub:%s removed iter is null", pSubKey);
|
||||||
continue;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
pRebVg = (SMqRebOutputVg *)pRemovedIter;
|
pRebVg = (SMqRebOutputVg *)pRemovedIter;
|
||||||
|
@ -409,15 +450,15 @@ static int32_t mndDoRebalance(SMnode *pMnode, const SMqRebInputObj *pInput, SMqR
|
||||||
|
|
||||||
taosArrayPush(pOutput->pSub->unassignedVgs, &pRebOutput->pVgEp);
|
taosArrayPush(pOutput->pSub->unassignedVgs, &pRebOutput->pVgEp);
|
||||||
taosArrayPush(pOutput->rebVgs, pRebOutput);
|
taosArrayPush(pOutput->rebVgs, pRebOutput);
|
||||||
mInfo("sub:%s mq re-balance unassign vgId:%d (second scan)", sub, pRebOutput->pVgEp->vgId);
|
mInfo("sub:%s mq re-balance unassign vgId:%d (second scan)", pSubKey, pRebOutput->pVgEp->vgId);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// 8. generate logs
|
// 8. generate logs
|
||||||
mInfo("sub:%s mq re-balance calculation completed, re-balanced vg", sub);
|
mInfo("sub:%s mq re-balance calculation completed, re-balanced vg", pSubKey);
|
||||||
for (int32_t i = 0; i < taosArrayGetSize(pOutput->rebVgs); i++) {
|
for (int32_t i = 0; i < taosArrayGetSize(pOutput->rebVgs); i++) {
|
||||||
SMqRebOutputVg *pOutputRebVg = taosArrayGet(pOutput->rebVgs, i);
|
SMqRebOutputVg *pOutputRebVg = taosArrayGet(pOutput->rebVgs, i);
|
||||||
mInfo("sub:%s mq re-balance vgId:%d, moved from consumer:0x%" PRIx64 ", to consumer:0x%" PRIx64, sub,
|
mInfo("sub:%s mq re-balance vgId:%d, moved from consumer:0x%" PRIx64 ", to consumer:0x%" PRIx64, pSubKey,
|
||||||
pOutputRebVg->pVgEp->vgId, pOutputRebVg->oldConsumerId, pOutputRebVg->newConsumerId);
|
pOutputRebVg->pVgEp->vgId, pOutputRebVg->oldConsumerId, pOutputRebVg->newConsumerId);
|
||||||
}
|
}
|
||||||
{
|
{
|
||||||
|
@ -427,10 +468,10 @@ static int32_t mndDoRebalance(SMnode *pMnode, const SMqRebInputObj *pInput, SMqR
|
||||||
if (pIter == NULL) break;
|
if (pIter == NULL) break;
|
||||||
SMqConsumerEp *pConsumerEp = (SMqConsumerEp *)pIter;
|
SMqConsumerEp *pConsumerEp = (SMqConsumerEp *)pIter;
|
||||||
int32_t sz = taosArrayGetSize(pConsumerEp->vgs);
|
int32_t sz = taosArrayGetSize(pConsumerEp->vgs);
|
||||||
mInfo("sub:%s mq re-balance final cfg: consumer:0x%" PRIx64 " has %d vg", sub, pConsumerEp->consumerId, sz);
|
mInfo("sub:%s mq re-balance final cfg: consumer:0x%" PRIx64 " has %d vg", pSubKey, pConsumerEp->consumerId, sz);
|
||||||
for (int32_t i = 0; i < sz; i++) {
|
for (int32_t i = 0; i < sz; i++) {
|
||||||
SMqVgEp *pVgEp = taosArrayGetP(pConsumerEp->vgs, i);
|
SMqVgEp *pVgEp = taosArrayGetP(pConsumerEp->vgs, i);
|
||||||
mInfo("sub:%s mq re-balance final cfg: vg %d to consumer:0x%" PRIx64, sub, pVgEp->vgId,
|
mInfo("sub:%s mq re-balance final cfg: vg %d to consumer:0x%" PRIx64, pSubKey, pVgEp->vgId,
|
||||||
pConsumerEp->consumerId);
|
pConsumerEp->consumerId);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -555,17 +596,23 @@ static int32_t mndProcessRebalanceReq(SRpcMsg *pMsg) {
|
||||||
SMnode *pMnode = pMsg->info.node;
|
SMnode *pMnode = pMsg->info.node;
|
||||||
SMqDoRebalanceMsg *pReq = pMsg->pCont;
|
SMqDoRebalanceMsg *pReq = pMsg->pCont;
|
||||||
void *pIter = NULL;
|
void *pIter = NULL;
|
||||||
|
bool rebalanceOnce = false; // to ensure only once.
|
||||||
|
|
||||||
mInfo("mq re-balance start");
|
mInfo("mq re-balance start, total required re-balanced trans:%d", taosHashGetSize(pReq->rebSubHash));
|
||||||
|
|
||||||
|
// here we only handle one topic rebalance requirement to ensure the atomic execution of this transaction.
|
||||||
while (1) {
|
while (1) {
|
||||||
|
if (rebalanceOnce) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
pIter = taosHashIterate(pReq->rebSubHash, pIter);
|
pIter = taosHashIterate(pReq->rebSubHash, pIter);
|
||||||
if (pIter == NULL) {
|
if (pIter == NULL) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// todo handle the malloc failure
|
||||||
SMqRebInputObj rebInput = {0};
|
SMqRebInputObj rebInput = {0};
|
||||||
|
|
||||||
SMqRebOutputObj rebOutput = {0};
|
SMqRebOutputObj rebOutput = {0};
|
||||||
rebOutput.newConsumers = taosArrayInit(0, sizeof(int64_t));
|
rebOutput.newConsumers = taosArrayInit(0, sizeof(int64_t));
|
||||||
rebOutput.removedConsumers = taosArrayInit(0, sizeof(int64_t));
|
rebOutput.removedConsumers = taosArrayInit(0, sizeof(int64_t));
|
||||||
|
@ -582,9 +629,10 @@ static int32_t mndProcessRebalanceReq(SRpcMsg *pMsg) {
|
||||||
char topic[TSDB_TOPIC_FNAME_LEN];
|
char topic[TSDB_TOPIC_FNAME_LEN];
|
||||||
char cgroup[TSDB_CGROUP_LEN];
|
char cgroup[TSDB_CGROUP_LEN];
|
||||||
mndSplitSubscribeKey(pRebInfo->key, topic, cgroup, true);
|
mndSplitSubscribeKey(pRebInfo->key, topic, cgroup, true);
|
||||||
|
|
||||||
SMqTopicObj *pTopic = mndAcquireTopic(pMnode, topic);
|
SMqTopicObj *pTopic = mndAcquireTopic(pMnode, topic);
|
||||||
if (pTopic == NULL) {
|
if (pTopic == NULL) {
|
||||||
mError("mq re-balance %s ignored since topic %s not exist", pRebInfo->key, topic);
|
mError("mq re-balance %s ignored since topic %s doesn't exist", pRebInfo->key, topic);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -604,11 +652,13 @@ static int32_t mndProcessRebalanceReq(SRpcMsg *pMsg) {
|
||||||
mndReleaseTopic(pMnode, pTopic);
|
mndReleaseTopic(pMnode, pTopic);
|
||||||
|
|
||||||
rebInput.oldConsumerNum = 0;
|
rebInput.oldConsumerNum = 0;
|
||||||
|
mInfo("topic:%s has no consumers sub yet", topic);
|
||||||
} else {
|
} else {
|
||||||
taosRLockLatch(&pSub->lock);
|
taosRLockLatch(&pSub->lock);
|
||||||
rebInput.oldConsumerNum = taosHashGetSize(pSub->consumerHash);
|
rebInput.oldConsumerNum = taosHashGetSize(pSub->consumerHash);
|
||||||
rebOutput.pSub = tCloneSubscribeObj(pSub);
|
rebOutput.pSub = tCloneSubscribeObj(pSub);
|
||||||
taosRUnLockLatch(&pSub->lock);
|
taosRUnLockLatch(&pSub->lock);
|
||||||
|
mInfo("topic:%s has %d consumers sub till now", pRebInfo->key, rebInput.oldConsumerNum);
|
||||||
mndReleaseSubscribe(pMnode, pSub);
|
mndReleaseSubscribe(pMnode, pSub);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -623,16 +673,14 @@ static int32_t mndProcessRebalanceReq(SRpcMsg *pMsg) {
|
||||||
mError("mq re-balance persist output error, possibly vnode splitted or dropped");
|
mError("mq re-balance persist output error, possibly vnode splitted or dropped");
|
||||||
}
|
}
|
||||||
|
|
||||||
taosArrayDestroy(pRebInfo->lostConsumers);
|
|
||||||
taosArrayDestroy(pRebInfo->newConsumers);
|
|
||||||
taosArrayDestroy(pRebInfo->removedConsumers);
|
|
||||||
|
|
||||||
taosArrayDestroy(rebOutput.newConsumers);
|
taosArrayDestroy(rebOutput.newConsumers);
|
||||||
taosArrayDestroy(rebOutput.touchedConsumers);
|
taosArrayDestroy(rebOutput.touchedConsumers);
|
||||||
taosArrayDestroy(rebOutput.removedConsumers);
|
taosArrayDestroy(rebOutput.removedConsumers);
|
||||||
taosArrayDestroy(rebOutput.rebVgs);
|
taosArrayDestroy(rebOutput.rebVgs);
|
||||||
tDeleteSubscribeObj(rebOutput.pSub);
|
tDeleteSubscribeObj(rebOutput.pSub);
|
||||||
taosMemoryFree(rebOutput.pSub);
|
taosMemoryFree(rebOutput.pSub);
|
||||||
|
|
||||||
|
rebalanceOnce = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
// reset flag
|
// reset flag
|
||||||
|
|
|
@ -33,7 +33,7 @@ static int32_t mndSyncEqCtrlMsg(const SMsgCb *msgcb, SRpcMsg *pMsg) {
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t code = tmsgPutToQueue(msgcb, SYNC_CTRL_QUEUE, pMsg);
|
int32_t code = tmsgPutToQueue(msgcb, SYNC_RD_QUEUE, pMsg);
|
||||||
if (code != 0) {
|
if (code != 0) {
|
||||||
rpcFreeCont(pMsg->pCont);
|
rpcFreeCont(pMsg->pCont);
|
||||||
pMsg->pCont = NULL;
|
pMsg->pCont = NULL;
|
||||||
|
|
|
@ -57,7 +57,7 @@ target_sources(
|
||||||
|
|
||||||
# tq
|
# tq
|
||||||
"src/tq/tq.c"
|
"src/tq/tq.c"
|
||||||
"src/tq/tqExec.c"
|
"src/tq/tqScan.c"
|
||||||
"src/tq/tqMeta.c"
|
"src/tq/tqMeta.c"
|
||||||
"src/tq/tqRead.c"
|
"src/tq/tqRead.c"
|
||||||
"src/tq/tqOffset.c"
|
"src/tq/tqOffset.c"
|
||||||
|
|
|
@ -178,11 +178,11 @@ typedef struct STsdbReader STsdbReader;
|
||||||
|
|
||||||
int32_t tsdbSetTableList(STsdbReader *pReader, const void *pTableList, int32_t num);
|
int32_t tsdbSetTableList(STsdbReader *pReader, const void *pTableList, int32_t num);
|
||||||
int32_t tsdbReaderOpen(SVnode *pVnode, SQueryTableDataCond *pCond, void *pTableList, int32_t numOfTables,
|
int32_t tsdbReaderOpen(SVnode *pVnode, SQueryTableDataCond *pCond, void *pTableList, int32_t numOfTables,
|
||||||
SSDataBlock *pResBlock, STsdbReader **ppReader, const char *idstr);
|
SSDataBlock *pResBlock, STsdbReader **ppReader, const char *idstr, bool countOnly);
|
||||||
|
|
||||||
void tsdbReaderSetId(STsdbReader* pReader, const char* idstr);
|
void tsdbReaderSetId(STsdbReader* pReader, const char* idstr);
|
||||||
void tsdbReaderClose(STsdbReader *pReader);
|
void tsdbReaderClose(STsdbReader *pReader);
|
||||||
bool tsdbNextDataBlock(STsdbReader *pReader);
|
int32_t tsdbNextDataBlock(STsdbReader *pReader, bool *hasNext);
|
||||||
int32_t tsdbRetrieveDatablockSMA(STsdbReader *pReader, SSDataBlock *pDataBlock, bool *allHave);
|
int32_t tsdbRetrieveDatablockSMA(STsdbReader *pReader, SSDataBlock *pDataBlock, bool *allHave);
|
||||||
void tsdbReleaseDataBlock(STsdbReader *pReader);
|
void tsdbReleaseDataBlock(STsdbReader *pReader);
|
||||||
SSDataBlock *tsdbRetrieveDataBlock(STsdbReader *pTsdbReadHandle, SArray *pColumnIdList);
|
SSDataBlock *tsdbRetrieveDataBlock(STsdbReader *pTsdbReadHandle, SArray *pColumnIdList);
|
||||||
|
|
|
@ -139,8 +139,7 @@ int32_t tqScanData(STQ* pTq, const STqHandle* pHandle, SMqDataRsp* pRsp, STqOffs
|
||||||
int32_t tqFetchLog(STQ* pTq, STqHandle* pHandle, int64_t* fetchOffset, SWalCkHead** pHeadWithCkSum, uint64_t reqId);
|
int32_t tqFetchLog(STQ* pTq, STqHandle* pHandle, int64_t* fetchOffset, SWalCkHead** pHeadWithCkSum, uint64_t reqId);
|
||||||
|
|
||||||
// tqExec
|
// tqExec
|
||||||
int32_t tqTaosxScanLog(STQ* pTq, STqHandle* pHandle, SPackedData submit, STaosxRsp* pRsp);
|
int32_t tqTaosxScanLog(STQ* pTq, STqHandle* pHandle, SPackedData submit, STaosxRsp* pRsp, int32_t* totalRows);
|
||||||
// int32_t tqTaosxScanLog(STQ* pTq, STqHandle* pHandle, SSubmitReq* pReq, STaosxRsp* pRsp);
|
|
||||||
int32_t tqAddBlockDataToRsp(const SSDataBlock* pBlock, SMqDataRsp* pRsp, int32_t numOfCols, int8_t precision);
|
int32_t tqAddBlockDataToRsp(const SSDataBlock* pBlock, SMqDataRsp* pRsp, int32_t numOfCols, int8_t precision);
|
||||||
int32_t tqSendDataRsp(STQ* pTq, const SRpcMsg* pMsg, const SMqPollReq* pReq, const SMqDataRsp* pRsp, int32_t type);
|
int32_t tqSendDataRsp(STQ* pTq, const SRpcMsg* pMsg, const SMqPollReq* pReq, const SMqDataRsp* pRsp, int32_t type);
|
||||||
int32_t tqPushDataRsp(STQ* pTq, STqPushEntry* pPushEntry);
|
int32_t tqPushDataRsp(STQ* pTq, STqPushEntry* pPushEntry);
|
||||||
|
|
|
@ -224,6 +224,8 @@ int32_t tsdbTbDataIterCreate(STbData *pTbData, TSDBKEY *pFrom, int8_t backward,
|
||||||
void *tsdbTbDataIterDestroy(STbDataIter *pIter);
|
void *tsdbTbDataIterDestroy(STbDataIter *pIter);
|
||||||
void tsdbTbDataIterOpen(STbData *pTbData, TSDBKEY *pFrom, int8_t backward, STbDataIter *pIter);
|
void tsdbTbDataIterOpen(STbData *pTbData, TSDBKEY *pFrom, int8_t backward, STbDataIter *pIter);
|
||||||
bool tsdbTbDataIterNext(STbDataIter *pIter);
|
bool tsdbTbDataIterNext(STbDataIter *pIter);
|
||||||
|
void tsdbMemTableCountRows(SMemTable *pMemTable, SHashObj* pTableMap, int64_t *rowsNum);
|
||||||
|
|
||||||
// STbData
|
// STbData
|
||||||
int32_t tsdbGetNRowsInTbData(STbData *pTbData);
|
int32_t tsdbGetNRowsInTbData(STbData *pTbData);
|
||||||
// tsdbFile.c ==============================================================================================
|
// tsdbFile.c ==============================================================================================
|
||||||
|
|
|
@ -193,7 +193,7 @@ STQ* tqOpen(const char* path, SVnode* pVnode);
|
||||||
void tqClose(STQ*);
|
void tqClose(STQ*);
|
||||||
int tqPushMsg(STQ*, void* msg, int32_t msgLen, tmsg_t msgType, int64_t ver);
|
int tqPushMsg(STQ*, void* msg, int32_t msgLen, tmsg_t msgType, int64_t ver);
|
||||||
int tqRegisterPushEntry(STQ* pTq, void* pHandle, const SMqPollReq* pRequest, SRpcMsg* pRpcMsg, SMqDataRsp* pDataRsp, int32_t type);
|
int tqRegisterPushEntry(STQ* pTq, void* pHandle, const SMqPollReq* pRequest, SRpcMsg* pRpcMsg, SMqDataRsp* pDataRsp, int32_t type);
|
||||||
int tqRemovePushEntry(STQ* pTq, const char* pKey, int32_t keyLen, uint64_t consumerId, bool rspConsumer);
|
int tqUnregisterPushEntry(STQ* pTq, const char* pKey, int32_t keyLen, uint64_t consumerId, bool rspConsumer);
|
||||||
|
|
||||||
int tqCommit(STQ*);
|
int tqCommit(STQ*);
|
||||||
int32_t tqUpdateTbUidList(STQ* pTq, const SArray* tbUidList, bool isAdd);
|
int32_t tqUpdateTbUidList(STQ* pTq, const SArray* tbUidList, bool isAdd);
|
||||||
|
|
|
@ -669,7 +669,7 @@ static int32_t tdRSmaExecAndSubmitResult(SSma *pSma, qTaskInfo_t taskInfo, SRSma
|
||||||
#endif
|
#endif
|
||||||
for (int32_t i = 0; i < taosArrayGetSize(pResList); ++i) {
|
for (int32_t i = 0; i < taosArrayGetSize(pResList); ++i) {
|
||||||
SSDataBlock *output = taosArrayGetP(pResList, i);
|
SSDataBlock *output = taosArrayGetP(pResList, i);
|
||||||
smaDebug("result block, uid:%" PRIu64 ", groupid:%" PRIu64 ", rows:%d", output->info.id.uid,
|
smaDebug("result block, uid:%" PRIu64 ", groupid:%" PRIu64 ", rows:%" PRId64, output->info.id.uid,
|
||||||
output->info.id.groupId, output->info.rows);
|
output->info.id.groupId, output->info.rows);
|
||||||
|
|
||||||
STsdb *sinkTsdb = (pItem->level == TSDB_RETENTION_L1 ? pSma->pRSmaTsdb[0] : pSma->pRSmaTsdb[1]);
|
STsdb *sinkTsdb = (pItem->level == TSDB_RETENTION_L1 ? pSma->pRSmaTsdb[0] : pSma->pRSmaTsdb[1]);
|
||||||
|
|
|
@ -223,19 +223,6 @@ static int32_t doSendDataRsp(const SRpcHandleInfo* pRpcHandleInfo, const SMqData
|
||||||
|
|
||||||
int32_t tqPushDataRsp(STQ* pTq, STqPushEntry* pPushEntry) {
|
int32_t tqPushDataRsp(STQ* pTq, STqPushEntry* pPushEntry) {
|
||||||
SMqDataRsp* pRsp = pPushEntry->pDataRsp;
|
SMqDataRsp* pRsp = pPushEntry->pDataRsp;
|
||||||
|
|
||||||
#if 0
|
|
||||||
A(taosArrayGetSize(pRsp->blockData) == pRsp->blockNum);
|
|
||||||
A(taosArrayGetSize(pRsp->blockDataLen) == pRsp->blockNum);
|
|
||||||
|
|
||||||
A(!pRsp->withSchema);
|
|
||||||
A(taosArrayGetSize(pRsp->blockSchema) == 0);
|
|
||||||
|
|
||||||
if (pRsp->reqOffset.type == TMQ_OFFSET__LOG) {
|
|
||||||
A(pRsp->rspOffset.version > pRsp->reqOffset.version);
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
SMqRspHead* pHeader = &pPushEntry->pDataRsp->head;
|
SMqRspHead* pHeader = &pPushEntry->pDataRsp->head;
|
||||||
doSendDataRsp(&pPushEntry->info, pRsp, pHeader->epoch, pHeader->consumerId, pHeader->mqMsgType);
|
doSendDataRsp(&pPushEntry->info, pRsp, pHeader->epoch, pHeader->consumerId, pHeader->mqMsgType);
|
||||||
|
|
||||||
|
@ -412,8 +399,8 @@ static int32_t extractResetOffsetVal(STqOffsetVal* pOffsetVal, STQ* pTq, STqHand
|
||||||
|
|
||||||
char formatBuf[80];
|
char formatBuf[80];
|
||||||
tFormatOffset(formatBuf, 80, pOffsetVal);
|
tFormatOffset(formatBuf, 80, pOffsetVal);
|
||||||
tqDebug("tmq poll: consumer:0x%" PRIx64 ", subkey %s, vgId:%d, existed offset found, offset reset to %s and continue.",
|
tqDebug("tmq poll: consumer:0x%" PRIx64 ", subkey %s, vgId:%d, existed offset found, offset reset to %s and continue. reqId:0x%"PRIx64,
|
||||||
consumerId, pHandle->subKey, vgId, formatBuf);
|
consumerId, pHandle->subKey, vgId, formatBuf, pRequest->reqId);
|
||||||
return 0;
|
return 0;
|
||||||
} else {
|
} else {
|
||||||
// no poll occurs in this vnode for this topic, let's seek to the right offset value.
|
// no poll occurs in this vnode for this topic, let's seek to the right offset value.
|
||||||
|
@ -486,6 +473,10 @@ static int32_t extractDataAndRspForNormalSubscribe(STQ* pTq, STqHandle* pHandle,
|
||||||
|
|
||||||
qSetTaskId(pHandle->execHandle.task, consumerId, pRequest->reqId);
|
qSetTaskId(pHandle->execHandle.task, consumerId, pRequest->reqId);
|
||||||
code = tqScanData(pTq, pHandle, &dataRsp, pOffset);
|
code = tqScanData(pTq, pHandle, &dataRsp, pOffset);
|
||||||
|
if (code != TSDB_CODE_SUCCESS) {
|
||||||
|
taosWUnLockLatch(&pTq->lock);
|
||||||
|
return code;
|
||||||
|
}
|
||||||
|
|
||||||
// till now, all data has been transferred to consumer, new data needs to push client once arrived.
|
// till now, all data has been transferred to consumer, new data needs to push client once arrived.
|
||||||
if (dataRsp.blockNum == 0 && dataRsp.reqOffset.type == TMQ_OFFSET__LOG &&
|
if (dataRsp.blockNum == 0 && dataRsp.reqOffset.type == TMQ_OFFSET__LOG &&
|
||||||
|
@ -538,123 +529,133 @@ static int32_t doPollDataForMq(STQ* pTq, STqHandle* pHandle, const SMqPollReq* p
|
||||||
// this is a normal subscribe requirement
|
// this is a normal subscribe requirement
|
||||||
if (pHandle->execHandle.subType == TOPIC_SUB_TYPE__COLUMN) {
|
if (pHandle->execHandle.subType == TOPIC_SUB_TYPE__COLUMN) {
|
||||||
return extractDataAndRspForNormalSubscribe(pTq, pHandle, pRequest, pMsg, &offset);
|
return extractDataAndRspForNormalSubscribe(pTq, pHandle, pRequest, pMsg, &offset);
|
||||||
} else { // for taosX
|
}
|
||||||
// todo handle the case where re-balance occurs.
|
|
||||||
SMqMetaRsp metaRsp = {0};
|
|
||||||
STaosxRsp taosxRsp = {0};
|
|
||||||
tqInitTaosxRsp(&taosxRsp, pRequest);
|
|
||||||
|
|
||||||
if (offset.type != TMQ_OFFSET__LOG) {
|
// todo handle the case where re-balance occurs.
|
||||||
if (tqScanTaosx(pTq, pHandle, &taosxRsp, &metaRsp, &offset) < 0) {
|
// for taosx
|
||||||
return -1;
|
SMqMetaRsp metaRsp = {0};
|
||||||
}
|
STaosxRsp taosxRsp = {0};
|
||||||
|
tqInitTaosxRsp(&taosxRsp, pRequest);
|
||||||
|
|
||||||
if (metaRsp.metaRspLen > 0) {
|
if (offset.type != TMQ_OFFSET__LOG) {
|
||||||
code = tqSendMetaPollRsp(pTq, pMsg, pRequest, &metaRsp);
|
if (tqScanTaosx(pTq, pHandle, &taosxRsp, &metaRsp, &offset) < 0) {
|
||||||
tqDebug("tmq poll: consumer:0x%" PRIx64 " subkey:%s vgId:%d, send meta offset type:%d,uid:%" PRId64
|
return -1;
|
||||||
",ts:%" PRId64,
|
|
||||||
consumerId, pHandle->subKey, vgId, metaRsp.rspOffset.type, metaRsp.rspOffset.uid, metaRsp.rspOffset.ts);
|
|
||||||
taosMemoryFree(metaRsp.metaRsp);
|
|
||||||
tDeleteSTaosxRsp(&taosxRsp);
|
|
||||||
return code;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (taosxRsp.blockNum > 0) {
|
|
||||||
code = tqSendDataRsp(pTq, pMsg, pRequest, (SMqDataRsp*)&taosxRsp, TMQ_MSG_TYPE__TAOSX_RSP);
|
|
||||||
tDeleteSTaosxRsp(&taosxRsp);
|
|
||||||
return code;
|
|
||||||
} else {
|
|
||||||
offset = taosxRsp.rspOffset;
|
|
||||||
}
|
|
||||||
|
|
||||||
tqDebug("taosx poll: consumer:0x%" PRIx64 " subkey:%s vgId:%d, send data blockNum:%d, offset type:%d,uid:%" PRId64
|
|
||||||
",version:%" PRId64,
|
|
||||||
consumerId, pHandle->subKey, vgId, taosxRsp.blockNum, taosxRsp.rspOffset.type, taosxRsp.rspOffset.uid,
|
|
||||||
taosxRsp.rspOffset.version);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (offset.type == TMQ_OFFSET__LOG) {
|
if (metaRsp.metaRspLen > 0) {
|
||||||
int64_t fetchVer = offset.version + 1;
|
code = tqSendMetaPollRsp(pTq, pMsg, pRequest, &metaRsp);
|
||||||
pCkHead = taosMemoryMalloc(sizeof(SWalCkHead) + 2048);
|
tqDebug("tmq poll: consumer:0x%" PRIx64 " subkey:%s vgId:%d, send meta offset type:%d,uid:%" PRId64
|
||||||
if (pCkHead == NULL) {
|
",ts:%" PRId64,
|
||||||
tDeleteSTaosxRsp(&taosxRsp);
|
consumerId, pHandle->subKey, vgId, metaRsp.rspOffset.type, metaRsp.rspOffset.uid,
|
||||||
terrno = TSDB_CODE_OUT_OF_MEMORY;
|
metaRsp.rspOffset.ts);
|
||||||
return -1;
|
taosMemoryFree(metaRsp.metaRsp);
|
||||||
|
tDeleteSTaosxRsp(&taosxRsp);
|
||||||
|
return code;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (taosxRsp.blockNum > 0) {
|
||||||
|
code = tqSendDataRsp(pTq, pMsg, pRequest, (SMqDataRsp*)&taosxRsp, TMQ_MSG_TYPE__TAOSX_RSP);
|
||||||
|
tDeleteSTaosxRsp(&taosxRsp);
|
||||||
|
return code;
|
||||||
|
} else {
|
||||||
|
offset = taosxRsp.rspOffset;
|
||||||
|
}
|
||||||
|
|
||||||
|
tqDebug("taosx poll: consumer:0x%" PRIx64 " subkey:%s vgId:%d, send data blockNum:%d, offset type:%d,uid:%" PRId64
|
||||||
|
",version:%" PRId64,
|
||||||
|
consumerId, pHandle->subKey, vgId, taosxRsp.blockNum, taosxRsp.rspOffset.type, taosxRsp.rspOffset.uid,
|
||||||
|
taosxRsp.rspOffset.version);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (offset.type == TMQ_OFFSET__LOG) {
|
||||||
|
int64_t fetchVer = offset.version + 1;
|
||||||
|
pCkHead = taosMemoryMalloc(sizeof(SWalCkHead) + 2048);
|
||||||
|
if (pCkHead == NULL) {
|
||||||
|
tDeleteSTaosxRsp(&taosxRsp);
|
||||||
|
terrno = TSDB_CODE_OUT_OF_MEMORY;
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
walSetReaderCapacity(pHandle->pWalReader, 2048);
|
||||||
|
int totalRows = 0;
|
||||||
|
while (1) {
|
||||||
|
// todo refactor: this is not correct.
|
||||||
|
int32_t savedEpoch = atomic_load_32(&pHandle->epoch);
|
||||||
|
if (savedEpoch > pRequest->epoch) {
|
||||||
|
tqWarn("tmq poll: consumer:0x%" PRIx64 " (epoch %d), subkey:%s vgId:%d offset %" PRId64
|
||||||
|
", found new consumer epoch %d, discard req epoch %d",
|
||||||
|
consumerId, pRequest->epoch, pHandle->subKey, vgId, fetchVer, savedEpoch, pRequest->epoch);
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
walSetReaderCapacity(pHandle->pWalReader, 2048);
|
if (tqFetchLog(pTq, pHandle, &fetchVer, &pCkHead, pRequest->reqId) < 0) {
|
||||||
|
tqOffsetResetToLog(&taosxRsp.rspOffset, fetchVer);
|
||||||
|
code = tqSendDataRsp(pTq, pMsg, pRequest, (SMqDataRsp*)&taosxRsp, TMQ_MSG_TYPE__TAOSX_RSP);
|
||||||
|
tDeleteSTaosxRsp(&taosxRsp);
|
||||||
|
taosMemoryFreeClear(pCkHead);
|
||||||
|
return code;
|
||||||
|
}
|
||||||
|
|
||||||
while (1) {
|
SWalCont* pHead = &pCkHead->head;
|
||||||
// todo refactor: this is not correct.
|
tqDebug("tmq poll: consumer:0x%" PRIx64 " (epoch %d) iter log, vgId:%d offset %" PRId64 " msgType %d", consumerId,
|
||||||
int32_t savedEpoch = atomic_load_32(&pHandle->epoch);
|
pRequest->epoch, vgId, fetchVer, pHead->msgType);
|
||||||
if (savedEpoch > pRequest->epoch) {
|
|
||||||
tqWarn("tmq poll: consumer:0x%" PRIx64 " (epoch %d), subkey:%s vgId:%d offset %" PRId64
|
|
||||||
", found new consumer epoch %d, discard req epoch %d",
|
|
||||||
consumerId, pRequest->epoch, pHandle->subKey, vgId, fetchVer, savedEpoch, pRequest->epoch);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (tqFetchLog(pTq, pHandle, &fetchVer, &pCkHead, pRequest->reqId) < 0) {
|
// process meta
|
||||||
tqOffsetResetToLog(&taosxRsp.rspOffset, fetchVer);
|
if (pHead->msgType != TDMT_VND_SUBMIT) {
|
||||||
|
if(totalRows > 0) {
|
||||||
|
tqOffsetResetToLog(&taosxRsp.rspOffset, fetchVer - 1);
|
||||||
code = tqSendDataRsp(pTq, pMsg, pRequest, (SMqDataRsp*)&taosxRsp, TMQ_MSG_TYPE__TAOSX_RSP);
|
code = tqSendDataRsp(pTq, pMsg, pRequest, (SMqDataRsp*)&taosxRsp, TMQ_MSG_TYPE__TAOSX_RSP);
|
||||||
tDeleteSTaosxRsp(&taosxRsp);
|
tDeleteSTaosxRsp(&taosxRsp);
|
||||||
taosMemoryFreeClear(pCkHead);
|
taosMemoryFreeClear(pCkHead);
|
||||||
return code;
|
return code;
|
||||||
}
|
}
|
||||||
|
|
||||||
SWalCont* pHead = &pCkHead->head;
|
tqDebug("fetch meta msg, ver:%" PRId64 ", type:%s", pHead->version, TMSG_INFO(pHead->msgType));
|
||||||
tqDebug("tmq poll: consumer:0x%" PRIx64 " (epoch %d) iter log, vgId:%d offset %" PRId64 " msgType %d",
|
tqOffsetResetToLog(&metaRsp.rspOffset, fetchVer);
|
||||||
consumerId, pRequest->epoch, vgId, fetchVer, pHead->msgType);
|
metaRsp.resMsgType = pHead->msgType;
|
||||||
|
metaRsp.metaRspLen = pHead->bodyLen;
|
||||||
if (pHead->msgType == TDMT_VND_SUBMIT) {
|
metaRsp.metaRsp = pHead->body;
|
||||||
SPackedData submit = {
|
if (tqSendMetaPollRsp(pTq, pMsg, pRequest, &metaRsp) < 0) {
|
||||||
.msgStr = POINTER_SHIFT(pHead->body, sizeof(SSubmitReq2Msg)),
|
code = -1;
|
||||||
.msgLen = pHead->bodyLen - sizeof(SSubmitReq2Msg),
|
|
||||||
.ver = pHead->version,
|
|
||||||
};
|
|
||||||
|
|
||||||
if (tqTaosxScanLog(pTq, pHandle, submit, &taosxRsp) < 0) {
|
|
||||||
tqError("tmq poll: tqTaosxScanLog error %" PRId64 ", in vgId:%d, subkey %s", consumerId, vgId,
|
|
||||||
pRequest->subKey);
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (taosxRsp.blockNum > 0) {
|
|
||||||
tqOffsetResetToLog(&taosxRsp.rspOffset, fetchVer);
|
|
||||||
code = tqSendDataRsp(pTq, pMsg, pRequest, (SMqDataRsp*)&taosxRsp, TMQ_MSG_TYPE__TAOSX_RSP);
|
|
||||||
tDeleteSTaosxRsp(&taosxRsp);
|
|
||||||
taosMemoryFreeClear(pCkHead);
|
|
||||||
return code;
|
|
||||||
} else {
|
|
||||||
fetchVer++;
|
|
||||||
}
|
|
||||||
|
|
||||||
} else {
|
|
||||||
/*A(pHandle->fetchMeta);*/
|
|
||||||
/*A(IS_META_MSG(pHead->msgType));*/
|
|
||||||
tqDebug("fetch meta msg, ver:%" PRId64 ", type:%s", pHead->version, TMSG_INFO(pHead->msgType));
|
|
||||||
tqOffsetResetToLog(&metaRsp.rspOffset, fetchVer);
|
|
||||||
metaRsp.resMsgType = pHead->msgType;
|
|
||||||
metaRsp.metaRspLen = pHead->bodyLen;
|
|
||||||
metaRsp.metaRsp = pHead->body;
|
|
||||||
if (tqSendMetaPollRsp(pTq, pMsg, pRequest, &metaRsp) < 0) {
|
|
||||||
code = -1;
|
|
||||||
taosMemoryFreeClear(pCkHead);
|
|
||||||
tDeleteSTaosxRsp(&taosxRsp);
|
|
||||||
return code;
|
|
||||||
}
|
|
||||||
code = 0;
|
|
||||||
taosMemoryFreeClear(pCkHead);
|
taosMemoryFreeClear(pCkHead);
|
||||||
tDeleteSTaosxRsp(&taosxRsp);
|
tDeleteSTaosxRsp(&taosxRsp);
|
||||||
return code;
|
return code;
|
||||||
}
|
}
|
||||||
|
code = 0;
|
||||||
|
taosMemoryFreeClear(pCkHead);
|
||||||
|
tDeleteSTaosxRsp(&taosxRsp);
|
||||||
|
return code;
|
||||||
|
}
|
||||||
|
|
||||||
|
// process data
|
||||||
|
SPackedData submit = {
|
||||||
|
.msgStr = POINTER_SHIFT(pHead->body, sizeof(SSubmitReq2Msg)),
|
||||||
|
.msgLen = pHead->bodyLen - sizeof(SSubmitReq2Msg),
|
||||||
|
.ver = pHead->version,
|
||||||
|
};
|
||||||
|
|
||||||
|
if (tqTaosxScanLog(pTq, pHandle, submit, &taosxRsp, &totalRows) < 0) {
|
||||||
|
tqError("tmq poll: tqTaosxScanLog error %" PRId64 ", in vgId:%d, subkey %s", consumerId, vgId,
|
||||||
|
pRequest->subKey);
|
||||||
|
taosMemoryFreeClear(pCkHead);
|
||||||
|
tDeleteSTaosxRsp(&taosxRsp);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (totalRows >= 4096 || taosxRsp.createTableNum > 0) {
|
||||||
|
tqOffsetResetToLog(&taosxRsp.rspOffset, fetchVer);
|
||||||
|
code = tqSendDataRsp(pTq, pMsg, pRequest, (SMqDataRsp*)&taosxRsp, TMQ_MSG_TYPE__TAOSX_RSP);
|
||||||
|
tDeleteSTaosxRsp(&taosxRsp);
|
||||||
|
taosMemoryFreeClear(pCkHead);
|
||||||
|
return code;
|
||||||
|
} else {
|
||||||
|
fetchVer++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
tDeleteSTaosxRsp(&taosxRsp);
|
|
||||||
taosMemoryFreeClear(pCkHead);
|
|
||||||
return 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
tDeleteSTaosxRsp(&taosxRsp);
|
||||||
|
taosMemoryFreeClear(pCkHead);
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t tqProcessPollReq(STQ* pTq, SRpcMsg* pMsg) {
|
int32_t tqProcessPollReq(STQ* pTq, SRpcMsg* pMsg) {
|
||||||
|
@ -798,7 +799,6 @@ int32_t tqProcessSubscribeReq(STQ* pTq, int64_t sversion, char* msg, int32_t msg
|
||||||
|
|
||||||
STqHandle tqHandle = {0};
|
STqHandle tqHandle = {0};
|
||||||
pHandle = &tqHandle;
|
pHandle = &tqHandle;
|
||||||
/*taosInitRWLatch(&pExec->lock);*/
|
|
||||||
|
|
||||||
uint64_t oldConsumerId = pHandle->consumerId;
|
uint64_t oldConsumerId = pHandle->consumerId;
|
||||||
memcpy(pHandle->subKey, req.subKey, TSDB_SUBSCRIBE_KEY_LEN);
|
memcpy(pHandle->subKey, req.subKey, TSDB_SUBSCRIBE_KEY_LEN);
|
||||||
|
@ -833,7 +833,7 @@ int32_t tqProcessSubscribeReq(STQ* pTq, int64_t sversion, char* msg, int32_t msg
|
||||||
req.qmsg = NULL;
|
req.qmsg = NULL;
|
||||||
|
|
||||||
pHandle->execHandle.task =
|
pHandle->execHandle.task =
|
||||||
qCreateQueueExecTaskInfo(pHandle->execHandle.execCol.qmsg, &handle, vgId, &pHandle->execHandle.numOfCols, NULL);
|
qCreateQueueExecTaskInfo(pHandle->execHandle.execCol.qmsg, &handle, vgId, &pHandle->execHandle.numOfCols, req.newConsumerId);
|
||||||
void* scanner = NULL;
|
void* scanner = NULL;
|
||||||
qExtractStreamScanner(pHandle->execHandle.task, &scanner);
|
qExtractStreamScanner(pHandle->execHandle.task, &scanner);
|
||||||
pHandle->execHandle.pExecReader = qExtractReaderFromStreamScanner(scanner);
|
pHandle->execHandle.pExecReader = qExtractReaderFromStreamScanner(scanner);
|
||||||
|
@ -846,7 +846,7 @@ int32_t tqProcessSubscribeReq(STQ* pTq, int64_t sversion, char* msg, int32_t msg
|
||||||
buildSnapContext(handle.meta, handle.version, 0, pHandle->execHandle.subType, pHandle->fetchMeta,
|
buildSnapContext(handle.meta, handle.version, 0, pHandle->execHandle.subType, pHandle->fetchMeta,
|
||||||
(SSnapContext**)(&handle.sContext));
|
(SSnapContext**)(&handle.sContext));
|
||||||
|
|
||||||
pHandle->execHandle.task = qCreateQueueExecTaskInfo(NULL, &handle, vgId, NULL, NULL);
|
pHandle->execHandle.task = qCreateQueueExecTaskInfo(NULL, &handle, vgId, NULL, req.newConsumerId);
|
||||||
} else if (pHandle->execHandle.subType == TOPIC_SUB_TYPE__TABLE) {
|
} else if (pHandle->execHandle.subType == TOPIC_SUB_TYPE__TABLE) {
|
||||||
pHandle->pWalReader = walOpenReader(pVnode->pWal, NULL);
|
pHandle->pWalReader = walOpenReader(pVnode->pWal, NULL);
|
||||||
pHandle->execHandle.execTb.suid = req.suid;
|
pHandle->execHandle.execTb.suid = req.suid;
|
||||||
|
@ -864,7 +864,7 @@ int32_t tqProcessSubscribeReq(STQ* pTq, int64_t sversion, char* msg, int32_t msg
|
||||||
|
|
||||||
buildSnapContext(handle.meta, handle.version, req.suid, pHandle->execHandle.subType, pHandle->fetchMeta,
|
buildSnapContext(handle.meta, handle.version, req.suid, pHandle->execHandle.subType, pHandle->fetchMeta,
|
||||||
(SSnapContext**)(&handle.sContext));
|
(SSnapContext**)(&handle.sContext));
|
||||||
pHandle->execHandle.task = qCreateQueueExecTaskInfo(NULL, &handle, vgId, NULL, NULL);
|
pHandle->execHandle.task = qCreateQueueExecTaskInfo(NULL, &handle, vgId, NULL, req.newConsumerId);
|
||||||
}
|
}
|
||||||
|
|
||||||
taosHashPut(pTq->pHandle, req.subKey, strlen(req.subKey), pHandle, sizeof(STqHandle));
|
taosHashPut(pTq->pHandle, req.subKey, strlen(req.subKey), pHandle, sizeof(STqHandle));
|
||||||
|
@ -885,17 +885,23 @@ int32_t tqProcessSubscribeReq(STQ* pTq, int64_t sversion, char* msg, int32_t msg
|
||||||
tqInfo("vgId:%d switch consumer from Id:0x%" PRIx64 " to Id:0x%" PRIx64, req.vgId, pHandle->consumerId,
|
tqInfo("vgId:%d switch consumer from Id:0x%" PRIx64 " to Id:0x%" PRIx64, req.vgId, pHandle->consumerId,
|
||||||
req.newConsumerId);
|
req.newConsumerId);
|
||||||
|
|
||||||
|
// kill executing task
|
||||||
|
qTaskInfo_t pTaskInfo = pHandle->execHandle.task;
|
||||||
|
if (pTaskInfo != NULL) {
|
||||||
|
qKillTask(pTaskInfo, TSDB_CODE_SUCCESS);
|
||||||
|
}
|
||||||
|
|
||||||
taosWLockLatch(&pTq->lock);
|
taosWLockLatch(&pTq->lock);
|
||||||
atomic_store_32(&pHandle->epoch, -1);
|
atomic_store_32(&pHandle->epoch, -1);
|
||||||
|
|
||||||
// remove if it has been register in the push manager, and return one empty block to consumer
|
// remove if it has been register in the push manager, and return one empty block to consumer
|
||||||
tqRemovePushEntry(pTq, req.subKey, (int32_t)strlen(req.subKey), pHandle->consumerId, true);
|
tqUnregisterPushEntry(pTq, req.subKey, (int32_t)strlen(req.subKey), pHandle->consumerId, true);
|
||||||
|
|
||||||
atomic_store_64(&pHandle->consumerId, req.newConsumerId);
|
atomic_store_64(&pHandle->consumerId, req.newConsumerId);
|
||||||
atomic_add_fetch_32(&pHandle->epoch, 1);
|
atomic_add_fetch_32(&pHandle->epoch, 1);
|
||||||
|
|
||||||
if (pHandle->execHandle.subType == TOPIC_SUB_TYPE__COLUMN) {
|
if (pHandle->execHandle.subType == TOPIC_SUB_TYPE__COLUMN) {
|
||||||
qStreamCloseTsdbReader(pHandle->execHandle.task);
|
qStreamCloseTsdbReader(pTaskInfo);
|
||||||
}
|
}
|
||||||
|
|
||||||
taosWUnLockLatch(&pTq->lock);
|
taosWUnLockLatch(&pTq->lock);
|
||||||
|
|
|
@ -307,7 +307,7 @@ int32_t tqMetaRestoreHandle(STQ* pTq) {
|
||||||
|
|
||||||
if (handle.execHandle.subType == TOPIC_SUB_TYPE__COLUMN) {
|
if (handle.execHandle.subType == TOPIC_SUB_TYPE__COLUMN) {
|
||||||
handle.execHandle.task =
|
handle.execHandle.task =
|
||||||
qCreateQueueExecTaskInfo(handle.execHandle.execCol.qmsg, &reader, vgId, &handle.execHandle.numOfCols, NULL);
|
qCreateQueueExecTaskInfo(handle.execHandle.execCol.qmsg, &reader, vgId, &handle.execHandle.numOfCols, 0);
|
||||||
if (handle.execHandle.task == NULL) {
|
if (handle.execHandle.task == NULL) {
|
||||||
tqError("cannot create exec task for %s", handle.subKey);
|
tqError("cannot create exec task for %s", handle.subKey);
|
||||||
code = -1;
|
code = -1;
|
||||||
|
@ -332,7 +332,7 @@ int32_t tqMetaRestoreHandle(STQ* pTq) {
|
||||||
|
|
||||||
buildSnapContext(reader.meta, reader.version, 0, handle.execHandle.subType, handle.fetchMeta,
|
buildSnapContext(reader.meta, reader.version, 0, handle.execHandle.subType, handle.fetchMeta,
|
||||||
(SSnapContext**)(&reader.sContext));
|
(SSnapContext**)(&reader.sContext));
|
||||||
handle.execHandle.task = qCreateQueueExecTaskInfo(NULL, &reader, vgId, NULL, NULL);
|
handle.execHandle.task = qCreateQueueExecTaskInfo(NULL, &reader, vgId, NULL, 0);
|
||||||
} else if (handle.execHandle.subType == TOPIC_SUB_TYPE__TABLE) {
|
} else if (handle.execHandle.subType == TOPIC_SUB_TYPE__TABLE) {
|
||||||
handle.pWalReader = walOpenReader(pTq->pVnode->pWal, NULL);
|
handle.pWalReader = walOpenReader(pTq->pVnode->pWal, NULL);
|
||||||
|
|
||||||
|
@ -341,7 +341,7 @@ int32_t tqMetaRestoreHandle(STQ* pTq) {
|
||||||
tqDebug("vgId:%d, tq try to get all ctb, suid:%" PRId64, pTq->pVnode->config.vgId, handle.execHandle.execTb.suid);
|
tqDebug("vgId:%d, tq try to get all ctb, suid:%" PRId64, pTq->pVnode->config.vgId, handle.execHandle.execTb.suid);
|
||||||
for (int32_t i = 0; i < taosArrayGetSize(tbUidList); i++) {
|
for (int32_t i = 0; i < taosArrayGetSize(tbUidList); i++) {
|
||||||
int64_t tbUid = *(int64_t*)taosArrayGet(tbUidList, i);
|
int64_t tbUid = *(int64_t*)taosArrayGet(tbUidList, i);
|
||||||
tqDebug("vgId:%d, idx %d, uid:%" PRId64, TD_VID(pTq->pVnode), i, tbUid);
|
tqDebug("vgId:%d, idx %d, uid:%" PRId64, vgId, i, tbUid);
|
||||||
}
|
}
|
||||||
handle.execHandle.pExecReader = tqOpenReader(pTq->pVnode);
|
handle.execHandle.pExecReader = tqOpenReader(pTq->pVnode);
|
||||||
tqReaderSetTbUidList(handle.execHandle.pExecReader, tbUidList);
|
tqReaderSetTbUidList(handle.execHandle.pExecReader, tbUidList);
|
||||||
|
@ -349,9 +349,9 @@ int32_t tqMetaRestoreHandle(STQ* pTq) {
|
||||||
|
|
||||||
buildSnapContext(reader.meta, reader.version, handle.execHandle.execTb.suid, handle.execHandle.subType,
|
buildSnapContext(reader.meta, reader.version, handle.execHandle.execTb.suid, handle.execHandle.subType,
|
||||||
handle.fetchMeta, (SSnapContext**)(&reader.sContext));
|
handle.fetchMeta, (SSnapContext**)(&reader.sContext));
|
||||||
handle.execHandle.task = qCreateQueueExecTaskInfo(NULL, &reader, vgId, NULL, NULL);
|
handle.execHandle.task = qCreateQueueExecTaskInfo(NULL, &reader, vgId, NULL, 0);
|
||||||
}
|
}
|
||||||
tqDebug("tq restore %s consumer %" PRId64 " vgId:%d", handle.subKey, handle.consumerId, TD_VID(pTq->pVnode));
|
tqDebug("tq restore %s consumer %" PRId64 " vgId:%d", handle.subKey, handle.consumerId, vgId);
|
||||||
taosHashPut(pTq->pHandle, pKey, kLen, &handle, sizeof(STqHandle));
|
taosHashPut(pTq->pHandle, pKey, kLen, &handle, sizeof(STqHandle));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -206,7 +206,84 @@ int32_t tqPushMsgNew(STQ* pTq, void* msg, int32_t msgLen, tmsg_t msgType, int64_
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
int tqPushMsg(STQ* pTq, void* msg, int32_t msgLen, tmsg_t msgType, int64_t ver) {
|
typedef struct {
|
||||||
|
void* pKey;
|
||||||
|
int64_t keyLen;
|
||||||
|
} SItem;
|
||||||
|
|
||||||
|
static void recordPushedEntry(SArray* cachedKey, void* pIter);
|
||||||
|
|
||||||
|
static void freeItem(void* param) {
|
||||||
|
SItem* p = (SItem*) param;
|
||||||
|
taosMemoryFree(p->pKey);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void doRemovePushedEntry(SArray* pCachedKeys, STQ* pTq) {
|
||||||
|
int32_t vgId = TD_VID(pTq->pVnode);
|
||||||
|
int32_t numOfKeys = (int32_t) taosArrayGetSize(pCachedKeys);
|
||||||
|
|
||||||
|
for (int32_t i = 0; i < numOfKeys; i++) {
|
||||||
|
SItem* pItem = taosArrayGet(pCachedKeys, i);
|
||||||
|
if (taosHashRemove(pTq->pPushMgr, pItem->pKey, pItem->keyLen) != 0) {
|
||||||
|
tqError("vgId:%d, tq push hash remove key error, key: %s", vgId, (char*) pItem->pKey);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (numOfKeys > 0) {
|
||||||
|
tqDebug("vgId:%d, pushed %d items and remain:%d", vgId, numOfKeys, (int32_t)taosHashGetSize(pTq->pPushMgr));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void doPushDataForEntry(void* pIter, STqExecHandle* pExec, STQ* pTq, int64_t ver, int32_t vgId, char* pData,
|
||||||
|
int32_t dataLen, SArray* pCachedKey) {
|
||||||
|
STqPushEntry* pPushEntry = *(STqPushEntry**)pIter;
|
||||||
|
|
||||||
|
SMqDataRsp* pRsp = pPushEntry->pDataRsp;
|
||||||
|
if (pRsp->reqOffset.version >= ver) {
|
||||||
|
tqDebug("vgId:%d, push entry req version %" PRId64 ", while push version %" PRId64 ", skip", vgId,
|
||||||
|
pRsp->reqOffset.version, ver);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
qTaskInfo_t pTaskInfo = pExec->task;
|
||||||
|
|
||||||
|
// prepare scan mem data
|
||||||
|
SPackedData submit = {.msgStr = pData, .msgLen = dataLen, .ver = ver};
|
||||||
|
|
||||||
|
if (qStreamSetScanMemData(pTaskInfo, submit) != 0) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// here start to scan submit block to extract the subscribed data
|
||||||
|
int32_t totalRows = 0;
|
||||||
|
|
||||||
|
while (1) {
|
||||||
|
SSDataBlock* pDataBlock = NULL;
|
||||||
|
uint64_t ts = 0;
|
||||||
|
if (qExecTask(pTaskInfo, &pDataBlock, &ts) < 0) {
|
||||||
|
tqDebug("vgId:%d, tq exec error since %s", vgId, terrstr());
|
||||||
|
}
|
||||||
|
|
||||||
|
if (pDataBlock == NULL) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
tqAddBlockDataToRsp(pDataBlock, pRsp, pExec->numOfCols, pTq->pVnode->config.tsdbCfg.precision);
|
||||||
|
pRsp->blockNum++;
|
||||||
|
totalRows += pDataBlock->info.rows;
|
||||||
|
}
|
||||||
|
|
||||||
|
tqDebug("vgId:%d, tq handle push, subkey:%s, block num:%d, rows:%d", vgId, pPushEntry->subKey, pRsp->blockNum,
|
||||||
|
totalRows);
|
||||||
|
|
||||||
|
if (pRsp->blockNum > 0) {
|
||||||
|
tqOffsetResetToLog(&pRsp->rspOffset, ver);
|
||||||
|
tqPushDataRsp(pTq, pPushEntry);
|
||||||
|
recordPushedEntry(pCachedKey, pIter);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
int32_t tqPushMsg(STQ* pTq, void* msg, int32_t msgLen, tmsg_t msgType, int64_t ver) {
|
||||||
void* pReq = POINTER_SHIFT(msg, sizeof(SSubmitReq2Msg));
|
void* pReq = POINTER_SHIFT(msg, sizeof(SSubmitReq2Msg));
|
||||||
int32_t len = msgLen - sizeof(SSubmitReq2Msg);
|
int32_t len = msgLen - sizeof(SSubmitReq2Msg);
|
||||||
int32_t vgId = TD_VID(pTq->pVnode);
|
int32_t vgId = TD_VID(pTq->pVnode);
|
||||||
|
@ -220,24 +297,19 @@ int tqPushMsg(STQ* pTq, void* msg, int32_t msgLen, tmsg_t msgType, int64_t ver)
|
||||||
tqDebug("vgId:%d tq push msg version:%" PRId64 " type:%s, head:%p, body:%p len:%d, numOfPushed consumers:%d",
|
tqDebug("vgId:%d tq push msg version:%" PRId64 " type:%s, head:%p, body:%p len:%d, numOfPushed consumers:%d",
|
||||||
vgId, ver, TMSG_INFO(msgType), msg, pReq, len, numOfRegisteredPush);
|
vgId, ver, TMSG_INFO(msgType), msg, pReq, len, numOfRegisteredPush);
|
||||||
|
|
||||||
SArray* cachedKeys = taosArrayInit(0, sizeof(void*));
|
void* data = taosMemoryMalloc(len);
|
||||||
SArray* cachedKeyLens = taosArrayInit(0, sizeof(size_t));
|
|
||||||
|
|
||||||
void* data = taosMemoryMalloc(len);
|
|
||||||
if (data == NULL) {
|
if (data == NULL) {
|
||||||
terrno = TSDB_CODE_OUT_OF_MEMORY;
|
terrno = TSDB_CODE_OUT_OF_MEMORY;
|
||||||
tqError("failed to copy data for stream since out of memory");
|
tqError("failed to copy data for stream since out of memory, vgId:%d", vgId);
|
||||||
taosArrayDestroyP(cachedKeys, (FDelete)taosMemoryFree);
|
|
||||||
taosArrayDestroy(cachedKeyLens);
|
|
||||||
|
|
||||||
// unlock
|
|
||||||
taosWUnLockLatch(&pTq->lock);
|
taosWUnLockLatch(&pTq->lock);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
memcpy(data, pReq, len);
|
memcpy(data, pReq, len);
|
||||||
|
|
||||||
void* pIter = NULL;
|
SArray* cachedKey = taosArrayInit(0, sizeof(SItem));
|
||||||
|
void* pIter = NULL;
|
||||||
|
|
||||||
while (1) {
|
while (1) {
|
||||||
pIter = taosHashIterate(pTq->pPushMgr, pIter);
|
pIter = taosHashIterate(pTq->pPushMgr, pIter);
|
||||||
if (pIter == NULL) {
|
if (pIter == NULL) {
|
||||||
|
@ -248,83 +320,29 @@ int tqPushMsg(STQ* pTq, void* msg, int32_t msgLen, tmsg_t msgType, int64_t ver)
|
||||||
|
|
||||||
STqHandle* pHandle = taosHashGet(pTq->pHandle, pPushEntry->subKey, strlen(pPushEntry->subKey));
|
STqHandle* pHandle = taosHashGet(pTq->pHandle, pPushEntry->subKey, strlen(pPushEntry->subKey));
|
||||||
if (pHandle == NULL) {
|
if (pHandle == NULL) {
|
||||||
tqDebug("vgId:%d, cannot find handle %s", pTq->pVnode->config.vgId, pPushEntry->subKey);
|
tqDebug("vgId:%d, failed to find handle %s in pushing data to consumer, ignore", pTq->pVnode->config.vgId, pPushEntry->subKey);
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
SMqDataRsp* pRsp = pPushEntry->pDataRsp;
|
|
||||||
if (pRsp->reqOffset.version >= ver) {
|
|
||||||
tqDebug("vgId:%d, push entry req version %" PRId64 ", while push version %" PRId64 ", skip", vgId,
|
|
||||||
pRsp->reqOffset.version, ver);
|
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
STqExecHandle* pExec = &pHandle->execHandle;
|
STqExecHandle* pExec = &pHandle->execHandle;
|
||||||
qTaskInfo_t task = pExec->task;
|
doPushDataForEntry(pIter, pExec, pTq, ver, vgId, data, len, cachedKey);
|
||||||
|
|
||||||
// prepare scan mem data
|
|
||||||
SPackedData submit = {
|
|
||||||
.msgStr = data,
|
|
||||||
.msgLen = len,
|
|
||||||
.ver = ver,
|
|
||||||
};
|
|
||||||
if(qStreamSetScanMemData(task, submit) != 0){
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
// here start to scan submit block to extract the subscribed data
|
|
||||||
while (1) {
|
|
||||||
SSDataBlock* pDataBlock = NULL;
|
|
||||||
uint64_t ts = 0;
|
|
||||||
if (qExecTask(task, &pDataBlock, &ts) < 0) {
|
|
||||||
tqDebug("vgId:%d, tq exec error since %s", vgId, terrstr());
|
|
||||||
}
|
|
||||||
|
|
||||||
if (pDataBlock == NULL) {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
tqAddBlockDataToRsp(pDataBlock, pRsp, pExec->numOfCols, pTq->pVnode->config.tsdbCfg.precision);
|
|
||||||
pRsp->blockNum++;
|
|
||||||
}
|
|
||||||
|
|
||||||
tqDebug("vgId:%d, tq handle push, subkey:%s, block num:%d", vgId, pPushEntry->subKey, pRsp->blockNum);
|
|
||||||
if (pRsp->blockNum > 0) {
|
|
||||||
// set offset
|
|
||||||
tqOffsetResetToLog(&pRsp->rspOffset, ver);
|
|
||||||
|
|
||||||
// remove from hash
|
|
||||||
size_t kLen;
|
|
||||||
void* key = taosHashGetKey(pIter, &kLen);
|
|
||||||
void* keyCopy = taosMemoryCalloc(1, kLen + 1);
|
|
||||||
memcpy(keyCopy, key, kLen);
|
|
||||||
|
|
||||||
taosArrayPush(cachedKeys, &keyCopy);
|
|
||||||
taosArrayPush(cachedKeyLens, &kLen);
|
|
||||||
|
|
||||||
tqPushDataRsp(pTq, pPushEntry);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// delete entry
|
doRemovePushedEntry(cachedKey, pTq);
|
||||||
for (int32_t i = 0; i < taosArrayGetSize(cachedKeys); i++) {
|
taosArrayDestroyEx(cachedKey, freeItem);
|
||||||
void* key = taosArrayGetP(cachedKeys, i);
|
|
||||||
size_t kLen = *(size_t*)taosArrayGet(cachedKeyLens, i);
|
|
||||||
if (taosHashRemove(pTq->pPushMgr, key, kLen) != 0) {
|
|
||||||
tqError("vgId:%d, tq push hash remove key error, key: %s", pTq->pVnode->config.vgId, (char*)key);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
taosArrayDestroyP(cachedKeys, (FDelete)taosMemoryFree);
|
|
||||||
taosArrayDestroy(cachedKeyLens);
|
|
||||||
taosMemoryFree(data);
|
taosMemoryFree(data);
|
||||||
}
|
}
|
||||||
|
|
||||||
// unlock
|
// unlock
|
||||||
taosWUnLockLatch(&pTq->lock);
|
taosWUnLockLatch(&pTq->lock);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// push data for stream processing
|
||||||
if (!tsDisableStream && vnodeIsRoleLeader(pTq->pVnode)) {
|
if (!tsDisableStream && vnodeIsRoleLeader(pTq->pVnode)) {
|
||||||
if (taosHashGetSize(pTq->pStreamMeta->pTasks) == 0) return 0;
|
if (taosHashGetSize(pTq->pStreamMeta->pTasks) == 0) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
if (msgType == TDMT_VND_SUBMIT) {
|
if (msgType == TDMT_VND_SUBMIT) {
|
||||||
void* data = taosMemoryMalloc(len);
|
void* data = taosMemoryMalloc(len);
|
||||||
if (data == NULL) {
|
if (data == NULL) {
|
||||||
|
@ -332,12 +350,9 @@ int tqPushMsg(STQ* pTq, void* msg, int32_t msgLen, tmsg_t msgType, int64_t ver)
|
||||||
tqError("failed to copy data for stream since out of memory");
|
tqError("failed to copy data for stream since out of memory");
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
memcpy(data, pReq, len);
|
memcpy(data, pReq, len);
|
||||||
SPackedData submit = {
|
SPackedData submit = {.msgStr = data, .msgLen = len, .ver = ver};
|
||||||
.msgStr = data,
|
|
||||||
.msgLen = len,
|
|
||||||
.ver = ver,
|
|
||||||
};
|
|
||||||
|
|
||||||
tqDebug("tq copy write msg %p %d %" PRId64 " from %p", data, len, ver, pReq);
|
tqDebug("tq copy write msg %p %d %" PRId64 " from %p", data, len, ver, pReq);
|
||||||
tqProcessSubmitReq(pTq, submit);
|
tqProcessSubmitReq(pTq, submit);
|
||||||
|
@ -351,6 +366,13 @@ int tqPushMsg(STQ* pTq, void* msg, int32_t msgLen, tmsg_t msgType, int64_t ver)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void recordPushedEntry(SArray* cachedKey, void* pIter) {
|
||||||
|
size_t kLen = 0;
|
||||||
|
void* key = taosHashGetKey(pIter, &kLen);
|
||||||
|
SItem item = {.pKey = strndup(key, kLen), .keyLen = kLen};
|
||||||
|
taosArrayPush(cachedKey, &item);
|
||||||
|
}
|
||||||
|
|
||||||
int32_t tqRegisterPushEntry(STQ* pTq, void* pHandle, const SMqPollReq* pRequest, SRpcMsg* pRpcMsg,
|
int32_t tqRegisterPushEntry(STQ* pTq, void* pHandle, const SMqPollReq* pRequest, SRpcMsg* pRpcMsg,
|
||||||
SMqDataRsp* pDataRsp, int32_t type) {
|
SMqDataRsp* pDataRsp, int32_t type) {
|
||||||
uint64_t consumerId = pRequest->consumerId;
|
uint64_t consumerId = pRequest->consumerId;
|
||||||
|
@ -388,8 +410,8 @@ int32_t tqRegisterPushEntry(STQ* pTq, void* pHandle, const SMqPollReq* pRequest,
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t tqRemovePushEntry(STQ* pTq, const char* pKey, int32_t keyLen, uint64_t consumerId, bool rspConsumer) {
|
int32_t tqUnregisterPushEntry(STQ* pTq, const char* pKey, int32_t keyLen, uint64_t consumerId, bool rspConsumer) {
|
||||||
int32_t vgId = TD_VID(pTq->pVnode);
|
int32_t vgId = TD_VID(pTq->pVnode);
|
||||||
STqPushEntry** pEntry = taosHashGet(pTq->pPushMgr, pKey, keyLen);
|
STqPushEntry** pEntry = taosHashGet(pTq->pPushMgr, pKey, keyLen);
|
||||||
|
|
||||||
if (pEntry != NULL) {
|
if (pEntry != NULL) {
|
||||||
|
|
|
@ -340,7 +340,7 @@ int32_t tqNextBlock(STqReader* pReader, SFetchRet* ret) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
ret->fetchType = FETCH_TYPE__DATA;
|
ret->fetchType = FETCH_TYPE__DATA;
|
||||||
tqDebug("return data rows %d", ret->data.info.rows);
|
tqDebug("return data rows %" PRId64, ret->data.info.rows);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -18,7 +18,9 @@
|
||||||
int32_t tqAddBlockDataToRsp(const SSDataBlock* pBlock, SMqDataRsp* pRsp, int32_t numOfCols, int8_t precision) {
|
int32_t tqAddBlockDataToRsp(const SSDataBlock* pBlock, SMqDataRsp* pRsp, int32_t numOfCols, int8_t precision) {
|
||||||
int32_t dataStrLen = sizeof(SRetrieveTableRsp) + blockGetEncodeSize(pBlock);
|
int32_t dataStrLen = sizeof(SRetrieveTableRsp) + blockGetEncodeSize(pBlock);
|
||||||
void* buf = taosMemoryCalloc(1, dataStrLen);
|
void* buf = taosMemoryCalloc(1, dataStrLen);
|
||||||
if (buf == NULL) return -1;
|
if (buf == NULL) {
|
||||||
|
return TSDB_CODE_OUT_OF_MEMORY;
|
||||||
|
}
|
||||||
|
|
||||||
SRetrieveTableRsp* pRetrieve = (SRetrieveTableRsp*)buf;
|
SRetrieveTableRsp* pRetrieve = (SRetrieveTableRsp*)buf;
|
||||||
pRetrieve->useconds = 0;
|
pRetrieve->useconds = 0;
|
||||||
|
@ -31,7 +33,8 @@ int32_t tqAddBlockDataToRsp(const SSDataBlock* pBlock, SMqDataRsp* pRsp, int32_t
|
||||||
actualLen += sizeof(SRetrieveTableRsp);
|
actualLen += sizeof(SRetrieveTableRsp);
|
||||||
taosArrayPush(pRsp->blockDataLen, &actualLen);
|
taosArrayPush(pRsp->blockDataLen, &actualLen);
|
||||||
taosArrayPush(pRsp->blockData, &buf);
|
taosArrayPush(pRsp->blockData, &buf);
|
||||||
return 0;
|
|
||||||
|
return TSDB_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int32_t tqAddBlockSchemaToRsp(const STqExecHandle* pExec, STaosxRsp* pRsp) {
|
static int32_t tqAddBlockSchemaToRsp(const STqExecHandle* pExec, STaosxRsp* pRsp) {
|
||||||
|
@ -62,69 +65,85 @@ static int32_t tqAddTbNameToRsp(const STQ* pTq, int64_t uid, STaosxRsp* pRsp, in
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t tqScanData(STQ* pTq, const STqHandle* pHandle, SMqDataRsp* pRsp, STqOffsetVal* pOffset) {
|
int32_t tqScanData(STQ* pTq, const STqHandle* pHandle, SMqDataRsp* pRsp, STqOffsetVal* pOffset) {
|
||||||
const STqExecHandle* pExec = &pHandle->execHandle;
|
const int32_t MAX_ROWS_TO_RETURN = 4096;
|
||||||
|
int32_t vgId = TD_VID(pTq->pVnode);
|
||||||
|
int32_t code = 0;
|
||||||
|
int32_t totalRows = 0;
|
||||||
|
|
||||||
qTaskInfo_t task = pExec->task;
|
const STqExecHandle* pExec = &pHandle->execHandle;
|
||||||
|
qTaskInfo_t task = pExec->task;
|
||||||
|
|
||||||
if (qStreamPrepareScan(task, pOffset, pHandle->execHandle.subType) < 0) {
|
if (qStreamPrepareScan(task, pOffset, pHandle->execHandle.subType) < 0) {
|
||||||
tqDebug("prepare scan failed, return");
|
tqDebug("prepare scan failed, vgId:%d, consumer:0x%"PRIx64, vgId, pHandle->consumerId);
|
||||||
if (pOffset->type == TMQ_OFFSET__LOG) {
|
if (pOffset->type == TMQ_OFFSET__LOG) {
|
||||||
pRsp->rspOffset = *pOffset;
|
pRsp->rspOffset = *pOffset;
|
||||||
return 0;
|
return code;
|
||||||
} else {
|
} else {
|
||||||
tqOffsetResetToLog(pOffset, pHandle->snapshotVer);
|
tqOffsetResetToLog(pOffset, pHandle->snapshotVer);
|
||||||
if (qStreamPrepareScan(task, pOffset, pHandle->execHandle.subType) < 0) {
|
if (qStreamPrepareScan(task, pOffset, pHandle->execHandle.subType) < 0) {
|
||||||
tqDebug("prepare scan failed, return");
|
tqDebug("prepare scan failed, vgId:%d, consumer:0x%"PRIx64, vgId, pHandle->consumerId);
|
||||||
pRsp->rspOffset = *pOffset;
|
pRsp->rspOffset = *pOffset;
|
||||||
return 0;
|
return code;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t rowCnt = 0;
|
|
||||||
while (1) {
|
while (1) {
|
||||||
SSDataBlock* pDataBlock = NULL;
|
SSDataBlock* pDataBlock = NULL;
|
||||||
uint64_t ts = 0;
|
uint64_t ts = 0;
|
||||||
|
|
||||||
tqDebug("vgId:%d, tmq task start to execute", pTq->pVnode->config.vgId);
|
tqDebug("vgId:%d, tmq task start to execute, consumer:0x%"PRIx64, vgId, pHandle->consumerId);
|
||||||
if (qExecTask(task, &pDataBlock, &ts) < 0) {
|
|
||||||
tqError("vgId:%d, task exec error since %s", pTq->pVnode->config.vgId, terrstr());
|
code = qExecTask(task, &pDataBlock, &ts);
|
||||||
return -1;
|
if (code != TSDB_CODE_SUCCESS) {
|
||||||
|
tqError("vgId:%d, task exec error since %s, consumer:0x%" PRIx64, vgId, terrstr(),
|
||||||
|
pHandle->consumerId);
|
||||||
|
return code;
|
||||||
}
|
}
|
||||||
|
|
||||||
tqDebug("consumer:0x%"PRIx64" vgId:%d, tmq task executed, get %p", pHandle->consumerId, pTq->pVnode->config.vgId, pDataBlock);
|
// current scan should be stopped ASAP, since the re-balance occurs.
|
||||||
|
|
||||||
// current scan should be stopped asap, since the rebalance occurs.
|
|
||||||
if (pDataBlock == NULL) {
|
if (pDataBlock == NULL) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
tqAddBlockDataToRsp(pDataBlock, pRsp, pExec->numOfCols, pTq->pVnode->config.tsdbCfg.precision);
|
code = tqAddBlockDataToRsp(pDataBlock, pRsp, pExec->numOfCols, pTq->pVnode->config.tsdbCfg.precision);
|
||||||
|
if (code != TSDB_CODE_SUCCESS) {
|
||||||
|
tqError("vgId:%d, failed to add block to rsp msg", vgId);
|
||||||
|
return code;
|
||||||
|
}
|
||||||
|
|
||||||
pRsp->blockNum++;
|
pRsp->blockNum++;
|
||||||
|
|
||||||
|
tqDebug("vgId:%d, consumer:0x%" PRIx64 " tmq task executed, rows:%" PRId64 ", total blocks:%d", vgId, pHandle->consumerId,
|
||||||
|
pDataBlock->info.rows, pRsp->blockNum);
|
||||||
|
|
||||||
if (pOffset->type == TMQ_OFFSET__SNAPSHOT_DATA) {
|
if (pOffset->type == TMQ_OFFSET__SNAPSHOT_DATA) {
|
||||||
rowCnt += pDataBlock->info.rows;
|
totalRows += pDataBlock->info.rows;
|
||||||
if (rowCnt >= 4096) {
|
if (totalRows >= MAX_ROWS_TO_RETURN) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (qStreamExtractOffset(task, &pRsp->rspOffset) < 0) {
|
qStreamExtractOffset(task, &pRsp->rspOffset);
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (pRsp->rspOffset.type == 0) {
|
if (pRsp->rspOffset.type == 0) {
|
||||||
tqError("expected rsp offset: type %d %" PRId64 " %" PRId64 " %" PRId64, pRsp->rspOffset.type, pRsp->rspOffset.ts,
|
code = TSDB_CODE_INVALID_PARA;
|
||||||
pRsp->rspOffset.uid, pRsp->rspOffset.version);
|
tqError("vgId:%d, expected rsp offset: type %d %" PRId64 " %" PRId64 " %" PRId64, vgId, pRsp->rspOffset.type,
|
||||||
return -1;
|
pRsp->rspOffset.ts, pRsp->rspOffset.uid, pRsp->rspOffset.version);
|
||||||
|
return code;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (pRsp->withTbName || pRsp->withSchema) {
|
if (pRsp->withTbName || pRsp->withSchema) {
|
||||||
tqError("get column should not with meta:%d,%d", pRsp->withTbName, pRsp->withSchema);
|
code = TSDB_CODE_INVALID_PARA;
|
||||||
return -1;
|
tqError("vgId:%d, get column should not with meta:%d,%d", vgId, pRsp->withTbName, pRsp->withSchema);
|
||||||
|
return code;
|
||||||
}
|
}
|
||||||
return 0;
|
|
||||||
|
tqDebug("vgId:%d, consumer:0x%" PRIx64 " tmq task executed, total blocks:%d, rows:%d", vgId, pHandle->consumerId,
|
||||||
|
pRsp->blockNum, totalRows);
|
||||||
|
|
||||||
|
return code;
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t tqScanTaosx(STQ* pTq, const STqHandle* pHandle, STaosxRsp* pRsp, SMqMetaRsp* pMetaRsp, STqOffsetVal* pOffset) {
|
int32_t tqScanTaosx(STQ* pTq, const STqHandle* pHandle, STaosxRsp* pRsp, SMqMetaRsp* pMetaRsp, STqOffsetVal* pOffset) {
|
||||||
|
@ -230,23 +249,15 @@ int32_t tqScanTaosx(STQ* pTq, const STqHandle* pHandle, STaosxRsp* pRsp, SMqMeta
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t tqTaosxScanLog(STQ* pTq, STqHandle* pHandle, SPackedData submit, STaosxRsp* pRsp) {
|
int32_t tqTaosxScanLog(STQ* pTq, STqHandle* pHandle, SPackedData submit, STaosxRsp* pRsp, int32_t* totalRows) {
|
||||||
STqExecHandle* pExec = &pHandle->execHandle;
|
STqExecHandle* pExec = &pHandle->execHandle;
|
||||||
/*A(pExec->subType != TOPIC_SUB_TYPE__COLUMN);*/
|
|
||||||
|
|
||||||
SArray* pBlocks = taosArrayInit(0, sizeof(SSDataBlock));
|
SArray* pBlocks = taosArrayInit(0, sizeof(SSDataBlock));
|
||||||
SArray* pSchemas = taosArrayInit(0, sizeof(void*));
|
SArray* pSchemas = taosArrayInit(0, sizeof(void*));
|
||||||
|
|
||||||
if (pExec->subType == TOPIC_SUB_TYPE__TABLE) {
|
if (pExec->subType == TOPIC_SUB_TYPE__TABLE) {
|
||||||
STqReader* pReader = pExec->pExecReader;
|
STqReader* pReader = pExec->pExecReader;
|
||||||
/*tqReaderSetDataMsg(pReader, pReq, 0);*/
|
|
||||||
tqReaderSetSubmitReq2(pReader, submit.msgStr, submit.msgLen, submit.ver);
|
tqReaderSetSubmitReq2(pReader, submit.msgStr, submit.msgLen, submit.ver);
|
||||||
while (tqNextDataBlock2(pReader)) {
|
while (tqNextDataBlock2(pReader)) {
|
||||||
/*SSDataBlock block = {0};*/
|
|
||||||
/*if (tqRetrieveDataBlock(&block, pReader) < 0) {*/
|
|
||||||
/*if (terrno == TSDB_CODE_TQ_TABLE_SCHEMA_NOT_FOUND) continue;*/
|
|
||||||
/*}*/
|
|
||||||
|
|
||||||
taosArrayClear(pBlocks);
|
taosArrayClear(pBlocks);
|
||||||
taosArrayClear(pSchemas);
|
taosArrayClear(pSchemas);
|
||||||
SSubmitTbData* pSubmitTbDataRet = NULL;
|
SSubmitTbData* pSubmitTbDataRet = NULL;
|
||||||
|
@ -254,7 +265,6 @@ int32_t tqTaosxScanLog(STQ* pTq, STqHandle* pHandle, SPackedData submit, STaosxR
|
||||||
if (terrno == TSDB_CODE_TQ_TABLE_SCHEMA_NOT_FOUND) continue;
|
if (terrno == TSDB_CODE_TQ_TABLE_SCHEMA_NOT_FOUND) continue;
|
||||||
}
|
}
|
||||||
if (pRsp->withTbName) {
|
if (pRsp->withTbName) {
|
||||||
/*int64_t uid = pExec->pExecReader->msgIter.uid;*/
|
|
||||||
int64_t uid = pExec->pExecReader->lastBlkUid;
|
int64_t uid = pExec->pExecReader->lastBlkUid;
|
||||||
if (tqAddTbNameToRsp(pTq, uid, pRsp, taosArrayGetSize(pBlocks)) < 0) {
|
if (tqAddTbNameToRsp(pTq, uid, pRsp, taosArrayGetSize(pBlocks)) < 0) {
|
||||||
taosArrayDestroyEx(pBlocks, (FDelete)blockDataFreeRes);
|
taosArrayDestroyEx(pBlocks, (FDelete)blockDataFreeRes);
|
||||||
|
@ -296,6 +306,7 @@ int32_t tqTaosxScanLog(STQ* pTq, STqHandle* pHandle, SPackedData submit, STaosxR
|
||||||
SSDataBlock* pBlock = taosArrayGet(pBlocks, i);
|
SSDataBlock* pBlock = taosArrayGet(pBlocks, i);
|
||||||
tqAddBlockDataToRsp(pBlock, (SMqDataRsp*)pRsp, taosArrayGetSize(pBlock->pDataBlock),
|
tqAddBlockDataToRsp(pBlock, (SMqDataRsp*)pRsp, taosArrayGetSize(pBlock->pDataBlock),
|
||||||
pTq->pVnode->config.tsdbCfg.precision);
|
pTq->pVnode->config.tsdbCfg.precision);
|
||||||
|
totalRows += pBlock->info.rows;
|
||||||
blockDataFreeRes(pBlock);
|
blockDataFreeRes(pBlock);
|
||||||
SSchemaWrapper* pSW = taosArrayGetP(pSchemas, i);
|
SSchemaWrapper* pSW = taosArrayGetP(pSchemas, i);
|
||||||
taosArrayPush(pRsp->blockSchema, &pSW);
|
taosArrayPush(pRsp->blockSchema, &pSW);
|
||||||
|
@ -304,13 +315,8 @@ int32_t tqTaosxScanLog(STQ* pTq, STqHandle* pHandle, SPackedData submit, STaosxR
|
||||||
}
|
}
|
||||||
} else if (pExec->subType == TOPIC_SUB_TYPE__DB) {
|
} else if (pExec->subType == TOPIC_SUB_TYPE__DB) {
|
||||||
STqReader* pReader = pExec->pExecReader;
|
STqReader* pReader = pExec->pExecReader;
|
||||||
/*tqReaderSetDataMsg(pReader, pReq, 0);*/
|
|
||||||
tqReaderSetSubmitReq2(pReader, submit.msgStr, submit.msgLen, submit.ver);
|
tqReaderSetSubmitReq2(pReader, submit.msgStr, submit.msgLen, submit.ver);
|
||||||
while (tqNextDataBlockFilterOut2(pReader, pExec->execDb.pFilterOutTbUid)) {
|
while (tqNextDataBlockFilterOut2(pReader, pExec->execDb.pFilterOutTbUid)) {
|
||||||
/*SSDataBlock block = {0};*/
|
|
||||||
/*if (tqRetrieveDataBlock(&block, pReader) < 0) {*/
|
|
||||||
/*if (terrno == TSDB_CODE_TQ_TABLE_SCHEMA_NOT_FOUND) continue;*/
|
|
||||||
/*}*/
|
|
||||||
taosArrayClear(pBlocks);
|
taosArrayClear(pBlocks);
|
||||||
taosArrayClear(pSchemas);
|
taosArrayClear(pSchemas);
|
||||||
SSubmitTbData* pSubmitTbDataRet = NULL;
|
SSubmitTbData* pSubmitTbDataRet = NULL;
|
||||||
|
@ -355,15 +361,11 @@ int32_t tqTaosxScanLog(STQ* pTq, STqHandle* pHandle, SPackedData submit, STaosxR
|
||||||
|
|
||||||
tEncoderClear(&encoder);
|
tEncoderClear(&encoder);
|
||||||
}
|
}
|
||||||
/*tqAddBlockDataToRsp(&block, (SMqDataRsp*)pRsp, taosArrayGetSize(block.pDataBlock),*/
|
|
||||||
/*pTq->pVnode->config.tsdbCfg.precision);*/
|
|
||||||
/*blockDataFreeRes(&block);*/
|
|
||||||
/*tqAddBlockSchemaToRsp(pExec, (SMqDataRsp*)pRsp);*/
|
|
||||||
/*pRsp->blockNum++;*/
|
|
||||||
for (int32_t i = 0; i < taosArrayGetSize(pBlocks); i++) {
|
for (int32_t i = 0; i < taosArrayGetSize(pBlocks); i++) {
|
||||||
SSDataBlock* pBlock = taosArrayGet(pBlocks, i);
|
SSDataBlock* pBlock = taosArrayGet(pBlocks, i);
|
||||||
tqAddBlockDataToRsp(pBlock, (SMqDataRsp*)pRsp, taosArrayGetSize(pBlock->pDataBlock),
|
tqAddBlockDataToRsp(pBlock, (SMqDataRsp*)pRsp, taosArrayGetSize(pBlock->pDataBlock),
|
||||||
pTq->pVnode->config.tsdbCfg.precision);
|
pTq->pVnode->config.tsdbCfg.precision);
|
||||||
|
*totalRows += pBlock->info.rows;
|
||||||
blockDataFreeRes(pBlock);
|
blockDataFreeRes(pBlock);
|
||||||
SSchemaWrapper* pSW = taosArrayGetP(pSchemas, i);
|
SSchemaWrapper* pSW = taosArrayGetP(pSchemas, i);
|
||||||
taosArrayPush(pRsp->blockSchema, &pSW);
|
taosArrayPush(pRsp->blockSchema, &pSW);
|
||||||
|
@ -373,9 +375,5 @@ int32_t tqTaosxScanLog(STQ* pTq, STqHandle* pHandle, SPackedData submit, STaosxR
|
||||||
}
|
}
|
||||||
taosArrayDestroy(pBlocks);
|
taosArrayDestroy(pBlocks);
|
||||||
taosArrayDestroy(pSchemas);
|
taosArrayDestroy(pSchemas);
|
||||||
// if (pRsp->blockNum == 0) {
|
|
||||||
// return -1;
|
|
||||||
// }
|
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
|
@ -282,6 +282,40 @@ bool tsdbTbDataIterNext(STbDataIter *pIter) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int64_t tsdbCountTbDataRows(STbData *pTbData) {
|
||||||
|
SMemSkipListNode *pNode = pTbData->sl.pHead;
|
||||||
|
int64_t rowsNum = 0;
|
||||||
|
|
||||||
|
while (NULL != pNode) {
|
||||||
|
pNode = SL_GET_NODE_FORWARD(pNode, 0);
|
||||||
|
if (pNode == pTbData->sl.pTail) {
|
||||||
|
return rowsNum;
|
||||||
|
}
|
||||||
|
|
||||||
|
rowsNum++;
|
||||||
|
}
|
||||||
|
|
||||||
|
return rowsNum;
|
||||||
|
}
|
||||||
|
|
||||||
|
void tsdbMemTableCountRows(SMemTable *pMemTable, SHashObj* pTableMap, int64_t *rowsNum) {
|
||||||
|
taosRLockLatch(&pMemTable->latch);
|
||||||
|
for (int32_t i = 0; i < pMemTable->nBucket; ++i) {
|
||||||
|
STbData *pTbData = pMemTable->aBucket[i];
|
||||||
|
while (pTbData) {
|
||||||
|
void* p = taosHashGet(pTableMap, &pTbData->uid, sizeof(pTbData->uid));
|
||||||
|
if (p == NULL) {
|
||||||
|
pTbData = pTbData->next;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
*rowsNum += tsdbCountTbDataRows(pTbData);
|
||||||
|
pTbData = pTbData->next;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
taosRUnLockLatch(&pMemTable->latch);
|
||||||
|
}
|
||||||
|
|
||||||
static int32_t tsdbMemTableRehash(SMemTable *pMemTable) {
|
static int32_t tsdbMemTableRehash(SMemTable *pMemTable) {
|
||||||
int32_t code = 0;
|
int32_t code = 0;
|
||||||
|
|
||||||
|
@ -787,4 +821,4 @@ SArray *tsdbMemTableGetTbDataArray(SMemTable *pMemTable) {
|
||||||
|
|
||||||
_exit:
|
_exit:
|
||||||
return aTbDataP;
|
return aTbDataP;
|
||||||
}
|
}
|
||||||
|
|
|
@ -15,6 +15,7 @@
|
||||||
|
|
||||||
#include "osDef.h"
|
#include "osDef.h"
|
||||||
#include "tsdb.h"
|
#include "tsdb.h"
|
||||||
|
#include "tsimplehash.h"
|
||||||
|
|
||||||
#define ASCENDING_TRAVERSE(o) (o == TSDB_ORDER_ASC)
|
#define ASCENDING_TRAVERSE(o) (o == TSDB_ORDER_ASC)
|
||||||
|
|
||||||
|
@ -24,6 +25,11 @@ typedef enum {
|
||||||
EXTERNAL_ROWS_NEXT = 0x3,
|
EXTERNAL_ROWS_NEXT = 0x3,
|
||||||
} EContentData;
|
} EContentData;
|
||||||
|
|
||||||
|
typedef enum {
|
||||||
|
READ_MODE_COUNT_ONLY = 0x1,
|
||||||
|
READ_MODE_ALL,
|
||||||
|
} EReadMode;
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
STbDataIter* iter;
|
STbDataIter* iter;
|
||||||
int32_t index;
|
int32_t index;
|
||||||
|
@ -167,6 +173,8 @@ struct STsdbReader {
|
||||||
uint64_t suid;
|
uint64_t suid;
|
||||||
int16_t order;
|
int16_t order;
|
||||||
bool freeBlock;
|
bool freeBlock;
|
||||||
|
EReadMode readMode;
|
||||||
|
uint64_t rowsNum;
|
||||||
STimeWindow window; // the primary query time window that applies to all queries
|
STimeWindow window; // the primary query time window that applies to all queries
|
||||||
SSDataBlock* pResBlock;
|
SSDataBlock* pResBlock;
|
||||||
int32_t capacity;
|
int32_t capacity;
|
||||||
|
@ -176,14 +184,15 @@ struct STsdbReader {
|
||||||
SBlockLoadSuppInfo suppInfo;
|
SBlockLoadSuppInfo suppInfo;
|
||||||
STsdbReadSnap* pReadSnap;
|
STsdbReadSnap* pReadSnap;
|
||||||
SIOCostSummary cost;
|
SIOCostSummary cost;
|
||||||
STSchema* pSchema; // the newest version schema
|
STSchema* pSchema; // the newest version schema
|
||||||
STSchema* pMemSchema; // the previous schema for in-memory data, to avoid load schema too many times
|
// STSchema* pMemSchema; // the previous schema for in-memory data, to avoid load schema too many times
|
||||||
SDataFReader* pFileReader; // the file reader
|
SSHashObj* pSchemaMap; // keep the retrieved schema info, to avoid the overhead by repeatly load schema
|
||||||
SDelFReader* pDelFReader; // the del file reader
|
SDataFReader* pFileReader; // the file reader
|
||||||
SArray* pDelIdx; // del file block index;
|
SDelFReader* pDelFReader; // the del file reader
|
||||||
SBlockInfoBuf blockInfoBuf;
|
SArray* pDelIdx; // del file block index;
|
||||||
int32_t step;
|
SBlockInfoBuf blockInfoBuf;
|
||||||
STsdbReader* innerReader[2];
|
int32_t step;
|
||||||
|
STsdbReader* innerReader[2];
|
||||||
};
|
};
|
||||||
|
|
||||||
static SFileDataBlockInfo* getCurrentBlockInfo(SDataBlockIter* pBlockIter);
|
static SFileDataBlockInfo* getCurrentBlockInfo(SDataBlockIter* pBlockIter);
|
||||||
|
@ -949,14 +958,17 @@ static void setBlockAllDumped(SFileBlockDumpInfo* pDumpInfo, int64_t maxKey, int
|
||||||
pDumpInfo->lastKey = maxKey + step;
|
pDumpInfo->lastKey = maxKey + step;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void doCopyColVal(SColumnInfoData* pColInfoData, int32_t rowIndex, int32_t colIndex, SColVal* pColVal,
|
static int32_t doCopyColVal(SColumnInfoData* pColInfoData, int32_t rowIndex, int32_t colIndex, SColVal* pColVal,
|
||||||
SBlockLoadSuppInfo* pSup) {
|
SBlockLoadSuppInfo* pSup) {
|
||||||
if (IS_VAR_DATA_TYPE(pColVal->type)) {
|
if (IS_VAR_DATA_TYPE(pColVal->type)) {
|
||||||
if (!COL_VAL_IS_VALUE(pColVal)) {
|
if (!COL_VAL_IS_VALUE(pColVal)) {
|
||||||
colDataSetNULL(pColInfoData, rowIndex);
|
colDataSetNULL(pColInfoData, rowIndex);
|
||||||
} else {
|
} else {
|
||||||
varDataSetLen(pSup->buildBuf[colIndex], pColVal->value.nData);
|
varDataSetLen(pSup->buildBuf[colIndex], pColVal->value.nData);
|
||||||
ASSERT(pColVal->value.nData <= pColInfoData->info.bytes);
|
if (pColVal->value.nData > pColInfoData->info.bytes) {
|
||||||
|
tsdbWarn("column cid:%d actual data len %d is bigger than schema len %d", pColVal->cid, pColVal->value.nData, pColInfoData->info.bytes);
|
||||||
|
return TSDB_CODE_TDB_INVALID_TABLE_SCHEMA_VER;
|
||||||
|
}
|
||||||
if (pColVal->value.nData > 0) { // pData may be null, if nData is 0
|
if (pColVal->value.nData > 0) { // pData may be null, if nData is 0
|
||||||
memcpy(varDataVal(pSup->buildBuf[colIndex]), pColVal->value.pData, pColVal->value.nData);
|
memcpy(varDataVal(pSup->buildBuf[colIndex]), pColVal->value.pData, pColVal->value.nData);
|
||||||
}
|
}
|
||||||
|
@ -966,6 +978,8 @@ static void doCopyColVal(SColumnInfoData* pColInfoData, int32_t rowIndex, int32_
|
||||||
} else {
|
} else {
|
||||||
colDataSetVal(pColInfoData, rowIndex, (const char*)&pColVal->value, !COL_VAL_IS_VALUE(pColVal));
|
colDataSetVal(pColInfoData, rowIndex, (const char*)&pColVal->value, !COL_VAL_IS_VALUE(pColVal));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return TSDB_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
static SFileDataBlockInfo* getCurrentBlockInfo(SDataBlockIter* pBlockIter) {
|
static SFileDataBlockInfo* getCurrentBlockInfo(SDataBlockIter* pBlockIter) {
|
||||||
|
@ -1167,6 +1181,7 @@ static int32_t copyBlockDataToSDataBlock(STsdbReader* pReader) {
|
||||||
SDataBlk* pBlock = getCurrentBlock(pBlockIter);
|
SDataBlk* pBlock = getCurrentBlock(pBlockIter);
|
||||||
SSDataBlock* pResBlock = pReader->pResBlock;
|
SSDataBlock* pResBlock = pReader->pResBlock;
|
||||||
int32_t numOfOutputCols = pSupInfo->numOfCols;
|
int32_t numOfOutputCols = pSupInfo->numOfCols;
|
||||||
|
int32_t code = TSDB_CODE_SUCCESS;
|
||||||
|
|
||||||
SColVal cv = {0};
|
SColVal cv = {0};
|
||||||
int64_t st = taosGetTimestampUs();
|
int64_t st = taosGetTimestampUs();
|
||||||
|
@ -1244,7 +1259,10 @@ static int32_t copyBlockDataToSDataBlock(STsdbReader* pReader) {
|
||||||
} else { // varchar/nchar type
|
} else { // varchar/nchar type
|
||||||
for (int32_t j = pDumpInfo->rowIndex; rowIndex < dumpedRows; j += step) {
|
for (int32_t j = pDumpInfo->rowIndex; rowIndex < dumpedRows; j += step) {
|
||||||
tColDataGetValue(pData, j, &cv);
|
tColDataGetValue(pData, j, &cv);
|
||||||
doCopyColVal(pColData, rowIndex++, i, &cv, pSupInfo);
|
code = doCopyColVal(pColData, rowIndex++, i, &cv, pSupInfo);
|
||||||
|
if (code) {
|
||||||
|
return code;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1766,7 +1784,7 @@ static int32_t buildDataBlockFromBuf(STsdbReader* pReader, STableBlockScanInfo*
|
||||||
setComposedBlockFlag(pReader, true);
|
setComposedBlockFlag(pReader, true);
|
||||||
|
|
||||||
double elapsedTime = (taosGetTimestampUs() - st) / 1000.0;
|
double elapsedTime = (taosGetTimestampUs() - st) / 1000.0;
|
||||||
tsdbDebug("%p build data block from cache completed, elapsed time:%.2f ms, numOfRows:%d, brange:%" PRId64
|
tsdbDebug("%p build data block from cache completed, elapsed time:%.2f ms, numOfRows:%" PRId64 ", brange:%" PRId64
|
||||||
" - %" PRId64 ", uid:%" PRIu64 ", %s",
|
" - %" PRId64 ", uid:%" PRIu64 ", %s",
|
||||||
pReader, elapsedTime, pBlock->info.rows, pBlock->info.window.skey, pBlock->info.window.ekey,
|
pReader, elapsedTime, pBlock->info.rows, pBlock->info.window.skey, pBlock->info.window.ekey,
|
||||||
pBlockScanInfo->uid, pReader->idStr);
|
pBlockScanInfo->uid, pReader->idStr);
|
||||||
|
@ -1776,23 +1794,29 @@ static int32_t buildDataBlockFromBuf(STsdbReader* pReader, STableBlockScanInfo*
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool tryCopyDistinctRowFromFileBlock(STsdbReader* pReader, SBlockData* pBlockData, int64_t key,
|
static bool tryCopyDistinctRowFromFileBlock(STsdbReader* pReader, SBlockData* pBlockData, int64_t key,
|
||||||
SFileBlockDumpInfo* pDumpInfo) {
|
SFileBlockDumpInfo* pDumpInfo, bool *copied) {
|
||||||
// opt version
|
// opt version
|
||||||
// 1. it is not a border point
|
// 1. it is not a border point
|
||||||
// 2. the direct next point is not an duplicated timestamp
|
// 2. the direct next point is not an duplicated timestamp
|
||||||
|
int32_t code = TSDB_CODE_SUCCESS;
|
||||||
|
|
||||||
|
*copied = false;
|
||||||
bool asc = (pReader->order == TSDB_ORDER_ASC);
|
bool asc = (pReader->order == TSDB_ORDER_ASC);
|
||||||
if ((pDumpInfo->rowIndex < pDumpInfo->totalRows - 1 && asc) || (pDumpInfo->rowIndex > 0 && (!asc))) {
|
if ((pDumpInfo->rowIndex < pDumpInfo->totalRows - 1 && asc) || (pDumpInfo->rowIndex > 0 && (!asc))) {
|
||||||
int32_t step = pReader->order == TSDB_ORDER_ASC ? 1 : -1;
|
int32_t step = pReader->order == TSDB_ORDER_ASC ? 1 : -1;
|
||||||
|
|
||||||
int64_t nextKey = pBlockData->aTSKEY[pDumpInfo->rowIndex + step];
|
int64_t nextKey = pBlockData->aTSKEY[pDumpInfo->rowIndex + step];
|
||||||
if (nextKey != key) { // merge is not needed
|
if (nextKey != key) { // merge is not needed
|
||||||
doAppendRowFromFileBlock(pReader->pResBlock, pReader, pBlockData, pDumpInfo->rowIndex);
|
code = doAppendRowFromFileBlock(pReader->pResBlock, pReader, pBlockData, pDumpInfo->rowIndex);
|
||||||
|
if (code) {
|
||||||
|
return code;
|
||||||
|
}
|
||||||
pDumpInfo->rowIndex += step;
|
pDumpInfo->rowIndex += step;
|
||||||
return true;
|
*copied = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return false;
|
return code;
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool nextRowFromLastBlocks(SLastBlockReader* pLastBlockReader, STableBlockScanInfo* pScanInfo,
|
static bool nextRowFromLastBlocks(SLastBlockReader* pLastBlockReader, STableBlockScanInfo* pScanInfo,
|
||||||
|
@ -1819,20 +1843,34 @@ static bool nextRowFromLastBlocks(SLastBlockReader* pLastBlockReader, STableBloc
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool tryCopyDistinctRowFromSttBlock(TSDBROW* fRow, SLastBlockReader* pLastBlockReader,
|
static bool tryCopyDistinctRowFromSttBlock(TSDBROW* fRow, SLastBlockReader* pLastBlockReader,
|
||||||
STableBlockScanInfo* pScanInfo, int64_t ts, STsdbReader* pReader) {
|
STableBlockScanInfo* pScanInfo, int64_t ts, STsdbReader* pReader, bool *copied) {
|
||||||
|
int32_t code = TSDB_CODE_SUCCESS;
|
||||||
|
|
||||||
|
*copied = false;
|
||||||
|
|
||||||
bool hasVal = nextRowFromLastBlocks(pLastBlockReader, pScanInfo, &pReader->verRange);
|
bool hasVal = nextRowFromLastBlocks(pLastBlockReader, pScanInfo, &pReader->verRange);
|
||||||
if (hasVal) {
|
if (hasVal) {
|
||||||
int64_t next1 = getCurrentKeyInLastBlock(pLastBlockReader);
|
int64_t next1 = getCurrentKeyInLastBlock(pLastBlockReader);
|
||||||
if (next1 != ts) {
|
if (next1 != ts) {
|
||||||
doAppendRowFromFileBlock(pReader->pResBlock, pReader, fRow->pBlockData, fRow->iRow);
|
code = doAppendRowFromFileBlock(pReader->pResBlock, pReader, fRow->pBlockData, fRow->iRow);
|
||||||
return true;
|
if (code) {
|
||||||
|
return code;
|
||||||
|
}
|
||||||
|
|
||||||
|
*copied = true;
|
||||||
|
return code;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
doAppendRowFromFileBlock(pReader->pResBlock, pReader, fRow->pBlockData, fRow->iRow);
|
code = doAppendRowFromFileBlock(pReader->pResBlock, pReader, fRow->pBlockData, fRow->iRow);
|
||||||
return true;
|
if (code) {
|
||||||
|
return code;
|
||||||
|
}
|
||||||
|
|
||||||
|
*copied = true;
|
||||||
|
return code;
|
||||||
}
|
}
|
||||||
|
|
||||||
return false;
|
return code;
|
||||||
}
|
}
|
||||||
|
|
||||||
static FORCE_INLINE STSchema* getLatestTableSchema(STsdbReader* pReader, uint64_t uid) {
|
static FORCE_INLINE STSchema* getLatestTableSchema(STsdbReader* pReader, uint64_t uid) {
|
||||||
|
@ -1858,28 +1896,23 @@ static FORCE_INLINE STSchema* doGetSchemaForTSRow(int32_t sversion, STsdbReader*
|
||||||
return pReader->pSchema;
|
return pReader->pSchema;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (pReader->pMemSchema == NULL) {
|
void** p = tSimpleHashGet(pReader->pSchemaMap, &sversion, sizeof(sversion));
|
||||||
int32_t code =
|
if (p != NULL) {
|
||||||
metaGetTbTSchemaEx(pReader->pTsdb->pVnode->pMeta, pReader->suid, uid, sversion, &pReader->pMemSchema);
|
return *(STSchema**)p;
|
||||||
if (code != TSDB_CODE_SUCCESS) {
|
|
||||||
terrno = code;
|
|
||||||
return NULL;
|
|
||||||
} else {
|
|
||||||
return pReader->pMemSchema;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (pReader->pMemSchema->version == sversion) {
|
STSchema* ptr = NULL;
|
||||||
return pReader->pMemSchema;
|
int32_t code = metaGetTbTSchemaEx(pReader->pTsdb->pVnode->pMeta, pReader->suid, uid, sversion, &ptr);
|
||||||
}
|
if (code != TSDB_CODE_SUCCESS) {
|
||||||
|
|
||||||
taosMemoryFreeClear(pReader->pMemSchema);
|
|
||||||
int32_t code = metaGetTbTSchemaEx(pReader->pTsdb->pVnode->pMeta, pReader->suid, uid, sversion, &pReader->pMemSchema);
|
|
||||||
if (code != TSDB_CODE_SUCCESS || pReader->pMemSchema == NULL) {
|
|
||||||
terrno = code;
|
terrno = code;
|
||||||
return NULL;
|
return NULL;
|
||||||
} else {
|
} else {
|
||||||
return pReader->pMemSchema;
|
code = tSimpleHashPut(pReader->pSchemaMap, &sversion, sizeof(sversion), &ptr, POINTER_BYTES);
|
||||||
|
if (code != TSDB_CODE_SUCCESS) {
|
||||||
|
terrno = code;
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
return ptr;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2022,11 +2055,12 @@ static int32_t doMergeBufAndFileRows(STsdbReader* pReader, STableBlockScanInfo*
|
||||||
return code;
|
return code;
|
||||||
}
|
}
|
||||||
|
|
||||||
doAppendRowFromTSRow(pReader->pResBlock, pReader, pTSRow, pBlockScanInfo);
|
code = doAppendRowFromTSRow(pReader->pResBlock, pReader, pTSRow, pBlockScanInfo);
|
||||||
|
|
||||||
taosMemoryFree(pTSRow);
|
taosMemoryFree(pTSRow);
|
||||||
tsdbRowMergerClear(&merge);
|
tsdbRowMergerClear(&merge);
|
||||||
return TSDB_CODE_SUCCESS;
|
|
||||||
|
return code;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int32_t doMergeFileBlockAndLastBlock(SLastBlockReader* pLastBlockReader, STsdbReader* pReader,
|
static int32_t doMergeFileBlockAndLastBlock(SLastBlockReader* pLastBlockReader, STsdbReader* pReader,
|
||||||
|
@ -2034,7 +2068,8 @@ static int32_t doMergeFileBlockAndLastBlock(SLastBlockReader* pLastBlockReader,
|
||||||
bool mergeBlockData) {
|
bool mergeBlockData) {
|
||||||
SFileBlockDumpInfo* pDumpInfo = &pReader->status.fBlockDumpInfo;
|
SFileBlockDumpInfo* pDumpInfo = &pReader->status.fBlockDumpInfo;
|
||||||
int64_t tsLastBlock = getCurrentKeyInLastBlock(pLastBlockReader);
|
int64_t tsLastBlock = getCurrentKeyInLastBlock(pLastBlockReader);
|
||||||
|
bool copied = false;
|
||||||
|
int32_t code = TSDB_CODE_SUCCESS;
|
||||||
SRow* pTSRow = NULL;
|
SRow* pTSRow = NULL;
|
||||||
SRowMerger merge = {0};
|
SRowMerger merge = {0};
|
||||||
TSDBROW fRow = tMergeTreeGetRow(&pLastBlockReader->mergeTree);
|
TSDBROW fRow = tMergeTreeGetRow(&pLastBlockReader->mergeTree);
|
||||||
|
@ -2042,7 +2077,12 @@ static int32_t doMergeFileBlockAndLastBlock(SLastBlockReader* pLastBlockReader,
|
||||||
|
|
||||||
// only last block exists
|
// only last block exists
|
||||||
if ((!mergeBlockData) || (tsLastBlock != pBlockData->aTSKEY[pDumpInfo->rowIndex])) {
|
if ((!mergeBlockData) || (tsLastBlock != pBlockData->aTSKEY[pDumpInfo->rowIndex])) {
|
||||||
if (tryCopyDistinctRowFromSttBlock(&fRow, pLastBlockReader, pBlockScanInfo, tsLastBlock, pReader)) {
|
code = tryCopyDistinctRowFromSttBlock(&fRow, pLastBlockReader, pBlockScanInfo, tsLastBlock, pReader, &copied);
|
||||||
|
if (code) {
|
||||||
|
return code;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (copied) {
|
||||||
pBlockScanInfo->lastKey = tsLastBlock;
|
pBlockScanInfo->lastKey = tsLastBlock;
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
} else {
|
} else {
|
||||||
|
@ -2060,10 +2100,15 @@ static int32_t doMergeFileBlockAndLastBlock(SLastBlockReader* pLastBlockReader,
|
||||||
return code;
|
return code;
|
||||||
}
|
}
|
||||||
|
|
||||||
doAppendRowFromTSRow(pReader->pResBlock, pReader, pTSRow, pBlockScanInfo);
|
code = doAppendRowFromTSRow(pReader->pResBlock, pReader, pTSRow, pBlockScanInfo);
|
||||||
|
|
||||||
taosMemoryFree(pTSRow);
|
taosMemoryFree(pTSRow);
|
||||||
tsdbRowMergerClear(&merge);
|
tsdbRowMergerClear(&merge);
|
||||||
|
|
||||||
|
if (code != TSDB_CODE_SUCCESS) {
|
||||||
|
return code;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
} else { // not merge block data
|
} else { // not merge block data
|
||||||
int32_t code = tsdbRowMergerInit(&merge, &fRow, pReader->pSchema);
|
int32_t code = tsdbRowMergerInit(&merge, &fRow, pReader->pSchema);
|
||||||
|
@ -2083,10 +2128,14 @@ static int32_t doMergeFileBlockAndLastBlock(SLastBlockReader* pLastBlockReader,
|
||||||
return code;
|
return code;
|
||||||
}
|
}
|
||||||
|
|
||||||
doAppendRowFromTSRow(pReader->pResBlock, pReader, pTSRow, pBlockScanInfo);
|
code = doAppendRowFromTSRow(pReader->pResBlock, pReader, pTSRow, pBlockScanInfo);
|
||||||
|
|
||||||
taosMemoryFree(pTSRow);
|
taosMemoryFree(pTSRow);
|
||||||
tsdbRowMergerClear(&merge);
|
tsdbRowMergerClear(&merge);
|
||||||
|
|
||||||
|
if (code != TSDB_CODE_SUCCESS) {
|
||||||
|
return code;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
|
@ -2131,7 +2180,7 @@ static int32_t mergeFileBlockAndLastBlock(STsdbReader* pReader, SLastBlockReader
|
||||||
return code;
|
return code;
|
||||||
}
|
}
|
||||||
|
|
||||||
doAppendRowFromTSRow(pReader->pResBlock, pReader, pTSRow, pBlockScanInfo);
|
code = doAppendRowFromTSRow(pReader->pResBlock, pReader, pTSRow, pBlockScanInfo);
|
||||||
|
|
||||||
taosMemoryFree(pTSRow);
|
taosMemoryFree(pTSRow);
|
||||||
tsdbRowMergerClear(&merge);
|
tsdbRowMergerClear(&merge);
|
||||||
|
@ -2353,7 +2402,7 @@ static int32_t doMergeMultiLevelRows(STsdbReader* pReader, STableBlockScanInfo*
|
||||||
return code;
|
return code;
|
||||||
}
|
}
|
||||||
|
|
||||||
doAppendRowFromTSRow(pReader->pResBlock, pReader, pTSRow, pBlockScanInfo);
|
code = doAppendRowFromTSRow(pReader->pResBlock, pReader, pTSRow, pBlockScanInfo);
|
||||||
|
|
||||||
taosMemoryFree(pTSRow);
|
taosMemoryFree(pTSRow);
|
||||||
tsdbRowMergerClear(&merge);
|
tsdbRowMergerClear(&merge);
|
||||||
|
@ -2508,7 +2557,13 @@ bool hasDataInFileBlock(const SBlockData* pBlockData, const SFileBlockDumpInfo*
|
||||||
int32_t mergeRowsInFileBlocks(SBlockData* pBlockData, STableBlockScanInfo* pBlockScanInfo, int64_t key,
|
int32_t mergeRowsInFileBlocks(SBlockData* pBlockData, STableBlockScanInfo* pBlockScanInfo, int64_t key,
|
||||||
STsdbReader* pReader) {
|
STsdbReader* pReader) {
|
||||||
SFileBlockDumpInfo* pDumpInfo = &pReader->status.fBlockDumpInfo;
|
SFileBlockDumpInfo* pDumpInfo = &pReader->status.fBlockDumpInfo;
|
||||||
if (tryCopyDistinctRowFromFileBlock(pReader, pBlockData, key, pDumpInfo)) {
|
bool copied = false;
|
||||||
|
int32_t code = tryCopyDistinctRowFromFileBlock(pReader, pBlockData, key, pDumpInfo, &copied);
|
||||||
|
if (code) {
|
||||||
|
return code;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (copied) {
|
||||||
pBlockScanInfo->lastKey = key;
|
pBlockScanInfo->lastKey = key;
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
} else {
|
} else {
|
||||||
|
@ -2528,11 +2583,11 @@ int32_t mergeRowsInFileBlocks(SBlockData* pBlockData, STableBlockScanInfo* pBloc
|
||||||
return code;
|
return code;
|
||||||
}
|
}
|
||||||
|
|
||||||
doAppendRowFromTSRow(pReader->pResBlock, pReader, pTSRow, pBlockScanInfo);
|
code = doAppendRowFromTSRow(pReader->pResBlock, pReader, pTSRow, pBlockScanInfo);
|
||||||
|
|
||||||
taosMemoryFree(pTSRow);
|
taosMemoryFree(pTSRow);
|
||||||
tsdbRowMergerClear(&merge);
|
tsdbRowMergerClear(&merge);
|
||||||
return TSDB_CODE_SUCCESS;
|
return code;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2649,7 +2704,10 @@ static int32_t buildComposedDataBlock(STsdbReader* pReader) {
|
||||||
if (isCleanFileDataBlock(pReader, pBlockInfo, pBlock, pBlockScanInfo, keyInBuf, pLastBlockReader) &&
|
if (isCleanFileDataBlock(pReader, pBlockInfo, pBlock, pBlockScanInfo, keyInBuf, pLastBlockReader) &&
|
||||||
pBlock->nRow <= pReader->capacity) {
|
pBlock->nRow <= pReader->capacity) {
|
||||||
if (asc || ((!asc) && (!hasDataInLastBlock(pLastBlockReader)))) {
|
if (asc || ((!asc) && (!hasDataInLastBlock(pLastBlockReader)))) {
|
||||||
copyBlockDataToSDataBlock(pReader);
|
code = copyBlockDataToSDataBlock(pReader);
|
||||||
|
if (code) {
|
||||||
|
goto _end;
|
||||||
|
}
|
||||||
|
|
||||||
// record the last key value
|
// record the last key value
|
||||||
pBlockScanInfo->lastKey = asc ? pBlock->maxKey.ts : pBlock->minKey.ts;
|
pBlockScanInfo->lastKey = asc ? pBlock->maxKey.ts : pBlock->minKey.ts;
|
||||||
|
@ -2696,8 +2754,11 @@ static int32_t buildComposedDataBlock(STsdbReader* pReader) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
buildComposedDataBlockImpl(pReader, pBlockScanInfo, pBlockData, pLastBlockReader);
|
code = buildComposedDataBlockImpl(pReader, pBlockScanInfo, pBlockData, pLastBlockReader);
|
||||||
|
if (code) {
|
||||||
|
goto _end;
|
||||||
|
}
|
||||||
|
|
||||||
// currently loaded file data block is consumed
|
// currently loaded file data block is consumed
|
||||||
if ((pBlockData->nRow > 0) && (pDumpInfo->rowIndex >= pBlockData->nRow || pDumpInfo->rowIndex < 0)) {
|
if ((pBlockData->nRow > 0) && (pDumpInfo->rowIndex >= pBlockData->nRow || pDumpInfo->rowIndex < 0)) {
|
||||||
SDataBlk* pBlock = getCurrentBlock(&pReader->status.blockIter);
|
SDataBlk* pBlock = getCurrentBlock(&pReader->status.blockIter);
|
||||||
|
@ -2716,7 +2777,7 @@ _end:
|
||||||
|
|
||||||
if (pResBlock->info.rows > 0) {
|
if (pResBlock->info.rows > 0) {
|
||||||
tsdbDebug("%p uid:%" PRIu64 ", composed data block created, brange:%" PRIu64 "-%" PRIu64
|
tsdbDebug("%p uid:%" PRIu64 ", composed data block created, brange:%" PRIu64 "-%" PRIu64
|
||||||
" rows:%d, elapsed time:%.2f ms %s",
|
" rows:%" PRId64 ", elapsed time:%.2f ms %s",
|
||||||
pReader, pResBlock->info.id.uid, pResBlock->info.window.skey, pResBlock->info.window.ekey,
|
pReader, pResBlock->info.id.uid, pResBlock->info.window.skey, pResBlock->info.window.ekey,
|
||||||
pResBlock->info.rows, el, pReader->idStr);
|
pResBlock->info.rows, el, pReader->idStr);
|
||||||
}
|
}
|
||||||
|
@ -2922,6 +2983,7 @@ static int32_t doLoadLastBlockSequentially(STsdbReader* pReader) {
|
||||||
SReaderStatus* pStatus = &pReader->status;
|
SReaderStatus* pStatus = &pReader->status;
|
||||||
SLastBlockReader* pLastBlockReader = pStatus->fileIter.pLastBlockReader;
|
SLastBlockReader* pLastBlockReader = pStatus->fileIter.pLastBlockReader;
|
||||||
STableUidList* pUidList = &pStatus->uidList;
|
STableUidList* pUidList = &pStatus->uidList;
|
||||||
|
int32_t code = TSDB_CODE_SUCCESS;
|
||||||
|
|
||||||
if (taosHashGetSize(pStatus->pTableMap) == 0) {
|
if (taosHashGetSize(pStatus->pTableMap) == 0) {
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
|
@ -2952,7 +3014,11 @@ static int32_t doLoadLastBlockSequentially(STsdbReader* pReader) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
buildComposedDataBlockImpl(pReader, pScanInfo, &pReader->status.fileBlockData, pLastBlockReader);
|
code = buildComposedDataBlockImpl(pReader, pScanInfo, &pReader->status.fileBlockData, pLastBlockReader);
|
||||||
|
if (code) {
|
||||||
|
return code;
|
||||||
|
}
|
||||||
|
|
||||||
if (pResBlock->info.rows >= pReader->capacity) {
|
if (pResBlock->info.rows >= pReader->capacity) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -2963,7 +3029,7 @@ static int32_t doLoadLastBlockSequentially(STsdbReader* pReader) {
|
||||||
|
|
||||||
if (pResBlock->info.rows > 0) {
|
if (pResBlock->info.rows > 0) {
|
||||||
tsdbDebug("%p uid:%" PRIu64 ", composed data block created, brange:%" PRIu64 "-%" PRIu64
|
tsdbDebug("%p uid:%" PRIu64 ", composed data block created, brange:%" PRIu64 "-%" PRIu64
|
||||||
" rows:%d, elapsed time:%.2f ms %s",
|
" rows:%" PRId64 ", elapsed time:%.2f ms %s",
|
||||||
pReader, pResBlock->info.id.uid, pResBlock->info.window.skey, pResBlock->info.window.ekey,
|
pReader, pResBlock->info.id.uid, pResBlock->info.window.skey, pResBlock->info.window.ekey,
|
||||||
pResBlock->info.rows, el, pReader->idStr);
|
pResBlock->info.rows, el, pReader->idStr);
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
|
@ -3032,7 +3098,11 @@ static int32_t doBuildDataBlock(STsdbReader* pReader) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
buildComposedDataBlockImpl(pReader, pScanInfo, &pReader->status.fileBlockData, pLastBlockReader);
|
code = buildComposedDataBlockImpl(pReader, pScanInfo, &pReader->status.fileBlockData, pLastBlockReader);
|
||||||
|
if (code) {
|
||||||
|
return code;
|
||||||
|
}
|
||||||
|
|
||||||
if (pResBlock->info.rows >= pReader->capacity) {
|
if (pResBlock->info.rows >= pReader->capacity) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -3043,7 +3113,7 @@ static int32_t doBuildDataBlock(STsdbReader* pReader) {
|
||||||
|
|
||||||
if (pResBlock->info.rows > 0) {
|
if (pResBlock->info.rows > 0) {
|
||||||
tsdbDebug("%p uid:%" PRIu64 ", composed data block created, brange:%" PRIu64 "-%" PRIu64
|
tsdbDebug("%p uid:%" PRIu64 ", composed data block created, brange:%" PRIu64 "-%" PRIu64
|
||||||
" rows:%d, elapsed time:%.2f ms %s",
|
" rows:%" PRId64 ", elapsed time:%.2f ms %s",
|
||||||
pReader, pResBlock->info.id.uid, pResBlock->info.window.skey, pResBlock->info.window.ekey,
|
pReader, pResBlock->info.id.uid, pResBlock->info.window.skey, pResBlock->info.window.ekey,
|
||||||
pResBlock->info.rows, el, pReader->idStr);
|
pResBlock->info.rows, el, pReader->idStr);
|
||||||
}
|
}
|
||||||
|
@ -3069,6 +3139,151 @@ static int32_t doBuildDataBlock(STsdbReader* pReader) {
|
||||||
return code;
|
return code;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static int32_t doSumFileBlockRows(STsdbReader* pReader, SDataFReader* pFileReader) {
|
||||||
|
int64_t st = taosGetTimestampUs();
|
||||||
|
LRUHandle* handle = NULL;
|
||||||
|
int32_t code = tsdbCacheGetBlockIdx(pFileReader->pTsdb->biCache, pFileReader, &handle);
|
||||||
|
if (code != TSDB_CODE_SUCCESS || handle == NULL) {
|
||||||
|
goto _end;
|
||||||
|
}
|
||||||
|
|
||||||
|
int32_t numOfTables = taosHashGetSize(pReader->status.pTableMap);
|
||||||
|
|
||||||
|
SArray* aBlockIdx = (SArray*)taosLRUCacheValue(pFileReader->pTsdb->biCache, handle);
|
||||||
|
size_t num = taosArrayGetSize(aBlockIdx);
|
||||||
|
if (num == 0) {
|
||||||
|
tsdbBICacheRelease(pFileReader->pTsdb->biCache, handle);
|
||||||
|
return TSDB_CODE_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
SBlockIdx* pBlockIdx = NULL;
|
||||||
|
int32_t i = 0;
|
||||||
|
for (int32_t i = 0; i < num; ++i) {
|
||||||
|
pBlockIdx = (SBlockIdx*)taosArrayGet(aBlockIdx, i);
|
||||||
|
if (pBlockIdx->suid != pReader->suid) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
STableBlockScanInfo** p = taosHashGet(pReader->status.pTableMap, &pBlockIdx->uid, sizeof(pBlockIdx->uid));
|
||||||
|
if (p == NULL) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
STableBlockScanInfo *pScanInfo = *p;
|
||||||
|
tMapDataReset(&pScanInfo->mapData);
|
||||||
|
tsdbReadDataBlk(pReader->pFileReader, pBlockIdx, &pScanInfo->mapData);
|
||||||
|
|
||||||
|
SDataBlk block = {0};
|
||||||
|
for (int32_t j = 0; j < pScanInfo->mapData.nItem; ++j) {
|
||||||
|
tGetDataBlk(pScanInfo->mapData.pData + pScanInfo->mapData.aOffset[j], &block);
|
||||||
|
pReader->rowsNum += block.nRow;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
_end:
|
||||||
|
tsdbBICacheRelease(pFileReader->pTsdb->biCache, handle);
|
||||||
|
return code;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static int32_t doSumSttBlockRows(STsdbReader* pReader) {
|
||||||
|
int32_t code = TSDB_CODE_SUCCESS;
|
||||||
|
SLastBlockReader* pLastBlockReader = pReader->status.fileIter.pLastBlockReader;
|
||||||
|
SSttBlockLoadInfo* pBlockLoadInfo = NULL;
|
||||||
|
|
||||||
|
for (int32_t i = 0; i < pReader->pFileReader->pSet->nSttF; ++i) { // open all last file
|
||||||
|
pBlockLoadInfo = &pLastBlockReader->pInfo[i];
|
||||||
|
|
||||||
|
code = tsdbReadSttBlk(pReader->pFileReader, i, pBlockLoadInfo->aSttBlk);
|
||||||
|
if (code) {
|
||||||
|
return code;
|
||||||
|
}
|
||||||
|
|
||||||
|
size_t size = taosArrayGetSize(pBlockLoadInfo->aSttBlk);
|
||||||
|
if (size >= 1) {
|
||||||
|
SSttBlk *pStart = taosArrayGet(pBlockLoadInfo->aSttBlk, 0);
|
||||||
|
SSttBlk *pEnd = taosArrayGet(pBlockLoadInfo->aSttBlk, size - 1);
|
||||||
|
|
||||||
|
// all identical
|
||||||
|
if (pStart->suid == pEnd->suid) {
|
||||||
|
if (pStart->suid != pReader->suid) {
|
||||||
|
// no qualified stt block existed
|
||||||
|
taosArrayClear(pBlockLoadInfo->aSttBlk);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
for (int32_t i = 0; i < size; ++i) {
|
||||||
|
SSttBlk *p = taosArrayGet(pBlockLoadInfo->aSttBlk, i);
|
||||||
|
pReader->rowsNum += p->nRow;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
for (int32_t i = 0; i < size; ++i) {
|
||||||
|
SSttBlk *p = taosArrayGet(pBlockLoadInfo->aSttBlk, i);
|
||||||
|
uint64_t s = p->suid;
|
||||||
|
if (s < pReader->suid) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (s == pReader->suid) {
|
||||||
|
pReader->rowsNum += p->nRow;
|
||||||
|
} else if (s > pReader->suid) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return code;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int32_t readRowsCountFromFiles(STsdbReader* pReader) {
|
||||||
|
int32_t code = TSDB_CODE_SUCCESS;
|
||||||
|
|
||||||
|
while (1) {
|
||||||
|
bool hasNext = false;
|
||||||
|
int32_t code = filesetIteratorNext(&pReader->status.fileIter, pReader, &hasNext);
|
||||||
|
if (code) {
|
||||||
|
return code;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!hasNext) { // no data files on disk
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
code = doSumFileBlockRows(pReader, pReader->pFileReader);
|
||||||
|
if (code != TSDB_CODE_SUCCESS) {
|
||||||
|
return code;
|
||||||
|
}
|
||||||
|
|
||||||
|
code = doSumSttBlockRows(pReader);
|
||||||
|
if (code != TSDB_CODE_SUCCESS) {
|
||||||
|
return code;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pReader->status.loadFromFile = false;
|
||||||
|
|
||||||
|
return code;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int32_t readRowsCountFromMem(STsdbReader* pReader) {
|
||||||
|
int32_t code = TSDB_CODE_SUCCESS;
|
||||||
|
int64_t memNum = 0, imemNum = 0;
|
||||||
|
if (pReader->pReadSnap->pMem != NULL) {
|
||||||
|
tsdbMemTableCountRows(pReader->pReadSnap->pMem, pReader->status.pTableMap, &memNum);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (pReader->pReadSnap->pIMem != NULL) {
|
||||||
|
tsdbMemTableCountRows(pReader->pReadSnap->pIMem, pReader->status.pTableMap, &imemNum);
|
||||||
|
}
|
||||||
|
|
||||||
|
pReader->rowsNum += memNum + imemNum;
|
||||||
|
|
||||||
|
return code;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
static int32_t buildBlockFromBufferSequentially(STsdbReader* pReader) {
|
static int32_t buildBlockFromBufferSequentially(STsdbReader* pReader) {
|
||||||
SReaderStatus* pStatus = &pReader->status;
|
SReaderStatus* pStatus = &pReader->status;
|
||||||
STableUidList* pUidList = &pStatus->uidList;
|
STableUidList* pUidList = &pStatus->uidList;
|
||||||
|
@ -3677,8 +3892,9 @@ int32_t doMergeMemIMemRows(TSDBROW* pRow, TSDBROW* piRow, STableBlockScanInfo* p
|
||||||
|
|
||||||
if (ASCENDING_TRAVERSE(pReader->order)) { // ascending order imem --> mem
|
if (ASCENDING_TRAVERSE(pReader->order)) { // ascending order imem --> mem
|
||||||
STSchema* pSchema = doGetSchemaForTSRow(TSDBROW_SVERSION(pRow), pReader, pBlockScanInfo->uid);
|
STSchema* pSchema = doGetSchemaForTSRow(TSDBROW_SVERSION(pRow), pReader, pBlockScanInfo->uid);
|
||||||
|
STSchema* piSchema = doGetSchemaForTSRow(TSDBROW_SVERSION(piRow), pReader, pBlockScanInfo->uid);
|
||||||
|
|
||||||
int32_t code = tsdbRowMergerInit(&merge, piRow, pSchema);
|
int32_t code = tsdbRowMergerInit2(&merge, pSchema, piRow, piSchema);
|
||||||
if (code != TSDB_CODE_SUCCESS) {
|
if (code != TSDB_CODE_SUCCESS) {
|
||||||
return code;
|
return code;
|
||||||
}
|
}
|
||||||
|
@ -3689,7 +3905,8 @@ int32_t doMergeMemIMemRows(TSDBROW* pRow, TSDBROW* piRow, STableBlockScanInfo* p
|
||||||
return code;
|
return code;
|
||||||
}
|
}
|
||||||
|
|
||||||
tsdbRowMerge(&merge, pRow);
|
pSchema = doGetSchemaForTSRow(TSDBROW_SVERSION(pRow), pReader, pBlockScanInfo->uid);
|
||||||
|
tsdbRowMergerAdd(&merge, pRow, pSchema);
|
||||||
code =
|
code =
|
||||||
doMergeRowsInBuf(&pBlockScanInfo->iter, pBlockScanInfo->uid, k.ts, pBlockScanInfo->delSkyline, &merge, pReader);
|
doMergeRowsInBuf(&pBlockScanInfo->iter, pBlockScanInfo->uid, k.ts, pBlockScanInfo->delSkyline, &merge, pReader);
|
||||||
if (code != TSDB_CODE_SUCCESS) {
|
if (code != TSDB_CODE_SUCCESS) {
|
||||||
|
@ -3784,6 +4001,7 @@ int32_t tsdbGetNextRowInMem(STableBlockScanInfo* pBlockScanInfo, STsdbReader* pR
|
||||||
int32_t doAppendRowFromTSRow(SSDataBlock* pBlock, STsdbReader* pReader, SRow* pTSRow, STableBlockScanInfo* pScanInfo) {
|
int32_t doAppendRowFromTSRow(SSDataBlock* pBlock, STsdbReader* pReader, SRow* pTSRow, STableBlockScanInfo* pScanInfo) {
|
||||||
int32_t outputRowIndex = pBlock->info.rows;
|
int32_t outputRowIndex = pBlock->info.rows;
|
||||||
int64_t uid = pScanInfo->uid;
|
int64_t uid = pScanInfo->uid;
|
||||||
|
int32_t code = TSDB_CODE_SUCCESS;
|
||||||
|
|
||||||
int32_t numOfCols = (int32_t)taosArrayGetSize(pBlock->pDataBlock);
|
int32_t numOfCols = (int32_t)taosArrayGetSize(pBlock->pDataBlock);
|
||||||
|
|
||||||
|
@ -3806,7 +4024,10 @@ int32_t doAppendRowFromTSRow(SSDataBlock* pBlock, STsdbReader* pReader, SRow* pT
|
||||||
SColumnInfoData* pColInfoData = taosArrayGet(pBlock->pDataBlock, pSupInfo->slotId[i]);
|
SColumnInfoData* pColInfoData = taosArrayGet(pBlock->pDataBlock, pSupInfo->slotId[i]);
|
||||||
|
|
||||||
tRowGet(pTSRow, pSchema, j, &colVal);
|
tRowGet(pTSRow, pSchema, j, &colVal);
|
||||||
doCopyColVal(pColInfoData, outputRowIndex, i, &colVal, pSupInfo);
|
code = doCopyColVal(pColInfoData, outputRowIndex, i, &colVal, pSupInfo);
|
||||||
|
if (code) {
|
||||||
|
return code;
|
||||||
|
}
|
||||||
i += 1;
|
i += 1;
|
||||||
j += 1;
|
j += 1;
|
||||||
} else if (colId < pSchema->columns[j].colId) {
|
} else if (colId < pSchema->columns[j].colId) {
|
||||||
|
@ -3836,6 +4057,7 @@ int32_t doAppendRowFromFileBlock(SSDataBlock* pResBlock, STsdbReader* pReader, S
|
||||||
int32_t rowIndex) {
|
int32_t rowIndex) {
|
||||||
int32_t i = 0, j = 0;
|
int32_t i = 0, j = 0;
|
||||||
int32_t outputRowIndex = pResBlock->info.rows;
|
int32_t outputRowIndex = pResBlock->info.rows;
|
||||||
|
int32_t code = TSDB_CODE_SUCCESS;
|
||||||
|
|
||||||
SBlockLoadSuppInfo* pSupInfo = &pReader->suppInfo;
|
SBlockLoadSuppInfo* pSupInfo = &pReader->suppInfo;
|
||||||
if (pReader->suppInfo.colId[i] == PRIMARYKEY_TIMESTAMP_COL_ID) {
|
if (pReader->suppInfo.colId[i] == PRIMARYKEY_TIMESTAMP_COL_ID) {
|
||||||
|
@ -3858,7 +4080,10 @@ int32_t doAppendRowFromFileBlock(SSDataBlock* pResBlock, STsdbReader* pReader, S
|
||||||
SColumnInfoData* pCol = TARRAY_GET_ELEM(pResBlock->pDataBlock, pSupInfo->slotId[i]);
|
SColumnInfoData* pCol = TARRAY_GET_ELEM(pResBlock->pDataBlock, pSupInfo->slotId[i]);
|
||||||
if (pData->cid == pSupInfo->colId[i]) {
|
if (pData->cid == pSupInfo->colId[i]) {
|
||||||
tColDataGetValue(pData, rowIndex, &cv);
|
tColDataGetValue(pData, rowIndex, &cv);
|
||||||
doCopyColVal(pCol, outputRowIndex, i, &cv, pSupInfo);
|
code = doCopyColVal(pCol, outputRowIndex, i, &cv, pSupInfo);
|
||||||
|
if (code) {
|
||||||
|
return code;
|
||||||
|
}
|
||||||
j += 1;
|
j += 1;
|
||||||
} else if (pData->cid > pCol->info.colId) {
|
} else if (pData->cid > pCol->info.colId) {
|
||||||
// the specified column does not exist in file block, fill with null data
|
// the specified column does not exist in file block, fill with null data
|
||||||
|
@ -3882,6 +4107,7 @@ int32_t doAppendRowFromFileBlock(SSDataBlock* pResBlock, STsdbReader* pReader, S
|
||||||
int32_t buildDataBlockFromBufImpl(STableBlockScanInfo* pBlockScanInfo, int64_t endKey, int32_t capacity,
|
int32_t buildDataBlockFromBufImpl(STableBlockScanInfo* pBlockScanInfo, int64_t endKey, int32_t capacity,
|
||||||
STsdbReader* pReader) {
|
STsdbReader* pReader) {
|
||||||
SSDataBlock* pBlock = pReader->pResBlock;
|
SSDataBlock* pBlock = pReader->pResBlock;
|
||||||
|
int32_t code = TSDB_CODE_SUCCESS;
|
||||||
|
|
||||||
do {
|
do {
|
||||||
// SRow* pTSRow = NULL;
|
// SRow* pTSRow = NULL;
|
||||||
|
@ -3893,13 +4119,20 @@ int32_t buildDataBlockFromBufImpl(STableBlockScanInfo* pBlockScanInfo, int64_t e
|
||||||
}
|
}
|
||||||
|
|
||||||
if (row.type == TSDBROW_ROW_FMT) {
|
if (row.type == TSDBROW_ROW_FMT) {
|
||||||
doAppendRowFromTSRow(pBlock, pReader, row.pTSRow, pBlockScanInfo);
|
code = doAppendRowFromTSRow(pBlock, pReader, row.pTSRow, pBlockScanInfo);
|
||||||
|
|
||||||
if (freeTSRow) {
|
if (freeTSRow) {
|
||||||
taosMemoryFree(row.pTSRow);
|
taosMemoryFree(row.pTSRow);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (code) {
|
||||||
|
return code;
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
doAppendRowFromFileBlock(pBlock, pReader, row.pBlockData, row.iRow);
|
code = doAppendRowFromFileBlock(pBlock, pReader, row.pBlockData, row.iRow);
|
||||||
|
if (code) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// no data in buffer, return immediately
|
// no data in buffer, return immediately
|
||||||
|
@ -3912,7 +4145,7 @@ int32_t buildDataBlockFromBufImpl(STableBlockScanInfo* pBlockScanInfo, int64_t e
|
||||||
}
|
}
|
||||||
} while (1);
|
} while (1);
|
||||||
|
|
||||||
return TSDB_CODE_SUCCESS;
|
return code;
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO refactor: with createDataBlockScanInfo
|
// TODO refactor: with createDataBlockScanInfo
|
||||||
|
@ -3929,8 +4162,13 @@ int32_t tsdbSetTableList(STsdbReader* pReader, const void* pTableList, int32_t n
|
||||||
if (code) {
|
if (code) {
|
||||||
return code;
|
return code;
|
||||||
}
|
}
|
||||||
pReader->status.uidList.tableUidList =
|
|
||||||
(uint64_t*)taosMemoryRealloc(pReader->status.uidList.tableUidList, sizeof(uint64_t) * num);
|
char* p1 = taosMemoryRealloc(pReader->status.uidList.tableUidList, sizeof(uint64_t) * num);
|
||||||
|
if (p1 == NULL) {
|
||||||
|
return TSDB_CODE_OUT_OF_MEMORY;
|
||||||
|
}
|
||||||
|
|
||||||
|
pReader->status.uidList.tableUidList = (uint64_t*)p1;
|
||||||
}
|
}
|
||||||
|
|
||||||
taosHashClear(pReader->status.pTableMap);
|
taosHashClear(pReader->status.pTableMap);
|
||||||
|
@ -3986,6 +4224,8 @@ static int32_t doOpenReaderImpl(STsdbReader* pReader) {
|
||||||
int32_t code = TSDB_CODE_SUCCESS;
|
int32_t code = TSDB_CODE_SUCCESS;
|
||||||
if (pStatus->fileIter.numOfFiles == 0) {
|
if (pStatus->fileIter.numOfFiles == 0) {
|
||||||
pStatus->loadFromFile = false;
|
pStatus->loadFromFile = false;
|
||||||
|
} else if (READ_MODE_COUNT_ONLY == pReader->readMode) {
|
||||||
|
// DO NOTHING
|
||||||
} else {
|
} else {
|
||||||
code = initForFirstBlockInFile(pReader, pBlockIter);
|
code = initForFirstBlockInFile(pReader, pBlockIter);
|
||||||
}
|
}
|
||||||
|
@ -3997,9 +4237,14 @@ static int32_t doOpenReaderImpl(STsdbReader* pReader) {
|
||||||
return code;
|
return code;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void freeSchemaFunc(void* param) {
|
||||||
|
void* p = *(void**)param;
|
||||||
|
taosMemoryFree(p);
|
||||||
|
}
|
||||||
|
|
||||||
// ====================================== EXPOSED APIs ======================================
|
// ====================================== EXPOSED APIs ======================================
|
||||||
int32_t tsdbReaderOpen(SVnode* pVnode, SQueryTableDataCond* pCond, void* pTableList, int32_t numOfTables,
|
int32_t tsdbReaderOpen(SVnode* pVnode, SQueryTableDataCond* pCond, void* pTableList, int32_t numOfTables,
|
||||||
SSDataBlock* pResBlock, STsdbReader** ppReader, const char* idstr) {
|
SSDataBlock* pResBlock, STsdbReader** ppReader, const char* idstr, bool countOnly) {
|
||||||
STimeWindow window = pCond->twindows;
|
STimeWindow window = pCond->twindows;
|
||||||
if (pCond->type == TIMEWINDOW_RANGE_EXTERNAL) {
|
if (pCond->type == TIMEWINDOW_RANGE_EXTERNAL) {
|
||||||
pCond->twindows.skey += 1;
|
pCond->twindows.skey += 1;
|
||||||
|
@ -4073,6 +4318,14 @@ int32_t tsdbReaderOpen(SVnode* pVnode, SQueryTableDataCond* pCond, void* pTableL
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pReader->pSchemaMap = tSimpleHashInit(8, taosFastHash);
|
||||||
|
if (pReader->pSchemaMap == NULL) {
|
||||||
|
tsdbError("failed init schema hash for reader %s", pReader->idStr);
|
||||||
|
code = TSDB_CODE_OUT_OF_MEMORY;
|
||||||
|
goto _err;
|
||||||
|
}
|
||||||
|
|
||||||
|
tSimpleHashSetFreeFp(pReader->pSchemaMap, freeSchemaFunc);
|
||||||
if (pReader->pSchema != NULL) {
|
if (pReader->pSchema != NULL) {
|
||||||
code = updateBlockSMAInfo(pReader->pSchema, &pReader->suppInfo);
|
code = updateBlockSMAInfo(pReader->pSchema, &pReader->suppInfo);
|
||||||
if (code != TSDB_CODE_SUCCESS) {
|
if (code != TSDB_CODE_SUCCESS) {
|
||||||
|
@ -4091,6 +4344,10 @@ int32_t tsdbReaderOpen(SVnode* pVnode, SQueryTableDataCond* pCond, void* pTableL
|
||||||
|
|
||||||
pReader->suspended = true;
|
pReader->suspended = true;
|
||||||
|
|
||||||
|
if (countOnly) {
|
||||||
|
pReader->readMode = READ_MODE_COUNT_ONLY;
|
||||||
|
}
|
||||||
|
|
||||||
tsdbDebug("%p total numOfTable:%d in this query %s", pReader, numOfTables, pReader->idStr);
|
tsdbDebug("%p total numOfTable:%d in this query %s", pReader, numOfTables, pReader->idStr);
|
||||||
return code;
|
return code;
|
||||||
|
|
||||||
|
@ -4115,7 +4372,7 @@ void tsdbReaderClose(STsdbReader* pReader) {
|
||||||
p->status.uidList.tableUidList = NULL;
|
p->status.uidList.tableUidList = NULL;
|
||||||
p->pReadSnap = NULL;
|
p->pReadSnap = NULL;
|
||||||
p->pSchema = NULL;
|
p->pSchema = NULL;
|
||||||
p->pMemSchema = NULL;
|
p->pSchemaMap = NULL;
|
||||||
|
|
||||||
p = pReader->innerReader[1];
|
p = pReader->innerReader[1];
|
||||||
|
|
||||||
|
@ -4123,7 +4380,7 @@ void tsdbReaderClose(STsdbReader* pReader) {
|
||||||
p->status.uidList.tableUidList = NULL;
|
p->status.uidList.tableUidList = NULL;
|
||||||
p->pReadSnap = NULL;
|
p->pReadSnap = NULL;
|
||||||
p->pSchema = NULL;
|
p->pSchema = NULL;
|
||||||
p->pMemSchema = NULL;
|
p->pSchemaMap = NULL;
|
||||||
|
|
||||||
tsdbReaderClose(pReader->innerReader[0]);
|
tsdbReaderClose(pReader->innerReader[0]);
|
||||||
tsdbReaderClose(pReader->innerReader[1]);
|
tsdbReaderClose(pReader->innerReader[1]);
|
||||||
|
@ -4203,10 +4460,7 @@ void tsdbReaderClose(STsdbReader* pReader) {
|
||||||
taosMemoryFree(pReader->idStr);
|
taosMemoryFree(pReader->idStr);
|
||||||
taosMemoryFree(pReader->pSchema);
|
taosMemoryFree(pReader->pSchema);
|
||||||
|
|
||||||
if (pReader->pMemSchema != pReader->pSchema) {
|
tSimpleHashCleanup(pReader->pSchemaMap);
|
||||||
taosMemoryFree(pReader->pMemSchema);
|
|
||||||
}
|
|
||||||
|
|
||||||
taosMemoryFreeClear(pReader);
|
taosMemoryFreeClear(pReader);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -4366,14 +4620,14 @@ int32_t tsdbReaderResume(STsdbReader* pReader) {
|
||||||
pPrevReader->status.pTableMap = pReader->status.pTableMap;
|
pPrevReader->status.pTableMap = pReader->status.pTableMap;
|
||||||
pPrevReader->status.uidList = pReader->status.uidList;
|
pPrevReader->status.uidList = pReader->status.uidList;
|
||||||
pPrevReader->pSchema = pReader->pSchema;
|
pPrevReader->pSchema = pReader->pSchema;
|
||||||
pPrevReader->pMemSchema = pReader->pMemSchema;
|
pPrevReader->pSchemaMap = pReader->pSchemaMap;
|
||||||
pPrevReader->pReadSnap = pReader->pReadSnap;
|
pPrevReader->pReadSnap = pReader->pReadSnap;
|
||||||
|
|
||||||
pNextReader->capacity = 1;
|
pNextReader->capacity = 1;
|
||||||
pNextReader->status.pTableMap = pReader->status.pTableMap;
|
pNextReader->status.pTableMap = pReader->status.pTableMap;
|
||||||
pNextReader->status.uidList = pReader->status.uidList;
|
pNextReader->status.uidList = pReader->status.uidList;
|
||||||
pNextReader->pSchema = pReader->pSchema;
|
pNextReader->pSchema = pReader->pSchema;
|
||||||
pNextReader->pMemSchema = pReader->pMemSchema;
|
pNextReader->pSchemaMap = pReader->pSchemaMap;
|
||||||
pNextReader->pReadSnap = pReader->pReadSnap;
|
pNextReader->pReadSnap = pReader->pReadSnap;
|
||||||
|
|
||||||
code = doOpenReaderImpl(pPrevReader);
|
code = doOpenReaderImpl(pPrevReader);
|
||||||
|
@ -4394,43 +4648,82 @@ _err:
|
||||||
return code;
|
return code;
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool doTsdbNextDataBlock(STsdbReader* pReader) {
|
static bool tsdbReadRowsCountOnly(STsdbReader* pReader) {
|
||||||
|
int32_t code = TSDB_CODE_SUCCESS;
|
||||||
|
SSDataBlock* pBlock = pReader->pResBlock;
|
||||||
|
|
||||||
|
if (pReader->status.loadFromFile == false) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
code = readRowsCountFromFiles(pReader);
|
||||||
|
if (code != TSDB_CODE_SUCCESS) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
code = readRowsCountFromMem(pReader);
|
||||||
|
if (code != TSDB_CODE_SUCCESS) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
pBlock->info.rows = pReader->rowsNum;
|
||||||
|
pBlock->info.id.uid = 0;
|
||||||
|
pBlock->info.dataLoad = 0;
|
||||||
|
|
||||||
|
pReader->rowsNum = 0;
|
||||||
|
|
||||||
|
return pBlock->info.rows > 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int32_t doTsdbNextDataBlock(STsdbReader* pReader, bool *hasNext) {
|
||||||
|
int32_t code = TSDB_CODE_SUCCESS;
|
||||||
|
|
||||||
// cleanup the data that belongs to the previous data block
|
// cleanup the data that belongs to the previous data block
|
||||||
SSDataBlock* pBlock = pReader->pResBlock;
|
SSDataBlock* pBlock = pReader->pResBlock;
|
||||||
blockDataCleanup(pBlock);
|
blockDataCleanup(pBlock);
|
||||||
|
|
||||||
|
*hasNext = false;
|
||||||
|
|
||||||
SReaderStatus* pStatus = &pReader->status;
|
SReaderStatus* pStatus = &pReader->status;
|
||||||
if (taosHashGetSize(pStatus->pTableMap) == 0) {
|
if (taosHashGetSize(pStatus->pTableMap) == 0) {
|
||||||
return false;
|
return code;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (READ_MODE_COUNT_ONLY == pReader->readMode) {
|
||||||
|
return tsdbReadRowsCountOnly(pReader);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (pStatus->loadFromFile) {
|
if (pStatus->loadFromFile) {
|
||||||
int32_t code = buildBlockFromFiles(pReader);
|
code = buildBlockFromFiles(pReader);
|
||||||
if (code != TSDB_CODE_SUCCESS) {
|
if (code != TSDB_CODE_SUCCESS) {
|
||||||
return false;
|
return code;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (pBlock->info.rows > 0) {
|
if (pBlock->info.rows <= 0) {
|
||||||
return true;
|
|
||||||
} else {
|
|
||||||
resetTableListIndex(&pReader->status);
|
resetTableListIndex(&pReader->status);
|
||||||
buildBlockFromBufferSequentially(pReader);
|
code = buildBlockFromBufferSequentially(pReader);
|
||||||
return pBlock->info.rows > 0;
|
|
||||||
}
|
}
|
||||||
} else { // no data in files, let's try the buffer
|
} else { // no data in files, let's try the buffer
|
||||||
buildBlockFromBufferSequentially(pReader);
|
code = buildBlockFromBufferSequentially(pReader);
|
||||||
return pBlock->info.rows > 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
*hasNext = pBlock->info.rows > 0;
|
||||||
|
|
||||||
|
return code;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool tsdbNextDataBlock(STsdbReader* pReader) {
|
int32_t tsdbNextDataBlock(STsdbReader* pReader, bool *hasNext) {
|
||||||
|
int32_t code = TSDB_CODE_SUCCESS;
|
||||||
|
|
||||||
|
*hasNext = false;
|
||||||
|
|
||||||
if (isEmptyQueryTimeWindow(&pReader->window) || pReader->step == EXTERNAL_ROWS_NEXT) {
|
if (isEmptyQueryTimeWindow(&pReader->window) || pReader->step == EXTERNAL_ROWS_NEXT) {
|
||||||
return false;
|
return code;
|
||||||
}
|
}
|
||||||
|
|
||||||
SReaderStatus* pStatus = &pReader->status;
|
SReaderStatus* pStatus = &pReader->status;
|
||||||
|
|
||||||
int32_t code = tsdbAcquireReader(pReader);
|
code = tsdbAcquireReader(pReader);
|
||||||
qTrace("tsdb/read: %p, take read mutex, code: %d", pReader, code);
|
qTrace("tsdb/read: %p, take read mutex, code: %d", pReader, code);
|
||||||
|
|
||||||
if (pReader->suspended) {
|
if (pReader->suspended) {
|
||||||
|
@ -4438,16 +4731,21 @@ bool tsdbNextDataBlock(STsdbReader* pReader) {
|
||||||
}
|
}
|
||||||
|
|
||||||
if (pReader->innerReader[0] != NULL && pReader->step == 0) {
|
if (pReader->innerReader[0] != NULL && pReader->step == 0) {
|
||||||
bool ret = doTsdbNextDataBlock(pReader->innerReader[0]);
|
code = doTsdbNextDataBlock(pReader->innerReader[0], hasNext);
|
||||||
|
if (code) {
|
||||||
|
tsdbReleaseReader(pReader);
|
||||||
|
return code;
|
||||||
|
}
|
||||||
|
|
||||||
pReader->step = EXTERNAL_ROWS_PREV;
|
pReader->step = EXTERNAL_ROWS_PREV;
|
||||||
if (ret) {
|
if (*hasNext) {
|
||||||
pStatus = &pReader->innerReader[0]->status;
|
pStatus = &pReader->innerReader[0]->status;
|
||||||
if (pStatus->composedDataBlock) {
|
if (pStatus->composedDataBlock) {
|
||||||
qTrace("tsdb/read: %p, unlock read mutex", pReader);
|
qTrace("tsdb/read: %p, unlock read mutex", pReader);
|
||||||
tsdbReleaseReader(pReader);
|
tsdbReleaseReader(pReader);
|
||||||
}
|
}
|
||||||
|
|
||||||
return ret;
|
return code;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -4464,14 +4762,19 @@ bool tsdbNextDataBlock(STsdbReader* pReader) {
|
||||||
pReader->step = EXTERNAL_ROWS_MAIN;
|
pReader->step = EXTERNAL_ROWS_MAIN;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool ret = doTsdbNextDataBlock(pReader);
|
code = doTsdbNextDataBlock(pReader, hasNext);
|
||||||
if (ret) {
|
if (code != TSDB_CODE_SUCCESS) {
|
||||||
|
tsdbReleaseReader(pReader);
|
||||||
|
return code;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (*hasNext) {
|
||||||
if (pStatus->composedDataBlock) {
|
if (pStatus->composedDataBlock) {
|
||||||
qTrace("tsdb/read: %p, unlock read mutex", pReader);
|
qTrace("tsdb/read: %p, unlock read mutex", pReader);
|
||||||
tsdbReleaseReader(pReader);
|
tsdbReleaseReader(pReader);
|
||||||
}
|
}
|
||||||
|
|
||||||
return ret;
|
return code;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (pReader->step == EXTERNAL_ROWS_MAIN && pReader->innerReader[1] != NULL) {
|
if (pReader->step == EXTERNAL_ROWS_MAIN && pReader->innerReader[1] != NULL) {
|
||||||
|
@ -4483,23 +4786,28 @@ bool tsdbNextDataBlock(STsdbReader* pReader) {
|
||||||
return code;
|
return code;
|
||||||
}
|
}
|
||||||
|
|
||||||
ret = doTsdbNextDataBlock(pReader->innerReader[1]);
|
code = doTsdbNextDataBlock(pReader->innerReader[1], hasNext);
|
||||||
|
if (code != TSDB_CODE_SUCCESS) {
|
||||||
|
tsdbReleaseReader(pReader);
|
||||||
|
return code;
|
||||||
|
}
|
||||||
|
|
||||||
pReader->step = EXTERNAL_ROWS_NEXT;
|
pReader->step = EXTERNAL_ROWS_NEXT;
|
||||||
if (ret) {
|
if (*hasNext) {
|
||||||
pStatus = &pReader->innerReader[1]->status;
|
pStatus = &pReader->innerReader[1]->status;
|
||||||
if (pStatus->composedDataBlock) {
|
if (pStatus->composedDataBlock) {
|
||||||
qTrace("tsdb/read: %p, unlock read mutex", pReader);
|
qTrace("tsdb/read: %p, unlock read mutex", pReader);
|
||||||
tsdbReleaseReader(pReader);
|
tsdbReleaseReader(pReader);
|
||||||
}
|
}
|
||||||
|
|
||||||
return ret;
|
return code;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
qTrace("tsdb/read: %p, unlock read mutex", pReader);
|
qTrace("tsdb/read: %p, unlock read mutex", pReader);
|
||||||
tsdbReleaseReader(pReader);
|
tsdbReleaseReader(pReader);
|
||||||
|
|
||||||
return false;
|
return code;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void doFillNullColSMA(SBlockLoadSuppInfo* pSup, int32_t numOfRows, int32_t numOfCols, SColumnDataAgg* pTsAgg) {
|
static void doFillNullColSMA(SBlockLoadSuppInfo* pSup, int32_t numOfRows, int32_t numOfCols, SColumnDataAgg* pTsAgg) {
|
||||||
|
@ -4644,20 +4952,27 @@ STableBlockScanInfo* getTableBlockScanInfo(SHashObj* pTableMap, uint64_t uid, co
|
||||||
|
|
||||||
static SSDataBlock* doRetrieveDataBlock(STsdbReader* pReader) {
|
static SSDataBlock* doRetrieveDataBlock(STsdbReader* pReader) {
|
||||||
SReaderStatus* pStatus = &pReader->status;
|
SReaderStatus* pStatus = &pReader->status;
|
||||||
|
int32_t code = TSDB_CODE_SUCCESS;
|
||||||
SFileDataBlockInfo* pBlockInfo = getCurrentBlockInfo(&pStatus->blockIter);
|
SFileDataBlockInfo* pBlockInfo = getCurrentBlockInfo(&pStatus->blockIter);
|
||||||
STableBlockScanInfo* pBlockScanInfo = getTableBlockScanInfo(pStatus->pTableMap, pBlockInfo->uid, pReader->idStr);
|
STableBlockScanInfo* pBlockScanInfo = getTableBlockScanInfo(pStatus->pTableMap, pBlockInfo->uid, pReader->idStr);
|
||||||
if (pBlockScanInfo == NULL) {
|
if (pBlockScanInfo == NULL) {
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t code = doLoadFileBlockData(pReader, &pStatus->blockIter, &pStatus->fileBlockData, pBlockScanInfo->uid);
|
code = doLoadFileBlockData(pReader, &pStatus->blockIter, &pStatus->fileBlockData, pBlockScanInfo->uid);
|
||||||
|
if (code != TSDB_CODE_SUCCESS) {
|
||||||
|
tBlockDataDestroy(&pStatus->fileBlockData);
|
||||||
|
terrno = code;
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
code = copyBlockDataToSDataBlock(pReader);
|
||||||
if (code != TSDB_CODE_SUCCESS) {
|
if (code != TSDB_CODE_SUCCESS) {
|
||||||
tBlockDataDestroy(&pStatus->fileBlockData);
|
tBlockDataDestroy(&pStatus->fileBlockData);
|
||||||
terrno = code;
|
terrno = code;
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
copyBlockDataToSDataBlock(pReader);
|
|
||||||
return pReader->pResBlock;
|
return pReader->pResBlock;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -4698,7 +5013,7 @@ int32_t tsdbReaderReset(STsdbReader* pReader, SQueryTableDataCond* pCond) {
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
SReaderStatus* pStatus = &pReader->status;
|
SReaderStatus* pStatus = &pReader->status;
|
||||||
SDataBlockIter* pBlockIter = &pStatus->blockIter;
|
SDataBlockIter* pBlockIter = &pStatus->blockIter;
|
||||||
|
|
||||||
pReader->order = pCond->order;
|
pReader->order = pCond->order;
|
||||||
|
@ -4719,9 +5034,9 @@ int32_t tsdbReaderReset(STsdbReader* pReader, SQueryTableDataCond* pCond) {
|
||||||
resetDataBlockIterator(pBlockIter, pReader->order);
|
resetDataBlockIterator(pBlockIter, pReader->order);
|
||||||
resetTableListIndex(&pReader->status);
|
resetTableListIndex(&pReader->status);
|
||||||
|
|
||||||
bool asc = ASCENDING_TRAVERSE(pReader->order);
|
bool asc = ASCENDING_TRAVERSE(pReader->order);
|
||||||
int32_t step = asc? 1:-1;
|
int32_t step = asc ? 1 : -1;
|
||||||
int64_t ts = asc? pReader->window.skey - 1 : pReader->window.ekey + 1;
|
int64_t ts = asc ? pReader->window.skey - 1 : pReader->window.ekey + 1;
|
||||||
resetAllDataBlockScanInfo(pStatus->pTableMap, ts, step);
|
resetAllDataBlockScanInfo(pStatus->pTableMap, ts, step);
|
||||||
|
|
||||||
int32_t code = 0;
|
int32_t code = 0;
|
||||||
|
|
|
@ -156,13 +156,10 @@ int vnodeShouldCommit(SVnode *pVnode) {
|
||||||
bool needCommit = false;
|
bool needCommit = false;
|
||||||
|
|
||||||
taosThreadMutexLock(&pVnode->mutex);
|
taosThreadMutexLock(&pVnode->mutex);
|
||||||
if (!pVnode->inUse || !diskAvail) {
|
if (pVnode->inUse && diskAvail) {
|
||||||
goto _out;
|
needCommit =
|
||||||
|
((pVnode->inUse->size > pVnode->inUse->node.size) && (pSched->commitMs + SYNC_VND_COMMIT_MIN_MS < nowMs));
|
||||||
}
|
}
|
||||||
needCommit =
|
|
||||||
(((pVnode->inUse->size > pVnode->inUse->node.size) && (pSched->commitMs + SYNC_VND_COMMIT_MIN_MS < nowMs)) ||
|
|
||||||
(pVnode->inUse->size > 0 && pSched->commitMs + pSched->maxWaitMs < nowMs));
|
|
||||||
_out:
|
|
||||||
taosThreadMutexUnlock(&pVnode->mutex);
|
taosThreadMutexUnlock(&pVnode->mutex);
|
||||||
return needCommit;
|
return needCommit;
|
||||||
}
|
}
|
||||||
|
|
|
@ -378,7 +378,7 @@ static int32_t vnodeSyncEqCtrlMsg(const SMsgCb *msgcb, SRpcMsg *pMsg) {
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t code = tmsgPutToQueue(msgcb, SYNC_CTRL_QUEUE, pMsg);
|
int32_t code = tmsgPutToQueue(msgcb, SYNC_RD_QUEUE, pMsg);
|
||||||
if (code != 0) {
|
if (code != 0) {
|
||||||
rpcFreeCont(pMsg->pCont);
|
rpcFreeCont(pMsg->pCont);
|
||||||
pMsg->pCont = NULL;
|
pMsg->pCont = NULL;
|
||||||
|
|
|
@ -107,6 +107,7 @@ int32_t tableListGetGroupList(const STableListInfo* pTableList, int32_t
|
||||||
uint64_t tableListGetSize(const STableListInfo* pTableList);
|
uint64_t tableListGetSize(const STableListInfo* pTableList);
|
||||||
uint64_t tableListGetSuid(const STableListInfo* pTableList);
|
uint64_t tableListGetSuid(const STableListInfo* pTableList);
|
||||||
STableKeyInfo* tableListGetInfo(const STableListInfo* pTableList, int32_t index);
|
STableKeyInfo* tableListGetInfo(const STableListInfo* pTableList, int32_t index);
|
||||||
|
int32_t tableListFind(const STableListInfo* pTableList, uint64_t uid, int32_t startIndex);
|
||||||
|
|
||||||
size_t getResultRowSize(struct SqlFunctionCtx* pCtx, int32_t numOfOutput);
|
size_t getResultRowSize(struct SqlFunctionCtx* pCtx, int32_t numOfOutput);
|
||||||
void initResultRowInfo(SResultRowInfo* pResultRowInfo);
|
void initResultRowInfo(SResultRowInfo* pResultRowInfo);
|
||||||
|
|
|
@ -143,10 +143,7 @@ typedef struct {
|
||||||
SQueryTableDataCond tableCond;
|
SQueryTableDataCond tableCond;
|
||||||
int64_t fillHistoryVer1;
|
int64_t fillHistoryVer1;
|
||||||
int64_t fillHistoryVer2;
|
int64_t fillHistoryVer2;
|
||||||
|
SStreamState* pState;
|
||||||
// int8_t triggerSaved;
|
|
||||||
// int64_t deleteMarkSaved;
|
|
||||||
SStreamState* pState;
|
|
||||||
} SStreamTaskInfo;
|
} SStreamTaskInfo;
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
|
@ -168,15 +165,14 @@ typedef struct STaskStopInfo {
|
||||||
} STaskStopInfo;
|
} STaskStopInfo;
|
||||||
|
|
||||||
struct SExecTaskInfo {
|
struct SExecTaskInfo {
|
||||||
STaskIdInfo id;
|
STaskIdInfo id;
|
||||||
uint32_t status;
|
uint32_t status;
|
||||||
STimeWindow window;
|
STimeWindow window;
|
||||||
STaskCostInfo cost;
|
STaskCostInfo cost;
|
||||||
int64_t owner; // if it is in execution
|
int64_t owner; // if it is in execution
|
||||||
int32_t code;
|
int32_t code;
|
||||||
int32_t qbufQuota; // total available buffer (in KB) during execution query
|
int32_t qbufQuota; // total available buffer (in KB) during execution query
|
||||||
|
int64_t version; // used for stream to record wal version, why not move to sschemainfo
|
||||||
int64_t version; // used for stream to record wal version, why not move to sschemainfo
|
|
||||||
SStreamTaskInfo streamInfo;
|
SStreamTaskInfo streamInfo;
|
||||||
SSchemaInfo schemaInfo;
|
SSchemaInfo schemaInfo;
|
||||||
STableListInfo* pTableInfoList; // this is a table list
|
STableListInfo* pTableInfoList; // this is a table list
|
||||||
|
@ -188,6 +184,7 @@ struct SExecTaskInfo {
|
||||||
SLocalFetch localFetch;
|
SLocalFetch localFetch;
|
||||||
SArray* pResultBlockList; // result block list
|
SArray* pResultBlockList; // result block list
|
||||||
STaskStopInfo stopInfo;
|
STaskStopInfo stopInfo;
|
||||||
|
SRWLatch lock; // secure the access of STableListInfo
|
||||||
};
|
};
|
||||||
|
|
||||||
enum {
|
enum {
|
||||||
|
@ -339,6 +336,7 @@ typedef struct STableScanInfo {
|
||||||
int8_t scanMode;
|
int8_t scanMode;
|
||||||
int8_t assignBlockUid;
|
int8_t assignBlockUid;
|
||||||
bool hasGroupByTag;
|
bool hasGroupByTag;
|
||||||
|
bool countOnly;
|
||||||
} STableScanInfo;
|
} STableScanInfo;
|
||||||
|
|
||||||
typedef struct STableMergeScanInfo {
|
typedef struct STableMergeScanInfo {
|
||||||
|
@ -485,12 +483,6 @@ typedef struct SStreamScanInfo {
|
||||||
} SStreamScanInfo;
|
} SStreamScanInfo;
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
// int8_t subType;
|
|
||||||
// bool withMeta;
|
|
||||||
// int64_t suid;
|
|
||||||
// int64_t snapVersion;
|
|
||||||
// void *metaInfo;
|
|
||||||
// void *dataInfo;
|
|
||||||
SVnode* vnode;
|
SVnode* vnode;
|
||||||
SSDataBlock pRes; // result SSDataBlock
|
SSDataBlock pRes; // result SSDataBlock
|
||||||
STsdbReader* dataReader;
|
STsdbReader* dataReader;
|
||||||
|
@ -559,6 +551,7 @@ typedef struct SStreamIntervalOperatorInfo {
|
||||||
STimeWindowAggSupp twAggSup;
|
STimeWindowAggSupp twAggSup;
|
||||||
bool invertible;
|
bool invertible;
|
||||||
bool ignoreExpiredData;
|
bool ignoreExpiredData;
|
||||||
|
bool ignoreExpiredDataSaved;
|
||||||
SArray* pDelWins; // SWinRes
|
SArray* pDelWins; // SWinRes
|
||||||
int32_t delIndex;
|
int32_t delIndex;
|
||||||
SSDataBlock* pDelRes;
|
SSDataBlock* pDelRes;
|
||||||
|
@ -620,6 +613,7 @@ typedef struct SStreamSessionAggOperatorInfo {
|
||||||
SPhysiNode* pPhyNode; // create new child
|
SPhysiNode* pPhyNode; // create new child
|
||||||
bool isFinal;
|
bool isFinal;
|
||||||
bool ignoreExpiredData;
|
bool ignoreExpiredData;
|
||||||
|
bool ignoreExpiredDataSaved;
|
||||||
SArray* pUpdated;
|
SArray* pUpdated;
|
||||||
SSHashObj* pStUpdated;
|
SSHashObj* pStUpdated;
|
||||||
} SStreamSessionAggOperatorInfo;
|
} SStreamSessionAggOperatorInfo;
|
||||||
|
@ -637,6 +631,7 @@ typedef struct SStreamStateAggOperatorInfo {
|
||||||
void* pDelIterator;
|
void* pDelIterator;
|
||||||
SArray* pChildren; // cache for children's result;
|
SArray* pChildren; // cache for children's result;
|
||||||
bool ignoreExpiredData;
|
bool ignoreExpiredData;
|
||||||
|
bool ignoreExpiredDataSaved;
|
||||||
SArray* pUpdated;
|
SArray* pUpdated;
|
||||||
SSHashObj* pSeUpdated;
|
SSHashObj* pSeUpdated;
|
||||||
} SStreamStateAggOperatorInfo;
|
} SStreamStateAggOperatorInfo;
|
||||||
|
@ -690,6 +685,8 @@ typedef struct SStreamFillOperatorInfo {
|
||||||
#define OPTR_IS_OPENED(_optr) (((_optr)->status & OP_OPENED) == OP_OPENED)
|
#define OPTR_IS_OPENED(_optr) (((_optr)->status & OP_OPENED) == OP_OPENED)
|
||||||
#define OPTR_SET_OPENED(_optr) ((_optr)->status |= OP_OPENED)
|
#define OPTR_SET_OPENED(_optr) ((_optr)->status |= OP_OPENED)
|
||||||
|
|
||||||
|
SExecTaskInfo* doCreateExecTaskInfo(uint64_t queryId, uint64_t taskId, int32_t vgId, EOPTR_EXEC_MODEL model, char* dbFName);
|
||||||
|
|
||||||
SOperatorFpSet createOperatorFpSet(__optr_open_fn_t openFn, __optr_fn_t nextFn, __optr_fn_t cleanup,
|
SOperatorFpSet createOperatorFpSet(__optr_open_fn_t openFn, __optr_fn_t nextFn, __optr_fn_t cleanup,
|
||||||
__optr_close_fn_t closeFn, __optr_reqBuf_fn_t reqBufFn, __optr_explain_fn_t explain);
|
__optr_close_fn_t closeFn, __optr_reqBuf_fn_t reqBufFn, __optr_explain_fn_t explain);
|
||||||
int32_t optrDummyOpenFn(SOperatorInfo* pOperator);
|
int32_t optrDummyOpenFn(SOperatorInfo* pOperator);
|
||||||
|
|
|
@ -92,8 +92,8 @@ typedef struct SResultRowData {
|
||||||
|
|
||||||
typedef struct SStreamFillLinearInfo {
|
typedef struct SStreamFillLinearInfo {
|
||||||
TSKEY nextEnd;
|
TSKEY nextEnd;
|
||||||
SArray* pDeltaVal; // double. value for Fill(linear).
|
SArray* pEndPoints;
|
||||||
SArray* pNextDeltaVal; // double. value for Fill(linear).
|
SArray* pNextEndPoints;
|
||||||
int64_t winIndex;
|
int64_t winIndex;
|
||||||
bool hasNext;
|
bool hasNext;
|
||||||
} SStreamFillLinearInfo;
|
} SStreamFillLinearInfo;
|
||||||
|
|
|
@ -212,6 +212,11 @@ static SSDataBlock* loadRemoteData(SOperatorInfo* pOperator) {
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
doFilter(pBlock, pOperator->exprSupp.pFilterInfo, NULL);
|
||||||
|
if (blockDataGetNumOfRows(pBlock) == 0) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
SLimitInfo* pLimitInfo = &pExchangeInfo->limitInfo;
|
SLimitInfo* pLimitInfo = &pExchangeInfo->limitInfo;
|
||||||
if (hasLimitOffsetInfo(pLimitInfo)) {
|
if (hasLimitOffsetInfo(pLimitInfo)) {
|
||||||
int32_t status = handleLimitOffset(pOperator, pLimitInfo, pBlock, false);
|
int32_t status = handleLimitOffset(pOperator, pLimitInfo, pBlock, false);
|
||||||
|
@ -303,6 +308,11 @@ SOperatorInfo* createExchangeOperatorInfo(void* pTransporter, SExchangePhysiNode
|
||||||
pTaskInfo);
|
pTaskInfo);
|
||||||
pOperator->exprSupp.numOfExprs = taosArrayGetSize(pInfo->pDummyBlock->pDataBlock);
|
pOperator->exprSupp.numOfExprs = taosArrayGetSize(pInfo->pDummyBlock->pDataBlock);
|
||||||
|
|
||||||
|
code = filterInitFromNode((SNode*)pExNode->node.pConditions, &pOperator->exprSupp.pFilterInfo, 0);
|
||||||
|
if (code != TSDB_CODE_SUCCESS) {
|
||||||
|
goto _error;
|
||||||
|
}
|
||||||
|
|
||||||
pOperator->fpSet =
|
pOperator->fpSet =
|
||||||
createOperatorFpSet(prepareLoadRemoteData, loadRemoteData, NULL, destroyExchangeOperatorInfo, optrDefaultBufFn, NULL);
|
createOperatorFpSet(prepareLoadRemoteData, loadRemoteData, NULL, destroyExchangeOperatorInfo, optrDefaultBufFn, NULL);
|
||||||
return pOperator;
|
return pOperator;
|
||||||
|
|
|
@ -34,7 +34,7 @@ struct STableListInfo {
|
||||||
int32_t numOfOuputGroups; // the data block will be generated one by one
|
int32_t numOfOuputGroups; // the data block will be generated one by one
|
||||||
int32_t* groupOffset; // keep the offset value for each group in the tableList
|
int32_t* groupOffset; // keep the offset value for each group in the tableList
|
||||||
SArray* pTableList;
|
SArray* pTableList;
|
||||||
SHashObj* map; // speedup acquire the tableQueryInfo by table uid
|
SHashObj* map; // speedup acquire the tableQueryInfo by table uid
|
||||||
uint64_t suid;
|
uint64_t suid;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -571,6 +571,10 @@ int32_t getColInfoResultForGroupby(void* metaHandle, SNodeList* group, STableLis
|
||||||
memcpy(pStart, data, len);
|
memcpy(pStart, data, len);
|
||||||
pStart += len;
|
pStart += len;
|
||||||
} else if (IS_VAR_DATA_TYPE(pValue->info.type)) {
|
} else if (IS_VAR_DATA_TYPE(pValue->info.type)) {
|
||||||
|
if (varDataTLen(data) > pValue->info.bytes) {
|
||||||
|
code = TSDB_CODE_TDB_INVALID_TABLE_SCHEMA_VER;
|
||||||
|
goto end;
|
||||||
|
}
|
||||||
memcpy(pStart, data, varDataTLen(data));
|
memcpy(pStart, data, varDataTLen(data));
|
||||||
pStart += varDataTLen(data);
|
pStart += varDataTLen(data);
|
||||||
} else {
|
} else {
|
||||||
|
@ -1800,6 +1804,21 @@ STableKeyInfo* tableListGetInfo(const STableListInfo* pTableList, int32_t index)
|
||||||
return taosArrayGet(pTableList->pTableList, index);
|
return taosArrayGet(pTableList->pTableList, index);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int32_t tableListFind(const STableListInfo* pTableList, uint64_t uid, int32_t startIndex) {
|
||||||
|
int32_t numOfTables = taosArrayGetSize(pTableList->pTableList);
|
||||||
|
if (startIndex >= numOfTables) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (int32_t i = startIndex; i < numOfTables; ++i) {
|
||||||
|
STableKeyInfo* p = taosArrayGet(pTableList->pTableList, i);
|
||||||
|
if (p->uid == uid) {
|
||||||
|
return i;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
uint64_t getTableGroupId(const STableListInfo* pTableList, uint64_t tableUid) {
|
uint64_t getTableGroupId(const STableListInfo* pTableList, uint64_t tableUid) {
|
||||||
int32_t* slot = taosHashGet(pTableList->map, &tableUid, sizeof(tableUid));
|
int32_t* slot = taosHashGet(pTableList->map, &tableUid, sizeof(tableUid));
|
||||||
ASSERT(pTableList->map != NULL && slot != NULL);
|
ASSERT(pTableList->map != NULL && slot != NULL);
|
||||||
|
@ -2042,7 +2061,7 @@ int32_t createScanTableListInfo(SScanPhysiNode* pScanNode, SNodeList* pGroupTags
|
||||||
|
|
||||||
void printDataBlock(SSDataBlock* pBlock, const char* flag) {
|
void printDataBlock(SSDataBlock* pBlock, const char* flag) {
|
||||||
if (!pBlock || pBlock->info.rows == 0) {
|
if (!pBlock || pBlock->info.rows == 0) {
|
||||||
qDebug("===stream===printDataBlock: Block is Null or Empty");
|
qDebug("===stream===%s: Block is Null or Empty", flag);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
char* pBuf = NULL;
|
char* pBuf = NULL;
|
||||||
|
|
|
@ -242,30 +242,28 @@ int32_t qSetSMAInput(qTaskInfo_t tinfo, const void* pBlocks, size_t numOfBlocks,
|
||||||
return code;
|
return code;
|
||||||
}
|
}
|
||||||
|
|
||||||
qTaskInfo_t qCreateQueueExecTaskInfo(void* msg, SReadHandle* pReaderHandle, int32_t vgId, int32_t* numOfCols, SSchemaWrapper** pSchema) {
|
qTaskInfo_t qCreateQueueExecTaskInfo(void* msg, SReadHandle* pReaderHandle, int32_t vgId, int32_t* numOfCols, uint64_t id) {
|
||||||
if (msg == NULL) {
|
if (msg == NULL) { // create raw scan
|
||||||
// create raw scan
|
SExecTaskInfo* pTaskInfo = doCreateExecTaskInfo(0, id, vgId, OPTR_EXEC_MODEL_QUEUE, "");
|
||||||
SExecTaskInfo* pTaskInfo = taosMemoryCalloc(1, sizeof(SExecTaskInfo));
|
|
||||||
if (NULL == pTaskInfo) {
|
if (NULL == pTaskInfo) {
|
||||||
terrno = TSDB_CODE_OUT_OF_MEMORY;
|
terrno = TSDB_CODE_OUT_OF_MEMORY;
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
setTaskStatus(pTaskInfo, TASK_NOT_COMPLETED);
|
|
||||||
|
|
||||||
pTaskInfo->cost.created = taosGetTimestampUs();
|
|
||||||
pTaskInfo->execModel = OPTR_EXEC_MODEL_QUEUE;
|
|
||||||
pTaskInfo->pRoot = createRawScanOperatorInfo(pReaderHandle, pTaskInfo);
|
pTaskInfo->pRoot = createRawScanOperatorInfo(pReaderHandle, pTaskInfo);
|
||||||
if (NULL == pTaskInfo->pRoot) {
|
if (NULL == pTaskInfo->pRoot) {
|
||||||
terrno = TSDB_CODE_OUT_OF_MEMORY;
|
terrno = TSDB_CODE_OUT_OF_MEMORY;
|
||||||
taosMemoryFree(pTaskInfo);
|
taosMemoryFree(pTaskInfo);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
qDebug("create raw scan task info completed, vgId:%d, %s", vgId, GET_TASKID(pTaskInfo));
|
||||||
return pTaskInfo;
|
return pTaskInfo;
|
||||||
}
|
}
|
||||||
|
|
||||||
struct SSubplan* pPlan = NULL;
|
struct SSubplan* pPlan = NULL;
|
||||||
int32_t code = qStringToSubplan(msg, &pPlan);
|
|
||||||
|
int32_t code = qStringToSubplan(msg, &pPlan);
|
||||||
if (code != TSDB_CODE_SUCCESS) {
|
if (code != TSDB_CODE_SUCCESS) {
|
||||||
terrno = code;
|
terrno = code;
|
||||||
return NULL;
|
return NULL;
|
||||||
|
@ -292,9 +290,6 @@ qTaskInfo_t qCreateQueueExecTaskInfo(void* msg, SReadHandle* pReaderHandle, int3
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (pSchema) {
|
|
||||||
*pSchema = tCloneSSchemaWrapper(((SExecTaskInfo*)pTaskInfo)->schemaInfo.qsw);
|
|
||||||
}
|
|
||||||
return pTaskInfo;
|
return pTaskInfo;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -410,6 +405,7 @@ int32_t qUpdateQualifiedTableId(qTaskInfo_t tinfo, const SArray* tableIdList, bo
|
||||||
}
|
}
|
||||||
|
|
||||||
STableListInfo* pTableListInfo = pTaskInfo->pTableInfoList;
|
STableListInfo* pTableListInfo = pTaskInfo->pTableInfoList;
|
||||||
|
taosWLockLatch(&pTaskInfo->lock);
|
||||||
|
|
||||||
for (int32_t i = 0; i < numOfQualifiedTables; ++i) {
|
for (int32_t i = 0; i < numOfQualifiedTables; ++i) {
|
||||||
uint64_t* uid = taosArrayGet(qa, i);
|
uint64_t* uid = taosArrayGet(qa, i);
|
||||||
|
@ -424,6 +420,7 @@ int32_t qUpdateQualifiedTableId(qTaskInfo_t tinfo, const SArray* tableIdList, bo
|
||||||
if (code != TSDB_CODE_SUCCESS) {
|
if (code != TSDB_CODE_SUCCESS) {
|
||||||
taosMemoryFree(keyBuf);
|
taosMemoryFree(keyBuf);
|
||||||
taosArrayDestroy(qa);
|
taosArrayDestroy(qa);
|
||||||
|
taosWUnLockLatch(&pTaskInfo->lock);
|
||||||
return code;
|
return code;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -445,6 +442,7 @@ int32_t qUpdateQualifiedTableId(qTaskInfo_t tinfo, const SArray* tableIdList, bo
|
||||||
tableListAddTableInfo(pTableListInfo, keyInfo.uid, keyInfo.groupId);
|
tableListAddTableInfo(pTableListInfo, keyInfo.uid, keyInfo.groupId);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
taosWUnLockLatch(&pTaskInfo->lock);
|
||||||
if (keyBuf != NULL) {
|
if (keyBuf != NULL) {
|
||||||
taosMemoryFree(keyBuf);
|
taosMemoryFree(keyBuf);
|
||||||
}
|
}
|
||||||
|
@ -452,7 +450,9 @@ int32_t qUpdateQualifiedTableId(qTaskInfo_t tinfo, const SArray* tableIdList, bo
|
||||||
taosArrayDestroy(qa);
|
taosArrayDestroy(qa);
|
||||||
} else { // remove the table id in current list
|
} else { // remove the table id in current list
|
||||||
qDebug(" %d remove child tables from the stream scanner", (int32_t)taosArrayGetSize(tableIdList));
|
qDebug(" %d remove child tables from the stream scanner", (int32_t)taosArrayGetSize(tableIdList));
|
||||||
|
taosWLockLatch(&pTaskInfo->lock);
|
||||||
code = tqReaderRemoveTbUidList(pScanInfo->tqReader, tableIdList);
|
code = tqReaderRemoveTbUidList(pScanInfo->tqReader, tableIdList);
|
||||||
|
taosWUnLockLatch(&pTaskInfo->lock);
|
||||||
}
|
}
|
||||||
|
|
||||||
return code;
|
return code;
|
||||||
|
@ -749,6 +749,23 @@ int32_t qAsyncKillTask(qTaskInfo_t qinfo, int32_t rspCode) {
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int32_t qKillTask(qTaskInfo_t tinfo, int32_t rspCode) {
|
||||||
|
SExecTaskInfo* pTaskInfo = (SExecTaskInfo*)tinfo;
|
||||||
|
if (pTaskInfo == NULL) {
|
||||||
|
return TSDB_CODE_QRY_INVALID_QHANDLE;
|
||||||
|
}
|
||||||
|
|
||||||
|
qDebug("%s execTask async killed", GET_TASKID(pTaskInfo));
|
||||||
|
setTaskKilled(pTaskInfo, rspCode);
|
||||||
|
|
||||||
|
while(qTaskIsExecuting(pTaskInfo)) {
|
||||||
|
taosMsleep(10);
|
||||||
|
}
|
||||||
|
|
||||||
|
pTaskInfo->code = rspCode;
|
||||||
|
return TSDB_CODE_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
bool qTaskIsExecuting(qTaskInfo_t qinfo) {
|
bool qTaskIsExecuting(qTaskInfo_t qinfo) {
|
||||||
SExecTaskInfo* pTaskInfo = (SExecTaskInfo*)qinfo;
|
SExecTaskInfo* pTaskInfo = (SExecTaskInfo*)qinfo;
|
||||||
if (NULL == pTaskInfo) {
|
if (NULL == pTaskInfo) {
|
||||||
|
@ -888,7 +905,8 @@ int32_t qStreamSetParamForRecover(qTaskInfo_t tinfo) {
|
||||||
pInfo->twAggSup.deleteMarkSaved = pInfo->twAggSup.deleteMark;
|
pInfo->twAggSup.deleteMarkSaved = pInfo->twAggSup.deleteMark;
|
||||||
pInfo->twAggSup.calTrigger = STREAM_TRIGGER_AT_ONCE;
|
pInfo->twAggSup.calTrigger = STREAM_TRIGGER_AT_ONCE;
|
||||||
pInfo->twAggSup.deleteMark = INT64_MAX;
|
pInfo->twAggSup.deleteMark = INT64_MAX;
|
||||||
|
pInfo->ignoreExpiredDataSaved = pInfo->ignoreExpiredData;
|
||||||
|
pInfo->ignoreExpiredData = false;
|
||||||
} else if (pOperator->operatorType == QUERY_NODE_PHYSICAL_PLAN_STREAM_SESSION ||
|
} else if (pOperator->operatorType == QUERY_NODE_PHYSICAL_PLAN_STREAM_SESSION ||
|
||||||
pOperator->operatorType == QUERY_NODE_PHYSICAL_PLAN_STREAM_SEMI_SESSION ||
|
pOperator->operatorType == QUERY_NODE_PHYSICAL_PLAN_STREAM_SEMI_SESSION ||
|
||||||
pOperator->operatorType == QUERY_NODE_PHYSICAL_PLAN_STREAM_FINAL_SESSION) {
|
pOperator->operatorType == QUERY_NODE_PHYSICAL_PLAN_STREAM_FINAL_SESSION) {
|
||||||
|
@ -904,6 +922,8 @@ int32_t qStreamSetParamForRecover(qTaskInfo_t tinfo) {
|
||||||
pInfo->twAggSup.deleteMarkSaved = pInfo->twAggSup.deleteMark;
|
pInfo->twAggSup.deleteMarkSaved = pInfo->twAggSup.deleteMark;
|
||||||
pInfo->twAggSup.calTrigger = STREAM_TRIGGER_AT_ONCE;
|
pInfo->twAggSup.calTrigger = STREAM_TRIGGER_AT_ONCE;
|
||||||
pInfo->twAggSup.deleteMark = INT64_MAX;
|
pInfo->twAggSup.deleteMark = INT64_MAX;
|
||||||
|
pInfo->ignoreExpiredDataSaved = pInfo->ignoreExpiredData;
|
||||||
|
pInfo->ignoreExpiredData = false;
|
||||||
} else if (pOperator->operatorType == QUERY_NODE_PHYSICAL_PLAN_STREAM_STATE) {
|
} else if (pOperator->operatorType == QUERY_NODE_PHYSICAL_PLAN_STREAM_STATE) {
|
||||||
SStreamStateAggOperatorInfo* pInfo = pOperator->info;
|
SStreamStateAggOperatorInfo* pInfo = pOperator->info;
|
||||||
ASSERT(pInfo->twAggSup.calTrigger == STREAM_TRIGGER_AT_ONCE ||
|
ASSERT(pInfo->twAggSup.calTrigger == STREAM_TRIGGER_AT_ONCE ||
|
||||||
|
@ -917,6 +937,8 @@ int32_t qStreamSetParamForRecover(qTaskInfo_t tinfo) {
|
||||||
pInfo->twAggSup.deleteMarkSaved = pInfo->twAggSup.deleteMark;
|
pInfo->twAggSup.deleteMarkSaved = pInfo->twAggSup.deleteMark;
|
||||||
pInfo->twAggSup.calTrigger = STREAM_TRIGGER_AT_ONCE;
|
pInfo->twAggSup.calTrigger = STREAM_TRIGGER_AT_ONCE;
|
||||||
pInfo->twAggSup.deleteMark = INT64_MAX;
|
pInfo->twAggSup.deleteMark = INT64_MAX;
|
||||||
|
pInfo->ignoreExpiredDataSaved = pInfo->ignoreExpiredData;
|
||||||
|
pInfo->ignoreExpiredData = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
// iterate operator tree
|
// iterate operator tree
|
||||||
|
@ -944,35 +966,23 @@ int32_t qStreamRestoreParam(qTaskInfo_t tinfo) {
|
||||||
pOperator->operatorType == QUERY_NODE_PHYSICAL_PLAN_STREAM_SEMI_INTERVAL ||
|
pOperator->operatorType == QUERY_NODE_PHYSICAL_PLAN_STREAM_SEMI_INTERVAL ||
|
||||||
pOperator->operatorType == QUERY_NODE_PHYSICAL_PLAN_STREAM_FINAL_INTERVAL) {
|
pOperator->operatorType == QUERY_NODE_PHYSICAL_PLAN_STREAM_FINAL_INTERVAL) {
|
||||||
SStreamIntervalOperatorInfo* pInfo = pOperator->info;
|
SStreamIntervalOperatorInfo* pInfo = pOperator->info;
|
||||||
/*ASSERT(pInfo->twAggSup.calTrigger == STREAM_TRIGGER_AT_ONCE);*/
|
|
||||||
/*ASSERT(pInfo->twAggSup.deleteMark == INT64_MAX);*/
|
|
||||||
|
|
||||||
pInfo->twAggSup.calTrigger = pInfo->twAggSup.calTriggerSaved;
|
pInfo->twAggSup.calTrigger = pInfo->twAggSup.calTriggerSaved;
|
||||||
pInfo->twAggSup.deleteMark = pInfo->twAggSup.deleteMarkSaved;
|
pInfo->twAggSup.deleteMark = pInfo->twAggSup.deleteMarkSaved;
|
||||||
/*ASSERT(pInfo->twAggSup.calTrigger == STREAM_TRIGGER_AT_ONCE ||*/
|
pInfo->ignoreExpiredData = pInfo->ignoreExpiredDataSaved;
|
||||||
/*pInfo->twAggSup.calTrigger == STREAM_TRIGGER_WINDOW_CLOSE);*/
|
|
||||||
qInfo("restore stream param for interval: %d, %" PRId64, pInfo->twAggSup.calTrigger, pInfo->twAggSup.deleteMark);
|
qInfo("restore stream param for interval: %d, %" PRId64, pInfo->twAggSup.calTrigger, pInfo->twAggSup.deleteMark);
|
||||||
} else if (pOperator->operatorType == QUERY_NODE_PHYSICAL_PLAN_STREAM_SESSION ||
|
} else if (pOperator->operatorType == QUERY_NODE_PHYSICAL_PLAN_STREAM_SESSION ||
|
||||||
pOperator->operatorType == QUERY_NODE_PHYSICAL_PLAN_STREAM_SEMI_SESSION ||
|
pOperator->operatorType == QUERY_NODE_PHYSICAL_PLAN_STREAM_SEMI_SESSION ||
|
||||||
pOperator->operatorType == QUERY_NODE_PHYSICAL_PLAN_STREAM_FINAL_SESSION) {
|
pOperator->operatorType == QUERY_NODE_PHYSICAL_PLAN_STREAM_FINAL_SESSION) {
|
||||||
SStreamSessionAggOperatorInfo* pInfo = pOperator->info;
|
SStreamSessionAggOperatorInfo* pInfo = pOperator->info;
|
||||||
/*ASSERT(pInfo->twAggSup.calTrigger == STREAM_TRIGGER_AT_ONCE);*/
|
|
||||||
/*ASSERT(pInfo->twAggSup.deleteMark == INT64_MAX);*/
|
|
||||||
|
|
||||||
pInfo->twAggSup.calTrigger = pInfo->twAggSup.calTriggerSaved;
|
pInfo->twAggSup.calTrigger = pInfo->twAggSup.calTriggerSaved;
|
||||||
pInfo->twAggSup.deleteMark = pInfo->twAggSup.deleteMarkSaved;
|
pInfo->twAggSup.deleteMark = pInfo->twAggSup.deleteMarkSaved;
|
||||||
/*ASSERT(pInfo->twAggSup.calTrigger == STREAM_TRIGGER_AT_ONCE ||*/
|
pInfo->ignoreExpiredData = pInfo->ignoreExpiredDataSaved;
|
||||||
/*pInfo->twAggSup.calTrigger == STREAM_TRIGGER_WINDOW_CLOSE);*/
|
|
||||||
qInfo("restore stream param for session: %d, %" PRId64, pInfo->twAggSup.calTrigger, pInfo->twAggSup.deleteMark);
|
qInfo("restore stream param for session: %d, %" PRId64, pInfo->twAggSup.calTrigger, pInfo->twAggSup.deleteMark);
|
||||||
} else if (pOperator->operatorType == QUERY_NODE_PHYSICAL_PLAN_STREAM_STATE) {
|
} else if (pOperator->operatorType == QUERY_NODE_PHYSICAL_PLAN_STREAM_STATE) {
|
||||||
SStreamStateAggOperatorInfo* pInfo = pOperator->info;
|
SStreamStateAggOperatorInfo* pInfo = pOperator->info;
|
||||||
/*ASSERT(pInfo->twAggSup.calTrigger == STREAM_TRIGGER_AT_ONCE);*/
|
|
||||||
/*ASSERT(pInfo->twAggSup.deleteMark == INT64_MAX);*/
|
|
||||||
|
|
||||||
pInfo->twAggSup.calTrigger = pInfo->twAggSup.calTriggerSaved;
|
pInfo->twAggSup.calTrigger = pInfo->twAggSup.calTriggerSaved;
|
||||||
pInfo->twAggSup.deleteMark = pInfo->twAggSup.deleteMarkSaved;
|
pInfo->twAggSup.deleteMark = pInfo->twAggSup.deleteMarkSaved;
|
||||||
/*ASSERT(pInfo->twAggSup.calTrigger == STREAM_TRIGGER_AT_ONCE ||*/
|
pInfo->ignoreExpiredData = pInfo->ignoreExpiredDataSaved;
|
||||||
/*pInfo->twAggSup.calTrigger == STREAM_TRIGGER_WINDOW_CLOSE);*/
|
|
||||||
qInfo("restore stream param for state: %d, %" PRId64, pInfo->twAggSup.calTrigger, pInfo->twAggSup.deleteMark);
|
qInfo("restore stream param for state: %d, %" PRId64, pInfo->twAggSup.calTrigger, pInfo->twAggSup.deleteMark);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -990,6 +1000,7 @@ int32_t qStreamRestoreParam(qTaskInfo_t tinfo) {
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool qStreamRecoverScanFinished(qTaskInfo_t tinfo) {
|
bool qStreamRecoverScanFinished(qTaskInfo_t tinfo) {
|
||||||
SExecTaskInfo* pTaskInfo = (SExecTaskInfo*)tinfo;
|
SExecTaskInfo* pTaskInfo = (SExecTaskInfo*)tinfo;
|
||||||
return pTaskInfo->streamInfo.recoverScanFinished;
|
return pTaskInfo->streamInfo.recoverScanFinished;
|
||||||
|
@ -1070,8 +1081,11 @@ int32_t qStreamSetScanMemData(qTaskInfo_t tinfo, SPackedData submit) {
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t qStreamPrepareScan(qTaskInfo_t tinfo, STqOffsetVal* pOffset, int8_t subType) {
|
int32_t qStreamPrepareScan(qTaskInfo_t tinfo, STqOffsetVal* pOffset, int8_t subType) {
|
||||||
SExecTaskInfo* pTaskInfo = (SExecTaskInfo*)tinfo;
|
SExecTaskInfo* pTaskInfo = (SExecTaskInfo*)tinfo;
|
||||||
SOperatorInfo* pOperator = pTaskInfo->pRoot;
|
SOperatorInfo* pOperator = pTaskInfo->pRoot;
|
||||||
|
STableListInfo* pTableListInfo = pTaskInfo->pTableInfoList;
|
||||||
|
const char* id = GET_TASKID(pTaskInfo);
|
||||||
|
|
||||||
pTaskInfo->streamInfo.prepareStatus = *pOffset;
|
pTaskInfo->streamInfo.prepareStatus = *pOffset;
|
||||||
pTaskInfo->streamInfo.returned = 0;
|
pTaskInfo->streamInfo.returned = 0;
|
||||||
|
|
||||||
|
@ -1084,21 +1098,24 @@ int32_t qStreamPrepareScan(qTaskInfo_t tinfo, STqOffsetVal* pOffset, int8_t subT
|
||||||
|
|
||||||
// TODO add more check
|
// TODO add more check
|
||||||
if (pOperator->operatorType != QUERY_NODE_PHYSICAL_PLAN_STREAM_SCAN) {
|
if (pOperator->operatorType != QUERY_NODE_PHYSICAL_PLAN_STREAM_SCAN) {
|
||||||
if(pOperator->numOfDownstream != 1){
|
if (pOperator->numOfDownstream != 1) {
|
||||||
qError("pOperator->numOfDownstream != 1:%d", pOperator->numOfDownstream);
|
qError("invalid operator, number of downstream:%d, %s", pOperator->numOfDownstream, id);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
pOperator = pOperator->pDownstream[0];
|
pOperator = pOperator->pDownstream[0];
|
||||||
}
|
}
|
||||||
|
|
||||||
SStreamScanInfo* pInfo = pOperator->info;
|
SStreamScanInfo* pInfo = pOperator->info;
|
||||||
|
STableScanInfo* pScanInfo = pInfo->pTableScanOp->info;
|
||||||
|
STableScanBase* pScanBaseInfo = &pScanInfo->base;
|
||||||
|
|
||||||
if (pOffset->type == TMQ_OFFSET__LOG) {
|
if (pOffset->type == TMQ_OFFSET__LOG) {
|
||||||
STableScanInfo* pTSInfo = pInfo->pTableScanOp->info;
|
tsdbReaderClose(pScanBaseInfo->dataReader);
|
||||||
tsdbReaderClose(pTSInfo->base.dataReader);
|
pScanBaseInfo->dataReader = NULL;
|
||||||
pTSInfo->base.dataReader = NULL;
|
|
||||||
// let's seek to the next version in wal file
|
// let's seek to the next version in wal file
|
||||||
if (tqSeekVer(pInfo->tqReader, pOffset->version + 1, pTaskInfo->id.str) < 0) {
|
if (tqSeekVer(pInfo->tqReader, pOffset->version + 1, pTaskInfo->id.str) < 0) {
|
||||||
qError("tqSeekVer failed ver:%" PRId64, pOffset->version + 1);
|
qError("tqSeekVer failed ver:%"PRId64", %s", pOffset->version + 1, id);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
} else if (pOffset->type == TMQ_OFFSET__SNAPSHOT_DATA) {
|
} else if (pOffset->type == TMQ_OFFSET__SNAPSHOT_DATA) {
|
||||||
|
@ -1106,121 +1123,125 @@ int32_t qStreamPrepareScan(qTaskInfo_t tinfo, STqOffsetVal* pOffset, int8_t subT
|
||||||
// those data are from the snapshot in tsdb, besides the data in the wal file.
|
// those data are from the snapshot in tsdb, besides the data in the wal file.
|
||||||
int64_t uid = pOffset->uid;
|
int64_t uid = pOffset->uid;
|
||||||
int64_t ts = pOffset->ts;
|
int64_t ts = pOffset->ts;
|
||||||
|
int32_t index = 0;
|
||||||
|
|
||||||
|
// this value may be changed if new tables are created
|
||||||
|
taosRLockLatch(&pTaskInfo->lock);
|
||||||
|
int32_t numOfTables = tableListGetSize(pTableListInfo);
|
||||||
|
|
||||||
if (uid == 0) {
|
if (uid == 0) {
|
||||||
if (tableListGetSize(pTaskInfo->pTableInfoList) != 0) {
|
if (numOfTables != 0) {
|
||||||
STableKeyInfo* pTableInfo = tableListGetInfo(pTaskInfo->pTableInfoList, 0);
|
STableKeyInfo* pTableInfo = tableListGetInfo(pTableListInfo, 0);
|
||||||
uid = pTableInfo->uid;
|
uid = pTableInfo->uid;
|
||||||
ts = INT64_MIN;
|
ts = INT64_MIN;
|
||||||
|
pScanInfo->currentTable = 0;
|
||||||
} else {
|
} else {
|
||||||
qError("uid == 0 and tablelist size is 0");
|
taosRUnLockLatch(&pTaskInfo->lock);
|
||||||
|
qError("no table in table list, %s", id);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/*if (pTaskInfo->streamInfo.lastStatus.type != TMQ_OFFSET__SNAPSHOT_DATA ||*/
|
|
||||||
/*pTaskInfo->streamInfo.lastStatus.uid != uid || pTaskInfo->streamInfo.lastStatus.ts != ts) {*/
|
|
||||||
STableScanInfo* pTableScanInfo = pInfo->pTableScanOp->info;
|
|
||||||
int32_t numOfTables = tableListGetSize(pTaskInfo->pTableInfoList);
|
|
||||||
|
|
||||||
qDebug("switch to table uid:%" PRId64 " ts:%" PRId64 "% "PRId64 " rows returned", uid, ts, pInfo->pTableScanOp->resultInfo.totalRows);
|
|
||||||
pInfo->pTableScanOp->resultInfo.totalRows = 0;
|
pInfo->pTableScanOp->resultInfo.totalRows = 0;
|
||||||
|
|
||||||
bool found = false;
|
// start from current accessed position
|
||||||
for (int32_t i = 0; i < numOfTables; i++) {
|
// we cannot start from the pScanInfo->currentTable, since the commit offset may cause the rollback of the start
|
||||||
STableKeyInfo* pTableInfo = tableListGetInfo(pTaskInfo->pTableInfoList, i);
|
// position, let's find it from the beginning.
|
||||||
if (pTableInfo->uid == uid) {
|
index = tableListFind(pTableListInfo, uid, 0);
|
||||||
found = true;
|
taosRUnLockLatch(&pTaskInfo->lock);
|
||||||
pTableScanInfo->currentTable = i;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// TODO after dropping table, table may not found
|
if (index >= 0) {
|
||||||
if(!found){
|
pScanInfo->currentTable = index;
|
||||||
qError("uid not found in tablelist %" PRId64, uid);
|
} else {
|
||||||
|
qError("vgId:%d uid:%" PRIu64 " not found in table list, total:%d, index:%d %s", pTaskInfo->id.vgId, uid,
|
||||||
|
numOfTables, pScanInfo->currentTable, id);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (pTableScanInfo->base.dataReader == NULL) {
|
STableKeyInfo keyInfo = {.uid = uid};
|
||||||
STableKeyInfo* pList = tableListGetInfo(pTaskInfo->pTableInfoList, 0);
|
int64_t oldSkey = pScanBaseInfo->cond.twindows.skey;
|
||||||
int32_t num = tableListGetSize(pTaskInfo->pTableInfoList);
|
|
||||||
|
|
||||||
if (tsdbReaderOpen(pTableScanInfo->base.readHandle.vnode, &pTableScanInfo->base.cond, pList, num,
|
// let's start from the next ts that returned to consumer.
|
||||||
pTableScanInfo->pResBlock, &pTableScanInfo->base.dataReader, NULL) < 0 ||
|
pScanBaseInfo->cond.twindows.skey = ts + 1;
|
||||||
pTableScanInfo->base.dataReader == NULL) {
|
pScanInfo->scanTimes = 0;
|
||||||
qError("tsdbReaderOpen failed. uid:%" PRIi64, pOffset->uid);
|
|
||||||
|
if (pScanBaseInfo->dataReader == NULL) {
|
||||||
|
int32_t code = tsdbReaderOpen(pScanBaseInfo->readHandle.vnode, &pScanBaseInfo->cond, &keyInfo, 1,
|
||||||
|
pScanInfo->pResBlock, &pScanBaseInfo->dataReader, id, false);
|
||||||
|
if (code != TSDB_CODE_SUCCESS) {
|
||||||
|
qError("prepare read tsdb snapshot failed, uid:%" PRId64 ", code:%s %s", pOffset->uid, tstrerror(code), id);
|
||||||
|
terrno = code;
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
qDebug("tsdb reader created with offset(snapshot) uid:%" PRId64 " ts:%" PRId64 " table index:%d, total:%d, %s",
|
||||||
|
uid, pScanBaseInfo->cond.twindows.skey, pScanInfo->currentTable, numOfTables, id);
|
||||||
|
} else {
|
||||||
|
tsdbSetTableList(pScanBaseInfo->dataReader, &keyInfo, 1);
|
||||||
|
tsdbReaderReset(pScanBaseInfo->dataReader, &pScanBaseInfo->cond);
|
||||||
|
qDebug("tsdb reader offset seek snapshot to uid:%" PRId64 " ts %" PRId64 " table index:%d numOfTable:%d, %s",
|
||||||
|
uid, pScanBaseInfo->cond.twindows.skey, pScanInfo->currentTable, numOfTables, id);
|
||||||
}
|
}
|
||||||
|
|
||||||
STableKeyInfo tki = {.uid = uid};
|
// restore the key value
|
||||||
tsdbSetTableList(pTableScanInfo->base.dataReader, &tki, 1);
|
pScanBaseInfo->cond.twindows.skey = oldSkey;
|
||||||
int64_t oldSkey = pTableScanInfo->base.cond.twindows.skey;
|
|
||||||
pTableScanInfo->base.cond.twindows.skey = ts + 1;
|
|
||||||
tsdbReaderReset(pTableScanInfo->base.dataReader, &pTableScanInfo->base.cond);
|
|
||||||
pTableScanInfo->base.cond.twindows.skey = oldSkey;
|
|
||||||
pTableScanInfo->scanTimes = 0;
|
|
||||||
|
|
||||||
qDebug("tsdb reader offset seek snapshot to uid:%" PRId64 " ts %" PRId64 ", table cur set to %d , all table num %d", uid,
|
|
||||||
ts, pTableScanInfo->currentTable, numOfTables);
|
|
||||||
} else {
|
} else {
|
||||||
qError("invalid pOffset->type:%d", pOffset->type);
|
qError("invalid pOffset->type:%d, %s", pOffset->type, id);
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
} else if (pOffset->type == TMQ_OFFSET__SNAPSHOT_DATA) {
|
|
||||||
SStreamRawScanInfo* pInfo = pOperator->info;
|
|
||||||
SSnapContext* sContext = pInfo->sContext;
|
|
||||||
if (setForSnapShot(sContext, pOffset->uid) != 0) {
|
|
||||||
qError("setDataForSnapShot error. uid:%" PRIi64, pOffset->uid);
|
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
SMetaTableInfo mtInfo = getUidfromSnapShot(sContext);
|
} else { // subType == TOPIC_SUB_TYPE__TABLE/TOPIC_SUB_TYPE__DB
|
||||||
tsdbReaderClose(pInfo->dataReader);
|
if (pOffset->type == TMQ_OFFSET__SNAPSHOT_DATA) {
|
||||||
pInfo->dataReader = NULL;
|
SStreamRawScanInfo* pInfo = pOperator->info;
|
||||||
|
SSnapContext* sContext = pInfo->sContext;
|
||||||
|
if (setForSnapShot(sContext, pOffset->uid) != 0) {
|
||||||
|
qError("setDataForSnapShot error. uid:%" PRId64" , %s", pOffset->uid, id);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
cleanupQueryTableDataCond(&pTaskInfo->streamInfo.tableCond);
|
SMetaTableInfo mtInfo = getUidfromSnapShot(sContext);
|
||||||
tableListClear(pTaskInfo->pTableInfoList);
|
tsdbReaderClose(pInfo->dataReader);
|
||||||
|
pInfo->dataReader = NULL;
|
||||||
|
|
||||||
if (mtInfo.uid == 0) {
|
cleanupQueryTableDataCond(&pTaskInfo->streamInfo.tableCond);
|
||||||
return 0; // no data
|
tableListClear(pTableListInfo);
|
||||||
|
|
||||||
|
if (mtInfo.uid == 0) {
|
||||||
|
return 0; // no data
|
||||||
|
}
|
||||||
|
|
||||||
|
initQueryTableDataCondForTmq(&pTaskInfo->streamInfo.tableCond, sContext, &mtInfo);
|
||||||
|
pTaskInfo->streamInfo.tableCond.twindows.skey = pOffset->ts;
|
||||||
|
|
||||||
|
tableListAddTableInfo(pTableListInfo, mtInfo.uid, 0);
|
||||||
|
|
||||||
|
STableKeyInfo* pList = tableListGetInfo(pTableListInfo, 0);
|
||||||
|
int32_t size = tableListGetSize(pTableListInfo);
|
||||||
|
|
||||||
|
tsdbReaderOpen(pInfo->vnode, &pTaskInfo->streamInfo.tableCond, pList, size, NULL, &pInfo->dataReader, NULL, false);
|
||||||
|
|
||||||
|
cleanupQueryTableDataCond(&pTaskInfo->streamInfo.tableCond);
|
||||||
|
strcpy(pTaskInfo->streamInfo.tbName, mtInfo.tbName);
|
||||||
|
tDeleteSSchemaWrapper(pTaskInfo->streamInfo.schema);
|
||||||
|
pTaskInfo->streamInfo.schema = mtInfo.schema;
|
||||||
|
|
||||||
|
qDebug("tmqsnap qStreamPrepareScan snapshot data uid:%" PRId64 " ts %" PRId64" %s", mtInfo.uid, pOffset->ts, id);
|
||||||
|
} else if (pOffset->type == TMQ_OFFSET__SNAPSHOT_META) {
|
||||||
|
SStreamRawScanInfo* pInfo = pOperator->info;
|
||||||
|
SSnapContext* sContext = pInfo->sContext;
|
||||||
|
if (setForSnapShot(sContext, pOffset->uid) != 0) {
|
||||||
|
qError("setForSnapShot error. uid:%" PRIu64 " ,version:%" PRId64, pOffset->uid, pOffset->version);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
qDebug("tmqsnap qStreamPrepareScan snapshot meta uid:%" PRId64 " ts %" PRId64 " %s", pOffset->uid, pOffset->ts, id);
|
||||||
|
} else if (pOffset->type == TMQ_OFFSET__LOG) {
|
||||||
|
SStreamRawScanInfo* pInfo = pOperator->info;
|
||||||
|
tsdbReaderClose(pInfo->dataReader);
|
||||||
|
pInfo->dataReader = NULL;
|
||||||
|
qDebug("tmqsnap qStreamPrepareScan snapshot log, %s", id);
|
||||||
}
|
}
|
||||||
|
|
||||||
initQueryTableDataCondForTmq(&pTaskInfo->streamInfo.tableCond, sContext, &mtInfo);
|
|
||||||
pTaskInfo->streamInfo.tableCond.twindows.skey = pOffset->ts;
|
|
||||||
|
|
||||||
if (pTaskInfo->pTableInfoList == NULL) {
|
|
||||||
pTaskInfo->pTableInfoList = tableListCreate();
|
|
||||||
}
|
|
||||||
|
|
||||||
tableListAddTableInfo(pTaskInfo->pTableInfoList, mtInfo.uid, 0);
|
|
||||||
|
|
||||||
STableKeyInfo* pList = tableListGetInfo(pTaskInfo->pTableInfoList, 0);
|
|
||||||
int32_t size = tableListGetSize(pTaskInfo->pTableInfoList);
|
|
||||||
|
|
||||||
tsdbReaderOpen(pInfo->vnode, &pTaskInfo->streamInfo.tableCond, pList, size, NULL, &pInfo->dataReader, NULL);
|
|
||||||
|
|
||||||
cleanupQueryTableDataCond(&pTaskInfo->streamInfo.tableCond);
|
|
||||||
strcpy(pTaskInfo->streamInfo.tbName, mtInfo.tbName);
|
|
||||||
tDeleteSSchemaWrapper(pTaskInfo->streamInfo.schema);
|
|
||||||
pTaskInfo->streamInfo.schema = mtInfo.schema;
|
|
||||||
|
|
||||||
qDebug("tmqsnap qStreamPrepareScan snapshot data uid:%" PRId64 " ts %" PRId64, mtInfo.uid, pOffset->ts);
|
|
||||||
} else if (pOffset->type == TMQ_OFFSET__SNAPSHOT_META) {
|
|
||||||
SStreamRawScanInfo* pInfo = pOperator->info;
|
|
||||||
SSnapContext* sContext = pInfo->sContext;
|
|
||||||
if (setForSnapShot(sContext, pOffset->uid) != 0) {
|
|
||||||
qError("setForSnapShot error. uid:%" PRIu64 " ,version:%" PRId64, pOffset->uid, pOffset->version);
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
qDebug("tmqsnap qStreamPrepareScan snapshot meta uid:%" PRId64 " ts %" PRId64, pOffset->uid, pOffset->ts);
|
|
||||||
} else if (pOffset->type == TMQ_OFFSET__LOG) {
|
|
||||||
SStreamRawScanInfo* pInfo = pOperator->info;
|
|
||||||
tsdbReaderClose(pInfo->dataReader);
|
|
||||||
pInfo->dataReader = NULL;
|
|
||||||
qDebug("tmqsnap qStreamPrepareScan snapshot log");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -633,7 +633,7 @@ void setBlockSMAInfo(SqlFunctionCtx* pCtx, SExprInfo* pExprInfo, SSDataBlock* pB
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
bool isTaskKilled(SExecTaskInfo* pTaskInfo) { return (0 != pTaskInfo->code) ? true : false; }
|
bool isTaskKilled(SExecTaskInfo* pTaskInfo) { return (0 != pTaskInfo->code);}
|
||||||
|
|
||||||
void setTaskKilled(SExecTaskInfo* pTaskInfo, int32_t rspCode) { pTaskInfo->code = rspCode; }
|
void setTaskKilled(SExecTaskInfo* pTaskInfo, int32_t rspCode) { pTaskInfo->code = rspCode; }
|
||||||
|
|
||||||
|
@ -1201,7 +1201,7 @@ int32_t doCopyToSDataBlock(SExecTaskInfo* pTaskInfo, SSDataBlock* pBlock, SExprS
|
||||||
|
|
||||||
if (pBlock->info.rows + pRow->numOfRows > pBlock->info.capacity) {
|
if (pBlock->info.rows + pRow->numOfRows > pBlock->info.capacity) {
|
||||||
blockDataEnsureCapacity(pBlock, pBlock->info.rows + pRow->numOfRows);
|
blockDataEnsureCapacity(pBlock, pBlock->info.rows + pRow->numOfRows);
|
||||||
qDebug("datablock capacity not sufficient, expand to required:%d, current capacity:%d, %s",
|
qDebug("datablock capacity not sufficient, expand to required:%" PRId64 ", current capacity:%d, %s",
|
||||||
(pRow->numOfRows+pBlock->info.rows),
|
(pRow->numOfRows+pBlock->info.rows),
|
||||||
pBlock->info.capacity, GET_TASKID(pTaskInfo));
|
pBlock->info.capacity, GET_TASKID(pTaskInfo));
|
||||||
// todo set the pOperator->resultInfo size
|
// todo set the pOperator->resultInfo size
|
||||||
|
@ -1214,7 +1214,7 @@ int32_t doCopyToSDataBlock(SExecTaskInfo* pTaskInfo, SSDataBlock* pBlock, SExprS
|
||||||
pBlock->info.rows += pRow->numOfRows;
|
pBlock->info.rows += pRow->numOfRows;
|
||||||
}
|
}
|
||||||
|
|
||||||
qDebug("%s result generated, rows:%d, groupId:%" PRIu64, GET_TASKID(pTaskInfo), pBlock->info.rows,
|
qDebug("%s result generated, rows:%" PRId64 ", groupId:%" PRIu64, GET_TASKID(pTaskInfo), pBlock->info.rows,
|
||||||
pBlock->info.id.groupId);
|
pBlock->info.id.groupId);
|
||||||
pBlock->info.dataLoad = 1;
|
pBlock->info.dataLoad = 1;
|
||||||
blockDataUpdateTsWindow(pBlock, 0);
|
blockDataUpdateTsWindow(pBlock, 0);
|
||||||
|
@ -1974,7 +1974,7 @@ char* buildTaskId(uint64_t taskId, uint64_t queryId) {
|
||||||
return p;
|
return p;
|
||||||
}
|
}
|
||||||
|
|
||||||
static SExecTaskInfo* doCreateExecTaskInfo(uint64_t queryId, uint64_t taskId, int32_t vgId, EOPTR_EXEC_MODEL model, char* dbFName) {
|
SExecTaskInfo* doCreateExecTaskInfo(uint64_t queryId, uint64_t taskId, int32_t vgId, EOPTR_EXEC_MODEL model, char* dbFName) {
|
||||||
SExecTaskInfo* pTaskInfo = taosMemoryCalloc(1, sizeof(SExecTaskInfo));
|
SExecTaskInfo* pTaskInfo = taosMemoryCalloc(1, sizeof(SExecTaskInfo));
|
||||||
if (pTaskInfo == NULL) {
|
if (pTaskInfo == NULL) {
|
||||||
terrno = TSDB_CODE_OUT_OF_MEMORY;
|
terrno = TSDB_CODE_OUT_OF_MEMORY;
|
||||||
|
@ -1982,6 +1982,7 @@ static SExecTaskInfo* doCreateExecTaskInfo(uint64_t queryId, uint64_t taskId, in
|
||||||
}
|
}
|
||||||
|
|
||||||
setTaskStatus(pTaskInfo, TASK_NOT_COMPLETED);
|
setTaskStatus(pTaskInfo, TASK_NOT_COMPLETED);
|
||||||
|
pTaskInfo->cost.created = taosGetTimestampUs();
|
||||||
|
|
||||||
pTaskInfo->schemaInfo.dbname = taosStrdup(dbFName);
|
pTaskInfo->schemaInfo.dbname = taosStrdup(dbFName);
|
||||||
pTaskInfo->execModel = model;
|
pTaskInfo->execModel = model;
|
||||||
|
@ -1989,6 +1990,7 @@ static SExecTaskInfo* doCreateExecTaskInfo(uint64_t queryId, uint64_t taskId, in
|
||||||
pTaskInfo->stopInfo.pStopInfo = taosArrayInit(4, sizeof(SExchangeOpStopInfo));
|
pTaskInfo->stopInfo.pStopInfo = taosArrayInit(4, sizeof(SExchangeOpStopInfo));
|
||||||
pTaskInfo->pResultBlockList = taosArrayInit(128, POINTER_BYTES);
|
pTaskInfo->pResultBlockList = taosArrayInit(128, POINTER_BYTES);
|
||||||
|
|
||||||
|
taosInitRWLatch(&pTaskInfo->lock);
|
||||||
pTaskInfo->id.vgId = vgId;
|
pTaskInfo->id.vgId = vgId;
|
||||||
pTaskInfo->id.queryId = queryId;
|
pTaskInfo->id.queryId = queryId;
|
||||||
pTaskInfo->id.str = buildTaskId(taskId, queryId);
|
pTaskInfo->id.str = buildTaskId(taskId, queryId);
|
||||||
|
@ -2464,7 +2466,6 @@ int32_t createExecTaskInfo(SSubplan* pPlan, SExecTaskInfo** pTaskInfo, SReadHand
|
||||||
goto _complete;
|
goto _complete;
|
||||||
}
|
}
|
||||||
|
|
||||||
(*pTaskInfo)->cost.created = taosGetTimestampUs();
|
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
|
|
||||||
_complete:
|
_complete:
|
||||||
|
|
|
@ -447,9 +447,14 @@ void* destroyStreamFillSupporter(SStreamFillSupporter* pFillSup) {
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void destroySPoint(void* ptr) {
|
||||||
|
SPoint* point = (SPoint*) ptr;
|
||||||
|
taosMemoryFreeClear(point->val);
|
||||||
|
}
|
||||||
|
|
||||||
void* destroyStreamFillLinearInfo(SStreamFillLinearInfo* pFillLinear) {
|
void* destroyStreamFillLinearInfo(SStreamFillLinearInfo* pFillLinear) {
|
||||||
taosArrayDestroy(pFillLinear->pDeltaVal);
|
taosArrayDestroyEx(pFillLinear->pEndPoints, destroySPoint);
|
||||||
taosArrayDestroy(pFillLinear->pNextDeltaVal);
|
taosArrayDestroyEx(pFillLinear->pNextEndPoints, destroySPoint);
|
||||||
taosMemoryFree(pFillLinear);
|
taosMemoryFree(pFillLinear);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
@ -611,19 +616,15 @@ static void calcDeltaData(SSDataBlock* pBlock, int32_t rowId, SResultRowData* pR
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void calcRowDeltaData(SResultRowData* pStartRow, SResultRowData* pEndRow, SArray* pDelta, SFillColInfo* pFillCol,
|
static void calcRowDeltaData(SResultRowData* pEndRow, SArray* pEndPoins, SFillColInfo* pFillCol,
|
||||||
int32_t numOfCol, int32_t winCount) {
|
int32_t numOfCol) {
|
||||||
for (int32_t i = 0; i < numOfCol; i++) {
|
for (int32_t i = 0; i < numOfCol; i++) {
|
||||||
if (!pFillCol[i].notFillCol) {
|
if (!pFillCol[i].notFillCol) {
|
||||||
int32_t slotId = GET_DEST_SLOT_ID(pFillCol + i);
|
int32_t slotId = GET_DEST_SLOT_ID(pFillCol + i);
|
||||||
SResultCellData* pSCell = getResultCell(pStartRow, slotId);
|
|
||||||
double start = 0.0;
|
|
||||||
GET_TYPED_DATA(start, double, pSCell->type, pSCell->pData);
|
|
||||||
SResultCellData* pECell = getResultCell(pEndRow, slotId);
|
SResultCellData* pECell = getResultCell(pEndRow, slotId);
|
||||||
double end = 0.0;
|
SPoint* pPoint = taosArrayGet(pEndPoins, slotId);
|
||||||
GET_TYPED_DATA(end, double, pECell->type, pECell->pData);
|
pPoint->key = pEndRow->key;
|
||||||
double delta = (end - start) / winCount;
|
memcpy(pPoint->val, pECell->pData, pECell->bytes);
|
||||||
taosArraySet(pDelta, slotId, &delta);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -674,10 +675,8 @@ void setDeleteFillValueInfo(TSKEY start, TSKEY end, SStreamFillSupporter* pFillS
|
||||||
setFillKeyInfo(pFillSup->prev.key, pFillSup->next.key, &pFillSup->interval, pFillInfo);
|
setFillKeyInfo(pFillSup->prev.key, pFillSup->next.key, &pFillSup->interval, pFillInfo);
|
||||||
pFillInfo->pLinearInfo->hasNext = false;
|
pFillInfo->pLinearInfo->hasNext = false;
|
||||||
pFillInfo->pLinearInfo->nextEnd = INT64_MIN;
|
pFillInfo->pLinearInfo->nextEnd = INT64_MIN;
|
||||||
int32_t numOfWins = taosTimeCountInterval(pFillSup->prev.key, pFillSup->next.key, pFillSup->interval.sliding,
|
calcRowDeltaData(&pFillSup->next, pFillInfo->pLinearInfo->pEndPoints, pFillSup->pAllColInfo,
|
||||||
pFillSup->interval.slidingUnit, pFillSup->interval.precision);
|
pFillSup->numOfAllCols);
|
||||||
calcRowDeltaData(&pFillSup->prev, &pFillSup->next, pFillInfo->pLinearInfo->pDeltaVal, pFillSup->pAllColInfo,
|
|
||||||
pFillSup->numOfAllCols, numOfWins);
|
|
||||||
pFillInfo->pResRow = &pFillSup->prev;
|
pFillInfo->pResRow = &pFillSup->prev;
|
||||||
pFillInfo->pLinearInfo->winIndex = 0;
|
pFillInfo->pLinearInfo->winIndex = 0;
|
||||||
} break;
|
} break;
|
||||||
|
@ -780,25 +779,19 @@ void setFillValueInfo(SSDataBlock* pBlock, TSKEY ts, int32_t rowId, SStreamFillS
|
||||||
setFillKeyInfo(prevWKey, ts, &pFillSup->interval, pFillInfo);
|
setFillKeyInfo(prevWKey, ts, &pFillSup->interval, pFillInfo);
|
||||||
pFillInfo->pos = FILL_POS_MID;
|
pFillInfo->pos = FILL_POS_MID;
|
||||||
pFillInfo->pLinearInfo->nextEnd = nextWKey;
|
pFillInfo->pLinearInfo->nextEnd = nextWKey;
|
||||||
int32_t numOfWins = taosTimeCountInterval(prevWKey, ts, pFillSup->interval.sliding,
|
calcRowDeltaData(&pFillSup->cur, pFillInfo->pLinearInfo->pEndPoints, pFillSup->pAllColInfo,
|
||||||
pFillSup->interval.slidingUnit, pFillSup->interval.precision);
|
pFillSup->numOfAllCols);
|
||||||
calcRowDeltaData(&pFillSup->prev, &pFillSup->cur, pFillInfo->pLinearInfo->pDeltaVal, pFillSup->pAllColInfo,
|
|
||||||
pFillSup->numOfAllCols, numOfWins);
|
|
||||||
pFillInfo->pResRow = &pFillSup->prev;
|
pFillInfo->pResRow = &pFillSup->prev;
|
||||||
|
|
||||||
numOfWins = taosTimeCountInterval(ts, nextWKey, pFillSup->interval.sliding, pFillSup->interval.slidingUnit,
|
calcRowDeltaData(&pFillSup->next, pFillInfo->pLinearInfo->pNextEndPoints, pFillSup->pAllColInfo,
|
||||||
pFillSup->interval.precision);
|
pFillSup->numOfAllCols);
|
||||||
calcRowDeltaData(&pFillSup->cur, &pFillSup->next, pFillInfo->pLinearInfo->pNextDeltaVal, pFillSup->pAllColInfo,
|
|
||||||
pFillSup->numOfAllCols, numOfWins);
|
|
||||||
pFillInfo->pLinearInfo->hasNext = true;
|
pFillInfo->pLinearInfo->hasNext = true;
|
||||||
} else if (hasPrevWindow(pFillSup)) {
|
} else if (hasPrevWindow(pFillSup)) {
|
||||||
setFillKeyInfo(prevWKey, ts, &pFillSup->interval, pFillInfo);
|
setFillKeyInfo(prevWKey, ts, &pFillSup->interval, pFillInfo);
|
||||||
pFillInfo->pos = FILL_POS_END;
|
pFillInfo->pos = FILL_POS_END;
|
||||||
pFillInfo->pLinearInfo->nextEnd = INT64_MIN;
|
pFillInfo->pLinearInfo->nextEnd = INT64_MIN;
|
||||||
int32_t numOfWins = taosTimeCountInterval(prevWKey, ts, pFillSup->interval.sliding,
|
calcRowDeltaData(&pFillSup->cur, pFillInfo->pLinearInfo->pEndPoints, pFillSup->pAllColInfo,
|
||||||
pFillSup->interval.slidingUnit, pFillSup->interval.precision);
|
pFillSup->numOfAllCols);
|
||||||
calcRowDeltaData(&pFillSup->prev, &pFillSup->cur, pFillInfo->pLinearInfo->pDeltaVal, pFillSup->pAllColInfo,
|
|
||||||
pFillSup->numOfAllCols, numOfWins);
|
|
||||||
pFillInfo->pResRow = &pFillSup->prev;
|
pFillInfo->pResRow = &pFillSup->prev;
|
||||||
pFillInfo->pLinearInfo->hasNext = false;
|
pFillInfo->pLinearInfo->hasNext = false;
|
||||||
} else {
|
} else {
|
||||||
|
@ -806,10 +799,8 @@ void setFillValueInfo(SSDataBlock* pBlock, TSKEY ts, int32_t rowId, SStreamFillS
|
||||||
setFillKeyInfo(ts, nextWKey, &pFillSup->interval, pFillInfo);
|
setFillKeyInfo(ts, nextWKey, &pFillSup->interval, pFillInfo);
|
||||||
pFillInfo->pos = FILL_POS_START;
|
pFillInfo->pos = FILL_POS_START;
|
||||||
pFillInfo->pLinearInfo->nextEnd = INT64_MIN;
|
pFillInfo->pLinearInfo->nextEnd = INT64_MIN;
|
||||||
int32_t numOfWins = taosTimeCountInterval(ts, nextWKey, pFillSup->interval.sliding,
|
calcRowDeltaData(&pFillSup->next, pFillInfo->pLinearInfo->pEndPoints, pFillSup->pAllColInfo,
|
||||||
pFillSup->interval.slidingUnit, pFillSup->interval.precision);
|
pFillSup->numOfAllCols);
|
||||||
calcRowDeltaData(&pFillSup->cur, &pFillSup->next, pFillInfo->pLinearInfo->pDeltaVal, pFillSup->pAllColInfo,
|
|
||||||
pFillSup->numOfAllCols, numOfWins);
|
|
||||||
pFillInfo->pResRow = &pFillSup->cur;
|
pFillInfo->pResRow = &pFillSup->cur;
|
||||||
pFillInfo->pLinearInfo->hasNext = false;
|
pFillInfo->pLinearInfo->hasNext = false;
|
||||||
}
|
}
|
||||||
|
@ -906,13 +897,18 @@ static void doStreamFillLinear(SStreamFillSupporter* pFillSup, SStreamFillInfo*
|
||||||
colDataSetNULL(pColData, index);
|
colDataSetNULL(pColData, index);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
double* pDelta = taosArrayGet(pFillInfo->pLinearInfo->pDeltaVal, slotId);
|
SPoint* pEnd = taosArrayGet(pFillInfo->pLinearInfo->pEndPoints, slotId);
|
||||||
double vCell = 0;
|
double vCell = 0;
|
||||||
GET_TYPED_DATA(vCell, double, pCell->type, pCell->pData);
|
SPoint start = {0};
|
||||||
vCell += (*pDelta) * pFillInfo->pLinearInfo->winIndex;
|
start.key = pFillInfo->pResRow->key;
|
||||||
int64_t result = 0;
|
start.val = pCell->pData;
|
||||||
SET_TYPED_DATA(&result, pCell->type, vCell);
|
|
||||||
colDataSetVal(pColData, index, (const char*)&result, false);
|
SPoint cur = {0};
|
||||||
|
cur.key = pFillInfo->current;
|
||||||
|
cur.val = taosMemoryCalloc(1, pCell->bytes);
|
||||||
|
taosGetLinearInterpolationVal(&cur, pCell->type, &start, pEnd, pCell->type);
|
||||||
|
colDataSetVal(pColData, index, (const char*)cur.val, false);
|
||||||
|
destroySPoint(&cur);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
pFillInfo->current = taosTimeAdd(pFillInfo->current, pFillSup->interval.sliding, pFillSup->interval.slidingUnit,
|
pFillInfo->current = taosTimeAdd(pFillInfo->current, pFillSup->interval.sliding, pFillSup->interval.slidingUnit,
|
||||||
|
@ -953,8 +949,7 @@ static void doStreamFillRange(SStreamFillInfo* pFillInfo, SStreamFillSupporter*
|
||||||
if (pFillInfo->current > pFillInfo->end && pFillInfo->pLinearInfo->hasNext) {
|
if (pFillInfo->current > pFillInfo->end && pFillInfo->pLinearInfo->hasNext) {
|
||||||
pFillInfo->pLinearInfo->hasNext = false;
|
pFillInfo->pLinearInfo->hasNext = false;
|
||||||
pFillInfo->pLinearInfo->winIndex = 0;
|
pFillInfo->pLinearInfo->winIndex = 0;
|
||||||
taosArrayClear(pFillInfo->pLinearInfo->pDeltaVal);
|
taosArraySwap(pFillInfo->pLinearInfo->pEndPoints, pFillInfo->pLinearInfo->pNextEndPoints);
|
||||||
taosArrayAddAll(pFillInfo->pLinearInfo->pDeltaVal, pFillInfo->pLinearInfo->pNextDeltaVal);
|
|
||||||
pFillInfo->pResRow = &pFillSup->cur;
|
pFillInfo->pResRow = &pFillSup->cur;
|
||||||
setFillKeyInfo(pFillSup->cur.key, pFillInfo->pLinearInfo->nextEnd, &pFillSup->interval, pFillInfo);
|
setFillKeyInfo(pFillSup->cur.key, pFillInfo->pLinearInfo->nextEnd, &pFillSup->interval, pFillInfo);
|
||||||
doStreamFillLinear(pFillSup, pFillInfo, pRes);
|
doStreamFillLinear(pFillSup, pFillInfo, pRes);
|
||||||
|
@ -1359,15 +1354,19 @@ SStreamFillInfo* initStreamFillInfo(SStreamFillSupporter* pFillSup, SSDataBlock*
|
||||||
pFillInfo->pLinearInfo = taosMemoryCalloc(1, sizeof(SStreamFillLinearInfo));
|
pFillInfo->pLinearInfo = taosMemoryCalloc(1, sizeof(SStreamFillLinearInfo));
|
||||||
pFillInfo->pLinearInfo->hasNext = false;
|
pFillInfo->pLinearInfo->hasNext = false;
|
||||||
pFillInfo->pLinearInfo->nextEnd = INT64_MIN;
|
pFillInfo->pLinearInfo->nextEnd = INT64_MIN;
|
||||||
pFillInfo->pLinearInfo->pDeltaVal = NULL;
|
pFillInfo->pLinearInfo->pEndPoints = NULL;
|
||||||
pFillInfo->pLinearInfo->pNextDeltaVal = NULL;
|
pFillInfo->pLinearInfo->pNextEndPoints = NULL;
|
||||||
if (pFillSup->type == TSDB_FILL_LINEAR) {
|
if (pFillSup->type == TSDB_FILL_LINEAR) {
|
||||||
pFillInfo->pLinearInfo->pDeltaVal = taosArrayInit(pFillSup->numOfAllCols, sizeof(double));
|
pFillInfo->pLinearInfo->pEndPoints = taosArrayInit(pFillSup->numOfAllCols, sizeof(SPoint));
|
||||||
pFillInfo->pLinearInfo->pNextDeltaVal = taosArrayInit(pFillSup->numOfAllCols, sizeof(double));
|
pFillInfo->pLinearInfo->pNextEndPoints = taosArrayInit(pFillSup->numOfAllCols, sizeof(SPoint));
|
||||||
for (int32_t i = 0; i < pFillSup->numOfAllCols; i++) {
|
for (int32_t i = 0; i < pFillSup->numOfAllCols; i++) {
|
||||||
double value = 0.0;
|
SColumnInfoData* pColData = taosArrayGet(pRes->pDataBlock, i);
|
||||||
taosArrayPush(pFillInfo->pLinearInfo->pDeltaVal, &value);
|
SPoint value = {0};
|
||||||
taosArrayPush(pFillInfo->pLinearInfo->pNextDeltaVal, &value);
|
value.val = taosMemoryCalloc(1, pColData->info.bytes);
|
||||||
|
taosArrayPush(pFillInfo->pLinearInfo->pEndPoints, &value);
|
||||||
|
|
||||||
|
value.val = taosMemoryCalloc(1, pColData->info.bytes);
|
||||||
|
taosArrayPush(pFillInfo->pLinearInfo->pNextEndPoints, &value);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
pFillInfo->pLinearInfo->winIndex = 0;
|
pFillInfo->pLinearInfo->winIndex = 0;
|
||||||
|
|
|
@ -271,7 +271,7 @@ SSDataBlock* doProjectOperation(SOperatorInfo* pOperator) {
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
qDebug("set op close, exec %d, status %d rows %d", pTaskInfo->execModel, pOperator->status,
|
qDebug("set op close, exec %d, status %d rows %" PRId64 , pTaskInfo->execModel, pOperator->status,
|
||||||
pFinalRes->info.rows);
|
pFinalRes->info.rows);
|
||||||
setOperatorCompleted(pOperator);
|
setOperatorCompleted(pOperator);
|
||||||
break;
|
break;
|
||||||
|
@ -337,7 +337,7 @@ SSDataBlock* doProjectOperation(SOperatorInfo* pOperator) {
|
||||||
|
|
||||||
// when apply the limit/offset for each group, pRes->info.rows may be 0, due to limit constraint.
|
// when apply the limit/offset for each group, pRes->info.rows may be 0, due to limit constraint.
|
||||||
if (pFinalRes->info.rows > 0 || (pOperator->status == OP_EXEC_DONE)) {
|
if (pFinalRes->info.rows > 0 || (pOperator->status == OP_EXEC_DONE)) {
|
||||||
qDebug("project return %d rows, status %d", pFinalRes->info.rows, pOperator->status);
|
qDebug("project return %" PRId64 " rows, status %d", pFinalRes->info.rows, pOperator->status);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
|
|
@ -31,6 +31,9 @@
|
||||||
#include "thash.h"
|
#include "thash.h"
|
||||||
#include "ttypes.h"
|
#include "ttypes.h"
|
||||||
|
|
||||||
|
int32_t scanDebug = 0;
|
||||||
|
|
||||||
|
|
||||||
#define MULTI_READER_MAX_TABLE_NUM 5000
|
#define MULTI_READER_MAX_TABLE_NUM 5000
|
||||||
#define SET_REVERSE_SCAN_FLAG(_info) ((_info)->scanFlag = REVERSE_SCAN)
|
#define SET_REVERSE_SCAN_FLAG(_info) ((_info)->scanFlag = REVERSE_SCAN)
|
||||||
#define SWITCH_ORDER(n) (((n) = ((n) == TSDB_ORDER_ASC) ? TSDB_ORDER_DESC : TSDB_ORDER_ASC))
|
#define SWITCH_ORDER(n) (((n) = ((n) == TSDB_ORDER_ASC) ? TSDB_ORDER_DESC : TSDB_ORDER_ASC))
|
||||||
|
@ -308,14 +311,14 @@ static int32_t loadDataBlock(SOperatorInfo* pOperator, STableScanBase* pTableSca
|
||||||
taosMemoryFreeClear(pBlock->pBlockAgg);
|
taosMemoryFreeClear(pBlock->pBlockAgg);
|
||||||
|
|
||||||
if (*status == FUNC_DATA_REQUIRED_FILTEROUT) {
|
if (*status == FUNC_DATA_REQUIRED_FILTEROUT) {
|
||||||
qDebug("%s data block filter out, brange:%" PRId64 "-%" PRId64 ", rows:%d", GET_TASKID(pTaskInfo),
|
qDebug("%s data block filter out, brange:%" PRId64 "-%" PRId64 ", rows:%" PRId64 , GET_TASKID(pTaskInfo),
|
||||||
pBlockInfo->window.skey, pBlockInfo->window.ekey, pBlockInfo->rows);
|
pBlockInfo->window.skey, pBlockInfo->window.ekey, pBlockInfo->rows);
|
||||||
pCost->filterOutBlocks += 1;
|
pCost->filterOutBlocks += 1;
|
||||||
pCost->totalRows += pBlock->info.rows;
|
pCost->totalRows += pBlock->info.rows;
|
||||||
tsdbReleaseDataBlock(pTableScanInfo->dataReader);
|
tsdbReleaseDataBlock(pTableScanInfo->dataReader);
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
} else if (*status == FUNC_DATA_REQUIRED_NOT_LOAD) {
|
} else if (*status == FUNC_DATA_REQUIRED_NOT_LOAD) {
|
||||||
qDebug("%s data block skipped, brange:%" PRId64 "-%" PRId64 ", rows:%d, uid:%" PRIu64, GET_TASKID(pTaskInfo),
|
qDebug("%s data block skipped, brange:%" PRId64 "-%" PRId64 ", rows:%" PRId64 ", uid:%" PRIu64, GET_TASKID(pTaskInfo),
|
||||||
pBlockInfo->window.skey, pBlockInfo->window.ekey, pBlockInfo->rows, pBlockInfo->id.uid);
|
pBlockInfo->window.skey, pBlockInfo->window.ekey, pBlockInfo->rows, pBlockInfo->id.uid);
|
||||||
doSetTagColumnData(pTableScanInfo, pBlock, pTaskInfo, 1);
|
doSetTagColumnData(pTableScanInfo, pBlock, pTaskInfo, 1);
|
||||||
pCost->skipBlocks += 1;
|
pCost->skipBlocks += 1;
|
||||||
|
@ -326,7 +329,7 @@ static int32_t loadDataBlock(SOperatorInfo* pOperator, STableScanBase* pTableSca
|
||||||
loadSMA = true; // mark the operation of load sma;
|
loadSMA = true; // mark the operation of load sma;
|
||||||
bool success = doLoadBlockSMA(pTableScanInfo, pBlock, pTaskInfo);
|
bool success = doLoadBlockSMA(pTableScanInfo, pBlock, pTaskInfo);
|
||||||
if (success) { // failed to load the block sma data, data block statistics does not exist, load data block instead
|
if (success) { // failed to load the block sma data, data block statistics does not exist, load data block instead
|
||||||
qDebug("%s data block SMA loaded, brange:%" PRId64 "-%" PRId64 ", rows:%d", GET_TASKID(pTaskInfo),
|
qDebug("%s data block SMA loaded, brange:%" PRId64 "-%" PRId64 ", rows:%" PRId64 , GET_TASKID(pTaskInfo),
|
||||||
pBlockInfo->window.skey, pBlockInfo->window.ekey, pBlockInfo->rows);
|
pBlockInfo->window.skey, pBlockInfo->window.ekey, pBlockInfo->rows);
|
||||||
doSetTagColumnData(pTableScanInfo, pBlock, pTaskInfo, 1);
|
doSetTagColumnData(pTableScanInfo, pBlock, pTaskInfo, 1);
|
||||||
tsdbReleaseDataBlock(pTableScanInfo->dataReader);
|
tsdbReleaseDataBlock(pTableScanInfo->dataReader);
|
||||||
|
@ -346,7 +349,7 @@ static int32_t loadDataBlock(SOperatorInfo* pOperator, STableScanBase* pTableSca
|
||||||
size_t size = taosArrayGetSize(pBlock->pDataBlock);
|
size_t size = taosArrayGetSize(pBlock->pDataBlock);
|
||||||
bool keep = doFilterByBlockSMA(pOperator->exprSupp.pFilterInfo, pBlock->pBlockAgg, size, pBlockInfo->rows);
|
bool keep = doFilterByBlockSMA(pOperator->exprSupp.pFilterInfo, pBlock->pBlockAgg, size, pBlockInfo->rows);
|
||||||
if (!keep) {
|
if (!keep) {
|
||||||
qDebug("%s data block filter out by block SMA, brange:%" PRId64 "-%" PRId64 ", rows:%d", GET_TASKID(pTaskInfo),
|
qDebug("%s data block filter out by block SMA, brange:%" PRId64 "-%" PRId64 ", rows:%" PRId64 , GET_TASKID(pTaskInfo),
|
||||||
pBlockInfo->window.skey, pBlockInfo->window.ekey, pBlockInfo->rows);
|
pBlockInfo->window.skey, pBlockInfo->window.ekey, pBlockInfo->rows);
|
||||||
pCost->filterOutBlocks += 1;
|
pCost->filterOutBlocks += 1;
|
||||||
(*status) = FUNC_DATA_REQUIRED_FILTEROUT;
|
(*status) = FUNC_DATA_REQUIRED_FILTEROUT;
|
||||||
|
@ -363,7 +366,7 @@ static int32_t loadDataBlock(SOperatorInfo* pOperator, STableScanBase* pTableSca
|
||||||
// try to filter data block according to current results
|
// try to filter data block according to current results
|
||||||
doDynamicPruneDataBlock(pOperator, pBlockInfo, status);
|
doDynamicPruneDataBlock(pOperator, pBlockInfo, status);
|
||||||
if (*status == FUNC_DATA_REQUIRED_NOT_LOAD) {
|
if (*status == FUNC_DATA_REQUIRED_NOT_LOAD) {
|
||||||
qDebug("%s data block skipped due to dynamic prune, brange:%" PRId64 "-%" PRId64 ", rows:%d", GET_TASKID(pTaskInfo),
|
qDebug("%s data block skipped due to dynamic prune, brange:%" PRId64 "-%" PRId64 ", rows:%" PRId64 , GET_TASKID(pTaskInfo),
|
||||||
pBlockInfo->window.skey, pBlockInfo->window.ekey, pBlockInfo->rows);
|
pBlockInfo->window.skey, pBlockInfo->window.ekey, pBlockInfo->rows);
|
||||||
pCost->skipBlocks += 1;
|
pCost->skipBlocks += 1;
|
||||||
tsdbReleaseDataBlock(pTableScanInfo->dataReader);
|
tsdbReleaseDataBlock(pTableScanInfo->dataReader);
|
||||||
|
@ -394,7 +397,7 @@ static int32_t loadDataBlock(SOperatorInfo* pOperator, STableScanBase* pTableSca
|
||||||
|
|
||||||
if (pBlock->info.rows == 0) {
|
if (pBlock->info.rows == 0) {
|
||||||
pCost->filterOutBlocks += 1;
|
pCost->filterOutBlocks += 1;
|
||||||
qDebug("%s data block filter out, brange:%" PRId64 "-%" PRId64 ", rows:%d, elapsed time:%.2f ms",
|
qDebug("%s data block filter out, brange:%" PRId64 "-%" PRId64 ", rows:%" PRId64 ", elapsed time:%.2f ms",
|
||||||
GET_TASKID(pTaskInfo), pBlockInfo->window.skey, pBlockInfo->window.ekey, pBlockInfo->rows, el);
|
GET_TASKID(pTaskInfo), pBlockInfo->window.skey, pBlockInfo->window.ekey, pBlockInfo->rows, el);
|
||||||
} else {
|
} else {
|
||||||
qDebug("%s data block filter applied, elapsed time:%.2f ms", GET_TASKID(pTaskInfo), el);
|
qDebug("%s data block filter applied, elapsed time:%.2f ms", GET_TASKID(pTaskInfo), el);
|
||||||
|
@ -584,10 +587,16 @@ int32_t addTagPseudoColumnData(SReadHandle* pHandle, const SExprInfo* pExpr, int
|
||||||
if (isNullVal) {
|
if (isNullVal) {
|
||||||
colDataSetNNULL(pColInfoData, 0, pBlock->info.rows);
|
colDataSetNNULL(pColInfoData, 0, pBlock->info.rows);
|
||||||
} else if (pColInfoData->info.type != TSDB_DATA_TYPE_JSON) {
|
} else if (pColInfoData->info.type != TSDB_DATA_TYPE_JSON) {
|
||||||
colDataSetNItems(pColInfoData, 0, data, pBlock->info.rows);
|
code = colDataSetNItems(pColInfoData, 0, data, pBlock->info.rows, false);
|
||||||
if (IS_VAR_DATA_TYPE(((const STagVal*)p)->type)) {
|
if (IS_VAR_DATA_TYPE(((const STagVal*)p)->type)) {
|
||||||
taosMemoryFree(data);
|
taosMemoryFree(data);
|
||||||
}
|
}
|
||||||
|
if (code) {
|
||||||
|
if (freeReader) {
|
||||||
|
metaReaderClear(&mr);
|
||||||
|
}
|
||||||
|
return code;
|
||||||
|
}
|
||||||
} else { // todo opt for json tag
|
} else { // todo opt for json tag
|
||||||
for (int32_t i = 0; i < pBlock->info.rows; ++i) {
|
for (int32_t i = 0; i < pBlock->info.rows; ++i) {
|
||||||
colDataSetVal(pColInfoData, i, data, false);
|
colDataSetVal(pColInfoData, i, data, false);
|
||||||
|
@ -634,10 +643,22 @@ static SSDataBlock* doTableScanImpl(SOperatorInfo* pOperator) {
|
||||||
STableScanInfo* pTableScanInfo = pOperator->info;
|
STableScanInfo* pTableScanInfo = pOperator->info;
|
||||||
SExecTaskInfo* pTaskInfo = pOperator->pTaskInfo;
|
SExecTaskInfo* pTaskInfo = pOperator->pTaskInfo;
|
||||||
SSDataBlock* pBlock = pTableScanInfo->pResBlock;
|
SSDataBlock* pBlock = pTableScanInfo->pResBlock;
|
||||||
|
bool hasNext = false;
|
||||||
|
int32_t code = TSDB_CODE_SUCCESS;
|
||||||
|
|
||||||
int64_t st = taosGetTimestampUs();
|
int64_t st = taosGetTimestampUs();
|
||||||
|
|
||||||
while (tsdbNextDataBlock(pTableScanInfo->base.dataReader)) {
|
while (true) {
|
||||||
|
code = tsdbNextDataBlock(pTableScanInfo->base.dataReader, &hasNext);
|
||||||
|
if (code) {
|
||||||
|
tsdbReleaseDataBlock(pTableScanInfo->base.dataReader);
|
||||||
|
T_LONG_JMP(pTaskInfo->env, code);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!hasNext) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
if (isTaskKilled(pTaskInfo)) {
|
if (isTaskKilled(pTaskInfo)) {
|
||||||
tsdbReleaseDataBlock(pTableScanInfo->base.dataReader);
|
tsdbReleaseDataBlock(pTableScanInfo->base.dataReader);
|
||||||
T_LONG_JMP(pTaskInfo->env, pTaskInfo->code);
|
T_LONG_JMP(pTaskInfo->env, pTaskInfo->code);
|
||||||
|
@ -654,9 +675,10 @@ static SSDataBlock* doTableScanImpl(SOperatorInfo* pOperator) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
ASSERT(pBlock->info.id.uid != 0);
|
if (pBlock->info.id.uid) {
|
||||||
pBlock->info.id.groupId = getTableGroupId(pTaskInfo->pTableInfoList, pBlock->info.id.uid);
|
pBlock->info.id.groupId = getTableGroupId(pTaskInfo->pTableInfoList, pBlock->info.id.uid);
|
||||||
|
}
|
||||||
|
|
||||||
uint32_t status = 0;
|
uint32_t status = 0;
|
||||||
int32_t code = loadDataBlock(pOperator, &pTableScanInfo->base, pBlock, &status);
|
int32_t code = loadDataBlock(pOperator, &pTableScanInfo->base, pBlock, &status);
|
||||||
if (code != TSDB_CODE_SUCCESS) {
|
if (code != TSDB_CODE_SUCCESS) {
|
||||||
|
@ -680,7 +702,6 @@ static SSDataBlock* doTableScanImpl(SOperatorInfo* pOperator) {
|
||||||
pTaskInfo->streamInfo.lastStatus.uid = pBlock->info.id.uid;
|
pTaskInfo->streamInfo.lastStatus.uid = pBlock->info.id.uid;
|
||||||
pTaskInfo->streamInfo.lastStatus.ts = pBlock->info.window.ekey;
|
pTaskInfo->streamInfo.lastStatus.ts = pBlock->info.window.ekey;
|
||||||
|
|
||||||
ASSERT(pBlock->info.id.uid != 0);
|
|
||||||
return pBlock;
|
return pBlock;
|
||||||
}
|
}
|
||||||
return NULL;
|
return NULL;
|
||||||
|
@ -761,13 +782,14 @@ static SSDataBlock* doTableScan(SOperatorInfo* pOperator) {
|
||||||
// if no data, switch to next table and continue scan
|
// if no data, switch to next table and continue scan
|
||||||
pInfo->currentTable++;
|
pInfo->currentTable++;
|
||||||
if (pInfo->currentTable >= numOfTables) {
|
if (pInfo->currentTable >= numOfTables) {
|
||||||
|
qDebug("all table checked in table list, total:%d, return NULL, %s", numOfTables, GET_TASKID(pTaskInfo));
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
STableKeyInfo* pTableInfo = tableListGetInfo(pTaskInfo->pTableInfoList, pInfo->currentTable);
|
STableKeyInfo* pTableInfo = tableListGetInfo(pTaskInfo->pTableInfoList, pInfo->currentTable);
|
||||||
tsdbSetTableList(pInfo->base.dataReader, pTableInfo, 1);
|
tsdbSetTableList(pInfo->base.dataReader, pTableInfo, 1);
|
||||||
qDebug("set uid:%" PRIu64 " into scanner, total tables:%d, index:%d %s", pTableInfo->uid, numOfTables,
|
qDebug("set uid:%" PRIu64 " into scanner, total tables:%d, index:%d/%d %s", pTableInfo->uid, numOfTables,
|
||||||
pInfo->currentTable, pTaskInfo->id.str);
|
pInfo->currentTable, numOfTables, GET_TASKID(pTaskInfo));
|
||||||
|
|
||||||
tsdbReaderReset(pInfo->base.dataReader, &pInfo->base.cond);
|
tsdbReaderReset(pInfo->base.dataReader, &pInfo->base.cond);
|
||||||
pInfo->scanTimes = 0;
|
pInfo->scanTimes = 0;
|
||||||
|
@ -785,7 +807,7 @@ static SSDataBlock* doTableScan(SOperatorInfo* pOperator) {
|
||||||
ASSERT(pInfo->base.dataReader == NULL);
|
ASSERT(pInfo->base.dataReader == NULL);
|
||||||
|
|
||||||
int32_t code = tsdbReaderOpen(pInfo->base.readHandle.vnode, &pInfo->base.cond, pList, num, pInfo->pResBlock,
|
int32_t code = tsdbReaderOpen(pInfo->base.readHandle.vnode, &pInfo->base.cond, pList, num, pInfo->pResBlock,
|
||||||
(STsdbReader**)&pInfo->base.dataReader, GET_TASKID(pTaskInfo));
|
(STsdbReader**)&pInfo->base.dataReader, GET_TASKID(pTaskInfo), pInfo->countOnly);
|
||||||
if (code != TSDB_CODE_SUCCESS) {
|
if (code != TSDB_CODE_SUCCESS) {
|
||||||
T_LONG_JMP(pTaskInfo->env, code);
|
T_LONG_JMP(pTaskInfo->env, code);
|
||||||
}
|
}
|
||||||
|
@ -797,7 +819,6 @@ static SSDataBlock* doTableScan(SOperatorInfo* pOperator) {
|
||||||
|
|
||||||
SSDataBlock* result = doGroupedTableScan(pOperator);
|
SSDataBlock* result = doGroupedTableScan(pOperator);
|
||||||
if (result != NULL) {
|
if (result != NULL) {
|
||||||
ASSERT(result->info.id.uid != 0);
|
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -917,6 +938,10 @@ SOperatorInfo* createTableScanOperatorInfo(STableScanPhysiNode* pTableScanNode,
|
||||||
goto _error;
|
goto _error;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (scanDebug) {
|
||||||
|
pInfo->countOnly = true;
|
||||||
|
}
|
||||||
|
|
||||||
taosLRUCacheSetStrictCapacity(pInfo->base.metaCache.pTableMetaEntryCache, false);
|
taosLRUCacheSetStrictCapacity(pInfo->base.metaCache.pTableMetaEntryCache, false);
|
||||||
pOperator->fpSet = createOperatorFpSet(optrDummyOpenFn, doTableScan, NULL, destroyTableScanOperatorInfo,
|
pOperator->fpSet = createOperatorFpSet(optrDummyOpenFn, doTableScan, NULL, destroyTableScanOperatorInfo,
|
||||||
optrDefaultBufFn, getTableScannerExecInfo);
|
optrDefaultBufFn, getTableScannerExecInfo);
|
||||||
|
@ -1008,21 +1033,29 @@ static SSDataBlock* readPreVersionData(SOperatorInfo* pTableScanOp, uint64_t tbU
|
||||||
SSDataBlock* pBlock = pTableScanInfo->pResBlock;
|
SSDataBlock* pBlock = pTableScanInfo->pResBlock;
|
||||||
STsdbReader* pReader = NULL;
|
STsdbReader* pReader = NULL;
|
||||||
int32_t code = tsdbReaderOpen(pTableScanInfo->base.readHandle.vnode, &cond, &tblInfo, 1, pBlock,
|
int32_t code = tsdbReaderOpen(pTableScanInfo->base.readHandle.vnode, &cond, &tblInfo, 1, pBlock,
|
||||||
(STsdbReader**)&pReader, GET_TASKID(pTaskInfo));
|
(STsdbReader**)&pReader, GET_TASKID(pTaskInfo), false);
|
||||||
if (code != TSDB_CODE_SUCCESS) {
|
if (code != TSDB_CODE_SUCCESS) {
|
||||||
terrno = code;
|
terrno = code;
|
||||||
T_LONG_JMP(pTaskInfo->env, code);
|
T_LONG_JMP(pTaskInfo->env, code);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (tsdbNextDataBlock(pReader)) {
|
bool hasNext = false;
|
||||||
|
code = tsdbNextDataBlock(pReader, &hasNext);
|
||||||
|
if (code != TSDB_CODE_SUCCESS) {
|
||||||
|
terrno = code;
|
||||||
|
T_LONG_JMP(pTaskInfo->env, code);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (hasNext) {
|
||||||
/*SSDataBlock* p = */ tsdbRetrieveDataBlock(pReader, NULL);
|
/*SSDataBlock* p = */ tsdbRetrieveDataBlock(pReader, NULL);
|
||||||
doSetTagColumnData(&pTableScanInfo->base, pBlock, pTaskInfo, pBlock->info.rows);
|
doSetTagColumnData(&pTableScanInfo->base, pBlock, pTaskInfo, pBlock->info.rows);
|
||||||
pBlock->info.id.groupId = getTableGroupId(pTaskInfo->pTableInfoList, pBlock->info.id.uid);
|
pBlock->info.id.groupId = getTableGroupId(pTaskInfo->pTableInfoList, pBlock->info.id.uid);
|
||||||
}
|
}
|
||||||
|
|
||||||
tsdbReaderClose(pReader);
|
tsdbReaderClose(pReader);
|
||||||
qDebug("retrieve prev rows:%d, skey:%" PRId64 ", ekey:%" PRId64 " uid:%" PRIu64 ", max ver:%" PRId64
|
qDebug("retrieve prev rows:%" PRId64 ", skey:%" PRId64 ", ekey:%" PRId64 " uid:%" PRIu64 ", max ver:%" PRId64
|
||||||
", suid:%" PRIu64,
|
", suid:%" PRIu64,
|
||||||
pBlock->info.rows, startTs, endTs, tbUid, maxVersion, cond.suid);
|
pBlock->info.rows, startTs, endTs, tbUid, maxVersion, cond.suid);
|
||||||
|
|
||||||
|
@ -1569,19 +1602,16 @@ static int32_t setBlockIntoRes(SStreamScanInfo* pInfo, const SSDataBlock* pBlock
|
||||||
static SSDataBlock* doQueueScan(SOperatorInfo* pOperator) {
|
static SSDataBlock* doQueueScan(SOperatorInfo* pOperator) {
|
||||||
SExecTaskInfo* pTaskInfo = pOperator->pTaskInfo;
|
SExecTaskInfo* pTaskInfo = pOperator->pTaskInfo;
|
||||||
SStreamScanInfo* pInfo = pOperator->info;
|
SStreamScanInfo* pInfo = pOperator->info;
|
||||||
|
const char* id = GET_TASKID(pTaskInfo);
|
||||||
|
|
||||||
qDebug("start to exec queue scan");
|
qDebug("start to exec queue scan, %s", id);
|
||||||
|
|
||||||
if (pTaskInfo->streamInfo.submit.msgStr != NULL) {
|
if (pTaskInfo->streamInfo.submit.msgStr != NULL) {
|
||||||
if (pInfo->tqReader->msg2.msgStr == NULL) {
|
|
||||||
/*pInfo->tqReader->pMsg = pTaskInfo->streamInfo.pReq;*/
|
|
||||||
|
|
||||||
/*const SSubmitReq* pSubmit = pInfo->tqReader->pMsg;*/
|
if (pInfo->tqReader->msg2.msgStr == NULL) {
|
||||||
/*if (tqReaderSetDataMsg(pInfo->tqReader, pSubmit, 0) < 0) {*/
|
|
||||||
/*void* msgStr = pTaskInfo->streamInfo.*/
|
|
||||||
SPackedData submit = pTaskInfo->streamInfo.submit;
|
SPackedData submit = pTaskInfo->streamInfo.submit;
|
||||||
if (tqReaderSetSubmitReq2(pInfo->tqReader, submit.msgStr, submit.msgLen, submit.ver) < 0) {
|
if (tqReaderSetSubmitReq2(pInfo->tqReader, submit.msgStr, submit.msgLen, submit.ver) < 0) {
|
||||||
qError("submit msg messed up when initing stream submit block %p", submit.msgStr);
|
qError("submit msg messed up when initing stream submit block %p, %s", submit.msgStr, id);
|
||||||
pInfo->tqReader->msg2 = (SPackedData){0};
|
pInfo->tqReader->msg2 = (SPackedData){0};
|
||||||
pInfo->tqReader->setMsg = 0;
|
pInfo->tqReader->setMsg = 0;
|
||||||
ASSERT(0);
|
ASSERT(0);
|
||||||
|
@ -1615,18 +1645,20 @@ static SSDataBlock* doQueueScan(SOperatorInfo* pOperator) {
|
||||||
if (pTaskInfo->streamInfo.prepareStatus.type == TMQ_OFFSET__SNAPSHOT_DATA) {
|
if (pTaskInfo->streamInfo.prepareStatus.type == TMQ_OFFSET__SNAPSHOT_DATA) {
|
||||||
SSDataBlock* pResult = doTableScan(pInfo->pTableScanOp);
|
SSDataBlock* pResult = doTableScan(pInfo->pTableScanOp);
|
||||||
if (pResult && pResult->info.rows > 0) {
|
if (pResult && pResult->info.rows > 0) {
|
||||||
qDebug("queue scan tsdb return %d rows min:%" PRId64 " max:%" PRId64 " wal curVersion:%" PRId64, pResult->info.rows,
|
qDebug("queue scan tsdb return %" PRId64 " rows min:%" PRId64 " max:%" PRId64 " wal curVersion:%" PRId64" %s", pResult->info.rows,
|
||||||
pResult->info.window.skey, pResult->info.window.ekey, pInfo->tqReader->pWalReader->curVersion);
|
pResult->info.window.skey, pResult->info.window.ekey, pInfo->tqReader->pWalReader->curVersion, id);
|
||||||
pTaskInfo->streamInfo.returned = 1;
|
pTaskInfo->streamInfo.returned = 1;
|
||||||
return pResult;
|
return pResult;
|
||||||
} else {
|
} else {
|
||||||
|
// no data has return already, try to extract data in the WAL
|
||||||
if (!pTaskInfo->streamInfo.returned) {
|
if (!pTaskInfo->streamInfo.returned) {
|
||||||
STableScanInfo* pTSInfo = pInfo->pTableScanOp->info;
|
STableScanInfo* pTSInfo = pInfo->pTableScanOp->info;
|
||||||
tsdbReaderClose(pTSInfo->base.dataReader);
|
tsdbReaderClose(pTSInfo->base.dataReader);
|
||||||
qDebug("3");
|
|
||||||
pTSInfo->base.dataReader = NULL;
|
pTSInfo->base.dataReader = NULL;
|
||||||
tqOffsetResetToLog(&pTaskInfo->streamInfo.prepareStatus, pTaskInfo->streamInfo.snapshotVer);
|
tqOffsetResetToLog(&pTaskInfo->streamInfo.prepareStatus, pTaskInfo->streamInfo.snapshotVer);
|
||||||
qDebug("queue scan tsdb over, switch to wal ver %" PRId64 "", pTaskInfo->streamInfo.snapshotVer + 1);
|
|
||||||
|
qDebug("queue scan tsdb over, switch to wal ver:%" PRId64 " %s", pTaskInfo->streamInfo.snapshotVer + 1, id);
|
||||||
if (tqSeekVer(pInfo->tqReader, pTaskInfo->streamInfo.snapshotVer + 1, pTaskInfo->id.str) < 0) {
|
if (tqSeekVer(pInfo->tqReader, pTaskInfo->streamInfo.snapshotVer + 1, pTaskInfo->id.str) < 0) {
|
||||||
tqOffsetResetToLog(&pTaskInfo->streamInfo.lastStatus, pTaskInfo->streamInfo.snapshotVer);
|
tqOffsetResetToLog(&pTaskInfo->streamInfo.lastStatus, pTaskInfo->streamInfo.snapshotVer);
|
||||||
return NULL;
|
return NULL;
|
||||||
|
@ -1643,7 +1675,7 @@ static SSDataBlock* doQueueScan(SOperatorInfo* pOperator) {
|
||||||
if (tqNextBlock(pInfo->tqReader, &ret) < 0) {
|
if (tqNextBlock(pInfo->tqReader, &ret) < 0) {
|
||||||
// if the end is reached, terrno is 0
|
// if the end is reached, terrno is 0
|
||||||
if (terrno != 0) {
|
if (terrno != 0) {
|
||||||
qError("failed to get next log block since %s", terrstr());
|
qError("failed to get next log block since %s, %s", terrstr(), id);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1652,15 +1684,12 @@ static SSDataBlock* doQueueScan(SOperatorInfo* pOperator) {
|
||||||
setBlockIntoRes(pInfo, &ret.data, true);
|
setBlockIntoRes(pInfo, &ret.data, true);
|
||||||
if (pInfo->pRes->info.rows > 0) {
|
if (pInfo->pRes->info.rows > 0) {
|
||||||
pOperator->status = OP_EXEC_RECV;
|
pOperator->status = OP_EXEC_RECV;
|
||||||
qDebug("queue scan log return %d rows", pInfo->pRes->info.rows);
|
qDebug("queue scan log return %" PRId64 " rows", pInfo->pRes->info.rows);
|
||||||
return pInfo->pRes;
|
return pInfo->pRes;
|
||||||
}
|
}
|
||||||
} else if (ret.fetchType == FETCH_TYPE__META) {
|
} else if (ret.fetchType == FETCH_TYPE__META) {
|
||||||
qError("unexpected ret.fetchType:%d", ret.fetchType);
|
qError("unexpected ret.fetchType:%d", ret.fetchType);
|
||||||
continue;
|
continue;
|
||||||
// pTaskInfo->streamInfo.lastStatus = ret.offset;
|
|
||||||
// pTaskInfo->streamInfo.metaBlk = ret.meta;
|
|
||||||
// return NULL;
|
|
||||||
} else if (ret.fetchType == FETCH_TYPE__NONE ||
|
} else if (ret.fetchType == FETCH_TYPE__NONE ||
|
||||||
(ret.fetchType == FETCH_TYPE__SEP && pOperator->status == OP_EXEC_RECV)) {
|
(ret.fetchType == FETCH_TYPE__SEP && pOperator->status == OP_EXEC_RECV)) {
|
||||||
pTaskInfo->streamInfo.lastStatus = ret.offset;
|
pTaskInfo->streamInfo.lastStatus = ret.offset;
|
||||||
|
@ -1672,7 +1701,7 @@ static SSDataBlock* doQueueScan(SOperatorInfo* pOperator) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
qError("unexpected streamInfo prepare type: %d", pTaskInfo->streamInfo.prepareStatus.type);
|
qError("unexpected streamInfo prepare type: %d %s", pTaskInfo->streamInfo.prepareStatus.type, id);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1803,8 +1832,18 @@ static SSDataBlock* doStreamScan(SOperatorInfo* pOperator) {
|
||||||
generateScanRange(pInfo, pInfo->pUpdateDataRes, pInfo->pUpdateRes);
|
generateScanRange(pInfo, pInfo->pUpdateDataRes, pInfo->pUpdateRes);
|
||||||
prepareRangeScan(pInfo, pInfo->pUpdateRes, &pInfo->updateResIndex);
|
prepareRangeScan(pInfo, pInfo->pUpdateRes, &pInfo->updateResIndex);
|
||||||
pInfo->scanMode = STREAM_SCAN_FROM_DATAREADER_RANGE;
|
pInfo->scanMode = STREAM_SCAN_FROM_DATAREADER_RANGE;
|
||||||
|
printDataBlock(pInfo->pUpdateRes, "recover update");
|
||||||
return pInfo->pUpdateRes;
|
return pInfo->pUpdateRes;
|
||||||
} break;
|
} break;
|
||||||
|
case STREAM_SCAN_FROM_DELETE_DATA: {
|
||||||
|
generateScanRange(pInfo, pInfo->pUpdateDataRes, pInfo->pUpdateRes);
|
||||||
|
prepareRangeScan(pInfo, pInfo->pUpdateRes, &pInfo->updateResIndex);
|
||||||
|
pInfo->scanMode = STREAM_SCAN_FROM_DATAREADER_RANGE;
|
||||||
|
copyDataBlock(pInfo->pDeleteDataRes, pInfo->pUpdateRes);
|
||||||
|
pInfo->pDeleteDataRes->info.type = STREAM_DELETE_DATA;
|
||||||
|
printDataBlock(pInfo->pDeleteDataRes, "recover delete");
|
||||||
|
return pInfo->pDeleteDataRes;
|
||||||
|
} break;
|
||||||
case STREAM_SCAN_FROM_DATAREADER_RANGE: {
|
case STREAM_SCAN_FROM_DATAREADER_RANGE: {
|
||||||
SSDataBlock* pSDB = doRangeScan(pInfo, pInfo->pUpdateRes, pInfo->primaryTsIndex, &pInfo->updateResIndex);
|
SSDataBlock* pSDB = doRangeScan(pInfo, pInfo->pUpdateRes, pInfo->primaryTsIndex, &pInfo->updateResIndex);
|
||||||
if (pSDB) {
|
if (pSDB) {
|
||||||
|
@ -1813,7 +1852,7 @@ static SSDataBlock* doStreamScan(SOperatorInfo* pOperator) {
|
||||||
updateInfoSetScanRange(pInfo->pUpdateInfo, &pTableScanInfo->base.cond.twindows, pInfo->groupId, version);
|
updateInfoSetScanRange(pInfo->pUpdateInfo, &pTableScanInfo->base.cond.twindows, pInfo->groupId, version);
|
||||||
pSDB->info.type = pInfo->scanMode == STREAM_SCAN_FROM_DATAREADER_RANGE ? STREAM_NORMAL : STREAM_PULL_DATA;
|
pSDB->info.type = pInfo->scanMode == STREAM_SCAN_FROM_DATAREADER_RANGE ? STREAM_NORMAL : STREAM_PULL_DATA;
|
||||||
checkUpdateData(pInfo, true, pSDB, false);
|
checkUpdateData(pInfo, true, pSDB, false);
|
||||||
// printDataBlock(pSDB, "stream scan update");
|
printDataBlock(pSDB, "scan recover update");
|
||||||
calBlockTbName(pInfo, pSDB);
|
calBlockTbName(pInfo, pSDB);
|
||||||
return pSDB;
|
return pSDB;
|
||||||
}
|
}
|
||||||
|
@ -1838,9 +1877,10 @@ static SSDataBlock* doStreamScan(SOperatorInfo* pOperator) {
|
||||||
}
|
}
|
||||||
if (pInfo->pCreateTbRes->info.rows > 0) {
|
if (pInfo->pCreateTbRes->info.rows > 0) {
|
||||||
pInfo->scanMode = STREAM_SCAN_FROM_RES;
|
pInfo->scanMode = STREAM_SCAN_FROM_RES;
|
||||||
|
printDataBlock(pInfo->pCreateTbRes, "recover createTbl");
|
||||||
return pInfo->pCreateTbRes;
|
return pInfo->pCreateTbRes;
|
||||||
}
|
}
|
||||||
qDebug("stream recover scan get block, rows %d", pInfo->pRecoverRes->info.rows);
|
qDebug("stream recover scan get block, rows %" PRId64 , pInfo->pRecoverRes->info.rows);
|
||||||
printDataBlock(pInfo->pRecoverRes, "scan recover");
|
printDataBlock(pInfo->pRecoverRes, "scan recover");
|
||||||
return pInfo->pRecoverRes;
|
return pInfo->pRecoverRes;
|
||||||
}
|
}
|
||||||
|
@ -1996,6 +2036,7 @@ FETCH_NEXT_BLOCK:
|
||||||
copyDataBlock(pInfo->pUpdateRes, pSup->pScanBlock);
|
copyDataBlock(pInfo->pUpdateRes, pSup->pScanBlock);
|
||||||
blockDataCleanup(pSup->pScanBlock);
|
blockDataCleanup(pSup->pScanBlock);
|
||||||
prepareRangeScan(pInfo, pInfo->pUpdateRes, &pInfo->updateResIndex);
|
prepareRangeScan(pInfo, pInfo->pUpdateRes, &pInfo->updateResIndex);
|
||||||
|
pInfo->pUpdateRes->info.type = STREAM_DELETE_DATA;
|
||||||
return pInfo->pUpdateRes;
|
return pInfo->pUpdateRes;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2069,7 +2110,7 @@ FETCH_NEXT_BLOCK:
|
||||||
pOperator->resultInfo.totalRows += pBlockInfo->rows;
|
pOperator->resultInfo.totalRows += pBlockInfo->rows;
|
||||||
// printDataBlock(pInfo->pRes, "stream scan");
|
// printDataBlock(pInfo->pRes, "stream scan");
|
||||||
|
|
||||||
qDebug("scan rows: %d", pBlockInfo->rows);
|
qDebug("scan rows: %" PRId64 , pBlockInfo->rows);
|
||||||
if (pBlockInfo->rows > 0) {
|
if (pBlockInfo->rows > 0) {
|
||||||
return pInfo->pRes;
|
return pInfo->pRes;
|
||||||
}
|
}
|
||||||
|
@ -2102,12 +2143,22 @@ static SSDataBlock* doRawScan(SOperatorInfo* pOperator) {
|
||||||
// NOTE: this operator does never check if current status is done or not
|
// NOTE: this operator does never check if current status is done or not
|
||||||
SExecTaskInfo* pTaskInfo = pOperator->pTaskInfo;
|
SExecTaskInfo* pTaskInfo = pOperator->pTaskInfo;
|
||||||
SStreamRawScanInfo* pInfo = pOperator->info;
|
SStreamRawScanInfo* pInfo = pOperator->info;
|
||||||
|
int32_t code = TSDB_CODE_SUCCESS;
|
||||||
pTaskInfo->streamInfo.metaRsp.metaRspLen = 0; // use metaRspLen !=0 to judge if data is meta
|
pTaskInfo->streamInfo.metaRsp.metaRspLen = 0; // use metaRspLen !=0 to judge if data is meta
|
||||||
pTaskInfo->streamInfo.metaRsp.metaRsp = NULL;
|
pTaskInfo->streamInfo.metaRsp.metaRsp = NULL;
|
||||||
|
|
||||||
qDebug("tmqsnap doRawScan called");
|
qDebug("tmqsnap doRawScan called");
|
||||||
if (pTaskInfo->streamInfo.prepareStatus.type == TMQ_OFFSET__SNAPSHOT_DATA) {
|
if (pTaskInfo->streamInfo.prepareStatus.type == TMQ_OFFSET__SNAPSHOT_DATA) {
|
||||||
if (pInfo->dataReader && tsdbNextDataBlock(pInfo->dataReader)) {
|
bool hasNext = false;
|
||||||
|
if (pInfo->dataReader) {
|
||||||
|
code = tsdbNextDataBlock(pInfo->dataReader, &hasNext);
|
||||||
|
if (code) {
|
||||||
|
tsdbReleaseDataBlock(pInfo->dataReader);
|
||||||
|
longjmp(pTaskInfo->env, code);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (pInfo->dataReader && hasNext) {
|
||||||
if (isTaskKilled(pTaskInfo)) {
|
if (isTaskKilled(pTaskInfo)) {
|
||||||
tsdbReleaseDataBlock(pInfo->dataReader);
|
tsdbReleaseDataBlock(pInfo->dataReader);
|
||||||
longjmp(pTaskInfo->env, pTaskInfo->code);
|
longjmp(pTaskInfo->env, pTaskInfo->code);
|
||||||
|
@ -2600,7 +2651,7 @@ static SSDataBlock* getTableDataBlockImpl(void* param) {
|
||||||
SReadHandle* pHandle = &pInfo->base.readHandle;
|
SReadHandle* pHandle = &pInfo->base.readHandle;
|
||||||
|
|
||||||
if (NULL == source->dataReader || !source->multiReader) {
|
if (NULL == source->dataReader || !source->multiReader) {
|
||||||
code = tsdbReaderOpen(pHandle->vnode, pQueryCond, p, 1, pBlock, &source->dataReader, GET_TASKID(pTaskInfo));
|
code = tsdbReaderOpen(pHandle->vnode, pQueryCond, p, 1, pBlock, &source->dataReader, GET_TASKID(pTaskInfo), false);
|
||||||
if (code != 0) {
|
if (code != 0) {
|
||||||
T_LONG_JMP(pTaskInfo->env, code);
|
T_LONG_JMP(pTaskInfo->env, code);
|
||||||
}
|
}
|
||||||
|
@ -2608,8 +2659,21 @@ static SSDataBlock* getTableDataBlockImpl(void* param) {
|
||||||
|
|
||||||
pInfo->base.dataReader = source->dataReader;
|
pInfo->base.dataReader = source->dataReader;
|
||||||
STsdbReader* reader = pInfo->base.dataReader;
|
STsdbReader* reader = pInfo->base.dataReader;
|
||||||
|
bool hasNext = false;
|
||||||
qTrace("tsdb/read-table-data: %p, enter next reader", reader);
|
qTrace("tsdb/read-table-data: %p, enter next reader", reader);
|
||||||
while (tsdbNextDataBlock(reader)) {
|
|
||||||
|
while (true) {
|
||||||
|
code = tsdbNextDataBlock(reader, &hasNext);
|
||||||
|
if (code != 0) {
|
||||||
|
tsdbReleaseDataBlock(reader);
|
||||||
|
pInfo->base.dataReader = NULL;
|
||||||
|
T_LONG_JMP(pTaskInfo->env, code);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!hasNext) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
if (isTaskKilled(pTaskInfo)) {
|
if (isTaskKilled(pTaskInfo)) {
|
||||||
tsdbReleaseDataBlock(reader);
|
tsdbReleaseDataBlock(reader);
|
||||||
pInfo->base.dataReader = NULL;
|
pInfo->base.dataReader = NULL;
|
||||||
|
@ -2814,7 +2878,7 @@ SSDataBlock* getSortedTableMergeScanBlockData(SSortHandle* pHandle, SSDataBlock*
|
||||||
}
|
}
|
||||||
|
|
||||||
bool limitReached = applyLimitOffset(&pInfo->limitInfo, pResBlock, pTaskInfo);
|
bool limitReached = applyLimitOffset(&pInfo->limitInfo, pResBlock, pTaskInfo);
|
||||||
qDebug("%s get sorted row block, rows:%d, limit:%" PRId64, GET_TASKID(pTaskInfo), pResBlock->info.rows,
|
qDebug("%s get sorted row block, rows:%" PRId64 ", limit:%" PRId64, GET_TASKID(pTaskInfo), pResBlock->info.rows,
|
||||||
pInfo->limitInfo.numOfOutputRows);
|
pInfo->limitInfo.numOfOutputRows);
|
||||||
|
|
||||||
return (pResBlock->info.rows > 0) ? pResBlock : NULL;
|
return (pResBlock->info.rows > 0) ? pResBlock : NULL;
|
||||||
|
|
|
@ -698,7 +698,7 @@ SSDataBlock* getMultiwaySortedBlockData(SSortHandle* pHandle, SSDataBlock* pData
|
||||||
pDataBlock->info.dataLoad = 1;
|
pDataBlock->info.dataLoad = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
qDebug("%s get sorted block, groupId:0x%" PRIx64 " rows:%d", GET_TASKID(pTaskInfo), pDataBlock->info.id.groupId,
|
qDebug("%s get sorted block, groupId:0x%" PRIx64 " rows:%" PRId64 , GET_TASKID(pTaskInfo), pDataBlock->info.id.groupId,
|
||||||
pDataBlock->info.rows);
|
pDataBlock->info.rows);
|
||||||
|
|
||||||
return (pDataBlock->info.rows > 0) ? pDataBlock : NULL;
|
return (pDataBlock->info.rows > 0) ? pDataBlock : NULL;
|
||||||
|
|
|
@ -1627,7 +1627,7 @@ static void sysTableScanFillTbName(SOperatorInfo* pOperator, const SSysTableScan
|
||||||
char varTbName[TSDB_TABLE_FNAME_LEN - 1 + VARSTR_HEADER_SIZE] = {0};
|
char varTbName[TSDB_TABLE_FNAME_LEN - 1 + VARSTR_HEADER_SIZE] = {0};
|
||||||
STR_TO_VARSTR(varTbName, name);
|
STR_TO_VARSTR(varTbName, name);
|
||||||
|
|
||||||
colDataSetNItems(pColumnInfoData, 0, varTbName, pBlock->info.rows);
|
colDataSetNItems(pColumnInfoData, 0, varTbName, pBlock->info.rows, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
doFilter(pBlock, pOperator->exprSupp.pFilterInfo, NULL);
|
doFilter(pBlock, pOperator->exprSupp.pFilterInfo, NULL);
|
||||||
|
@ -2267,7 +2267,7 @@ SOperatorInfo* createDataBlockInfoScanOperator(SReadHandle* readHandle, SBlockDi
|
||||||
size_t num = tableListGetSize(pTableListInfo);
|
size_t num = tableListGetSize(pTableListInfo);
|
||||||
void* pList = tableListGetInfo(pTableListInfo, 0);
|
void* pList = tableListGetInfo(pTableListInfo, 0);
|
||||||
|
|
||||||
code = tsdbReaderOpen(readHandle->vnode, &cond, pList, num, pInfo->pResBlock, &pInfo->pHandle, pTaskInfo->id.str);
|
code = tsdbReaderOpen(readHandle->vnode, &cond, pList, num, pInfo->pResBlock, &pInfo->pHandle, pTaskInfo->id.str, false);
|
||||||
cleanupQueryTableDataCond(&cond);
|
cleanupQueryTableDataCond(&cond);
|
||||||
if (code != 0) {
|
if (code != 0) {
|
||||||
goto _error;
|
goto _error;
|
||||||
|
|
|
@ -128,8 +128,9 @@ FORCE_INLINE int32_t getForwardStepsInBlock(int32_t numOfRows, __block_search_fn
|
||||||
if (end >= 0) {
|
if (end >= 0) {
|
||||||
forwardRows = end;
|
forwardRows = end;
|
||||||
|
|
||||||
if (pData[end + pos] == ekey) {
|
while (pData[end + pos] == ekey) {
|
||||||
forwardRows += 1;
|
forwardRows += 1;
|
||||||
|
++pos;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
@ -137,8 +138,9 @@ FORCE_INLINE int32_t getForwardStepsInBlock(int32_t numOfRows, __block_search_fn
|
||||||
if (end >= 0) {
|
if (end >= 0) {
|
||||||
forwardRows = end;
|
forwardRows = end;
|
||||||
|
|
||||||
if (pData[end + pos] == ekey) {
|
while (pData[end + pos] == ekey) {
|
||||||
forwardRows += 1;
|
forwardRows += 1;
|
||||||
|
++pos;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// int32_t end = searchFn((char*)pData, pos + 1, ekey, order);
|
// int32_t end = searchFn((char*)pData, pos + 1, ekey, order);
|
||||||
|
@ -2110,10 +2112,12 @@ void compactFunctions(SqlFunctionCtx* pDestCtx, SqlFunctionCtx* pSourceCtx, int3
|
||||||
} else if (functionNeedToExecute(&pDestCtx[k]) && pDestCtx[k].fpSet.combine != NULL) {
|
} else if (functionNeedToExecute(&pDestCtx[k]) && pDestCtx[k].fpSet.combine != NULL) {
|
||||||
int32_t code = pDestCtx[k].fpSet.combine(&pDestCtx[k], &pSourceCtx[k]);
|
int32_t code = pDestCtx[k].fpSet.combine(&pDestCtx[k], &pSourceCtx[k]);
|
||||||
if (code != TSDB_CODE_SUCCESS) {
|
if (code != TSDB_CODE_SUCCESS) {
|
||||||
qError("%s apply functions error, code: %s", GET_TASKID(pTaskInfo), tstrerror(code));
|
qError("%s apply combine functions error, code: %s", GET_TASKID(pTaskInfo), tstrerror(code));
|
||||||
pTaskInfo->code = code;
|
|
||||||
T_LONG_JMP(pTaskInfo->env, code);
|
|
||||||
}
|
}
|
||||||
|
} else if (pDestCtx[k].fpSet.combine == NULL) {
|
||||||
|
char* funName = fmGetFuncName(pDestCtx[k].functionId);
|
||||||
|
qError("%s error, combine funcion for %s is not implemented", GET_TASKID(pTaskInfo), funName);
|
||||||
|
taosMemoryFreeClear(funName);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -2769,6 +2773,7 @@ SOperatorInfo* createStreamFinalIntervalOperatorInfo(SOperatorInfo* downstream,
|
||||||
pInfo->pPullDataMap = taosHashInit(64, hashFn, false, HASH_NO_LOCK);
|
pInfo->pPullDataMap = taosHashInit(64, hashFn, false, HASH_NO_LOCK);
|
||||||
pInfo->pPullDataRes = createSpecialDataBlock(STREAM_RETRIEVE);
|
pInfo->pPullDataRes = createSpecialDataBlock(STREAM_RETRIEVE);
|
||||||
pInfo->ignoreExpiredData = pIntervalPhyNode->window.igExpired;
|
pInfo->ignoreExpiredData = pIntervalPhyNode->window.igExpired;
|
||||||
|
pInfo->ignoreExpiredDataSaved = false;
|
||||||
pInfo->pDelRes = createSpecialDataBlock(STREAM_DELETE_RESULT);
|
pInfo->pDelRes = createSpecialDataBlock(STREAM_DELETE_RESULT);
|
||||||
pInfo->delIndex = 0;
|
pInfo->delIndex = 0;
|
||||||
pInfo->pDelWins = taosArrayInit(4, sizeof(SWinKey));
|
pInfo->pDelWins = taosArrayInit(4, sizeof(SWinKey));
|
||||||
|
@ -3587,6 +3592,7 @@ SOperatorInfo* createStreamSessionAggOperatorInfo(SOperatorInfo* downstream, SPh
|
||||||
pInfo->isFinal = false;
|
pInfo->isFinal = false;
|
||||||
pInfo->pPhyNode = pPhyNode;
|
pInfo->pPhyNode = pPhyNode;
|
||||||
pInfo->ignoreExpiredData = pSessionNode->window.igExpired;
|
pInfo->ignoreExpiredData = pSessionNode->window.igExpired;
|
||||||
|
pInfo->ignoreExpiredDataSaved = false;
|
||||||
pInfo->pUpdated = NULL;
|
pInfo->pUpdated = NULL;
|
||||||
pInfo->pStUpdated = NULL;
|
pInfo->pStUpdated = NULL;
|
||||||
|
|
||||||
|
@ -4112,6 +4118,7 @@ SOperatorInfo* createStreamStateAggOperatorInfo(SOperatorInfo* downstream, SPhys
|
||||||
pInfo->pDelRes = createSpecialDataBlock(STREAM_DELETE_RESULT);
|
pInfo->pDelRes = createSpecialDataBlock(STREAM_DELETE_RESULT);
|
||||||
pInfo->pChildren = NULL;
|
pInfo->pChildren = NULL;
|
||||||
pInfo->ignoreExpiredData = pStateNode->window.igExpired;
|
pInfo->ignoreExpiredData = pStateNode->window.igExpired;
|
||||||
|
pInfo->ignoreExpiredDataSaved = false;
|
||||||
pInfo->pUpdated = NULL;
|
pInfo->pUpdated = NULL;
|
||||||
pInfo->pSeUpdated = NULL;
|
pInfo->pSeUpdated = NULL;
|
||||||
|
|
||||||
|
@ -4885,6 +4892,7 @@ SOperatorInfo* createStreamIntervalOperatorInfo(SOperatorInfo* downstream, SPhys
|
||||||
pInfo->interval = interval;
|
pInfo->interval = interval;
|
||||||
pInfo->twAggSup = twAggSupp;
|
pInfo->twAggSup = twAggSupp;
|
||||||
pInfo->ignoreExpiredData = pIntervalPhyNode->window.igExpired;
|
pInfo->ignoreExpiredData = pIntervalPhyNode->window.igExpired;
|
||||||
|
pInfo->ignoreExpiredDataSaved = false;
|
||||||
pInfo->isFinal = false;
|
pInfo->isFinal = false;
|
||||||
|
|
||||||
SExprSupp* pSup = &pOperator->exprSupp;
|
SExprSupp* pSup = &pOperator->exprSupp;
|
||||||
|
|
|
@ -235,6 +235,7 @@ int32_t blockDistFinalize(SqlFunctionCtx* pCtx, SSDataBlock* pBlock);
|
||||||
bool getGroupKeyFuncEnv(SFunctionNode* pFunc, SFuncExecEnv* pEnv);
|
bool getGroupKeyFuncEnv(SFunctionNode* pFunc, SFuncExecEnv* pEnv);
|
||||||
int32_t groupKeyFunction(SqlFunctionCtx* pCtx);
|
int32_t groupKeyFunction(SqlFunctionCtx* pCtx);
|
||||||
int32_t groupKeyFinalize(SqlFunctionCtx* pCtx, SSDataBlock* pBlock);
|
int32_t groupKeyFinalize(SqlFunctionCtx* pCtx, SSDataBlock* pBlock);
|
||||||
|
int32_t groupKeyCombine(SqlFunctionCtx* pDestCtx, SqlFunctionCtx* pSourceCtx);
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
|
|
|
@ -2375,7 +2375,7 @@ const SBuiltinFuncDefinition funcMgtBuiltins[] = {
|
||||||
{
|
{
|
||||||
.name = "spread",
|
.name = "spread",
|
||||||
.type = FUNCTION_TYPE_SPREAD,
|
.type = FUNCTION_TYPE_SPREAD,
|
||||||
.classification = FUNC_MGT_AGG_FUNC,
|
.classification = FUNC_MGT_AGG_FUNC | FUNC_MGT_SPECIAL_DATA_REQUIRED,
|
||||||
.translateFunc = translateSpread,
|
.translateFunc = translateSpread,
|
||||||
.dataRequiredFunc = statisDataRequired,
|
.dataRequiredFunc = statisDataRequired,
|
||||||
.getEnvFunc = getSpreadFuncEnv,
|
.getEnvFunc = getSpreadFuncEnv,
|
||||||
|
@ -2417,7 +2417,7 @@ const SBuiltinFuncDefinition funcMgtBuiltins[] = {
|
||||||
{
|
{
|
||||||
.name = "elapsed",
|
.name = "elapsed",
|
||||||
.type = FUNCTION_TYPE_ELAPSED,
|
.type = FUNCTION_TYPE_ELAPSED,
|
||||||
.classification = FUNC_MGT_AGG_FUNC | FUNC_MGT_TIMELINE_FUNC | FUNC_MGT_INTERVAL_INTERPO_FUNC | FUNC_MGT_FORBID_STREAM_FUNC,
|
.classification = FUNC_MGT_AGG_FUNC | FUNC_MGT_TIMELINE_FUNC | FUNC_MGT_INTERVAL_INTERPO_FUNC | FUNC_MGT_FORBID_STREAM_FUNC | FUNC_MGT_SPECIAL_DATA_REQUIRED,
|
||||||
.dataRequiredFunc = statisDataRequired,
|
.dataRequiredFunc = statisDataRequired,
|
||||||
.translateFunc = translateElapsed,
|
.translateFunc = translateElapsed,
|
||||||
.getEnvFunc = getElapsedFuncEnv,
|
.getEnvFunc = getElapsedFuncEnv,
|
||||||
|
@ -2457,7 +2457,7 @@ const SBuiltinFuncDefinition funcMgtBuiltins[] = {
|
||||||
.name = "interp",
|
.name = "interp",
|
||||||
.type = FUNCTION_TYPE_INTERP,
|
.type = FUNCTION_TYPE_INTERP,
|
||||||
.classification = FUNC_MGT_TIMELINE_FUNC | FUNC_MGT_INTERVAL_INTERPO_FUNC | FUNC_MGT_IMPLICIT_TS_FUNC |
|
.classification = FUNC_MGT_TIMELINE_FUNC | FUNC_MGT_INTERVAL_INTERPO_FUNC | FUNC_MGT_IMPLICIT_TS_FUNC |
|
||||||
FUNC_MGT_FORBID_STREAM_FUNC,
|
FUNC_MGT_FORBID_STREAM_FUNC|FUNC_MGT_KEEP_ORDER_FUNC,
|
||||||
.translateFunc = translateInterp,
|
.translateFunc = translateInterp,
|
||||||
.getEnvFunc = getSelectivityFuncEnv,
|
.getEnvFunc = getSelectivityFuncEnv,
|
||||||
.initFunc = functionSetup,
|
.initFunc = functionSetup,
|
||||||
|
@ -2480,7 +2480,7 @@ const SBuiltinFuncDefinition funcMgtBuiltins[] = {
|
||||||
{
|
{
|
||||||
.name = "irate",
|
.name = "irate",
|
||||||
.type = FUNCTION_TYPE_IRATE,
|
.type = FUNCTION_TYPE_IRATE,
|
||||||
.classification = FUNC_MGT_AGG_FUNC | FUNC_MGT_TIMELINE_FUNC | FUNC_MGT_IMPLICIT_TS_FUNC,
|
.classification = FUNC_MGT_AGG_FUNC | FUNC_MGT_TIMELINE_FUNC | FUNC_MGT_IMPLICIT_TS_FUNC | FUNC_MGT_FORBID_STREAM_FUNC,
|
||||||
.translateFunc = translateIrate,
|
.translateFunc = translateIrate,
|
||||||
.getEnvFunc = getIrateFuncEnv,
|
.getEnvFunc = getIrateFuncEnv,
|
||||||
.initFunc = irateFuncSetup,
|
.initFunc = irateFuncSetup,
|
||||||
|
@ -2500,7 +2500,8 @@ const SBuiltinFuncDefinition funcMgtBuiltins[] = {
|
||||||
.sprocessFunc = firstLastScalarFunction,
|
.sprocessFunc = firstLastScalarFunction,
|
||||||
.pPartialFunc = "_last_row_partial",
|
.pPartialFunc = "_last_row_partial",
|
||||||
.pMergeFunc = "_last_row_merge",
|
.pMergeFunc = "_last_row_merge",
|
||||||
.finalizeFunc = firstLastFinalize
|
.finalizeFunc = firstLastFinalize,
|
||||||
|
.combineFunc = lastCombine
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
.name = "_cache_last_row",
|
.name = "_cache_last_row",
|
||||||
|
@ -2809,7 +2810,7 @@ const SBuiltinFuncDefinition funcMgtBuiltins[] = {
|
||||||
{
|
{
|
||||||
.name = "mode",
|
.name = "mode",
|
||||||
.type = FUNCTION_TYPE_MODE,
|
.type = FUNCTION_TYPE_MODE,
|
||||||
.classification = FUNC_MGT_AGG_FUNC | FUNC_MGT_SELECT_FUNC,
|
.classification = FUNC_MGT_AGG_FUNC | FUNC_MGT_SELECT_FUNC | FUNC_MGT_FORBID_STREAM_FUNC,
|
||||||
.translateFunc = translateMode,
|
.translateFunc = translateMode,
|
||||||
.getEnvFunc = getModeFuncEnv,
|
.getEnvFunc = getModeFuncEnv,
|
||||||
.initFunc = modeFunctionSetup,
|
.initFunc = modeFunctionSetup,
|
||||||
|
@ -3212,7 +3213,7 @@ const SBuiltinFuncDefinition funcMgtBuiltins[] = {
|
||||||
{
|
{
|
||||||
.name = "_block_dist",
|
.name = "_block_dist",
|
||||||
.type = FUNCTION_TYPE_BLOCK_DIST,
|
.type = FUNCTION_TYPE_BLOCK_DIST,
|
||||||
.classification = FUNC_MGT_AGG_FUNC,
|
.classification = FUNC_MGT_AGG_FUNC | FUNC_MGT_FORBID_STREAM_FUNC,
|
||||||
.translateFunc = translateBlockDistFunc,
|
.translateFunc = translateBlockDistFunc,
|
||||||
.getEnvFunc = getBlockDistFuncEnv,
|
.getEnvFunc = getBlockDistFuncEnv,
|
||||||
.initFunc = blockDistSetup,
|
.initFunc = blockDistSetup,
|
||||||
|
@ -3234,6 +3235,7 @@ const SBuiltinFuncDefinition funcMgtBuiltins[] = {
|
||||||
.initFunc = functionSetup,
|
.initFunc = functionSetup,
|
||||||
.processFunc = groupKeyFunction,
|
.processFunc = groupKeyFunction,
|
||||||
.finalizeFunc = groupKeyFinalize,
|
.finalizeFunc = groupKeyFinalize,
|
||||||
|
.combineFunc = groupKeyCombine,
|
||||||
.pPartialFunc = "_group_key",
|
.pPartialFunc = "_group_key",
|
||||||
.pMergeFunc = "_group_key"
|
.pMergeFunc = "_group_key"
|
||||||
},
|
},
|
||||||
|
@ -3276,7 +3278,7 @@ const SBuiltinFuncDefinition funcMgtBuiltins[] = {
|
||||||
{
|
{
|
||||||
.name = "_irowts",
|
.name = "_irowts",
|
||||||
.type = FUNCTION_TYPE_IROWTS,
|
.type = FUNCTION_TYPE_IROWTS,
|
||||||
.classification = FUNC_MGT_PSEUDO_COLUMN_FUNC | FUNC_MGT_INTERP_PC_FUNC,
|
.classification = FUNC_MGT_PSEUDO_COLUMN_FUNC | FUNC_MGT_INTERP_PC_FUNC|FUNC_MGT_KEEP_ORDER_FUNC,
|
||||||
.translateFunc = translateTimePseudoColumn,
|
.translateFunc = translateTimePseudoColumn,
|
||||||
.getEnvFunc = getTimePseudoFuncEnv,
|
.getEnvFunc = getTimePseudoFuncEnv,
|
||||||
.initFunc = NULL,
|
.initFunc = NULL,
|
||||||
|
|
|
@ -494,8 +494,8 @@ bool getCountFuncEnv(SFunctionNode* UNUSED_PARAM(pFunc), SFuncExecEnv* pEnv) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int32_t getNumOfElems(SqlFunctionCtx* pCtx) {
|
static int64_t getNumOfElems(SqlFunctionCtx* pCtx) {
|
||||||
int32_t numOfElem = 0;
|
int64_t numOfElem = 0;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* 1. column data missing (schema modified) causes pInputCol->hasNull == true. pInput->colDataSMAIsSet == true;
|
* 1. column data missing (schema modified) causes pInputCol->hasNull == true. pInput->colDataSMAIsSet == true;
|
||||||
|
@ -528,7 +528,7 @@ static int32_t getNumOfElems(SqlFunctionCtx* pCtx) {
|
||||||
* count function does not use the pCtx->interResBuf to keep the intermediate buffer
|
* count function does not use the pCtx->interResBuf to keep the intermediate buffer
|
||||||
*/
|
*/
|
||||||
int32_t countFunction(SqlFunctionCtx* pCtx) {
|
int32_t countFunction(SqlFunctionCtx* pCtx) {
|
||||||
int32_t numOfElem = 0;
|
int64_t numOfElem = 0;
|
||||||
|
|
||||||
SResultRowEntryInfo* pResInfo = GET_RES_INFO(pCtx);
|
SResultRowEntryInfo* pResInfo = GET_RES_INFO(pCtx);
|
||||||
SInputColumnInfoData* pInput = &pCtx->input;
|
SInputColumnInfoData* pInput = &pCtx->input;
|
||||||
|
@ -555,7 +555,7 @@ int32_t countFunction(SqlFunctionCtx* pCtx) {
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t countInvertFunction(SqlFunctionCtx* pCtx) {
|
int32_t countInvertFunction(SqlFunctionCtx* pCtx) {
|
||||||
int32_t numOfElem = getNumOfElems(pCtx);
|
int64_t numOfElem = getNumOfElems(pCtx);
|
||||||
|
|
||||||
SResultRowEntryInfo* pResInfo = GET_RES_INFO(pCtx);
|
SResultRowEntryInfo* pResInfo = GET_RES_INFO(pCtx);
|
||||||
char* buf = GET_ROWCELL_INTERBUF(pResInfo);
|
char* buf = GET_ROWCELL_INTERBUF(pResInfo);
|
||||||
|
@ -871,6 +871,12 @@ int32_t setSelectivityValue(SqlFunctionCtx* pCtx, SSDataBlock* pBlock, const STu
|
||||||
SqlFunctionCtx* pc = pCtx->subsidiaries.pCtx[j];
|
SqlFunctionCtx* pc = pCtx->subsidiaries.pCtx[j];
|
||||||
int32_t dstSlotId = pc->pExpr->base.resSchema.slotId;
|
int32_t dstSlotId = pc->pExpr->base.resSchema.slotId;
|
||||||
|
|
||||||
|
// group_key function has its own process function
|
||||||
|
// do not process there
|
||||||
|
if (fmIsGroupKeyFunc(pc->functionId)) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
SColumnInfoData* pDstCol = taosArrayGet(pBlock->pDataBlock, dstSlotId);
|
SColumnInfoData* pDstCol = taosArrayGet(pBlock->pDataBlock, dstSlotId);
|
||||||
if (nullList[j]) {
|
if (nullList[j]) {
|
||||||
colDataSetNULL(pDstCol, rowIndex);
|
colDataSetNULL(pDstCol, rowIndex);
|
||||||
|
@ -1929,7 +1935,7 @@ int32_t apercentileFunctionMerge(SqlFunctionCtx* pCtx) {
|
||||||
|
|
||||||
SAPercentileInfo* pInfo = GET_ROWCELL_INTERBUF(pResInfo);
|
SAPercentileInfo* pInfo = GET_ROWCELL_INTERBUF(pResInfo);
|
||||||
|
|
||||||
qDebug("%s total %d rows will merge, %p", __FUNCTION__, pInput->numOfRows, pInfo->pHisto);
|
qDebug("%s total %" PRId64 " rows will merge, %p", __FUNCTION__, pInput->numOfRows, pInfo->pHisto);
|
||||||
|
|
||||||
int32_t start = pInput->startRowIndex;
|
int32_t start = pInput->startRowIndex;
|
||||||
for (int32_t i = start; i < start + pInput->numOfRows; ++i) {
|
for (int32_t i = start; i < start + pInput->numOfRows; ++i) {
|
||||||
|
@ -3091,6 +3097,12 @@ void* serializeTupleData(const SSDataBlock* pSrcBlock, int32_t rowIndex, SSubsid
|
||||||
for (int32_t i = 0; i < pSubsidiaryies->num; ++i) {
|
for (int32_t i = 0; i < pSubsidiaryies->num; ++i) {
|
||||||
SqlFunctionCtx* pc = pSubsidiaryies->pCtx[i];
|
SqlFunctionCtx* pc = pSubsidiaryies->pCtx[i];
|
||||||
|
|
||||||
|
// group_key function has its own process function
|
||||||
|
// do not process there
|
||||||
|
if (fmIsGroupKeyFunc(pc->functionId)) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
SFunctParam* pFuncParam = &pc->pExpr->base.pParam[0];
|
SFunctParam* pFuncParam = &pc->pExpr->base.pParam[0];
|
||||||
int32_t srcSlotId = pFuncParam->pCol->slotId;
|
int32_t srcSlotId = pFuncParam->pCol->slotId;
|
||||||
|
|
||||||
|
@ -5900,6 +5912,39 @@ int32_t groupKeyFinalize(SqlFunctionCtx* pCtx, SSDataBlock* pBlock) {
|
||||||
return pResInfo->numOfRes;
|
return pResInfo->numOfRes;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int32_t groupKeyCombine(SqlFunctionCtx* pDestCtx, SqlFunctionCtx* pSourceCtx) {
|
||||||
|
SResultRowEntryInfo* pDResInfo = GET_RES_INFO(pDestCtx);
|
||||||
|
SGroupKeyInfo* pDBuf = GET_ROWCELL_INTERBUF(pDResInfo);
|
||||||
|
|
||||||
|
SResultRowEntryInfo* pSResInfo = GET_RES_INFO(pSourceCtx);
|
||||||
|
SGroupKeyInfo* pSBuf = GET_ROWCELL_INTERBUF(pSResInfo);
|
||||||
|
|
||||||
|
// escape rest of data blocks to avoid first entry to be overwritten.
|
||||||
|
if (pDBuf->hasResult) {
|
||||||
|
goto _group_key_over;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (pSBuf->isNull) {
|
||||||
|
pDBuf->isNull = true;
|
||||||
|
pDBuf->hasResult = true;
|
||||||
|
goto _group_key_over;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (IS_VAR_DATA_TYPE(pSourceCtx->resDataInfo.type)) {
|
||||||
|
memcpy(pDBuf->data, pSBuf->data,
|
||||||
|
(pSourceCtx->resDataInfo.type == TSDB_DATA_TYPE_JSON) ? getJsonValueLen(pSBuf->data) : varDataTLen(pSBuf->data));
|
||||||
|
} else {
|
||||||
|
memcpy(pDBuf->data, pSBuf->data, pSourceCtx->resDataInfo.bytes);
|
||||||
|
}
|
||||||
|
|
||||||
|
pDBuf->hasResult = true;
|
||||||
|
|
||||||
|
_group_key_over:
|
||||||
|
|
||||||
|
SET_VAL(pDResInfo, 1, 1);
|
||||||
|
return TSDB_CODE_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
int32_t cachedLastRowFunction(SqlFunctionCtx* pCtx) {
|
int32_t cachedLastRowFunction(SqlFunctionCtx* pCtx) {
|
||||||
int32_t numOfElems = 0;
|
int32_t numOfElems = 0;
|
||||||
|
|
||||||
|
|
|
@ -447,3 +447,10 @@ int32_t fmGetDistMethod(const SFunctionNode* pFunc, SFunctionNode** pPartialFunc
|
||||||
|
|
||||||
return code;
|
return code;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
char* fmGetFuncName(int32_t funcId) {
|
||||||
|
if (fmIsUserDefinedFunc(funcId) || funcId < 0 || funcId >= funcMgtBuiltinsNum) {
|
||||||
|
return taosStrdup("invalid function");
|
||||||
|
}
|
||||||
|
return taosStrdup(funcMgtBuiltins[funcId].name);
|
||||||
|
}
|
||||||
|
|
|
@ -183,16 +183,18 @@ static int32_t calcConstProject(SNode* pProject, bool dual, SNode** pNew) {
|
||||||
} else {
|
} else {
|
||||||
code = scalarCalculateConstants(pProject, pNew);
|
code = scalarCalculateConstants(pProject, pNew);
|
||||||
}
|
}
|
||||||
if (TSDB_CODE_SUCCESS == code && QUERY_NODE_VALUE == nodeType(*pNew) && NULL != pAssociation) {
|
if (TSDB_CODE_SUCCESS == code) {
|
||||||
strcpy(((SExprNode*)*pNew)->aliasName, aliasName);
|
strcpy(((SExprNode*)*pNew)->aliasName, aliasName);
|
||||||
int32_t size = taosArrayGetSize(pAssociation);
|
if (QUERY_NODE_VALUE == nodeType(*pNew) && NULL != pAssociation) {
|
||||||
for (int32_t i = 0; i < size; ++i) {
|
int32_t size = taosArrayGetSize(pAssociation);
|
||||||
SNode** pCol = taosArrayGetP(pAssociation, i);
|
for (int32_t i = 0; i < size; ++i) {
|
||||||
nodesDestroyNode(*pCol);
|
SNode** pCol = taosArrayGetP(pAssociation, i);
|
||||||
*pCol = nodesCloneNode(*pNew);
|
nodesDestroyNode(*pCol);
|
||||||
if (NULL == *pCol) {
|
*pCol = nodesCloneNode(*pNew);
|
||||||
code = TSDB_CODE_OUT_OF_MEMORY;
|
if (NULL == *pCol) {
|
||||||
break;
|
code = TSDB_CODE_OUT_OF_MEMORY;
|
||||||
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -383,7 +385,8 @@ static int32_t calcConstSetOpProjections(SCalcConstContext* pCxt, SSetOperator*
|
||||||
int32_t index = 0;
|
int32_t index = 0;
|
||||||
SNode* pProj = NULL;
|
SNode* pProj = NULL;
|
||||||
WHERE_EACH(pProj, pSetOp->pProjectionList) {
|
WHERE_EACH(pProj, pSetOp->pProjectionList) {
|
||||||
if (subquery && notRefByOrderBy((SColumnNode*)pProj, pSetOp->pOrderByList) && isSetUselessCol(pSetOp, index, (SExprNode*)pProj)) {
|
if (subquery && notRefByOrderBy((SColumnNode*)pProj, pSetOp->pOrderByList) &&
|
||||||
|
isSetUselessCol(pSetOp, index, (SExprNode*)pProj)) {
|
||||||
ERASE_NODE(pSetOp->pProjectionList);
|
ERASE_NODE(pSetOp->pProjectionList);
|
||||||
eraseSetOpChildProjection(pSetOp, index);
|
eraseSetOpChildProjection(pSetOp, index);
|
||||||
continue;
|
continue;
|
||||||
|
|
|
@ -25,6 +25,8 @@ static void clearColValArray(SArray* pCols) {
|
||||||
if (TSDB_DATA_TYPE_NCHAR == pCol->type) {
|
if (TSDB_DATA_TYPE_NCHAR == pCol->type) {
|
||||||
taosMemoryFreeClear(pCol->value.pData);
|
taosMemoryFreeClear(pCol->value.pData);
|
||||||
}
|
}
|
||||||
|
pCol->flag = CV_FLAG_NONE;
|
||||||
|
pCol->value.val = 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -566,53 +566,19 @@ int32_t insBuildVgDataBlocks(SHashObj* pVgroupsHashObj, SArray* pVgDataCxtList,
|
||||||
return code;
|
return code;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int bindFileds(SBoundColInfo* pBoundInfo, SSchema* pSchema, TAOS_FIELD* fields, int numFields) {
|
static bool findFileds(SSchema* pSchema, TAOS_FIELD* fields, int numFields) {
|
||||||
bool* pUseCols = taosMemoryCalloc(pBoundInfo->numOfCols, sizeof(bool));
|
|
||||||
if (NULL == pUseCols) {
|
|
||||||
return TSDB_CODE_OUT_OF_MEMORY;
|
|
||||||
}
|
|
||||||
|
|
||||||
pBoundInfo->numOfBound = 0;
|
|
||||||
|
|
||||||
int16_t lastColIdx = -1; // last column found
|
|
||||||
int32_t code = TSDB_CODE_SUCCESS;
|
|
||||||
for (int i = 0; i < numFields; i++) {
|
for (int i = 0; i < numFields; i++) {
|
||||||
SToken token;
|
if(strcmp(pSchema->name, fields[i].name) == 0){
|
||||||
token.z = fields[i].name;
|
return true;
|
||||||
token.n = strlen(fields[i].name);
|
|
||||||
|
|
||||||
int16_t t = lastColIdx + 1;
|
|
||||||
int16_t index = insFindCol(&token, t, pBoundInfo->numOfCols, pSchema);
|
|
||||||
if (index < 0 && t > 0) {
|
|
||||||
index = insFindCol(&token, 0, t, pSchema);
|
|
||||||
}
|
|
||||||
if (index < 0) {
|
|
||||||
uError("can not find column name:%s", token.z);
|
|
||||||
code = TSDB_CODE_PAR_INVALID_COLUMN;
|
|
||||||
break;
|
|
||||||
} else if (pUseCols[index]) {
|
|
||||||
code = TSDB_CODE_PAR_INVALID_COLUMN;
|
|
||||||
uError("duplicated column name:%s", token.z);
|
|
||||||
break;
|
|
||||||
} else {
|
|
||||||
lastColIdx = index;
|
|
||||||
pUseCols[index] = true;
|
|
||||||
pBoundInfo->pColIndex[pBoundInfo->numOfBound] = index;
|
|
||||||
++pBoundInfo->numOfBound;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (TSDB_CODE_SUCCESS == code && !pUseCols[0]) {
|
return false;
|
||||||
uError("primary timestamp column can not be null:");
|
|
||||||
code = TSDB_CODE_PAR_INVALID_COLUMN;
|
|
||||||
}
|
|
||||||
|
|
||||||
taosMemoryFree(pUseCols);
|
|
||||||
return code;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
int rawBlockBindData(SQuery* query, STableMeta* pTableMeta, void* data, SVCreateTbReq* pCreateTb, TAOS_FIELD* tFields,
|
int rawBlockBindData(SQuery* query, STableMeta* pTableMeta, void* data, SVCreateTbReq* pCreateTb, TAOS_FIELD* tFields,
|
||||||
int numFields, bool needChangeLength) {
|
int numFields, bool needChangeLength) {
|
||||||
|
void* tmp = taosHashGet(((SVnodeModifyOpStmt*)(query->pRoot))->pTableBlockHashObj, &pTableMeta->uid, sizeof(pTableMeta->uid));
|
||||||
STableDataCxt* pTableCxt = NULL;
|
STableDataCxt* pTableCxt = NULL;
|
||||||
int ret = insGetTableDataCxt(((SVnodeModifyOpStmt*)(query->pRoot))->pTableBlockHashObj, &pTableMeta->uid,
|
int ret = insGetTableDataCxt(((SVnodeModifyOpStmt*)(query->pRoot))->pTableBlockHashObj, &pTableMeta->uid,
|
||||||
sizeof(pTableMeta->uid), pTableMeta, &pCreateTb, &pTableCxt, true);
|
sizeof(pTableMeta->uid), pTableMeta, &pCreateTb, &pTableCxt, true);
|
||||||
|
@ -620,19 +586,14 @@ int rawBlockBindData(SQuery* query, STableMeta* pTableMeta, void* data, SVCreate
|
||||||
uError("insGetTableDataCxt error");
|
uError("insGetTableDataCxt error");
|
||||||
goto end;
|
goto end;
|
||||||
}
|
}
|
||||||
if (tFields != NULL) {
|
|
||||||
ret = bindFileds(&pTableCxt->boundColsInfo, getTableColumnSchema(pTableMeta), tFields, numFields);
|
if(tmp == NULL){
|
||||||
|
ret = initTableColSubmitData(pTableCxt);
|
||||||
if (ret != TSDB_CODE_SUCCESS) {
|
if (ret != TSDB_CODE_SUCCESS) {
|
||||||
uError("bindFileds error");
|
uError("initTableColSubmitData error");
|
||||||
goto end;
|
goto end;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// no need to bind, because select * get all fields
|
|
||||||
ret = initTableColSubmitData(pTableCxt);
|
|
||||||
if (ret != TSDB_CODE_SUCCESS) {
|
|
||||||
uError("initTableColSubmitData error");
|
|
||||||
goto end;
|
|
||||||
}
|
|
||||||
|
|
||||||
char* p = (char*)data;
|
char* p = (char*)data;
|
||||||
// | version | total length | total rows | total columns | flag seg| block group id | column schema | each column
|
// | version | total length | total rows | total columns | flag seg| block group id | column schema | each column
|
||||||
|
@ -660,35 +621,83 @@ int rawBlockBindData(SQuery* query, STableMeta* pTableMeta, void* data, SVCreate
|
||||||
SSchema* pSchema = getTableColumnSchema(pTableCxt->pMeta);
|
SSchema* pSchema = getTableColumnSchema(pTableCxt->pMeta);
|
||||||
SBoundColInfo* boundInfo = &pTableCxt->boundColsInfo;
|
SBoundColInfo* boundInfo = &pTableCxt->boundColsInfo;
|
||||||
|
|
||||||
if (boundInfo->numOfBound != numOfCols) {
|
if (tFields != NULL && numFields != numOfCols) {
|
||||||
uError("boundInfo->numOfBound:%d != numOfCols:%d", boundInfo->numOfBound, numOfCols);
|
uError("numFields:%d != numOfCols:%d", numFields, numOfCols);
|
||||||
ret = TSDB_CODE_INVALID_PARA;
|
ret = TSDB_CODE_INVALID_PARA;
|
||||||
goto end;
|
goto end;
|
||||||
}
|
}
|
||||||
for (int c = 0; c < boundInfo->numOfBound; ++c) {
|
if (tFields != NULL && numFields > boundInfo->numOfBound) {
|
||||||
SSchema* pColSchema = &pSchema[boundInfo->pColIndex[c]];
|
uError("numFields:%d > boundInfo->numOfBound:%d", numFields, boundInfo->numOfBound);
|
||||||
SColData* pCol = taosArrayGet(pTableCxt->pData->aCol, c);
|
ret = TSDB_CODE_INVALID_PARA;
|
||||||
|
goto end;
|
||||||
|
}
|
||||||
|
if(tFields == NULL){
|
||||||
|
for (int j = 0; j < boundInfo->numOfBound; j++){
|
||||||
|
SSchema* pColSchema = &pSchema[j];
|
||||||
|
SColData* pCol = taosArrayGet(pTableCxt->pData->aCol, j);
|
||||||
|
if (*fields != pColSchema->type && *(int32_t*)(fields + sizeof(int8_t)) != pColSchema->bytes) {
|
||||||
|
uError("type or bytes not equal");
|
||||||
|
ret = TSDB_CODE_INVALID_PARA;
|
||||||
|
goto end;
|
||||||
|
}
|
||||||
|
|
||||||
|
int8_t* offset = pStart;
|
||||||
|
if (IS_VAR_DATA_TYPE(pColSchema->type)) {
|
||||||
|
pStart += numOfRows * sizeof(int32_t);
|
||||||
|
} else {
|
||||||
|
pStart += BitmapLen(numOfRows);
|
||||||
|
}
|
||||||
|
char* pData = pStart;
|
||||||
|
|
||||||
|
tColDataAddValueByDataBlock(pCol, pColSchema->type, pColSchema->bytes, numOfRows, offset, pData);
|
||||||
|
fields += sizeof(int8_t) + sizeof(int32_t);
|
||||||
|
if (needChangeLength) {
|
||||||
|
pStart += htonl(colLength[j]);
|
||||||
|
} else {
|
||||||
|
pStart += colLength[j];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}else{
|
||||||
|
for (int i = 0; i < numFields; i++) {
|
||||||
|
for (int j = 0; j < boundInfo->numOfBound; j++){
|
||||||
|
SSchema* pColSchema = &pSchema[j];
|
||||||
|
if(strcmp(pColSchema->name, tFields[i].name) == 0){
|
||||||
|
if (*fields != pColSchema->type && *(int32_t*)(fields + sizeof(int8_t)) != pColSchema->bytes) {
|
||||||
|
uError("type or bytes not equal");
|
||||||
|
ret = TSDB_CODE_INVALID_PARA;
|
||||||
|
goto end;
|
||||||
|
}
|
||||||
|
|
||||||
|
int8_t* offset = pStart;
|
||||||
|
if (IS_VAR_DATA_TYPE(pColSchema->type)) {
|
||||||
|
pStart += numOfRows * sizeof(int32_t);
|
||||||
|
} else {
|
||||||
|
pStart += BitmapLen(numOfRows);
|
||||||
|
}
|
||||||
|
char* pData = pStart;
|
||||||
|
|
||||||
|
SColData* pCol = taosArrayGet(pTableCxt->pData->aCol, j);
|
||||||
|
tColDataAddValueByDataBlock(pCol, pColSchema->type, pColSchema->bytes, numOfRows, offset, pData);
|
||||||
|
fields += sizeof(int8_t) + sizeof(int32_t);
|
||||||
|
if (needChangeLength) {
|
||||||
|
pStart += htonl(colLength[i]);
|
||||||
|
} else {
|
||||||
|
pStart += colLength[i];
|
||||||
|
}
|
||||||
|
boundInfo->pColIndex[j] = -1;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (*fields != pColSchema->type && *(int32_t*)(fields + sizeof(int8_t)) != pColSchema->bytes) {
|
|
||||||
uError("type or bytes not equal");
|
|
||||||
ret = TSDB_CODE_INVALID_PARA;
|
|
||||||
goto end;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
int8_t* offset = pStart;
|
for (int c = 0; c < boundInfo->numOfBound; ++c) {
|
||||||
if (IS_VAR_DATA_TYPE(pColSchema->type)) {
|
if( boundInfo->pColIndex[c] != -1){
|
||||||
pStart += numOfRows * sizeof(int32_t);
|
SColData* pCol = taosArrayGet(pTableCxt->pData->aCol, c);
|
||||||
} else {
|
tColDataAddValueByDataBlock(pCol, 0, 0, numOfRows, NULL, NULL);
|
||||||
pStart += BitmapLen(numOfRows);
|
}else{
|
||||||
}
|
boundInfo->pColIndex[c] = c; // restore for next block
|
||||||
char* pData = pStart;
|
}
|
||||||
|
|
||||||
tColDataAddValueByDataBlock(pCol, pColSchema->type, pColSchema->bytes, numOfRows, offset, pData);
|
|
||||||
fields += sizeof(int8_t) + sizeof(int32_t);
|
|
||||||
if (needChangeLength) {
|
|
||||||
pStart += htonl(colLength[c]);
|
|
||||||
} else {
|
|
||||||
pStart += colLength[c];
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -757,7 +757,7 @@ static bool isPrimaryKeyImpl(SNode* pExpr) {
|
||||||
if (FUNCTION_TYPE_SELECT_VALUE == pFunc->funcType || FUNCTION_TYPE_GROUP_KEY == pFunc->funcType ||
|
if (FUNCTION_TYPE_SELECT_VALUE == pFunc->funcType || FUNCTION_TYPE_GROUP_KEY == pFunc->funcType ||
|
||||||
FUNCTION_TYPE_FIRST == pFunc->funcType || FUNCTION_TYPE_LAST == pFunc->funcType) {
|
FUNCTION_TYPE_FIRST == pFunc->funcType || FUNCTION_TYPE_LAST == pFunc->funcType) {
|
||||||
return isPrimaryKeyImpl(nodesListGetNode(pFunc->pParameterList, 0));
|
return isPrimaryKeyImpl(nodesListGetNode(pFunc->pParameterList, 0));
|
||||||
} else if (FUNCTION_TYPE_WSTART == pFunc->funcType || FUNCTION_TYPE_WEND == pFunc->funcType) {
|
} else if (FUNCTION_TYPE_WSTART == pFunc->funcType || FUNCTION_TYPE_WEND == pFunc->funcType || FUNCTION_TYPE_IROWTS == pFunc->funcType) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1342,8 +1342,8 @@ static bool isCountNotNullValue(SFunctionNode* pFunc) {
|
||||||
// count(1) is rewritten as count(ts) for scannning optimization
|
// count(1) is rewritten as count(ts) for scannning optimization
|
||||||
static int32_t rewriteCountNotNullValue(STranslateContext* pCxt, SFunctionNode* pCount) {
|
static int32_t rewriteCountNotNullValue(STranslateContext* pCxt, SFunctionNode* pCount) {
|
||||||
SValueNode* pValue = (SValueNode*)nodesListGetNode(pCount->pParameterList, 0);
|
SValueNode* pValue = (SValueNode*)nodesListGetNode(pCount->pParameterList, 0);
|
||||||
STableNode* pTable = NULL;
|
STableNode* pTable = NULL;
|
||||||
int32_t code = findTable(pCxt, NULL, &pTable);
|
int32_t code = findTable(pCxt, NULL, &pTable);
|
||||||
if (TSDB_CODE_SUCCESS == code && QUERY_NODE_REAL_TABLE == nodeType(pTable)) {
|
if (TSDB_CODE_SUCCESS == code && QUERY_NODE_REAL_TABLE == nodeType(pTable)) {
|
||||||
SColumnNode* pCol = (SColumnNode*)nodesMakeNode(QUERY_NODE_COLUMN);
|
SColumnNode* pCol = (SColumnNode*)nodesMakeNode(QUERY_NODE_COLUMN);
|
||||||
if (NULL == pCol) {
|
if (NULL == pCol) {
|
||||||
|
@ -1424,7 +1424,7 @@ static int32_t translateAggFunc(STranslateContext* pCxt, SFunctionNode* pFunc) {
|
||||||
}
|
}
|
||||||
if (isCountNotNullValue(pFunc)) {
|
if (isCountNotNullValue(pFunc)) {
|
||||||
return rewriteCountNotNullValue(pCxt, pFunc);
|
return rewriteCountNotNullValue(pCxt, pFunc);
|
||||||
}
|
}
|
||||||
if (isCountTbname(pFunc)) {
|
if (isCountTbname(pFunc)) {
|
||||||
return rewriteCountTbname(pCxt, pFunc);
|
return rewriteCountTbname(pCxt, pFunc);
|
||||||
}
|
}
|
||||||
|
@ -1634,13 +1634,15 @@ static bool isTableStar(SNode* pNode) {
|
||||||
(0 == strcmp(((SColumnNode*)pNode)->colName, "*"));
|
(0 == strcmp(((SColumnNode*)pNode)->colName, "*"));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static bool isStarParam(SNode* pNode) { return isStar(pNode) || isTableStar(pNode); }
|
||||||
|
|
||||||
static int32_t translateMultiResFunc(STranslateContext* pCxt, SFunctionNode* pFunc) {
|
static int32_t translateMultiResFunc(STranslateContext* pCxt, SFunctionNode* pFunc) {
|
||||||
if (!fmIsMultiResFunc(pFunc->funcId)) {
|
if (!fmIsMultiResFunc(pFunc->funcId)) {
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
if (SQL_CLAUSE_SELECT != pCxt->currClause) {
|
if (SQL_CLAUSE_SELECT != pCxt->currClause) {
|
||||||
SNode* pPara = nodesListGetNode(pFunc->pParameterList, 0);
|
SNode* pPara = nodesListGetNode(pFunc->pParameterList, 0);
|
||||||
if (isStar(pPara) || isTableStar(pPara)) {
|
if (isStarParam(pPara)) {
|
||||||
return generateSyntaxErrMsgExt(&pCxt->msgBuf, TSDB_CODE_PAR_NOT_ALLOWED_FUNC,
|
return generateSyntaxErrMsgExt(&pCxt->msgBuf, TSDB_CODE_PAR_NOT_ALLOWED_FUNC,
|
||||||
"%s(*) is only supported in SELECTed list", pFunc->functionName);
|
"%s(*) is only supported in SELECTed list", pFunc->functionName);
|
||||||
}
|
}
|
||||||
|
@ -1654,7 +1656,7 @@ static int32_t translateMultiResFunc(STranslateContext* pCxt, SFunctionNode* pFu
|
||||||
|
|
||||||
static int32_t getMultiResFuncNum(SNodeList* pParameterList) {
|
static int32_t getMultiResFuncNum(SNodeList* pParameterList) {
|
||||||
if (1 == LIST_LENGTH(pParameterList)) {
|
if (1 == LIST_LENGTH(pParameterList)) {
|
||||||
return isStar(nodesListGetNode(pParameterList, 0)) ? 2 : 1;
|
return isStarParam(nodesListGetNode(pParameterList, 0)) ? 2 : 1;
|
||||||
}
|
}
|
||||||
return LIST_LENGTH(pParameterList);
|
return LIST_LENGTH(pParameterList);
|
||||||
}
|
}
|
||||||
|
@ -5923,11 +5925,15 @@ static int32_t addSubtableInfoToCreateStreamQuery(STranslateContext* pCxt, STabl
|
||||||
return code;
|
return code;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static bool isEventWindowQuery(SSelectStmt* pSelect) {
|
||||||
|
return NULL != pSelect->pWindow && QUERY_NODE_EVENT_WINDOW == nodeType(pSelect->pWindow);
|
||||||
|
}
|
||||||
|
|
||||||
static int32_t checkStreamQuery(STranslateContext* pCxt, SCreateStreamStmt* pStmt) {
|
static int32_t checkStreamQuery(STranslateContext* pCxt, SCreateStreamStmt* pStmt) {
|
||||||
SSelectStmt* pSelect = (SSelectStmt*)pStmt->pQuery;
|
SSelectStmt* pSelect = (SSelectStmt*)pStmt->pQuery;
|
||||||
if (TSDB_DATA_TYPE_TIMESTAMP != ((SExprNode*)nodesListGetNode(pSelect->pProjectionList, 0))->resType.type ||
|
if (TSDB_DATA_TYPE_TIMESTAMP != ((SExprNode*)nodesListGetNode(pSelect->pProjectionList, 0))->resType.type ||
|
||||||
!pSelect->isTimeLineResult || crossTableWithoutAggOper(pSelect) || NULL != pSelect->pOrderByList ||
|
!pSelect->isTimeLineResult || crossTableWithoutAggOper(pSelect) || NULL != pSelect->pOrderByList ||
|
||||||
crossTableWithUdaf(pSelect)) {
|
crossTableWithUdaf(pSelect) || isEventWindowQuery(pSelect)) {
|
||||||
return generateSyntaxErrMsgExt(&pCxt->msgBuf, TSDB_CODE_PAR_INVALID_STREAM_QUERY, "Unsupported stream query");
|
return generateSyntaxErrMsgExt(&pCxt->msgBuf, TSDB_CODE_PAR_INVALID_STREAM_QUERY, "Unsupported stream query");
|
||||||
}
|
}
|
||||||
if (NULL != pSelect->pSubtable && TSDB_DATA_TYPE_VARCHAR != ((SExprNode*)pSelect->pSubtable)->resType.type) {
|
if (NULL != pSelect->pSubtable && TSDB_DATA_TYPE_VARCHAR != ((SExprNode*)pSelect->pSubtable)->resType.type) {
|
||||||
|
|
|
@ -1089,9 +1089,15 @@ static int32_t doCreateExchangePhysiNode(SPhysiPlanContext* pCxt, SExchangeLogic
|
||||||
pExchange->srcStartGroupId = pExchangeLogicNode->srcStartGroupId;
|
pExchange->srcStartGroupId = pExchangeLogicNode->srcStartGroupId;
|
||||||
pExchange->srcEndGroupId = pExchangeLogicNode->srcEndGroupId;
|
pExchange->srcEndGroupId = pExchangeLogicNode->srcEndGroupId;
|
||||||
pExchange->seqRecvData = pExchangeLogicNode->seqRecvData;
|
pExchange->seqRecvData = pExchangeLogicNode->seqRecvData;
|
||||||
*pPhyNode = (SPhysiNode*)pExchange;
|
|
||||||
|
|
||||||
return TSDB_CODE_SUCCESS;
|
int32_t code = setConditionsSlotId(pCxt, (const SLogicNode*)pExchangeLogicNode, (SPhysiNode*)pExchange);
|
||||||
|
if (TSDB_CODE_SUCCESS == code) {
|
||||||
|
*pPhyNode = (SPhysiNode*)pExchange;
|
||||||
|
} else {
|
||||||
|
nodesDestroyNode((SNode*)pExchange);
|
||||||
|
}
|
||||||
|
|
||||||
|
return code;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int32_t createStreamScanPhysiNodeByExchange(SPhysiPlanContext* pCxt, SExchangeLogicNode* pExchangeLogicNode,
|
static int32_t createStreamScanPhysiNodeByExchange(SPhysiPlanContext* pCxt, SExchangeLogicNode* pExchangeLogicNode,
|
||||||
|
@ -1119,6 +1125,9 @@ static int32_t createStreamScanPhysiNodeByExchange(SPhysiPlanContext* pCxt, SExc
|
||||||
if (TSDB_CODE_SUCCESS == code) {
|
if (TSDB_CODE_SUCCESS == code) {
|
||||||
code = addDataBlockSlots(pCxt, pScan->pScanCols, pScan->node.pOutputDataBlockDesc);
|
code = addDataBlockSlots(pCxt, pScan->pScanCols, pScan->node.pOutputDataBlockDesc);
|
||||||
}
|
}
|
||||||
|
if (TSDB_CODE_SUCCESS == code) {
|
||||||
|
code = setConditionsSlotId(pCxt, (const SLogicNode*)pExchangeLogicNode, (SPhysiNode*)pScan);
|
||||||
|
}
|
||||||
|
|
||||||
if (TSDB_CODE_SUCCESS == code) {
|
if (TSDB_CODE_SUCCESS == code) {
|
||||||
*pPhyNode = (SPhysiNode*)pScan;
|
*pPhyNode = (SPhysiNode*)pScan;
|
||||||
|
|
|
@ -1365,7 +1365,8 @@ static int32_t unAllSplCreateExchangeNode(SSplitContext* pCxt, int32_t startGrou
|
||||||
pExchange->srcEndGroupId = pCxt->groupId - 1;
|
pExchange->srcEndGroupId = pCxt->groupId - 1;
|
||||||
pExchange->node.precision = pProject->node.precision;
|
pExchange->node.precision = pProject->node.precision;
|
||||||
pExchange->node.pTargets = nodesCloneList(pProject->node.pTargets);
|
pExchange->node.pTargets = nodesCloneList(pProject->node.pTargets);
|
||||||
if (NULL == pExchange->node.pTargets) {
|
pExchange->node.pConditions = nodesCloneNode(pProject->node.pConditions);
|
||||||
|
if (NULL == pExchange->node.pTargets || (NULL != pProject->node.pConditions && NULL == pExchange->node.pConditions)) {
|
||||||
return TSDB_CODE_OUT_OF_MEMORY;
|
return TSDB_CODE_OUT_OF_MEMORY;
|
||||||
}
|
}
|
||||||
TSWAP(pExchange->node.pLimit, pProject->node.pLimit);
|
TSWAP(pExchange->node.pLimit, pProject->node.pLimit);
|
||||||
|
|
|
@ -199,7 +199,7 @@ int32_t qwExecTask(QW_FPARAMS_DEF, SQWTaskCtx *ctx, bool *queryStop) {
|
||||||
QW_ERR_JRET(code);
|
QW_ERR_JRET(code);
|
||||||
}
|
}
|
||||||
|
|
||||||
QW_TASK_DLOG("data put into sink, rows:%d, continueExecTask:%d", pRes->info.rows, qcontinue);
|
QW_TASK_DLOG("data put into sink, rows:%" PRId64 ", continueExecTask:%d", pRes->info.rows, qcontinue);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (numOfResBlock == 0 || (hasMore == false)) {
|
if (numOfResBlock == 0 || (hasMore == false)) {
|
||||||
|
|
|
@ -1755,7 +1755,11 @@ int32_t winEndTsFunction(SScalarParam *pInput, int32_t inputNum, SScalarParam *p
|
||||||
int32_t qTbnameFunction(SScalarParam *pInput, int32_t inputNum, SScalarParam *pOutput) {
|
int32_t qTbnameFunction(SScalarParam *pInput, int32_t inputNum, SScalarParam *pOutput) {
|
||||||
char* p = colDataGetVarData(pInput->columnData, 0);
|
char* p = colDataGetVarData(pInput->columnData, 0);
|
||||||
|
|
||||||
colDataSetNItems(pOutput->columnData, pOutput->numOfRows, p, pInput->numOfRows);
|
int32_t code = colDataSetNItems(pOutput->columnData, pOutput->numOfRows, p, pInput->numOfRows, true);
|
||||||
|
if (code) {
|
||||||
|
return code;
|
||||||
|
}
|
||||||
|
|
||||||
pOutput->numOfRows += pInput->numOfRows;
|
pOutput->numOfRows += pInput->numOfRows;
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
|
@ -275,7 +275,7 @@ int32_t streamProcessRetrieveReq(SStreamTask* pTask, SStreamRetrieveReq* pReq, S
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t streamProcessRetrieveRsp(SStreamTask* pTask, SStreamRetrieveRsp* pRsp) {
|
// int32_t streamProcessRetrieveRsp(SStreamTask* pTask, SStreamRetrieveRsp* pRsp) {
|
||||||
//
|
// //
|
||||||
return 0;
|
// return 0;
|
||||||
}
|
// }
|
||||||
|
|
|
@ -152,8 +152,14 @@ int32_t streamScanExec(SStreamTask* pTask, int32_t batchSz) {
|
||||||
if (batchCnt >= batchSz) break;
|
if (batchCnt >= batchSz) break;
|
||||||
}
|
}
|
||||||
if (taosArrayGetSize(pRes) == 0) {
|
if (taosArrayGetSize(pRes) == 0) {
|
||||||
taosArrayDestroy(pRes);
|
if (finished) {
|
||||||
break;
|
taosArrayDestroy(pRes);
|
||||||
|
qDebug("task %d finish recover exec task ", pTask->taskId);
|
||||||
|
break;
|
||||||
|
} else {
|
||||||
|
qDebug("task %d continue recover exec task ", pTask->taskId);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
SStreamDataBlock* qRes = taosAllocateQitem(sizeof(SStreamDataBlock), DEF_QITEM, 0);
|
SStreamDataBlock* qRes = taosAllocateQitem(sizeof(SStreamDataBlock), DEF_QITEM, 0);
|
||||||
if (qRes == NULL) {
|
if (qRes == NULL) {
|
||||||
|
|
|
@ -105,6 +105,7 @@ int32_t syncNodeOnAppendEntries(SSyncNode* ths, const SRpcMsg* pRpcMsg) {
|
||||||
SRpcMsg rpcRsp = {0};
|
SRpcMsg rpcRsp = {0};
|
||||||
bool accepted = false;
|
bool accepted = false;
|
||||||
SSyncRaftEntry* pEntry = NULL;
|
SSyncRaftEntry* pEntry = NULL;
|
||||||
|
bool resetElect = false;
|
||||||
|
|
||||||
// if already drop replica, do not process
|
// if already drop replica, do not process
|
||||||
if (!syncNodeInRaftGroup(ths, &(pMsg->srcId))) {
|
if (!syncNodeInRaftGroup(ths, &(pMsg->srcId))) {
|
||||||
|
@ -137,7 +138,7 @@ int32_t syncNodeOnAppendEntries(SSyncNode* ths, const SRpcMsg* pRpcMsg) {
|
||||||
}
|
}
|
||||||
|
|
||||||
syncNodeStepDown(ths, pMsg->term);
|
syncNodeStepDown(ths, pMsg->term);
|
||||||
syncNodeResetElectTimer(ths);
|
resetElect = true;
|
||||||
|
|
||||||
if (pMsg->dataLen < sizeof(SSyncRaftEntry)) {
|
if (pMsg->dataLen < sizeof(SSyncRaftEntry)) {
|
||||||
sError("vgId:%d, incomplete append entries received. prev index:%" PRId64 ", term:%" PRId64 ", datalen:%d",
|
sError("vgId:%d, incomplete append entries received. prev index:%" PRId64 ", term:%" PRId64 ", datalen:%d",
|
||||||
|
@ -184,10 +185,9 @@ _SEND_RESPONSE:
|
||||||
// commit index, i.e. leader notice me
|
// commit index, i.e. leader notice me
|
||||||
if (syncLogBufferCommit(ths->pLogBuf, ths, ths->commitIndex) < 0) {
|
if (syncLogBufferCommit(ths->pLogBuf, ths, ths->commitIndex) < 0) {
|
||||||
sError("vgId:%d, failed to commit raft fsm log since %s.", ths->vgId, terrstr());
|
sError("vgId:%d, failed to commit raft fsm log since %s.", ths->vgId, terrstr());
|
||||||
goto _out;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
_out:
|
if (resetElect) syncNodeResetElectTimer(ths);
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
_IGNORE:
|
_IGNORE:
|
||||||
|
|
|
@ -115,6 +115,5 @@ int32_t syncNodeElect(SSyncNode* pSyncNode) {
|
||||||
ASSERT(ret == 0);
|
ASSERT(ret == 0);
|
||||||
|
|
||||||
syncNodeResetElectTimer(pSyncNode);
|
syncNodeResetElectTimer(pSyncNode);
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
|
@ -182,6 +182,9 @@ int32_t syncProcessMsg(int64_t rid, SRpcMsg* pMsg) {
|
||||||
case TDMT_SYNC_TIMEOUT:
|
case TDMT_SYNC_TIMEOUT:
|
||||||
code = syncNodeOnTimeout(pSyncNode, pMsg);
|
code = syncNodeOnTimeout(pSyncNode, pMsg);
|
||||||
break;
|
break;
|
||||||
|
case TDMT_SYNC_TIMEOUT_ELECTION:
|
||||||
|
code = syncNodeOnTimeout(pSyncNode, pMsg);
|
||||||
|
break;
|
||||||
case TDMT_SYNC_CLIENT_REQUEST:
|
case TDMT_SYNC_CLIENT_REQUEST:
|
||||||
code = syncNodeOnClientRequest(pSyncNode, pMsg, NULL);
|
code = syncNodeOnClientRequest(pSyncNode, pMsg, NULL);
|
||||||
break;
|
break;
|
||||||
|
@ -1593,8 +1596,8 @@ void syncNodeBecomeFollower(SSyncNode* pSyncNode, const char* debugStr) {
|
||||||
pSyncNode->state = TAOS_SYNC_STATE_FOLLOWER;
|
pSyncNode->state = TAOS_SYNC_STATE_FOLLOWER;
|
||||||
syncNodeStopHeartbeatTimer(pSyncNode);
|
syncNodeStopHeartbeatTimer(pSyncNode);
|
||||||
|
|
||||||
// reset elect timer
|
// trace log
|
||||||
syncNodeResetElectTimer(pSyncNode);
|
sNTrace(pSyncNode, "become follower %s", debugStr);
|
||||||
|
|
||||||
// send rsp to client
|
// send rsp to client
|
||||||
syncNodeLeaderChangeRsp(pSyncNode);
|
syncNodeLeaderChangeRsp(pSyncNode);
|
||||||
|
@ -1610,8 +1613,8 @@ void syncNodeBecomeFollower(SSyncNode* pSyncNode, const char* debugStr) {
|
||||||
// reset log buffer
|
// reset log buffer
|
||||||
syncLogBufferReset(pSyncNode->pLogBuf, pSyncNode);
|
syncLogBufferReset(pSyncNode->pLogBuf, pSyncNode);
|
||||||
|
|
||||||
// trace log
|
// reset elect timer
|
||||||
sNTrace(pSyncNode, "become follower %s", debugStr);
|
syncNodeResetElectTimer(pSyncNode);
|
||||||
}
|
}
|
||||||
|
|
||||||
// TLA+ Spec
|
// TLA+ Spec
|
||||||
|
@ -2277,6 +2280,7 @@ static int32_t syncNodeAppendNoopOld(SSyncNode* ths) {
|
||||||
|
|
||||||
int32_t syncNodeOnHeartbeat(SSyncNode* ths, const SRpcMsg* pRpcMsg) {
|
int32_t syncNodeOnHeartbeat(SSyncNode* ths, const SRpcMsg* pRpcMsg) {
|
||||||
SyncHeartbeat* pMsg = pRpcMsg->pCont;
|
SyncHeartbeat* pMsg = pRpcMsg->pCont;
|
||||||
|
bool resetElect = false;
|
||||||
|
|
||||||
const STraceId* trace = &pRpcMsg->info.traceId;
|
const STraceId* trace = &pRpcMsg->info.traceId;
|
||||||
char tbuf[40] = {0};
|
char tbuf[40] = {0};
|
||||||
|
@ -2300,12 +2304,11 @@ int32_t syncNodeOnHeartbeat(SSyncNode* ths, const SRpcMsg* pRpcMsg) {
|
||||||
|
|
||||||
if (pMsg->term == currentTerm && ths->state != TAOS_SYNC_STATE_LEADER) {
|
if (pMsg->term == currentTerm && ths->state != TAOS_SYNC_STATE_LEADER) {
|
||||||
syncIndexMgrSetRecvTime(ths->pNextIndex, &(pMsg->srcId), tsMs);
|
syncIndexMgrSetRecvTime(ths->pNextIndex, &(pMsg->srcId), tsMs);
|
||||||
|
resetElect = true;
|
||||||
|
|
||||||
syncNodeResetElectTimer(ths);
|
|
||||||
ths->minMatchIndex = pMsg->minMatchIndex;
|
ths->minMatchIndex = pMsg->minMatchIndex;
|
||||||
|
|
||||||
if (ths->state == TAOS_SYNC_STATE_FOLLOWER) {
|
if (ths->state == TAOS_SYNC_STATE_FOLLOWER) {
|
||||||
// syncNodeFollowerCommit(ths, pMsg->commitIndex);
|
|
||||||
SRpcMsg rpcMsgLocalCmd = {0};
|
SRpcMsg rpcMsgLocalCmd = {0};
|
||||||
(void)syncBuildLocalCmd(&rpcMsgLocalCmd, ths->vgId);
|
(void)syncBuildLocalCmd(&rpcMsgLocalCmd, ths->vgId);
|
||||||
|
|
||||||
|
@ -2328,7 +2331,6 @@ int32_t syncNodeOnHeartbeat(SSyncNode* ths, const SRpcMsg* pRpcMsg) {
|
||||||
}
|
}
|
||||||
|
|
||||||
if (pMsg->term >= currentTerm && ths->state != TAOS_SYNC_STATE_FOLLOWER) {
|
if (pMsg->term >= currentTerm && ths->state != TAOS_SYNC_STATE_FOLLOWER) {
|
||||||
// syncNodeStepDown(ths, pMsg->term);
|
|
||||||
SRpcMsg rpcMsgLocalCmd = {0};
|
SRpcMsg rpcMsgLocalCmd = {0};
|
||||||
(void)syncBuildLocalCmd(&rpcMsgLocalCmd, ths->vgId);
|
(void)syncBuildLocalCmd(&rpcMsgLocalCmd, ths->vgId);
|
||||||
|
|
||||||
|
@ -2348,15 +2350,10 @@ int32_t syncNodeOnHeartbeat(SSyncNode* ths, const SRpcMsg* pRpcMsg) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
// htonl
|
|
||||||
SMsgHead* pHead = rpcMsg.pCont;
|
|
||||||
pHead->contLen = htonl(pHead->contLen);
|
|
||||||
pHead->vgId = htonl(pHead->vgId);
|
|
||||||
*/
|
|
||||||
|
|
||||||
// reply
|
// reply
|
||||||
syncNodeSendMsgById(&pMsgReply->destId, ths, &rpcMsg);
|
syncNodeSendMsgById(&pMsgReply->destId, ths, &rpcMsg);
|
||||||
|
|
||||||
|
if (resetElect) syncNodeResetElectTimer(ths);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -22,7 +22,7 @@ int32_t syncBuildTimeout(SRpcMsg* pMsg, ESyncTimeoutType timeoutType, uint64_t l
|
||||||
SSyncNode* pNode) {
|
SSyncNode* pNode) {
|
||||||
int32_t bytes = sizeof(SyncTimeout);
|
int32_t bytes = sizeof(SyncTimeout);
|
||||||
pMsg->pCont = rpcMallocCont(bytes);
|
pMsg->pCont = rpcMallocCont(bytes);
|
||||||
pMsg->msgType = TDMT_SYNC_TIMEOUT;
|
pMsg->msgType = (timeoutType == SYNC_TIMEOUT_ELECTION) ? TDMT_SYNC_TIMEOUT_ELECTION : TDMT_SYNC_TIMEOUT;
|
||||||
pMsg->contLen = bytes;
|
pMsg->contLen = bytes;
|
||||||
if (pMsg->pCont == NULL) {
|
if (pMsg->pCont == NULL) {
|
||||||
terrno = TSDB_CODE_OUT_OF_MEMORY;
|
terrno = TSDB_CODE_OUT_OF_MEMORY;
|
||||||
|
@ -31,7 +31,7 @@ int32_t syncBuildTimeout(SRpcMsg* pMsg, ESyncTimeoutType timeoutType, uint64_t l
|
||||||
|
|
||||||
SyncTimeout* pTimeout = pMsg->pCont;
|
SyncTimeout* pTimeout = pMsg->pCont;
|
||||||
pTimeout->bytes = bytes;
|
pTimeout->bytes = bytes;
|
||||||
pTimeout->msgType = TDMT_SYNC_TIMEOUT;
|
pTimeout->msgType = pMsg->msgType;
|
||||||
pTimeout->vgId = pNode->vgId;
|
pTimeout->vgId = pNode->vgId;
|
||||||
pTimeout->timeoutType = timeoutType;
|
pTimeout->timeoutType = timeoutType;
|
||||||
pTimeout->logicClock = logicClock;
|
pTimeout->logicClock = logicClock;
|
||||||
|
|
|
@ -89,6 +89,7 @@ static bool syncNodeOnRequestVoteLogOK(SSyncNode* ths, SyncRequestVote* pMsg) {
|
||||||
int32_t syncNodeOnRequestVote(SSyncNode* ths, const SRpcMsg* pRpcMsg) {
|
int32_t syncNodeOnRequestVote(SSyncNode* ths, const SRpcMsg* pRpcMsg) {
|
||||||
int32_t ret = 0;
|
int32_t ret = 0;
|
||||||
SyncRequestVote* pMsg = pRpcMsg->pCont;
|
SyncRequestVote* pMsg = pRpcMsg->pCont;
|
||||||
|
bool resetElect = false;
|
||||||
|
|
||||||
// if already drop replica, do not process
|
// if already drop replica, do not process
|
||||||
if (!syncNodeInRaftGroup(ths, &pMsg->srcId)) {
|
if (!syncNodeInRaftGroup(ths, &pMsg->srcId)) {
|
||||||
|
@ -115,7 +116,7 @@ int32_t syncNodeOnRequestVote(SSyncNode* ths, const SRpcMsg* pRpcMsg) {
|
||||||
syncNodeStepDown(ths, currentTerm);
|
syncNodeStepDown(ths, currentTerm);
|
||||||
|
|
||||||
// forbid elect for this round
|
// forbid elect for this round
|
||||||
syncNodeResetElectTimer(ths);
|
resetElect = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
// send msg
|
// send msg
|
||||||
|
@ -134,5 +135,7 @@ int32_t syncNodeOnRequestVote(SSyncNode* ths, const SRpcMsg* pRpcMsg) {
|
||||||
syncLogRecvRequestVote(ths, pMsg, pReply->voteGranted, "");
|
syncLogRecvRequestVote(ths, pMsg, pReply->voteGranted, "");
|
||||||
syncLogSendRequestVoteReply(ths, pReply, "");
|
syncLogSendRequestVoteReply(ths, pReply, "");
|
||||||
syncNodeSendMsgById(&pReply->destId, ths, &rpcMsg);
|
syncNodeSendMsgById(&pReply->destId, ths, &rpcMsg);
|
||||||
|
|
||||||
|
if (resetElect) syncNodeResetElectTimer(ths);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
|
@ -798,7 +798,6 @@ int32_t syncNodeOnSnapshot(SSyncNode *pSyncNode, const SRpcMsg *pRpcMsg) {
|
||||||
if (pMsg->term > raftStoreGetTerm(pSyncNode)) {
|
if (pMsg->term > raftStoreGetTerm(pSyncNode)) {
|
||||||
syncNodeStepDown(pSyncNode, pMsg->term);
|
syncNodeStepDown(pSyncNode, pMsg->term);
|
||||||
}
|
}
|
||||||
syncNodeResetElectTimer(pSyncNode);
|
|
||||||
|
|
||||||
// state, term, seq/ack
|
// state, term, seq/ack
|
||||||
int32_t code = 0;
|
int32_t code = 0;
|
||||||
|
@ -840,6 +839,7 @@ int32_t syncNodeOnSnapshot(SSyncNode *pSyncNode, const SRpcMsg *pRpcMsg) {
|
||||||
code = -1;
|
code = -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
syncNodeResetElectTimer(pSyncNode);
|
||||||
return code;
|
return code;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -120,9 +120,6 @@ int32_t syncNodeOnTimeout(SSyncNode* ths, const SRpcMsg* pRpc) {
|
||||||
if (atomic_load_64(&ths->pingTimerLogicClockUser) <= pMsg->logicClock) {
|
if (atomic_load_64(&ths->pingTimerLogicClockUser) <= pMsg->logicClock) {
|
||||||
++(ths->pingTimerCounter);
|
++(ths->pingTimerCounter);
|
||||||
|
|
||||||
// syncNodePingAll(ths);
|
|
||||||
// syncNodePingPeers(ths);
|
|
||||||
|
|
||||||
syncNodeTimerRoutine(ths);
|
syncNodeTimerRoutine(ths);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -138,8 +135,6 @@ int32_t syncNodeOnTimeout(SSyncNode* ths, const SRpcMsg* pRpc) {
|
||||||
++(ths->heartbeatTimerCounter);
|
++(ths->heartbeatTimerCounter);
|
||||||
sTrace("vgId:%d, sync timer, type:replicate count:%" PRIu64 ", lc-user:%" PRIu64, ths->vgId,
|
sTrace("vgId:%d, sync timer, type:replicate count:%" PRIu64 ", lc-user:%" PRIu64, ths->vgId,
|
||||||
ths->heartbeatTimerCounter, ths->heartbeatTimerLogicClockUser);
|
ths->heartbeatTimerCounter, ths->heartbeatTimerLogicClockUser);
|
||||||
|
|
||||||
// syncNodeReplicate(ths, true);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
|
|
|
@ -140,7 +140,7 @@ void taosArrayRemoveDuplicate(SArray* pArray, __compar_fn_t comparFn, void (*fp)
|
||||||
|
|
||||||
taosArraySet(pArray, pos + 1, p2);
|
taosArraySet(pArray, pos + 1, p2);
|
||||||
memset(TARRAY_GET_ELEM(pArray, i), 0, pArray->elemSize);
|
memset(TARRAY_GET_ELEM(pArray, i), 0, pArray->elemSize);
|
||||||
pos += 1;
|
pos += 1;
|
||||||
} else {
|
} else {
|
||||||
pos += 1;
|
pos += 1;
|
||||||
}
|
}
|
||||||
|
@ -157,45 +157,6 @@ void taosArrayRemoveDuplicate(SArray* pArray, __compar_fn_t comparFn, void (*fp)
|
||||||
pArray->size = pos + 1;
|
pArray->size = pos + 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
void taosArrayRemoveDuplicateP(SArray* pArray, __compar_fn_t comparFn, void (*fp)(void*)) {
|
|
||||||
size_t size = pArray->size;
|
|
||||||
if (size <= 1) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
int32_t pos = 0;
|
|
||||||
for (int32_t i = 1; i < size; ++i) {
|
|
||||||
char* p1 = taosArrayGet(pArray, pos);
|
|
||||||
char* p2 = taosArrayGet(pArray, i);
|
|
||||||
|
|
||||||
if (comparFn(p1, p2) == 0) {
|
|
||||||
// do nothing
|
|
||||||
} else {
|
|
||||||
if (pos + 1 != i) {
|
|
||||||
void* p = taosArrayGetP(pArray, pos + 1);
|
|
||||||
if (fp != NULL) {
|
|
||||||
fp(p);
|
|
||||||
}
|
|
||||||
|
|
||||||
taosArraySet(pArray, pos + 1, p2);
|
|
||||||
memset(TARRAY_GET_ELEM(pArray, i), 0, pArray->elemSize);
|
|
||||||
pos += 1;
|
|
||||||
} else {
|
|
||||||
pos += 1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (fp != NULL) {
|
|
||||||
for (int32_t i = pos + 1; i < pArray->size; ++i) {
|
|
||||||
void* p = taosArrayGetP(pArray, i);
|
|
||||||
fp(p);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
pArray->size = pos + 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
void* taosArrayAddAll(SArray* pArray, const SArray* pInput) {
|
void* taosArrayAddAll(SArray* pArray, const SArray* pInput) {
|
||||||
if (pInput) {
|
if (pInput) {
|
||||||
return taosArrayAddBatch(pArray, pInput->pData, (int32_t)taosArrayGetSize(pInput));
|
return taosArrayAddBatch(pArray, pInput->pData, (int32_t)taosArrayGetSize(pInput));
|
||||||
|
@ -392,20 +353,6 @@ void taosArrayClearEx(SArray* pArray, void (*fp)(void*)) {
|
||||||
pArray->size = 0;
|
pArray->size = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
void taosArrayClearP(SArray* pArray, FDelete fp) {
|
|
||||||
if (pArray == NULL) return;
|
|
||||||
if (fp == NULL) {
|
|
||||||
pArray->size = 0;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
for (int32_t i = 0; i < pArray->size; ++i) {
|
|
||||||
fp(*(void**)TARRAY_GET_ELEM(pArray, i));
|
|
||||||
}
|
|
||||||
|
|
||||||
pArray->size = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
void* taosArrayDestroy(SArray* pArray) {
|
void* taosArrayDestroy(SArray* pArray) {
|
||||||
if (pArray) {
|
if (pArray) {
|
||||||
taosMemoryFree(pArray->pData);
|
taosMemoryFree(pArray->pData);
|
||||||
|
@ -495,6 +442,7 @@ static void taosArrayInsertSort(SArray* pArray, __ext_compar_fn_t fn, const void
|
||||||
if (pArray->size <= 1) {
|
if (pArray->size <= 1) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
for (int32_t i = 1; i <= pArray->size - 1; ++i) {
|
for (int32_t i = 1; i <= pArray->size - 1; ++i) {
|
||||||
for (int32_t j = i; j > 0; --j) {
|
for (int32_t j = i; j > 0; --j) {
|
||||||
if (fn(taosArrayGetP(pArray, j), taosArrayGetP(pArray, j - 1), param) == -1) {
|
if (fn(taosArrayGetP(pArray, j), taosArrayGetP(pArray, j - 1), param) == -1) {
|
||||||
|
@ -507,7 +455,6 @@ static void taosArrayInsertSort(SArray* pArray, __ext_compar_fn_t fn, const void
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t taosEncodeArray(void** buf, const SArray* pArray, FEncode encode) {
|
int32_t taosEncodeArray(void** buf, const SArray* pArray, FEncode encode) {
|
||||||
|
@ -556,4 +503,4 @@ void taosArraySwap(SArray* a, SArray* b) {
|
||||||
void* data = a->pData;
|
void* data = a->pData;
|
||||||
a->pData = b->pData;
|
a->pData = b->pData;
|
||||||
b->pData = data;
|
b->pData = data;
|
||||||
}
|
}
|
|
@ -637,6 +637,8 @@ int32_t cfgLoadFromEnvVar(SConfig *pConfig) {
|
||||||
int32_t code = 0;
|
int32_t code = 0;
|
||||||
char **pEnv = environ;
|
char **pEnv = environ;
|
||||||
line[1023] = 0;
|
line[1023] = 0;
|
||||||
|
|
||||||
|
if (pEnv == NULL) return 0;
|
||||||
while (*pEnv != NULL) {
|
while (*pEnv != NULL) {
|
||||||
name = value = value2 = value3 = NULL;
|
name = value = value2 = value3 = NULL;
|
||||||
olen = vlen = vlen2 = vlen3 = 0;
|
olen = vlen = vlen2 = vlen3 = 0;
|
||||||
|
|
|
@ -28,19 +28,23 @@
|
||||||
|
|
||||||
#define HASH_INDEX(v, c) ((v) & ((c)-1))
|
#define HASH_INDEX(v, c) ((v) & ((c)-1))
|
||||||
|
|
||||||
#define FREE_HASH_NODE(_n) \
|
#define FREE_HASH_NODE(_n, fp) \
|
||||||
do { \
|
do { \
|
||||||
taosMemoryFreeClear(_n); \
|
if (fp) { \
|
||||||
|
fp((_n)->data); \
|
||||||
|
} \
|
||||||
|
taosMemoryFreeClear(_n); \
|
||||||
} while (0);
|
} while (0);
|
||||||
|
|
||||||
struct SSHashObj {
|
struct SSHashObj {
|
||||||
SHNode **hashList;
|
SHNode **hashList;
|
||||||
size_t capacity; // number of slots
|
size_t capacity; // number of slots
|
||||||
int64_t size; // number of elements in hash table
|
int64_t size; // number of elements in hash table
|
||||||
_hash_fn_t hashFp; // hash function
|
_hash_fn_t hashFp; // hash function
|
||||||
_equal_fn_t equalFp; // equal function
|
_equal_fn_t equalFp; // equal function
|
||||||
SArray* pHashNodeBuf;// hash node allocation buffer, 1k size of each page by default
|
_hash_free_fn_t freeFp; // free function
|
||||||
int32_t offset; // allocation offset in current page
|
SArray *pHashNodeBuf; // hash node allocation buffer, 1k size of each page by default
|
||||||
|
int32_t offset; // allocation offset in current page
|
||||||
};
|
};
|
||||||
|
|
||||||
static FORCE_INLINE int32_t taosHashCapacity(int32_t length) {
|
static FORCE_INLINE int32_t taosHashCapacity(int32_t length) {
|
||||||
|
@ -71,7 +75,7 @@ SSHashObj *tSimpleHashInit(size_t capacity, _hash_fn_t fn) {
|
||||||
pHashObj->capacity = taosHashCapacity((int32_t)capacity);
|
pHashObj->capacity = taosHashCapacity((int32_t)capacity);
|
||||||
pHashObj->equalFp = memcmp;
|
pHashObj->equalFp = memcmp;
|
||||||
|
|
||||||
pHashObj->pHashNodeBuf = taosArrayInit(10, sizeof(void*));
|
pHashObj->freeFp = NULL;
|
||||||
pHashObj->offset = 0;
|
pHashObj->offset = 0;
|
||||||
pHashObj->size = 0;
|
pHashObj->size = 0;
|
||||||
|
|
||||||
|
@ -92,6 +96,10 @@ int32_t tSimpleHashGetSize(const SSHashObj *pHashObj) {
|
||||||
return (int32_t) pHashObj->size;
|
return (int32_t) pHashObj->size;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void tSimpleHashSetFreeFp(SSHashObj* pHashObj, _hash_free_fn_t freeFp) {
|
||||||
|
pHashObj->freeFp = freeFp;
|
||||||
|
}
|
||||||
|
|
||||||
static void* doInternalAlloc(SSHashObj* pHashObj, int32_t size) {
|
static void* doInternalAlloc(SSHashObj* pHashObj, int32_t size) {
|
||||||
#if 0
|
#if 0
|
||||||
void** p = taosArrayGetLast(pHashObj->pHashNodeBuf);
|
void** p = taosArrayGetLast(pHashObj->pHashNodeBuf);
|
||||||
|
@ -306,7 +314,8 @@ int32_t tSimpleHashRemove(SSHashObj *pHashObj, const void *key, size_t keyLen) {
|
||||||
} else {
|
} else {
|
||||||
pPrev->next = pNode->next;
|
pPrev->next = pNode->next;
|
||||||
}
|
}
|
||||||
FREE_HASH_NODE(pNode);
|
|
||||||
|
FREE_HASH_NODE(pNode, pHashObj->freeFp);
|
||||||
pHashObj->size -= 1;
|
pHashObj->size -= 1;
|
||||||
code = TSDB_CODE_SUCCESS;
|
code = TSDB_CODE_SUCCESS;
|
||||||
break;
|
break;
|
||||||
|
@ -341,7 +350,7 @@ int32_t tSimpleHashIterateRemove(SSHashObj *pHashObj, const void *key, size_t ke
|
||||||
*pIter = pPrev ? GET_SHASH_NODE_DATA(pPrev) : NULL;
|
*pIter = pPrev ? GET_SHASH_NODE_DATA(pPrev) : NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
FREE_HASH_NODE(pNode);
|
FREE_HASH_NODE(pNode, pHashObj->freeFp);
|
||||||
pHashObj->size -= 1;
|
pHashObj->size -= 1;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -370,14 +379,13 @@ void tSimpleHashClear(SSHashObj *pHashObj) {
|
||||||
|
|
||||||
while (pNode) {
|
while (pNode) {
|
||||||
pNext = pNode->next;
|
pNext = pNode->next;
|
||||||
FREE_HASH_NODE(pNode);
|
FREE_HASH_NODE(pNode, pHashObj->freeFp);
|
||||||
pNode = pNext;
|
pNode = pNext;
|
||||||
}
|
}
|
||||||
|
|
||||||
pHashObj->hashList[i] = NULL;
|
pHashObj->hashList[i] = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
taosArrayClearEx(pHashObj->pHashNodeBuf, destroyItems);
|
|
||||||
pHashObj->offset = 0;
|
pHashObj->offset = 0;
|
||||||
pHashObj->size = 0;
|
pHashObj->size = 0;
|
||||||
}
|
}
|
||||||
|
@ -388,7 +396,6 @@ void tSimpleHashCleanup(SSHashObj *pHashObj) {
|
||||||
}
|
}
|
||||||
|
|
||||||
tSimpleHashClear(pHashObj);
|
tSimpleHashClear(pHashObj);
|
||||||
taosArrayDestroy(pHashObj->pHashNodeBuf);
|
|
||||||
taosMemoryFreeClear(pHashObj->hashList);
|
taosMemoryFreeClear(pHashObj->hashList);
|
||||||
taosMemoryFree(pHashObj);
|
taosMemoryFree(pHashObj);
|
||||||
}
|
}
|
||||||
|
|
|
@ -26,8 +26,9 @@ int32_t taosVersionStrToInt(const char *vstr, int32_t *vint) {
|
||||||
int32_t vnum[4] = {0};
|
int32_t vnum[4] = {0};
|
||||||
int32_t len = strlen(vstr);
|
int32_t len = strlen(vstr);
|
||||||
char tmp[16] = {0};
|
char tmp[16] = {0};
|
||||||
|
int32_t vpos = 0;
|
||||||
|
|
||||||
for (int32_t spos = 0, tpos = 0, vpos = 0; spos < len && vpos < 4; ++spos) {
|
for (int32_t spos = 0, tpos = 0; spos < len && vpos < 4; ++spos) {
|
||||||
if (vstr[spos] != '.') {
|
if (vstr[spos] != '.') {
|
||||||
tmp[spos - tpos] = vstr[spos];
|
tmp[spos - tpos] = vstr[spos];
|
||||||
} else {
|
} else {
|
||||||
|
@ -38,6 +39,10 @@ int32_t taosVersionStrToInt(const char *vstr, int32_t *vint) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if ('\0' != tmp[0] && vpos < 4) {
|
||||||
|
vnum[vpos] = atoi(tmp);
|
||||||
|
}
|
||||||
|
|
||||||
if (vnum[0] <= 0) {
|
if (vnum[0] <= 0) {
|
||||||
terrno = TSDB_CODE_INVALID_VERSION_STRING;
|
terrno = TSDB_CODE_INVALID_VERSION_STRING;
|
||||||
return -1;
|
return -1;
|
||||||
|
@ -66,16 +71,16 @@ int32_t taosCheckVersionCompatible(int32_t clientVer, int32_t serverVer, int32_t
|
||||||
case 4:
|
case 4:
|
||||||
break;
|
break;
|
||||||
case 3:
|
case 3:
|
||||||
clientVer %= 100;
|
clientVer /= 100;
|
||||||
serverVer %= 100;
|
serverVer /= 100;
|
||||||
break;
|
break;
|
||||||
case 2:
|
case 2:
|
||||||
clientVer %= 10000;
|
clientVer /= 10000;
|
||||||
serverVer %= 10000;
|
serverVer /= 10000;
|
||||||
break;
|
break;
|
||||||
case 1:
|
case 1:
|
||||||
clientVer %= 1000000;
|
clientVer /= 1000000;
|
||||||
serverVer %= 1000000;
|
serverVer /= 1000000;
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
terrno = TSDB_CODE_INVALID_VERSION_NUMBER;
|
terrno = TSDB_CODE_INVALID_VERSION_NUMBER;
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
char version[64] = "${TD_VER_NUMBER}";
|
char version[64] = "${TD_VER_NUMBER}";
|
||||||
char compatible_version[12] = "${TD_VER_COMPATIBLE}";
|
char compatible_version[12] = "${TD_VER_COMPATIBLE}";
|
||||||
char gitinfo[48] = "${TD_VER_GIT}";
|
char gitinfo[48] = "${TD_VER_GIT}";
|
||||||
|
char gitinfoOfInternal[48] = "${TD_VER_GIT_INTERNAL}";
|
||||||
char buildinfo[64] = "Built at ${TD_VER_DATE}";
|
char buildinfo[64] = "Built at ${TD_VER_DATE}";
|
||||||
|
|
||||||
void libtaos_${TD_LIB_VER_NUMBER}_${TD_VER_OSTYPE}_${TD_VER_CPUTYPE}_${TD_VER_VERTYPE}() {};
|
void libtaos_${TD_LIB_VER_NUMBER}_${TD_VER_OSTYPE}_${TD_VER_CPUTYPE}_${TD_VER_VERTYPE}() {};
|
||||||
|
|
|
@ -16,7 +16,7 @@
|
||||||
"num_of_records_per_req": 10,
|
"num_of_records_per_req": 10,
|
||||||
"databases": [{
|
"databases": [{
|
||||||
"dbinfo": {
|
"dbinfo": {
|
||||||
"name": "db",
|
"name": "opentsdb_telnet",
|
||||||
"drop": "yes"
|
"drop": "yes"
|
||||||
},
|
},
|
||||||
"super_tables": [{
|
"super_tables": [{
|
||||||
|
|
|
@ -10,18 +10,21 @@
|
||||||
,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/nestedQuery_str.py
|
,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/nestedQuery_str.py
|
||||||
,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/nestedQuery_math.py
|
,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/nestedQuery_math.py
|
||||||
,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/nestedQuery_time.py
|
,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/nestedQuery_time.py
|
||||||
|
,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/nestedQuery_26.py
|
||||||
,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/nestedQuery_str.py -Q 2
|
,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/nestedQuery_str.py -Q 2
|
||||||
,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/nestedQuery_math.py -Q 2
|
,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/nestedQuery_math.py -Q 2
|
||||||
,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/nestedQuery_time.py -Q 2
|
,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/nestedQuery_time.py -Q 2
|
||||||
,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/nestedQuery.py -Q 2
|
,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/nestedQuery.py -Q 2
|
||||||
,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/nestedQuery.py -Q 3
|
,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/nestedQuery_26.py -Q 2
|
||||||
,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/nestedQuery_str.py -Q 3
|
,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/columnLenUpdated.py
|
||||||
,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/nestedQuery_math.py -Q 3
|
,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/columnLenUpdated.py -Q 2
|
||||||
,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/nestedQuery_time.py -Q 3
|
,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/columnLenUpdated.py -Q 3
|
||||||
|
,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/columnLenUpdated.py -Q 4
|
||||||
,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/nestedQuery.py -Q 4
|
,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/nestedQuery.py -Q 4
|
||||||
,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/nestedQuery_str.py -Q 4
|
,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/nestedQuery_str.py -Q 4
|
||||||
,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/nestedQuery_math.py -Q 4
|
,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/nestedQuery_math.py -Q 4
|
||||||
,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/nestedQuery_time.py -Q 4
|
,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/nestedQuery_time.py -Q 4
|
||||||
|
,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/nestedQuery_26.py -Q 4
|
||||||
,,y,system-test,./pytest.sh python3 ./test.py -f 7-tmq/tmqShow.py
|
,,y,system-test,./pytest.sh python3 ./test.py -f 7-tmq/tmqShow.py
|
||||||
,,y,system-test,./pytest.sh python3 ./test.py -f 7-tmq/tmqDropStb.py
|
,,y,system-test,./pytest.sh python3 ./test.py -f 7-tmq/tmqDropStb.py
|
||||||
,,y,system-test,./pytest.sh python3 ./test.py -f 7-tmq/subscribeStb0.py
|
,,y,system-test,./pytest.sh python3 ./test.py -f 7-tmq/subscribeStb0.py
|
||||||
|
@ -43,6 +46,11 @@
|
||||||
,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/concat.py -Q 3
|
,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/concat.py -Q 3
|
||||||
,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/out_of_order.py -Q 2
|
,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/out_of_order.py -Q 2
|
||||||
,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/out_of_order.py -Q 4
|
,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/out_of_order.py -Q 4
|
||||||
|
,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/nestedQuery.py -Q 3
|
||||||
|
,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/nestedQuery_str.py -Q 3
|
||||||
|
,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/nestedQuery_math.py -Q 3
|
||||||
|
,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/nestedQuery_time.py -Q 3
|
||||||
|
,,y,system-test,./pytest.sh python3 ./test.py -f 2-query/nestedQuery_26.py -Q 3
|
||||||
|
|
||||||
,,y,system-test,./pytest.sh python3 ./test.py -f 7-tmq/create_wrong_topic.py
|
,,y,system-test,./pytest.sh python3 ./test.py -f 7-tmq/create_wrong_topic.py
|
||||||
,,y,system-test,./pytest.sh python3 ./test.py -f 7-tmq/dropDbR3ConflictTransaction.py -N 3
|
,,y,system-test,./pytest.sh python3 ./test.py -f 7-tmq/dropDbR3ConflictTransaction.py -N 3
|
||||||
|
@ -93,6 +101,7 @@
|
||||||
,,y,system-test,./pytest.sh python3 ./test.py -f 7-tmq/dataFromTsdbNWal.py
|
,,y,system-test,./pytest.sh python3 ./test.py -f 7-tmq/dataFromTsdbNWal.py
|
||||||
,,y,system-test,./pytest.sh python3 ./test.py -f 7-tmq/dataFromTsdbNWal-multiCtb.py
|
,,y,system-test,./pytest.sh python3 ./test.py -f 7-tmq/dataFromTsdbNWal-multiCtb.py
|
||||||
,,y,system-test,./pytest.sh python3 ./test.py -f 7-tmq/tmq_taosx.py
|
,,y,system-test,./pytest.sh python3 ./test.py -f 7-tmq/tmq_taosx.py
|
||||||
|
,,y,system-test,./pytest.sh python3 ./test.py -f 7-tmq/raw_block_interface_test.py
|
||||||
,,y,system-test,./pytest.sh python3 ./test.py -f 7-tmq/stbTagFilter-multiCtb.py
|
,,y,system-test,./pytest.sh python3 ./test.py -f 7-tmq/stbTagFilter-multiCtb.py
|
||||||
,,y,system-test,./pytest.sh python3 ./test.py -f 7-tmq/tmqSubscribeStb-r3.py -N 5
|
,,y,system-test,./pytest.sh python3 ./test.py -f 7-tmq/tmqSubscribeStb-r3.py -N 5
|
||||||
,,y,system-test,./pytest.sh python3 ./test.py -f 7-tmq/tmq3mnodeSwitch.py -N 6 -M 3
|
,,y,system-test,./pytest.sh python3 ./test.py -f 7-tmq/tmq3mnodeSwitch.py -N 6 -M 3
|
||||||
|
@ -864,6 +873,8 @@
|
||||||
,,y,script,./test.sh -f tsim/query/session.sim
|
,,y,script,./test.sh -f tsim/query/session.sim
|
||||||
,,y,script,./test.sh -f tsim/query/udf.sim
|
,,y,script,./test.sh -f tsim/query/udf.sim
|
||||||
,,y,script,./test.sh -f tsim/query/udf_with_const.sim
|
,,y,script,./test.sh -f tsim/query/udf_with_const.sim
|
||||||
|
,,y,script,./test.sh -f tsim/query/join_interval.sim
|
||||||
|
,,y,script,./test.sh -f tsim/query/unionall_as_table.sim
|
||||||
,,y,script,./test.sh -f tsim/query/sys_tbname.sim
|
,,y,script,./test.sh -f tsim/query/sys_tbname.sim
|
||||||
,,y,script,./test.sh -f tsim/query/groupby.sim
|
,,y,script,./test.sh -f tsim/query/groupby.sim
|
||||||
,,y,script,./test.sh -f tsim/query/event.sim
|
,,y,script,./test.sh -f tsim/query/event.sim
|
||||||
|
@ -1102,9 +1113,9 @@
|
||||||
,,n,develop-test,python3 ./test.py -f 5-taos-tools/taosbenchmark/json_tag.py
|
,,n,develop-test,python3 ./test.py -f 5-taos-tools/taosbenchmark/json_tag.py
|
||||||
,,n,develop-test,python3 ./test.py -f 5-taos-tools/taosbenchmark/query_json.py
|
,,n,develop-test,python3 ./test.py -f 5-taos-tools/taosbenchmark/query_json.py
|
||||||
,,n,develop-test,python3 ./test.py -f 5-taos-tools/taosbenchmark/sample_csv_json.py
|
,,n,develop-test,python3 ./test.py -f 5-taos-tools/taosbenchmark/sample_csv_json.py
|
||||||
#,,n,develop-test,python3 ./test.py -f 5-taos-tools/taosbenchmark/sml_json_alltypes.py
|
,,n,develop-test,python3 ./test.py -f 5-taos-tools/taosbenchmark/sml_json_alltypes.py
|
||||||
,,n,develop-test,python3 ./test.py -f 5-taos-tools/taosbenchmark/taosdemoTestQueryWithJson.py -R
|
,,n,develop-test,python3 ./test.py -f 5-taos-tools/taosbenchmark/taosdemoTestQueryWithJson.py -R
|
||||||
#,,n,develop-test,python3 ./test.py -f 5-taos-tools/taosbenchmark/telnet_tcp.py -R
|
,,n,develop-test,python3 ./test.py -f 5-taos-tools/taosbenchmark/telnet_tcp.py -R
|
||||||
|
|
||||||
#docs-examples test
|
#docs-examples test
|
||||||
,,n,docs-examples-test,bash python.sh
|
,,n,docs-examples-test,bash python.sh
|
||||||
|
|
|
@ -167,8 +167,10 @@ function run_thread() {
|
||||||
local case_build_san=`echo "$line"|cut -d, -f3`
|
local case_build_san=`echo "$line"|cut -d, -f3`
|
||||||
if [ "${case_build_san}" == "y" ]; then
|
if [ "${case_build_san}" == "y" ]; then
|
||||||
case_build_san="y"
|
case_build_san="y"
|
||||||
|
DEBUGPATH="debugSan"
|
||||||
elif [[ "${case_build_san}" == "n" ]] || [[ "${case_build_san}" == "" ]]; then
|
elif [[ "${case_build_san}" == "n" ]] || [[ "${case_build_san}" == "" ]]; then
|
||||||
case_build_san="n"
|
case_build_san="n"
|
||||||
|
DEBUGPATH="debugNoSan"
|
||||||
else
|
else
|
||||||
usage
|
usage
|
||||||
exit 1
|
exit 1
|
||||||
|
@ -301,10 +303,10 @@ function run_thread() {
|
||||||
if [ ! -z "$corefile" ]; then
|
if [ ! -z "$corefile" ]; then
|
||||||
echo -e "\e[34m corefiles: $corefile \e[0m"
|
echo -e "\e[34m corefiles: $corefile \e[0m"
|
||||||
local build_dir=$log_dir/build_${hosts[index]}
|
local build_dir=$log_dir/build_${hosts[index]}
|
||||||
local remote_build_dir="${workdirs[index]}/TDengine/debug/build"
|
local remote_build_dir="${workdirs[index]}/{DEBUGPATH}/build"
|
||||||
if [ $ent -ne 0 ]; then
|
# if [ $ent -ne 0 ]; then
|
||||||
remote_build_dir="${workdirs[index]}/TDinternal/debug/build"
|
# remote_build_dir="${workdirs[index]}/{DEBUGPATH}/build"
|
||||||
fi
|
# fi
|
||||||
mkdir $build_dir 2>/dev/null
|
mkdir $build_dir 2>/dev/null
|
||||||
if [ $? -eq 0 ]; then
|
if [ $? -eq 0 ]; then
|
||||||
# scp build binary
|
# scp build binary
|
||||||
|
|
|
@ -0,0 +1,42 @@
|
||||||
|
|
||||||
|
system sh/stop_dnodes.sh
|
||||||
|
system sh/deploy.sh -n dnode1 -i 1
|
||||||
|
system sh/cfg.sh -n dnode1 -c udf -v 1
|
||||||
|
system sh/exec.sh -n dnode1 -s start
|
||||||
|
sql connect
|
||||||
|
|
||||||
|
print ======== step create databases
|
||||||
|
sql create database d1
|
||||||
|
sql create database d2
|
||||||
|
sql create table d1.t1(ts timestamp, i int) tags(t int);
|
||||||
|
sql create table d2.t1(ts timestamp, i int);
|
||||||
|
sql insert into d1.t11 using d1.t1 tags(1) values(1500000000000, 0)(1500000000001, 1)(1500000000002,2)(1500000000003,3)(1500000000004,4)
|
||||||
|
sql insert into d1.t12 using d1.t1 tags(2) values(1500000000000, 0)(1500000000001, 1)(1500000000002,2)(1500000000003,3)(1500000000004,4)
|
||||||
|
sql insert into d1.t13 using d1.t1 tags(3) values(1500000000000, 0)(1500000000001, 1)(1500000000002,2)(1500000000003,3)(1500000000004,4)
|
||||||
|
|
||||||
|
sql insert into d2.t1 values(1500000000000,0)(1500000000001,1)(1500000000002,2)
|
||||||
|
|
||||||
|
sql select _wstart,_wend,count((a.ts)),count(b.ts) from d1.t1 a, d2.t1 b where a.ts is not null and a.ts = b.ts interval(1a) ;
|
||||||
|
if $data02 != 3 then
|
||||||
|
return -1
|
||||||
|
endi
|
||||||
|
|
||||||
|
if $data03 != 3 then
|
||||||
|
return -1
|
||||||
|
endi
|
||||||
|
|
||||||
|
if $data12 != 3 then
|
||||||
|
return -1
|
||||||
|
endi
|
||||||
|
|
||||||
|
if $data13 != 3 then
|
||||||
|
return -1
|
||||||
|
endi
|
||||||
|
if $data22 != 3 then
|
||||||
|
return -1
|
||||||
|
endi
|
||||||
|
|
||||||
|
if $data23 != 3 then
|
||||||
|
return -1
|
||||||
|
endi
|
||||||
|
system sh/exec.sh -n dnode1 -s stop -x SIGINT
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue