Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
taosdata
TDengine
提交
f37f4088
T
TDengine
项目概览
taosdata
/
TDengine
大约 2 年 前同步成功
通知
1192
Star
22018
Fork
4786
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
1
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
T
TDengine
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
1
Issue
1
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
未验证
提交
f37f4088
编写于
4月 17, 2023
作者:
X
Xiaoyu Wang
提交者:
GitHub
4月 17, 2023
浏览文件
操作
浏览文件
下载
差异文件
Merge pull request #20950 from taosdata/fix/3.0_merge_main
merge main
上级
2c52b000
7efb9925
变更
73
展开全部
隐藏空白更改
内联
并排
Showing
73 changed file
with
1739 addition
and
1098 deletion
+1739
-1098
include/common/tglobal.h
include/common/tglobal.h
+1
-0
include/libs/executor/executor.h
include/libs/executor/executor.h
+7
-12
include/libs/function/functionMgt.h
include/libs/function/functionMgt.h
+1
-1
include/libs/function/taosudf.h
include/libs/function/taosudf.h
+2
-0
include/libs/qcom/query.h
include/libs/qcom/query.h
+1
-0
include/libs/stream/streamState.h
include/libs/stream/streamState.h
+1
-0
include/libs/stream/tstream.h
include/libs/stream/tstream.h
+81
-98
include/libs/wal/wal.h
include/libs/wal/wal.h
+3
-1
packaging/debRpmAutoInstall.sh
packaging/debRpmAutoInstall.sh
+1
-1
packaging/testpackage.sh
packaging/testpackage.sh
+1
-1
source/client/inc/clientInt.h
source/client/inc/clientInt.h
+1
-35
source/client/src/clientImpl.c
source/client/src/clientImpl.c
+1
-3
source/client/src/clientTmq.c
source/client/src/clientTmq.c
+32
-17
source/common/src/tdatablock.c
source/common/src/tdatablock.c
+5
-1
source/common/src/tglobal.c
source/common/src/tglobal.c
+4
-0
source/dnode/mgmt/mgmt_snode/src/smInt.c
source/dnode/mgmt/mgmt_snode/src/smInt.c
+1
-0
source/dnode/mgmt/mgmt_vnode/src/vmInt.c
source/dnode/mgmt/mgmt_vnode/src/vmInt.c
+6
-0
source/dnode/mnode/impl/src/mndDef.c
source/dnode/mnode/impl/src/mndDef.c
+10
-4
source/dnode/mnode/impl/src/mndScheduler.c
source/dnode/mnode/impl/src/mndScheduler.c
+10
-9
source/dnode/mnode/impl/src/mndStream.c
source/dnode/mnode/impl/src/mndStream.c
+7
-7
source/dnode/mnode/impl/src/mndSubscribe.c
source/dnode/mnode/impl/src/mndSubscribe.c
+1
-1
source/dnode/snode/src/snode.c
source/dnode/snode/src/snode.c
+11
-11
source/dnode/vnode/CMakeLists.txt
source/dnode/vnode/CMakeLists.txt
+2
-0
source/dnode/vnode/inc/vnode.h
source/dnode/vnode/inc/vnode.h
+6
-5
source/dnode/vnode/src/inc/tq.h
source/dnode/vnode/src/inc/tq.h
+17
-5
source/dnode/vnode/src/inc/vnd.h
source/dnode/vnode/src/inc/vnd.h
+1
-2
source/dnode/vnode/src/inc/vnodeInt.h
source/dnode/vnode/src/inc/vnodeInt.h
+3
-2
source/dnode/vnode/src/meta/metaCache.c
source/dnode/vnode/src/meta/metaCache.c
+6
-5
source/dnode/vnode/src/sma/smaRollup.c
source/dnode/vnode/src/sma/smaRollup.c
+1
-1
source/dnode/vnode/src/tq/tq.c
source/dnode/vnode/src/tq/tq.c
+192
-473
source/dnode/vnode/src/tq/tqCommit.c
source/dnode/vnode/src/tq/tqCommit.c
+3
-0
source/dnode/vnode/src/tq/tqMeta.c
source/dnode/vnode/src/tq/tqMeta.c
+5
-5
source/dnode/vnode/src/tq/tqOffset.c
source/dnode/vnode/src/tq/tqOffset.c
+16
-9
source/dnode/vnode/src/tq/tqPush.c
source/dnode/vnode/src/tq/tqPush.c
+15
-5
source/dnode/vnode/src/tq/tqRead.c
source/dnode/vnode/src/tq/tqRead.c
+74
-29
source/dnode/vnode/src/tq/tqRestore.c
source/dnode/vnode/src/tq/tqRestore.c
+167
-0
source/dnode/vnode/src/tq/tqScan.c
source/dnode/vnode/src/tq/tqScan.c
+9
-9
source/dnode/vnode/src/tq/tqSink.c
source/dnode/vnode/src/tq/tqSink.c
+5
-7
source/dnode/vnode/src/tq/tqUtil.c
source/dnode/vnode/src/tq/tqUtil.c
+462
-0
source/dnode/vnode/src/tsdb/tsdbRead.c
source/dnode/vnode/src/tsdb/tsdbRead.c
+8
-7
source/dnode/vnode/src/tsdb/tsdbUtil.c
source/dnode/vnode/src/tsdb/tsdbUtil.c
+5
-0
source/dnode/vnode/src/vnd/vnodeCommit.c
source/dnode/vnode/src/vnd/vnodeCommit.c
+3
-2
source/dnode/vnode/src/vnd/vnodeSvr.c
source/dnode/vnode/src/vnd/vnodeSvr.c
+1
-6
source/dnode/vnode/src/vnd/vnodeSync.c
source/dnode/vnode/src/vnd/vnodeSync.c
+19
-12
source/libs/executor/inc/executorimpl.h
source/libs/executor/inc/executorimpl.h
+9
-10
source/libs/executor/src/executor.c
source/libs/executor/src/executor.c
+36
-29
source/libs/executor/src/executorimpl.c
source/libs/executor/src/executorimpl.c
+10
-5
source/libs/executor/src/scanoperator.c
source/libs/executor/src/scanoperator.c
+5
-6
source/libs/executor/src/timewindowoperator.c
source/libs/executor/src/timewindowoperator.c
+19
-4
source/libs/function/src/builtinsimpl.c
source/libs/function/src/builtinsimpl.c
+1
-1
source/libs/function/src/functionMgt.c
source/libs/function/src/functionMgt.c
+3
-0
source/libs/nodes/src/nodesEqualFuncs.c
source/libs/nodes/src/nodesEqualFuncs.c
+1
-0
source/libs/parser/src/parTranslater.c
source/libs/parser/src/parTranslater.c
+37
-12
source/libs/scalar/src/scalar.c
source/libs/scalar/src/scalar.c
+22
-5
source/libs/stream/CMakeLists.txt
source/libs/stream/CMakeLists.txt
+1
-1
source/libs/stream/inc/streamInc.h
source/libs/stream/inc/streamInc.h
+1
-1
source/libs/stream/src/stream.c
source/libs/stream/src/stream.c
+51
-27
source/libs/stream/src/streamData.c
source/libs/stream/src/streamData.c
+12
-14
source/libs/stream/src/streamDispatch.c
source/libs/stream/src/streamDispatch.c
+19
-16
source/libs/stream/src/streamExec.c
source/libs/stream/src/streamExec.c
+109
-61
source/libs/stream/src/streamMeta.c
source/libs/stream/src/streamMeta.c
+48
-46
source/libs/stream/src/streamRecover.c
source/libs/stream/src/streamRecover.c
+39
-31
source/libs/stream/src/streamState.c
source/libs/stream/src/streamState.c
+3
-1
source/libs/stream/src/streamTask.c
source/libs/stream/src/streamTask.c
+55
-25
source/libs/sync/src/syncPipeline.c
source/libs/sync/src/syncPipeline.c
+4
-4
source/libs/wal/src/walRead.c
source/libs/wal/src/walRead.c
+2
-0
source/util/src/tworker.c
source/util/src/tworker.c
+3
-2
tests/parallel_test/cases.task
tests/parallel_test/cases.task
+1
-1
tests/script/tsim/parser/last_cache.sim
tests/script/tsim/parser/last_cache.sim
+1
-0
tests/script/tsim/parser/limit1.sim
tests/script/tsim/parser/limit1.sim
+1
-0
tests/script/tsim/stream/basic1.sim
tests/script/tsim/stream/basic1.sim
+2
-2
tests/system-test/7-tmq/tmqDelete-1ctb.py
tests/system-test/7-tmq/tmqDelete-1ctb.py
+2
-2
tools/shell/src/shellEngine.c
tools/shell/src/shellEngine.c
+34
-6
未找到文件。
include/common/tglobal.h
浏览文件 @
f37f4088
...
@@ -112,6 +112,7 @@ extern int32_t tsQueryNodeChunkSize;
...
@@ -112,6 +112,7 @@ extern int32_t tsQueryNodeChunkSize;
extern
bool
tsQueryUseNodeAllocator
;
extern
bool
tsQueryUseNodeAllocator
;
extern
bool
tsKeepColumnName
;
extern
bool
tsKeepColumnName
;
extern
bool
tsEnableQueryHb
;
extern
bool
tsEnableQueryHb
;
extern
bool
tsEnableScience
;
extern
int32_t
tsRedirectPeriod
;
extern
int32_t
tsRedirectPeriod
;
extern
int32_t
tsRedirectFactor
;
extern
int32_t
tsRedirectFactor
;
extern
int32_t
tsRedirectMaxPeriod
;
extern
int32_t
tsRedirectMaxPeriod
;
...
...
include/libs/executor/executor.h
浏览文件 @
f37f4088
...
@@ -26,6 +26,7 @@ extern "C" {
...
@@ -26,6 +26,7 @@ extern "C" {
typedef
void
*
qTaskInfo_t
;
typedef
void
*
qTaskInfo_t
;
typedef
void
*
DataSinkHandle
;
typedef
void
*
DataSinkHandle
;
struct
SRpcMsg
;
struct
SRpcMsg
;
struct
SSubplan
;
struct
SSubplan
;
...
@@ -91,6 +92,9 @@ void qSetTaskId(qTaskInfo_t tinfo, uint64_t taskId, uint64_t queryId);
...
@@ -91,6 +92,9 @@ void qSetTaskId(qTaskInfo_t tinfo, uint64_t taskId, uint64_t queryId);
int32_t
qSetStreamOpOpen
(
qTaskInfo_t
tinfo
);
int32_t
qSetStreamOpOpen
(
qTaskInfo_t
tinfo
);
// todo refactor
void
qGetCheckpointVersion
(
qTaskInfo_t
tinfo
,
int64_t
*
dataVer
,
int64_t
*
ckId
);
/**
/**
* Set multiple input data blocks for the stream scan.
* Set multiple input data blocks for the stream scan.
* @param tinfo
* @param tinfo
...
@@ -119,7 +123,7 @@ int32_t qSetSMAInput(qTaskInfo_t tinfo, const void* pBlocks, size_t numOfBlocks,
...
@@ -119,7 +123,7 @@ int32_t qSetSMAInput(qTaskInfo_t tinfo, const void* pBlocks, size_t numOfBlocks,
* @param isAdd
* @param isAdd
* @return
* @return
*/
*/
int32_t
qUpdate
QualifiedTableId
(
qTaskInfo_t
tinfo
,
const
SArray
*
tableIdList
,
bool
isAdd
);
int32_t
qUpdate
TableListForStreamScanner
(
qTaskInfo_t
tinfo
,
const
SArray
*
tableIdList
,
bool
isAdd
);
/**
/**
* Create the exec task object according to task json
* Create the exec task object according to task json
...
@@ -163,6 +167,7 @@ void qCleanExecTaskBlockBuf(qTaskInfo_t tinfo);
...
@@ -163,6 +167,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
);
int32_t
qKillTask
(
qTaskInfo_t
tinfo
,
int32_t
rspCode
);
bool
qTaskIsExecuting
(
qTaskInfo_t
qinfo
);
bool
qTaskIsExecuting
(
qTaskInfo_t
qinfo
);
...
@@ -182,21 +187,11 @@ int32_t qSerializeTaskStatus(qTaskInfo_t tinfo, char** pOutput, int32_t* len);
...
@@ -182,21 +187,11 @@ int32_t qSerializeTaskStatus(qTaskInfo_t tinfo, char** pOutput, int32_t* len);
int32_t
qDeserializeTaskStatus
(
qTaskInfo_t
tinfo
,
const
char
*
pInput
,
int32_t
len
);
int32_t
qDeserializeTaskStatus
(
qTaskInfo_t
tinfo
,
const
char
*
pInput
,
int32_t
len
);
STimeWindow
getAlignQueryTimeWindow
(
SInterval
*
pInterval
,
int32_t
precision
,
int64_t
key
);
STimeWindow
getAlignQueryTimeWindow
(
SInterval
*
pInterval
,
int32_t
precision
,
int64_t
key
);
/**
* return the scan info, in the form of tuple of two items, including table uid and current timestamp
* @param tinfo
* @param uid
* @param ts
* @return
*/
int32_t
qGetStreamScanStatus
(
qTaskInfo_t
tinfo
,
uint64_t
*
uid
,
int64_t
*
ts
);
int32_t
qStreamPrepareTsdbScan
(
qTaskInfo_t
tinfo
,
uint64_t
uid
,
int64_t
ts
);
SArray
*
qGetQueriedTableListInfo
(
qTaskInfo_t
tinfo
);
int32_t
qStreamPrepareScan
(
qTaskInfo_t
tinfo
,
STqOffsetVal
*
pOffset
,
int8_t
subType
);
int32_t
qStreamPrepareScan
(
qTaskInfo_t
tinfo
,
STqOffsetVal
*
pOffset
,
int8_t
subType
);
// int32_t qStreamScanMemData(qTaskInfo_t tinfo, const SSubmitReq* pReq, int64_t ver);
//
int32_t
qStreamSetScanMemData
(
qTaskInfo_t
tinfo
,
SPackedData
submit
);
int32_t
qStreamSetScanMemData
(
qTaskInfo_t
tinfo
,
SPackedData
submit
);
void
qStreamSetOpen
(
qTaskInfo_t
tinfo
);
void
qStreamSetOpen
(
qTaskInfo_t
tinfo
);
...
...
include/libs/function/functionMgt.h
浏览文件 @
f37f4088
...
@@ -189,7 +189,7 @@ bool fmIsScalarFunc(int32_t funcId);
...
@@ -189,7 +189,7 @@ bool fmIsScalarFunc(int32_t funcId);
bool
fmIsVectorFunc
(
int32_t
funcId
);
bool
fmIsVectorFunc
(
int32_t
funcId
);
bool
fmIsIndefiniteRowsFunc
(
int32_t
funcId
);
bool
fmIsIndefiniteRowsFunc
(
int32_t
funcId
);
bool
fmIsStringFunc
(
int32_t
funcId
);
bool
fmIsStringFunc
(
int32_t
funcId
);
bool
fmIsDate
t
imeFunc
(
int32_t
funcId
);
bool
fmIsDate
T
imeFunc
(
int32_t
funcId
);
bool
fmIsSelectFunc
(
int32_t
funcId
);
bool
fmIsSelectFunc
(
int32_t
funcId
);
bool
fmIsTimelineFunc
(
int32_t
funcId
);
bool
fmIsTimelineFunc
(
int32_t
funcId
);
bool
fmIsTimeorderFunc
(
int32_t
funcId
);
bool
fmIsTimeorderFunc
(
int32_t
funcId
);
...
...
include/libs/function/taosudf.h
浏览文件 @
f37f4088
...
@@ -165,6 +165,8 @@ static FORCE_INLINE int32_t udfColEnsureCapacity(SUdfColumn *pColumn, int32_t ne
...
@@ -165,6 +165,8 @@ static FORCE_INLINE int32_t udfColEnsureCapacity(SUdfColumn *pColumn, int32_t ne
if
(
tmp
==
NULL
)
{
if
(
tmp
==
NULL
)
{
return
TSDB_CODE_OUT_OF_MEMORY
;
return
TSDB_CODE_OUT_OF_MEMORY
;
}
}
uint32_t
extend
=
BitmapLen
(
allocCapacity
)
-
BitmapLen
(
data
->
rowsAlloc
);
memset
(
tmp
+
BitmapLen
(
data
->
rowsAlloc
),
0
,
extend
);
data
->
fixLenCol
.
nullBitmap
=
tmp
;
data
->
fixLenCol
.
nullBitmap
=
tmp
;
data
->
fixLenCol
.
nullBitmapLen
=
BitmapLen
(
allocCapacity
);
data
->
fixLenCol
.
nullBitmapLen
=
BitmapLen
(
allocCapacity
);
int32_t
oldLen
=
BitmapLen
(
existedRows
);
int32_t
oldLen
=
BitmapLen
(
existedRows
);
...
...
include/libs/qcom/query.h
浏览文件 @
f37f4088
...
@@ -194,6 +194,7 @@ typedef struct SRequestConnInfo {
...
@@ -194,6 +194,7 @@ typedef struct SRequestConnInfo {
typedef
void
(
*
__freeFunc
)(
void
*
param
);
typedef
void
(
*
__freeFunc
)(
void
*
param
);
// todo add creator/destroyer function
typedef
struct
SMsgSendInfo
{
typedef
struct
SMsgSendInfo
{
__async_send_cb_fn_t
fp
;
// async callback function
__async_send_cb_fn_t
fp
;
// async callback function
STargetInfo
target
;
// for update epset
STargetInfo
target
;
// for update epset
...
...
include/libs/stream/streamState.h
浏览文件 @
f37f4088
...
@@ -42,6 +42,7 @@ typedef struct STdbState {
...
@@ -42,6 +42,7 @@ typedef struct STdbState {
typedef
struct
{
typedef
struct
{
STdbState
*
pTdbState
;
STdbState
*
pTdbState
;
int32_t
number
;
int32_t
number
;
int64_t
checkPointId
;
}
SStreamState
;
}
SStreamState
;
SStreamState
*
streamStateOpen
(
char
*
path
,
struct
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
);
...
...
include/libs/stream/tstream.h
浏览文件 @
f37f4088
...
@@ -13,8 +13,8 @@
...
@@ -13,8 +13,8 @@
* along with this program. If not, see <http://www.gnu.org/licenses/>.
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
*/
#include "executor.h"
#include "os.h"
#include "os.h"
#include "executor.h"
#include "query.h"
#include "query.h"
#include "streamState.h"
#include "streamState.h"
#include "tdatablock.h"
#include "tdatablock.h"
...
@@ -50,6 +50,7 @@ enum {
...
@@ -50,6 +50,7 @@ enum {
TASK_STATUS__RECOVER_PREPARE
,
TASK_STATUS__RECOVER_PREPARE
,
TASK_STATUS__RECOVER1
,
TASK_STATUS__RECOVER1
,
TASK_STATUS__RECOVER2
,
TASK_STATUS__RECOVER2
,
TASK_STATUS__RESTORE
,
// only available for source task to replay WAL from the checkpoint
};
};
enum
{
enum
{
...
@@ -103,21 +104,8 @@ typedef struct {
...
@@ -103,21 +104,8 @@ typedef struct {
int8_t
type
;
int8_t
type
;
}
SStreamQueueItem
;
}
SStreamQueueItem
;
#if 0
typedef
void
FTbSink
(
SStreamTask
*
pTask
,
void
*
vnode
,
int64_t
ver
,
void
*
data
);
typedef struct {
typedef
int32_t
FTaskExpand
(
void
*
ahandle
,
SStreamTask
*
pTask
,
int64_t
ver
);
int8_t type;
int64_t ver;
int32_t* dataRef;
SSubmitReq* data;
} SStreamDataSubmit;
typedef struct {
int8_t type;
int64_t ver;
SArray* dataRefs; // SArray<int32_t*>
SArray* reqs; // SArray<SSubmitReq*>
} SStreamMergedSubmit;
#endif
typedef
struct
{
typedef
struct
{
int8_t
type
;
int8_t
type
;
...
@@ -219,21 +207,20 @@ static FORCE_INLINE void streamQueueProcessFail(SStreamQueue* queue) {
...
@@ -219,21 +207,20 @@ static FORCE_INLINE void streamQueueProcessFail(SStreamQueue* queue) {
}
}
static
FORCE_INLINE
void
*
streamQueueCurItem
(
SStreamQueue
*
queue
)
{
static
FORCE_INLINE
void
*
streamQueueCurItem
(
SStreamQueue
*
queue
)
{
//
return
queue
->
qItem
;
return
queue
->
qItem
;
}
}
void
*
streamQueueNextItem
(
SStreamQueue
*
queue
);
void
*
streamQueueNextItem
(
SStreamQueue
*
queue
);
SStreamDataSubmit2
*
streamDataSubmitNew
(
SPackedData
submit
);
SStreamDataSubmit2
*
streamDataSubmitNew
(
SPackedData
submit
,
int32_t
type
);
void
streamDataSubmitDestroy
(
SStreamDataSubmit2
*
pDataSubmit
);
void
streamDataSubmitDestroy
(
SStreamDataSubmit2
*
pDataSubmit
);
SStreamDataSubmit2
*
streamSubmitBlockClone
(
SStreamDataSubmit2
*
pSubmit
);
SStreamDataSubmit2
*
streamSubmitBlockClone
(
SStreamDataSubmit2
*
pSubmit
);
typedef
struct
{
typedef
struct
{
char
*
qmsg
;
char
*
qmsg
;
// followings are
not applicable to encoder and decoder
void
*
pExecutor
;
//
not applicable to encoder and decoder
void
*
executor
;
struct
SWalReader
*
pWalReader
;
// not applicable to encoder and decoder
}
STaskExec
;
}
STaskExec
;
typedef
struct
{
typedef
struct
{
...
@@ -248,16 +235,13 @@ typedef struct {
...
@@ -248,16 +235,13 @@ typedef struct {
SUseDbRsp
dbInfo
;
SUseDbRsp
dbInfo
;
}
STaskDispatcherShuffle
;
}
STaskDispatcherShuffle
;
typedef
void
FTbSink
(
SStreamTask
*
pTask
,
void
*
vnode
,
int64_t
ver
,
void
*
data
);
typedef
struct
{
typedef
struct
{
int64_t
stbUid
;
int64_t
stbUid
;
char
stbFullName
[
TSDB_TABLE_FNAME_LEN
];
char
stbFullName
[
TSDB_TABLE_FNAME_LEN
];
SSchemaWrapper
*
pSchemaWrapper
;
SSchemaWrapper
*
pSchemaWrapper
;
// not applicable to encoder and decoder
void
*
vnode
;
// not available to encoder and decoder
void
*
vnode
;
FTbSink
*
tbSinkFunc
;
FTbSink
*
tbSinkFunc
;
STSchema
*
pTSchema
;
STSchema
*
pTSchema
;
}
STaskSinkTb
;
}
STaskSinkTb
;
typedef
void
FSmaSink
(
void
*
vnode
,
int64_t
smaId
,
const
SArray
*
data
);
typedef
void
FSmaSink
(
void
*
vnode
,
int64_t
smaId
,
const
SArray
*
data
);
...
@@ -280,24 +264,34 @@ typedef struct {
...
@@ -280,24 +264,34 @@ typedef struct {
SEpSet
epSet
;
SEpSet
epSet
;
}
SStreamChildEpInfo
;
}
SStreamChildEpInfo
;
struct
SStreamTask
{
typedef
struct
SStreamId
{
int64_t
streamId
;
int64_t
streamId
;
int32_t
taskId
;
int32_t
taskId
;
int32_t
totalLevel
;
const
char
*
idStr
;
int8_t
taskLevel
;
}
SStreamId
;
int8_t
outputType
;
int16_t
dispatchMsgType
;
typedef
struct
SCheckpointInfo
{
int64_t
id
;
int64_t
version
;
// offset in WAL
}
SCheckpointInfo
;
typedef
struct
SStreamStatus
{
int8_t
taskStatus
;
int8_t
taskStatus
;
int8_t
schedStatus
;
int8_t
schedStatus
;
}
SStreamStatus
;
// node info
struct
SStreamTask
{
int32_t
selfChildId
;
SStreamId
id
;
int32_t
nodeId
;
int32_t
totalLevel
;
SEpSet
epSet
;
int8_t
taskLevel
;
int8_t
outputType
;
int64_t
recoverSnapVer
;
int16_t
dispatchMsgType
;
int64_t
startVer
;
SStreamStatus
status
;
int32_t
selfChildId
;
int32_t
nodeId
;
SEpSet
epSet
;
SCheckpointInfo
chkInfo
;
STaskExec
exec
;
// fill history
// fill history
int8_t
fillHistory
;
int8_t
fillHistory
;
...
@@ -307,9 +301,6 @@ struct SStreamTask {
...
@@ -307,9 +301,6 @@ struct SStreamTask {
int32_t
nextCheckId
;
int32_t
nextCheckId
;
SArray
*
checkpointInfo
;
// SArray<SStreamCheckpointInfo>
SArray
*
checkpointInfo
;
// SArray<SStreamCheckpointInfo>
// exec
STaskExec
exec
;
// output
// output
union
{
union
{
STaskDispatcherFixedEp
fixedEpDispatcher
;
STaskDispatcherFixedEp
fixedEpDispatcher
;
...
@@ -319,44 +310,54 @@ struct SStreamTask {
...
@@ -319,44 +310,54 @@ struct SStreamTask {
STaskSinkFetch
fetchSink
;
STaskSinkFetch
fetchSink
;
};
};
int8_t
inputStatus
;
int8_t
inputStatus
;
int8_t
outputStatus
;
int8_t
outputStatus
;
// STaosQueue* inputQueue1;
// STaosQall* inputQall;
SStreamQueue
*
inputQueue
;
SStreamQueue
*
inputQueue
;
SStreamQueue
*
outputQueue
;
SStreamQueue
*
outputQueue
;
// trigger
// trigger
int8_t
triggerStatus
;
int8_t
triggerStatus
;
int64_t
triggerParam
;
int64_t
triggerParam
;
void
*
timer
;
void
*
timer
;
SMsgCb
*
pMsgCb
;
// msg handle
// msg handle
SStreamState
*
pState
;
// state backend
SMsgCb
*
pMsgCb
;
// the followings attributes don't be serialized
// state backend
int32_t
recoverTryingDownstream
;
SStreamState
*
pState
;
int32_t
recoverWaitingUpstream
;
int64_t
checkReqId
;
// do not serialize
SArray
*
checkReqIds
;
// shuffle
int32_t
recoverTryingDownstream
;
int32_t
refCnt
;
int32_t
recoverWaitingUpstream
;
int64_t
checkpointingId
;
int64_t
checkReqId
;
int32_t
checkpointAlignCnt
;
SArray
*
checkReqIds
;
// shuffle
struct
SStreamMeta
*
pMeta
;
int32_t
refCnt
;
int64_t
checkpointingId
;
int32_t
checkpointAlignCnt
;
};
};
// meta
typedef
struct
SStreamMeta
{
char
*
path
;
TDB
*
db
;
TTB
*
pTaskDb
;
TTB
*
pCheckpointDb
;
SHashObj
*
pTasks
;
void
*
ahandle
;
TXN
*
txn
;
FTaskExpand
*
expandFunc
;
int32_t
vgId
;
SRWLatch
lock
;
int8_t
walScan
;
bool
quit
;
}
SStreamMeta
;
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
);
SStreamTask
*
tNewSStreamTask
(
int64_t
streamId
);
SStreamTask
*
tNewStreamTask
(
int64_t
streamId
);
int32_t
tEncodeSStreamTask
(
SEncoder
*
pEncoder
,
const
SStreamTask
*
pTask
);
int32_t
tEncodeStreamTask
(
SEncoder
*
pEncoder
,
const
SStreamTask
*
pTask
);
int32_t
tDecodeSStreamTask
(
SDecoder
*
pDecoder
,
SStreamTask
*
pTask
);
int32_t
tDecodeStreamTask
(
SDecoder
*
pDecoder
,
SStreamTask
*
pTask
);
void
tFreeSStreamTask
(
SStreamTask
*
pTask
);
void
tFreeStreamTask
(
SStreamTask
*
pTask
);
int32_t
tAppendDataForStream
(
SStreamTask
*
pTask
,
SStreamQueueItem
*
pItem
);
int32_t
tAppendDataToInputQueue
(
SStreamTask
*
pTask
,
SStreamQueueItem
*
pItem
);
bool
tInputQueueIsFull
(
const
SStreamTask
*
pTask
);
static
FORCE_INLINE
void
streamTaskInputFail
(
SStreamTask
*
pTask
)
{
static
FORCE_INLINE
void
streamTaskInputFail
(
SStreamTask
*
pTask
)
{
atomic_store_8
(
&
pTask
->
inputStatus
,
TASK_INPUT_STATUS__FAILED
);
atomic_store_8
(
&
pTask
->
inputStatus
,
TASK_INPUT_STATUS__FAILED
);
...
@@ -564,40 +565,22 @@ int32_t streamAggRecoverPrepare(SStreamTask* pTask);
...
@@ -564,40 +565,22 @@ int32_t streamAggRecoverPrepare(SStreamTask* pTask);
// int32_t streamAggChildrenRecoverFinish(SStreamTask* pTask);
// int32_t streamAggChildrenRecoverFinish(SStreamTask* pTask);
int32_t
streamProcessRecoverFinishReq
(
SStreamTask
*
pTask
,
int32_t
childId
);
int32_t
streamProcessRecoverFinishReq
(
SStreamTask
*
pTask
,
int32_t
childId
);
// expand and deploy
typedef
int32_t
FTaskExpand
(
void
*
ahandle
,
SStreamTask
*
pTask
,
int64_t
ver
);
// meta
typedef
struct
SStreamMeta
{
char
*
path
;
TDB
*
db
;
TTB
*
pTaskDb
;
TTB
*
pCheckpointDb
;
SHashObj
*
pTasks
;
SHashObj
*
pRecoverStatus
;
void
*
ahandle
;
TXN
*
txn
;
FTaskExpand
*
expandFunc
;
int32_t
vgId
;
SRWLatch
lock
;
}
SStreamMeta
;
SStreamMeta
*
streamMetaOpen
(
const
char
*
path
,
void
*
ahandle
,
FTaskExpand
expandFunc
,
int32_t
vgId
);
SStreamMeta
*
streamMetaOpen
(
const
char
*
path
,
void
*
ahandle
,
FTaskExpand
expandFunc
,
int32_t
vgId
);
void
streamMetaClose
(
SStreamMeta
*
streamMeta
);
void
streamMetaClose
(
SStreamMeta
*
streamMeta
);
int32_t
streamMetaSaveTask
(
SStreamMeta
*
pMeta
,
SStreamTask
*
pTask
);
int32_t
streamMetaSaveTask
(
SStreamMeta
*
pMeta
,
SStreamTask
*
pTask
);
int32_t
streamMetaAddTask
(
SStreamMeta
*
pMeta
,
int64_t
ver
,
SStreamTask
*
pTask
);
int32_t
streamMetaAdd
Deployed
Task
(
SStreamMeta
*
pMeta
,
int64_t
ver
,
SStreamTask
*
pTask
);
int32_t
streamMetaAddSerializedTask
(
SStreamMeta
*
pMeta
,
int64_t
star
tVer
,
char
*
msg
,
int32_t
msgLen
);
int32_t
streamMetaAddSerializedTask
(
SStreamMeta
*
pMeta
,
int64_t
checkpoin
tVer
,
char
*
msg
,
int32_t
msgLen
);
// SStreamTask* streamMetaGetTask(SStreamMeta* pMeta, int32_t taskId
);
int32_t
streamMetaGetNumOfTasks
(
const
SStreamMeta
*
pMeta
);
SStreamTask
*
streamMetaAcquireTask
(
SStreamMeta
*
pMeta
,
int32_t
taskId
);
SStreamTask
*
streamMetaAcquireTask
(
SStreamMeta
*
pMeta
,
int32_t
taskId
);
void
streamMetaReleaseTask
(
SStreamMeta
*
pMeta
,
SStreamTask
*
pTask
);
void
streamMetaReleaseTask
(
SStreamMeta
*
pMeta
,
SStreamTask
*
pTask
);
void
streamMetaRemoveTask
(
SStreamMeta
*
pMeta
,
int32_t
taskId
);
void
streamMetaRemoveTask
(
SStreamMeta
*
pMeta
,
int32_t
taskId
);
int32_t
streamMetaBegin
(
SStreamMeta
*
pMeta
);
int32_t
streamMetaBegin
(
SStreamMeta
*
pMeta
);
int32_t
streamMetaCommit
(
SStreamMeta
*
pMeta
);
int32_t
streamMetaCommit
(
SStreamMeta
*
pMeta
);
int32_t
streamMetaRollBack
(
SStreamMeta
*
pMeta
);
int32_t
streamMetaRollBack
(
SStreamMeta
*
pMeta
);
int32_t
streamLoadTasks
(
SStreamMeta
*
pMeta
,
int64_t
ver
);
int32_t
streamLoadTasks
(
SStreamMeta
*
pMeta
,
int64_t
ver
);
// checkpoint
// checkpoint
int32_t
streamProcessCheckpointSourceReq
(
SStreamMeta
*
pMeta
,
SStreamTask
*
pTask
,
SStreamCheckpointSourceReq
*
pReq
);
int32_t
streamProcessCheckpointSourceReq
(
SStreamMeta
*
pMeta
,
SStreamTask
*
pTask
,
SStreamCheckpointSourceReq
*
pReq
);
...
...
include/libs/wal/wal.h
浏览文件 @
f37f4088
...
@@ -138,7 +138,8 @@ typedef struct {
...
@@ -138,7 +138,8 @@ typedef struct {
int8_t
enableRef
;
int8_t
enableRef
;
}
SWalFilterCond
;
}
SWalFilterCond
;
typedef
struct
{
// todo hide this struct
typedef
struct
SWalReader
{
SWal
*
pWal
;
SWal
*
pWal
;
int64_t
readerId
;
int64_t
readerId
;
TdFilePtr
pLogFile
;
TdFilePtr
pLogFile
;
...
@@ -196,6 +197,7 @@ void walReadReset(SWalReader *pReader);
...
@@ -196,6 +197,7 @@ void walReadReset(SWalReader *pReader);
int32_t
walReadVer
(
SWalReader
*
pRead
,
int64_t
ver
);
int32_t
walReadVer
(
SWalReader
*
pRead
,
int64_t
ver
);
int32_t
walReadSeekVer
(
SWalReader
*
pRead
,
int64_t
ver
);
int32_t
walReadSeekVer
(
SWalReader
*
pRead
,
int64_t
ver
);
int32_t
walNextValidMsg
(
SWalReader
*
pRead
);
int32_t
walNextValidMsg
(
SWalReader
*
pRead
);
int64_t
walReaderGetCurrentVer
(
const
SWalReader
*
pReader
);
// only for tq usage
// only for tq usage
void
walSetReaderCapacity
(
SWalReader
*
pRead
,
int32_t
capacity
);
void
walSetReaderCapacity
(
SWalReader
*
pRead
,
int32_t
capacity
);
...
...
packaging/debRpmAutoInstall.sh
浏览文件 @
f37f4088
#!/usr/bin/expect
#!/usr/bin/expect
set
packageName
[
lindex
$argv
0]
set
packageName
[
lindex
$argv
0]
set
packageSuffix
[
lindex
$argv
1]
set
packageSuffix
[
lindex
$argv
1]
set timeout
3
set timeout
3
0
if
{
${
packageSuffix
}
==
"deb"
}
{
if
{
${
packageSuffix
}
==
"deb"
}
{
spawn dpkg
-i
${
packageName
}
spawn dpkg
-i
${
packageName
}
}
elseif
{
${
packageSuffix
}
==
"rpm"
}
{
}
elseif
{
${
packageSuffix
}
==
"rpm"
}
{
...
...
packaging/testpackage.sh
浏览文件 @
f37f4088
...
@@ -246,7 +246,7 @@ if [ ! -f debRpmAutoInstall.sh ];then
...
@@ -246,7 +246,7 @@ if [ ! -f debRpmAutoInstall.sh ];then
echo
'#!/usr/bin/expect '
>
debRpmAutoInstall.sh
echo
'#!/usr/bin/expect '
>
debRpmAutoInstall.sh
echo
'set packageName [lindex $argv 0]'
>>
debRpmAutoInstall.sh
echo
'set packageName [lindex $argv 0]'
>>
debRpmAutoInstall.sh
echo
'set packageSuffix [lindex $argv 1]'
>>
debRpmAutoInstall.sh
echo
'set packageSuffix [lindex $argv 1]'
>>
debRpmAutoInstall.sh
echo
'set timeout 3 '
>>
debRpmAutoInstall.sh
echo
'set timeout 3
0
'
>>
debRpmAutoInstall.sh
echo
'if { ${packageSuffix} == "deb" } {'
>>
debRpmAutoInstall.sh
echo
'if { ${packageSuffix} == "deb" } {'
>>
debRpmAutoInstall.sh
echo
' spawn dpkg -i ${packageName} '
>>
debRpmAutoInstall.sh
echo
' spawn dpkg -i ${packageName} '
>>
debRpmAutoInstall.sh
echo
'} elseif { ${packageSuffix} == "rpm"} {'
>>
debRpmAutoInstall.sh
echo
'} elseif { ${packageSuffix} == "rpm"} {'
>>
debRpmAutoInstall.sh
...
...
source/client/inc/clientInt.h
浏览文件 @
f37f4088
...
@@ -36,14 +36,6 @@ extern "C" {
...
@@ -36,14 +36,6 @@ extern "C" {
#include "tconfig.h"
#include "tconfig.h"
#define CHECK_CODE_GOTO(expr, label) \
do { \
code = expr; \
if (TSDB_CODE_SUCCESS != code) { \
goto label; \
} \
} while (0)
#define ERROR_MSG_BUF_DEFAULT_SIZE 512
#define ERROR_MSG_BUF_DEFAULT_SIZE 512
#define HEARTBEAT_INTERVAL 1500 // ms
#define HEARTBEAT_INTERVAL 1500 // ms
...
@@ -286,28 +278,7 @@ static FORCE_INLINE SReqResultInfo* tmqGetCurResInfo(TAOS_RES* res) {
...
@@ -286,28 +278,7 @@ static FORCE_INLINE SReqResultInfo* tmqGetCurResInfo(TAOS_RES* res) {
return
(
SReqResultInfo
*
)
&
msg
->
resInfo
;
return
(
SReqResultInfo
*
)
&
msg
->
resInfo
;
}
}
static
FORCE_INLINE
SReqResultInfo
*
tmqGetNextResInfo
(
TAOS_RES
*
res
,
bool
convertUcs4
)
{
SReqResultInfo
*
tmqGetNextResInfo
(
TAOS_RES
*
res
,
bool
convertUcs4
);
SMqRspObj
*
pRspObj
=
(
SMqRspObj
*
)
res
;
pRspObj
->
resIter
++
;
if
(
pRspObj
->
resIter
<
pRspObj
->
rsp
.
blockNum
)
{
SRetrieveTableRsp
*
pRetrieve
=
(
SRetrieveTableRsp
*
)
taosArrayGetP
(
pRspObj
->
rsp
.
blockData
,
pRspObj
->
resIter
);
if
(
pRspObj
->
rsp
.
withSchema
)
{
SSchemaWrapper
*
pSW
=
(
SSchemaWrapper
*
)
taosArrayGetP
(
pRspObj
->
rsp
.
blockSchema
,
pRspObj
->
resIter
);
setResSchemaInfo
(
&
pRspObj
->
resInfo
,
pSW
->
pSchema
,
pSW
->
nCols
);
taosMemoryFreeClear
(
pRspObj
->
resInfo
.
row
);
taosMemoryFreeClear
(
pRspObj
->
resInfo
.
pCol
);
taosMemoryFreeClear
(
pRspObj
->
resInfo
.
length
);
taosMemoryFreeClear
(
pRspObj
->
resInfo
.
convertBuf
);
taosMemoryFreeClear
(
pRspObj
->
resInfo
.
convertJson
);
}
setQueryResultFromRsp
(
&
pRspObj
->
resInfo
,
pRetrieve
,
convertUcs4
,
false
);
return
&
pRspObj
->
resInfo
;
}
return
NULL
;
}
static
FORCE_INLINE
SReqResultInfo
*
tscGetCurResInfo
(
TAOS_RES
*
res
)
{
static
FORCE_INLINE
SReqResultInfo
*
tscGetCurResInfo
(
TAOS_RES
*
res
)
{
if
(
TD_RES_QUERY
(
res
))
return
&
(((
SRequestObj
*
)
res
)
->
body
.
resInfo
);
if
(
TD_RES_QUERY
(
res
))
return
&
(((
SRequestObj
*
)
res
)
->
body
.
resInfo
);
...
@@ -320,7 +291,6 @@ extern int32_t clientConnRefPool;
...
@@ -320,7 +291,6 @@ extern int32_t clientConnRefPool;
extern
int32_t
timestampDeltaLimit
;
extern
int32_t
timestampDeltaLimit
;
extern
int64_t
lastClusterId
;
extern
int64_t
lastClusterId
;
__async_send_cb_fn_t
getMsgRspHandle
(
int32_t
msgType
);
__async_send_cb_fn_t
getMsgRspHandle
(
int32_t
msgType
);
SMsgSendInfo
*
buildMsgInfoImpl
(
SRequestObj
*
pReqObj
);
SMsgSendInfo
*
buildMsgInfoImpl
(
SRequestObj
*
pReqObj
);
...
@@ -373,7 +343,6 @@ void taos_close_internal(void* taos);
...
@@ -373,7 +343,6 @@ void taos_close_internal(void* taos);
// global, called by mgmt
// global, called by mgmt
int
hbMgrInit
();
int
hbMgrInit
();
void
hbMgrCleanUp
();
void
hbMgrCleanUp
();
int
hbHandleRsp
(
SClientHbBatchRsp
*
hbRsp
);
// cluster level
// cluster level
SAppHbMgr
*
appHbMgrInit
(
SAppInstInfo
*
pAppInstInfo
,
char
*
key
);
SAppHbMgr
*
appHbMgrInit
(
SAppInstInfo
*
pAppInstInfo
,
char
*
key
);
...
@@ -386,9 +355,6 @@ void stopAllRequests(SHashObj* pRequests);
...
@@ -386,9 +355,6 @@ void stopAllRequests(SHashObj* pRequests);
int
hbRegisterConn
(
SAppHbMgr
*
pAppHbMgr
,
int64_t
tscRefId
,
int64_t
clusterId
,
int8_t
connType
);
int
hbRegisterConn
(
SAppHbMgr
*
pAppHbMgr
,
int64_t
tscRefId
,
int64_t
clusterId
,
int8_t
connType
);
void
hbDeregisterConn
(
SAppHbMgr
*
pAppHbMgr
,
SClientHbKey
connKey
);
void
hbDeregisterConn
(
SAppHbMgr
*
pAppHbMgr
,
SClientHbKey
connKey
);
// --- mq
void
hbMgrInitMqHbRspHandle
();
typedef
struct
SSqlCallbackWrapper
{
typedef
struct
SSqlCallbackWrapper
{
SParseContext
*
pParseCtx
;
SParseContext
*
pParseCtx
;
SCatalogReq
*
pCatalogReq
;
SCatalogReq
*
pCatalogReq
;
...
...
source/client/src/clientImpl.c
浏览文件 @
f37f4088
...
@@ -1039,8 +1039,7 @@ static int32_t asyncExecSchQuery(SRequestObj* pRequest, SQuery* pQuery, SMetaDat
...
@@ -1039,8 +1039,7 @@ static int32_t asyncExecSchQuery(SRequestObj* pRequest, SQuery* pQuery, SMetaDat
.
sysInfo
=
pRequest
->
pTscObj
->
sysInfo
,
.
sysInfo
=
pRequest
->
pTscObj
->
sysInfo
,
.
allocatorId
=
pRequest
->
allocatorRefId
};
.
allocatorId
=
pRequest
->
allocatorRefId
};
SAppInstInfo
*
pAppInfo
=
getAppInfo
(
pRequest
);
SQueryPlan
*
pDag
=
NULL
;
SQueryPlan
*
pDag
=
NULL
;
int64_t
st
=
taosGetTimestampUs
();
int64_t
st
=
taosGetTimestampUs
();
int32_t
code
=
qCreateQueryPlan
(
&
cxt
,
&
pDag
,
pMnodeList
);
int32_t
code
=
qCreateQueryPlan
(
&
cxt
,
&
pDag
,
pMnodeList
);
...
@@ -1052,7 +1051,6 @@ static int32_t asyncExecSchQuery(SRequestObj* pRequest, SQuery* pQuery, SMetaDat
...
@@ -1052,7 +1051,6 @@ static int32_t asyncExecSchQuery(SRequestObj* pRequest, SQuery* pQuery, SMetaDat
}
}
pRequest
->
metric
.
execStart
=
taosGetTimestampUs
();
pRequest
->
metric
.
execStart
=
taosGetTimestampUs
();
pRequest
->
metric
.
planCostUs
=
pRequest
->
metric
.
execStart
-
st
;
pRequest
->
metric
.
planCostUs
=
pRequest
->
metric
.
execStart
-
st
;
if
(
TSDB_CODE_SUCCESS
==
code
&&
!
pRequest
->
validateOnly
)
{
if
(
TSDB_CODE_SUCCESS
==
code
&&
!
pRequest
->
validateOnly
)
{
...
...
source/client/src/clientTmq.c
浏览文件 @
f37f4088
...
@@ -210,6 +210,11 @@ typedef struct {
...
@@ -210,6 +210,11 @@ typedef struct {
tmq_t
*
pTmq
;
tmq_t
*
pTmq
;
}
SMqCommitCbParam
;
}
SMqCommitCbParam
;
typedef
struct
SSyncCommitInfo
{
tsem_t
sem
;
int32_t
code
;
}
SSyncCommitInfo
;
static
int32_t
doAskEp
(
tmq_t
*
tmq
);
static
int32_t
doAskEp
(
tmq_t
*
tmq
);
static
int32_t
makeTopicVgroupKey
(
char
*
dst
,
const
char
*
topicName
,
int32_t
vg
);
static
int32_t
makeTopicVgroupKey
(
char
*
dst
,
const
char
*
topicName
,
int32_t
vg
);
static
int32_t
tmqCommitDone
(
SMqCommitCbParamSet
*
pParamSet
);
static
int32_t
tmqCommitDone
(
SMqCommitCbParamSet
*
pParamSet
);
...
@@ -521,11 +526,7 @@ static int32_t doSendCommitMsg(tmq_t* tmq, SMqClientVg* pVg, const char* pTopicN
...
@@ -521,11 +526,7 @@ static int32_t doSendCommitMsg(tmq_t* tmq, SMqClientVg* pVg, const char* pTopicN
return
TSDB_CODE_OUT_OF_MEMORY
;
return
TSDB_CODE_OUT_OF_MEMORY
;
}
}
pMsgSendInfo
->
msgInfo
=
(
SDataBuf
){
pMsgSendInfo
->
msgInfo
=
(
SDataBuf
)
{
.
pData
=
buf
,
.
len
=
sizeof
(
SMsgHead
)
+
len
,
.
handle
=
NULL
};
.
pData
=
buf
,
.
len
=
sizeof
(
SMsgHead
)
+
len
,
.
handle
=
NULL
,
};
pMsgSendInfo
->
requestId
=
generateRequestId
();
pMsgSendInfo
->
requestId
=
generateRequestId
();
pMsgSendInfo
->
requestObjRefId
=
0
;
pMsgSendInfo
->
requestObjRefId
=
0
;
...
@@ -786,11 +787,7 @@ void tmqSendHbReq(void* param, void* tmrId) {
...
@@ -786,11 +787,7 @@ void tmqSendHbReq(void* param, void* tmrId) {
goto
OVER
;
goto
OVER
;
}
}
sendInfo
->
msgInfo
=
(
SDataBuf
){
sendInfo
->
msgInfo
=
(
SDataBuf
){
.
pData
=
pReq
,
.
len
=
tlen
,
.
handle
=
NULL
};
.
pData
=
pReq
,
.
len
=
tlen
,
.
handle
=
NULL
,
};
sendInfo
->
requestId
=
generateRequestId
();
sendInfo
->
requestId
=
generateRequestId
();
sendInfo
->
requestObjRefId
=
0
;
sendInfo
->
requestObjRefId
=
0
;
...
@@ -2126,13 +2123,8 @@ void tmq_commit_async(tmq_t* tmq, const TAOS_RES* pRes, tmq_commit_cb* cb, void*
...
@@ -2126,13 +2123,8 @@ void tmq_commit_async(tmq_t* tmq, const TAOS_RES* pRes, tmq_commit_cb* cb, void*
}
}
}
}
typedef
struct
SSyncCommitInfo
{
static
void
commitCallBackFn
(
tmq_t
*
pTmq
,
int32_t
code
,
void
*
param
)
{
tsem_t
sem
;
SSyncCommitInfo
*
pInfo
=
(
SSyncCommitInfo
*
)
param
;
int32_t
code
;
}
SSyncCommitInfo
;
static
void
commitCallBackFn
(
tmq_t
*
pTmq
,
int32_t
code
,
void
*
param
)
{
SSyncCommitInfo
*
pInfo
=
(
SSyncCommitInfo
*
)
param
;
pInfo
->
code
=
code
;
pInfo
->
code
=
code
;
tsem_post
(
&
pInfo
->
sem
);
tsem_post
(
&
pInfo
->
sem
);
}
}
...
@@ -2309,3 +2301,26 @@ void commitRspCountDown(SMqCommitCbParamSet* pParamSet, int64_t consumerId, cons
...
@@ -2309,3 +2301,26 @@ void commitRspCountDown(SMqCommitCbParamSet* pParamSet, int64_t consumerId, cons
waitingRspNum
);
waitingRspNum
);
}
}
}
}
SReqResultInfo
*
tmqGetNextResInfo
(
TAOS_RES
*
res
,
bool
convertUcs4
)
{
SMqRspObj
*
pRspObj
=
(
SMqRspObj
*
)
res
;
pRspObj
->
resIter
++
;
if
(
pRspObj
->
resIter
<
pRspObj
->
rsp
.
blockNum
)
{
SRetrieveTableRsp
*
pRetrieve
=
(
SRetrieveTableRsp
*
)
taosArrayGetP
(
pRspObj
->
rsp
.
blockData
,
pRspObj
->
resIter
);
if
(
pRspObj
->
rsp
.
withSchema
)
{
SSchemaWrapper
*
pSW
=
(
SSchemaWrapper
*
)
taosArrayGetP
(
pRspObj
->
rsp
.
blockSchema
,
pRspObj
->
resIter
);
setResSchemaInfo
(
&
pRspObj
->
resInfo
,
pSW
->
pSchema
,
pSW
->
nCols
);
taosMemoryFreeClear
(
pRspObj
->
resInfo
.
row
);
taosMemoryFreeClear
(
pRspObj
->
resInfo
.
pCol
);
taosMemoryFreeClear
(
pRspObj
->
resInfo
.
length
);
taosMemoryFreeClear
(
pRspObj
->
resInfo
.
convertBuf
);
taosMemoryFreeClear
(
pRspObj
->
resInfo
.
convertJson
);
}
setQueryResultFromRsp
(
&
pRspObj
->
resInfo
,
pRetrieve
,
convertUcs4
,
false
);
return
&
pRspObj
->
resInfo
;
}
return
NULL
;
}
\ No newline at end of file
source/common/src/tdatablock.c
浏览文件 @
f37f4088
...
@@ -221,6 +221,7 @@ static void doBitmapMerge(SColumnInfoData* pColumnInfoData, int32_t numOfRow1, c
...
@@ -221,6 +221,7 @@ static void doBitmapMerge(SColumnInfoData* pColumnInfoData, int32_t numOfRow1, c
}
}
uint8_t
*
p
=
(
uint8_t
*
)
pSource
->
nullbitmap
;
uint8_t
*
p
=
(
uint8_t
*
)
pSource
->
nullbitmap
;
pColumnInfoData
->
nullbitmap
[
BitmapLen
(
numOfRow1
)
-
1
]
&=
(
0
B11111111
<<
shiftBits
);
// clear remind bits
pColumnInfoData
->
nullbitmap
[
BitmapLen
(
numOfRow1
)
-
1
]
|=
(
p
[
0
]
>>
remindBits
);
// copy remind bits
pColumnInfoData
->
nullbitmap
[
BitmapLen
(
numOfRow1
)
-
1
]
|=
(
p
[
0
]
>>
remindBits
);
// copy remind bits
if
(
BitmapLen
(
numOfRow1
)
==
BitmapLen
(
total
))
{
if
(
BitmapLen
(
numOfRow1
)
==
BitmapLen
(
total
))
{
...
@@ -232,6 +233,7 @@ static void doBitmapMerge(SColumnInfoData* pColumnInfoData, int32_t numOfRow1, c
...
@@ -232,6 +233,7 @@ static void doBitmapMerge(SColumnInfoData* pColumnInfoData, int32_t numOfRow1, c
uint8_t
*
start
=
(
uint8_t
*
)
&
pColumnInfoData
->
nullbitmap
[
BitmapLen
(
numOfRow1
)];
uint8_t
*
start
=
(
uint8_t
*
)
&
pColumnInfoData
->
nullbitmap
[
BitmapLen
(
numOfRow1
)];
int32_t
overCount
=
BitmapLen
(
total
)
-
BitmapLen
(
numOfRow1
);
int32_t
overCount
=
BitmapLen
(
total
)
-
BitmapLen
(
numOfRow1
);
memset
(
start
,
0
,
overCount
);
while
(
i
<
len
)
{
// size limit of pSource->nullbitmap
while
(
i
<
len
)
{
// size limit of pSource->nullbitmap
if
(
i
>=
1
)
{
if
(
i
>=
1
)
{
start
[
i
-
1
]
|=
(
p
[
i
]
>>
remindBits
);
// copy remind bits
start
[
i
-
1
]
|=
(
p
[
i
]
>>
remindBits
);
// copy remind bits
...
@@ -309,9 +311,11 @@ int32_t colDataMergeCol(SColumnInfoData* pColumnInfoData, int32_t numOfRow1, int
...
@@ -309,9 +311,11 @@ int32_t colDataMergeCol(SColumnInfoData* pColumnInfoData, int32_t numOfRow1, int
pColumnInfoData
->
pData
=
tmp
;
pColumnInfoData
->
pData
=
tmp
;
if
(
BitmapLen
(
numOfRow1
)
<
BitmapLen
(
finalNumOfRows
))
{
if
(
BitmapLen
(
numOfRow1
)
<
BitmapLen
(
finalNumOfRows
))
{
char
*
btmp
=
taosMemoryRealloc
(
pColumnInfoData
->
nullbitmap
,
BitmapLen
(
finalNumOfRows
));
char
*
btmp
=
taosMemoryRealloc
(
pColumnInfoData
->
nullbitmap
,
BitmapLen
(
finalNumOfRows
));
if
(
btmp
==
NULL
)
{
return
TSDB_CODE_OUT_OF_MEMORY
;
}
uint32_t
extend
=
BitmapLen
(
finalNumOfRows
)
-
BitmapLen
(
numOfRow1
);
uint32_t
extend
=
BitmapLen
(
finalNumOfRows
)
-
BitmapLen
(
numOfRow1
);
memset
(
btmp
+
BitmapLen
(
numOfRow1
),
0
,
extend
);
memset
(
btmp
+
BitmapLen
(
numOfRow1
),
0
,
extend
);
pColumnInfoData
->
nullbitmap
=
btmp
;
pColumnInfoData
->
nullbitmap
=
btmp
;
}
}
...
...
source/common/src/tglobal.c
浏览文件 @
f37f4088
...
@@ -105,6 +105,7 @@ int32_t tsQueryPolicy = 1;
...
@@ -105,6 +105,7 @@ int32_t tsQueryPolicy = 1;
int32_t
tsQueryRspPolicy
=
0
;
int32_t
tsQueryRspPolicy
=
0
;
int64_t
tsQueryMaxConcurrentTables
=
200
;
// unit is TSDB_TABLE_NUM_UNIT
int64_t
tsQueryMaxConcurrentTables
=
200
;
// unit is TSDB_TABLE_NUM_UNIT
bool
tsEnableQueryHb
=
false
;
bool
tsEnableQueryHb
=
false
;
bool
tsEnableScience
=
false
;
// on taos-cli show float and doulbe with scientific notation if true
int32_t
tsQuerySmaOptimize
=
0
;
int32_t
tsQuerySmaOptimize
=
0
;
int32_t
tsQueryRsmaTolerance
=
1000
;
// the tolerance time (ms) to judge from which level to query rsma data.
int32_t
tsQueryRsmaTolerance
=
1000
;
// the tolerance time (ms) to judge from which level to query rsma data.
bool
tsQueryPlannerTrace
=
false
;
bool
tsQueryPlannerTrace
=
false
;
...
@@ -117,6 +118,7 @@ int32_t tsRedirectMaxPeriod = 1000;
...
@@ -117,6 +118,7 @@ int32_t tsRedirectMaxPeriod = 1000;
int32_t
tsMaxRetryWaitTime
=
10000
;
int32_t
tsMaxRetryWaitTime
=
10000
;
bool
tsUseAdapter
=
false
;
bool
tsUseAdapter
=
false
;
/*
/*
* denote if the server needs to compress response message at the application layer to client, including query rsp,
* denote if the server needs to compress response message at the application layer to client, including query rsp,
* metricmeta rsp, and multi-meter query rsp message body. The client compress the submit message to server.
* metricmeta rsp, and multi-meter query rsp message body. The client compress the submit message to server.
...
@@ -328,6 +330,7 @@ static int32_t taosAddClientCfg(SConfig *pCfg) {
...
@@ -328,6 +330,7 @@ static int32_t taosAddClientCfg(SConfig *pCfg) {
if
(
cfgAddInt32
(
pCfg
,
"compressColData"
,
tsCompressColData
,
-
1
,
100000000
,
1
)
!=
0
)
return
-
1
;
if
(
cfgAddInt32
(
pCfg
,
"compressColData"
,
tsCompressColData
,
-
1
,
100000000
,
1
)
!=
0
)
return
-
1
;
if
(
cfgAddInt32
(
pCfg
,
"queryPolicy"
,
tsQueryPolicy
,
1
,
4
,
1
)
!=
0
)
return
-
1
;
if
(
cfgAddInt32
(
pCfg
,
"queryPolicy"
,
tsQueryPolicy
,
1
,
4
,
1
)
!=
0
)
return
-
1
;
if
(
cfgAddBool
(
pCfg
,
"enableQueryHb"
,
tsEnableQueryHb
,
false
)
!=
0
)
return
-
1
;
if
(
cfgAddBool
(
pCfg
,
"enableQueryHb"
,
tsEnableQueryHb
,
false
)
!=
0
)
return
-
1
;
if
(
cfgAddBool
(
pCfg
,
"enableScience"
,
tsEnableScience
,
false
)
!=
0
)
return
-
1
;
if
(
cfgAddInt32
(
pCfg
,
"querySmaOptimize"
,
tsQuerySmaOptimize
,
0
,
1
,
1
)
!=
0
)
return
-
1
;
if
(
cfgAddInt32
(
pCfg
,
"querySmaOptimize"
,
tsQuerySmaOptimize
,
0
,
1
,
1
)
!=
0
)
return
-
1
;
if
(
cfgAddBool
(
pCfg
,
"queryPlannerTrace"
,
tsQueryPlannerTrace
,
true
)
!=
0
)
return
-
1
;
if
(
cfgAddBool
(
pCfg
,
"queryPlannerTrace"
,
tsQueryPlannerTrace
,
true
)
!=
0
)
return
-
1
;
if
(
cfgAddInt32
(
pCfg
,
"queryNodeChunkSize"
,
tsQueryNodeChunkSize
,
1024
,
128
*
1024
,
true
)
!=
0
)
return
-
1
;
if
(
cfgAddInt32
(
pCfg
,
"queryNodeChunkSize"
,
tsQueryNodeChunkSize
,
1024
,
128
*
1024
,
true
)
!=
0
)
return
-
1
;
...
@@ -730,6 +733,7 @@ static int32_t taosSetClientCfg(SConfig *pCfg) {
...
@@ -730,6 +733,7 @@ static int32_t taosSetClientCfg(SConfig *pCfg) {
tsNumOfTaskQueueThreads
=
cfgGetItem
(
pCfg
,
"numOfTaskQueueThreads"
)
->
i32
;
tsNumOfTaskQueueThreads
=
cfgGetItem
(
pCfg
,
"numOfTaskQueueThreads"
)
->
i32
;
tsQueryPolicy
=
cfgGetItem
(
pCfg
,
"queryPolicy"
)
->
i32
;
tsQueryPolicy
=
cfgGetItem
(
pCfg
,
"queryPolicy"
)
->
i32
;
tsEnableQueryHb
=
cfgGetItem
(
pCfg
,
"enableQueryHb"
)
->
bval
;
tsEnableQueryHb
=
cfgGetItem
(
pCfg
,
"enableQueryHb"
)
->
bval
;
tsEnableScience
=
cfgGetItem
(
pCfg
,
"enableScience"
)
->
bval
;
tsQuerySmaOptimize
=
cfgGetItem
(
pCfg
,
"querySmaOptimize"
)
->
i32
;
tsQuerySmaOptimize
=
cfgGetItem
(
pCfg
,
"querySmaOptimize"
)
->
i32
;
tsQueryPlannerTrace
=
cfgGetItem
(
pCfg
,
"queryPlannerTrace"
)
->
bval
;
tsQueryPlannerTrace
=
cfgGetItem
(
pCfg
,
"queryPlannerTrace"
)
->
bval
;
tsQueryNodeChunkSize
=
cfgGetItem
(
pCfg
,
"queryNodeChunkSize"
)
->
i32
;
tsQueryNodeChunkSize
=
cfgGetItem
(
pCfg
,
"queryNodeChunkSize"
)
->
i32
;
...
...
source/dnode/mgmt/mgmt_snode/src/smInt.c
浏览文件 @
f37f4088
...
@@ -55,6 +55,7 @@ int32_t smOpen(SMgmtInputOpt *pInput, SMgmtOutputOpt *pOutput) {
...
@@ -55,6 +55,7 @@ int32_t smOpen(SMgmtInputOpt *pInput, SMgmtOutputOpt *pOutput) {
smClose
(
pMgmt
);
smClose
(
pMgmt
);
return
-
1
;
return
-
1
;
}
}
tmsgReportStartup
(
"snode-impl"
,
"initialized"
);
tmsgReportStartup
(
"snode-impl"
,
"initialized"
);
if
(
smStartWorker
(
pMgmt
)
!=
0
)
{
if
(
smStartWorker
(
pMgmt
)
!=
0
)
{
...
...
source/dnode/mgmt/mgmt_vnode/src/vmInt.c
浏览文件 @
f37f4088
...
@@ -15,6 +15,7 @@
...
@@ -15,6 +15,7 @@
#define _DEFAULT_SOURCE
#define _DEFAULT_SOURCE
#include "vmInt.h"
#include "vmInt.h"
#include "vnd.h"
SVnodeObj
*
vmAcquireVnode
(
SVnodeMgmt
*
pMgmt
,
int32_t
vgId
)
{
SVnodeObj
*
vmAcquireVnode
(
SVnodeMgmt
*
pMgmt
,
int32_t
vgId
)
{
SVnodeObj
*
pVnode
=
NULL
;
SVnodeObj
*
pVnode
=
NULL
;
...
@@ -78,6 +79,11 @@ int32_t vmOpenVnode(SVnodeMgmt *pMgmt, SWrapperCfg *pCfg, SVnode *pImpl) {
...
@@ -78,6 +79,11 @@ int32_t vmOpenVnode(SVnodeMgmt *pMgmt, SWrapperCfg *pCfg, SVnode *pImpl) {
void
vmCloseVnode
(
SVnodeMgmt
*
pMgmt
,
SVnodeObj
*
pVnode
,
bool
commitAndRemoveWal
)
{
void
vmCloseVnode
(
SVnodeMgmt
*
pMgmt
,
SVnodeObj
*
pVnode
,
bool
commitAndRemoveWal
)
{
char
path
[
TSDB_FILENAME_LEN
]
=
{
0
};
char
path
[
TSDB_FILENAME_LEN
]
=
{
0
};
bool
atExit
=
true
;
if
(
vnodeIsLeader
(
pVnode
->
pImpl
))
{
vnodeProposeCommitOnNeed
(
pVnode
->
pImpl
,
atExit
);
}
taosThreadRwlockWrlock
(
&
pMgmt
->
lock
);
taosThreadRwlockWrlock
(
&
pMgmt
->
lock
);
taosHashRemove
(
pMgmt
->
hash
,
&
pVnode
->
vgId
,
sizeof
(
int32_t
));
taosHashRemove
(
pMgmt
->
hash
,
&
pVnode
->
vgId
,
sizeof
(
int32_t
));
...
...
source/dnode/mnode/impl/src/mndDef.c
浏览文件 @
f37f4088
...
@@ -70,7 +70,7 @@ int32_t tEncodeSStreamObj(SEncoder *pEncoder, const SStreamObj *pObj) {
...
@@ -70,7 +70,7 @@ int32_t tEncodeSStreamObj(SEncoder *pEncoder, const SStreamObj *pObj) {
if
(
tEncodeI32
(
pEncoder
,
innerSz
)
<
0
)
return
-
1
;
if
(
tEncodeI32
(
pEncoder
,
innerSz
)
<
0
)
return
-
1
;
for
(
int32_t
j
=
0
;
j
<
innerSz
;
j
++
)
{
for
(
int32_t
j
=
0
;
j
<
innerSz
;
j
++
)
{
SStreamTask
*
pTask
=
taosArrayGetP
(
pArray
,
j
);
SStreamTask
*
pTask
=
taosArrayGetP
(
pArray
,
j
);
if
(
tEncodeS
S
treamTask
(
pEncoder
,
pTask
)
<
0
)
return
-
1
;
if
(
tEncodeStreamTask
(
pEncoder
,
pTask
)
<
0
)
return
-
1
;
}
}
}
}
...
@@ -130,7 +130,7 @@ int32_t tDecodeSStreamObj(SDecoder *pDecoder, SStreamObj *pObj, int32_t sver) {
...
@@ -130,7 +130,7 @@ int32_t tDecodeSStreamObj(SDecoder *pDecoder, SStreamObj *pObj, int32_t sver) {
taosArrayDestroy
(
pArray
);
taosArrayDestroy
(
pArray
);
return
-
1
;
return
-
1
;
}
}
if
(
tDecodeS
S
treamTask
(
pDecoder
,
pTask
)
<
0
)
{
if
(
tDecodeStreamTask
(
pDecoder
,
pTask
)
<
0
)
{
taosMemoryFree
(
pTask
);
taosMemoryFree
(
pTask
);
taosArrayDestroy
(
pArray
);
taosArrayDestroy
(
pArray
);
return
-
1
;
return
-
1
;
...
@@ -158,7 +158,10 @@ void tFreeStreamObj(SStreamObj *pStream) {
...
@@ -158,7 +158,10 @@ void tFreeStreamObj(SStreamObj *pStream) {
taosMemoryFree
(
pStream
->
sql
);
taosMemoryFree
(
pStream
->
sql
);
taosMemoryFree
(
pStream
->
ast
);
taosMemoryFree
(
pStream
->
ast
);
taosMemoryFree
(
pStream
->
physicalPlan
);
taosMemoryFree
(
pStream
->
physicalPlan
);
if
(
pStream
->
outputSchema
.
nCols
)
taosMemoryFree
(
pStream
->
outputSchema
.
pSchema
);
if
(
pStream
->
outputSchema
.
nCols
)
{
taosMemoryFree
(
pStream
->
outputSchema
.
pSchema
);
}
int32_t
sz
=
taosArrayGetSize
(
pStream
->
tasks
);
int32_t
sz
=
taosArrayGetSize
(
pStream
->
tasks
);
for
(
int32_t
i
=
0
;
i
<
sz
;
i
++
)
{
for
(
int32_t
i
=
0
;
i
<
sz
;
i
++
)
{
...
@@ -166,11 +169,14 @@ void tFreeStreamObj(SStreamObj *pStream) {
...
@@ -166,11 +169,14 @@ void tFreeStreamObj(SStreamObj *pStream) {
int32_t
taskSz
=
taosArrayGetSize
(
pLevel
);
int32_t
taskSz
=
taosArrayGetSize
(
pLevel
);
for
(
int32_t
j
=
0
;
j
<
taskSz
;
j
++
)
{
for
(
int32_t
j
=
0
;
j
<
taskSz
;
j
++
)
{
SStreamTask
*
pTask
=
taosArrayGetP
(
pLevel
,
j
);
SStreamTask
*
pTask
=
taosArrayGetP
(
pLevel
,
j
);
tFreeS
S
treamTask
(
pTask
);
tFreeStreamTask
(
pTask
);
}
}
taosArrayDestroy
(
pLevel
);
taosArrayDestroy
(
pLevel
);
}
}
taosArrayDestroy
(
pStream
->
tasks
);
taosArrayDestroy
(
pStream
->
tasks
);
// tagSchema.pSchema
// tagSchema.pSchema
if
(
pStream
->
tagSchema
.
nCols
>
0
)
{
if
(
pStream
->
tagSchema
.
nCols
>
0
)
{
taosMemoryFree
(
pStream
->
tagSchema
.
pSchema
);
taosMemoryFree
(
pStream
->
tagSchema
.
pSchema
);
...
...
source/dnode/mnode/impl/src/mndScheduler.c
浏览文件 @
f37f4088
...
@@ -138,7 +138,7 @@ int32_t mndAddDispatcherToInnerTask(SMnode* pMnode, SStreamObj* pStream, SStream
...
@@ -138,7 +138,7 @@ int32_t mndAddDispatcherToInnerTask(SMnode* pMnode, SStreamObj* pStream, SStream
for
(
int32_t
j
=
0
;
j
<
sinkLvSize
;
j
++
)
{
for
(
int32_t
j
=
0
;
j
<
sinkLvSize
;
j
++
)
{
SStreamTask
*
pLastLevelTask
=
taosArrayGetP
(
sinkLv
,
j
);
SStreamTask
*
pLastLevelTask
=
taosArrayGetP
(
sinkLv
,
j
);
if
(
pLastLevelTask
->
nodeId
==
pVgInfo
->
vgId
)
{
if
(
pLastLevelTask
->
nodeId
==
pVgInfo
->
vgId
)
{
pVgInfo
->
taskId
=
pLastLevelTask
->
taskId
;
pVgInfo
->
taskId
=
pLastLevelTask
->
id
.
taskId
;
break
;
break
;
}
}
}
}
...
@@ -149,7 +149,7 @@ int32_t mndAddDispatcherToInnerTask(SMnode* pMnode, SStreamObj* pStream, SStream
...
@@ -149,7 +149,7 @@ int32_t mndAddDispatcherToInnerTask(SMnode* pMnode, SStreamObj* pStream, SStream
SArray
*
pArray
=
taosArrayGetP
(
pStream
->
tasks
,
0
);
SArray
*
pArray
=
taosArrayGetP
(
pStream
->
tasks
,
0
);
// one sink only
// one sink only
SStreamTask
*
lastLevelTask
=
taosArrayGetP
(
pArray
,
0
);
SStreamTask
*
lastLevelTask
=
taosArrayGetP
(
pArray
,
0
);
pTask
->
fixedEpDispatcher
.
taskId
=
lastLevelTask
->
taskId
;
pTask
->
fixedEpDispatcher
.
taskId
=
lastLevelTask
->
id
.
taskId
;
pTask
->
fixedEpDispatcher
.
nodeId
=
lastLevelTask
->
nodeId
;
pTask
->
fixedEpDispatcher
.
nodeId
=
lastLevelTask
->
nodeId
;
pTask
->
fixedEpDispatcher
.
epSet
=
lastLevelTask
->
epSet
;
pTask
->
fixedEpDispatcher
.
epSet
=
lastLevelTask
->
epSet
;
}
}
...
@@ -224,7 +224,7 @@ int32_t mndAddShuffleSinkTasksToStream(SMnode* pMnode, SStreamObj* pStream) {
...
@@ -224,7 +224,7 @@ int32_t mndAddShuffleSinkTasksToStream(SMnode* pMnode, SStreamObj* pStream) {
continue
;
continue
;
}
}
SStreamTask
*
pTask
=
tNewS
S
treamTask
(
pStream
->
uid
);
SStreamTask
*
pTask
=
tNewStreamTask
(
pStream
->
uid
);
if
(
pTask
==
NULL
)
{
if
(
pTask
==
NULL
)
{
sdbRelease
(
pSdb
,
pVgroup
);
sdbRelease
(
pSdb
,
pVgroup
);
terrno
=
TSDB_CODE_OUT_OF_MEMORY
;
terrno
=
TSDB_CODE_OUT_OF_MEMORY
;
...
@@ -260,7 +260,7 @@ int32_t mndAddShuffleSinkTasksToStream(SMnode* pMnode, SStreamObj* pStream) {
...
@@ -260,7 +260,7 @@ int32_t mndAddShuffleSinkTasksToStream(SMnode* pMnode, SStreamObj* pStream) {
int32_t
mndAddFixedSinkTaskToStream
(
SMnode
*
pMnode
,
SStreamObj
*
pStream
)
{
int32_t
mndAddFixedSinkTaskToStream
(
SMnode
*
pMnode
,
SStreamObj
*
pStream
)
{
SArray
*
tasks
=
taosArrayGetP
(
pStream
->
tasks
,
0
);
SArray
*
tasks
=
taosArrayGetP
(
pStream
->
tasks
,
0
);
SStreamTask
*
pTask
=
tNewS
S
treamTask
(
pStream
->
uid
);
SStreamTask
*
pTask
=
tNewStreamTask
(
pStream
->
uid
);
if
(
pTask
==
NULL
)
{
if
(
pTask
==
NULL
)
{
terrno
=
TSDB_CODE_OUT_OF_MEMORY
;
terrno
=
TSDB_CODE_OUT_OF_MEMORY
;
return
-
1
;
return
-
1
;
...
@@ -350,12 +350,13 @@ int32_t mndScheduleStream(SMnode* pMnode, SStreamObj* pStream) {
...
@@ -350,12 +350,13 @@ int32_t mndScheduleStream(SMnode* pMnode, SStreamObj* pStream) {
return
-
1
;
return
-
1
;
}
}
pInnerTask
=
tNewS
S
treamTask
(
pStream
->
uid
);
pInnerTask
=
tNewStreamTask
(
pStream
->
uid
);
if
(
pInnerTask
==
NULL
)
{
if
(
pInnerTask
==
NULL
)
{
terrno
=
TSDB_CODE_OUT_OF_MEMORY
;
terrno
=
TSDB_CODE_OUT_OF_MEMORY
;
qDestroyQueryPlan
(
pPlan
);
qDestroyQueryPlan
(
pPlan
);
return
-
1
;
return
-
1
;
}
}
pInnerTask
->
fillHistory
=
pStream
->
fillHistory
;
pInnerTask
->
fillHistory
=
pStream
->
fillHistory
;
mndAddTaskToTaskSet
(
taskInnerLevel
,
pInnerTask
);
mndAddTaskToTaskSet
(
taskInnerLevel
,
pInnerTask
);
...
@@ -421,7 +422,7 @@ int32_t mndScheduleStream(SMnode* pMnode, SStreamObj* pStream) {
...
@@ -421,7 +422,7 @@ int32_t mndScheduleStream(SMnode* pMnode, SStreamObj* pStream) {
continue
;
continue
;
}
}
SStreamTask
*
pTask
=
tNewS
S
treamTask
(
pStream
->
uid
);
SStreamTask
*
pTask
=
tNewStreamTask
(
pStream
->
uid
);
if
(
pTask
==
NULL
)
{
if
(
pTask
==
NULL
)
{
terrno
=
TSDB_CODE_OUT_OF_MEMORY
;
terrno
=
TSDB_CODE_OUT_OF_MEMORY
;
sdbRelease
(
pSdb
,
pVgroup
);
sdbRelease
(
pSdb
,
pVgroup
);
...
@@ -440,7 +441,7 @@ int32_t mndScheduleStream(SMnode* pMnode, SStreamObj* pStream) {
...
@@ -440,7 +441,7 @@ int32_t mndScheduleStream(SMnode* pMnode, SStreamObj* pStream) {
pTask
->
dispatchMsgType
=
TDMT_STREAM_TASK_DISPATCH
;
pTask
->
dispatchMsgType
=
TDMT_STREAM_TASK_DISPATCH
;
pTask
->
outputType
=
TASK_OUTPUT__FIXED_DISPATCH
;
pTask
->
outputType
=
TASK_OUTPUT__FIXED_DISPATCH
;
pTask
->
fixedEpDispatcher
.
taskId
=
pInnerTask
->
taskId
;
pTask
->
fixedEpDispatcher
.
taskId
=
pInnerTask
->
id
.
taskId
;
pTask
->
fixedEpDispatcher
.
nodeId
=
pInnerTask
->
nodeId
;
pTask
->
fixedEpDispatcher
.
nodeId
=
pInnerTask
->
nodeId
;
pTask
->
fixedEpDispatcher
.
epSet
=
pInnerTask
->
epSet
;
pTask
->
fixedEpDispatcher
.
epSet
=
pInnerTask
->
epSet
;
...
@@ -460,7 +461,7 @@ int32_t mndScheduleStream(SMnode* pMnode, SStreamObj* pStream) {
...
@@ -460,7 +461,7 @@ int32_t mndScheduleStream(SMnode* pMnode, SStreamObj* pStream) {
pEpInfo
->
childId
=
pTask
->
selfChildId
;
pEpInfo
->
childId
=
pTask
->
selfChildId
;
pEpInfo
->
epSet
=
pTask
->
epSet
;
pEpInfo
->
epSet
=
pTask
->
epSet
;
pEpInfo
->
nodeId
=
pTask
->
nodeId
;
pEpInfo
->
nodeId
=
pTask
->
nodeId
;
pEpInfo
->
taskId
=
pTask
->
taskId
;
pEpInfo
->
taskId
=
pTask
->
id
.
taskId
;
taosArrayPush
(
pInnerTask
->
childEpInfo
,
&
pEpInfo
);
taosArrayPush
(
pInnerTask
->
childEpInfo
,
&
pEpInfo
);
sdbRelease
(
pSdb
,
pVgroup
);
sdbRelease
(
pSdb
,
pVgroup
);
}
}
...
@@ -491,7 +492,7 @@ int32_t mndScheduleStream(SMnode* pMnode, SStreamObj* pStream) {
...
@@ -491,7 +492,7 @@ int32_t mndScheduleStream(SMnode* pMnode, SStreamObj* pStream) {
continue
;
continue
;
}
}
SStreamTask
*
pTask
=
tNewS
S
treamTask
(
pStream
->
uid
);
SStreamTask
*
pTask
=
tNewStreamTask
(
pStream
->
uid
);
if
(
pTask
==
NULL
)
{
if
(
pTask
==
NULL
)
{
sdbRelease
(
pSdb
,
pVgroup
);
sdbRelease
(
pSdb
,
pVgroup
);
qDestroyQueryPlan
(
pPlan
);
qDestroyQueryPlan
(
pPlan
);
...
...
source/dnode/mnode/impl/src/mndStream.c
浏览文件 @
f37f4088
...
@@ -35,12 +35,12 @@
...
@@ -35,12 +35,12 @@
static
int32_t
mndStreamActionInsert
(
SSdb
*
pSdb
,
SStreamObj
*
pStream
);
static
int32_t
mndStreamActionInsert
(
SSdb
*
pSdb
,
SStreamObj
*
pStream
);
static
int32_t
mndStreamActionDelete
(
SSdb
*
pSdb
,
SStreamObj
*
pStream
);
static
int32_t
mndStreamActionDelete
(
SSdb
*
pSdb
,
SStreamObj
*
pStream
);
static
int32_t
mndStreamActionUpdate
(
SSdb
*
pSdb
,
SStreamObj
*
pStream
,
SStreamObj
*
pNewStream
);
static
int32_t
mndStreamActionUpdate
(
SSdb
*
pSdb
,
SStreamObj
*
p
Old
Stream
,
SStreamObj
*
pNewStream
);
static
int32_t
mndProcessCreateStreamReq
(
SRpcMsg
*
pReq
);
static
int32_t
mndProcessCreateStreamReq
(
SRpcMsg
*
pReq
);
static
int32_t
mndProcessDropStreamReq
(
SRpcMsg
*
pReq
);
static
int32_t
mndProcessDropStreamReq
(
SRpcMsg
*
pReq
);
static
int32_t
mndProcessStreamCheckpointTmr
(
SRpcMsg
*
pReq
);
static
int32_t
mndProcessStreamCheckpointTmr
(
SRpcMsg
*
pReq
);
//
static int32_t mndProcessStreamDoCheckpoint(SRpcMsg *pReq);
static
int32_t
mndProcessStreamDoCheckpoint
(
SRpcMsg
*
pReq
);
/*static int32_t mndProcessRecoverStreamReq(SRpcMsg *pReq);*/
static
int32_t
mndProcessRecoverStreamReq
(
SRpcMsg
*
pReq
);
static
int32_t
mndProcessStreamMetaReq
(
SRpcMsg
*
pReq
);
static
int32_t
mndProcessStreamMetaReq
(
SRpcMsg
*
pReq
);
static
int32_t
mndGetStreamMeta
(
SRpcMsg
*
pReq
,
SShowObj
*
pShow
,
STableMetaRsp
*
pMeta
);
static
int32_t
mndGetStreamMeta
(
SRpcMsg
*
pReq
,
SShowObj
*
pShow
,
STableMetaRsp
*
pMeta
);
static
int32_t
mndRetrieveStream
(
SRpcMsg
*
pReq
,
SShowObj
*
pShow
,
SSDataBlock
*
pBlock
,
int32_t
rows
);
static
int32_t
mndRetrieveStream
(
SRpcMsg
*
pReq
,
SShowObj
*
pShow
,
SSDataBlock
*
pBlock
,
int32_t
rows
);
...
@@ -418,7 +418,7 @@ FAIL:
...
@@ -418,7 +418,7 @@ FAIL:
int32_t
mndPersistTaskDeployReq
(
STrans
*
pTrans
,
const
SStreamTask
*
pTask
)
{
int32_t
mndPersistTaskDeployReq
(
STrans
*
pTrans
,
const
SStreamTask
*
pTask
)
{
SEncoder
encoder
;
SEncoder
encoder
;
tEncoderInit
(
&
encoder
,
NULL
,
0
);
tEncoderInit
(
&
encoder
,
NULL
,
0
);
tEncodeS
S
treamTask
(
&
encoder
,
pTask
);
tEncodeStreamTask
(
&
encoder
,
pTask
);
int32_t
size
=
encoder
.
pos
;
int32_t
size
=
encoder
.
pos
;
int32_t
tlen
=
sizeof
(
SMsgHead
)
+
size
;
int32_t
tlen
=
sizeof
(
SMsgHead
)
+
size
;
tEncoderClear
(
&
encoder
);
tEncoderClear
(
&
encoder
);
...
@@ -430,7 +430,7 @@ int32_t mndPersistTaskDeployReq(STrans *pTrans, const SStreamTask *pTask) {
...
@@ -430,7 +430,7 @@ int32_t mndPersistTaskDeployReq(STrans *pTrans, const SStreamTask *pTask) {
((
SMsgHead
*
)
buf
)
->
vgId
=
htonl
(
pTask
->
nodeId
);
((
SMsgHead
*
)
buf
)
->
vgId
=
htonl
(
pTask
->
nodeId
);
void
*
abuf
=
POINTER_SHIFT
(
buf
,
sizeof
(
SMsgHead
));
void
*
abuf
=
POINTER_SHIFT
(
buf
,
sizeof
(
SMsgHead
));
tEncoderInit
(
&
encoder
,
abuf
,
size
);
tEncoderInit
(
&
encoder
,
abuf
,
size
);
tEncodeS
S
treamTask
(
&
encoder
,
pTask
);
tEncodeStreamTask
(
&
encoder
,
pTask
);
tEncoderClear
(
&
encoder
);
tEncoderClear
(
&
encoder
);
STransAction
action
=
{
0
};
STransAction
action
=
{
0
};
...
@@ -601,7 +601,7 @@ static int32_t mndPersistTaskDropReq(STrans *pTrans, SStreamTask *pTask) {
...
@@ -601,7 +601,7 @@ static int32_t mndPersistTaskDropReq(STrans *pTrans, SStreamTask *pTask) {
return
-
1
;
return
-
1
;
}
}
pReq
->
head
.
vgId
=
htonl
(
pTask
->
nodeId
);
pReq
->
head
.
vgId
=
htonl
(
pTask
->
nodeId
);
pReq
->
taskId
=
pTask
->
taskId
;
pReq
->
taskId
=
pTask
->
id
.
taskId
;
STransAction
action
=
{
0
};
STransAction
action
=
{
0
};
memcpy
(
&
action
.
epSet
,
&
pTask
->
epSet
,
sizeof
(
SEpSet
));
memcpy
(
&
action
.
epSet
,
&
pTask
->
epSet
,
sizeof
(
SEpSet
));
action
.
pCont
=
pReq
;
action
.
pCont
=
pReq
;
...
@@ -1209,7 +1209,7 @@ static int32_t mndRetrieveStreamTask(SRpcMsg *pReq, SShowObj *pShow, SSDataBlock
...
@@ -1209,7 +1209,7 @@ static int32_t mndRetrieveStreamTask(SRpcMsg *pReq, SShowObj *pShow, SSDataBlock
// task id
// task id
pColInfo
=
taosArrayGet
(
pBlock
->
pDataBlock
,
cols
++
);
pColInfo
=
taosArrayGet
(
pBlock
->
pDataBlock
,
cols
++
);
colDataSetVal
(
pColInfo
,
numOfRows
,
(
const
char
*
)
&
pTask
->
taskId
,
false
);
colDataSetVal
(
pColInfo
,
numOfRows
,
(
const
char
*
)
&
pTask
->
id
.
taskId
,
false
);
// node type
// node type
char
nodeType
[
20
+
VARSTR_HEADER_SIZE
]
=
{
0
};
char
nodeType
[
20
+
VARSTR_HEADER_SIZE
]
=
{
0
};
...
...
source/dnode/mnode/impl/src/mndSubscribe.c
浏览文件 @
f37f4088
...
@@ -671,7 +671,7 @@ static int32_t mndProcessRebalanceReq(SRpcMsg *pMsg) {
...
@@ -671,7 +671,7 @@ static int32_t mndProcessRebalanceReq(SRpcMsg *pMsg) {
// possibly no vg is changed
// possibly no vg is changed
// when each topic is re-balanced, issue an trans to save the results in sdb.
// when each topic is re-balanced, issue an trans to save the results in sdb.
if
(
mndPersistRebResult
(
pMnode
,
pMsg
,
&
rebOutput
)
<
0
)
{
if
(
mndPersistRebResult
(
pMnode
,
pMsg
,
&
rebOutput
)
<
0
)
{
mError
(
"mq re-balance persist output error, possibly vnode splitted or dropped
"
);
mError
(
"mq re-balance persist output error, possibly vnode splitted or dropped
,msg:%s"
,
terrstr
()
);
}
}
taosArrayDestroy
(
rebOutput
.
newConsumers
);
taosArrayDestroy
(
rebOutput
.
newConsumers
);
...
...
source/dnode/snode/src/snode.c
浏览文件 @
f37f4088
...
@@ -32,6 +32,7 @@ void sndEnqueueStreamDispatch(SSnode *pSnode, SRpcMsg *pMsg) {
...
@@ -32,6 +32,7 @@ void sndEnqueueStreamDispatch(SSnode *pSnode, SRpcMsg *pMsg) {
tDecoderClear
(
&
decoder
);
tDecoderClear
(
&
decoder
);
goto
FAIL
;
goto
FAIL
;
}
}
tDecoderClear
(
&
decoder
);
tDecoderClear
(
&
decoder
);
int32_t
taskId
=
req
.
taskId
;
int32_t
taskId
=
req
.
taskId
;
...
@@ -65,7 +66,7 @@ int32_t sndExpandTask(SSnode *pSnode, SStreamTask *pTask, int64_t ver) {
...
@@ -65,7 +66,7 @@ int32_t sndExpandTask(SSnode *pSnode, SStreamTask *pTask, int64_t ver) {
ASSERT
(
taosArrayGetSize
(
pTask
->
childEpInfo
)
!=
0
);
ASSERT
(
taosArrayGetSize
(
pTask
->
childEpInfo
)
!=
0
);
pTask
->
refCnt
=
1
;
pTask
->
refCnt
=
1
;
pTask
->
schedStatus
=
TASK_SCHED_STATUS__INACTIVE
;
pTask
->
s
tatus
.
s
chedStatus
=
TASK_SCHED_STATUS__INACTIVE
;
pTask
->
inputQueue
=
streamQueueOpen
();
pTask
->
inputQueue
=
streamQueueOpen
();
pTask
->
outputQueue
=
streamQueueOpen
();
pTask
->
outputQueue
=
streamQueueOpen
();
...
@@ -76,21 +77,19 @@ int32_t sndExpandTask(SSnode *pSnode, SStreamTask *pTask, int64_t ver) {
...
@@ -76,21 +77,19 @@ int32_t sndExpandTask(SSnode *pSnode, SStreamTask *pTask, int64_t ver) {
pTask
->
inputStatus
=
TASK_INPUT_STATUS__NORMAL
;
pTask
->
inputStatus
=
TASK_INPUT_STATUS__NORMAL
;
pTask
->
outputStatus
=
TASK_OUTPUT_STATUS__NORMAL
;
pTask
->
outputStatus
=
TASK_OUTPUT_STATUS__NORMAL
;
pTask
->
pMsgCb
=
&
pSnode
->
msgCb
;
pTask
->
pMsgCb
=
&
pSnode
->
msgCb
;
pTask
->
startVer
=
ver
;
pTask
->
chkInfo
.
version
=
ver
;
pTask
->
pMeta
=
pSnode
->
pMeta
;
pTask
->
pState
=
streamStateOpen
(
pSnode
->
path
,
pTask
,
false
,
-
1
,
-
1
);
pTask
->
pState
=
streamStateOpen
(
pSnode
->
path
,
pTask
,
false
,
-
1
,
-
1
);
if
(
pTask
->
pState
==
NULL
)
{
if
(
pTask
->
pState
==
NULL
)
{
return
-
1
;
return
-
1
;
}
}
SReadHandle
mgHandle
=
{
int32_t
numOfChildEp
=
taosArrayGetSize
(
pTask
->
childEpInfo
);
.
vnode
=
NULL
,
SReadHandle
mgHandle
=
{
.
vnode
=
NULL
,
.
numOfVgroups
=
numOfChildEp
,
.
pStateBackend
=
pTask
->
pState
};
.
numOfVgroups
=
(
int32_t
)
taosArrayGetSize
(
pTask
->
childEpInfo
),
.
pStateBackend
=
pTask
->
pState
,
};
pTask
->
exec
.
e
xecutor
=
qCreateStreamExecTaskInfo
(
pTask
->
exec
.
qmsg
,
&
mgHandle
,
0
);
pTask
->
exec
.
pE
xecutor
=
qCreateStreamExecTaskInfo
(
pTask
->
exec
.
qmsg
,
&
mgHandle
,
0
);
ASSERT
(
pTask
->
exec
.
e
xecutor
);
ASSERT
(
pTask
->
exec
.
pE
xecutor
);
streamSetupTrigger
(
pTask
);
streamSetupTrigger
(
pTask
);
return
0
;
return
0
;
...
@@ -140,9 +139,10 @@ int32_t sndProcessTaskDeployReq(SSnode *pSnode, char *msg, int32_t msgLen) {
...
@@ -140,9 +139,10 @@ int32_t sndProcessTaskDeployReq(SSnode *pSnode, char *msg, int32_t msgLen) {
if
(
pTask
==
NULL
)
{
if
(
pTask
==
NULL
)
{
return
-
1
;
return
-
1
;
}
}
SDecoder
decoder
;
SDecoder
decoder
;
tDecoderInit
(
&
decoder
,
(
uint8_t
*
)
msg
,
msgLen
);
tDecoderInit
(
&
decoder
,
(
uint8_t
*
)
msg
,
msgLen
);
code
=
tDecodeS
S
treamTask
(
&
decoder
,
pTask
);
code
=
tDecodeStreamTask
(
&
decoder
,
pTask
);
if
(
code
<
0
)
{
if
(
code
<
0
)
{
tDecoderClear
(
&
decoder
);
tDecoderClear
(
&
decoder
);
taosMemoryFree
(
pTask
);
taosMemoryFree
(
pTask
);
...
@@ -153,7 +153,7 @@ int32_t sndProcessTaskDeployReq(SSnode *pSnode, char *msg, int32_t msgLen) {
...
@@ -153,7 +153,7 @@ int32_t sndProcessTaskDeployReq(SSnode *pSnode, char *msg, int32_t msgLen) {
ASSERT
(
pTask
->
taskLevel
==
TASK_LEVEL__AGG
);
ASSERT
(
pTask
->
taskLevel
==
TASK_LEVEL__AGG
);
// 2.save task
// 2.save task
code
=
streamMetaAddTask
(
pSnode
->
pMeta
,
-
1
,
pTask
);
code
=
streamMetaAdd
Deployed
Task
(
pSnode
->
pMeta
,
-
1
,
pTask
);
if
(
code
<
0
)
{
if
(
code
<
0
)
{
return
-
1
;
return
-
1
;
}
}
...
...
source/dnode/vnode/CMakeLists.txt
浏览文件 @
f37f4088
...
@@ -57,6 +57,7 @@ target_sources(
...
@@ -57,6 +57,7 @@ target_sources(
# tq
# tq
"src/tq/tq.c"
"src/tq/tq.c"
"src/tq/tqUtil.c"
"src/tq/tqScan.c"
"src/tq/tqScan.c"
"src/tq/tqMeta.c"
"src/tq/tqMeta.c"
"src/tq/tqRead.c"
"src/tq/tqRead.c"
...
@@ -64,6 +65,7 @@ target_sources(
...
@@ -64,6 +65,7 @@ target_sources(
"src/tq/tqPush.c"
"src/tq/tqPush.c"
"src/tq/tqSink.c"
"src/tq/tqSink.c"
"src/tq/tqCommit.c"
"src/tq/tqCommit.c"
"src/tq/tqRestore.c"
"src/tq/tqSnapshot.c"
"src/tq/tqSnapshot.c"
"src/tq/tqOffsetSnapshot.c"
"src/tq/tqOffsetSnapshot.c"
)
)
...
...
source/dnode/vnode/inc/vnode.h
浏览文件 @
f37f4088
...
@@ -92,7 +92,7 @@ int32_t vnodeProcessQueryMsg(SVnode *pVnode, SRpcMsg *pMsg);
...
@@ -92,7 +92,7 @@ int32_t vnodeProcessQueryMsg(SVnode *pVnode, SRpcMsg *pMsg);
int32_t
vnodeProcessFetchMsg
(
SVnode
*
pVnode
,
SRpcMsg
*
pMsg
,
SQueueInfo
*
pInfo
);
int32_t
vnodeProcessFetchMsg
(
SVnode
*
pVnode
,
SRpcMsg
*
pMsg
,
SQueueInfo
*
pInfo
);
void
vnodeProposeWriteMsg
(
SQueueInfo
*
pInfo
,
STaosQall
*
qall
,
int32_t
numOfMsgs
);
void
vnodeProposeWriteMsg
(
SQueueInfo
*
pInfo
,
STaosQall
*
qall
,
int32_t
numOfMsgs
);
void
vnodeApplyWriteMsg
(
SQueueInfo
*
pInfo
,
STaosQall
*
qall
,
int32_t
numOfMsgs
);
void
vnodeApplyWriteMsg
(
SQueueInfo
*
pInfo
,
STaosQall
*
qall
,
int32_t
numOfMsgs
);
void
vnodeProposeCommitOnNeed
(
SVnode
*
pVnode
);
void
vnodeProposeCommitOnNeed
(
SVnode
*
pVnode
,
bool
atExit
);
// meta
// meta
typedef
struct
SMeta
SMeta
;
// todo: remove
typedef
struct
SMeta
SMeta
;
// todo: remove
...
@@ -256,15 +256,16 @@ void tqCloseReader(STqReader *);
...
@@ -256,15 +256,16 @@ void tqCloseReader(STqReader *);
void
tqReaderSetColIdList
(
STqReader
*
pReader
,
SArray
*
pColIdList
);
void
tqReaderSetColIdList
(
STqReader
*
pReader
,
SArray
*
pColIdList
);
int32_t
tqReaderSetTbUidList
(
STqReader
*
pReader
,
const
SArray
*
tbUidList
);
int32_t
tqReaderSetTbUidList
(
STqReader
*
pReader
,
const
SArray
*
tbUidList
);
int32_t
tqReaderAddTbUidList
(
STqReader
*
pReader
,
const
SArray
*
tb
UidList
);
int32_t
tqReaderAddTbUidList
(
STqReader
*
pReader
,
const
SArray
*
pTable
UidList
);
int32_t
tqReaderRemoveTbUidList
(
STqReader
*
pReader
,
const
SArray
*
tbUidList
);
int32_t
tqReaderRemoveTbUidList
(
STqReader
*
pReader
,
const
SArray
*
tbUidList
);
int32_t
tqSeekVer
(
STqReader
*
pReader
,
int64_t
ver
,
const
char
*
id
);
int32_t
tqSeekVer
(
STqReader
*
pReader
,
int64_t
ver
,
const
char
*
id
);
void
tqNextBlock
(
STqReader
*
pReader
,
SFetchRet
*
ret
);
void
tqNextBlock
(
STqReader
*
pReader
,
SFetchRet
*
ret
);
int32_t
extractSubmitMsgFromWal
(
SWalReader
*
pReader
,
SPackedData
*
pPackedData
);
int32_t
tqReaderSetSubmit
Req2
(
STqReader
*
pReader
,
void
*
msgStr
,
int32_t
msgLen
,
int64_t
ver
);
int32_t
tqReaderSetSubmit
Msg
(
STqReader
*
pReader
,
void
*
msgStr
,
int32_t
msgLen
,
int64_t
ver
);
// int32_t tqReaderSetDataMsg(STqReader *pReader, const SSubmitReq *pMsg, int64_t ver);
// int32_t tqReaderSetDataMsg(STqReader *pReader, const SSubmitReq *pMsg, int64_t ver);
bool
tqNextDataBlock
2
(
STqReader
*
pReader
);
bool
tqNextDataBlock
(
STqReader
*
pReader
);
bool
tqNextDataBlockFilterOut2
(
STqReader
*
pReader
,
SHashObj
*
filterOutUids
);
bool
tqNextDataBlockFilterOut2
(
STqReader
*
pReader
,
SHashObj
*
filterOutUids
);
int32_t
tqRetrieveDataBlock2
(
SSDataBlock
*
pBlock
,
STqReader
*
pReader
,
SSubmitTbData
**
pSubmitTbDataRet
);
int32_t
tqRetrieveDataBlock2
(
SSDataBlock
*
pBlock
,
STqReader
*
pReader
,
SSubmitTbData
**
pSubmitTbDataRet
);
int32_t
tqRetrieveTaosxBlock2
(
STqReader
*
pReader
,
SArray
*
blocks
,
SArray
*
schemas
,
SSubmitTbData
**
pSubmitTbDataRet
);
int32_t
tqRetrieveTaosxBlock2
(
STqReader
*
pReader
,
SArray
*
blocks
,
SArray
*
schemas
,
SSubmitTbData
**
pSubmitTbDataRet
);
...
...
source/dnode/vnode/src/inc/tq.h
浏览文件 @
f37f4088
...
@@ -80,7 +80,7 @@ typedef struct {
...
@@ -80,7 +80,7 @@ typedef struct {
typedef
struct
{
typedef
struct
{
int8_t
subType
;
int8_t
subType
;
STqReader
*
p
Exec
Reader
;
STqReader
*
p
Tq
Reader
;
qTaskInfo_t
task
;
qTaskInfo_t
task
;
union
{
union
{
STqExecCol
execCol
;
STqExecCol
execCol
;
...
@@ -128,6 +128,10 @@ typedef struct {
...
@@ -128,6 +128,10 @@ typedef struct {
tmr_h
timer
;
tmr_h
timer
;
}
STqMgmt
;
}
STqMgmt
;
typedef
struct
{
int32_t
size
;
}
STqOffsetHead
;
static
STqMgmt
tqMgmt
=
{
0
};
static
STqMgmt
tqMgmt
=
{
0
};
int32_t
tEncodeSTqHandle
(
SEncoder
*
pEncoder
,
const
STqHandle
*
pHandle
);
int32_t
tEncodeSTqHandle
(
SEncoder
*
pEncoder
,
const
STqHandle
*
pHandle
);
...
@@ -154,10 +158,6 @@ int32_t tqMetaSaveCheckInfo(STQ* pTq, const char* key, const void* value, int32_
...
@@ -154,10 +158,6 @@ int32_t tqMetaSaveCheckInfo(STQ* pTq, const char* key, const void* value, int32_
int32_t
tqMetaDeleteCheckInfo
(
STQ
*
pTq
,
const
char
*
key
);
int32_t
tqMetaDeleteCheckInfo
(
STQ
*
pTq
,
const
char
*
key
);
int32_t
tqMetaRestoreCheckInfo
(
STQ
*
pTq
);
int32_t
tqMetaRestoreCheckInfo
(
STQ
*
pTq
);
typedef
struct
{
int32_t
size
;
}
STqOffsetHead
;
STqOffsetStore
*
tqOffsetOpen
(
STQ
*
pTq
);
STqOffsetStore
*
tqOffsetOpen
(
STQ
*
pTq
);
void
tqOffsetClose
(
STqOffsetStore
*
);
void
tqOffsetClose
(
STqOffsetStore
*
);
STqOffset
*
tqOffsetRead
(
STqOffsetStore
*
pStore
,
const
char
*
subscribeKey
);
STqOffset
*
tqOffsetRead
(
STqOffsetStore
*
pStore
,
const
char
*
subscribeKey
);
...
@@ -176,6 +176,18 @@ int32_t tqOffsetRestoreFromFile(STqOffsetStore* pStore, const char* fname);
...
@@ -176,6 +176,18 @@ int32_t tqOffsetRestoreFromFile(STqOffsetStore* pStore, const char* fname);
// tqStream
// tqStream
int32_t
tqExpandTask
(
STQ
*
pTq
,
SStreamTask
*
pTask
,
int64_t
ver
);
int32_t
tqExpandTask
(
STQ
*
pTq
,
SStreamTask
*
pTask
,
int64_t
ver
);
int32_t
tqStreamTasksScanWal
(
STQ
*
pTq
);
// tq util
void
createStreamTaskOffsetKey
(
char
*
dst
,
uint64_t
streamId
,
uint32_t
taskId
);
int32_t
tqAddInputBlockNLaunchTask
(
SStreamTask
*
pTask
,
SStreamQueueItem
*
pQueueItem
,
int64_t
ver
);
int32_t
launchTaskForWalBlock
(
SStreamTask
*
pTask
,
SFetchRet
*
pRet
,
STqOffset
*
pOffset
);
int32_t
tqExtractDataForMq
(
STQ
*
pTq
,
STqHandle
*
pHandle
,
const
SMqPollReq
*
pRequest
,
SRpcMsg
*
pMsg
);
void
doSaveTaskOffset
(
STqOffsetStore
*
pOffsetStore
,
const
char
*
pKey
,
int64_t
ver
);
void
saveOffsetForAllTasks
(
STQ
*
pTq
,
int64_t
ver
);
void
initOffsetForAllRestoreTasks
(
STQ
*
pTq
);
int32_t
transferToWalReadTask
(
SStreamMeta
*
pStreamMeta
,
SArray
*
pTaskList
);
#ifdef __cplusplus
#ifdef __cplusplus
}
}
...
...
source/dnode/vnode/src/inc/vnd.h
浏览文件 @
f37f4088
...
@@ -96,7 +96,7 @@ int32_t vnodeGetBatchMeta(SVnode* pVnode, SRpcMsg* pMsg);
...
@@ -96,7 +96,7 @@ int32_t vnodeGetBatchMeta(SVnode* pVnode, SRpcMsg* pMsg);
// vnodeCommit.c
// vnodeCommit.c
int32_t
vnodeBegin
(
SVnode
*
pVnode
);
int32_t
vnodeBegin
(
SVnode
*
pVnode
);
int32_t
vnodeShouldCommit
(
SVnode
*
pVnode
);
int32_t
vnodeShouldCommit
(
SVnode
*
pVnode
,
bool
atExit
);
void
vnodeUpdCommitSched
(
SVnode
*
pVnode
);
void
vnodeUpdCommitSched
(
SVnode
*
pVnode
);
void
vnodeRollback
(
SVnode
*
pVnode
);
void
vnodeRollback
(
SVnode
*
pVnode
);
int32_t
vnodeSaveInfo
(
const
char
*
dir
,
const
SVnodeInfo
*
pCfg
);
int32_t
vnodeSaveInfo
(
const
char
*
dir
,
const
SVnodeInfo
*
pCfg
);
...
@@ -115,7 +115,6 @@ void vnodeSyncClose(SVnode* pVnode);
...
@@ -115,7 +115,6 @@ void vnodeSyncClose(SVnode* pVnode);
void
vnodeRedirectRpcMsg
(
SVnode
*
pVnode
,
SRpcMsg
*
pMsg
,
int32_t
code
);
void
vnodeRedirectRpcMsg
(
SVnode
*
pVnode
,
SRpcMsg
*
pMsg
,
int32_t
code
);
bool
vnodeIsLeader
(
SVnode
*
pVnode
);
bool
vnodeIsLeader
(
SVnode
*
pVnode
);
bool
vnodeIsRoleLeader
(
SVnode
*
pVnode
);
bool
vnodeIsRoleLeader
(
SVnode
*
pVnode
);
int
vnodeShouldCommit
(
SVnode
*
pVnode
);
#ifdef __cplusplus
#ifdef __cplusplus
}
}
...
...
source/dnode/vnode/src/inc/vnodeInt.h
浏览文件 @
f37f4088
...
@@ -192,9 +192,10 @@ void tqCleanUp();
...
@@ -192,9 +192,10 @@ void tqCleanUp();
STQ
*
tqOpen
(
const
char
*
path
,
SVnode
*
pVnode
);
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
tqRegisterPush
Entry
(
STQ
*
pTq
,
void
*
pHandle
,
const
SMqPollReq
*
pRequest
,
SRpcMsg
*
pRpcMsg
,
SMqDataRsp
*
pDataRsp
,
int
tqRegisterPush
Handle
(
STQ
*
pTq
,
void
*
pHandle
,
const
SMqPollReq
*
pRequest
,
SRpcMsg
*
pRpcMsg
,
SMqDataRsp
*
pDataRsp
,
int32_t
type
);
int32_t
type
);
int
tqUnregisterPushEntry
(
STQ
*
pTq
,
const
char
*
pKey
,
int32_t
keyLen
,
uint64_t
consumerId
,
bool
rspConsumer
);
int
tqUnregisterPushHandle
(
STQ
*
pTq
,
const
char
*
pKey
,
int32_t
keyLen
,
uint64_t
consumerId
,
bool
rspConsumer
);
int
tqStartStreamTasks
(
STQ
*
pTq
);
// restore all stream tasks after vnode launching completed.
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
);
...
...
source/dnode/vnode/src/meta/metaCache.c
浏览文件 @
f37f4088
...
@@ -531,10 +531,11 @@ static void freePayload(const void* key, size_t keyLen, void* value) {
...
@@ -531,10 +531,11 @@ static void freePayload(const void* key, size_t keyLen, void* value) {
return
;
return
;
}
}
SHashObj
*
pHashObj
=
(
SHashObj
*
)
p
[
0
];
SHashObj
*
pHashObj
=
(
SHashObj
*
)
p
[
0
];
STagFilterResEntry
**
pEntry
=
taosHashGet
(
pHashObj
,
&
p
[
1
],
sizeof
(
uint64_t
));
STagFilterResEntry
**
pEntry
=
taosHashGet
(
pHashObj
,
&
p
[
1
],
sizeof
(
uint64_t
));
{
if
(
pEntry
!=
NULL
&&
(
*
pEntry
)
!=
NULL
)
{
int64_t
st
=
taosGetTimestampUs
();
int64_t
st
=
taosGetTimestampUs
();
SListIter
iter
=
{
0
};
SListIter
iter
=
{
0
};
...
@@ -547,9 +548,9 @@ static void freePayload(const void* key, size_t keyLen, void* value) {
...
@@ -547,9 +548,9 @@ static void freePayload(const void* key, size_t keyLen, void* value) {
void
*
tmp
=
tdListPopNode
(
&
((
*
pEntry
)
->
list
),
pNode
);
void
*
tmp
=
tdListPopNode
(
&
((
*
pEntry
)
->
list
),
pNode
);
taosMemoryFree
(
tmp
);
taosMemoryFree
(
tmp
);
int64_t
et
=
taosGetTimestampUs
()
;
double
el
=
(
taosGetTimestampUs
()
-
st
)
/
1000
.
0
;
metaInfo
(
"clear items in cache, remain cached item:%d, elapsed time:%.2fms"
,
listNEles
(
&
((
*
pEntry
)
->
list
)),
metaInfo
(
"clear items in
meta-
cache, remain cached item:%d, elapsed time:%.2fms"
,
listNEles
(
&
((
*
pEntry
)
->
list
)),
(
et
-
st
)
/
1000
.
0
);
el
);
break
;
break
;
}
}
}
}
...
...
source/dnode/vnode/src/sma/smaRollup.c
浏览文件 @
f37f4088
...
@@ -168,7 +168,7 @@ static int32_t tdUpdateTbUidListImpl(SSma *pSma, tb_uid_t *suid, SArray *tbUids,
...
@@ -168,7 +168,7 @@ static int32_t tdUpdateTbUidListImpl(SSma *pSma, tb_uid_t *suid, SArray *tbUids,
for
(
int32_t
i
=
0
;
i
<
TSDB_RETENTION_L2
;
++
i
)
{
for
(
int32_t
i
=
0
;
i
<
TSDB_RETENTION_L2
;
++
i
)
{
if
(
pRSmaInfo
->
taskInfo
[
i
])
{
if
(
pRSmaInfo
->
taskInfo
[
i
])
{
if
((
terrno
=
qUpdate
QualifiedTableId
(
pRSmaInfo
->
taskInfo
[
i
],
tbUids
,
isAdd
))
<
0
)
{
if
((
terrno
=
qUpdate
TableListForStreamScanner
(
pRSmaInfo
->
taskInfo
[
i
],
tbUids
,
isAdd
))
<
0
)
{
tdReleaseRSmaInfo
(
pSma
,
pRSmaInfo
);
tdReleaseRSmaInfo
(
pSma
,
pRSmaInfo
);
smaError
(
"vgId:%d, update tbUidList failed for uid:%"
PRIi64
" level %d since %s"
,
SMA_VID
(
pSma
),
*
suid
,
i
,
smaError
(
"vgId:%d, update tbUidList failed for uid:%"
PRIi64
" level %d since %s"
,
SMA_VID
(
pSma
),
*
suid
,
i
,
terrstr
());
terrstr
());
...
...
source/dnode/vnode/src/tq/tq.c
浏览文件 @
f37f4088
此差异已折叠。
点击以展开。
source/dnode/vnode/src/tq/tqCommit.c
浏览文件 @
f37f4088
...
@@ -16,10 +16,13 @@
...
@@ -16,10 +16,13 @@
#include "tq.h"
#include "tq.h"
int
tqCommit
(
STQ
*
pTq
)
{
int
tqCommit
(
STQ
*
pTq
)
{
#if 0
// stream meta commit does not be aligned to the vnode commit
if (streamMetaCommit(pTq->pStreamMeta) < 0) {
if (streamMetaCommit(pTq->pStreamMeta) < 0) {
tqError("vgId:%d, failed to commit stream meta since %s", TD_VID(pTq->pVnode), terrstr());
tqError("vgId:%d, failed to commit stream meta since %s", TD_VID(pTq->pVnode), terrstr());
return -1;
return -1;
}
}
#endif
return
tqOffsetCommitFile
(
pTq
->
pOffsetStore
);
return
tqOffsetCommitFile
(
pTq
->
pOffsetStore
);
}
}
source/dnode/vnode/src/tq/tqMeta.c
浏览文件 @
f37f4088
...
@@ -320,15 +320,15 @@ int32_t tqMetaRestoreHandle(STQ* pTq) {
...
@@ -320,15 +320,15 @@ int32_t tqMetaRestoreHandle(STQ* pTq) {
code
=
-
1
;
code
=
-
1
;
goto
end
;
goto
end
;
}
}
handle
.
execHandle
.
p
Exec
Reader
=
qExtractReaderFromStreamScanner
(
scanner
);
handle
.
execHandle
.
p
Tq
Reader
=
qExtractReaderFromStreamScanner
(
scanner
);
if
(
handle
.
execHandle
.
p
Exec
Reader
==
NULL
)
{
if
(
handle
.
execHandle
.
p
Tq
Reader
==
NULL
)
{
tqError
(
"cannot extract exec reader for %s"
,
handle
.
subKey
);
tqError
(
"cannot extract exec reader for %s"
,
handle
.
subKey
);
code
=
-
1
;
code
=
-
1
;
goto
end
;
goto
end
;
}
}
}
else
if
(
handle
.
execHandle
.
subType
==
TOPIC_SUB_TYPE__DB
)
{
}
else
if
(
handle
.
execHandle
.
subType
==
TOPIC_SUB_TYPE__DB
)
{
handle
.
pWalReader
=
walOpenReader
(
pTq
->
pVnode
->
pWal
,
NULL
);
handle
.
pWalReader
=
walOpenReader
(
pTq
->
pVnode
->
pWal
,
NULL
);
handle
.
execHandle
.
p
Exec
Reader
=
tqOpenReader
(
pTq
->
pVnode
);
handle
.
execHandle
.
p
Tq
Reader
=
tqOpenReader
(
pTq
->
pVnode
);
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
));
...
@@ -343,8 +343,8 @@ int32_t tqMetaRestoreHandle(STQ* pTq) {
...
@@ -343,8 +343,8 @@ int32_t tqMetaRestoreHandle(STQ* pTq) {
int64_t
tbUid
=
*
(
int64_t
*
)
taosArrayGet
(
tbUidList
,
i
);
int64_t
tbUid
=
*
(
int64_t
*
)
taosArrayGet
(
tbUidList
,
i
);
tqDebug
(
"vgId:%d, idx %d, uid:%"
PRId64
,
vgId
,
i
,
tbUid
);
tqDebug
(
"vgId:%d, idx %d, uid:%"
PRId64
,
vgId
,
i
,
tbUid
);
}
}
handle
.
execHandle
.
p
Exec
Reader
=
tqOpenReader
(
pTq
->
pVnode
);
handle
.
execHandle
.
p
Tq
Reader
=
tqOpenReader
(
pTq
->
pVnode
);
tqReaderSetTbUidList
(
handle
.
execHandle
.
p
Exec
Reader
,
tbUidList
);
tqReaderSetTbUidList
(
handle
.
execHandle
.
p
Tq
Reader
,
tbUidList
);
taosArrayDestroy
(
tbUidList
);
taosArrayDestroy
(
tbUidList
);
buildSnapContext
(
reader
.
meta
,
reader
.
version
,
handle
.
execHandle
.
execTb
.
suid
,
handle
.
execHandle
.
subType
,
buildSnapContext
(
reader
.
meta
,
reader
.
version
,
handle
.
execHandle
.
execTb
.
suid
,
handle
.
execHandle
.
subType
,
...
...
source/dnode/vnode/src/tq/tqOffset.c
浏览文件 @
f37f4088
...
@@ -128,31 +128,35 @@ int32_t tqOffsetDelete(STqOffsetStore* pStore, const char* subscribeKey) {
...
@@ -128,31 +128,35 @@ int32_t tqOffsetDelete(STqOffsetStore* pStore, const char* subscribeKey) {
}
}
int32_t
tqOffsetCommitFile
(
STqOffsetStore
*
pStore
)
{
int32_t
tqOffsetCommitFile
(
STqOffsetStore
*
pStore
)
{
if
(
!
pStore
->
needCommit
)
return
0
;
if
(
!
pStore
->
needCommit
)
{
return
0
;
}
// TODO file name should be with a newer version
// TODO file name should be with a newer version
char
*
fname
=
tqOffsetBuildFName
(
pStore
->
pTq
->
path
,
0
);
char
*
fname
=
tqOffsetBuildFName
(
pStore
->
pTq
->
path
,
0
);
TdFilePtr
pFile
=
taosOpenFile
(
fname
,
TD_FILE_CREATE
|
TD_FILE_WRITE
|
TD_FILE_APPEND
);
TdFilePtr
pFile
=
taosOpenFile
(
fname
,
TD_FILE_CREATE
|
TD_FILE_WRITE
|
TD_FILE_APPEND
);
if
(
pFile
==
NULL
)
{
if
(
pFile
==
NULL
)
{
terrno
=
TAOS_SYSTEM_ERROR
(
errno
);
terrno
=
TAOS_SYSTEM_ERROR
(
errno
);
const
char
*
err
=
strerror
(
errno
);
int32_t
err
=
terrno
;
tqError
(
"vgId:%d, failed to open offset file %s, since %s"
,
TD_VID
(
pStore
->
pTq
->
pVnode
),
fname
,
err
);
const
char
*
errStr
=
tstrerror
(
err
);
int32_t
sysErr
=
errno
;
const
char
*
sysErrStr
=
strerror
(
errno
);
tqError
(
"vgId:%d, cannot open file %s when commit offset since %s"
,
pStore
->
pTq
->
pVnode
->
config
.
vgId
,
fname
,
sysErrStr
);
taosMemoryFree
(
fname
);
taosMemoryFree
(
fname
);
return
-
1
;
return
-
1
;
}
}
taosMemoryFree
(
fname
);
taosMemoryFree
(
fname
);
void
*
pIter
=
NULL
;
void
*
pIter
=
NULL
;
while
(
1
)
{
while
(
1
)
{
pIter
=
taosHashIterate
(
pStore
->
pHash
,
pIter
);
pIter
=
taosHashIterate
(
pStore
->
pHash
,
pIter
);
if
(
pIter
==
NULL
)
break
;
if
(
pIter
==
NULL
)
{
break
;
}
STqOffset
*
pOffset
=
(
STqOffset
*
)
pIter
;
STqOffset
*
pOffset
=
(
STqOffset
*
)
pIter
;
int32_t
bodyLen
;
int32_t
bodyLen
;
int32_t
code
;
int32_t
code
;
tEncodeSize
(
tEncodeSTqOffset
,
pOffset
,
bodyLen
,
code
);
tEncodeSize
(
tEncodeSTqOffset
,
pOffset
,
bodyLen
,
code
);
if
(
code
<
0
)
{
if
(
code
<
0
)
{
taosHashCancelIterate
(
pStore
->
pHash
,
pIter
);
taosHashCancelIterate
(
pStore
->
pHash
,
pIter
);
return
-
1
;
return
-
1
;
...
@@ -166,6 +170,7 @@ int32_t tqOffsetCommitFile(STqOffsetStore* pStore) {
...
@@ -166,6 +170,7 @@ int32_t tqOffsetCommitFile(STqOffsetStore* pStore) {
SEncoder
encoder
;
SEncoder
encoder
;
tEncoderInit
(
&
encoder
,
abuf
,
bodyLen
);
tEncoderInit
(
&
encoder
,
abuf
,
bodyLen
);
tEncodeSTqOffset
(
&
encoder
,
pOffset
);
tEncodeSTqOffset
(
&
encoder
,
pOffset
);
// write file
// write file
int64_t
writeLen
;
int64_t
writeLen
;
if
((
writeLen
=
taosWriteFile
(
pFile
,
buf
,
totLen
))
!=
totLen
)
{
if
((
writeLen
=
taosWriteFile
(
pFile
,
buf
,
totLen
))
!=
totLen
)
{
...
@@ -174,8 +179,10 @@ int32_t tqOffsetCommitFile(STqOffsetStore* pStore) {
...
@@ -174,8 +179,10 @@ int32_t tqOffsetCommitFile(STqOffsetStore* pStore) {
taosMemoryFree
(
buf
);
taosMemoryFree
(
buf
);
return
-
1
;
return
-
1
;
}
}
taosMemoryFree
(
buf
);
taosMemoryFree
(
buf
);
}
}
// close and rename file
// close and rename file
taosCloseFile
(
&
pFile
);
taosCloseFile
(
&
pFile
);
pStore
->
needCommit
=
0
;
pStore
->
needCommit
=
0
;
...
...
source/dnode/vnode/src/tq/tqPush.c
浏览文件 @
f37f4088
...
@@ -323,15 +323,22 @@ int32_t tqPushMsg(STQ* pTq, void* msg, int32_t msgLen, tmsg_t msgType, int64_t v
...
@@ -323,15 +323,22 @@ int32_t tqPushMsg(STQ* pTq, void* msg, int32_t msgLen, tmsg_t msgType, int64_t v
taosWUnLockLatch
(
&
pTq
->
lock
);
taosWUnLockLatch
(
&
pTq
->
lock
);
}
}
// push data for stream processing
tqDebug
(
"handle submit, restore:%d, size:%d"
,
pTq
->
pVnode
->
restored
,
(
int
)
taosHashGetSize
(
pTq
->
pStreamMeta
->
pTasks
));
if
(
!
tsDisableStream
&&
vnodeIsRoleLeader
(
pTq
->
pVnode
))
{
// push data for stream processing:
// 1. the vnode has already been restored.
// 2. the vnode should be the leader.
// 3. the stream is not suspended yet.
if
(
!
tsDisableStream
&&
vnodeIsRoleLeader
(
pTq
->
pVnode
)
&&
pTq
->
pVnode
->
restored
)
{
if
(
taosHashGetSize
(
pTq
->
pStreamMeta
->
pTasks
)
==
0
)
{
if
(
taosHashGetSize
(
pTq
->
pStreamMeta
->
pTasks
)
==
0
)
{
return
0
;
return
0
;
}
}
if
(
msgType
==
TDMT_VND_SUBMIT
)
{
if
(
msgType
==
TDMT_VND_SUBMIT
)
{
#if 0
void* data = taosMemoryMalloc(len);
void* data = taosMemoryMalloc(len);
if (data == NULL) {
if (data == NULL) {
// todo: for all stream in this vnode, keep this offset in the offset files, and wait for a moment, and then retry
terrno = TSDB_CODE_OUT_OF_MEMORY;
terrno = TSDB_CODE_OUT_OF_MEMORY;
tqError("vgId:%d, failed to copy submit data for stream processing, since out of memory", vgId);
tqError("vgId:%d, failed to copy submit data for stream processing, since out of memory", vgId);
return -1;
return -1;
...
@@ -340,7 +347,10 @@ int32_t tqPushMsg(STQ* pTq, void* msg, int32_t msgLen, tmsg_t msgType, int64_t v
...
@@ -340,7 +347,10 @@ int32_t tqPushMsg(STQ* pTq, void* msg, int32_t msgLen, tmsg_t msgType, int64_t v
memcpy(data, pReq, len);
memcpy(data, pReq, len);
SPackedData submit = {.msgStr = data, .msgLen = len, .ver = ver};
SPackedData submit = {.msgStr = data, .msgLen = len, .ver = ver};
tqDebug
(
"tq copy write msg %p %d %"
PRId64
" from %p"
,
data
,
len
,
ver
,
pReq
);
tqDebug("vgId:%d tq copy submit msg:%p len:%d ver:%" PRId64 " from %p for stream", vgId, data, len, ver, pReq);
tqProcessSubmitReq(pTq, submit);
#endif
SPackedData
submit
=
{
0
};
tqProcessSubmitReq
(
pTq
,
submit
);
tqProcessSubmitReq
(
pTq
,
submit
);
}
}
...
@@ -352,7 +362,7 @@ int32_t tqPushMsg(STQ* pTq, void* msg, int32_t msgLen, tmsg_t msgType, int64_t v
...
@@ -352,7 +362,7 @@ int32_t tqPushMsg(STQ* pTq, void* msg, int32_t msgLen, tmsg_t msgType, int64_t v
return
0
;
return
0
;
}
}
int32_t
tqRegisterPush
Entry
(
STQ
*
pTq
,
void
*
pHandle
,
const
SMqPollReq
*
pRequest
,
SRpcMsg
*
pRpcMsg
,
SMqDataRsp
*
pDataRsp
,
int32_t
tqRegisterPush
Handle
(
STQ
*
pTq
,
void
*
pHandle
,
const
SMqPollReq
*
pRequest
,
SRpcMsg
*
pRpcMsg
,
SMqDataRsp
*
pDataRsp
,
int32_t
type
)
{
int32_t
type
)
{
uint64_t
consumerId
=
pRequest
->
consumerId
;
uint64_t
consumerId
=
pRequest
->
consumerId
;
int32_t
vgId
=
TD_VID
(
pTq
->
pVnode
);
int32_t
vgId
=
TD_VID
(
pTq
->
pVnode
);
...
@@ -389,7 +399,7 @@ int32_t tqRegisterPushEntry(STQ* pTq, void* pHandle, const SMqPollReq* pRequest,
...
@@ -389,7 +399,7 @@ int32_t tqRegisterPushEntry(STQ* pTq, void* pHandle, const SMqPollReq* pRequest,
return
0
;
return
0
;
}
}
int32_t
tqUnregisterPush
Entry
(
STQ
*
pTq
,
const
char
*
pKey
,
int32_t
keyLen
,
uint64_t
consumerId
,
bool
rspConsumer
)
{
int32_t
tqUnregisterPush
Handle
(
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
);
...
...
source/dnode/vnode/src/tq/tqRead.c
浏览文件 @
f37f4088
...
@@ -113,7 +113,7 @@ bool isValValidForTable(STqHandle* pHandle, SWalCont* pHead) {
...
@@ -113,7 +113,7 @@ bool isValValidForTable(STqHandle* pHandle, SWalCont* pHead) {
}
}
SMetaReader
mr
=
{
0
};
SMetaReader
mr
=
{
0
};
metaReaderInit
(
&
mr
,
pHandle
->
execHandle
.
p
Exec
Reader
->
pVnodeMeta
,
0
);
metaReaderInit
(
&
mr
,
pHandle
->
execHandle
.
p
Tq
Reader
->
pVnodeMeta
,
0
);
if
(
metaGetTableEntryByName
(
&
mr
,
req
.
tbName
)
<
0
)
{
if
(
metaGetTableEntryByName
(
&
mr
,
req
.
tbName
)
<
0
)
{
metaReaderClear
(
&
mr
);
metaReaderClear
(
&
mr
);
...
@@ -262,8 +262,6 @@ STqReader* tqOpenReader(SVnode* pVnode) {
...
@@ -262,8 +262,6 @@ STqReader* tqOpenReader(SVnode* pVnode) {
}
}
pReader
->
pVnodeMeta
=
pVnode
->
pMeta
;
pReader
->
pVnodeMeta
=
pVnode
->
pMeta
;
/*pReader->pMsg = NULL;*/
// pReader->ver = -1;
pReader
->
pColIdList
=
NULL
;
pReader
->
pColIdList
=
NULL
;
pReader
->
cachedSchemaVer
=
0
;
pReader
->
cachedSchemaVer
=
0
;
pReader
->
cachedSchemaSuid
=
0
;
pReader
->
cachedSchemaSuid
=
0
;
...
@@ -298,7 +296,29 @@ int32_t tqSeekVer(STqReader* pReader, int64_t ver, const char* id) {
...
@@ -298,7 +296,29 @@ int32_t tqSeekVer(STqReader* pReader, int64_t ver, const char* id) {
if
(
walReadSeekVer
(
pReader
->
pWalReader
,
ver
)
<
0
)
{
if
(
walReadSeekVer
(
pReader
->
pWalReader
,
ver
)
<
0
)
{
return
-
1
;
return
-
1
;
}
}
tqDebug
(
"tmq poll: wal reader seek to ver success ver:%"
PRId64
" %s"
,
ver
,
id
);
tqDebug
(
"wal reader seek to ver:%"
PRId64
" %s"
,
ver
,
id
);
return
0
;
}
int32_t
extractSubmitMsgFromWal
(
SWalReader
*
pReader
,
SPackedData
*
pPackedData
)
{
if
(
walNextValidMsg
(
pReader
)
<
0
)
{
return
-
1
;
}
void
*
pBody
=
POINTER_SHIFT
(
pReader
->
pHead
->
head
.
body
,
sizeof
(
SSubmitReq2Msg
));
int32_t
len
=
pReader
->
pHead
->
head
.
bodyLen
-
sizeof
(
SSubmitReq2Msg
);
int64_t
ver
=
pReader
->
pHead
->
head
.
version
;
void
*
data
=
taosMemoryMalloc
(
len
);
if
(
data
==
NULL
)
{
// todo: for all stream in this vnode, keep this offset in the offset files, and wait for a moment, and then retry
terrno
=
TSDB_CODE_OUT_OF_MEMORY
;
tqError
(
"vgId:%d, failed to copy submit data for stream processing, since out of memory"
,
0
);
return
-
1
;
}
memcpy
(
data
,
pBody
,
len
);
*
pPackedData
=
(
SPackedData
){.
ver
=
ver
,
.
msgLen
=
len
,
.
msgStr
=
data
};
return
0
;
return
0
;
}
}
...
@@ -309,26 +329,28 @@ void tqNextBlock(STqReader* pReader, SFetchRet* ret) {
...
@@ -309,26 +329,28 @@ void tqNextBlock(STqReader* pReader, SFetchRet* ret) {
ret
->
fetchType
=
FETCH_TYPE__NONE
;
ret
->
fetchType
=
FETCH_TYPE__NONE
;
return
;
return
;
}
}
void
*
body
=
POINTER_SHIFT
(
pReader
->
pWalReader
->
pHead
->
head
.
body
,
sizeof
(
SSubmitReq2Msg
));
void
*
pBody
=
POINTER_SHIFT
(
pReader
->
pWalReader
->
pHead
->
head
.
body
,
sizeof
(
SSubmitReq2Msg
));
int32_t
bodyLen
=
pReader
->
pWalReader
->
pHead
->
head
.
bodyLen
-
sizeof
(
SSubmitReq2Msg
);
int32_t
bodyLen
=
pReader
->
pWalReader
->
pHead
->
head
.
bodyLen
-
sizeof
(
SSubmitReq2Msg
);
int64_t
ver
=
pReader
->
pWalReader
->
pHead
->
head
.
version
;
int64_t
ver
=
pReader
->
pWalReader
->
pHead
->
head
.
version
;
tqReaderSetSubmit
Req2
(
pReader
,
b
ody
,
bodyLen
,
ver
);
tqReaderSetSubmit
Msg
(
pReader
,
pB
ody
,
bodyLen
,
ver
);
}
}
while
(
tqNextDataBlock
2
(
pReader
))
{
while
(
tqNextDataBlock
(
pReader
))
{
memset
(
&
ret
->
data
,
0
,
sizeof
(
SSDataBlock
));
memset
(
&
ret
->
data
,
0
,
sizeof
(
SSDataBlock
));
int32_t
code
=
tqRetrieveDataBlock2
(
&
ret
->
data
,
pReader
,
NULL
);
int32_t
code
=
tqRetrieveDataBlock2
(
&
ret
->
data
,
pReader
,
NULL
);
if
(
code
!=
0
||
ret
->
data
.
info
.
rows
==
0
)
{
if
(
code
!=
0
||
ret
->
data
.
info
.
rows
==
0
)
{
continue
;
continue
;
}
}
ret
->
fetchType
=
FETCH_TYPE__DATA
;
ret
->
fetchType
=
FETCH_TYPE__DATA
;
return
;
return
;
}
}
}
}
}
}
int32_t
tqReaderSetSubmit
Req2
(
STqReader
*
pReader
,
void
*
msgStr
,
int32_t
msgLen
,
int64_t
ver
)
{
int32_t
tqReaderSetSubmit
Msg
(
STqReader
*
pReader
,
void
*
msgStr
,
int32_t
msgLen
,
int64_t
ver
)
{
pReader
->
msg2
.
msgStr
=
msgStr
;
pReader
->
msg2
.
msgStr
=
msgStr
;
pReader
->
msg2
.
msgLen
=
msgLen
;
pReader
->
msg2
.
msgLen
=
msgLen
;
pReader
->
msg2
.
ver
=
ver
;
pReader
->
msg2
.
ver
=
ver
;
...
@@ -345,7 +367,7 @@ int32_t tqReaderSetSubmitReq2(STqReader* pReader, void* msgStr, int32_t msgLen,
...
@@ -345,7 +367,7 @@ int32_t tqReaderSetSubmitReq2(STqReader* pReader, void* msgStr, int32_t msgLen,
return
0
;
return
0
;
}
}
bool
tqNextDataBlock
2
(
STqReader
*
pReader
)
{
bool
tqNextDataBlock
(
STqReader
*
pReader
)
{
if
(
pReader
->
msg2
.
msgStr
==
NULL
)
{
if
(
pReader
->
msg2
.
msgStr
==
NULL
)
{
return
false
;
return
false
;
}
}
...
@@ -354,13 +376,20 @@ bool tqNextDataBlock2(STqReader* pReader) {
...
@@ -354,13 +376,20 @@ bool tqNextDataBlock2(STqReader* pReader) {
while
(
pReader
->
nextBlk
<
blockSz
)
{
while
(
pReader
->
nextBlk
<
blockSz
)
{
tqDebug
(
"tq reader next data block %p, %d %"
PRId64
" %d"
,
pReader
->
msg2
.
msgStr
,
pReader
->
msg2
.
msgLen
,
tqDebug
(
"tq reader next data block %p, %d %"
PRId64
" %d"
,
pReader
->
msg2
.
msgStr
,
pReader
->
msg2
.
msgLen
,
pReader
->
msg2
.
ver
,
pReader
->
nextBlk
);
pReader
->
msg2
.
ver
,
pReader
->
nextBlk
);
SSubmitTbData
*
pSubmitTbData
=
taosArrayGet
(
pReader
->
submit
.
aSubmitTbData
,
pReader
->
nextBlk
);
SSubmitTbData
*
pSubmitTbData
=
taosArrayGet
(
pReader
->
submit
.
aSubmitTbData
,
pReader
->
nextBlk
);
if
(
pReader
->
tbIdHash
==
NULL
)
return
true
;
if
(
pReader
->
tbIdHash
==
NULL
)
{
return
true
;
}
void
*
ret
=
taosHashGet
(
pReader
->
tbIdHash
,
&
pSubmitTbData
->
uid
,
sizeof
(
int64_t
));
void
*
ret
=
taosHashGet
(
pReader
->
tbIdHash
,
&
pSubmitTbData
->
uid
,
sizeof
(
int64_t
));
if
(
ret
!=
NULL
)
{
if
(
ret
!=
NULL
)
{
tqDebug
(
"tq reader block found, ver:%"
PRId64
", uid:%"
PRId64
,
pReader
->
msg2
.
ver
,
pSubmitTbData
->
uid
);
return
true
;
return
true
;
}
else
{
tqDebug
(
"tq reader discard block, uid:%"
PRId64
", continue"
,
pSubmitTbData
->
uid
);
}
}
pReader
->
nextBlk
++
;
pReader
->
nextBlk
++
;
}
}
...
@@ -427,7 +456,10 @@ int32_t tqRetrieveDataBlock2(SSDataBlock* pBlock, STqReader* pReader, SSubmitTbD
...
@@ -427,7 +456,10 @@ int32_t tqRetrieveDataBlock2(SSDataBlock* pBlock, STqReader* pReader, SSubmitTbD
SSubmitTbData
*
pSubmitTbData
=
taosArrayGet
(
pReader
->
submit
.
aSubmitTbData
,
pReader
->
nextBlk
);
SSubmitTbData
*
pSubmitTbData
=
taosArrayGet
(
pReader
->
submit
.
aSubmitTbData
,
pReader
->
nextBlk
);
pReader
->
nextBlk
++
;
pReader
->
nextBlk
++
;
if
(
pSubmitTbDataRet
)
*
pSubmitTbDataRet
=
pSubmitTbData
;
if
(
pSubmitTbDataRet
)
{
*
pSubmitTbDataRet
=
pSubmitTbData
;
}
int32_t
sversion
=
pSubmitTbData
->
sver
;
int32_t
sversion
=
pSubmitTbData
->
sver
;
int64_t
suid
=
pSubmitTbData
->
suid
;
int64_t
suid
=
pSubmitTbData
->
suid
;
int64_t
uid
=
pSubmitTbData
->
uid
;
int64_t
uid
=
pSubmitTbData
->
uid
;
...
@@ -900,7 +932,7 @@ int tqReaderSetTbUidList(STqReader* pReader, const SArray* tbUidList) {
...
@@ -900,7 +932,7 @@ int tqReaderSetTbUidList(STqReader* pReader, const SArray* tbUidList) {
return
0
;
return
0
;
}
}
int
tqReaderAddTbUidList
(
STqReader
*
pReader
,
const
SArray
*
tb
UidList
)
{
int
tqReaderAddTbUidList
(
STqReader
*
pReader
,
const
SArray
*
pTable
UidList
)
{
if
(
pReader
->
tbIdHash
==
NULL
)
{
if
(
pReader
->
tbIdHash
==
NULL
)
{
pReader
->
tbIdHash
=
taosHashInit
(
64
,
taosGetDefaultHashFunction
(
TSDB_DATA_TYPE_BIGINT
),
true
,
HASH_ENTRY_LOCK
);
pReader
->
tbIdHash
=
taosHashInit
(
64
,
taosGetDefaultHashFunction
(
TSDB_DATA_TYPE_BIGINT
),
true
,
HASH_ENTRY_LOCK
);
if
(
pReader
->
tbIdHash
==
NULL
)
{
if
(
pReader
->
tbIdHash
==
NULL
)
{
...
@@ -909,8 +941,9 @@ int tqReaderAddTbUidList(STqReader* pReader, const SArray* tbUidList) {
...
@@ -909,8 +941,9 @@ int tqReaderAddTbUidList(STqReader* pReader, const SArray* tbUidList) {
}
}
}
}
for
(
int
i
=
0
;
i
<
taosArrayGetSize
(
tbUidList
);
i
++
)
{
int32_t
numOfTables
=
taosArrayGetSize
(
pTableUidList
);
int64_t
*
pKey
=
(
int64_t
*
)
taosArrayGet
(
tbUidList
,
i
);
for
(
int
i
=
0
;
i
<
numOfTables
;
i
++
)
{
int64_t
*
pKey
=
(
int64_t
*
)
taosArrayGet
(
pTableUidList
,
i
);
taosHashPut
(
pReader
->
tbIdHash
,
pKey
,
sizeof
(
int64_t
),
NULL
,
0
);
taosHashPut
(
pReader
->
tbIdHash
,
pKey
,
sizeof
(
int64_t
),
NULL
,
0
);
}
}
...
@@ -926,30 +959,34 @@ int tqReaderRemoveTbUidList(STqReader* pReader, const SArray* tbUidList) {
...
@@ -926,30 +959,34 @@ int tqReaderRemoveTbUidList(STqReader* pReader, const SArray* tbUidList) {
return
0
;
return
0
;
}
}
// todo update the table list in wal reader
int32_t
tqUpdateTbUidList
(
STQ
*
pTq
,
const
SArray
*
tbUidList
,
bool
isAdd
)
{
int32_t
tqUpdateTbUidList
(
STQ
*
pTq
,
const
SArray
*
tbUidList
,
bool
isAdd
)
{
void
*
pIter
=
NULL
;
void
*
pIter
=
NULL
;
int32_t
vgId
=
TD_VID
(
pTq
->
pVnode
);
// update the table list for each consumer handle
while
(
1
)
{
while
(
1
)
{
pIter
=
taosHashIterate
(
pTq
->
pHandle
,
pIter
);
pIter
=
taosHashIterate
(
pTq
->
pHandle
,
pIter
);
if
(
pIter
==
NULL
)
{
if
(
pIter
==
NULL
)
{
break
;
break
;
}
}
STqHandle
*
p
Exec
=
(
STqHandle
*
)
pIter
;
STqHandle
*
p
TqHandle
=
(
STqHandle
*
)
pIter
;
if
(
p
Exec
->
execHandle
.
subType
==
TOPIC_SUB_TYPE__COLUMN
)
{
if
(
p
TqHandle
->
execHandle
.
subType
==
TOPIC_SUB_TYPE__COLUMN
)
{
int32_t
code
=
qUpdate
QualifiedTableId
(
pExec
->
execHandle
.
task
,
tbUidList
,
isAdd
);
int32_t
code
=
qUpdate
TableListForStreamScanner
(
pTqHandle
->
execHandle
.
task
,
tbUidList
,
isAdd
);
if
(
code
!=
0
)
{
if
(
code
!=
0
)
{
tqError
(
"update qualified table error for %s"
,
p
Exec
->
subKey
);
tqError
(
"update qualified table error for %s"
,
p
TqHandle
->
subKey
);
continue
;
continue
;
}
}
}
else
if
(
p
Exec
->
execHandle
.
subType
==
TOPIC_SUB_TYPE__DB
)
{
}
else
if
(
p
TqHandle
->
execHandle
.
subType
==
TOPIC_SUB_TYPE__DB
)
{
if
(
!
isAdd
)
{
if
(
!
isAdd
)
{
int32_t
sz
=
taosArrayGetSize
(
tbUidList
);
int32_t
sz
=
taosArrayGetSize
(
tbUidList
);
for
(
int32_t
i
=
0
;
i
<
sz
;
i
++
)
{
for
(
int32_t
i
=
0
;
i
<
sz
;
i
++
)
{
int64_t
tbUid
=
*
(
int64_t
*
)
taosArrayGet
(
tbUidList
,
i
);
int64_t
tbUid
=
*
(
int64_t
*
)
taosArrayGet
(
tbUidList
,
i
);
taosHashPut
(
p
Exec
->
execHandle
.
execDb
.
pFilterOutTbUid
,
&
tbUid
,
sizeof
(
int64_t
),
NULL
,
0
);
taosHashPut
(
p
TqHandle
->
execHandle
.
execDb
.
pFilterOutTbUid
,
&
tbUid
,
sizeof
(
int64_t
),
NULL
,
0
);
}
}
}
}
}
else
if
(
p
Exec
->
execHandle
.
subType
==
TOPIC_SUB_TYPE__TABLE
)
{
}
else
if
(
p
TqHandle
->
execHandle
.
subType
==
TOPIC_SUB_TYPE__TABLE
)
{
if
(
isAdd
)
{
if
(
isAdd
)
{
SArray
*
qa
=
taosArrayInit
(
4
,
sizeof
(
tb_uid_t
));
SArray
*
qa
=
taosArrayInit
(
4
,
sizeof
(
tb_uid_t
));
SMetaReader
mr
=
{
0
};
SMetaReader
mr
=
{
0
};
...
@@ -964,35 +1001,43 @@ int32_t tqUpdateTbUidList(STQ* pTq, const SArray* tbUidList, bool isAdd) {
...
@@ -964,35 +1001,43 @@ int32_t tqUpdateTbUidList(STQ* pTq, const SArray* tbUidList, bool isAdd) {
}
}
tDecoderClear
(
&
mr
.
coder
);
tDecoderClear
(
&
mr
.
coder
);
if
(
mr
.
me
.
type
!=
TSDB_CHILD_TABLE
||
mr
.
me
.
ctbEntry
.
suid
!=
pTqHandle
->
execHandle
.
execTb
.
suid
)
{
if
(
mr
.
me
.
type
!=
TSDB_CHILD_TABLE
||
mr
.
me
.
ctbEntry
.
suid
!=
pExec
->
execHandle
.
execTb
.
suid
)
{
tqDebug
(
"table uid %"
PRId64
" does not add to tq handle"
,
*
id
);
tqDebug
(
"table uid %"
PRId64
" does not add to tq handle"
,
*
id
);
continue
;
continue
;
}
}
tqDebug
(
"table uid %"
PRId64
" add to tq handle"
,
*
id
);
tqDebug
(
"table uid %"
PRId64
" add to tq handle"
,
*
id
);
taosArrayPush
(
qa
,
id
);
taosArrayPush
(
qa
,
id
);
}
}
metaReaderClear
(
&
mr
);
metaReaderClear
(
&
mr
);
if
(
taosArrayGetSize
(
qa
)
>
0
)
{
if
(
taosArrayGetSize
(
qa
)
>
0
)
{
tqReaderAddTbUidList
(
p
Exec
->
execHandle
.
pExec
Reader
,
qa
);
tqReaderAddTbUidList
(
p
TqHandle
->
execHandle
.
pTq
Reader
,
qa
);
}
}
taosArrayDestroy
(
qa
);
taosArrayDestroy
(
qa
);
}
else
{
}
else
{
tqReaderRemoveTbUidList
(
p
Exec
->
execHandle
.
pExec
Reader
,
tbUidList
);
tqReaderRemoveTbUidList
(
p
TqHandle
->
execHandle
.
pTq
Reader
,
tbUidList
);
}
}
}
}
}
}
// update the table list handle for each stream scanner/wal reader
while
(
1
)
{
while
(
1
)
{
pIter
=
taosHashIterate
(
pTq
->
pStreamMeta
->
pTasks
,
pIter
);
pIter
=
taosHashIterate
(
pTq
->
pStreamMeta
->
pTasks
,
pIter
);
if
(
pIter
==
NULL
)
break
;
if
(
pIter
==
NULL
)
{
break
;
}
SStreamTask
*
pTask
=
*
(
SStreamTask
**
)
pIter
;
SStreamTask
*
pTask
=
*
(
SStreamTask
**
)
pIter
;
if
(
pTask
->
taskLevel
==
TASK_LEVEL__SOURCE
)
{
if
(
pTask
->
taskLevel
==
TASK_LEVEL__SOURCE
)
{
int32_t
code
=
qUpdate
QualifiedTableId
(
pTask
->
exec
.
e
xecutor
,
tbUidList
,
isAdd
);
int32_t
code
=
qUpdate
TableListForStreamScanner
(
pTask
->
exec
.
pE
xecutor
,
tbUidList
,
isAdd
);
if
(
code
!=
0
)
{
if
(
code
!=
0
)
{
tqError
(
"
update qualified table error for stream task %d"
,
pTask
->
taskId
);
tqError
(
"
vgId:%d, s-task:%s update qualified table error for stream task"
,
vgId
,
pTask
->
id
.
idStr
);
continue
;
continue
;
}
}
}
}
}
}
return
0
;
return
0
;
}
}
source/dnode/vnode/src/tq/tqRestore.c
0 → 100644
浏览文件 @
f37f4088
/*
* Copyright (c) 2019 TAOS Data, Inc. <jhtao@taosdata.com>
*
* This program is free software: you can use, redistribute, and/or modify
* it under the terms of the GNU Affero General Public License, version 3
* or later ("AGPL"), as published by the Free Software Foundation.
*
* This program is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#include "tq.h"
static
int32_t
streamTaskReplayWal
(
SStreamMeta
*
pStreamMeta
,
STqOffsetStore
*
pOffsetStore
,
bool
*
pScanIdle
);
static
int32_t
transferToNormalTask
(
SStreamMeta
*
pStreamMeta
,
SArray
*
pTaskList
);
// this function should be executed by stream threads.
// there is a case that the WAL increases more fast than the restore procedure, and this restore procedure
// will not stop eventually.
int
tqStreamTasksScanWal
(
STQ
*
pTq
)
{
int32_t
vgId
=
TD_VID
(
pTq
->
pVnode
);
SStreamMeta
*
pMeta
=
pTq
->
pStreamMeta
;
int64_t
st
=
taosGetTimestampMs
();
while
(
1
)
{
tqInfo
(
"vgId:%d continue check if data in wal are available"
,
vgId
);
// check all restore tasks
bool
allFull
=
true
;
streamTaskReplayWal
(
pTq
->
pStreamMeta
,
pTq
->
pOffsetStore
,
&
allFull
);
int32_t
times
=
0
;
if
(
allFull
)
{
taosWLockLatch
(
&
pMeta
->
lock
);
pMeta
->
walScan
-=
1
;
times
=
pMeta
->
walScan
;
if
(
pMeta
->
walScan
<=
0
)
{
taosWUnLockLatch
(
&
pMeta
->
lock
);
break
;
}
taosWUnLockLatch
(
&
pMeta
->
lock
);
tqInfo
(
"vgId:%d scan wal for stream tasks for %d times"
,
vgId
,
times
);
}
}
double
el
=
(
taosGetTimestampMs
()
-
st
)
/
1000
.
0
;
tqInfo
(
"vgId:%d scan wal for stream tasks completed, elapsed time:%.2f sec"
,
vgId
,
el
);
// restore wal scan flag
// atomic_store_8(&pTq->pStreamMeta->walScan, 0);
return
0
;
}
//int32_t transferToNormalTask(SStreamMeta* pStreamMeta, SArray* pTaskList) {
// int32_t numOfTask = taosArrayGetSize(pTaskList);
// if (numOfTask <= 0) {
// return TSDB_CODE_SUCCESS;
// }
//
// // todo: add lock
// for (int32_t i = 0; i < numOfTask; ++i) {
// SStreamTask* pTask = taosArrayGetP(pTaskList, i);
// tqDebug("vgId:%d transfer s-task:%s state restore -> ready, checkpoint:%" PRId64 " checkpoint id:%" PRId64,
// pStreamMeta->vgId, pTask->id.idStr, pTask->chkInfo.version, pTask->chkInfo.id);
// taosHashRemove(pStreamMeta->pWalReadTasks, &pTask->id.taskId, sizeof(pTask->id.taskId));
//
// // NOTE: do not change the following order
// atomic_store_8(&pTask->status.taskStatus, TASK_STATUS__NORMAL);
// taosHashPut(pStreamMeta->pTasks, &pTask->id.taskId, sizeof(pTask->id.taskId), &pTask, POINTER_BYTES);
// }
//
// return TSDB_CODE_SUCCESS;
//}
int32_t
streamTaskReplayWal
(
SStreamMeta
*
pStreamMeta
,
STqOffsetStore
*
pOffsetStore
,
bool
*
pScanIdle
)
{
void
*
pIter
=
NULL
;
int32_t
vgId
=
pStreamMeta
->
vgId
;
*
pScanIdle
=
true
;
bool
allWalChecked
=
true
;
tqDebug
(
"vgId:%d start to check wal to extract new submit block"
,
vgId
);
while
(
1
)
{
pIter
=
taosHashIterate
(
pStreamMeta
->
pTasks
,
pIter
);
if
(
pIter
==
NULL
)
{
break
;
}
SStreamTask
*
pTask
=
*
(
SStreamTask
**
)
pIter
;
if
(
pTask
->
taskLevel
!=
TASK_LEVEL__SOURCE
)
{
continue
;
}
if
(
pTask
->
status
.
taskStatus
==
TASK_STATUS__RECOVER_PREPARE
||
pTask
->
status
.
taskStatus
==
TASK_STATUS__WAIT_DOWNSTREAM
)
{
tqDebug
(
"s-task:%s skip push data, not ready for processing, status %d"
,
pTask
->
id
.
idStr
,
pTask
->
status
.
taskStatus
);
continue
;
}
// check if offset value exists
char
key
[
128
]
=
{
0
};
createStreamTaskOffsetKey
(
key
,
pTask
->
id
.
streamId
,
pTask
->
id
.
taskId
);
if
(
tInputQueueIsFull
(
pTask
))
{
tqDebug
(
"vgId:%d s-task:%s input queue is full, do nothing"
,
vgId
,
pTask
->
id
.
idStr
);
continue
;
}
*
pScanIdle
=
false
;
// check if offset value exists
STqOffset
*
pOffset
=
tqOffsetRead
(
pOffsetStore
,
key
);
ASSERT
(
pOffset
!=
NULL
);
// seek the stored version and extract data from WAL
int32_t
code
=
walReadSeekVer
(
pTask
->
exec
.
pWalReader
,
pOffset
->
val
.
version
);
if
(
code
!=
TSDB_CODE_SUCCESS
)
{
// no data in wal, quit
continue
;
}
// append the data for the stream
tqDebug
(
"vgId:%d wal reader seek to ver:%"
PRId64
" %s"
,
vgId
,
pOffset
->
val
.
version
,
pTask
->
id
.
idStr
);
SPackedData
packData
=
{
0
};
code
=
extractSubmitMsgFromWal
(
pTask
->
exec
.
pWalReader
,
&
packData
);
if
(
code
!=
TSDB_CODE_SUCCESS
)
{
// failed, continue
continue
;
}
SStreamDataSubmit2
*
p
=
streamDataSubmitNew
(
packData
,
STREAM_INPUT__DATA_SUBMIT
);
if
(
p
==
NULL
)
{
terrno
=
TSDB_CODE_OUT_OF_MEMORY
;
tqError
(
"%s failed to create data submit for stream since out of memory"
,
pTask
->
id
.
idStr
);
continue
;
}
allWalChecked
=
false
;
tqDebug
(
"s-task:%s submit data extracted from WAL"
,
pTask
->
id
.
idStr
);
code
=
tqAddInputBlockNLaunchTask
(
pTask
,
(
SStreamQueueItem
*
)
p
,
packData
.
ver
);
if
(
code
==
TSDB_CODE_SUCCESS
)
{
pOffset
->
val
.
version
=
walReaderGetCurrentVer
(
pTask
->
exec
.
pWalReader
);
tqDebug
(
"s-task:%s set the ver:%"
PRId64
" from WALReader after extract block from WAL"
,
pTask
->
id
.
idStr
,
pOffset
->
val
.
version
);
}
else
{
// do nothing
}
streamDataSubmitDestroy
(
p
);
taosFreeQitem
(
p
);
}
if
(
allWalChecked
)
{
*
pScanIdle
=
true
;
}
return
0
;
}
source/dnode/vnode/src/tq/tqScan.c
浏览文件 @
f37f4088
...
@@ -38,7 +38,7 @@ int32_t tqAddBlockDataToRsp(const SSDataBlock* pBlock, SMqDataRsp* pRsp, int32_t
...
@@ -38,7 +38,7 @@ int32_t tqAddBlockDataToRsp(const SSDataBlock* pBlock, SMqDataRsp* pRsp, int32_t
}
}
static
int32_t
tqAddBlockSchemaToRsp
(
const
STqExecHandle
*
pExec
,
STaosxRsp
*
pRsp
)
{
static
int32_t
tqAddBlockSchemaToRsp
(
const
STqExecHandle
*
pExec
,
STaosxRsp
*
pRsp
)
{
SSchemaWrapper
*
pSW
=
tCloneSSchemaWrapper
(
pExec
->
p
Exec
Reader
->
pSchemaWrapper
);
SSchemaWrapper
*
pSW
=
tCloneSSchemaWrapper
(
pExec
->
p
Tq
Reader
->
pSchemaWrapper
);
if
(
pSW
==
NULL
)
{
if
(
pSW
==
NULL
)
{
return
-
1
;
return
-
1
;
}
}
...
@@ -137,7 +137,7 @@ int32_t tqScanTaosx(STQ* pTq, const STqHandle* pHandle, STaosxRsp* pRsp, SMqMeta
...
@@ -137,7 +137,7 @@ int32_t tqScanTaosx(STQ* pTq, const STqHandle* pHandle, STaosxRsp* pRsp, SMqMeta
if
(
pDataBlock
!=
NULL
&&
pDataBlock
->
info
.
rows
>
0
)
{
if
(
pDataBlock
!=
NULL
&&
pDataBlock
->
info
.
rows
>
0
)
{
if
(
pRsp
->
withTbName
)
{
if
(
pRsp
->
withTbName
)
{
if
(
pOffset
->
type
==
TMQ_OFFSET__LOG
)
{
if
(
pOffset
->
type
==
TMQ_OFFSET__LOG
)
{
int64_t
uid
=
pExec
->
p
Exec
Reader
->
lastBlkUid
;
int64_t
uid
=
pExec
->
p
Tq
Reader
->
lastBlkUid
;
if
(
tqAddTbNameToRsp
(
pTq
,
uid
,
pRsp
,
1
)
<
0
)
{
if
(
tqAddTbNameToRsp
(
pTq
,
uid
,
pRsp
,
1
)
<
0
)
{
continue
;
continue
;
}
}
...
@@ -203,9 +203,9 @@ int32_t tqTaosxScanLog(STQ* pTq, STqHandle* pHandle, SPackedData submit, STaosxR
...
@@ -203,9 +203,9 @@ int32_t tqTaosxScanLog(STQ* pTq, STqHandle* pHandle, SPackedData submit, STaosxR
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
->
p
Exec
Reader
;
STqReader
*
pReader
=
pExec
->
p
Tq
Reader
;
tqReaderSetSubmit
Req2
(
pReader
,
submit
.
msgStr
,
submit
.
msgLen
,
submit
.
ver
);
tqReaderSetSubmit
Msg
(
pReader
,
submit
.
msgStr
,
submit
.
msgLen
,
submit
.
ver
);
while
(
tqNextDataBlock
2
(
pReader
))
{
while
(
tqNextDataBlock
(
pReader
))
{
taosArrayClear
(
pBlocks
);
taosArrayClear
(
pBlocks
);
taosArrayClear
(
pSchemas
);
taosArrayClear
(
pSchemas
);
SSubmitTbData
*
pSubmitTbDataRet
=
NULL
;
SSubmitTbData
*
pSubmitTbDataRet
=
NULL
;
...
@@ -213,7 +213,7 @@ int32_t tqTaosxScanLog(STQ* pTq, STqHandle* pHandle, SPackedData submit, STaosxR
...
@@ -213,7 +213,7 @@ 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
->
p
Exec
Reader
->
lastBlkUid
;
int64_t
uid
=
pExec
->
p
Tq
Reader
->
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
);
taosArrayDestroyP
(
pSchemas
,
(
FDelete
)
tDeleteSSchemaWrapper
);
taosArrayDestroyP
(
pSchemas
,
(
FDelete
)
tDeleteSSchemaWrapper
);
...
@@ -262,8 +262,8 @@ int32_t tqTaosxScanLog(STQ* pTq, STqHandle* pHandle, SPackedData submit, STaosxR
...
@@ -262,8 +262,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
->
p
Exec
Reader
;
STqReader
*
pReader
=
pExec
->
p
Tq
Reader
;
tqReaderSetSubmit
Req2
(
pReader
,
submit
.
msgStr
,
submit
.
msgLen
,
submit
.
ver
);
tqReaderSetSubmit
Msg
(
pReader
,
submit
.
msgStr
,
submit
.
msgLen
,
submit
.
ver
);
while
(
tqNextDataBlockFilterOut2
(
pReader
,
pExec
->
execDb
.
pFilterOutTbUid
))
{
while
(
tqNextDataBlockFilterOut2
(
pReader
,
pExec
->
execDb
.
pFilterOutTbUid
))
{
taosArrayClear
(
pBlocks
);
taosArrayClear
(
pBlocks
);
taosArrayClear
(
pSchemas
);
taosArrayClear
(
pSchemas
);
...
@@ -272,7 +272,7 @@ int32_t tqTaosxScanLog(STQ* pTq, STqHandle* pHandle, SPackedData submit, STaosxR
...
@@ -272,7 +272,7 @@ 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
->
p
Exec
Reader
->
lastBlkUid
;
int64_t
uid
=
pExec
->
p
Tq
Reader
->
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
);
taosArrayDestroyP
(
pSchemas
,
(
FDelete
)
tDeleteSSchemaWrapper
);
taosArrayDestroyP
(
pSchemas
,
(
FDelete
)
tDeleteSSchemaWrapper
);
...
...
source/dnode/vnode/src/tq/tqSink.c
浏览文件 @
f37f4088
...
@@ -87,7 +87,7 @@ void tqSinkToTablePipeline(SStreamTask* pTask, void* vnode, int64_t ver, void* d
...
@@ -87,7 +87,7 @@ void tqSinkToTablePipeline(SStreamTask* pTask, void* vnode, int64_t ver, void* d
return
;
return
;
}
}
tqDebug
(
"vgId:%d,
task %d write into table, block num: %d"
,
TD_VID
(
pVnode
),
pTask
->
taskId
,
blockSz
);
tqDebug
(
"vgId:%d,
s-task:%s write into table, block num: %d"
,
TD_VID
(
pVnode
),
pTask
->
id
.
idStr
,
blockSz
);
for
(
int32_t
i
=
0
;
i
<
blockSz
;
i
++
)
{
for
(
int32_t
i
=
0
;
i
<
blockSz
;
i
++
)
{
bool
createTb
=
true
;
bool
createTb
=
true
;
SSDataBlock
*
pDataBlock
=
taosArrayGet
(
pBlocks
,
i
);
SSDataBlock
*
pDataBlock
=
taosArrayGet
(
pBlocks
,
i
);
...
@@ -382,7 +382,7 @@ void tqSinkToTablePipeline2(SStreamTask* pTask, void* vnode, int64_t ver, void*
...
@@ -382,7 +382,7 @@ void tqSinkToTablePipeline2(SStreamTask* pTask, void* vnode, int64_t ver, void*
int32_t
blockSz
=
taosArrayGetSize
(
pBlocks
);
int32_t
blockSz
=
taosArrayGetSize
(
pBlocks
);
tqDebug
(
"vgId:%d,
task %d write into table, block num: %d"
,
TD_VID
(
pVnode
),
pTask
->
taskId
,
blockSz
);
tqDebug
(
"vgId:%d,
s-task:%s write results blocks:%d into table"
,
TD_VID
(
pVnode
),
pTask
->
id
.
idStr
,
blockSz
);
void
*
pBuf
=
NULL
;
void
*
pBuf
=
NULL
;
SArray
*
tagArray
=
NULL
;
SArray
*
tagArray
=
NULL
;
...
@@ -475,11 +475,9 @@ void tqSinkToTablePipeline2(SStreamTask* pTask, void* vnode, int64_t ver, void*
...
@@ -475,11 +475,9 @@ void tqSinkToTablePipeline2(SStreamTask* pTask, void* vnode, int64_t ver, void*
}
}
for
(
int32_t
tagId
=
UD_TAG_COLUMN_INDEX
,
step
=
1
;
tagId
<
size
;
tagId
++
,
step
++
)
{
for
(
int32_t
tagId
=
UD_TAG_COLUMN_INDEX
,
step
=
1
;
tagId
<
size
;
tagId
++
,
step
++
)
{
SColumnInfoData
*
pTagData
=
taosArrayGet
(
pDataBlock
->
pDataBlock
,
tagId
);
SColumnInfoData
*
pTagData
=
taosArrayGet
(
pDataBlock
->
pDataBlock
,
tagId
);
STagVal
tagVal
=
{
.
cid
=
pTSchema
->
numOfCols
+
step
,
STagVal
tagVal
=
{.
cid
=
pTSchema
->
numOfCols
+
step
,
.
type
=
pTagData
->
info
.
type
};
.
type
=
pTagData
->
info
.
type
,
void
*
pData
=
colDataGetData
(
pTagData
,
rowId
);
};
void
*
pData
=
colDataGetData
(
pTagData
,
rowId
);
if
(
colDataIsNull_s
(
pTagData
,
rowId
))
{
if
(
colDataIsNull_s
(
pTagData
,
rowId
))
{
continue
;
continue
;
}
else
if
(
IS_VAR_DATA_TYPE
(
pTagData
->
info
.
type
))
{
}
else
if
(
IS_VAR_DATA_TYPE
(
pTagData
->
info
.
type
))
{
...
...
source/dnode/vnode/src/tq/tqUtil.c
0 → 100644
浏览文件 @
f37f4088
/*
* Copyright (c) 2019 TAOS Data, Inc. <jhtao@taosdata.com>
*
* This program is free software: you can use, redistribute, and/or modify
* it under the terms of the GNU Affero General Public License, version 3
* or later ("AGPL"), as published by the Free Software Foundation.
*
* This program is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#include "tq.h"
#define IS_OFFSET_RESET_TYPE(_t) ((_t) < 0)
static
int32_t
tqSendMetaPollRsp
(
STQ
*
pTq
,
const
SRpcMsg
*
pMsg
,
const
SMqPollReq
*
pReq
,
const
SMqMetaRsp
*
pRsp
);
// stream_task:stream_id:task_id
void
createStreamTaskOffsetKey
(
char
*
dst
,
uint64_t
streamId
,
uint32_t
taskId
)
{
int32_t
n
=
12
;
char
*
p
=
dst
;
memcpy
(
p
,
"stream_task:"
,
n
);
p
+=
n
;
int32_t
inc
=
tintToHex
(
streamId
,
p
);
p
+=
inc
;
*
(
p
++
)
=
':'
;
tintToHex
(
taskId
,
p
);
}
int32_t
tqAddInputBlockNLaunchTask
(
SStreamTask
*
pTask
,
SStreamQueueItem
*
pQueueItem
,
int64_t
ver
)
{
int32_t
code
=
tAppendDataToInputQueue
(
pTask
,
pQueueItem
);
if
(
code
<
0
)
{
tqError
(
"s-task:%s failed to put into queue, too many, next start ver:%"
PRId64
,
pTask
->
id
.
idStr
,
ver
);
return
-
1
;
}
if
(
streamSchedExec
(
pTask
)
<
0
)
{
tqError
(
"stream task:%d failed to be launched, code:%s"
,
pTask
->
id
.
taskId
,
tstrerror
(
terrno
));
return
-
1
;
}
return
TSDB_CODE_SUCCESS
;
}
void
initOffsetForAllRestoreTasks
(
STQ
*
pTq
)
{
void
*
pIter
=
NULL
;
while
(
1
)
{
pIter
=
taosHashIterate
(
pTq
->
pStreamMeta
->
pTasks
,
pIter
);
if
(
pIter
==
NULL
)
{
break
;
}
SStreamTask
*
pTask
=
*
(
SStreamTask
**
)
pIter
;
if
(
pTask
->
taskLevel
!=
TASK_LEVEL__SOURCE
)
{
continue
;
}
if
(
pTask
->
status
.
taskStatus
==
TASK_STATUS__RECOVER_PREPARE
||
pTask
->
status
.
taskStatus
==
TASK_STATUS__WAIT_DOWNSTREAM
)
{
tqDebug
(
"s-task:%s skip push data, since not ready, status %d"
,
pTask
->
id
.
idStr
,
pTask
->
status
.
taskStatus
);
continue
;
}
char
key
[
128
]
=
{
0
};
createStreamTaskOffsetKey
(
key
,
pTask
->
id
.
streamId
,
pTask
->
id
.
taskId
);
STqOffset
*
pOffset
=
tqOffsetRead
(
pTq
->
pOffsetStore
,
key
);
if
(
pOffset
==
NULL
)
{
doSaveTaskOffset
(
pTq
->
pOffsetStore
,
key
,
pTask
->
chkInfo
.
version
);
}
}
}
void
saveOffsetForAllTasks
(
STQ
*
pTq
,
int64_t
ver
)
{
void
*
pIter
=
NULL
;
while
(
1
)
{
pIter
=
taosHashIterate
(
pTq
->
pStreamMeta
->
pTasks
,
pIter
);
if
(
pIter
==
NULL
)
{
break
;
}
SStreamTask
*
pTask
=
*
(
SStreamTask
**
)
pIter
;
if
(
pTask
->
taskLevel
!=
TASK_LEVEL__SOURCE
)
{
continue
;
}
if
(
pTask
->
status
.
taskStatus
==
TASK_STATUS__RECOVER_PREPARE
||
pTask
->
status
.
taskStatus
==
TASK_STATUS__WAIT_DOWNSTREAM
)
{
tqDebug
(
"s-task:%s skip push data, not ready for processing, status %d"
,
pTask
->
id
.
idStr
,
pTask
->
status
.
taskStatus
);
continue
;
}
char
key
[
128
]
=
{
0
};
createStreamTaskOffsetKey
(
key
,
pTask
->
id
.
streamId
,
pTask
->
id
.
taskId
);
STqOffset
*
pOffset
=
tqOffsetRead
(
pTq
->
pOffsetStore
,
key
);
if
(
pOffset
==
NULL
)
{
doSaveTaskOffset
(
pTq
->
pOffsetStore
,
key
,
ver
);
}
}
}
void
doSaveTaskOffset
(
STqOffsetStore
*
pOffsetStore
,
const
char
*
pKey
,
int64_t
ver
)
{
STqOffset
offset
=
{
0
};
tqOffsetResetToLog
(
&
offset
.
val
,
ver
);
tstrncpy
(
offset
.
subKey
,
pKey
,
tListLen
(
offset
.
subKey
));
// keep the offset info in the offset store
tqOffsetWrite
(
pOffsetStore
,
&
offset
);
}
static
int32_t
tqInitDataRsp
(
SMqDataRsp
*
pRsp
,
const
SMqPollReq
*
pReq
,
int8_t
subType
)
{
pRsp
->
reqOffset
=
pReq
->
reqOffset
;
pRsp
->
blockData
=
taosArrayInit
(
0
,
sizeof
(
void
*
));
pRsp
->
blockDataLen
=
taosArrayInit
(
0
,
sizeof
(
int32_t
));
if
(
pRsp
->
blockData
==
NULL
||
pRsp
->
blockDataLen
==
NULL
)
{
return
-
1
;
}
pRsp
->
withTbName
=
0
;
pRsp
->
withSchema
=
false
;
return
0
;
}
static
int32_t
tqInitTaosxRsp
(
STaosxRsp
*
pRsp
,
const
SMqPollReq
*
pReq
)
{
pRsp
->
reqOffset
=
pReq
->
reqOffset
;
pRsp
->
withTbName
=
1
;
pRsp
->
withSchema
=
1
;
pRsp
->
blockData
=
taosArrayInit
(
0
,
sizeof
(
void
*
));
pRsp
->
blockDataLen
=
taosArrayInit
(
0
,
sizeof
(
int32_t
));
pRsp
->
blockTbName
=
taosArrayInit
(
0
,
sizeof
(
void
*
));
pRsp
->
blockSchema
=
taosArrayInit
(
0
,
sizeof
(
void
*
));
if
(
pRsp
->
blockData
==
NULL
||
pRsp
->
blockDataLen
==
NULL
||
pRsp
->
blockTbName
==
NULL
||
pRsp
->
blockSchema
==
NULL
)
{
return
-
1
;
}
return
0
;
}
static
int32_t
extractResetOffsetVal
(
STqOffsetVal
*
pOffsetVal
,
STQ
*
pTq
,
STqHandle
*
pHandle
,
const
SMqPollReq
*
pRequest
,
SRpcMsg
*
pMsg
,
bool
*
pBlockReturned
)
{
uint64_t
consumerId
=
pRequest
->
consumerId
;
STqOffsetVal
reqOffset
=
pRequest
->
reqOffset
;
STqOffset
*
pOffset
=
tqOffsetRead
(
pTq
->
pOffsetStore
,
pRequest
->
subKey
);
int32_t
vgId
=
TD_VID
(
pTq
->
pVnode
);
*
pBlockReturned
=
false
;
// In this vnode, data has been polled by consumer for this topic, so let's continue from the last offset value.
if
(
pOffset
!=
NULL
)
{
*
pOffsetVal
=
pOffset
->
val
;
char
formatBuf
[
80
];
tFormatOffset
(
formatBuf
,
80
,
pOffsetVal
);
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
,
pRequest
->
reqId
);
return
0
;
}
else
{
// no poll occurs in this vnode for this topic, let's seek to the right offset value.
if
(
reqOffset
.
type
==
TMQ_OFFSET__RESET_EARLIEAST
)
{
if
(
pRequest
->
useSnapshot
)
{
tqDebug
(
"tmq poll: consumer:0x%"
PRIx64
", subkey:%s, vgId:%d, (earliest) set offset to be snapshot"
,
consumerId
,
pHandle
->
subKey
,
vgId
);
if
(
pHandle
->
fetchMeta
)
{
tqOffsetResetToMeta
(
pOffsetVal
,
0
);
}
else
{
tqOffsetResetToData
(
pOffsetVal
,
0
,
0
);
}
}
else
{
pHandle
->
pRef
=
walRefFirstVer
(
pTq
->
pVnode
->
pWal
,
pHandle
->
pRef
);
if
(
pHandle
->
pRef
==
NULL
)
{
terrno
=
TSDB_CODE_OUT_OF_MEMORY
;
return
-
1
;
}
// offset set to previous version when init
tqOffsetResetToLog
(
pOffsetVal
,
pHandle
->
pRef
->
refVer
-
1
);
}
}
else
if
(
reqOffset
.
type
==
TMQ_OFFSET__RESET_LATEST
)
{
if
(
pHandle
->
execHandle
.
subType
==
TOPIC_SUB_TYPE__COLUMN
)
{
SMqDataRsp
dataRsp
=
{
0
};
tqInitDataRsp
(
&
dataRsp
,
pRequest
,
pHandle
->
execHandle
.
subType
);
tqOffsetResetToLog
(
&
dataRsp
.
rspOffset
,
walGetLastVer
(
pTq
->
pVnode
->
pWal
));
tqDebug
(
"tmq poll: consumer:0x%"
PRIx64
", subkey %s, vgId:%d, (latest) offset reset to %"
PRId64
,
consumerId
,
pHandle
->
subKey
,
vgId
,
dataRsp
.
rspOffset
.
version
);
int32_t
code
=
tqSendDataRsp
(
pTq
,
pMsg
,
pRequest
,
&
dataRsp
,
TMQ_MSG_TYPE__POLL_RSP
);
tDeleteSMqDataRsp
(
&
dataRsp
);
*
pBlockReturned
=
true
;
return
code
;
}
else
{
STaosxRsp
taosxRsp
=
{
0
};
tqInitTaosxRsp
(
&
taosxRsp
,
pRequest
);
tqOffsetResetToLog
(
&
taosxRsp
.
rspOffset
,
walGetLastVer
(
pTq
->
pVnode
->
pWal
));
int32_t
code
=
tqSendDataRsp
(
pTq
,
pMsg
,
pRequest
,
(
SMqDataRsp
*
)
&
taosxRsp
,
TMQ_MSG_TYPE__TAOSX_RSP
);
tDeleteSTaosxRsp
(
&
taosxRsp
);
*
pBlockReturned
=
true
;
return
code
;
}
}
else
if
(
reqOffset
.
type
==
TMQ_OFFSET__RESET_NONE
)
{
tqError
(
"tmq poll: subkey:%s, no offset committed for consumer:0x%"
PRIx64
" in vg %d, subkey %s, reset none failed"
,
pHandle
->
subKey
,
consumerId
,
vgId
,
pRequest
->
subKey
);
terrno
=
TSDB_CODE_TQ_NO_COMMITTED_OFFSET
;
return
-
1
;
}
}
return
0
;
}
static
int32_t
extractDataAndRspForNormalSubscribe
(
STQ
*
pTq
,
STqHandle
*
pHandle
,
const
SMqPollReq
*
pRequest
,
SRpcMsg
*
pMsg
,
STqOffsetVal
*
pOffset
)
{
uint64_t
consumerId
=
pRequest
->
consumerId
;
int32_t
vgId
=
TD_VID
(
pTq
->
pVnode
);
SMqDataRsp
dataRsp
=
{
0
};
tqInitDataRsp
(
&
dataRsp
,
pRequest
,
pHandle
->
execHandle
.
subType
);
// lock
taosWLockLatch
(
&
pTq
->
lock
);
qSetTaskId
(
pHandle
->
execHandle
.
task
,
consumerId
,
pRequest
->
reqId
);
int
code
=
tqScanData
(
pTq
,
pHandle
,
&
dataRsp
,
pOffset
);
if
(
code
!=
0
)
{
goto
end
;
}
// 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
&&
dataRsp
.
reqOffset
.
version
==
dataRsp
.
rspOffset
.
version
&&
pHandle
->
consumerId
==
pRequest
->
consumerId
)
{
code
=
tqRegisterPushHandle
(
pTq
,
pHandle
,
pRequest
,
pMsg
,
&
dataRsp
,
TMQ_MSG_TYPE__POLL_RSP
);
taosWUnLockLatch
(
&
pTq
->
lock
);
return
code
;
}
code
=
tqSendDataRsp
(
pTq
,
pMsg
,
pRequest
,
(
SMqDataRsp
*
)
&
dataRsp
,
TMQ_MSG_TYPE__POLL_RSP
);
// NOTE: this pHandle->consumerId may have been changed already.
end:
{
char
buf
[
80
]
=
{
0
};
tFormatOffset
(
buf
,
80
,
&
dataRsp
.
rspOffset
);
tqDebug
(
"tmq poll: consumer:0x%"
PRIx64
", subkey %s, vgId:%d, rsp block:%d, rsp offset type:%s, reqId:0x%"
PRIx64
" code:%d"
,
consumerId
,
pHandle
->
subKey
,
vgId
,
dataRsp
.
blockNum
,
buf
,
pRequest
->
reqId
,
code
);
taosWUnLockLatch
(
&
pTq
->
lock
);
tDeleteSMqDataRsp
(
&
dataRsp
);
}
return
code
;
}
static
int32_t
extractDataAndRspForDbStbSubscribe
(
STQ
*
pTq
,
STqHandle
*
pHandle
,
const
SMqPollReq
*
pRequest
,
SRpcMsg
*
pMsg
,
STqOffsetVal
*
offset
)
{
int
code
=
0
;
int32_t
vgId
=
TD_VID
(
pTq
->
pVnode
);
SWalCkHead
*
pCkHead
=
NULL
;
SMqMetaRsp
metaRsp
=
{
0
};
STaosxRsp
taosxRsp
=
{
0
};
tqInitTaosxRsp
(
&
taosxRsp
,
pRequest
);
if
(
offset
->
type
!=
TMQ_OFFSET__LOG
)
{
if
(
tqScanTaosx
(
pTq
,
pHandle
,
&
taosxRsp
,
&
metaRsp
,
offset
)
<
0
)
{
return
-
1
;
}
if
(
metaRsp
.
metaRspLen
>
0
)
{
code
=
tqSendMetaPollRsp
(
pTq
,
pMsg
,
pRequest
,
&
metaRsp
);
tqDebug
(
"tmq poll: consumer:0x%"
PRIx64
" subkey:%s vgId:%d, send meta offset type:%d,uid:%"
PRId64
",ts:%"
PRId64
,
pRequest
->
consumerId
,
pHandle
->
subKey
,
vgId
,
metaRsp
.
rspOffset
.
type
,
metaRsp
.
rspOffset
.
uid
,
metaRsp
.
rspOffset
.
ts
);
taosMemoryFree
(
metaRsp
.
metaRsp
);
tDeleteSTaosxRsp
(
&
taosxRsp
);
return
code
;
}
tqDebug
(
"taosx poll: consumer:0x%"
PRIx64
" subkey:%s vgId:%d, send data blockNum:%d, offset type:%d,uid:%"
PRId64
",ts:%"
PRId64
,
pRequest
->
consumerId
,
pHandle
->
subKey
,
vgId
,
taosxRsp
.
blockNum
,
taosxRsp
.
rspOffset
.
type
,
taosxRsp
.
rspOffset
.
uid
,
taosxRsp
.
rspOffset
.
ts
);
if
(
taosxRsp
.
blockNum
>
0
)
{
code
=
tqSendDataRsp
(
pTq
,
pMsg
,
pRequest
,
(
SMqDataRsp
*
)
&
taosxRsp
,
TMQ_MSG_TYPE__TAOSX_RSP
);
tDeleteSTaosxRsp
(
&
taosxRsp
);
return
code
;
}
else
{
*
offset
=
taosxRsp
.
rspOffset
;
}
}
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
)
{
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"
,
pRequest
->
consumerId
,
pRequest
->
epoch
,
pHandle
->
subKey
,
vgId
,
fetchVer
,
savedEpoch
,
pRequest
->
epoch
);
break
;
}
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
;
}
SWalCont
*
pHead
=
&
pCkHead
->
head
;
tqDebug
(
"tmq poll: consumer:0x%"
PRIx64
" (epoch %d) iter log, vgId:%d offset %"
PRId64
" msgType %d"
,
pRequest
->
consumerId
,
pRequest
->
epoch
,
vgId
,
fetchVer
,
pHead
->
msgType
);
// process meta
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
);
tDeleteSTaosxRsp
(
&
taosxRsp
);
taosMemoryFreeClear
(
pCkHead
);
return
code
;
}
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
);
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"
,
pRequest
->
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
;
}
int32_t
tqExtractDataForMq
(
STQ
*
pTq
,
STqHandle
*
pHandle
,
const
SMqPollReq
*
pRequest
,
SRpcMsg
*
pMsg
)
{
int32_t
code
=
-
1
;
STqOffsetVal
offset
=
{
0
};
STqOffsetVal
reqOffset
=
pRequest
->
reqOffset
;
// 1. reset the offset if needed
if
(
IS_OFFSET_RESET_TYPE
(
reqOffset
.
type
))
{
// handle the reset offset cases, according to the consumer's choice.
bool
blockReturned
=
false
;
code
=
extractResetOffsetVal
(
&
offset
,
pTq
,
pHandle
,
pRequest
,
pMsg
,
&
blockReturned
);
if
(
code
!=
0
)
{
return
code
;
}
// empty block returned, quit
if
(
blockReturned
)
{
return
0
;
}
}
else
{
// use the consumer specified offset
// the offset value can not be monotonious increase??
offset
=
reqOffset
;
}
// this is a normal subscribe requirement
if
(
pHandle
->
execHandle
.
subType
==
TOPIC_SUB_TYPE__COLUMN
)
{
return
extractDataAndRspForNormalSubscribe
(
pTq
,
pHandle
,
pRequest
,
pMsg
,
&
offset
);
}
// todo handle the case where re-balance occurs.
// for taosx
return
extractDataAndRspForDbStbSubscribe
(
pTq
,
pHandle
,
pRequest
,
pMsg
,
&
offset
);
}
int32_t
tqSendMetaPollRsp
(
STQ
*
pTq
,
const
SRpcMsg
*
pMsg
,
const
SMqPollReq
*
pReq
,
const
SMqMetaRsp
*
pRsp
)
{
int32_t
len
=
0
;
int32_t
code
=
0
;
tEncodeSize
(
tEncodeSMqMetaRsp
,
pRsp
,
len
,
code
);
if
(
code
<
0
)
{
return
-
1
;
}
int32_t
tlen
=
sizeof
(
SMqRspHead
)
+
len
;
void
*
buf
=
rpcMallocCont
(
tlen
);
if
(
buf
==
NULL
)
{
return
-
1
;
}
((
SMqRspHead
*
)
buf
)
->
mqMsgType
=
TMQ_MSG_TYPE__POLL_META_RSP
;
((
SMqRspHead
*
)
buf
)
->
epoch
=
pReq
->
epoch
;
((
SMqRspHead
*
)
buf
)
->
consumerId
=
pReq
->
consumerId
;
void
*
abuf
=
POINTER_SHIFT
(
buf
,
sizeof
(
SMqRspHead
));
SEncoder
encoder
=
{
0
};
tEncoderInit
(
&
encoder
,
abuf
,
len
);
tEncodeSMqMetaRsp
(
&
encoder
,
pRsp
);
tEncoderClear
(
&
encoder
);
SRpcMsg
resp
=
{
.
info
=
pMsg
->
info
,
.
pCont
=
buf
,
.
contLen
=
tlen
,
.
code
=
0
,
};
tmsgSendRsp
(
&
resp
);
tqDebug
(
"vgId:%d, from consumer:0x%"
PRIx64
" (epoch %d) send rsp, res msg type %d, offset type:%d"
,
TD_VID
(
pTq
->
pVnode
),
pReq
->
consumerId
,
pReq
->
epoch
,
pRsp
->
resMsgType
,
pRsp
->
rspOffset
.
type
);
return
0
;
}
source/dnode/vnode/src/tsdb/tsdbRead.c
浏览文件 @
f37f4088
...
@@ -831,6 +831,7 @@ static int32_t doLoadBlockIndex(STsdbReader* pReader, SDataFReader* pFileReader,
...
@@ -831,6 +831,7 @@ static int32_t doLoadBlockIndex(STsdbReader* pReader, SDataFReader* pFileReader,
// this block belongs to a table that is not queried.
// this block belongs to a table that is not queried.
STableBlockScanInfo
*
pScanInfo
=
getTableBlockScanInfo
(
pReader
->
status
.
pTableMap
,
pBlockIdx
->
uid
,
pReader
->
idStr
);
STableBlockScanInfo
*
pScanInfo
=
getTableBlockScanInfo
(
pReader
->
status
.
pTableMap
,
pBlockIdx
->
uid
,
pReader
->
idStr
);
if
(
pScanInfo
==
NULL
)
{
if
(
pScanInfo
==
NULL
)
{
tsdbBICacheRelease
(
pFileReader
->
pTsdb
->
biCache
,
handle
);
return
terrno
;
return
terrno
;
}
}
...
@@ -2088,7 +2089,7 @@ static int32_t doMergeFileBlockAndLastBlock(SLastBlockReader* pLastBlockReader,
...
@@ -2088,7 +2089,7 @@ static int32_t doMergeFileBlockAndLastBlock(SLastBlockReader* pLastBlockReader,
pBlockScanInfo
->
lastKey
=
tsLastBlock
;
pBlockScanInfo
->
lastKey
=
tsLastBlock
;
return
TSDB_CODE_SUCCESS
;
return
TSDB_CODE_SUCCESS
;
}
else
{
}
else
{
int32_t
code
=
tsdbRowMergerInit
(
&
merge
,
NULL
,
&
fRow
,
pReader
->
pSchema
);
code
=
tsdbRowMergerInit
(
&
merge
,
NULL
,
&
fRow
,
pReader
->
pSchema
);
if
(
code
!=
TSDB_CODE_SUCCESS
)
{
if
(
code
!=
TSDB_CODE_SUCCESS
)
{
return
code
;
return
code
;
}
}
...
@@ -2112,7 +2113,7 @@ static int32_t doMergeFileBlockAndLastBlock(SLastBlockReader* pLastBlockReader,
...
@@ -2112,7 +2113,7 @@ static int32_t doMergeFileBlockAndLastBlock(SLastBlockReader* pLastBlockReader,
}
}
}
}
}
else
{
// not merge block data
}
else
{
// not merge block data
int32_t
code
=
tsdbRowMergerInit
(
&
merge
,
NULL
,
&
fRow
,
pReader
->
pSchema
);
code
=
tsdbRowMergerInit
(
&
merge
,
NULL
,
&
fRow
,
pReader
->
pSchema
);
if
(
code
!=
TSDB_CODE_SUCCESS
)
{
if
(
code
!=
TSDB_CODE_SUCCESS
)
{
return
code
;
return
code
;
}
}
...
@@ -2575,7 +2576,7 @@ int32_t mergeRowsInFileBlocks(SBlockData* pBlockData, STableBlockScanInfo* pBloc
...
@@ -2575,7 +2576,7 @@ int32_t mergeRowsInFileBlocks(SBlockData* pBlockData, STableBlockScanInfo* pBloc
SRow
*
pTSRow
=
NULL
;
SRow
*
pTSRow
=
NULL
;
SRowMerger
merge
=
{
0
};
SRowMerger
merge
=
{
0
};
int32_t
code
=
tsdbRowMergerInit
(
&
merge
,
NULL
,
&
fRow
,
pReader
->
pSchema
);
code
=
tsdbRowMergerInit
(
&
merge
,
NULL
,
&
fRow
,
pReader
->
pSchema
);
if
(
code
!=
TSDB_CODE_SUCCESS
)
{
if
(
code
!=
TSDB_CODE_SUCCESS
)
{
return
code
;
return
code
;
}
}
...
@@ -3242,8 +3243,8 @@ static int32_t readRowsCountFromFiles(STsdbReader* pReader) {
...
@@ -3242,8 +3243,8 @@ static int32_t readRowsCountFromFiles(STsdbReader* pReader) {
int32_t
code
=
TSDB_CODE_SUCCESS
;
int32_t
code
=
TSDB_CODE_SUCCESS
;
while
(
1
)
{
while
(
1
)
{
bool
hasNext
=
false
;
bool
hasNext
=
false
;
int32_t
code
=
filesetIteratorNext
(
&
pReader
->
status
.
fileIter
,
pReader
,
&
hasNext
);
code
=
filesetIteratorNext
(
&
pReader
->
status
.
fileIter
,
pReader
,
&
hasNext
);
if
(
code
)
{
if
(
code
)
{
return
code
;
return
code
;
}
}
...
@@ -3515,8 +3516,8 @@ SVersionRange getQueryVerRange(SVnode* pVnode, SQueryTableDataCond* pCond, int8_
...
@@ -3515,8 +3516,8 @@ SVersionRange getQueryVerRange(SVnode* pVnode, SQueryTableDataCond* pCond, int8_
int64_t
startVer
=
(
pCond
->
startVersion
==
-
1
)
?
0
:
pCond
->
startVersion
;
int64_t
startVer
=
(
pCond
->
startVersion
==
-
1
)
?
0
:
pCond
->
startVersion
;
int64_t
endVer
=
0
;
int64_t
endVer
=
0
;
if
(
pCond
->
endVersion
==
if
(
pCond
->
endVersion
==
-
1
)
{
-
1
)
{
// user not specified end version, set current maximum version of vnode as the endVersion
// user not specified end version, set current maximum version of vnode as the endVersion
endVer
=
pVnode
->
state
.
applied
;
endVer
=
pVnode
->
state
.
applied
;
}
else
{
}
else
{
endVer
=
(
pCond
->
endVersion
>
pVnode
->
state
.
applied
)
?
pVnode
->
state
.
applied
:
pCond
->
endVersion
;
endVer
=
(
pCond
->
endVersion
>
pVnode
->
state
.
applied
)
?
pVnode
->
state
.
applied
:
pCond
->
endVersion
;
...
...
source/dnode/vnode/src/tsdb/tsdbUtil.c
浏览文件 @
f37f4088
...
@@ -1259,6 +1259,11 @@ void tBlockDataReset(SBlockData *pBlockData) {
...
@@ -1259,6 +1259,11 @@ void tBlockDataReset(SBlockData *pBlockData) {
pBlockData
->
suid
=
0
;
pBlockData
->
suid
=
0
;
pBlockData
->
uid
=
0
;
pBlockData
->
uid
=
0
;
pBlockData
->
nRow
=
0
;
pBlockData
->
nRow
=
0
;
for
(
int32_t
i
=
0
;
i
<
pBlockData
->
nColData
;
i
++
)
{
tColDataDestroy
(
&
pBlockData
->
aColData
[
i
]);
}
pBlockData
->
nColData
=
0
;
taosMemoryFreeClear
(
pBlockData
->
aColData
);
}
}
void
tBlockDataClear
(
SBlockData
*
pBlockData
)
{
void
tBlockDataClear
(
SBlockData
*
pBlockData
)
{
...
...
source/dnode/vnode/src/vnd/vnodeCommit.c
浏览文件 @
f37f4088
...
@@ -149,7 +149,7 @@ void vnodeUpdCommitSched(SVnode *pVnode) {
...
@@ -149,7 +149,7 @@ void vnodeUpdCommitSched(SVnode *pVnode) {
pVnode
->
commitSched
.
maxWaitMs
=
tsVndCommitMaxIntervalMs
+
(
randNum
%
tsVndCommitMaxIntervalMs
);
pVnode
->
commitSched
.
maxWaitMs
=
tsVndCommitMaxIntervalMs
+
(
randNum
%
tsVndCommitMaxIntervalMs
);
}
}
int
vnodeShouldCommit
(
SVnode
*
pVnode
)
{
int
vnodeShouldCommit
(
SVnode
*
pVnode
,
bool
atExit
)
{
SVCommitSched
*
pSched
=
&
pVnode
->
commitSched
;
SVCommitSched
*
pSched
=
&
pVnode
->
commitSched
;
int64_t
nowMs
=
taosGetMonoTimestampMs
();
int64_t
nowMs
=
taosGetMonoTimestampMs
();
bool
diskAvail
=
osDataSpaceAvailable
();
bool
diskAvail
=
osDataSpaceAvailable
();
...
@@ -158,7 +158,8 @@ int vnodeShouldCommit(SVnode *pVnode) {
...
@@ -158,7 +158,8 @@ int vnodeShouldCommit(SVnode *pVnode) {
taosThreadMutexLock
(
&
pVnode
->
mutex
);
taosThreadMutexLock
(
&
pVnode
->
mutex
);
if
(
pVnode
->
inUse
&&
diskAvail
)
{
if
(
pVnode
->
inUse
&&
diskAvail
)
{
needCommit
=
needCommit
=
((
pVnode
->
inUse
->
size
>
pVnode
->
inUse
->
node
.
size
)
&&
(
pSched
->
commitMs
+
SYNC_VND_COMMIT_MIN_MS
<
nowMs
));
((
pVnode
->
inUse
->
size
>
pVnode
->
inUse
->
node
.
size
)
&&
(
pSched
->
commitMs
+
SYNC_VND_COMMIT_MIN_MS
<
nowMs
))
||
((
pVnode
->
inUse
->
size
>
0
)
&&
atExit
);
}
}
taosThreadMutexUnlock
(
&
pVnode
->
mutex
);
taosThreadMutexUnlock
(
&
pVnode
->
mutex
);
return
needCommit
;
return
needCommit
;
...
...
source/dnode/vnode/src/vnd/vnodeSvr.c
浏览文件 @
f37f4088
...
@@ -400,7 +400,7 @@ int32_t vnodeProcessWriteMsg(SVnode *pVnode, SRpcMsg *pMsg, int64_t version, SRp
...
@@ -400,7 +400,7 @@ int32_t vnodeProcessWriteMsg(SVnode *pVnode, SRpcMsg *pMsg, int64_t version, SRp
}
}
break
;
break
;
case
TDMT_STREAM_TASK_DEPLOY
:
{
case
TDMT_STREAM_TASK_DEPLOY
:
{
if
(
tqProcessTaskDeployReq
(
pVnode
->
pTq
,
version
,
pReq
,
len
)
<
0
)
{
if
(
pVnode
->
restored
&&
tqProcessTaskDeployReq
(
pVnode
->
pTq
,
version
,
pReq
,
len
)
<
0
)
{
goto
_err
;
goto
_err
;
}
}
}
break
;
}
break
;
...
@@ -447,13 +447,11 @@ int32_t vnodeProcessWriteMsg(SVnode *pVnode, SRpcMsg *pMsg, int64_t version, SRp
...
@@ -447,13 +447,11 @@ int32_t vnodeProcessWriteMsg(SVnode *pVnode, SRpcMsg *pMsg, int64_t version, SRp
walApplyVer
(
pVnode
->
pWal
,
version
);
walApplyVer
(
pVnode
->
pWal
,
version
);
/*vInfo("vgId:%d, push msg begin", pVnode->config.vgId);*/
if
(
tqPushMsg
(
pVnode
->
pTq
,
pMsg
->
pCont
,
pMsg
->
contLen
,
pMsg
->
msgType
,
version
)
<
0
)
{
if
(
tqPushMsg
(
pVnode
->
pTq
,
pMsg
->
pCont
,
pMsg
->
contLen
,
pMsg
->
msgType
,
version
)
<
0
)
{
/*vInfo("vgId:%d, push msg end", pVnode->config.vgId);*/
/*vInfo("vgId:%d, push msg end", pVnode->config.vgId);*/
vError
(
"vgId:%d, failed to push msg to TQ since %s"
,
TD_VID
(
pVnode
),
tstrerror
(
terrno
));
vError
(
"vgId:%d, failed to push msg to TQ since %s"
,
TD_VID
(
pVnode
),
tstrerror
(
terrno
));
return
-
1
;
return
-
1
;
}
}
/*vInfo("vgId:%d, push msg end", pVnode->config.vgId);*/
// commit if need
// commit if need
if
(
needCommit
)
{
if
(
needCommit
)
{
...
@@ -541,13 +539,10 @@ int32_t vnodeProcessFetchMsg(SVnode *pVnode, SRpcMsg *pMsg, SQueueInfo *pInfo) {
...
@@ -541,13 +539,10 @@ int32_t vnodeProcessFetchMsg(SVnode *pVnode, SRpcMsg *pMsg, SQueueInfo *pInfo) {
return
vnodeGetBatchMeta
(
pVnode
,
pMsg
);
return
vnodeGetBatchMeta
(
pVnode
,
pMsg
);
case
TDMT_VND_TMQ_CONSUME
:
case
TDMT_VND_TMQ_CONSUME
:
return
tqProcessPollReq
(
pVnode
->
pTq
,
pMsg
);
return
tqProcessPollReq
(
pVnode
->
pTq
,
pMsg
);
case
TDMT_STREAM_TASK_RUN
:
case
TDMT_STREAM_TASK_RUN
:
return
tqProcessTaskRunReq
(
pVnode
->
pTq
,
pMsg
);
return
tqProcessTaskRunReq
(
pVnode
->
pTq
,
pMsg
);
#if 1
case
TDMT_STREAM_TASK_DISPATCH
:
case
TDMT_STREAM_TASK_DISPATCH
:
return
tqProcessTaskDispatchReq
(
pVnode
->
pTq
,
pMsg
,
true
);
return
tqProcessTaskDispatchReq
(
pVnode
->
pTq
,
pMsg
,
true
);
#endif
case
TDMT_STREAM_TASK_CHECK
:
case
TDMT_STREAM_TASK_CHECK
:
return
tqProcessStreamTaskCheckReq
(
pVnode
->
pTq
,
pMsg
);
return
tqProcessStreamTaskCheckReq
(
pVnode
->
pTq
,
pMsg
);
case
TDMT_STREAM_TASK_DISPATCH_RSP
:
case
TDMT_STREAM_TASK_DISPATCH_RSP
:
...
...
source/dnode/vnode/src/vnd/vnodeSync.c
浏览文件 @
f37f4088
...
@@ -129,8 +129,8 @@ static int32_t inline vnodeProposeMsg(SVnode *pVnode, SRpcMsg *pMsg, bool isWeak
...
@@ -129,8 +129,8 @@ static int32_t inline vnodeProposeMsg(SVnode *pVnode, SRpcMsg *pMsg, bool isWeak
return
code
;
return
code
;
}
}
void
vnodeProposeCommitOnNeed
(
SVnode
*
pVnode
)
{
void
vnodeProposeCommitOnNeed
(
SVnode
*
pVnode
,
bool
atExit
)
{
if
(
!
vnodeShouldCommit
(
pVnode
))
{
if
(
!
vnodeShouldCommit
(
pVnode
,
atExit
))
{
return
;
return
;
}
}
...
@@ -145,18 +145,20 @@ void vnodeProposeCommitOnNeed(SVnode *pVnode) {
...
@@ -145,18 +145,20 @@ void vnodeProposeCommitOnNeed(SVnode *pVnode) {
rpcMsg
.
pCont
=
pHead
;
rpcMsg
.
pCont
=
pHead
;
rpcMsg
.
info
.
noResp
=
1
;
rpcMsg
.
info
.
noResp
=
1
;
vInfo
(
"vgId:%d, propose vnode commit"
,
pVnode
->
config
.
vgId
);
bool
isWeak
=
false
;
bool
isWeak
=
false
;
if
(
vnodeProposeMsg
(
pVnode
,
&
rpcMsg
,
isWeak
)
<
0
)
{
vTrace
(
"vgId:%d, failed to propose vnode commit since %s"
,
pVnode
->
config
.
vgId
,
terrstr
());
goto
_out
;
}
vInfo
(
"vgId:%d, proposed vnode commit"
,
pVnode
->
config
.
vgId
);
if
(
!
atExit
)
{
if
(
vnodeProposeMsg
(
pVnode
,
&
rpcMsg
,
isWeak
)
<
0
)
{
vTrace
(
"vgId:%d, failed to propose vnode commit since %s"
,
pVnode
->
config
.
vgId
,
terrstr
());
}
rpcFreeCont
(
rpcMsg
.
pCont
);
rpcMsg
.
pCont
=
NULL
;
}
else
{
tmsgPutToQueue
(
&
pVnode
->
msgCb
,
WRITE_QUEUE
,
&
rpcMsg
);
}
_out:
vnodeUpdCommitSched
(
pVnode
);
vnodeUpdCommitSched
(
pVnode
);
rpcFreeCont
(
rpcMsg
.
pCont
);
rpcMsg
.
pCont
=
NULL
;
}
}
#if BATCH_ENABLE
#if BATCH_ENABLE
...
@@ -236,7 +238,8 @@ void vnodeProposeWriteMsg(SQueueInfo *pInfo, STaosQall *qall, int32_t numOfMsgs)
...
@@ -236,7 +238,8 @@ void vnodeProposeWriteMsg(SQueueInfo *pInfo, STaosQall *qall, int32_t numOfMsgs)
continue
;
continue
;
}
}
vnodeProposeCommitOnNeed
(
pVnode
);
bool
atExit
=
false
;
vnodeProposeCommitOnNeed
(
pVnode
,
atExit
);
code
=
vnodePreProcessWriteMsg
(
pVnode
,
pMsg
);
code
=
vnodePreProcessWriteMsg
(
pVnode
,
pMsg
);
if
(
code
!=
0
)
{
if
(
code
!=
0
)
{
...
@@ -288,7 +291,8 @@ void vnodeProposeWriteMsg(SQueueInfo *pInfo, STaosQall *qall, int32_t numOfMsgs)
...
@@ -288,7 +291,8 @@ void vnodeProposeWriteMsg(SQueueInfo *pInfo, STaosQall *qall, int32_t numOfMsgs)
continue
;
continue
;
}
}
vnodeProposeCommitOnNeed
(
pVnode
);
bool
atExit
=
false
;
vnodeProposeCommitOnNeed
(
pVnode
,
atExit
);
code
=
vnodePreProcessWriteMsg
(
pVnode
,
pMsg
);
code
=
vnodePreProcessWriteMsg
(
pVnode
,
pMsg
);
if
(
code
!=
0
)
{
if
(
code
!=
0
)
{
...
@@ -549,6 +553,9 @@ static void vnodeRestoreFinish(const SSyncFSM *pFsm, const SyncIndex commitIdx)
...
@@ -549,6 +553,9 @@ static void vnodeRestoreFinish(const SSyncFSM *pFsm, const SyncIndex commitIdx)
pVnode
->
restored
=
true
;
pVnode
->
restored
=
true
;
vInfo
(
"vgId:%d, sync restore finished"
,
pVnode
->
config
.
vgId
);
vInfo
(
"vgId:%d, sync restore finished"
,
pVnode
->
config
.
vgId
);
// start to restore all stream tasks
tqStartStreamTasks
(
pVnode
->
pTq
);
}
}
static
void
vnodeBecomeFollower
(
const
SSyncFSM
*
pFsm
)
{
static
void
vnodeBecomeFollower
(
const
SSyncFSM
*
pFsm
)
{
...
...
source/libs/executor/inc/executorimpl.h
浏览文件 @
f37f4088
...
@@ -127,14 +127,9 @@ enum {
...
@@ -127,14 +127,9 @@ enum {
};
};
typedef
struct
{
typedef
struct
{
// TODO remove prepareStatus
STqOffsetVal
currentOffset
;
// for tmq
// STqOffsetVal prepareStatus; // for tmq
SMqMetaRsp
metaRsp
;
// for tmq fetching meta
STqOffsetVal
currentOffset
;
// for tmq
int64_t
snapshotVer
;
SMqMetaRsp
metaRsp
;
// for tmq fetching meta
// int8_t returned;
int64_t
snapshotVer
;
// const SSubmitReq* pReq;
SPackedData
submit
;
SPackedData
submit
;
SSchemaWrapper
*
schema
;
SSchemaWrapper
*
schema
;
char
tbName
[
TSDB_TABLE_NAME_LEN
];
char
tbName
[
TSDB_TABLE_NAME_LEN
];
...
@@ -144,6 +139,8 @@ typedef struct {
...
@@ -144,6 +139,8 @@ typedef struct {
int64_t
fillHistoryVer1
;
int64_t
fillHistoryVer1
;
int64_t
fillHistoryVer2
;
int64_t
fillHistoryVer2
;
SStreamState
*
pState
;
SStreamState
*
pState
;
int64_t
dataVersion
;
int64_t
checkPointId
;
}
SStreamTaskInfo
;
}
SStreamTaskInfo
;
typedef
struct
{
typedef
struct
{
...
@@ -191,7 +188,6 @@ enum {
...
@@ -191,7 +188,6 @@ enum {
OP_OPENED
=
0x1
,
OP_OPENED
=
0x1
,
OP_RES_TO_RETURN
=
0x5
,
OP_RES_TO_RETURN
=
0x5
,
OP_EXEC_DONE
=
0x9
,
OP_EXEC_DONE
=
0x9
,
// OP_EXEC_RECV = 0x11,
};
};
typedef
struct
SOperatorFpSet
{
typedef
struct
SOperatorFpSet
{
...
@@ -560,6 +556,7 @@ typedef struct SStreamIntervalOperatorInfo {
...
@@ -560,6 +556,7 @@ typedef struct SStreamIntervalOperatorInfo {
uint64_t
numOfDatapack
;
uint64_t
numOfDatapack
;
SArray
*
pUpdated
;
SArray
*
pUpdated
;
SSHashObj
*
pUpdatedMap
;
SSHashObj
*
pUpdatedMap
;
int64_t
dataVersion
;
}
SStreamIntervalOperatorInfo
;
}
SStreamIntervalOperatorInfo
;
typedef
struct
SDataGroupInfo
{
typedef
struct
SDataGroupInfo
{
...
@@ -609,6 +606,7 @@ typedef struct SStreamSessionAggOperatorInfo {
...
@@ -609,6 +606,7 @@ typedef struct SStreamSessionAggOperatorInfo {
bool
ignoreExpiredDataSaved
;
bool
ignoreExpiredDataSaved
;
SArray
*
pUpdated
;
SArray
*
pUpdated
;
SSHashObj
*
pStUpdated
;
SSHashObj
*
pStUpdated
;
int64_t
dataVersion
;
}
SStreamSessionAggOperatorInfo
;
}
SStreamSessionAggOperatorInfo
;
typedef
struct
SStreamStateAggOperatorInfo
{
typedef
struct
SStreamStateAggOperatorInfo
{
...
@@ -627,6 +625,7 @@ typedef struct SStreamStateAggOperatorInfo {
...
@@ -627,6 +625,7 @@ typedef struct SStreamStateAggOperatorInfo {
bool
ignoreExpiredDataSaved
;
bool
ignoreExpiredDataSaved
;
SArray
*
pUpdated
;
SArray
*
pUpdated
;
SSHashObj
*
pSeUpdated
;
SSHashObj
*
pSeUpdated
;
int64_t
dataVersion
;
}
SStreamStateAggOperatorInfo
;
}
SStreamStateAggOperatorInfo
;
typedef
struct
SStreamPartitionOperatorInfo
{
typedef
struct
SStreamPartitionOperatorInfo
{
...
@@ -827,7 +826,7 @@ void setTaskKilled(SExecTaskInfo* pTaskInfo, int32_t rspCode);
...
@@ -827,7 +826,7 @@ void setTaskKilled(SExecTaskInfo* pTaskInfo, int32_t rspCode);
void
doDestroyTask
(
SExecTaskInfo
*
pTaskInfo
);
void
doDestroyTask
(
SExecTaskInfo
*
pTaskInfo
);
void
setTaskStatus
(
SExecTaskInfo
*
pTaskInfo
,
int8_t
status
);
void
setTaskStatus
(
SExecTaskInfo
*
pTaskInfo
,
int8_t
status
);
char
*
buildTaskId
(
uint64_t
taskId
,
uint64_t
queryId
);
void
buildTaskId
(
uint64_t
taskId
,
uint64_t
queryId
,
char
*
dst
);
SArray
*
getTableListInfo
(
const
SExecTaskInfo
*
pTaskInfo
);
SArray
*
getTableListInfo
(
const
SExecTaskInfo
*
pTaskInfo
);
...
...
source/libs/executor/src/executor.c
浏览文件 @
f37f4088
...
@@ -127,7 +127,7 @@ static int32_t doSetStreamBlock(SOperatorInfo* pOperator, void* input, size_t nu
...
@@ -127,7 +127,7 @@ static int32_t doSetStreamBlock(SOperatorInfo* pOperator, void* input, size_t nu
pOperator
->
status
=
OP_NOT_OPENED
;
pOperator
->
status
=
OP_NOT_OPENED
;
SStreamScanInfo
*
pInfo
=
pOperator
->
info
;
SStreamScanInfo
*
pInfo
=
pOperator
->
info
;
qDebug
(
"
task stream set total
blocks:%d %s"
,
(
int32_t
)
numOfBlocks
,
id
);
qDebug
(
"
s-task set source
blocks:%d %s"
,
(
int32_t
)
numOfBlocks
,
id
);
ASSERT
(
pInfo
->
validBlockIndex
==
0
&&
taosArrayGetSize
(
pInfo
->
pBlockLists
)
==
0
);
ASSERT
(
pInfo
->
validBlockIndex
==
0
&&
taosArrayGetSize
(
pInfo
->
pBlockLists
)
==
0
);
if
(
type
==
STREAM_INPUT__MERGED_SUBMIT
)
{
if
(
type
==
STREAM_INPUT__MERGED_SUBMIT
)
{
...
@@ -173,9 +173,7 @@ void doSetTaskId(SOperatorInfo* pOperator) {
...
@@ -173,9 +173,7 @@ void doSetTaskId(SOperatorInfo* pOperator) {
void
qSetTaskId
(
qTaskInfo_t
tinfo
,
uint64_t
taskId
,
uint64_t
queryId
)
{
void
qSetTaskId
(
qTaskInfo_t
tinfo
,
uint64_t
taskId
,
uint64_t
queryId
)
{
SExecTaskInfo
*
pTaskInfo
=
tinfo
;
SExecTaskInfo
*
pTaskInfo
=
tinfo
;
pTaskInfo
->
id
.
queryId
=
queryId
;
pTaskInfo
->
id
.
queryId
=
queryId
;
buildTaskId
(
taskId
,
queryId
,
pTaskInfo
->
id
.
str
);
taosMemoryFreeClear
(
pTaskInfo
->
id
.
str
);
pTaskInfo
->
id
.
str
=
buildTaskId
(
taskId
,
queryId
);
// set the idstr for tsdbReader
// set the idstr for tsdbReader
doSetTaskId
(
pTaskInfo
->
pRoot
);
doSetTaskId
(
pTaskInfo
->
pRoot
);
...
@@ -198,6 +196,13 @@ int32_t qSetStreamOpOpen(qTaskInfo_t tinfo) {
...
@@ -198,6 +196,13 @@ int32_t qSetStreamOpOpen(qTaskInfo_t tinfo) {
return
code
;
return
code
;
}
}
void
qGetCheckpointVersion
(
qTaskInfo_t
tinfo
,
int64_t
*
dataVer
,
int64_t
*
ckId
)
{
SExecTaskInfo
*
pTaskInfo
=
tinfo
;
*
dataVer
=
pTaskInfo
->
streamInfo
.
dataVersion
;
*
ckId
=
pTaskInfo
->
streamInfo
.
checkPointId
;
}
int32_t
qSetMultiStreamInput
(
qTaskInfo_t
tinfo
,
const
void
*
pBlocks
,
size_t
numOfBlocks
,
int32_t
type
)
{
int32_t
qSetMultiStreamInput
(
qTaskInfo_t
tinfo
,
const
void
*
pBlocks
,
size_t
numOfBlocks
,
int32_t
type
)
{
if
(
tinfo
==
NULL
)
{
if
(
tinfo
==
NULL
)
{
return
TSDB_CODE_APP_ERROR
;
return
TSDB_CODE_APP_ERROR
;
...
@@ -363,27 +368,23 @@ static SArray* filterUnqualifiedTables(const SStreamScanInfo* pScanInfo, const S
...
@@ -363,27 +368,23 @@ static SArray* filterUnqualifiedTables(const SStreamScanInfo* pScanInfo, const S
return
qa
;
return
qa
;
}
}
int32_t
qUpdate
QualifiedTableId
(
qTaskInfo_t
tinfo
,
const
SArray
*
tableIdList
,
bool
isAdd
)
{
int32_t
qUpdate
TableListForStreamScanner
(
qTaskInfo_t
tinfo
,
const
SArray
*
tableIdList
,
bool
isAdd
)
{
SExecTaskInfo
*
pTaskInfo
=
(
SExecTaskInfo
*
)
tinfo
;
SExecTaskInfo
*
pTaskInfo
=
(
SExecTaskInfo
*
)
tinfo
;
const
char
*
id
=
GET_TASKID
(
pTaskInfo
);
int32_t
code
=
0
;
if
(
isAdd
)
{
if
(
isAdd
)
{
qDebug
(
"add %d tables id into query list, %s"
,
(
int32_t
)
taosArrayGetSize
(
tableIdList
),
pTaskInfo
->
id
.
str
);
qDebug
(
"add %d tables id into query list, %s"
,
(
int32_t
)
taosArrayGetSize
(
tableIdList
),
id
);
}
}
// traverse to the stream scanner node to add this table id
// traverse to the stream scanner node to add this table id
SOperatorInfo
*
pInfo
=
pTaskInfo
->
pRoot
;
SOperatorInfo
*
pInfo
=
extractOperatorInTree
(
pTaskInfo
->
pRoot
,
QUERY_NODE_PHYSICAL_PLAN_STREAM_SCAN
,
id
);
while
(
pInfo
->
operatorType
!=
QUERY_NODE_PHYSICAL_PLAN_STREAM_SCAN
)
{
pInfo
=
pInfo
->
pDownstream
[
0
];
}
int32_t
code
=
0
;
SStreamScanInfo
*
pScanInfo
=
pInfo
->
info
;
SStreamScanInfo
*
pScanInfo
=
pInfo
->
info
;
if
(
isAdd
)
{
// add new table id
if
(
isAdd
)
{
// add new table id
SArray
*
qa
=
filterUnqualifiedTables
(
pScanInfo
,
tableIdList
,
GET_TASKID
(
pTaskInfo
));
SArray
*
qa
=
filterUnqualifiedTables
(
pScanInfo
,
tableIdList
,
GET_TASKID
(
pTaskInfo
));
int32_t
numOfQualifiedTables
=
taosArrayGetSize
(
qa
);
int32_t
numOfQualifiedTables
=
taosArrayGetSize
(
qa
);
qDebug
(
"%d qualified child tables added into stream scanner, %s"
,
numOfQualifiedTables
,
id
);
qDebug
(
" %d qualified child tables added into stream scanner"
,
numOfQualifiedTables
);
code
=
tqReaderAddTbUidList
(
pScanInfo
->
tqReader
,
qa
);
code
=
tqReaderAddTbUidList
(
pScanInfo
->
tqReader
,
qa
);
if
(
code
!=
TSDB_CODE_SUCCESS
)
{
if
(
code
!=
TSDB_CODE_SUCCESS
)
{
taosArrayDestroy
(
qa
);
taosArrayDestroy
(
qa
);
...
@@ -424,19 +425,6 @@ int32_t qUpdateQualifiedTableId(qTaskInfo_t tinfo, const SArray* tableIdList, bo
...
@@ -424,19 +425,6 @@ int32_t qUpdateQualifiedTableId(qTaskInfo_t tinfo, const SArray* tableIdList, bo
}
}
}
}
#if 0
bool exists = false;
for (int32_t k = 0; k < taosArrayGetSize(pListInfo->pTableList); ++k) {
STableKeyInfo* pKeyInfo = taosArrayGet(pListInfo->pTableList, k);
if (pKeyInfo->uid == keyInfo.uid) {
qWarn("ignore duplicated query table uid:%" PRIu64 " added, %s", pKeyInfo->uid, pTaskInfo->id.str);
exists = true;
}
}
if (!exists) {
#endif
tableListAddTableInfo
(
pTableListInfo
,
keyInfo
.
uid
,
keyInfo
.
groupId
);
tableListAddTableInfo
(
pTableListInfo
,
keyInfo
.
uid
,
keyInfo
.
groupId
);
}
}
...
@@ -447,7 +435,7 @@ int32_t qUpdateQualifiedTableId(qTaskInfo_t tinfo, const SArray* tableIdList, bo
...
@@ -447,7 +435,7 @@ 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, %s"
,
(
int32_t
)
taosArrayGetSize
(
tableIdList
),
id
);
taosWLockLatch
(
&
pTaskInfo
->
lock
);
taosWLockLatch
(
&
pTaskInfo
->
lock
);
code
=
tqReaderRemoveTbUidList
(
pScanInfo
->
tqReader
,
tableIdList
);
code
=
tqReaderRemoveTbUidList
(
pScanInfo
->
tqReader
,
tableIdList
);
taosWUnLockLatch
(
&
pTaskInfo
->
lock
);
taosWUnLockLatch
(
&
pTaskInfo
->
lock
);
...
@@ -1273,3 +1261,22 @@ void qProcessRspMsg(void* parent, SRpcMsg* pMsg, SEpSet* pEpSet) {
...
@@ -1273,3 +1261,22 @@ void qProcessRspMsg(void* parent, SRpcMsg* pMsg, SEpSet* pEpSet) {
rpcFreeCont
(
pMsg
->
pCont
);
rpcFreeCont
(
pMsg
->
pCont
);
destroySendMsgInfo
(
pSendInfo
);
destroySendMsgInfo
(
pSendInfo
);
}
}
SArray
*
qGetQueriedTableListInfo
(
qTaskInfo_t
tinfo
)
{
SExecTaskInfo
*
pTaskInfo
=
tinfo
;
SArray
*
plist
=
getTableListInfo
(
pTaskInfo
);
// only extract table in the first elements
STableListInfo
*
pTableListInfo
=
taosArrayGetP
(
plist
,
0
);
SArray
*
pUidList
=
taosArrayInit
(
10
,
sizeof
(
uint64_t
));
int32_t
numOfTables
=
tableListGetSize
(
pTableListInfo
);
for
(
int32_t
i
=
0
;
i
<
numOfTables
;
++
i
)
{
STableKeyInfo
*
pKeyInfo
=
tableListGetInfo
(
pTableListInfo
,
i
);
taosArrayPush
(
pUidList
,
&
pKeyInfo
->
uid
);
}
taosArrayDestroy
(
plist
);
return
pUidList
;
}
source/libs/executor/src/executorimpl.c
浏览文件 @
f37f4088
...
@@ -1151,8 +1151,8 @@ void cleanupExprSupp(SExprSupp* pSupp) {
...
@@ -1151,8 +1151,8 @@ void cleanupExprSupp(SExprSupp* pSupp) {
void
cleanupBasicInfo
(
SOptrBasicInfo
*
pInfo
)
{
pInfo
->
pRes
=
blockDataDestroy
(
pInfo
->
pRes
);
}
void
cleanupBasicInfo
(
SOptrBasicInfo
*
pInfo
)
{
pInfo
->
pRes
=
blockDataDestroy
(
pInfo
->
pRes
);
}
char
*
buildTaskId
(
uint64_t
taskId
,
uint64_t
queryId
)
{
void
buildTaskId
(
uint64_t
taskId
,
uint64_t
queryId
,
char
*
dst
)
{
char
*
p
=
taosMemoryMalloc
(
64
)
;
char
*
p
=
dst
;
int32_t
offset
=
6
;
int32_t
offset
=
6
;
memcpy
(
p
,
"TID:0x"
,
offset
);
memcpy
(
p
,
"TID:0x"
,
offset
);
...
@@ -1163,7 +1163,6 @@ char* buildTaskId(uint64_t taskId, uint64_t queryId) {
...
@@ -1163,7 +1163,6 @@ char* buildTaskId(uint64_t taskId, uint64_t queryId) {
offset
+=
tintToHex
(
queryId
,
&
p
[
offset
]);
offset
+=
tintToHex
(
queryId
,
&
p
[
offset
]);
p
[
offset
]
=
0
;
p
[
offset
]
=
0
;
return
p
;
}
}
SExecTaskInfo
*
doCreateExecTaskInfo
(
uint64_t
queryId
,
uint64_t
taskId
,
int32_t
vgId
,
EOPTR_EXEC_MODEL
model
,
SExecTaskInfo
*
doCreateExecTaskInfo
(
uint64_t
queryId
,
uint64_t
taskId
,
int32_t
vgId
,
EOPTR_EXEC_MODEL
model
,
...
@@ -1185,7 +1184,9 @@ SExecTaskInfo* doCreateExecTaskInfo(uint64_t queryId, uint64_t taskId, int32_t v
...
@@ -1185,7 +1184,9 @@ SExecTaskInfo* doCreateExecTaskInfo(uint64_t queryId, uint64_t taskId, int32_t v
taosInitRWLatch
(
&
pTaskInfo
->
lock
);
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
=
taosMemoryMalloc
(
64
);
buildTaskId
(
taskId
,
queryId
,
pTaskInfo
->
id
.
str
);
return
pTaskInfo
;
return
pTaskInfo
;
}
}
...
@@ -2008,7 +2009,11 @@ void qStreamCloseTsdbReader(void* task) {
...
@@ -2008,7 +2009,11 @@ void qStreamCloseTsdbReader(void* task) {
}
}
static
void
extractTableList
(
SArray
*
pList
,
const
SOperatorInfo
*
pOperator
)
{
static
void
extractTableList
(
SArray
*
pList
,
const
SOperatorInfo
*
pOperator
)
{
if
(
pOperator
->
operatorType
==
QUERY_NODE_PHYSICAL_PLAN_TABLE_SCAN
)
{
if
(
pOperator
->
operatorType
==
QUERY_NODE_PHYSICAL_PLAN_STREAM_SCAN
)
{
SStreamScanInfo
*
pScanInfo
=
pOperator
->
info
;
STableScanInfo
*
pTableScanInfo
=
pScanInfo
->
pTableScanOp
->
info
;
taosArrayPush
(
pList
,
&
pTableScanInfo
->
base
.
pTableListInfo
);
}
else
if
(
pOperator
->
operatorType
==
QUERY_NODE_PHYSICAL_PLAN_TABLE_SCAN
)
{
STableScanInfo
*
pScanInfo
=
pOperator
->
info
;
STableScanInfo
*
pScanInfo
=
pOperator
->
info
;
taosArrayPush
(
pList
,
&
pScanInfo
->
base
.
pTableListInfo
);
taosArrayPush
(
pList
,
&
pScanInfo
->
base
.
pTableListInfo
);
}
else
{
}
else
{
...
...
source/libs/executor/src/scanoperator.c
浏览文件 @
f37f4088
...
@@ -1637,7 +1637,7 @@ static SSDataBlock* doQueueScan(SOperatorInfo* pOperator) {
...
@@ -1637,7 +1637,7 @@ static SSDataBlock* doQueueScan(SOperatorInfo* pOperator) {
if
(
pTaskInfo
->
streamInfo
.
submit
.
msgStr
!=
NULL
)
{
if
(
pTaskInfo
->
streamInfo
.
submit
.
msgStr
!=
NULL
)
{
if
(
pInfo
->
tqReader
->
msg2
.
msgStr
==
NULL
)
{
if
(
pInfo
->
tqReader
->
msg2
.
msgStr
==
NULL
)
{
SPackedData
submit
=
pTaskInfo
->
streamInfo
.
submit
;
SPackedData
submit
=
pTaskInfo
->
streamInfo
.
submit
;
if
(
tqReaderSetSubmit
Req2
(
pInfo
->
tqReader
,
submit
.
msgStr
,
submit
.
msgLen
,
submit
.
ver
)
<
0
)
{
if
(
tqReaderSetSubmit
Msg
(
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"
,
submit
.
msgStr
);
return
NULL
;
return
NULL
;
}
}
...
@@ -1646,7 +1646,7 @@ static SSDataBlock* doQueueScan(SOperatorInfo* pOperator) {
...
@@ -1646,7 +1646,7 @@ static SSDataBlock* doQueueScan(SOperatorInfo* pOperator) {
blockDataCleanup
(
pInfo
->
pRes
);
blockDataCleanup
(
pInfo
->
pRes
);
SDataBlockInfo
*
pBlockInfo
=
&
pInfo
->
pRes
->
info
;
SDataBlockInfo
*
pBlockInfo
=
&
pInfo
->
pRes
->
info
;
while
(
tqNextDataBlock
2
(
pInfo
->
tqReader
))
{
while
(
tqNextDataBlock
(
pInfo
->
tqReader
))
{
SSDataBlock
block
=
{
0
};
SSDataBlock
block
=
{
0
};
int32_t
code
=
tqRetrieveDataBlock2
(
&
block
,
pInfo
->
tqReader
,
NULL
);
int32_t
code
=
tqRetrieveDataBlock2
(
&
block
,
pInfo
->
tqReader
,
NULL
);
...
@@ -1812,7 +1812,6 @@ static SSDataBlock* doStreamScan(SOperatorInfo* pOperator) {
...
@@ -1812,7 +1812,6 @@ static SSDataBlock* doStreamScan(SOperatorInfo* pOperator) {
/*resetTableScanInfo(pTSInfo, pWin);*/
/*resetTableScanInfo(pTSInfo, pWin);*/
tsdbReaderClose
(
pTSInfo
->
base
.
dataReader
);
tsdbReaderClose
(
pTSInfo
->
base
.
dataReader
);
qDebug
(
"4"
);
pTSInfo
->
base
.
dataReader
=
NULL
;
pTSInfo
->
base
.
dataReader
=
NULL
;
pInfo
->
pTableScanOp
->
status
=
OP_OPENED
;
pInfo
->
pTableScanOp
->
status
=
OP_OPENED
;
...
@@ -1895,7 +1894,6 @@ static SSDataBlock* doStreamScan(SOperatorInfo* pOperator) {
...
@@ -1895,7 +1894,6 @@ static SSDataBlock* doStreamScan(SOperatorInfo* pOperator) {
pTaskInfo
->
streamInfo
.
recoverStep
=
STREAM_RECOVER_STEP__NONE
;
pTaskInfo
->
streamInfo
.
recoverStep
=
STREAM_RECOVER_STEP__NONE
;
STableScanInfo
*
pTSInfo
=
pInfo
->
pTableScanOp
->
info
;
STableScanInfo
*
pTSInfo
=
pInfo
->
pTableScanOp
->
info
;
tsdbReaderClose
(
pTSInfo
->
base
.
dataReader
);
tsdbReaderClose
(
pTSInfo
->
base
.
dataReader
);
qDebug
(
"5"
);
pTSInfo
->
base
.
dataReader
=
NULL
;
pTSInfo
->
base
.
dataReader
=
NULL
;
...
@@ -1922,6 +1920,7 @@ FETCH_NEXT_BLOCK:
...
@@ -1922,6 +1920,7 @@ FETCH_NEXT_BLOCK:
if
(
pBlock
->
info
.
parTbName
[
0
])
{
if
(
pBlock
->
info
.
parTbName
[
0
])
{
streamStatePutParName
(
pTaskInfo
->
streamInfo
.
pState
,
pBlock
->
info
.
id
.
groupId
,
pBlock
->
info
.
parTbName
);
streamStatePutParName
(
pTaskInfo
->
streamInfo
.
pState
,
pBlock
->
info
.
id
.
groupId
,
pBlock
->
info
.
parTbName
);
}
}
// TODO move into scan
// TODO move into scan
pBlock
->
info
.
calWin
.
skey
=
INT64_MIN
;
pBlock
->
info
.
calWin
.
skey
=
INT64_MIN
;
pBlock
->
info
.
calWin
.
ekey
=
INT64_MAX
;
pBlock
->
info
.
calWin
.
ekey
=
INT64_MAX
;
...
@@ -2064,7 +2063,7 @@ FETCH_NEXT_BLOCK:
...
@@ -2064,7 +2063,7 @@ FETCH_NEXT_BLOCK:
int32_t
current
=
pInfo
->
validBlockIndex
++
;
int32_t
current
=
pInfo
->
validBlockIndex
++
;
SPackedData
*
pSubmit
=
taosArrayGet
(
pInfo
->
pBlockLists
,
current
);
SPackedData
*
pSubmit
=
taosArrayGet
(
pInfo
->
pBlockLists
,
current
);
if
(
tqReaderSetSubmit
Req2
(
pInfo
->
tqReader
,
pSubmit
->
msgStr
,
pSubmit
->
msgLen
,
pSubmit
->
ver
)
<
0
)
{
if
(
tqReaderSetSubmit
Msg
(
pInfo
->
tqReader
,
pSubmit
->
msgStr
,
pSubmit
->
msgLen
,
pSubmit
->
ver
)
<
0
)
{
qError
(
"submit msg messed up when initing stream submit block %p, current %d, total %d"
,
pSubmit
,
current
,
qError
(
"submit msg messed up when initing stream submit block %p, current %d, total %d"
,
pSubmit
,
current
,
totBlockNum
);
totBlockNum
);
continue
;
continue
;
...
@@ -2073,7 +2072,7 @@ FETCH_NEXT_BLOCK:
...
@@ -2073,7 +2072,7 @@ FETCH_NEXT_BLOCK:
blockDataCleanup
(
pInfo
->
pRes
);
blockDataCleanup
(
pInfo
->
pRes
);
while
(
tqNextDataBlock
2
(
pInfo
->
tqReader
))
{
while
(
tqNextDataBlock
(
pInfo
->
tqReader
))
{
SSDataBlock
block
=
{
0
};
SSDataBlock
block
=
{
0
};
int32_t
code
=
tqRetrieveDataBlock2
(
&
block
,
pInfo
->
tqReader
,
NULL
);
int32_t
code
=
tqRetrieveDataBlock2
(
&
block
,
pInfo
->
tqReader
,
NULL
);
...
...
source/libs/executor/src/timewindowoperator.c
浏览文件 @
f37f4088
...
@@ -2333,9 +2333,15 @@ static int32_t getNextQualifiedFinalWindow(SInterval* pInterval, STimeWindow* pN
...
@@ -2333,9 +2333,15 @@ static int32_t getNextQualifiedFinalWindow(SInterval* pInterval, STimeWindow* pN
return
startPos
;
return
startPos
;
}
}
static
void
setStreamDataVersion
(
SExecTaskInfo
*
pTaskInfo
,
int64_t
version
,
int64_t
ckId
)
{
pTaskInfo
->
streamInfo
.
dataVersion
=
version
;
pTaskInfo
->
streamInfo
.
checkPointId
=
ckId
;
}
static
void
doStreamIntervalAggImpl
(
SOperatorInfo
*
pOperatorInfo
,
SSDataBlock
*
pSDataBlock
,
uint64_t
groupId
,
static
void
doStreamIntervalAggImpl
(
SOperatorInfo
*
pOperatorInfo
,
SSDataBlock
*
pSDataBlock
,
uint64_t
groupId
,
SSHashObj
*
pUpdatedMap
)
{
SSHashObj
*
pUpdatedMap
)
{
SStreamIntervalOperatorInfo
*
pInfo
=
(
SStreamIntervalOperatorInfo
*
)
pOperatorInfo
->
info
;
SStreamIntervalOperatorInfo
*
pInfo
=
(
SStreamIntervalOperatorInfo
*
)
pOperatorInfo
->
info
;
pInfo
->
dataVersion
=
TMAX
(
pInfo
->
dataVersion
,
pSDataBlock
->
info
.
version
);
SResultRowInfo
*
pResultRowInfo
=
&
(
pInfo
->
binfo
.
resultRowInfo
);
SResultRowInfo
*
pResultRowInfo
=
&
(
pInfo
->
binfo
.
resultRowInfo
);
SExecTaskInfo
*
pTaskInfo
=
pOperatorInfo
->
pTaskInfo
;
SExecTaskInfo
*
pTaskInfo
=
pOperatorInfo
->
pTaskInfo
;
...
@@ -2432,10 +2438,8 @@ static void doStreamIntervalAggImpl(SOperatorInfo* pOperatorInfo, SSDataBlock* p
...
@@ -2432,10 +2438,8 @@ static void doStreamIntervalAggImpl(SOperatorInfo* pOperatorInfo, SSDataBlock* p
updateTimeWindowInfo
(
&
pInfo
->
twAggSup
.
timeWindowData
,
&
nextWin
,
true
);
updateTimeWindowInfo
(
&
pInfo
->
twAggSup
.
timeWindowData
,
&
nextWin
,
true
);
applyAggFunctionOnPartialTuples
(
pTaskInfo
,
pSup
->
pCtx
,
&
pInfo
->
twAggSup
.
timeWindowData
,
startPos
,
forwardRows
,
applyAggFunctionOnPartialTuples
(
pTaskInfo
,
pSup
->
pCtx
,
&
pInfo
->
twAggSup
.
timeWindowData
,
startPos
,
forwardRows
,
pSDataBlock
->
info
.
rows
,
numOfOutput
);
pSDataBlock
->
info
.
rows
,
numOfOutput
);
SWinKey
key
=
{
.
ts
=
nextWin
.
skey
,
SWinKey
key
=
{
.
ts
=
nextWin
.
skey
,
.
groupId
=
groupId
};
.
groupId
=
groupId
,
};
saveOutputBuf
(
pInfo
->
pState
,
&
key
,
pResult
,
pInfo
->
aggSup
.
resultRowSize
);
saveOutputBuf
(
pInfo
->
pState
,
&
key
,
pResult
,
pInfo
->
aggSup
.
resultRowSize
);
releaseOutputBuf
(
pInfo
->
pState
,
&
key
,
pResult
);
releaseOutputBuf
(
pInfo
->
pState
,
&
key
,
pResult
);
if
(
pInfo
->
delKey
.
ts
>
key
.
ts
)
{
if
(
pInfo
->
delKey
.
ts
>
key
.
ts
)
{
...
@@ -2503,6 +2507,7 @@ static SSDataBlock* doStreamFinalIntervalAgg(SOperatorInfo* pOperator) {
...
@@ -2503,6 +2507,7 @@ static SSDataBlock* doStreamFinalIntervalAgg(SOperatorInfo* pOperator) {
clearFunctionContext
(
&
pOperator
->
exprSupp
);
clearFunctionContext
(
&
pOperator
->
exprSupp
);
// semi interval operator clear disk buffer
// semi interval operator clear disk buffer
clearStreamIntervalOperator
(
pInfo
);
clearStreamIntervalOperator
(
pInfo
);
setStreamDataVersion
(
pTaskInfo
,
pInfo
->
dataVersion
,
pInfo
->
pState
->
checkPointId
);
qDebug
(
"===stream===clear semi operator"
);
qDebug
(
"===stream===clear semi operator"
);
}
else
{
}
else
{
deleteIntervalDiscBuf
(
pInfo
->
pState
,
pInfo
->
pPullDataMap
,
pInfo
->
twAggSup
.
maxTs
-
pInfo
->
twAggSup
.
deleteMark
,
deleteIntervalDiscBuf
(
pInfo
->
pState
,
pInfo
->
pPullDataMap
,
pInfo
->
twAggSup
.
maxTs
-
pInfo
->
twAggSup
.
deleteMark
,
...
@@ -2776,6 +2781,7 @@ SOperatorInfo* createStreamFinalIntervalOperatorInfo(SOperatorInfo* downstream,
...
@@ -2776,6 +2781,7 @@ SOperatorInfo* createStreamFinalIntervalOperatorInfo(SOperatorInfo* downstream,
pInfo
->
numOfDatapack
=
0
;
pInfo
->
numOfDatapack
=
0
;
pInfo
->
pUpdated
=
NULL
;
pInfo
->
pUpdated
=
NULL
;
pInfo
->
pUpdatedMap
=
NULL
;
pInfo
->
pUpdatedMap
=
NULL
;
pInfo
->
dataVersion
=
0
;
pOperator
->
operatorType
=
pPhyNode
->
type
;
pOperator
->
operatorType
=
pPhyNode
->
type
;
pOperator
->
blocking
=
true
;
pOperator
->
blocking
=
true
;
...
@@ -3126,6 +3132,8 @@ static void doStreamSessionAggImpl(SOperatorInfo* pOperator, SSDataBlock* pSData
...
@@ -3126,6 +3132,8 @@ static void doStreamSessionAggImpl(SOperatorInfo* pOperator, SSDataBlock* pSData
int32_t
rows
=
pSDataBlock
->
info
.
rows
;
int32_t
rows
=
pSDataBlock
->
info
.
rows
;
int32_t
winRows
=
0
;
int32_t
winRows
=
0
;
pInfo
->
dataVersion
=
TMAX
(
pInfo
->
dataVersion
,
pSDataBlock
->
info
.
version
);
SColumnInfoData
*
pStartTsCol
=
taosArrayGet
(
pSDataBlock
->
pDataBlock
,
pInfo
->
primaryTsIndex
);
SColumnInfoData
*
pStartTsCol
=
taosArrayGet
(
pSDataBlock
->
pDataBlock
,
pInfo
->
primaryTsIndex
);
TSKEY
*
startTsCols
=
(
int64_t
*
)
pStartTsCol
->
pData
;
TSKEY
*
startTsCols
=
(
int64_t
*
)
pStartTsCol
->
pData
;
SColumnInfoData
*
pEndTsCol
=
NULL
;
SColumnInfoData
*
pEndTsCol
=
NULL
;
...
@@ -3589,6 +3597,7 @@ SOperatorInfo* createStreamSessionAggOperatorInfo(SOperatorInfo* downstream, SPh
...
@@ -3589,6 +3597,7 @@ SOperatorInfo* createStreamSessionAggOperatorInfo(SOperatorInfo* downstream, SPh
pInfo
->
ignoreExpiredDataSaved
=
false
;
pInfo
->
ignoreExpiredDataSaved
=
false
;
pInfo
->
pUpdated
=
NULL
;
pInfo
->
pUpdated
=
NULL
;
pInfo
->
pStUpdated
=
NULL
;
pInfo
->
pStUpdated
=
NULL
;
pInfo
->
dataVersion
=
0
;
setOperatorInfo
(
pOperator
,
"StreamSessionWindowAggOperator"
,
QUERY_NODE_PHYSICAL_PLAN_STREAM_SESSION
,
true
,
setOperatorInfo
(
pOperator
,
"StreamSessionWindowAggOperator"
,
QUERY_NODE_PHYSICAL_PLAN_STREAM_SESSION
,
true
,
OP_NOT_OPENED
,
pInfo
,
pTaskInfo
);
OP_NOT_OPENED
,
pInfo
,
pTaskInfo
);
...
@@ -3899,6 +3908,9 @@ static void doStreamStateAggImpl(SOperatorInfo* pOperator, SSDataBlock* pSDataBl
...
@@ -3899,6 +3908,9 @@ static void doStreamStateAggImpl(SOperatorInfo* pOperator, SSDataBlock* pSDataBl
TSKEY
*
tsCols
=
NULL
;
TSKEY
*
tsCols
=
NULL
;
SResultRow
*
pResult
=
NULL
;
SResultRow
*
pResult
=
NULL
;
int32_t
winRows
=
0
;
int32_t
winRows
=
0
;
pInfo
->
dataVersion
=
TMAX
(
pInfo
->
dataVersion
,
pSDataBlock
->
info
.
version
);
if
(
pSDataBlock
->
pDataBlock
!=
NULL
)
{
if
(
pSDataBlock
->
pDataBlock
!=
NULL
)
{
SColumnInfoData
*
pColDataInfo
=
taosArrayGet
(
pSDataBlock
->
pDataBlock
,
pInfo
->
primaryTsIndex
);
SColumnInfoData
*
pColDataInfo
=
taosArrayGet
(
pSDataBlock
->
pDataBlock
,
pInfo
->
primaryTsIndex
);
tsCols
=
(
int64_t
*
)
pColDataInfo
->
pData
;
tsCols
=
(
int64_t
*
)
pColDataInfo
->
pData
;
...
@@ -4115,6 +4127,7 @@ SOperatorInfo* createStreamStateAggOperatorInfo(SOperatorInfo* downstream, SPhys
...
@@ -4115,6 +4127,7 @@ SOperatorInfo* createStreamStateAggOperatorInfo(SOperatorInfo* downstream, SPhys
pInfo
->
ignoreExpiredDataSaved
=
false
;
pInfo
->
ignoreExpiredDataSaved
=
false
;
pInfo
->
pUpdated
=
NULL
;
pInfo
->
pUpdated
=
NULL
;
pInfo
->
pSeUpdated
=
NULL
;
pInfo
->
pSeUpdated
=
NULL
;
pInfo
->
dataVersion
=
0
;
setOperatorInfo
(
pOperator
,
"StreamStateAggOperator"
,
QUERY_NODE_PHYSICAL_PLAN_STREAM_STATE
,
true
,
OP_NOT_OPENED
,
setOperatorInfo
(
pOperator
,
"StreamStateAggOperator"
,
QUERY_NODE_PHYSICAL_PLAN_STREAM_STATE
,
true
,
OP_NOT_OPENED
,
pInfo
,
pTaskInfo
);
pInfo
,
pTaskInfo
);
...
@@ -4750,6 +4763,7 @@ static SSDataBlock* doStreamIntervalAgg(SOperatorInfo* pOperator) {
...
@@ -4750,6 +4763,7 @@ static SSDataBlock* doStreamIntervalAgg(SOperatorInfo* pOperator) {
&
pInfo
->
delKey
);
&
pInfo
->
delKey
);
setOperatorCompleted
(
pOperator
);
setOperatorCompleted
(
pOperator
);
streamStateCommit
(
pTaskInfo
->
streamInfo
.
pState
);
streamStateCommit
(
pTaskInfo
->
streamInfo
.
pState
);
setStreamDataVersion
(
pTaskInfo
,
pInfo
->
dataVersion
,
pInfo
->
pState
->
checkPointId
);
return
NULL
;
return
NULL
;
}
}
...
@@ -4771,6 +4785,7 @@ static SSDataBlock* doStreamIntervalAgg(SOperatorInfo* pOperator) {
...
@@ -4771,6 +4785,7 @@ static SSDataBlock* doStreamIntervalAgg(SOperatorInfo* pOperator) {
pInfo
->
numOfDatapack
=
0
;
pInfo
->
numOfDatapack
=
0
;
break
;
break
;
}
}
pInfo
->
numOfDatapack
++
;
pInfo
->
numOfDatapack
++
;
printDataBlock
(
pBlock
,
"single interval recv"
);
printDataBlock
(
pBlock
,
"single interval recv"
);
...
...
source/libs/function/src/builtinsimpl.c
浏览文件 @
f37f4088
...
@@ -3353,7 +3353,7 @@ int32_t spreadFunction(SqlFunctionCtx* pCtx) {
...
@@ -3353,7 +3353,7 @@ int32_t spreadFunction(SqlFunctionCtx* pCtx) {
goto
_spread_over
;
goto
_spread_over
;
}
}
double
tmin
=
0
.
0
,
tmax
=
0
.
0
;
double
tmin
=
0
.
0
,
tmax
=
0
.
0
;
if
(
IS_SIGNED_NUMERIC_TYPE
(
type
))
{
if
(
IS_SIGNED_NUMERIC_TYPE
(
type
)
||
IS_TIMESTAMP_TYPE
(
type
)
)
{
tmin
=
(
double
)
GET_INT64_VAL
(
&
pAgg
->
min
);
tmin
=
(
double
)
GET_INT64_VAL
(
&
pAgg
->
min
);
tmax
=
(
double
)
GET_INT64_VAL
(
&
pAgg
->
max
);
tmax
=
(
double
)
GET_INT64_VAL
(
&
pAgg
->
max
);
}
else
if
(
IS_FLOAT_TYPE
(
type
))
{
}
else
if
(
IS_FLOAT_TYPE
(
type
))
{
...
...
source/libs/function/src/functionMgt.c
浏览文件 @
f37f4088
...
@@ -174,6 +174,8 @@ bool fmIsSelectFunc(int32_t funcId) { return isSpecificClassifyFunc(funcId, FUNC
...
@@ -174,6 +174,8 @@ bool fmIsSelectFunc(int32_t funcId) { return isSpecificClassifyFunc(funcId, FUNC
bool
fmIsTimelineFunc
(
int32_t
funcId
)
{
return
isSpecificClassifyFunc
(
funcId
,
FUNC_MGT_TIMELINE_FUNC
);
}
bool
fmIsTimelineFunc
(
int32_t
funcId
)
{
return
isSpecificClassifyFunc
(
funcId
,
FUNC_MGT_TIMELINE_FUNC
);
}
bool
fmIsDateTimeFunc
(
int32_t
funcId
)
{
return
isSpecificClassifyFunc
(
funcId
,
FUNC_MGT_DATETIME_FUNC
);
}
bool
fmIsPseudoColumnFunc
(
int32_t
funcId
)
{
return
isSpecificClassifyFunc
(
funcId
,
FUNC_MGT_PSEUDO_COLUMN_FUNC
);
}
bool
fmIsPseudoColumnFunc
(
int32_t
funcId
)
{
return
isSpecificClassifyFunc
(
funcId
,
FUNC_MGT_PSEUDO_COLUMN_FUNC
);
}
bool
fmIsScanPseudoColumnFunc
(
int32_t
funcId
)
{
return
isSpecificClassifyFunc
(
funcId
,
FUNC_MGT_SCAN_PC_FUNC
);
}
bool
fmIsScanPseudoColumnFunc
(
int32_t
funcId
)
{
return
isSpecificClassifyFunc
(
funcId
,
FUNC_MGT_SCAN_PC_FUNC
);
}
...
@@ -184,6 +186,7 @@ bool fmIsWindowClauseFunc(int32_t funcId) { return fmIsAggFunc(funcId) || fmIsWi
...
@@ -184,6 +186,7 @@ bool fmIsWindowClauseFunc(int32_t funcId) { return fmIsAggFunc(funcId) || fmIsWi
bool
fmIsIndefiniteRowsFunc
(
int32_t
funcId
)
{
return
isSpecificClassifyFunc
(
funcId
,
FUNC_MGT_INDEFINITE_ROWS_FUNC
);
}
bool
fmIsIndefiniteRowsFunc
(
int32_t
funcId
)
{
return
isSpecificClassifyFunc
(
funcId
,
FUNC_MGT_INDEFINITE_ROWS_FUNC
);
}
bool
fmIsSpecialDataRequiredFunc
(
int32_t
funcId
)
{
bool
fmIsSpecialDataRequiredFunc
(
int32_t
funcId
)
{
return
isSpecificClassifyFunc
(
funcId
,
FUNC_MGT_SPECIAL_DATA_REQUIRED
);
return
isSpecificClassifyFunc
(
funcId
,
FUNC_MGT_SPECIAL_DATA_REQUIRED
);
}
}
...
...
source/libs/nodes/src/nodesEqualFuncs.c
浏览文件 @
f37f4088
...
@@ -136,6 +136,7 @@ static bool logicConditionNodeEqual(const SLogicConditionNode* a, const SLogicCo
...
@@ -136,6 +136,7 @@ static bool logicConditionNodeEqual(const SLogicConditionNode* a, const SLogicCo
static
bool
functionNodeEqual
(
const
SFunctionNode
*
a
,
const
SFunctionNode
*
b
)
{
static
bool
functionNodeEqual
(
const
SFunctionNode
*
a
,
const
SFunctionNode
*
b
)
{
COMPARE_SCALAR_FIELD
(
funcId
);
COMPARE_SCALAR_FIELD
(
funcId
);
COMPARE_STRING_FIELD
(
functionName
);
COMPARE_NODE_LIST_FIELD
(
pParameterList
);
COMPARE_NODE_LIST_FIELD
(
pParameterList
);
return
true
;
return
true
;
}
}
...
...
source/libs/parser/src/parTranslater.c
浏览文件 @
f37f4088
...
@@ -1569,6 +1569,21 @@ static int32_t translateTimelineFunc(STranslateContext* pCxt, SFunctionNode* pFu
...
@@ -1569,6 +1569,21 @@ static int32_t translateTimelineFunc(STranslateContext* pCxt, SFunctionNode* pFu
return
TSDB_CODE_SUCCESS
;
return
TSDB_CODE_SUCCESS
;
}
}
static
int32_t
translateDateTimeFunc
(
STranslateContext
*
pCxt
,
SFunctionNode
*
pFunc
)
{
if
(
!
fmIsDateTimeFunc
(
pFunc
->
funcId
))
{
return
TSDB_CODE_SUCCESS
;
}
if
(
!
isSelectStmt
(
pCxt
->
pCurrStmt
))
{
return
TSDB_CODE_SUCCESS
;
}
SSelectStmt
*
pSelect
=
(
SSelectStmt
*
)
pCxt
->
pCurrStmt
;
pFunc
->
node
.
resType
.
precision
=
pSelect
->
precision
;
return
TSDB_CODE_SUCCESS
;
}
static
bool
hasFillClause
(
SNode
*
pCurrStmt
)
{
static
bool
hasFillClause
(
SNode
*
pCurrStmt
)
{
if
(
!
isSelectStmt
(
pCurrStmt
))
{
if
(
!
isSelectStmt
(
pCurrStmt
))
{
return
false
;
return
false
;
...
@@ -1708,6 +1723,7 @@ static void setFuncClassification(SNode* pCurrStmt, SFunctionNode* pFunc) {
...
@@ -1708,6 +1723,7 @@ static void setFuncClassification(SNode* pCurrStmt, SFunctionNode* pFunc) {
SSelectStmt
*
pSelect
=
(
SSelectStmt
*
)
pCurrStmt
;
SSelectStmt
*
pSelect
=
(
SSelectStmt
*
)
pCurrStmt
;
pSelect
->
hasAggFuncs
=
pSelect
->
hasAggFuncs
?
true
:
fmIsAggFunc
(
pFunc
->
funcId
);
pSelect
->
hasAggFuncs
=
pSelect
->
hasAggFuncs
?
true
:
fmIsAggFunc
(
pFunc
->
funcId
);
pSelect
->
hasRepeatScanFuncs
=
pSelect
->
hasRepeatScanFuncs
?
true
:
fmIsRepeatScanFunc
(
pFunc
->
funcId
);
pSelect
->
hasRepeatScanFuncs
=
pSelect
->
hasRepeatScanFuncs
?
true
:
fmIsRepeatScanFunc
(
pFunc
->
funcId
);
if
(
fmIsIndefiniteRowsFunc
(
pFunc
->
funcId
))
{
if
(
fmIsIndefiniteRowsFunc
(
pFunc
->
funcId
))
{
pSelect
->
hasIndefiniteRowsFunc
=
true
;
pSelect
->
hasIndefiniteRowsFunc
=
true
;
pSelect
->
returnRows
=
fmGetFuncReturnRows
(
pFunc
);
pSelect
->
returnRows
=
fmGetFuncReturnRows
(
pFunc
);
...
@@ -1856,6 +1872,9 @@ static int32_t translateNormalFunction(STranslateContext* pCxt, SFunctionNode* p
...
@@ -1856,6 +1872,9 @@ static int32_t translateNormalFunction(STranslateContext* pCxt, SFunctionNode* p
if
(
TSDB_CODE_SUCCESS
==
code
)
{
if
(
TSDB_CODE_SUCCESS
==
code
)
{
code
=
translateTimelineFunc
(
pCxt
,
pFunc
);
code
=
translateTimelineFunc
(
pCxt
,
pFunc
);
}
}
if
(
TSDB_CODE_SUCCESS
==
code
)
{
code
=
translateDateTimeFunc
(
pCxt
,
pFunc
);
}
if
(
TSDB_CODE_SUCCESS
==
code
)
{
if
(
TSDB_CODE_SUCCESS
==
code
)
{
code
=
translateBlockDistFunc
(
pCxt
,
pFunc
);
code
=
translateBlockDistFunc
(
pCxt
,
pFunc
);
}
}
...
@@ -5179,26 +5198,32 @@ static int32_t checkAlterSuperTableBySchema(STranslateContext* pCxt, SAlterTable
...
@@ -5179,26 +5198,32 @@ static int32_t checkAlterSuperTableBySchema(STranslateContext* pCxt, SAlterTable
return
generateSyntaxErrMsg
(
&
pCxt
->
msgBuf
,
TSDB_CODE_PAR_ONLY_ONE_JSON_TAG
);
return
generateSyntaxErrMsg
(
&
pCxt
->
msgBuf
,
TSDB_CODE_PAR_ONLY_ONE_JSON_TAG
);
}
}
if
(
getNumOfTags
(
pTableMeta
)
==
1
&&
pStmt
->
alterType
==
TSDB_ALTER_TABLE_DROP_TAG
)
{
return
generateSyntaxErrMsgExt
(
&
pCxt
->
msgBuf
,
TSDB_CODE_PAR_INVALID_ALTER_TABLE
,
"the only tag cannot be dropped"
);
}
int32_t
tagsLen
=
0
;
int32_t
tagsLen
=
0
;
for
(
int32_t
i
=
0
;
i
<
pTableMeta
->
tableInfo
.
numOfTags
;
++
i
)
{
for
(
int32_t
i
=
0
;
i
<
pTableMeta
->
tableInfo
.
numOfTags
;
++
i
)
{
tagsLen
+=
pTagsSchema
[
i
].
bytes
;
tagsLen
+=
pTagsSchema
[
i
].
bytes
;
}
}
if
(
TSDB_ALTER_TABLE_UPDATE_COLUMN_BYTES
==
pStmt
->
alterType
||
if
(
TSDB_ALTER_TABLE_UPDATE_COLUMN_BYTES
==
pStmt
->
alterType
||
TSDB_ALTER_TABLE_UPDATE_TAG_BYTES
==
pStmt
->
alterType
)
{
TSDB_ALTER_TABLE_UPDATE_TAG_BYTES
==
pStmt
->
alterType
||
TSDB_ALTER_TABLE_DROP_COLUMN
==
pStmt
->
alterType
||
TSDB_ALTER_TABLE_DROP_TAG
==
pStmt
->
alterType
)
{
if
(
TSDB_SUPER_TABLE
!=
pTableMeta
->
tableType
)
{
if
(
TSDB_SUPER_TABLE
!=
pTableMeta
->
tableType
)
{
return
generateSyntaxErrMsgExt
(
&
pCxt
->
msgBuf
,
TSDB_CODE_PAR_INVALID_ALTER_TABLE
,
"Table is not super table"
);
return
generateSyntaxErrMsgExt
(
&
pCxt
->
msgBuf
,
TSDB_CODE_PAR_INVALID_ALTER_TABLE
,
"Table is not super table"
);
}
}
const
SSchema
*
pSchema
=
getColSchema
(
pTableMeta
,
pStmt
->
colName
);
const
SSchema
*
pSchema
=
getColSchema
(
pTableMeta
,
pStmt
->
colName
);
if
(
NULL
==
pSchema
)
{
if
(
NULL
==
pSchema
)
{
return
generateSyntaxErrMsg
(
&
pCxt
->
msgBuf
,
TSDB_CODE_PAR_INVALID_COLUMN
,
pStmt
->
colName
);
return
generateSyntaxErrMsg
(
}
else
if
(
!
IS_VAR_DATA_TYPE
(
pSchema
->
type
)
||
pSchema
->
type
!=
pStmt
->
dataType
.
type
||
&
pCxt
->
msgBuf
,
pSchema
->
bytes
>=
calcTypeBytes
(
pStmt
->
dataType
))
{
(
TSDB_ALTER_TABLE_UPDATE_COLUMN_BYTES
==
pStmt
->
alterType
||
TSDB_ALTER_TABLE_DROP_COLUMN
==
pStmt
->
alterType
)
?
TSDB_CODE_PAR_INVALID_COLUMN
:
TSDB_CODE_PAR_INVALID_TAG_NAME
,
pStmt
->
colName
);
}
if
((
TSDB_ALTER_TABLE_UPDATE_COLUMN_BYTES
==
pStmt
->
alterType
||
TSDB_ALTER_TABLE_UPDATE_TAG_BYTES
==
pStmt
->
alterType
)
&&
(
!
IS_VAR_DATA_TYPE
(
pSchema
->
type
)
||
pSchema
->
type
!=
pStmt
->
dataType
.
type
||
pSchema
->
bytes
>=
calcTypeBytes
(
pStmt
->
dataType
)))
{
return
generateSyntaxErrMsg
(
&
pCxt
->
msgBuf
,
TSDB_CODE_PAR_INVALID_MODIFY_COL
);
return
generateSyntaxErrMsg
(
&
pCxt
->
msgBuf
,
TSDB_CODE_PAR_INVALID_MODIFY_COL
);
}
}
...
@@ -5243,6 +5268,10 @@ static int32_t checkAlterSuperTableBySchema(STranslateContext* pCxt, SAlterTable
...
@@ -5243,6 +5268,10 @@ static int32_t checkAlterSuperTableBySchema(STranslateContext* pCxt, SAlterTable
}
}
}
}
if
(
getNumOfTags
(
pTableMeta
)
==
1
&&
pStmt
->
alterType
==
TSDB_ALTER_TABLE_DROP_TAG
)
{
return
generateSyntaxErrMsgExt
(
&
pCxt
->
msgBuf
,
TSDB_CODE_PAR_INVALID_ALTER_TABLE
,
"the only tag cannot be dropped"
);
}
return
TSDB_CODE_SUCCESS
;
return
TSDB_CODE_SUCCESS
;
}
}
...
@@ -8293,10 +8322,6 @@ static void destoryAlterTbReq(SVAlterTbReq* pReq) {
...
@@ -8293,10 +8322,6 @@ static void destoryAlterTbReq(SVAlterTbReq* pReq) {
static
int32_t
rewriteAlterTableImpl
(
STranslateContext
*
pCxt
,
SAlterTableStmt
*
pStmt
,
STableMeta
*
pTableMeta
,
static
int32_t
rewriteAlterTableImpl
(
STranslateContext
*
pCxt
,
SAlterTableStmt
*
pStmt
,
STableMeta
*
pTableMeta
,
SQuery
*
pQuery
)
{
SQuery
*
pQuery
)
{
if
(
getNumOfTags
(
pTableMeta
)
==
1
&&
pStmt
->
alterType
==
TSDB_ALTER_TABLE_DROP_TAG
)
{
return
generateSyntaxErrMsgExt
(
&
pCxt
->
msgBuf
,
TSDB_CODE_PAR_INVALID_ALTER_TABLE
,
"the only tag cannot be dropped"
);
}
if
(
TSDB_SUPER_TABLE
==
pTableMeta
->
tableType
)
{
if
(
TSDB_SUPER_TABLE
==
pTableMeta
->
tableType
)
{
return
TSDB_CODE_SUCCESS
;
return
TSDB_CODE_SUCCESS
;
}
else
if
(
TSDB_CHILD_TABLE
!=
pTableMeta
->
tableType
&&
TSDB_NORMAL_TABLE
!=
pTableMeta
->
tableType
)
{
}
else
if
(
TSDB_CHILD_TABLE
!=
pTableMeta
->
tableType
&&
TSDB_NORMAL_TABLE
!=
pTableMeta
->
tableType
)
{
...
...
source/libs/scalar/src/scalar.c
浏览文件 @
f37f4088
...
@@ -1038,23 +1038,40 @@ bool sclContainsAggFuncNode(SNode *pNode) {
...
@@ -1038,23 +1038,40 @@ bool sclContainsAggFuncNode(SNode *pNode) {
return
aggFunc
;
return
aggFunc
;
}
}
static
uint8_t
sclGetOpValueNodeTsPrecision
(
SNode
*
pLeft
,
SNode
*
pRight
)
{
uint8_t
lPrec
=
((
SExprNode
*
)
pLeft
)
->
resType
.
precision
;
uint8_t
rPrec
=
((
SExprNode
*
)
pRight
)
->
resType
.
precision
;
uint8_t
lType
=
((
SExprNode
*
)
pLeft
)
->
resType
.
type
;
uint8_t
rType
=
((
SExprNode
*
)
pRight
)
->
resType
.
type
;
if
(
TSDB_DATA_TYPE_TIMESTAMP
==
lType
&&
TSDB_DATA_TYPE_TIMESTAMP
==
rType
)
{
return
TMAX
(
lPrec
,
rPrec
);
}
else
if
(
TSDB_DATA_TYPE_TIMESTAMP
==
lType
&&
TSDB_DATA_TYPE_TIMESTAMP
!=
rType
)
{
return
lPrec
;
}
else
if
(
TSDB_DATA_TYPE_TIMESTAMP
==
rType
&&
TSDB_DATA_TYPE_TIMESTAMP
!=
lType
)
{
return
rPrec
;
}
return
0
;
}
int32_t
sclConvertOpValueNodeTs
(
SOperatorNode
*
node
,
SScalarCtx
*
ctx
)
{
int32_t
sclConvertOpValueNodeTs
(
SOperatorNode
*
node
,
SScalarCtx
*
ctx
)
{
int32_t
code
=
0
;
int32_t
code
=
0
;
if
(
node
->
pLeft
&&
SCL_IS_VAR_VALUE_NODE
(
node
->
pLeft
))
{
if
(
node
->
pLeft
&&
SCL_IS_VAR_VALUE_NODE
(
node
->
pLeft
))
{
if
(
node
->
pRight
&&
(
TSDB_DATA_TYPE_TIMESTAMP
==
((
SExprNode
*
)
node
->
pRight
)
->
resType
.
type
))
{
if
(
node
->
pRight
&&
(
TSDB_DATA_TYPE_TIMESTAMP
==
((
SExprNode
*
)
node
->
pRight
)
->
resType
.
type
))
{
SCL_ERR_JRET
(
sclConvertToTsValueNode
(
((
SExprNode
*
)
node
->
pRight
)
->
resType
.
precision
,
(
SValueNode
*
)
node
->
pLeft
));
SCL_ERR_JRET
(
sclConvertToTsValueNode
(
sclGetOpValueNodeTsPrecision
(
node
->
pLeft
,
node
->
pRight
)
,
(
SValueNode
*
)
node
->
pLeft
));
}
}
}
else
if
(
node
->
pRight
&&
SCL_IS_NOTNULL_CONST_NODE
(
node
->
pRight
))
{
}
else
if
(
node
->
pRight
&&
SCL_IS_NOTNULL_CONST_NODE
(
node
->
pRight
))
{
if
(
node
->
pLeft
&&
(
TSDB_DATA_TYPE_TIMESTAMP
==
((
SExprNode
*
)
node
->
pLeft
)
->
resType
.
type
))
{
if
(
node
->
pLeft
&&
(
TSDB_DATA_TYPE_TIMESTAMP
==
((
SExprNode
*
)
node
->
pLeft
)
->
resType
.
type
))
{
if
(
SCL_IS_VAR_VALUE_NODE
(
node
->
pRight
))
{
if
(
SCL_IS_VAR_VALUE_NODE
(
node
->
pRight
))
{
SCL_ERR_JRET
(
sclConvertToTsValueNode
(
((
SExprNode
*
)
node
->
pLeft
)
->
resType
.
precision
,
(
SValueNode
*
)
node
->
pRight
));
SCL_ERR_JRET
(
sclConvertToTsValueNode
(
sclGetOpValueNodeTsPrecision
(
node
->
pLeft
,
node
->
pRight
)
,
(
SValueNode
*
)
node
->
pRight
));
}
else
if
(
QUERY_NODE_NODE_LIST
==
node
->
pRight
->
type
)
{
}
else
if
(
QUERY_NODE_NODE_LIST
==
node
->
pRight
->
type
)
{
SNode
*
pNode
;
SNode
*
pNode
;
FOREACH
(
pNode
,
((
SNodeListNode
*
)
node
->
pRight
)
->
pNodeList
)
{
FOREACH
(
pNode
,
((
SNodeListNode
*
)
node
->
pRight
)
->
pNodeList
)
{
if
(
SCL_IS_VAR_VALUE_NODE
(
pNode
))
{
if
(
SCL_IS_VAR_VALUE_NODE
(
pNode
))
{
SCL_ERR_JRET
(
sclConvertToTsValueNode
(
((
SExprNode
*
)
node
->
pLeft
)
->
resType
.
precision
,
(
SValueNode
*
)
pNode
));
SCL_ERR_JRET
(
sclConvertToTsValueNode
(
sclGetOpValueNodeTsPrecision
(
node
->
pLeft
,
pNode
)
,
(
SValueNode
*
)
pNode
));
}
}
}
}
}
}
...
@@ -1077,7 +1094,7 @@ int32_t sclConvertCaseWhenValueNodeTs(SCaseWhenNode *node, SScalarCtx *ctx) {
...
@@ -1077,7 +1094,7 @@ int32_t sclConvertCaseWhenValueNodeTs(SCaseWhenNode *node, SScalarCtx *ctx) {
if
(
NULL
==
node
->
pCase
)
{
if
(
NULL
==
node
->
pCase
)
{
return
TSDB_CODE_SUCCESS
;
return
TSDB_CODE_SUCCESS
;
}
}
if
(
SCL_IS_VAR_VALUE_NODE
(
node
->
pCase
))
{
if
(
SCL_IS_VAR_VALUE_NODE
(
node
->
pCase
))
{
SNode
*
pNode
;
SNode
*
pNode
;
FOREACH
(
pNode
,
node
->
pWhenThenList
)
{
FOREACH
(
pNode
,
node
->
pWhenThenList
)
{
...
...
source/libs/stream/CMakeLists.txt
浏览文件 @
f37f4088
...
@@ -9,7 +9,7 @@ target_include_directories(
...
@@ -9,7 +9,7 @@ target_include_directories(
target_link_libraries
(
target_link_libraries
(
stream
stream
PUBLIC tdb
PUBLIC tdb
PRIVATE os util transport qcom executor
PRIVATE os util transport qcom executor
wal
)
)
if
(
${
BUILD_TEST
}
)
if
(
${
BUILD_TEST
}
)
...
...
source/libs/stream/inc/streamInc.h
浏览文件 @
f37f4088
...
@@ -44,7 +44,7 @@ int32_t streamDispatchOneCheckReq(SStreamTask* pTask, const SStreamTaskCheckReq*
...
@@ -44,7 +44,7 @@ int32_t streamDispatchOneCheckReq(SStreamTask* pTask, const SStreamTaskCheckReq*
int32_t
streamDispatchOneRecoverFinishReq
(
SStreamTask
*
pTask
,
const
SStreamRecoverFinishReq
*
pReq
,
int32_t
vgId
,
int32_t
streamDispatchOneRecoverFinishReq
(
SStreamTask
*
pTask
,
const
SStreamRecoverFinishReq
*
pReq
,
int32_t
vgId
,
SEpSet
*
pEpSet
);
SEpSet
*
pEpSet
);
SStreamQueueItem
*
streamMergeQueueItem
(
SStreamQueueItem
*
dst
,
SStreamQueueItem
*
e
lem
);
SStreamQueueItem
*
streamMergeQueueItem
(
SStreamQueueItem
*
dst
,
SStreamQueueItem
*
pE
lem
);
#ifdef __cplusplus
#ifdef __cplusplus
}
}
...
...
source/libs/stream/src/stream.c
浏览文件 @
f37f4088
...
@@ -16,6 +16,8 @@
...
@@ -16,6 +16,8 @@
#include "streamInc.h"
#include "streamInc.h"
#include "ttimer.h"
#include "ttimer.h"
#define STREAM_TASK_INPUT_QUEUEU_CAPACITY 2000
int32_t
streamInit
()
{
int32_t
streamInit
()
{
int8_t
old
;
int8_t
old
;
while
(
1
)
{
while
(
1
)
{
...
@@ -50,7 +52,7 @@ void streamCleanUp() {
...
@@ -50,7 +52,7 @@ void streamCleanUp() {
void
streamSchedByTimer
(
void
*
param
,
void
*
tmrId
)
{
void
streamSchedByTimer
(
void
*
param
,
void
*
tmrId
)
{
SStreamTask
*
pTask
=
(
void
*
)
param
;
SStreamTask
*
pTask
=
(
void
*
)
param
;
if
(
atomic_load_8
(
&
pTask
->
taskStatus
)
==
TASK_STATUS__DROPPING
)
{
if
(
atomic_load_8
(
&
pTask
->
status
.
taskStatus
)
==
TASK_STATUS__DROPPING
)
{
streamMetaReleaseTask
(
NULL
,
pTask
);
streamMetaReleaseTask
(
NULL
,
pTask
);
return
;
return
;
}
}
...
@@ -64,15 +66,16 @@ void streamSchedByTimer(void* param, void* tmrId) {
...
@@ -64,15 +66,16 @@ void streamSchedByTimer(void* param, void* tmrId) {
taosFreeQitem
(
trigger
);
taosFreeQitem
(
trigger
);
return
;
return
;
}
}
trigger
->
pBlock
->
info
.
type
=
STREAM_GET_ALL
;
trigger
->
pBlock
->
info
.
type
=
STREAM_GET_ALL
;
atomic_store_8
(
&
pTask
->
triggerStatus
,
TASK_TRIGGER_STATUS__INACTIVE
);
atomic_store_8
(
&
pTask
->
triggerStatus
,
TASK_TRIGGER_STATUS__INACTIVE
);
if
(
tAppendData
ForStream
(
pTask
,
(
SStreamQueueItem
*
)
trigger
)
<
0
)
{
if
(
tAppendData
ToInputQueue
(
pTask
,
(
SStreamQueueItem
*
)
trigger
)
<
0
)
{
taosFreeQitem
(
trigger
);
taosFreeQitem
(
trigger
);
taosTmrReset
(
streamSchedByTimer
,
(
int32_t
)
pTask
->
triggerParam
,
pTask
,
streamEnv
.
timer
,
&
pTask
->
timer
);
taosTmrReset
(
streamSchedByTimer
,
(
int32_t
)
pTask
->
triggerParam
,
pTask
,
streamEnv
.
timer
,
&
pTask
->
timer
);
return
;
return
;
}
}
streamSchedExec
(
pTask
);
streamSchedExec
(
pTask
);
}
}
...
@@ -91,31 +94,33 @@ int32_t streamSetupTrigger(SStreamTask* pTask) {
...
@@ -91,31 +94,33 @@ int32_t streamSetupTrigger(SStreamTask* pTask) {
int32_t
streamSchedExec
(
SStreamTask
*
pTask
)
{
int32_t
streamSchedExec
(
SStreamTask
*
pTask
)
{
int8_t
schedStatus
=
int8_t
schedStatus
=
atomic_val_compare_exchange_8
(
&
pTask
->
schedStatus
,
TASK_SCHED_STATUS__INACTIVE
,
TASK_SCHED_STATUS__WAITING
);
atomic_val_compare_exchange_8
(
&
pTask
->
s
tatus
.
s
chedStatus
,
TASK_SCHED_STATUS__INACTIVE
,
TASK_SCHED_STATUS__WAITING
);
if
(
schedStatus
==
TASK_SCHED_STATUS__INACTIVE
)
{
if
(
schedStatus
==
TASK_SCHED_STATUS__INACTIVE
)
{
SStreamTaskRunReq
*
pRunReq
=
rpcMallocCont
(
sizeof
(
SStreamTaskRunReq
));
SStreamTaskRunReq
*
pRunReq
=
rpcMallocCont
(
sizeof
(
SStreamTaskRunReq
));
if
(
pRunReq
==
NULL
)
{
if
(
pRunReq
==
NULL
)
{
atomic_store_8
(
&
pTask
->
schedStatus
,
TASK_SCHED_STATUS__INACTIVE
);
terrno
=
TSDB_CODE_OUT_OF_MEMORY
;
atomic_store_8
(
&
pTask
->
status
.
schedStatus
,
TASK_SCHED_STATUS__INACTIVE
);
return
-
1
;
return
-
1
;
}
}
pRunReq
->
head
.
vgId
=
pTask
->
nodeId
;
pRunReq
->
head
.
vgId
=
pTask
->
nodeId
;
pRunReq
->
streamId
=
pTask
->
streamId
;
pRunReq
->
streamId
=
pTask
->
id
.
streamId
;
pRunReq
->
taskId
=
pTask
->
taskId
;
pRunReq
->
taskId
=
pTask
->
id
.
taskId
;
SRpcMsg
msg
=
{
.
msgType
=
TDMT_STREAM_TASK_RUN
,
.
pCont
=
pRunReq
,
.
contLen
=
sizeof
(
SStreamTaskRunReq
)
};
SRpcMsg
msg
=
{
.
msgType
=
TDMT_STREAM_TASK_RUN
,
.
pCont
=
pRunReq
,
.
contLen
=
sizeof
(
SStreamTaskRunReq
)
};
tmsgPutToQueue
(
pTask
->
pMsgCb
,
STREAM_QUEUE
,
&
msg
);
tmsgPutToQueue
(
pTask
->
pMsgCb
,
STREAM_QUEUE
,
&
msg
);
qDebug
(
"trigger to run s-task:%s"
,
pTask
->
id
.
idStr
);
}
}
return
0
;
return
0
;
}
}
int32_t
streamTaskEnqueue
(
SStreamTask
*
pTask
,
const
SStreamDispatchReq
*
pReq
,
SRpcMsg
*
pRsp
)
{
int32_t
streamTaskEnqueue
Blocks
(
SStreamTask
*
pTask
,
const
SStreamDispatchReq
*
pReq
,
SRpcMsg
*
pRsp
)
{
SStreamDataBlock
*
pData
=
taosAllocateQitem
(
sizeof
(
SStreamDataBlock
),
DEF_QITEM
,
0
);
SStreamDataBlock
*
pData
=
taosAllocateQitem
(
sizeof
(
SStreamDataBlock
),
DEF_QITEM
,
0
);
int8_t
status
;
int8_t
status
;
// enqueue
// enqueue
data block
if
(
pData
!=
NULL
)
{
if
(
pData
!=
NULL
)
{
pData
->
type
=
STREAM_INPUT__DATA_BLOCK
;
pData
->
type
=
STREAM_INPUT__DATA_BLOCK
;
pData
->
srcVgId
=
pReq
->
dataSrcVgId
;
pData
->
srcVgId
=
pReq
->
dataSrcVgId
;
...
@@ -123,10 +128,10 @@ int32_t streamTaskEnqueue(SStreamTask* pTask, const SStreamDispatchReq* pReq, SR
...
@@ -123,10 +128,10 @@ int32_t streamTaskEnqueue(SStreamTask* pTask, const SStreamDispatchReq* pReq, SR
/*pData->blocks = pReq->data;*/
/*pData->blocks = pReq->data;*/
/*pBlock->sourceVer = pReq->sourceVer;*/
/*pBlock->sourceVer = pReq->sourceVer;*/
streamDispatchReqToData
(
pReq
,
pData
);
streamDispatchReqToData
(
pReq
,
pData
);
if
(
tAppendData
ForStream
(
pTask
,
(
SStreamQueueItem
*
)
pData
)
==
0
)
{
if
(
tAppendData
ToInputQueue
(
pTask
,
(
SStreamQueueItem
*
)
pData
)
==
0
)
{
status
=
TASK_INPUT_STATUS__NORMAL
;
status
=
TASK_INPUT_STATUS__NORMAL
;
}
else
{
}
else
{
// input queue is full, upstream is blocked now
status
=
TASK_INPUT_STATUS__
FAIL
ED
;
status
=
TASK_INPUT_STATUS__
BLOCK
ED
;
}
}
}
else
{
}
else
{
streamTaskInputFail
(
pTask
);
streamTaskInputFail
(
pTask
);
...
@@ -142,10 +147,12 @@ int32_t streamTaskEnqueue(SStreamTask* pTask, const SStreamDispatchReq* pReq, SR
...
@@ -142,10 +147,12 @@ int32_t streamTaskEnqueue(SStreamTask* pTask, const SStreamDispatchReq* pReq, SR
pCont
->
upstreamNodeId
=
htonl
(
pReq
->
upstreamNodeId
);
pCont
->
upstreamNodeId
=
htonl
(
pReq
->
upstreamNodeId
);
pCont
->
upstreamTaskId
=
htonl
(
pReq
->
upstreamTaskId
);
pCont
->
upstreamTaskId
=
htonl
(
pReq
->
upstreamTaskId
);
pCont
->
downstreamNodeId
=
htonl
(
pTask
->
nodeId
);
pCont
->
downstreamNodeId
=
htonl
(
pTask
->
nodeId
);
pCont
->
downstreamTaskId
=
htonl
(
pTask
->
taskId
);
pCont
->
downstreamTaskId
=
htonl
(
pTask
->
id
.
taskId
);
pRsp
->
pCont
=
buf
;
pRsp
->
pCont
=
buf
;
pRsp
->
contLen
=
sizeof
(
SMsgHead
)
+
sizeof
(
SStreamDispatchRsp
);
pRsp
->
contLen
=
sizeof
(
SMsgHead
)
+
sizeof
(
SStreamDispatchRsp
);
tmsgSendRsp
(
pRsp
);
tmsgSendRsp
(
pRsp
);
return
status
==
TASK_INPUT_STATUS__NORMAL
?
0
:
-
1
;
return
status
==
TASK_INPUT_STATUS__NORMAL
?
0
:
-
1
;
}
}
...
@@ -155,7 +162,7 @@ int32_t streamTaskEnqueueRetrieve(SStreamTask* pTask, SStreamRetrieveReq* pReq,
...
@@ -155,7 +162,7 @@ int32_t streamTaskEnqueueRetrieve(SStreamTask* pTask, SStreamRetrieveReq* pReq,
// enqueue
// enqueue
if
(
pData
!=
NULL
)
{
if
(
pData
!=
NULL
)
{
qDebug
(
"task %d(child %d) recv retrieve req from task %d, reqId %"
PRId64
,
pTask
->
taskId
,
pTask
->
selfChildId
,
qDebug
(
"task %d(child %d) recv retrieve req from task %d, reqId %"
PRId64
,
pTask
->
id
.
taskId
,
pTask
->
selfChildId
,
pReq
->
srcTaskId
,
pReq
->
reqId
);
pReq
->
srcTaskId
,
pReq
->
reqId
);
pData
->
type
=
STREAM_INPUT__DATA_RETRIEVE
;
pData
->
type
=
STREAM_INPUT__DATA_RETRIEVE
;
...
@@ -164,7 +171,7 @@ int32_t streamTaskEnqueueRetrieve(SStreamTask* pTask, SStreamRetrieveReq* pReq,
...
@@ -164,7 +171,7 @@ int32_t streamTaskEnqueueRetrieve(SStreamTask* pTask, SStreamRetrieveReq* pReq,
/*pData->blocks = pReq->data;*/
/*pData->blocks = pReq->data;*/
/*pBlock->sourceVer = pReq->sourceVer;*/
/*pBlock->sourceVer = pReq->sourceVer;*/
streamRetrieveReqToData
(
pReq
,
pData
);
streamRetrieveReqToData
(
pReq
,
pData
);
if
(
tAppendData
ForStream
(
pTask
,
(
SStreamQueueItem
*
)
pData
)
==
0
)
{
if
(
tAppendData
ToInputQueue
(
pTask
,
(
SStreamQueueItem
*
)
pData
)
==
0
)
{
status
=
TASK_INPUT_STATUS__NORMAL
;
status
=
TASK_INPUT_STATUS__NORMAL
;
}
else
{
}
else
{
status
=
TASK_INPUT_STATUS__FAILED
;
status
=
TASK_INPUT_STATUS__FAILED
;
...
@@ -205,10 +212,10 @@ int32_t streamTaskOutput(SStreamTask* pTask, SStreamDataBlock* pBlock) {
...
@@ -205,10 +212,10 @@ int32_t streamTaskOutput(SStreamTask* pTask, SStreamDataBlock* pBlock) {
}
}
int32_t
streamProcessDispatchReq
(
SStreamTask
*
pTask
,
SStreamDispatchReq
*
pReq
,
SRpcMsg
*
pRsp
,
bool
exec
)
{
int32_t
streamProcessDispatchReq
(
SStreamTask
*
pTask
,
SStreamDispatchReq
*
pReq
,
SRpcMsg
*
pRsp
,
bool
exec
)
{
qDebug
(
"
task %d receive dispatch req from node %d task %d"
,
pTask
->
taskId
,
pReq
->
upstreamNodeId
,
qDebug
(
"
vgId:%d s-task:%s receive dispatch req from taskId:%d"
,
pReq
->
upstreamNodeId
,
pTask
->
id
.
idStr
,
pReq
->
upstreamTaskId
);
pReq
->
upstreamTaskId
);
streamTaskEnqueue
(
pTask
,
pReq
,
pRsp
);
streamTaskEnqueue
Blocks
(
pTask
,
pReq
,
pRsp
);
tDeleteStreamDispatchReq
(
pReq
);
tDeleteStreamDispatchReq
(
pReq
);
if
(
exec
)
{
if
(
exec
)
{
...
@@ -228,13 +235,14 @@ int32_t streamProcessDispatchReq(SStreamTask* pTask, SStreamDispatchReq* pReq, S
...
@@ -228,13 +235,14 @@ 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
)
{
ASSERT
(
pRsp
->
inputStatus
==
TASK_OUTPUT_STATUS__NORMAL
||
pRsp
->
inputStatus
==
TASK_OUTPUT_STATUS__BLOCKED
);
ASSERT
(
pRsp
->
inputStatus
==
TASK_OUTPUT_STATUS__NORMAL
||
pRsp
->
inputStatus
==
TASK_OUTPUT_STATUS__BLOCKED
);
qDebug
(
"s-task:%s receive dispatch rsp, code: %x"
,
pTask
->
id
.
idStr
,
code
);
qDebug
(
"task %d receive dispatch rsp, code: %x"
,
pTask
->
taskId
,
code
);
if
(
pTask
->
outputType
==
TASK_OUTPUT__SHUFFLE_DISPATCH
)
{
if
(
pTask
->
outputType
==
TASK_OUTPUT__SHUFFLE_DISPATCH
)
{
int32_t
leftRsp
=
atomic_sub_fetch_32
(
&
pTask
->
shuffleDispatcher
.
waitingRspCnt
,
1
);
int32_t
leftRsp
=
atomic_sub_fetch_32
(
&
pTask
->
shuffleDispatcher
.
waitingRspCnt
,
1
);
qDebug
(
"task %d is shuffle, left waiting rsp %d"
,
pTask
->
taskId
,
leftRsp
);
qDebug
(
"task %d is shuffle, left waiting rsp %d"
,
pTask
->
id
.
taskId
,
leftRsp
);
if
(
leftRsp
>
0
)
return
0
;
if
(
leftRsp
>
0
)
{
return
0
;
}
}
}
int8_t
old
=
atomic_exchange_8
(
&
pTask
->
outputStatus
,
pRsp
->
inputStatus
);
int8_t
old
=
atomic_exchange_8
(
&
pTask
->
outputStatus
,
pRsp
->
inputStatus
);
...
@@ -261,7 +269,7 @@ int32_t streamProcessRunReq(SStreamTask* pTask) {
...
@@ -261,7 +269,7 @@ int32_t streamProcessRunReq(SStreamTask* pTask) {
}
}
int32_t
streamProcessRetrieveReq
(
SStreamTask
*
pTask
,
SStreamRetrieveReq
*
pReq
,
SRpcMsg
*
pRsp
)
{
int32_t
streamProcessRetrieveReq
(
SStreamTask
*
pTask
,
SStreamRetrieveReq
*
pReq
,
SRpcMsg
*
pRsp
)
{
qDebug
(
"task %d receive retrieve req from node %d task %d"
,
pTask
->
taskId
,
pReq
->
srcNodeId
,
pReq
->
srcTaskId
);
qDebug
(
"task %d receive retrieve req from node %d task %d"
,
pTask
->
id
.
taskId
,
pReq
->
srcNodeId
,
pReq
->
srcTaskId
);
streamTaskEnqueueRetrieve
(
pTask
,
pReq
,
pRsp
);
streamTaskEnqueueRetrieve
(
pTask
,
pReq
,
pRsp
);
...
@@ -275,26 +283,43 @@ int32_t streamProcessRetrieveReq(SStreamTask* pTask, SStreamRetrieveReq* pReq, S
...
@@ -275,26 +283,43 @@ int32_t streamProcessRetrieveReq(SStreamTask* pTask, SStreamRetrieveReq* pReq, S
return
0
;
return
0
;
}
}
int32_t
tAppendDataForStream
(
SStreamTask
*
pTask
,
SStreamQueueItem
*
pItem
)
{
bool
tInputQueueIsFull
(
const
SStreamTask
*
pTask
)
{
return
taosQueueItemSize
((
pTask
->
inputQueue
->
queue
))
>=
STREAM_TASK_INPUT_QUEUEU_CAPACITY
;
}
int32_t
tAppendDataToInputQueue
(
SStreamTask
*
pTask
,
SStreamQueueItem
*
pItem
)
{
int8_t
type
=
pItem
->
type
;
int8_t
type
=
pItem
->
type
;
if
(
type
==
STREAM_INPUT__DATA_SUBMIT
)
{
if
(
type
==
STREAM_INPUT__DATA_SUBMIT
)
{
SStreamDataSubmit2
*
pSubmitBlock
=
streamSubmitBlockClone
((
SStreamDataSubmit2
*
)
pItem
);
SStreamDataSubmit2
*
pSubmitBlock
=
streamSubmitBlockClone
((
SStreamDataSubmit2
*
)
pItem
);
if
(
pSubmitBlock
==
NULL
)
{
if
(
pSubmitBlock
==
NULL
)
{
qDebug
(
"task %d %p submit enqueue failed since out of memory"
,
pTask
->
taskId
,
pTask
);
qDebug
(
"task %d %p submit enqueue failed since out of memory"
,
pTask
->
id
.
taskId
,
pTask
);
terrno
=
TSDB_CODE_OUT_OF_MEMORY
;
terrno
=
TSDB_CODE_OUT_OF_MEMORY
;
atomic_store_8
(
&
pTask
->
inputStatus
,
TASK_INPUT_STATUS__FAILED
);
atomic_store_8
(
&
pTask
->
inputStatus
,
TASK_INPUT_STATUS__FAILED
);
return
-
1
;
return
-
1
;
}
}
int32_t
total
=
taosQueueItemSize
(
pTask
->
inputQueue
->
queue
)
+
1
;
int32_t
total
=
taosQueueItemSize
(
pTask
->
inputQueue
->
queue
)
+
1
;
qDebug
(
"s
tream task:%d %p submit enqueue %p %p %p msgLen:%d ver:%"
PRId64
", total in queue:%d"
,
pTask
->
taskId
,
qDebug
(
"s
-task:%s submit enqueue %p %p msgLen:%d ver:%"
PRId64
", total in queue:%d"
,
pTask
->
id
.
idStr
,
p
Task
,
pItem
,
pSubmitBlock
,
pSubmitBlock
->
submit
.
msgStr
,
pSubmitBlock
->
submit
.
msgLen
,
p
Item
,
pSubmitBlock
->
submit
.
msgStr
,
pSubmitBlock
->
submit
.
msgLen
,
pSubmitBlock
->
submit
.
ver
,
total
);
pSubmitBlock
->
submit
.
ver
,
total
);
if
((
pTask
->
taskLevel
==
TASK_LEVEL__SOURCE
)
&&
total
>
STREAM_TASK_INPUT_QUEUEU_CAPACITY
)
{
qError
(
"s-task:%s input queue is full, capacity:%d, abort"
,
pTask
->
id
.
idStr
,
STREAM_TASK_INPUT_QUEUEU_CAPACITY
);
streamDataSubmitDestroy
(
pSubmitBlock
);
return
-
1
;
}
taosWriteQitem
(
pTask
->
inputQueue
->
queue
,
pSubmitBlock
);
taosWriteQitem
(
pTask
->
inputQueue
->
queue
,
pSubmitBlock
);
}
else
if
(
type
==
STREAM_INPUT__DATA_BLOCK
||
type
==
STREAM_INPUT__DATA_RETRIEVE
||
}
else
if
(
type
==
STREAM_INPUT__DATA_BLOCK
||
type
==
STREAM_INPUT__DATA_RETRIEVE
||
type
==
STREAM_INPUT__REF_DATA_BLOCK
)
{
type
==
STREAM_INPUT__REF_DATA_BLOCK
)
{
int32_t
total
=
taosQueueItemSize
(
pTask
->
inputQueue
->
queue
)
+
1
;
if
((
pTask
->
taskLevel
==
TASK_LEVEL__SOURCE
)
&&
total
>
STREAM_TASK_INPUT_QUEUEU_CAPACITY
)
{
qError
(
"s-task:%s input queue is full, capacity:%d, abort"
,
pTask
->
id
.
idStr
,
STREAM_TASK_INPUT_QUEUEU_CAPACITY
);
return
-
1
;
}
qDebug
(
"s-task:%s data block enqueue, total in queue:%d"
,
pTask
->
id
.
idStr
,
total
);
taosWriteQitem
(
pTask
->
inputQueue
->
queue
,
pItem
);
taosWriteQitem
(
pTask
->
inputQueue
->
queue
,
pItem
);
}
else
if
(
type
==
STREAM_INPUT__CHECKPOINT
)
{
}
else
if
(
type
==
STREAM_INPUT__CHECKPOINT
)
{
taosWriteQitem
(
pTask
->
inputQueue
->
queue
,
pItem
);
taosWriteQitem
(
pTask
->
inputQueue
->
queue
,
pItem
);
...
@@ -307,7 +332,6 @@ int32_t tAppendDataForStream(SStreamTask* pTask, SStreamQueueItem* pItem) {
...
@@ -307,7 +332,6 @@ int32_t tAppendDataForStream(SStreamTask* pTask, SStreamQueueItem* pItem) {
}
}
#if 0
#if 0
// TODO: back pressure
atomic_store_8(&pTask->inputStatus, TASK_INPUT_STATUS__NORMAL);
atomic_store_8(&pTask->inputStatus, TASK_INPUT_STATUS__NORMAL);
#endif
#endif
...
...
source/libs/stream/src/streamData.c
浏览文件 @
f37f4088
...
@@ -67,9 +67,8 @@ int32_t streamRetrieveReqToData(const SStreamRetrieveReq* pReq, SStreamDataBlock
...
@@ -67,9 +67,8 @@ int32_t streamRetrieveReqToData(const SStreamRetrieveReq* pReq, SStreamDataBlock
return
0
;
return
0
;
}
}
SStreamDataSubmit2
*
streamDataSubmitNew
(
SPackedData
submit
)
{
SStreamDataSubmit2
*
streamDataSubmitNew
(
SPackedData
submit
,
int32_t
type
)
{
SStreamDataSubmit2
*
pDataSubmit
=
(
SStreamDataSubmit2
*
)
taosAllocateQitem
(
sizeof
(
SStreamDataSubmit2
),
DEF_QITEM
,
0
);
SStreamDataSubmit2
*
pDataSubmit
=
(
SStreamDataSubmit2
*
)
taosAllocateQitem
(
sizeof
(
SStreamDataSubmit2
),
DEF_QITEM
,
0
);
if
(
pDataSubmit
==
NULL
)
{
if
(
pDataSubmit
==
NULL
)
{
return
NULL
;
return
NULL
;
}
}
...
@@ -82,7 +81,7 @@ SStreamDataSubmit2* streamDataSubmitNew(SPackedData submit) {
...
@@ -82,7 +81,7 @@ SStreamDataSubmit2* streamDataSubmitNew(SPackedData submit) {
pDataSubmit
->
submit
=
submit
;
pDataSubmit
->
submit
=
submit
;
*
pDataSubmit
->
dataRef
=
1
;
// initialize the reference count to be 1
*
pDataSubmit
->
dataRef
=
1
;
// initialize the reference count to be 1
pDataSubmit
->
type
=
STREAM_INPUT__DATA_SUBMIT
;
pDataSubmit
->
type
=
type
;
return
pDataSubmit
;
return
pDataSubmit
;
}
}
...
@@ -139,28 +138,27 @@ SStreamDataSubmit2* streamSubmitBlockClone(SStreamDataSubmit2* pSubmit) {
...
@@ -139,28 +138,27 @@ SStreamDataSubmit2* streamSubmitBlockClone(SStreamDataSubmit2* pSubmit) {
return
pSubmitClone
;
return
pSubmitClone
;
}
}
SStreamQueueItem
*
streamMergeQueueItem
(
SStreamQueueItem
*
dst
,
SStreamQueueItem
*
elem
)
{
SStreamQueueItem
*
streamMergeQueueItem
(
SStreamQueueItem
*
dst
,
SStreamQueueItem
*
pElem
)
{
ASSERT
(
elem
);
if
(
dst
->
type
==
STREAM_INPUT__DATA_BLOCK
&&
pElem
->
type
==
STREAM_INPUT__DATA_BLOCK
)
{
if
(
dst
->
type
==
STREAM_INPUT__DATA_BLOCK
&&
elem
->
type
==
STREAM_INPUT__DATA_BLOCK
)
{
SStreamDataBlock
*
pBlock
=
(
SStreamDataBlock
*
)
dst
;
SStreamDataBlock
*
pBlock
=
(
SStreamDataBlock
*
)
dst
;
SStreamDataBlock
*
pBlockSrc
=
(
SStreamDataBlock
*
)
e
lem
;
SStreamDataBlock
*
pBlockSrc
=
(
SStreamDataBlock
*
)
pE
lem
;
taosArrayAddAll
(
pBlock
->
blocks
,
pBlockSrc
->
blocks
);
taosArrayAddAll
(
pBlock
->
blocks
,
pBlockSrc
->
blocks
);
taosArrayDestroy
(
pBlockSrc
->
blocks
);
taosArrayDestroy
(
pBlockSrc
->
blocks
);
taosFreeQitem
(
e
lem
);
taosFreeQitem
(
pE
lem
);
return
dst
;
return
dst
;
}
else
if
(
dst
->
type
==
STREAM_INPUT__MERGED_SUBMIT
&&
e
lem
->
type
==
STREAM_INPUT__DATA_SUBMIT
)
{
}
else
if
(
dst
->
type
==
STREAM_INPUT__MERGED_SUBMIT
&&
pE
lem
->
type
==
STREAM_INPUT__DATA_SUBMIT
)
{
SStreamMergedSubmit2
*
pMerged
=
(
SStreamMergedSubmit2
*
)
dst
;
SStreamMergedSubmit2
*
pMerged
=
(
SStreamMergedSubmit2
*
)
dst
;
SStreamDataSubmit2
*
pBlockSrc
=
(
SStreamDataSubmit2
*
)
e
lem
;
SStreamDataSubmit2
*
pBlockSrc
=
(
SStreamDataSubmit2
*
)
pE
lem
;
streamMergeSubmit
(
pMerged
,
pBlockSrc
);
streamMergeSubmit
(
pMerged
,
pBlockSrc
);
taosFreeQitem
(
e
lem
);
taosFreeQitem
(
pE
lem
);
return
dst
;
return
dst
;
}
else
if
(
dst
->
type
==
STREAM_INPUT__DATA_SUBMIT
&&
e
lem
->
type
==
STREAM_INPUT__DATA_SUBMIT
)
{
}
else
if
(
dst
->
type
==
STREAM_INPUT__DATA_SUBMIT
&&
pE
lem
->
type
==
STREAM_INPUT__DATA_SUBMIT
)
{
SStreamMergedSubmit2
*
pMerged
=
streamMergedSubmitNew
();
SStreamMergedSubmit2
*
pMerged
=
streamMergedSubmitNew
();
ASSERT
(
pMerged
);
ASSERT
(
pMerged
);
streamMergeSubmit
(
pMerged
,
(
SStreamDataSubmit2
*
)
dst
);
streamMergeSubmit
(
pMerged
,
(
SStreamDataSubmit2
*
)
dst
);
streamMergeSubmit
(
pMerged
,
(
SStreamDataSubmit2
*
)
e
lem
);
streamMergeSubmit
(
pMerged
,
(
SStreamDataSubmit2
*
)
pE
lem
);
taosFreeQitem
(
dst
);
taosFreeQitem
(
dst
);
taosFreeQitem
(
e
lem
);
taosFreeQitem
(
pE
lem
);
return
(
SStreamQueueItem
*
)
pMerged
;
return
(
SStreamQueueItem
*
)
pMerged
;
}
else
{
}
else
{
return
NULL
;
return
NULL
;
...
...
source/libs/stream/src/streamDispatch.c
浏览文件 @
f37f4088
...
@@ -121,9 +121,9 @@ int32_t streamBroadcastToChildren(SStreamTask* pTask, const SSDataBlock* pBlock)
...
@@ -121,9 +121,9 @@ int32_t streamBroadcastToChildren(SStreamTask* pTask, const SSDataBlock* pBlock)
int32_t
actualLen
=
blockEncode
(
pBlock
,
pRetrieve
->
data
,
numOfCols
);
int32_t
actualLen
=
blockEncode
(
pBlock
,
pRetrieve
->
data
,
numOfCols
);
SStreamRetrieveReq
req
=
{
SStreamRetrieveReq
req
=
{
.
streamId
=
pTask
->
streamId
,
.
streamId
=
pTask
->
id
.
streamId
,
.
srcNodeId
=
pTask
->
nodeId
,
.
srcNodeId
=
pTask
->
nodeId
,
.
srcTaskId
=
pTask
->
taskId
,
.
srcTaskId
=
pTask
->
id
.
taskId
,
.
pRetrieve
=
pRetrieve
,
.
pRetrieve
=
pRetrieve
,
.
retrieveLen
=
dataStrLen
,
.
retrieveLen
=
dataStrLen
,
};
};
...
@@ -168,7 +168,7 @@ int32_t streamBroadcastToChildren(SStreamTask* pTask, const SSDataBlock* pBlock)
...
@@ -168,7 +168,7 @@ int32_t streamBroadcastToChildren(SStreamTask* pTask, const SSDataBlock* pBlock)
}
}
buf
=
NULL
;
buf
=
NULL
;
qDebug
(
"
task %d(child %d) send retrieve req to task %d at node %d, reqId %"
PRId64
,
pTask
->
taskId
,
qDebug
(
"
s-task:%s (child %d) send retrieve req to task %d at node %d, reqId %"
PRId64
,
pTask
->
id
.
idStr
,
pTask
->
selfChildId
,
pEpInfo
->
taskId
,
pEpInfo
->
nodeId
,
req
.
reqId
);
pTask
->
selfChildId
,
pEpInfo
->
taskId
,
pEpInfo
->
nodeId
,
req
.
reqId
);
}
}
code
=
0
;
code
=
0
;
...
@@ -238,7 +238,8 @@ int32_t streamDispatchOneCheckReq(SStreamTask* pTask, const SStreamTaskCheckReq*
...
@@ -238,7 +238,8 @@ int32_t streamDispatchOneCheckReq(SStreamTask* pTask, const SStreamTaskCheckReq*
msg
.
pCont
=
buf
;
msg
.
pCont
=
buf
;
msg
.
msgType
=
TDMT_STREAM_TASK_CHECK
;
msg
.
msgType
=
TDMT_STREAM_TASK_CHECK
;
qDebug
(
"dispatch from task %d to task %d node %d: check msg"
,
pTask
->
taskId
,
pReq
->
downstreamTaskId
,
nodeId
);
qDebug
(
"dispatch from s-task:%s to downstream s-task:%"
PRIx64
":%d node %d: check msg"
,
pTask
->
id
.
idStr
,
pReq
->
streamId
,
pReq
->
downstreamTaskId
,
nodeId
);
tmsgSendReq
(
pEpSet
,
&
msg
);
tmsgSendReq
(
pEpSet
,
&
msg
);
...
@@ -282,7 +283,7 @@ int32_t streamDispatchOneRecoverFinishReq(SStreamTask* pTask, const SStreamRecov
...
@@ -282,7 +283,7 @@ int32_t streamDispatchOneRecoverFinishReq(SStreamTask* pTask, const SStreamRecov
tmsgSendReq
(
pEpSet
,
&
msg
);
tmsgSendReq
(
pEpSet
,
&
msg
);
qDebug
(
"dispatch from task %d to task %d node %d: recover finish msg"
,
pTask
->
taskId
,
pReq
->
taskId
,
vgId
);
qDebug
(
"dispatch from task %d to task %d node %d: recover finish msg"
,
pTask
->
id
.
taskId
,
pReq
->
taskId
,
vgId
);
return
0
;
return
0
;
FAIL:
FAIL:
...
@@ -319,8 +320,7 @@ int32_t streamDispatchOneDataReq(SStreamTask* pTask, const SStreamDispatchReq* p
...
@@ -319,8 +320,7 @@ int32_t streamDispatchOneDataReq(SStreamTask* pTask, const SStreamDispatchReq* p
msg
.
pCont
=
buf
;
msg
.
pCont
=
buf
;
msg
.
msgType
=
pTask
->
dispatchMsgType
;
msg
.
msgType
=
pTask
->
dispatchMsgType
;
qDebug
(
"dispatch from task %d to task %d node %d: data msg"
,
pTask
->
taskId
,
pReq
->
taskId
,
vgId
);
qDebug
(
"dispatch from s-task:%s to taskId:%d vgId:%d data msg"
,
pTask
->
id
.
idStr
,
pReq
->
taskId
,
vgId
);
tmsgSendReq
(
pEpSet
,
&
msg
);
tmsgSendReq
(
pEpSet
,
&
msg
);
code
=
0
;
code
=
0
;
...
@@ -382,9 +382,9 @@ int32_t streamDispatchAllBlocks(SStreamTask* pTask, const SStreamDataBlock* pDat
...
@@ -382,9 +382,9 @@ int32_t streamDispatchAllBlocks(SStreamTask* pTask, const SStreamDataBlock* pDat
if
(
pTask
->
outputType
==
TASK_OUTPUT__FIXED_DISPATCH
)
{
if
(
pTask
->
outputType
==
TASK_OUTPUT__FIXED_DISPATCH
)
{
SStreamDispatchReq
req
=
{
SStreamDispatchReq
req
=
{
.
streamId
=
pTask
->
streamId
,
.
streamId
=
pTask
->
id
.
streamId
,
.
dataSrcVgId
=
pData
->
srcVgId
,
.
dataSrcVgId
=
pData
->
srcVgId
,
.
upstreamTaskId
=
pTask
->
taskId
,
.
upstreamTaskId
=
pTask
->
id
.
taskId
,
.
upstreamChildId
=
pTask
->
selfChildId
,
.
upstreamChildId
=
pTask
->
selfChildId
,
.
upstreamNodeId
=
pTask
->
nodeId
,
.
upstreamNodeId
=
pTask
->
nodeId
,
.
blockNum
=
blockNum
,
.
blockNum
=
blockNum
,
...
@@ -402,14 +402,15 @@ int32_t streamDispatchAllBlocks(SStreamTask* pTask, const SStreamDataBlock* pDat
...
@@ -402,14 +402,15 @@ int32_t streamDispatchAllBlocks(SStreamTask* pTask, const SStreamDataBlock* pDat
goto
FAIL_FIXED_DISPATCH
;
goto
FAIL_FIXED_DISPATCH
;
}
}
}
}
int32_t
vgId
=
pTask
->
fixedEpDispatcher
.
nodeId
;
int32_t
vgId
=
pTask
->
fixedEpDispatcher
.
nodeId
;
SEpSet
*
pEpSet
=
&
pTask
->
fixedEpDispatcher
.
epSet
;
SEpSet
*
pEpSet
=
&
pTask
->
fixedEpDispatcher
.
epSet
;
int32_t
downstreamTaskId
=
pTask
->
fixedEpDispatcher
.
taskId
;
int32_t
downstreamTaskId
=
pTask
->
fixedEpDispatcher
.
taskId
;
req
.
taskId
=
downstreamTaskId
;
req
.
taskId
=
downstreamTaskId
;
qDebug
(
"
dispatch from task %d (child id %d) to down stream task %d in vnode %d"
,
pTask
->
taskId
,
pTask
->
selfChildId
,
qDebug
(
"
s-task:%s (child taskId:%d) dispatch blocks:%d to down stream s-task:%d in vgId:%d"
,
pTask
->
id
.
idStr
,
downstreamTaskId
,
vgId
);
pTask
->
selfChildId
,
blockNum
,
downstreamTaskId
,
vgId
);
if
(
streamDispatchOneDataReq
(
pTask
,
&
req
,
vgId
,
pEpSet
)
<
0
)
{
if
(
streamDispatchOneDataReq
(
pTask
,
&
req
,
vgId
,
pEpSet
)
<
0
)
{
goto
FAIL_FIXED_DISPATCH
;
goto
FAIL_FIXED_DISPATCH
;
...
@@ -432,9 +433,9 @@ int32_t streamDispatchAllBlocks(SStreamTask* pTask, const SStreamDataBlock* pDat
...
@@ -432,9 +433,9 @@ int32_t streamDispatchAllBlocks(SStreamTask* pTask, const SStreamDataBlock* pDat
}
}
for
(
int32_t
i
=
0
;
i
<
vgSz
;
i
++
)
{
for
(
int32_t
i
=
0
;
i
<
vgSz
;
i
++
)
{
pReqs
[
i
].
streamId
=
pTask
->
streamId
;
pReqs
[
i
].
streamId
=
pTask
->
id
.
streamId
;
pReqs
[
i
].
dataSrcVgId
=
pData
->
srcVgId
;
pReqs
[
i
].
dataSrcVgId
=
pData
->
srcVgId
;
pReqs
[
i
].
upstreamTaskId
=
pTask
->
taskId
;
pReqs
[
i
].
upstreamTaskId
=
pTask
->
id
.
taskId
;
pReqs
[
i
].
upstreamChildId
=
pTask
->
selfChildId
;
pReqs
[
i
].
upstreamChildId
=
pTask
->
selfChildId
;
pReqs
[
i
].
upstreamNodeId
=
pTask
->
nodeId
;
pReqs
[
i
].
upstreamNodeId
=
pTask
->
nodeId
;
pReqs
[
i
].
blockNum
=
0
;
pReqs
[
i
].
blockNum
=
0
;
...
@@ -494,6 +495,8 @@ int32_t streamDispatchAllBlocks(SStreamTask* pTask, const SStreamDataBlock* pDat
...
@@ -494,6 +495,8 @@ int32_t streamDispatchAllBlocks(SStreamTask* pTask, const SStreamDataBlock* pDat
int32_t
streamDispatch
(
SStreamTask
*
pTask
)
{
int32_t
streamDispatch
(
SStreamTask
*
pTask
)
{
ASSERT
(
pTask
->
outputType
==
TASK_OUTPUT__FIXED_DISPATCH
||
pTask
->
outputType
==
TASK_OUTPUT__SHUFFLE_DISPATCH
);
ASSERT
(
pTask
->
outputType
==
TASK_OUTPUT__FIXED_DISPATCH
||
pTask
->
outputType
==
TASK_OUTPUT__SHUFFLE_DISPATCH
);
qDebug
(
"s-task:%s try to dispatch intermediate result block to downstream, numofBlocks in outputQ:%d"
,
pTask
->
id
.
idStr
,
taosQueueItemSize
(
pTask
->
outputQueue
->
queue
));
int8_t
old
=
int8_t
old
=
atomic_val_compare_exchange_8
(
&
pTask
->
outputStatus
,
TASK_OUTPUT_STATUS__NORMAL
,
TASK_OUTPUT_STATUS__WAIT
);
atomic_val_compare_exchange_8
(
&
pTask
->
outputStatus
,
TASK_OUTPUT_STATUS__NORMAL
,
TASK_OUTPUT_STATUS__WAIT
);
...
@@ -503,13 +506,12 @@ int32_t streamDispatch(SStreamTask* pTask) {
...
@@ -503,13 +506,12 @@ int32_t streamDispatch(SStreamTask* pTask) {
SStreamDataBlock
*
pBlock
=
streamQueueNextItem
(
pTask
->
outputQueue
);
SStreamDataBlock
*
pBlock
=
streamQueueNextItem
(
pTask
->
outputQueue
);
if
(
pBlock
==
NULL
)
{
if
(
pBlock
==
NULL
)
{
qDebug
(
"s
tream stop dispatching since no output: task %d"
,
pTask
->
taskId
);
qDebug
(
"s
-task:%s stream stop dispatching since no output in output queue"
,
pTask
->
id
.
idStr
);
atomic_store_8
(
&
pTask
->
outputStatus
,
TASK_OUTPUT_STATUS__NORMAL
);
atomic_store_8
(
&
pTask
->
outputStatus
,
TASK_OUTPUT_STATUS__NORMAL
);
return
0
;
return
0
;
}
}
ASSERT
(
pBlock
->
type
==
STREAM_INPUT__DATA_BLOCK
);
qDebug
(
"stream dispatching: task %d"
,
pTask
->
taskId
);
ASSERT
(
pBlock
->
type
==
STREAM_INPUT__DATA_BLOCK
);
int32_t
code
=
0
;
int32_t
code
=
0
;
if
(
streamDispatchAllBlocks
(
pTask
,
pBlock
)
<
0
)
{
if
(
streamDispatchAllBlocks
(
pTask
,
pBlock
)
<
0
)
{
...
@@ -518,6 +520,7 @@ int32_t streamDispatch(SStreamTask* pTask) {
...
@@ -518,6 +520,7 @@ int32_t streamDispatch(SStreamTask* pTask) {
atomic_store_8
(
&
pTask
->
outputStatus
,
TASK_OUTPUT_STATUS__NORMAL
);
atomic_store_8
(
&
pTask
->
outputStatus
,
TASK_OUTPUT_STATUS__NORMAL
);
goto
FREE
;
goto
FREE
;
}
}
FREE:
FREE:
taosArrayDestroyEx
(
pBlock
->
blocks
,
(
FDelete
)
blockDataFreeRes
);
taosArrayDestroyEx
(
pBlock
->
blocks
,
(
FDelete
)
blockDataFreeRes
);
taosFreeQitem
(
pBlock
);
taosFreeQitem
(
pBlock
);
...
...
source/libs/stream/src/streamExec.c
浏览文件 @
f37f4088
...
@@ -18,70 +18,82 @@
...
@@ -18,70 +18,82 @@
#define STREAM_EXEC_MAX_BATCH_NUM 100
#define STREAM_EXEC_MAX_BATCH_NUM 100
static
int32_t
streamTaskExecImpl
(
SStreamTask
*
pTask
,
const
void
*
data
,
SArray
*
pRes
)
{
static
int32_t
streamTaskExecImpl
(
SStreamTask
*
pTask
,
const
void
*
data
,
SArray
*
pRes
)
{
int32_t
code
;
int32_t
code
=
TSDB_CODE_SUCCESS
;
void
*
exec
=
pTask
->
exec
.
executor
;
void
*
pExecutor
=
pTask
->
exec
.
pExecutor
;
while
(
pTask
->
taskLevel
==
TASK_LEVEL__SOURCE
&&
atomic_load_8
(
&
pTask
->
taskStatus
)
!=
TASK_STATUS__NORMAL
)
{
qError
(
"stream task wait for the end of fill history"
);
while
(
pTask
->
taskLevel
==
TASK_LEVEL__SOURCE
)
{
taosMsleep
(
2
);
int8_t
status
=
atomic_load_8
(
&
pTask
->
status
.
taskStatus
);
continue
;
if
(
status
!=
TASK_STATUS__NORMAL
&&
status
!=
TASK_STATUS__RESTORE
)
{
qError
(
"stream task wait for the end of fill history, s-task:%s, status:%d"
,
pTask
->
id
.
idStr
,
atomic_load_8
(
&
pTask
->
status
.
taskStatus
));
taosMsleep
(
2
);
}
else
{
break
;
}
}
}
// set input
// set input
const
SStreamQueueItem
*
pItem
=
(
const
SStreamQueueItem
*
)
data
;
const
SStreamQueueItem
*
pItem
=
(
const
SStreamQueueItem
*
)
data
;
if
(
pItem
->
type
==
STREAM_INPUT__GET_RES
)
{
if
(
pItem
->
type
==
STREAM_INPUT__GET_RES
)
{
const
SStreamTrigger
*
pTrigger
=
(
const
SStreamTrigger
*
)
data
;
const
SStreamTrigger
*
pTrigger
=
(
const
SStreamTrigger
*
)
data
;
qSetMultiStreamInput
(
exec
,
pTrigger
->
pBlock
,
1
,
STREAM_INPUT__DATA_BLOCK
);
qSetMultiStreamInput
(
pExecutor
,
pTrigger
->
pBlock
,
1
,
STREAM_INPUT__DATA_BLOCK
);
}
else
if
(
pItem
->
type
==
STREAM_INPUT__DATA_SUBMIT
)
{
}
else
if
(
pItem
->
type
==
STREAM_INPUT__DATA_SUBMIT
)
{
ASSERT
(
pTask
->
taskLevel
==
TASK_LEVEL__SOURCE
);
ASSERT
(
pTask
->
taskLevel
==
TASK_LEVEL__SOURCE
);
const
SStreamDataSubmit2
*
pSubmit
=
(
const
SStreamDataSubmit2
*
)
data
;
const
SStreamDataSubmit2
*
pSubmit
=
(
const
SStreamDataSubmit2
*
)
data
;
qDebug
(
"stream task:%d %p set submit input %p %p %d %"
PRId64
,
pTask
->
taskId
,
pTask
,
pSubmit
,
pSubmit
->
submit
.
msgStr
,
qSetMultiStreamInput
(
pExecutor
,
&
pSubmit
->
submit
,
1
,
STREAM_INPUT__DATA_SUBMIT
);
qDebug
(
"s-task:%s set submit blocks as source block completed, %p %p len:%d ver:%"
PRId64
,
pTask
->
id
.
idStr
,
pSubmit
,
pSubmit
->
submit
.
msgStr
,
pSubmit
->
submit
.
msgLen
,
pSubmit
->
submit
.
ver
);
pSubmit
->
submit
.
msgLen
,
pSubmit
->
submit
.
ver
);
qSetMultiStreamInput
(
exec
,
&
pSubmit
->
submit
,
1
,
STREAM_INPUT__DATA_SUBMIT
);
}
else
if
(
pItem
->
type
==
STREAM_INPUT__DATA_BLOCK
||
pItem
->
type
==
STREAM_INPUT__DATA_RETRIEVE
)
{
}
else
if
(
pItem
->
type
==
STREAM_INPUT__DATA_BLOCK
||
pItem
->
type
==
STREAM_INPUT__DATA_RETRIEVE
)
{
const
SStreamDataBlock
*
pBlock
=
(
const
SStreamDataBlock
*
)
data
;
const
SStreamDataBlock
*
pBlock
=
(
const
SStreamDataBlock
*
)
data
;
SArray
*
blocks
=
pBlock
->
blocks
;
qDebug
(
"task %d %p set ssdata input"
,
pTask
->
taskId
,
pTask
);
SArray
*
pBlockList
=
pBlock
->
blocks
;
qSetMultiStreamInput
(
exec
,
blocks
->
pData
,
blocks
->
size
,
STREAM_INPUT__DATA_BLOCK
);
int32_t
numOfBlocks
=
taosArrayGetSize
(
pBlockList
);
qDebug
(
"s-task:%s set sdata blocks as input num:%d, ver:%"
PRId64
,
pTask
->
id
.
idStr
,
numOfBlocks
,
pBlock
->
sourceVer
);
qSetMultiStreamInput
(
pExecutor
,
pBlockList
->
pData
,
numOfBlocks
,
STREAM_INPUT__DATA_BLOCK
);
}
else
if
(
pItem
->
type
==
STREAM_INPUT__MERGED_SUBMIT
)
{
}
else
if
(
pItem
->
type
==
STREAM_INPUT__MERGED_SUBMIT
)
{
const
SStreamMergedSubmit2
*
pMerged
=
(
const
SStreamMergedSubmit2
*
)
data
;
const
SStreamMergedSubmit2
*
pMerged
=
(
const
SStreamMergedSubmit2
*
)
data
;
SArray
*
blocks
=
pMerged
->
submits
;
qDebug
(
"task %d %p set submit input (merged), batch num: %d"
,
pTask
->
taskId
,
pTask
,
(
int32_t
)
blocks
->
size
);
SArray
*
pBlockList
=
pMerged
->
submits
;
qSetMultiStreamInput
(
exec
,
blocks
->
pData
,
blocks
->
size
,
STREAM_INPUT__MERGED_SUBMIT
);
int32_t
numOfBlocks
=
taosArrayGetSize
(
pBlockList
);
qDebug
(
"st-task:%s %p set submit input (merged), batch num:%d"
,
pTask
->
id
.
idStr
,
pTask
,
numOfBlocks
);
qSetMultiStreamInput
(
pExecutor
,
pBlockList
->
pData
,
numOfBlocks
,
STREAM_INPUT__MERGED_SUBMIT
);
}
else
if
(
pItem
->
type
==
STREAM_INPUT__REF_DATA_BLOCK
)
{
}
else
if
(
pItem
->
type
==
STREAM_INPUT__REF_DATA_BLOCK
)
{
const
SStreamRefDataBlock
*
pRefBlock
=
(
const
SStreamRefDataBlock
*
)
data
;
const
SStreamRefDataBlock
*
pRefBlock
=
(
const
SStreamRefDataBlock
*
)
data
;
qSetMultiStreamInput
(
exec
,
pRefBlock
->
pBlock
,
1
,
STREAM_INPUT__DATA_BLOCK
);
qSetMultiStreamInput
(
pExecutor
,
pRefBlock
->
pBlock
,
1
,
STREAM_INPUT__DATA_BLOCK
);
}
else
{
}
else
{
ASSERT
(
0
);
ASSERT
(
0
);
}
}
//
exec
//
pExecutor
while
(
1
)
{
while
(
1
)
{
if
(
pTask
->
taskStatus
==
TASK_STATUS__DROPPING
)
{
if
(
pTask
->
status
.
taskStatus
==
TASK_STATUS__DROPPING
)
{
return
0
;
return
0
;
}
}
SSDataBlock
*
output
=
NULL
;
SSDataBlock
*
output
=
NULL
;
uint64_t
ts
=
0
;
uint64_t
ts
=
0
;
if
((
code
=
qExecTask
(
exec
,
&
output
,
&
ts
))
<
0
)
{
if
((
code
=
qExecTask
(
pExecutor
,
&
output
,
&
ts
))
<
0
)
{
if
(
code
==
TSDB_CODE_QRY_IN_EXEC
)
{
if
(
code
==
TSDB_CODE_QRY_IN_EXEC
)
{
resetTaskInfo
(
exec
);
resetTaskInfo
(
pExecutor
);
}
}
/*ASSERT(false);*/
qError
(
"unexpected stream execution, stream %"
PRId64
" task: %d, since %s"
,
pTask
->
streamId
,
pTask
->
taskId
,
qError
(
"unexpected stream execution, s-task:%s since %s"
,
pTask
->
id
.
idStr
,
terrstr
());
terrstr
());
continue
;
continue
;
}
}
if
(
output
==
NULL
)
{
if
(
output
==
NULL
)
{
if
(
pItem
->
type
==
STREAM_INPUT__DATA_RETRIEVE
)
{
if
(
pItem
->
type
==
STREAM_INPUT__DATA_RETRIEVE
)
{
SSDataBlock
block
=
{
0
};
SSDataBlock
block
=
{
0
};
const
SStreamDataBlock
*
pRetrieveBlock
=
(
const
SStreamDataBlock
*
)
data
;
const
SStreamDataBlock
*
pRetrieveBlock
=
(
const
SStreamDataBlock
*
)
data
;
ASSERT
(
taosArrayGetSize
(
pRetrieveBlock
->
blocks
)
==
1
);
ASSERT
(
taosArrayGetSize
(
pRetrieveBlock
->
blocks
)
==
1
);
assignOneDataBlock
(
&
block
,
taosArrayGet
(
pRetrieveBlock
->
blocks
,
0
));
assignOneDataBlock
(
&
block
,
taosArrayGet
(
pRetrieveBlock
->
blocks
,
0
));
block
.
info
.
type
=
STREAM_PULL_OVER
;
block
.
info
.
type
=
STREAM_PULL_OVER
;
block
.
info
.
childId
=
pTask
->
selfChildId
;
block
.
info
.
childId
=
pTask
->
selfChildId
;
taosArrayPush
(
pRes
,
&
block
);
taosArrayPush
(
pRes
,
&
block
);
qDebug
(
"task %d(child %d) processed retrieve, reqId %"
PRId64
,
pTask
->
taskId
,
pTask
->
selfChildId
,
qDebug
(
"task %d(child %d) processed retrieve, reqId %"
PRId64
,
pTask
->
id
.
taskId
,
pTask
->
selfChildId
,
pRetrieveBlock
->
reqId
);
pRetrieveBlock
->
reqId
);
}
}
break
;
break
;
...
@@ -94,20 +106,21 @@ static int32_t streamTaskExecImpl(SStreamTask* pTask, const void* data, SArray*
...
@@ -94,20 +106,21 @@ static int32_t streamTaskExecImpl(SStreamTask* pTask, const void* data, SArray*
continue
;
continue
;
}
}
qDebug
(
"task %d(child %d) executed and get block"
,
pTask
->
taskId
,
pTask
->
selfChildId
);
qDebug
(
"task %d(child %d) executed and get block"
,
pTask
->
id
.
taskId
,
pTask
->
selfChildId
);
SSDataBlock
block
=
{
0
};
SSDataBlock
block
=
{
0
};
assignOneDataBlock
(
&
block
,
output
);
assignOneDataBlock
(
&
block
,
output
);
block
.
info
.
childId
=
pTask
->
selfChildId
;
block
.
info
.
childId
=
pTask
->
selfChildId
;
taosArrayPush
(
pRes
,
&
block
);
taosArrayPush
(
pRes
,
&
block
);
}
}
return
0
;
return
0
;
}
}
int32_t
streamScanExec
(
SStreamTask
*
pTask
,
int32_t
batchSz
)
{
int32_t
streamScanExec
(
SStreamTask
*
pTask
,
int32_t
batchSz
)
{
ASSERT
(
pTask
->
taskLevel
==
TASK_LEVEL__SOURCE
);
ASSERT
(
pTask
->
taskLevel
==
TASK_LEVEL__SOURCE
);
void
*
exec
=
pTask
->
exec
.
e
xecutor
;
void
*
exec
=
pTask
->
exec
.
pE
xecutor
;
qSetStreamOpOpen
(
exec
);
qSetStreamOpOpen
(
exec
);
bool
finished
=
false
;
bool
finished
=
false
;
...
@@ -121,7 +134,7 @@ int32_t streamScanExec(SStreamTask* pTask, int32_t batchSz) {
...
@@ -121,7 +134,7 @@ int32_t streamScanExec(SStreamTask* pTask, int32_t batchSz) {
int32_t
batchCnt
=
0
;
int32_t
batchCnt
=
0
;
while
(
1
)
{
while
(
1
)
{
if
(
atomic_load_8
(
&
pTask
->
taskStatus
)
==
TASK_STATUS__DROPPING
)
{
if
(
atomic_load_8
(
&
pTask
->
status
.
taskStatus
)
==
TASK_STATUS__DROPPING
)
{
taosArrayDestroy
(
pRes
);
taosArrayDestroy
(
pRes
);
return
0
;
return
0
;
}
}
...
@@ -147,17 +160,17 @@ int32_t streamScanExec(SStreamTask* pTask, int32_t batchSz) {
...
@@ -147,17 +160,17 @@ int32_t streamScanExec(SStreamTask* pTask, int32_t batchSz) {
batchCnt
++
;
batchCnt
++
;
qDebug
(
"task %d scan exec block num %d, block limit %d"
,
pTask
->
taskId
,
batchCnt
,
batchSz
);
qDebug
(
"task %d scan exec block num %d, block limit %d"
,
pTask
->
id
.
taskId
,
batchCnt
,
batchSz
);
if
(
batchCnt
>=
batchSz
)
break
;
if
(
batchCnt
>=
batchSz
)
break
;
}
}
if
(
taosArrayGetSize
(
pRes
)
==
0
)
{
if
(
taosArrayGetSize
(
pRes
)
==
0
)
{
if
(
finished
)
{
if
(
finished
)
{
taosArrayDestroy
(
pRes
);
taosArrayDestroy
(
pRes
);
qDebug
(
"task %d finish recover exec task "
,
pTask
->
taskId
);
qDebug
(
"task %d finish recover exec task "
,
pTask
->
id
.
taskId
);
break
;
break
;
}
else
{
}
else
{
qDebug
(
"task %d continue recover exec task "
,
pTask
->
taskId
);
qDebug
(
"task %d continue recover exec task "
,
pTask
->
id
.
taskId
);
continue
;
continue
;
}
}
}
}
...
@@ -173,7 +186,7 @@ int32_t streamScanExec(SStreamTask* pTask, int32_t batchSz) {
...
@@ -173,7 +186,7 @@ int32_t streamScanExec(SStreamTask* pTask, int32_t batchSz) {
streamTaskOutput
(
pTask
,
qRes
);
streamTaskOutput
(
pTask
,
qRes
);
if
(
pTask
->
outputType
==
TASK_OUTPUT__FIXED_DISPATCH
||
pTask
->
outputType
==
TASK_OUTPUT__SHUFFLE_DISPATCH
)
{
if
(
pTask
->
outputType
==
TASK_OUTPUT__FIXED_DISPATCH
||
pTask
->
outputType
==
TASK_OUTPUT__SHUFFLE_DISPATCH
)
{
qDebug
(
"task %d scan exec dispatch block num %d"
,
pTask
->
taskId
,
batchCnt
);
qDebug
(
"task %d scan exec dispatch block num %d"
,
pTask
->
id
.
taskId
,
batchCnt
);
streamDispatch
(
pTask
);
streamDispatch
(
pTask
);
}
}
if
(
finished
)
break
;
if
(
finished
)
break
;
...
@@ -186,7 +199,7 @@ int32_t streamBatchExec(SStreamTask* pTask, int32_t batchLimit) {
...
@@ -186,7 +199,7 @@ int32_t streamBatchExec(SStreamTask* pTask, int32_t batchLimit) {
// fetch all queue item, merge according to batchLimit
// fetch all queue item, merge according to batchLimit
int32_t numOfItems = taosReadAllQitems(pTask->inputQueue1, pTask->inputQall);
int32_t numOfItems = taosReadAllQitems(pTask->inputQueue1, pTask->inputQall);
if (numOfItems == 0) {
if (numOfItems == 0) {
qDebug("task: %d, stream task exec over, queue empty", pTask->taskId);
qDebug("task: %d, stream task exec over, queue empty", pTask->
id.
taskId);
return 0;
return 0;
}
}
SStreamQueueItem* pMerged = NULL;
SStreamQueueItem* pMerged = NULL;
...
@@ -221,106 +234,141 @@ int32_t streamBatchExec(SStreamTask* pTask, int32_t batchLimit) {
...
@@ -221,106 +234,141 @@ int32_t streamBatchExec(SStreamTask* pTask, int32_t batchLimit) {
int32_t
streamExecForAll
(
SStreamTask
*
pTask
)
{
int32_t
streamExecForAll
(
SStreamTask
*
pTask
)
{
while
(
1
)
{
while
(
1
)
{
int32_t
batchCnt
=
1
;
int32_t
batchSize
=
1
;
void
*
input
=
NULL
;
void
*
pInput
=
NULL
;
// merge multiple input data if possible in the input queue.
while
(
1
)
{
while
(
1
)
{
SStreamQueueItem
*
qItem
=
streamQueueNextItem
(
pTask
->
inputQueue
);
SStreamQueueItem
*
qItem
=
streamQueueNextItem
(
pTask
->
inputQueue
);
if
(
qItem
==
NULL
)
{
if
(
qItem
==
NULL
)
{
qDebug
(
"stream task exec over, queue empty, task: %d"
,
pTask
->
taskId
);
// qDebug("s-task:%s extract data from input queue, queue is empty, abort", pTask->id.idStr
);
break
;
break
;
}
}
if
(
input
==
NULL
)
{
input
=
qItem
;
if
(
pInput
==
NULL
)
{
pInput
=
qItem
;
streamQueueProcessSuccess
(
pTask
->
inputQueue
);
streamQueueProcessSuccess
(
pTask
->
inputQueue
);
if
(
pTask
->
taskLevel
==
TASK_LEVEL__SINK
)
{
if
(
pTask
->
taskLevel
==
TASK_LEVEL__SINK
)
{
break
;
break
;
}
}
}
else
{
}
else
{
void
*
newRet
;
void
*
newRet
=
NULL
;
if
((
newRet
=
streamMergeQueueItem
(
i
nput
,
qItem
))
==
NULL
)
{
if
((
newRet
=
streamMergeQueueItem
(
pI
nput
,
qItem
))
==
NULL
)
{
streamQueueProcessFail
(
pTask
->
inputQueue
);
streamQueueProcessFail
(
pTask
->
inputQueue
);
break
;
break
;
}
else
{
}
else
{
batch
Cnt
++
;
batch
Size
++
;
i
nput
=
newRet
;
pI
nput
=
newRet
;
streamQueueProcessSuccess
(
pTask
->
inputQueue
);
streamQueueProcessSuccess
(
pTask
->
inputQueue
);
if
(
batch
Cnt
>
STREAM_EXEC_MAX_BATCH_NUM
)
{
if
(
batch
Size
>
STREAM_EXEC_MAX_BATCH_NUM
)
{
break
;
break
;
}
}
}
}
}
}
}
}
if
(
pTask
->
taskStatus
==
TASK_STATUS__DROPPING
)
{
if
(
pTask
->
status
.
taskStatus
==
TASK_STATUS__DROPPING
)
{
if
(
input
)
streamFreeQitem
(
input
);
if
(
pInput
)
{
streamFreeQitem
(
pInput
);
}
return
0
;
return
0
;
}
}
if
(
i
nput
==
NULL
)
{
if
(
pI
nput
==
NULL
)
{
break
;
break
;
}
}
if
(
pTask
->
taskLevel
==
TASK_LEVEL__SINK
)
{
if
(
pTask
->
taskLevel
==
TASK_LEVEL__SINK
)
{
ASSERT
(((
SStreamQueueItem
*
)
input
)
->
type
==
STREAM_INPUT__DATA_BLOCK
);
ASSERT
(((
SStreamQueueItem
*
)
pInput
)
->
type
==
STREAM_INPUT__DATA_BLOCK
);
streamTaskOutput
(
pTask
,
input
);
qDebug
(
"s-task:%s sink node start to sink result. numOfBlocks:%d"
,
pTask
->
id
.
idStr
,
batchSize
);
streamTaskOutput
(
pTask
,
pInput
);
continue
;
continue
;
}
}
SArray
*
pRes
=
taosArrayInit
(
0
,
sizeof
(
SSDataBlock
));
SArray
*
pRes
=
taosArrayInit
(
0
,
sizeof
(
SSDataBlock
));
qDebug
(
"s-task:%s exec begin, numOfBlocks:%d"
,
pTask
->
id
.
idStr
,
batchSize
);
streamTaskExecImpl
(
pTask
,
pInput
,
pRes
);
int64_t
ckId
=
0
;
int64_t
dataVer
=
0
;
qGetCheckpointVersion
(
pTask
->
exec
.
pExecutor
,
&
dataVer
,
&
ckId
);
if
(
dataVer
>
pTask
->
chkInfo
.
version
)
{
// save it since the checkpoint is updated
qDebug
(
"s-task:%s exec end, start to update check point, ver from %"
PRId64
" to %"
PRId64
", checkPoint id:%"
PRId64
" -> %"
PRId64
,
pTask
->
id
.
idStr
,
pTask
->
chkInfo
.
version
,
dataVer
,
pTask
->
chkInfo
.
id
,
ckId
);
qDebug
(
"stream task:%d exec begin, msg batch: %d"
,
pTask
->
taskId
,
batchCnt
);
pTask
->
chkInfo
=
(
SCheckpointInfo
)
{.
version
=
dataVer
,
.
id
=
ckId
};
streamTaskExecImpl
(
pTask
,
input
,
pRes
);
qDebug
(
"stream task:%d exec end"
,
pTask
->
taskId
);
taosWLockLatch
(
&
pTask
->
pMeta
->
lock
);
streamMetaSaveTask
(
pTask
->
pMeta
,
pTask
);
if
(
streamMetaCommit
(
pTask
->
pMeta
)
<
0
)
{
taosWUnLockLatch
(
&
pTask
->
pMeta
->
lock
);
qError
(
"s-task:%s failed to commit stream meta, since %s"
,
pTask
->
id
.
idStr
,
terrstr
());
return
-
1
;
}
else
{
taosWUnLockLatch
(
&
pTask
->
pMeta
->
lock
);
qDebug
(
"s-task:%s update checkpoint ver succeed"
,
pTask
->
id
.
idStr
);
}
}
else
{
qDebug
(
"s-task:%s exec end"
,
pTask
->
id
.
idStr
);
}
if
(
taosArrayGetSize
(
pRes
)
!=
0
)
{
if
(
taosArrayGetSize
(
pRes
)
!=
0
)
{
SStreamDataBlock
*
qRes
=
taosAllocateQitem
(
sizeof
(
SStreamDataBlock
),
DEF_QITEM
,
0
);
SStreamDataBlock
*
qRes
=
taosAllocateQitem
(
sizeof
(
SStreamDataBlock
),
DEF_QITEM
,
0
);
if
(
qRes
==
NULL
)
{
if
(
qRes
==
NULL
)
{
taosArrayDestroyEx
(
pRes
,
(
FDelete
)
blockDataFreeRes
);
taosArrayDestroyEx
(
pRes
,
(
FDelete
)
blockDataFreeRes
);
streamFreeQitem
(
i
nput
);
streamFreeQitem
(
pI
nput
);
return
-
1
;
return
-
1
;
}
}
qRes
->
type
=
STREAM_INPUT__DATA_BLOCK
;
qRes
->
type
=
STREAM_INPUT__DATA_BLOCK
;
qRes
->
blocks
=
pRes
;
qRes
->
blocks
=
pRes
;
if
(((
SStreamQueueItem
*
)
i
nput
)
->
type
==
STREAM_INPUT__DATA_SUBMIT
)
{
if
(((
SStreamQueueItem
*
)
pI
nput
)
->
type
==
STREAM_INPUT__DATA_SUBMIT
)
{
SStreamDataSubmit2
*
pSubmit
=
(
SStreamDataSubmit2
*
)
i
nput
;
SStreamDataSubmit2
*
pSubmit
=
(
SStreamDataSubmit2
*
)
pI
nput
;
qRes
->
childId
=
pTask
->
selfChildId
;
qRes
->
childId
=
pTask
->
selfChildId
;
qRes
->
sourceVer
=
pSubmit
->
ver
;
qRes
->
sourceVer
=
pSubmit
->
ver
;
}
else
if
(((
SStreamQueueItem
*
)
i
nput
)
->
type
==
STREAM_INPUT__MERGED_SUBMIT
)
{
}
else
if
(((
SStreamQueueItem
*
)
pI
nput
)
->
type
==
STREAM_INPUT__MERGED_SUBMIT
)
{
SStreamMergedSubmit2
*
pMerged
=
(
SStreamMergedSubmit2
*
)
i
nput
;
SStreamMergedSubmit2
*
pMerged
=
(
SStreamMergedSubmit2
*
)
pI
nput
;
qRes
->
childId
=
pTask
->
selfChildId
;
qRes
->
childId
=
pTask
->
selfChildId
;
qRes
->
sourceVer
=
pMerged
->
ver
;
qRes
->
sourceVer
=
pMerged
->
ver
;
}
}
if
(
streamTaskOutput
(
pTask
,
qRes
)
<
0
)
{
if
(
streamTaskOutput
(
pTask
,
qRes
)
<
0
)
{
taosArrayDestroyEx
(
pRes
,
(
FDelete
)
blockDataFreeRes
);
taosArrayDestroyEx
(
pRes
,
(
FDelete
)
blockDataFreeRes
);
streamFreeQitem
(
i
nput
);
streamFreeQitem
(
pI
nput
);
taosFreeQitem
(
qRes
);
taosFreeQitem
(
qRes
);
return
-
1
;
return
-
1
;
}
}
}
else
{
}
else
{
taosArrayDestroy
(
pRes
);
taosArrayDestroy
(
pRes
);
}
}
streamFreeQitem
(
i
nput
);
streamFreeQitem
(
pI
nput
);
}
}
return
0
;
return
0
;
}
}
int32_t
streamTryExec
(
SStreamTask
*
pTask
)
{
int32_t
streamTryExec
(
SStreamTask
*
pTask
)
{
// this function may be executed by multi-threads, so status check is required.
int8_t
schedStatus
=
int8_t
schedStatus
=
atomic_val_compare_exchange_8
(
&
pTask
->
schedStatus
,
TASK_SCHED_STATUS__WAITING
,
TASK_SCHED_STATUS__ACTIVE
);
atomic_val_compare_exchange_8
(
&
pTask
->
status
.
schedStatus
,
TASK_SCHED_STATUS__WAITING
,
TASK_SCHED_STATUS__ACTIVE
);
if
(
schedStatus
==
TASK_SCHED_STATUS__WAITING
)
{
if
(
schedStatus
==
TASK_SCHED_STATUS__WAITING
)
{
int32_t
code
=
streamExecForAll
(
pTask
);
int32_t
code
=
streamExecForAll
(
pTask
);
if
(
code
<
0
)
{
if
(
code
<
0
)
{
atomic_store_8
(
&
pTask
->
schedStatus
,
TASK_SCHED_STATUS__FAILED
);
atomic_store_8
(
&
pTask
->
s
tatus
.
s
chedStatus
,
TASK_SCHED_STATUS__FAILED
);
return
-
1
;
return
-
1
;
}
}
atomic_store_8
(
&
pTask
->
schedStatus
,
TASK_SCHED_STATUS__INACTIVE
);
// todo the task should be commit here
atomic_store_8
(
&
pTask
->
status
.
schedStatus
,
TASK_SCHED_STATUS__INACTIVE
);
qDebug
(
"s-task:%s exec completed"
,
pTask
->
id
.
idStr
);
if
(
!
taosQueueEmpty
(
pTask
->
inputQueue
->
queue
))
{
if
(
!
taosQueueEmpty
(
pTask
->
inputQueue
->
queue
))
{
streamSchedExec
(
pTask
);
streamSchedExec
(
pTask
);
}
}
}
}
return
0
;
return
0
;
}
}
source/libs/stream/src/streamMeta.c
浏览文件 @
f37f4088
...
@@ -24,6 +24,7 @@ SStreamMeta* streamMetaOpen(const char* path, void* ahandle, FTaskExpand expandF
...
@@ -24,6 +24,7 @@ SStreamMeta* streamMetaOpen(const char* path, void* ahandle, FTaskExpand expandF
terrno
=
TSDB_CODE_OUT_OF_MEMORY
;
terrno
=
TSDB_CODE_OUT_OF_MEMORY
;
return
NULL
;
return
NULL
;
}
}
int32_t
len
=
strlen
(
path
)
+
20
;
int32_t
len
=
strlen
(
path
)
+
20
;
char
*
streamPath
=
taosMemoryCalloc
(
1
,
len
);
char
*
streamPath
=
taosMemoryCalloc
(
1
,
len
);
sprintf
(
streamPath
,
"%s/%s"
,
path
,
"stream"
);
sprintf
(
streamPath
,
"%s/%s"
,
path
,
"stream"
);
...
@@ -50,7 +51,8 @@ SStreamMeta* streamMetaOpen(const char* path, void* ahandle, FTaskExpand expandF
...
@@ -50,7 +51,8 @@ SStreamMeta* streamMetaOpen(const char* path, void* ahandle, FTaskExpand expandF
goto
_err
;
goto
_err
;
}
}
pMeta
->
pTasks
=
taosHashInit
(
64
,
taosGetDefaultHashFunction
(
TSDB_DATA_TYPE_INT
),
true
,
HASH_ENTRY_LOCK
);
_hash_fn_t
fp
=
taosGetDefaultHashFunction
(
TSDB_DATA_TYPE_INT
);
pMeta
->
pTasks
=
taosHashInit
(
64
,
fp
,
true
,
HASH_ENTRY_LOCK
);
if
(
pMeta
->
pTasks
==
NULL
)
{
if
(
pMeta
->
pTasks
==
NULL
)
{
goto
_err
;
goto
_err
;
}
}
...
@@ -59,9 +61,10 @@ SStreamMeta* streamMetaOpen(const char* path, void* ahandle, FTaskExpand expandF
...
@@ -59,9 +61,10 @@ SStreamMeta* streamMetaOpen(const char* path, void* ahandle, FTaskExpand expandF
goto
_err
;
goto
_err
;
}
}
pMeta
->
vgId
=
vgId
;
pMeta
->
ahandle
=
ahandle
;
pMeta
->
ahandle
=
ahandle
;
pMeta
->
expandFunc
=
expandFunc
;
pMeta
->
expandFunc
=
expandFunc
;
taosInitRWLatch
(
&
pMeta
->
lock
);
return
pMeta
;
return
pMeta
;
_err:
_err:
...
@@ -81,19 +84,28 @@ void streamMetaClose(SStreamMeta* pMeta) {
...
@@ -81,19 +84,28 @@ void streamMetaClose(SStreamMeta* pMeta) {
tdbClose
(
pMeta
->
db
);
tdbClose
(
pMeta
->
db
);
void
*
pIter
=
NULL
;
void
*
pIter
=
NULL
;
// while(pMeta->walScan) {
// qDebug("wait stream daemon quit");
// taosMsleep(100);
// }
while
(
1
)
{
while
(
1
)
{
pIter
=
taosHashIterate
(
pMeta
->
pTasks
,
pIter
);
pIter
=
taosHashIterate
(
pMeta
->
pTasks
,
pIter
);
if
(
pIter
==
NULL
)
break
;
if
(
pIter
==
NULL
)
{
break
;
}
SStreamTask
*
pTask
=
*
(
SStreamTask
**
)
pIter
;
SStreamTask
*
pTask
=
*
(
SStreamTask
**
)
pIter
;
if
(
pTask
->
timer
)
{
if
(
pTask
->
timer
)
{
taosTmrStop
(
pTask
->
timer
);
taosTmrStop
(
pTask
->
timer
);
pTask
->
timer
=
NULL
;
pTask
->
timer
=
NULL
;
}
}
tFreeSStreamTask
(
pTask
);
tFreeStreamTask
(
pTask
);
/*streamMetaReleaseTask(pMeta, pTask);*/
/*streamMetaReleaseTask(pMeta, pTask);*/
}
}
taosHashCleanup
(
pMeta
->
pTasks
);
taosHashCleanup
(
pMeta
->
pTasks
);
taosHashCleanup
(
pMeta
->
pRecoverStatus
);
taosMemoryFree
(
pMeta
->
path
);
taosMemoryFree
(
pMeta
->
path
);
taosMemoryFree
(
pMeta
);
taosMemoryFree
(
pMeta
);
}
}
...
@@ -106,7 +118,7 @@ int32_t streamMetaAddSerializedTask(SStreamMeta* pMeta, int64_t ver, char* msg,
...
@@ -106,7 +118,7 @@ int32_t streamMetaAddSerializedTask(SStreamMeta* pMeta, int64_t ver, char* msg,
}
}
SDecoder decoder;
SDecoder decoder;
tDecoderInit(&decoder, (uint8_t*)msg, msgLen);
tDecoderInit(&decoder, (uint8_t*)msg, msgLen);
if (tDecodeS
S
treamTask(&decoder, pTask) < 0) {
if (tDecodeStreamTask(&decoder, pTask) < 0) {
tDecoderClear(&decoder);
tDecoderClear(&decoder);
goto FAIL;
goto FAIL;
}
}
...
@@ -117,12 +129,12 @@ int32_t streamMetaAddSerializedTask(SStreamMeta* pMeta, int64_t ver, char* msg,
...
@@ -117,12 +129,12 @@ int32_t streamMetaAddSerializedTask(SStreamMeta* pMeta, int64_t ver, char* msg,
goto FAIL;
goto FAIL;
}
}
if (taosHashPut(pMeta->pTasks, &pTask->taskId, sizeof(int32_t), &pTask, sizeof(void*)) < 0) {
if (taosHashPut(pMeta->pTasks, &pTask->
id.
taskId, sizeof(int32_t), &pTask, sizeof(void*)) < 0) {
goto FAIL;
goto FAIL;
}
}
if (tdbTbUpsert(pMeta->pTaskDb, &pTask->taskId, sizeof(int32_t), msg, msgLen, pMeta->txn) < 0) {
if (tdbTbUpsert(pMeta->pTaskDb, &pTask->
id.
taskId, sizeof(int32_t), msg, msgLen, pMeta->txn) < 0) {
taosHashRemove(pMeta->pTasks, &pTask->taskId, sizeof(int32_t));
taosHashRemove(pMeta->pTasks, &pTask->
id.
taskId, sizeof(int32_t));
ASSERT(0);
ASSERT(0);
goto FAIL;
goto FAIL;
}
}
...
@@ -130,7 +142,7 @@ int32_t streamMetaAddSerializedTask(SStreamMeta* pMeta, int64_t ver, char* msg,
...
@@ -130,7 +142,7 @@ int32_t streamMetaAddSerializedTask(SStreamMeta* pMeta, int64_t ver, char* msg,
return 0;
return 0;
FAIL:
FAIL:
if (pTask) tFreeS
S
treamTask(pTask);
if (pTask) tFreeStreamTask(pTask);
return -1;
return -1;
}
}
#endif
#endif
...
@@ -139,7 +151,7 @@ int32_t streamMetaSaveTask(SStreamMeta* pMeta, SStreamTask* pTask) {
...
@@ -139,7 +151,7 @@ int32_t streamMetaSaveTask(SStreamMeta* pMeta, SStreamTask* pTask) {
void
*
buf
=
NULL
;
void
*
buf
=
NULL
;
int32_t
len
;
int32_t
len
;
int32_t
code
;
int32_t
code
;
tEncodeSize
(
tEncodeS
S
treamTask
,
pTask
,
len
,
code
);
tEncodeSize
(
tEncodeStreamTask
,
pTask
,
len
,
code
);
if
(
code
<
0
)
{
if
(
code
<
0
)
{
return
-
1
;
return
-
1
;
}
}
...
@@ -150,10 +162,10 @@ int32_t streamMetaSaveTask(SStreamMeta* pMeta, SStreamTask* pTask) {
...
@@ -150,10 +162,10 @@ int32_t streamMetaSaveTask(SStreamMeta* pMeta, SStreamTask* pTask) {
SEncoder
encoder
=
{
0
};
SEncoder
encoder
=
{
0
};
tEncoderInit
(
&
encoder
,
buf
,
len
);
tEncoderInit
(
&
encoder
,
buf
,
len
);
tEncodeS
S
treamTask
(
&
encoder
,
pTask
);
tEncodeStreamTask
(
&
encoder
,
pTask
);
tEncoderClear
(
&
encoder
);
tEncoderClear
(
&
encoder
);
if
(
tdbTbUpsert
(
pMeta
->
pTaskDb
,
&
pTask
->
taskId
,
sizeof
(
int32_t
),
buf
,
len
,
pMeta
->
txn
)
<
0
)
{
if
(
tdbTbUpsert
(
pMeta
->
pTaskDb
,
&
pTask
->
id
.
taskId
,
sizeof
(
int32_t
),
buf
,
len
,
pMeta
->
txn
)
<
0
)
{
return
-
1
;
return
-
1
;
}
}
...
@@ -161,8 +173,8 @@ int32_t streamMetaSaveTask(SStreamMeta* pMeta, SStreamTask* pTask) {
...
@@ -161,8 +173,8 @@ int32_t streamMetaSaveTask(SStreamMeta* pMeta, SStreamTask* pTask) {
return
0
;
return
0
;
}
}
#if 1
// add to the ready tasks hash map, not the restored tasks hash map
int32_t
streamMetaAddTask
(
SStreamMeta
*
pMeta
,
int64_t
ver
,
SStreamTask
*
pTask
)
{
int32_t
streamMetaAdd
Deployed
Task
(
SStreamMeta
*
pMeta
,
int64_t
ver
,
SStreamTask
*
pTask
)
{
if
(
pMeta
->
expandFunc
(
pMeta
->
ahandle
,
pTask
,
ver
)
<
0
)
{
if
(
pMeta
->
expandFunc
(
pMeta
->
ahandle
,
pTask
,
ver
)
<
0
)
{
return
-
1
;
return
-
1
;
}
}
...
@@ -171,39 +183,24 @@ int32_t streamMetaAddTask(SStreamMeta* pMeta, int64_t ver, SStreamTask* pTask) {
...
@@ -171,39 +183,24 @@ int32_t streamMetaAddTask(SStreamMeta* pMeta, int64_t ver, SStreamTask* pTask) {
return
-
1
;
return
-
1
;
}
}
taosHashPut
(
pMeta
->
pTasks
,
&
pTask
->
taskId
,
sizeof
(
int32_t
),
&
pTask
,
sizeof
(
void
*
));
taosHashPut
(
pMeta
->
pTasks
,
&
pTask
->
id
.
taskId
,
sizeof
(
int32_t
),
&
pTask
,
POINTER_BYTES
);
return
0
;
return
0
;
}
}
#endif
#if 0
int32_t
streamMetaGetNumOfTasks
(
const
SStreamMeta
*
pMeta
)
{
SStreamTask* streamMetaGetTask(SStreamMeta* pMeta, int32_t taskId) {
return
(
int32_t
)
taosHashGetSize
(
pMeta
->
pTasks
);
SStreamTask** ppTask = (SStreamTask**)taosHashGet(pMeta->pTasks, &taskId, sizeof(int32_t));
if (ppTask) {
ASSERT((*ppTask)->taskId == taskId);
return *ppTask;
} else {
return NULL;
}
}
}
#endif
SStreamTask
*
streamMetaAcquireTask
(
SStreamMeta
*
pMeta
,
int32_t
taskId
)
{
SStreamTask
*
streamMetaAcquireTask
(
SStreamMeta
*
pMeta
,
int32_t
taskId
)
{
taosRLockLatch
(
&
pMeta
->
lock
);
taosRLockLatch
(
&
pMeta
->
lock
);
SStreamTask
**
ppTask
=
(
SStreamTask
**
)
taosHashGet
(
pMeta
->
pTasks
,
&
taskId
,
sizeof
(
int32_t
));
SStreamTask
**
ppTask
=
(
SStreamTask
**
)
taosHashGet
(
pMeta
->
pTasks
,
&
taskId
,
sizeof
(
int32_t
));
if
(
ppTask
)
{
if
(
ppTask
!=
NULL
&&
(
atomic_load_8
(
&
((
*
ppTask
)
->
status
.
taskStatus
))
!=
TASK_STATUS__DROPPING
))
{
SStreamTask
*
pTask
=
*
ppTask
;
atomic_add_fetch_32
(
&
(
*
ppTask
)
->
refCnt
,
1
);
if
(
atomic_load_8
(
&
pTask
->
taskStatus
)
!=
TASK_STATUS__DROPPING
)
{
taosRUnLockLatch
(
&
pMeta
->
lock
);
atomic_add_fetch_32
(
&
pTask
->
refCnt
,
1
);
return
*
ppTask
;
taosRUnLockLatch
(
&
pMeta
->
lock
);
return
pTask
;
}
else
{
taosRUnLockLatch
(
&
pMeta
->
lock
);
return
NULL
;
}
}
}
taosRUnLockLatch
(
&
pMeta
->
lock
);
taosRUnLockLatch
(
&
pMeta
->
lock
);
return
NULL
;
return
NULL
;
}
}
...
@@ -212,8 +209,8 @@ void streamMetaReleaseTask(SStreamMeta* pMeta, SStreamTask* pTask) {
...
@@ -212,8 +209,8 @@ void streamMetaReleaseTask(SStreamMeta* pMeta, SStreamTask* pTask) {
int32_t
left
=
atomic_sub_fetch_32
(
&
pTask
->
refCnt
,
1
);
int32_t
left
=
atomic_sub_fetch_32
(
&
pTask
->
refCnt
,
1
);
ASSERT
(
left
>=
0
);
ASSERT
(
left
>=
0
);
if
(
left
==
0
)
{
if
(
left
==
0
)
{
ASSERT
(
atomic_load_8
(
&
pTask
->
taskStatus
)
==
TASK_STATUS__DROPPING
);
ASSERT
(
atomic_load_8
(
&
pTask
->
status
.
taskStatus
)
==
TASK_STATUS__DROPPING
);
tFreeS
S
treamTask
(
pTask
);
tFreeStreamTask
(
pTask
);
}
}
}
}
...
@@ -227,7 +224,7 @@ void streamMetaRemoveTask(SStreamMeta* pMeta, int32_t taskId) {
...
@@ -227,7 +224,7 @@ void streamMetaRemoveTask(SStreamMeta* pMeta, int32_t taskId) {
* taosTmrStop(pTask->timer);*/
* taosTmrStop(pTask->timer);*/
/*pTask->timer = NULL;*/
/*pTask->timer = NULL;*/
/*}*/
/*}*/
atomic_store_8
(
&
pTask
->
taskStatus
,
TASK_STATUS__DROPPING
);
atomic_store_8
(
&
pTask
->
status
.
taskStatus
,
TASK_STATUS__DROPPING
);
taosWLockLatch
(
&
pMeta
->
lock
);
taosWLockLatch
(
&
pMeta
->
lock
);
streamMetaReleaseTask
(
pMeta
,
pTask
);
streamMetaReleaseTask
(
pMeta
,
pTask
);
...
@@ -245,9 +242,12 @@ int32_t streamMetaBegin(SStreamMeta* pMeta) {
...
@@ -245,9 +242,12 @@ int32_t streamMetaBegin(SStreamMeta* pMeta) {
int32_t
streamMetaCommit
(
SStreamMeta
*
pMeta
)
{
int32_t
streamMetaCommit
(
SStreamMeta
*
pMeta
)
{
if
(
tdbCommit
(
pMeta
->
db
,
pMeta
->
txn
)
<
0
)
{
if
(
tdbCommit
(
pMeta
->
db
,
pMeta
->
txn
)
<
0
)
{
ASSERT
(
0
);
return
-
1
;
return
-
1
;
}
}
if
(
tdbPostCommit
(
pMeta
->
db
,
pMeta
->
txn
)
<
0
)
{
if
(
tdbPostCommit
(
pMeta
->
db
,
pMeta
->
txn
)
<
0
)
{
ASSERT
(
0
);
return
-
1
;
return
-
1
;
}
}
...
@@ -293,25 +293,27 @@ int32_t streamLoadTasks(SStreamMeta* pMeta, int64_t ver) {
...
@@ -293,25 +293,27 @@ int32_t streamLoadTasks(SStreamMeta* pMeta, int64_t ver) {
return
-
1
;
return
-
1
;
}
}
tDecoderInit
(
&
decoder
,
(
uint8_t
*
)
pVal
,
vLen
);
tDecoderInit
(
&
decoder
,
(
uint8_t
*
)
pVal
,
vLen
);
tDecodeS
S
treamTask
(
&
decoder
,
pTask
);
tDecodeStreamTask
(
&
decoder
,
pTask
);
tDecoderClear
(
&
decoder
);
tDecoderClear
(
&
decoder
);
if
(
pMeta
->
expandFunc
(
pMeta
->
ahandle
,
pTask
,
-
1
)
<
0
)
{
// todo set correct initial version.
if
(
pMeta
->
expandFunc
(
pMeta
->
ahandle
,
pTask
,
0
)
<
0
)
{
tdbFree
(
pKey
);
tdbFree
(
pKey
);
tdbFree
(
pVal
);
tdbFree
(
pVal
);
tdbTbcClose
(
pCur
);
tdbTbcClose
(
pCur
);
return
-
1
;
return
-
1
;
}
}
if
(
taosHashPut
(
pMeta
->
pTasks
,
&
pTask
->
taskId
,
sizeof
(
int32_t
),
&
pTask
,
sizeof
(
void
*
))
<
0
)
{
if
(
taosHashPut
(
pMeta
->
pTasks
,
&
pTask
->
id
.
taskId
,
sizeof
(
int32_t
),
&
pTask
,
sizeof
(
void
*
))
<
0
)
{
tdbFree
(
pKey
);
tdbFree
(
pKey
);
tdbFree
(
pVal
);
tdbFree
(
pVal
);
tdbTbcClose
(
pCur
);
tdbTbcClose
(
pCur
);
return
-
1
;
return
-
1
;
}
}
/*pTask->taskStatus = TASK_STATUS__NORMAL;*/
/*pTask->status.taskStatus = TASK_STATUS__NORMAL;*/
if
(
pTask
->
fillHistory
)
{
if
(
pTask
->
fillHistory
)
{
pTask
->
taskStatus
=
TASK_STATUS__WAIT_DOWNSTREAM
;
pTask
->
status
.
taskStatus
=
TASK_STATUS__WAIT_DOWNSTREAM
;
streamTaskCheckDownstream
(
pTask
,
ver
);
streamTaskCheckDownstream
(
pTask
,
ver
);
}
}
}
}
...
...
source/libs/stream/src/streamRecover.c
浏览文件 @
f37f4088
...
@@ -16,9 +16,10 @@
...
@@ -16,9 +16,10 @@
#include "streamInc.h"
#include "streamInc.h"
int32_t
streamTaskLaunchRecover
(
SStreamTask
*
pTask
,
int64_t
version
)
{
int32_t
streamTaskLaunchRecover
(
SStreamTask
*
pTask
,
int64_t
version
)
{
qDebug
(
"task %d at node %d launch recover"
,
pTask
->
taskId
,
pTask
->
nodeId
);
qDebug
(
"s-task:%s at node %d launch recover"
,
pTask
->
id
.
idStr
,
pTask
->
nodeId
);
if
(
pTask
->
taskLevel
==
TASK_LEVEL__SOURCE
)
{
if
(
pTask
->
taskLevel
==
TASK_LEVEL__SOURCE
)
{
atomic_store_8
(
&
pTask
->
taskStatus
,
TASK_STATUS__RECOVER_PREPARE
);
atomic_store_8
(
&
pTask
->
status
.
taskStatus
,
TASK_STATUS__RECOVER_PREPARE
);
streamSetParamForRecover
(
pTask
);
streamSetParamForRecover
(
pTask
);
streamSourceRecoverPrepareStep1
(
pTask
,
version
);
streamSourceRecoverPrepareStep1
(
pTask
,
version
);
...
@@ -33,34 +34,31 @@ int32_t streamTaskLaunchRecover(SStreamTask* pTask, int64_t version) {
...
@@ -33,34 +34,31 @@ int32_t streamTaskLaunchRecover(SStreamTask* pTask, int64_t version) {
memcpy
(
serializedReq
,
&
req
,
len
);
memcpy
(
serializedReq
,
&
req
,
len
);
SRpcMsg
rpcMsg
=
{
SRpcMsg
rpcMsg
=
{
.
contLen
=
len
,
.
pCont
=
serializedReq
,
.
msgType
=
TDMT_VND_STREAM_RECOVER_NONBLOCKING_STAGE
};
.
contLen
=
len
,
.
pCont
=
serializedReq
,
.
msgType
=
TDMT_VND_STREAM_RECOVER_NONBLOCKING_STAGE
,
};
if
(
tmsgPutToQueue
(
pTask
->
pMsgCb
,
STREAM_QUEUE
,
&
rpcMsg
)
<
0
)
{
if
(
tmsgPutToQueue
(
pTask
->
pMsgCb
,
STREAM_QUEUE
,
&
rpcMsg
)
<
0
)
{
/*ASSERT(0);*/
/*ASSERT(0);*/
}
}
}
else
if
(
pTask
->
taskLevel
==
TASK_LEVEL__AGG
)
{
}
else
if
(
pTask
->
taskLevel
==
TASK_LEVEL__AGG
)
{
atomic_store_8
(
&
pTask
->
taskStatus
,
TASK_STATUS__NORMAL
);
atomic_store_8
(
&
pTask
->
status
.
taskStatus
,
TASK_STATUS__NORMAL
);
streamSetParamForRecover
(
pTask
);
streamSetParamForRecover
(
pTask
);
streamAggRecoverPrepare
(
pTask
);
streamAggRecoverPrepare
(
pTask
);
}
else
if
(
pTask
->
taskLevel
==
TASK_LEVEL__SINK
)
{
}
else
if
(
pTask
->
taskLevel
==
TASK_LEVEL__SINK
)
{
atomic_store_8
(
&
pTask
->
taskStatus
,
TASK_STATUS__NORMAL
);
atomic_store_8
(
&
pTask
->
status
.
taskStatus
,
TASK_STATUS__NORMAL
);
}
}
return
0
;
return
0
;
}
}
// checkstatus
// checkstatus
int32_t
streamTaskCheckDownstream
(
SStreamTask
*
pTask
,
int64_t
version
)
{
int32_t
streamTaskCheckDownstream
(
SStreamTask
*
pTask
,
int64_t
version
)
{
SStreamTaskCheckReq
req
=
{
SStreamTaskCheckReq
req
=
{
.
streamId
=
pTask
->
streamId
,
.
streamId
=
pTask
->
id
.
streamId
,
.
upstreamTaskId
=
pTask
->
taskId
,
.
upstreamTaskId
=
pTask
->
id
.
taskId
,
.
upstreamNodeId
=
pTask
->
nodeId
,
.
upstreamNodeId
=
pTask
->
nodeId
,
.
childId
=
pTask
->
selfChildId
,
.
childId
=
pTask
->
selfChildId
,
};
};
// serialize
// serialize
if
(
pTask
->
outputType
==
TASK_OUTPUT__FIXED_DISPATCH
)
{
if
(
pTask
->
outputType
==
TASK_OUTPUT__FIXED_DISPATCH
)
{
req
.
reqId
=
tGenIdPI64
();
req
.
reqId
=
tGenIdPI64
();
...
@@ -68,7 +66,7 @@ int32_t streamTaskCheckDownstream(SStreamTask* pTask, int64_t version) {
...
@@ -68,7 +66,7 @@ int32_t streamTaskCheckDownstream(SStreamTask* pTask, int64_t version) {
req
.
downstreamTaskId
=
pTask
->
fixedEpDispatcher
.
taskId
;
req
.
downstreamTaskId
=
pTask
->
fixedEpDispatcher
.
taskId
;
pTask
->
checkReqId
=
req
.
reqId
;
pTask
->
checkReqId
=
req
.
reqId
;
qDebug
(
"task %d at node %d check downstream task %d at node %d"
,
pTask
->
taskId
,
pTask
->
nodeId
,
req
.
downstreamTaskId
,
qDebug
(
"task %d at node %d check downstream task %d at node %d"
,
pTask
->
id
.
taskId
,
pTask
->
nodeId
,
req
.
downstreamTaskId
,
req
.
downstreamNodeId
);
req
.
downstreamNodeId
);
streamDispatchOneCheckReq
(
pTask
,
&
req
,
pTask
->
fixedEpDispatcher
.
nodeId
,
&
pTask
->
fixedEpDispatcher
.
epSet
);
streamDispatchOneCheckReq
(
pTask
,
&
req
,
pTask
->
fixedEpDispatcher
.
nodeId
,
&
pTask
->
fixedEpDispatcher
.
epSet
);
}
else
if
(
pTask
->
outputType
==
TASK_OUTPUT__SHUFFLE_DISPATCH
)
{
}
else
if
(
pTask
->
outputType
==
TASK_OUTPUT__SHUFFLE_DISPATCH
)
{
...
@@ -83,12 +81,12 @@ int32_t streamTaskCheckDownstream(SStreamTask* pTask, int64_t version) {
...
@@ -83,12 +81,12 @@ int32_t streamTaskCheckDownstream(SStreamTask* pTask, int64_t version) {
taosArrayPush
(
pTask
->
checkReqIds
,
&
req
.
reqId
);
taosArrayPush
(
pTask
->
checkReqIds
,
&
req
.
reqId
);
req
.
downstreamNodeId
=
pVgInfo
->
vgId
;
req
.
downstreamNodeId
=
pVgInfo
->
vgId
;
req
.
downstreamTaskId
=
pVgInfo
->
taskId
;
req
.
downstreamTaskId
=
pVgInfo
->
taskId
;
qDebug
(
"task %d at node %d check downstream task %d at node %d (shuffle)"
,
pTask
->
taskId
,
pTask
->
nodeId
,
qDebug
(
"task %d at node %d check downstream task %d at node %d (shuffle)"
,
pTask
->
id
.
taskId
,
pTask
->
nodeId
,
req
.
downstreamTaskId
,
req
.
downstreamNodeId
);
req
.
downstreamTaskId
,
req
.
downstreamNodeId
);
streamDispatchOneCheckReq
(
pTask
,
&
req
,
pVgInfo
->
vgId
,
&
pVgInfo
->
epSet
);
streamDispatchOneCheckReq
(
pTask
,
&
req
,
pVgInfo
->
vgId
,
&
pVgInfo
->
epSet
);
}
}
}
else
{
}
else
{
qDebug
(
"task %d at node %d direct launch recover since no downstream"
,
pTask
->
taskId
,
pTask
->
nodeId
);
qDebug
(
"task %d at node %d direct launch recover since no downstream"
,
pTask
->
id
.
taskId
,
pTask
->
nodeId
);
streamTaskLaunchRecover
(
pTask
,
version
);
streamTaskLaunchRecover
(
pTask
,
version
);
}
}
return
0
;
return
0
;
...
@@ -104,7 +102,7 @@ int32_t streamRecheckOneDownstream(SStreamTask* pTask, const SStreamTaskCheckRsp
...
@@ -104,7 +102,7 @@ int32_t streamRecheckOneDownstream(SStreamTask* pTask, const SStreamTaskCheckRsp
.
downstreamNodeId
=
pRsp
->
downstreamNodeId
,
.
downstreamNodeId
=
pRsp
->
downstreamNodeId
,
.
childId
=
pRsp
->
childId
,
.
childId
=
pRsp
->
childId
,
};
};
qDebug
(
"task %d at node %d check downstream task %d at node %d (recheck)"
,
pTask
->
taskId
,
pTask
->
nodeId
,
qDebug
(
"task %d at node %d check downstream task %d at node %d (recheck)"
,
pTask
->
id
.
taskId
,
pTask
->
nodeId
,
req
.
downstreamTaskId
,
req
.
downstreamNodeId
);
req
.
downstreamTaskId
,
req
.
downstreamNodeId
);
if
(
pTask
->
outputType
==
TASK_OUTPUT__FIXED_DISPATCH
)
{
if
(
pTask
->
outputType
==
TASK_OUTPUT__FIXED_DISPATCH
)
{
streamDispatchOneCheckReq
(
pTask
,
&
req
,
pRsp
->
downstreamNodeId
,
&
pTask
->
fixedEpDispatcher
.
epSet
);
streamDispatchOneCheckReq
(
pTask
,
&
req
,
pRsp
->
downstreamNodeId
,
&
pTask
->
fixedEpDispatcher
.
epSet
);
...
@@ -122,12 +120,13 @@ int32_t streamRecheckOneDownstream(SStreamTask* pTask, const SStreamTaskCheckRsp
...
@@ -122,12 +120,13 @@ int32_t streamRecheckOneDownstream(SStreamTask* pTask, const SStreamTaskCheckRsp
}
}
int32_t
streamProcessTaskCheckReq
(
SStreamTask
*
pTask
,
const
SStreamTaskCheckReq
*
pReq
)
{
int32_t
streamProcessTaskCheckReq
(
SStreamTask
*
pTask
,
const
SStreamTaskCheckReq
*
pReq
)
{
return
atomic_load_8
(
&
pTask
->
taskStatus
)
==
TASK_STATUS__NORMAL
;
return
atomic_load_8
(
&
pTask
->
status
.
taskStatus
)
==
TASK_STATUS__NORMAL
;
}
}
int32_t
streamProcessTaskCheckRsp
(
SStreamTask
*
pTask
,
const
SStreamTaskCheckRsp
*
pRsp
,
int64_t
version
)
{
int32_t
streamProcessTaskCheckRsp
(
SStreamTask
*
pTask
,
const
SStreamTaskCheckRsp
*
pRsp
,
int64_t
version
)
{
qDebug
(
"task %d at node %d recv check rsp from task %d at node %d: status %d"
,
pRsp
->
upstreamTaskId
,
qDebug
(
"task %d at node %d recv check rsp from task %d at node %d: status %d"
,
pRsp
->
upstreamTaskId
,
pRsp
->
upstreamNodeId
,
pRsp
->
downstreamTaskId
,
pRsp
->
downstreamNodeId
,
pRsp
->
status
);
pRsp
->
upstreamNodeId
,
pRsp
->
downstreamTaskId
,
pRsp
->
downstreamNodeId
,
pRsp
->
status
);
if
(
pRsp
->
status
==
1
)
{
if
(
pRsp
->
status
==
1
)
{
if
(
pTask
->
outputType
==
TASK_OUTPUT__SHUFFLE_DISPATCH
)
{
if
(
pTask
->
outputType
==
TASK_OUTPUT__SHUFFLE_DISPATCH
)
{
bool
found
=
false
;
bool
found
=
false
;
...
@@ -138,7 +137,11 @@ int32_t streamProcessTaskCheckRsp(SStreamTask* pTask, const SStreamTaskCheckRsp*
...
@@ -138,7 +137,11 @@ int32_t streamProcessTaskCheckRsp(SStreamTask* pTask, const SStreamTaskCheckRsp*
break
;
break
;
}
}
}
}
if
(
!
found
)
return
-
1
;
if
(
!
found
)
{
return
-
1
;
}
int32_t
left
=
atomic_sub_fetch_32
(
&
pTask
->
recoverTryingDownstream
,
1
);
int32_t
left
=
atomic_sub_fetch_32
(
&
pTask
->
recoverTryingDownstream
,
1
);
ASSERT
(
left
>=
0
);
ASSERT
(
left
>=
0
);
if
(
left
==
0
)
{
if
(
left
==
0
)
{
...
@@ -147,7 +150,10 @@ int32_t streamProcessTaskCheckRsp(SStreamTask* pTask, const SStreamTaskCheckRsp*
...
@@ -147,7 +150,10 @@ int32_t streamProcessTaskCheckRsp(SStreamTask* pTask, const SStreamTaskCheckRsp*
streamTaskLaunchRecover
(
pTask
,
version
);
streamTaskLaunchRecover
(
pTask
,
version
);
}
}
}
else
if
(
pTask
->
outputType
==
TASK_OUTPUT__FIXED_DISPATCH
)
{
}
else
if
(
pTask
->
outputType
==
TASK_OUTPUT__FIXED_DISPATCH
)
{
if
(
pRsp
->
reqId
!=
pTask
->
checkReqId
)
return
-
1
;
if
(
pRsp
->
reqId
!=
pTask
->
checkReqId
)
{
return
-
1
;
}
streamTaskLaunchRecover
(
pTask
,
version
);
streamTaskLaunchRecover
(
pTask
,
version
);
}
else
{
}
else
{
ASSERT
(
0
);
ASSERT
(
0
);
...
@@ -160,28 +166,29 @@ int32_t streamProcessTaskCheckRsp(SStreamTask* pTask, const SStreamTaskCheckRsp*
...
@@ -160,28 +166,29 @@ int32_t streamProcessTaskCheckRsp(SStreamTask* pTask, const SStreamTaskCheckRsp*
// common
// common
int32_t
streamSetParamForRecover
(
SStreamTask
*
pTask
)
{
int32_t
streamSetParamForRecover
(
SStreamTask
*
pTask
)
{
void
*
exec
=
pTask
->
exec
.
e
xecutor
;
void
*
exec
=
pTask
->
exec
.
pE
xecutor
;
return
qStreamSetParamForRecover
(
exec
);
return
qStreamSetParamForRecover
(
exec
);
}
}
int32_t
streamRestoreParam
(
SStreamTask
*
pTask
)
{
int32_t
streamRestoreParam
(
SStreamTask
*
pTask
)
{
void
*
exec
=
pTask
->
exec
.
e
xecutor
;
void
*
exec
=
pTask
->
exec
.
pE
xecutor
;
return
qStreamRestoreParam
(
exec
);
return
qStreamRestoreParam
(
exec
);
}
}
int32_t
streamSetStatusNormal
(
SStreamTask
*
pTask
)
{
int32_t
streamSetStatusNormal
(
SStreamTask
*
pTask
)
{
atomic_store_8
(
&
pTask
->
taskStatus
,
TASK_STATUS__NORMAL
);
atomic_store_8
(
&
pTask
->
status
.
taskStatus
,
TASK_STATUS__NORMAL
);
return
0
;
return
0
;
}
}
// source
// source
int32_t
streamSourceRecoverPrepareStep1
(
SStreamTask
*
pTask
,
int64_t
ver
)
{
int32_t
streamSourceRecoverPrepareStep1
(
SStreamTask
*
pTask
,
int64_t
ver
)
{
void
*
exec
=
pTask
->
exec
.
e
xecutor
;
void
*
exec
=
pTask
->
exec
.
pE
xecutor
;
return
qStreamSourceRecoverStep1
(
exec
,
ver
);
return
qStreamSourceRecoverStep1
(
exec
,
ver
);
}
}
int32_t
streamBuildSourceRecover1Req
(
SStreamTask
*
pTask
,
SStreamRecoverStep1Req
*
pReq
)
{
int32_t
streamBuildSourceRecover1Req
(
SStreamTask
*
pTask
,
SStreamRecoverStep1Req
*
pReq
)
{
pReq
->
msgHead
.
vgId
=
pTask
->
nodeId
;
pReq
->
msgHead
.
vgId
=
pTask
->
nodeId
;
pReq
->
streamId
=
pTask
->
streamId
;
pReq
->
streamId
=
pTask
->
id
.
streamId
;
pReq
->
taskId
=
pTask
->
taskId
;
pReq
->
taskId
=
pTask
->
id
.
taskId
;
return
0
;
return
0
;
}
}
...
@@ -192,13 +199,13 @@ int32_t streamSourceRecoverScanStep1(SStreamTask* pTask) {
...
@@ -192,13 +199,13 @@ int32_t streamSourceRecoverScanStep1(SStreamTask* pTask) {
int32_t
streamBuildSourceRecover2Req
(
SStreamTask
*
pTask
,
SStreamRecoverStep2Req
*
pReq
)
{
int32_t
streamBuildSourceRecover2Req
(
SStreamTask
*
pTask
,
SStreamRecoverStep2Req
*
pReq
)
{
pReq
->
msgHead
.
vgId
=
pTask
->
nodeId
;
pReq
->
msgHead
.
vgId
=
pTask
->
nodeId
;
pReq
->
streamId
=
pTask
->
streamId
;
pReq
->
streamId
=
pTask
->
id
.
streamId
;
pReq
->
taskId
=
pTask
->
taskId
;
pReq
->
taskId
=
pTask
->
id
.
taskId
;
return
0
;
return
0
;
}
}
int32_t
streamSourceRecoverScanStep2
(
SStreamTask
*
pTask
,
int64_t
ver
)
{
int32_t
streamSourceRecoverScanStep2
(
SStreamTask
*
pTask
,
int64_t
ver
)
{
void
*
exec
=
pTask
->
exec
.
e
xecutor
;
void
*
exec
=
pTask
->
exec
.
pE
xecutor
;
if
(
qStreamSourceRecoverStep2
(
exec
,
ver
)
<
0
)
{
if
(
qStreamSourceRecoverStep2
(
exec
,
ver
)
<
0
)
{
}
}
return
streamScanExec
(
pTask
,
100
);
return
streamScanExec
(
pTask
,
100
);
...
@@ -206,7 +213,7 @@ int32_t streamSourceRecoverScanStep2(SStreamTask* pTask, int64_t ver) {
...
@@ -206,7 +213,7 @@ int32_t streamSourceRecoverScanStep2(SStreamTask* pTask, int64_t ver) {
int32_t
streamDispatchRecoverFinishReq
(
SStreamTask
*
pTask
)
{
int32_t
streamDispatchRecoverFinishReq
(
SStreamTask
*
pTask
)
{
SStreamRecoverFinishReq
req
=
{
SStreamRecoverFinishReq
req
=
{
.
streamId
=
pTask
->
streamId
,
.
streamId
=
pTask
->
id
.
streamId
,
.
childId
=
pTask
->
selfChildId
,
.
childId
=
pTask
->
selfChildId
,
};
};
// serialize
// serialize
...
@@ -227,13 +234,13 @@ int32_t streamDispatchRecoverFinishReq(SStreamTask* pTask) {
...
@@ -227,13 +234,13 @@ int32_t streamDispatchRecoverFinishReq(SStreamTask* pTask) {
// agg
// agg
int32_t
streamAggRecoverPrepare
(
SStreamTask
*
pTask
)
{
int32_t
streamAggRecoverPrepare
(
SStreamTask
*
pTask
)
{
void
*
exec
=
pTask
->
exec
.
executor
;
pTask
->
recoverWaitingUpstream
=
taosArrayGetSize
(
pTask
->
childEpInfo
);
pTask
->
recoverWaitingUpstream
=
taosArrayGetSize
(
pTask
->
childEpInfo
);
qDebug
(
"s-task:%s wait for %d upstreams"
,
pTask
->
id
.
idStr
,
pTask
->
recoverWaitingUpstream
);
return
0
;
return
0
;
}
}
int32_t
streamAggChildrenRecoverFinish
(
SStreamTask
*
pTask
)
{
int32_t
streamAggChildrenRecoverFinish
(
SStreamTask
*
pTask
)
{
void
*
exec
=
pTask
->
exec
.
e
xecutor
;
void
*
exec
=
pTask
->
exec
.
pE
xecutor
;
if
(
qStreamRestoreParam
(
exec
)
<
0
)
{
if
(
qStreamRestoreParam
(
exec
)
<
0
)
{
return
-
1
;
return
-
1
;
}
}
...
@@ -247,6 +254,7 @@ int32_t streamAggChildrenRecoverFinish(SStreamTask* pTask) {
...
@@ -247,6 +254,7 @@ int32_t streamAggChildrenRecoverFinish(SStreamTask* pTask) {
int32_t
streamProcessRecoverFinishReq
(
SStreamTask
*
pTask
,
int32_t
childId
)
{
int32_t
streamProcessRecoverFinishReq
(
SStreamTask
*
pTask
,
int32_t
childId
)
{
if
(
pTask
->
taskLevel
==
TASK_LEVEL__AGG
)
{
if
(
pTask
->
taskLevel
==
TASK_LEVEL__AGG
)
{
int32_t
left
=
atomic_sub_fetch_32
(
&
pTask
->
recoverWaitingUpstream
,
1
);
int32_t
left
=
atomic_sub_fetch_32
(
&
pTask
->
recoverWaitingUpstream
,
1
);
qDebug
(
"s-task:%s remain unfinished child tasks:%d"
,
pTask
->
id
.
idStr
,
left
);
ASSERT
(
left
>=
0
);
ASSERT
(
left
>=
0
);
if
(
left
==
0
)
{
if
(
left
==
0
)
{
streamAggChildrenRecoverFinish
(
pTask
);
streamAggChildrenRecoverFinish
(
pTask
);
...
...
source/libs/stream/src/streamState.c
浏览文件 @
f37f4088
...
@@ -121,7 +121,7 @@ SStreamState* streamStateOpen(char* path, SStreamTask* pTask, bool specPath, int
...
@@ -121,7 +121,7 @@ SStreamState* streamStateOpen(char* path, SStreamTask* pTask, bool specPath, int
char
statePath
[
1024
];
char
statePath
[
1024
];
if
(
!
specPath
)
{
if
(
!
specPath
)
{
sprintf
(
statePath
,
"%s/%d"
,
path
,
pTask
->
taskId
);
sprintf
(
statePath
,
"%s/%d"
,
path
,
pTask
->
id
.
taskId
);
}
else
{
}
else
{
memset
(
statePath
,
0
,
1024
);
memset
(
statePath
,
0
,
1024
);
tstrncpy
(
statePath
,
path
,
1024
);
tstrncpy
(
statePath
,
path
,
1024
);
...
@@ -193,6 +193,7 @@ SStreamState* streamStateOpen(char* path, SStreamTask* pTask, bool specPath, int
...
@@ -193,6 +193,7 @@ SStreamState* streamStateOpen(char* path, SStreamTask* pTask, bool specPath, int
}
}
pState
->
pTdbState
->
pOwner
=
pTask
;
pState
->
pTdbState
->
pOwner
=
pTask
;
pState
->
checkPointId
=
0
;
return
pState
;
return
pState
;
...
@@ -243,6 +244,7 @@ int32_t streamStateCommit(SStreamState* pState) {
...
@@ -243,6 +244,7 @@ int32_t streamStateCommit(SStreamState* pState) {
TDB_TXN_WRITE
|
TDB_TXN_READ_UNCOMMITTED
)
<
0
)
{
TDB_TXN_WRITE
|
TDB_TXN_READ_UNCOMMITTED
)
<
0
)
{
return
-
1
;
return
-
1
;
}
}
pState
->
checkPointId
++
;
return
0
;
return
0
;
}
}
...
...
source/libs/stream/src/streamTask.c
浏览文件 @
f37f4088
此差异已折叠。
点击以展开。
source/libs/sync/src/syncPipeline.c
浏览文件 @
f37f4088
...
@@ -916,10 +916,10 @@ int32_t syncLogReplProcessReplyAsNormal(SSyncLogReplMgr* pMgr, SSyncNode* pNode,
...
@@ -916,10 +916,10 @@ int32_t syncLogReplProcessReplyAsNormal(SSyncLogReplMgr* pMgr, SSyncNode* pNode,
ASSERT
(
pMgr
->
restored
==
true
);
ASSERT
(
pMgr
->
restored
==
true
);
if
(
pMgr
->
startIndex
<=
pMsg
->
lastSendIndex
&&
pMsg
->
lastSendIndex
<
pMgr
->
endIndex
)
{
if
(
pMgr
->
startIndex
<=
pMsg
->
lastSendIndex
&&
pMsg
->
lastSendIndex
<
pMgr
->
endIndex
)
{
if
(
pMgr
->
startIndex
<
pMgr
->
matchIndex
&&
pMgr
->
retryBackoff
>
0
)
{
if
(
pMgr
->
startIndex
<
pMgr
->
matchIndex
&&
pMgr
->
retryBackoff
>
0
)
{
int64_t
first
Sent
Ms
=
pMgr
->
states
[
pMgr
->
startIndex
%
pMgr
->
size
].
timeMs
;
int64_t
firstMs
=
pMgr
->
states
[
pMgr
->
startIndex
%
pMgr
->
size
].
timeMs
;
int64_t
last
Sent
Ms
=
pMgr
->
states
[(
pMgr
->
endIndex
-
1
)
%
pMgr
->
size
].
timeMs
;
int64_t
lastMs
=
pMgr
->
states
[(
pMgr
->
endIndex
-
1
)
%
pMgr
->
size
].
timeMs
;
int64_t
timeDiffMs
=
lastSentMs
-
firstSen
tMs
;
int64_t
diffMs
=
lastMs
-
firs
tMs
;
if
(
timeDiffMs
>
0
&&
timeD
iffMs
<
((
int64_t
)
SYNC_LOG_REPL_RETRY_WAIT_MS
<<
(
pMgr
->
retryBackoff
-
1
)))
{
if
(
diffMs
>
0
&&
d
iffMs
<
((
int64_t
)
SYNC_LOG_REPL_RETRY_WAIT_MS
<<
(
pMgr
->
retryBackoff
-
1
)))
{
pMgr
->
retryBackoff
-=
1
;
pMgr
->
retryBackoff
-=
1
;
}
}
}
}
...
...
source/libs/wal/src/walRead.c
浏览文件 @
f37f4088
...
@@ -100,6 +100,8 @@ int32_t walNextValidMsg(SWalReader *pReader) {
...
@@ -100,6 +100,8 @@ int32_t walNextValidMsg(SWalReader *pReader) {
return
-
1
;
return
-
1
;
}
}
int64_t
walReaderGetCurrentVer
(
const
SWalReader
*
pReader
)
{
return
pReader
->
curVersion
;
}
static
int64_t
walReadSeekFilePos
(
SWalReader
*
pReader
,
int64_t
fileFirstVer
,
int64_t
ver
)
{
static
int64_t
walReadSeekFilePos
(
SWalReader
*
pReader
,
int64_t
fileFirstVer
,
int64_t
ver
)
{
int64_t
ret
=
0
;
int64_t
ret
=
0
;
...
...
source/util/src/tworker.c
浏览文件 @
f37f4088
...
@@ -218,7 +218,7 @@ STaosQueue *tAutoQWorkerAllocQueue(SAutoQWorkerPool *pool, void *ahandle, FItem
...
@@ -218,7 +218,7 @@ STaosQueue *tAutoQWorkerAllocQueue(SAutoQWorkerPool *pool, void *ahandle, FItem
int32_t
queueNum
=
taosGetQueueNumber
(
pool
->
qset
);
int32_t
queueNum
=
taosGetQueueNumber
(
pool
->
qset
);
int32_t
curWorkerNum
=
taosArrayGetSize
(
pool
->
workers
);
int32_t
curWorkerNum
=
taosArrayGetSize
(
pool
->
workers
);
int32_t
dstWorkerNum
=
ceil
(
queueNum
*
pool
->
ratio
);
int32_t
dstWorkerNum
=
ceil
(
queueNum
*
pool
->
ratio
);
if
(
dstWorkerNum
<
1
)
dstWorkerNum
=
1
;
if
(
dstWorkerNum
<
2
)
dstWorkerNum
=
2
;
// spawn a thread to process queue
// spawn a thread to process queue
while
(
curWorkerNum
<
dstWorkerNum
)
{
while
(
curWorkerNum
<
dstWorkerNum
)
{
...
@@ -248,7 +248,8 @@ STaosQueue *tAutoQWorkerAllocQueue(SAutoQWorkerPool *pool, void *ahandle, FItem
...
@@ -248,7 +248,8 @@ STaosQueue *tAutoQWorkerAllocQueue(SAutoQWorkerPool *pool, void *ahandle, FItem
}
}
taosThreadAttrDestroy
(
&
thAttr
);
taosThreadAttrDestroy
(
&
thAttr
);
uInfo
(
"worker:%s:%d is launched, total:%d"
,
pool
->
name
,
worker
->
id
,
(
int32_t
)
taosArrayGetSize
(
pool
->
workers
));
int32_t
numOfThreads
=
taosArrayGetSize
(
pool
->
workers
);
uInfo
(
"worker:%s:%d is launched, total:%d, expect:%d"
,
pool
->
name
,
worker
->
id
,
numOfThreads
,
dstWorkerNum
);
curWorkerNum
++
;
curWorkerNum
++
;
}
}
...
...
tests/parallel_test/cases.task
浏览文件 @
f37f4088
此差异已折叠。
点击以展开。
tests/script/tsim/parser/last_cache.sim
浏览文件 @
f37f4088
此差异已折叠。
点击以展开。
tests/script/tsim/parser/limit1.sim
浏览文件 @
f37f4088
此差异已折叠。
点击以展开。
tests/script/tsim/stream/basic1.sim
浏览文件 @
f37f4088
此差异已折叠。
点击以展开。
tests/system-test/7-tmq/tmqDelete-1ctb.py
浏览文件 @
f37f4088
此差异已折叠。
点击以展开。
tools/shell/src/shellEngine.c
浏览文件 @
f37f4088
此差异已折叠。
点击以展开。
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录