Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
taosdata
TDengine
提交
4b6ab7fe
T
TDengine
项目概览
taosdata
/
TDengine
大约 2 年 前同步成功
通知
1193
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看板
提交
4b6ab7fe
编写于
6月 30, 2022
作者:
P
plum-lihui
浏览文件
操作
浏览文件
下载
差异文件
Merge branch '3.0' into test3.0/lihui
上级
6883aeb3
8ff990c1
变更
10
隐藏空白更改
内联
并排
Showing
10 changed file
with
193 addition
and
139 deletion
+193
-139
source/client/src/tmq.c
source/client/src/tmq.c
+2
-1
source/common/src/tmsg.c
source/common/src/tmsg.c
+2
-2
source/dnode/vnode/src/tq/tq.c
source/dnode/vnode/src/tq/tq.c
+9
-14
source/libs/executor/src/executorimpl.c
source/libs/executor/src/executorimpl.c
+4
-6
source/libs/executor/src/scanoperator.c
source/libs/executor/src/scanoperator.c
+0
-2
source/libs/executor/src/timewindowoperator.c
source/libs/executor/src/timewindowoperator.c
+50
-13
source/libs/parser/src/parTranslater.c
source/libs/parser/src/parTranslater.c
+12
-4
source/util/src/tlrucache.c
source/util/src/tlrucache.c
+108
-88
tests/script/tsim/tmq/snapshot.sim
tests/script/tsim/tmq/snapshot.sim
+3
-6
tests/script/tsim/tmq/snapshot1.sim
tests/script/tsim/tmq/snapshot1.sim
+3
-3
未找到文件。
source/client/src/tmq.c
浏览文件 @
4b6ab7fe
...
@@ -1547,7 +1547,7 @@ SMqRspObj* tmqBuildRspFromWrapper(SMqPollRspWrapper* pWrapper) {
...
@@ -1547,7 +1547,7 @@ SMqRspObj* tmqBuildRspFromWrapper(SMqPollRspWrapper* pWrapper) {
}
}
int32_t
tmqPollImpl
(
tmq_t
*
tmq
,
int64_t
timeout
)
{
int32_t
tmqPollImpl
(
tmq_t
*
tmq
,
int64_t
timeout
)
{
/*
printf("call poll\n
");*/
/*
tscDebug("call poll
");*/
for
(
int
i
=
0
;
i
<
taosArrayGetSize
(
tmq
->
clientTopics
);
i
++
)
{
for
(
int
i
=
0
;
i
<
taosArrayGetSize
(
tmq
->
clientTopics
);
i
++
)
{
SMqClientTopic
*
pTopic
=
taosArrayGet
(
tmq
->
clientTopics
,
i
);
SMqClientTopic
*
pTopic
=
taosArrayGet
(
tmq
->
clientTopics
,
i
);
for
(
int
j
=
0
;
j
<
taosArrayGetSize
(
pTopic
->
vgs
);
j
++
)
{
for
(
int
j
=
0
;
j
<
taosArrayGetSize
(
pTopic
->
vgs
);
j
++
)
{
...
@@ -1708,6 +1708,7 @@ void* tmqHandleAllRsp(tmq_t* tmq, int64_t timeout, bool pollIfReset) {
...
@@ -1708,6 +1708,7 @@ void* tmqHandleAllRsp(tmq_t* tmq, int64_t timeout, bool pollIfReset) {
}
}
TAOS_RES
*
tmq_consumer_poll
(
tmq_t
*
tmq
,
int64_t
timeout
)
{
TAOS_RES
*
tmq_consumer_poll
(
tmq_t
*
tmq
,
int64_t
timeout
)
{
/*tscDebug("call poll1");*/
void
*
rspObj
;
void
*
rspObj
;
int64_t
startTime
=
taosGetTimestampMs
();
int64_t
startTime
=
taosGetTimestampMs
();
...
...
source/common/src/tmsg.c
浏览文件 @
4b6ab7fe
...
@@ -5402,9 +5402,9 @@ int32_t tFormatOffset(char *buf, int32_t maxLen, const STqOffsetVal *pVal) {
...
@@ -5402,9 +5402,9 @@ int32_t tFormatOffset(char *buf, int32_t maxLen, const STqOffsetVal *pVal) {
}
else
if
(
pVal
->
type
==
TMQ_OFFSET__LOG
)
{
}
else
if
(
pVal
->
type
==
TMQ_OFFSET__LOG
)
{
snprintf
(
buf
,
maxLen
,
"offset(log) ver:%ld"
,
pVal
->
version
);
snprintf
(
buf
,
maxLen
,
"offset(log) ver:%ld"
,
pVal
->
version
);
}
else
if
(
pVal
->
type
==
TMQ_OFFSET__SNAPSHOT_DATA
)
{
}
else
if
(
pVal
->
type
==
TMQ_OFFSET__SNAPSHOT_DATA
)
{
snprintf
(
buf
,
maxLen
,
"offset(s
napshot
data) uid:%ld, ts:%ld"
,
pVal
->
uid
,
pVal
->
ts
);
snprintf
(
buf
,
maxLen
,
"offset(s
s
data) uid:%ld, ts:%ld"
,
pVal
->
uid
,
pVal
->
ts
);
}
else
if
(
pVal
->
type
==
TMQ_OFFSET__SNAPSHOT_META
)
{
}
else
if
(
pVal
->
type
==
TMQ_OFFSET__SNAPSHOT_META
)
{
snprintf
(
buf
,
maxLen
,
"offset(s
napshot
meta) uid:%ld, ts:%ld"
,
pVal
->
uid
,
pVal
->
ts
);
snprintf
(
buf
,
maxLen
,
"offset(s
s
meta) uid:%ld, ts:%ld"
,
pVal
->
uid
,
pVal
->
ts
);
}
else
{
}
else
{
ASSERT
(
0
);
ASSERT
(
0
);
}
}
...
...
source/dnode/vnode/src/tq/tq.c
浏览文件 @
4b6ab7fe
...
@@ -154,10 +154,10 @@ int32_t tqSendDataRsp(STQ* pTq, const SRpcMsg* pMsg, const SMqPollReq* pReq, con
...
@@ -154,10 +154,10 @@ int32_t tqSendDataRsp(STQ* pTq, const SRpcMsg* pMsg, const SMqPollReq* pReq, con
};
};
tmsgSendRsp
(
&
rsp
);
tmsgSendRsp
(
&
rsp
);
char
buf1
[
5
0
];
char
buf1
[
8
0
];
char
buf2
[
5
0
];
char
buf2
[
8
0
];
tFormatOffset
(
buf1
,
5
0
,
&
pRsp
->
reqOffset
);
tFormatOffset
(
buf1
,
8
0
,
&
pRsp
->
reqOffset
);
tFormatOffset
(
buf2
,
5
0
,
&
pRsp
->
rspOffset
);
tFormatOffset
(
buf2
,
8
0
,
&
pRsp
->
rspOffset
);
tqDebug
(
"vg %d from consumer %ld (epoch %d) send rsp, block num: %d, reqOffset: %s, rspOffset: %s"
,
tqDebug
(
"vg %d from consumer %ld (epoch %d) send rsp, block num: %d, reqOffset: %s, rspOffset: %s"
,
TD_VID
(
pTq
->
pVnode
),
pReq
->
consumerId
,
pReq
->
epoch
,
pRsp
->
blockNum
,
buf1
,
buf2
);
TD_VID
(
pTq
->
pVnode
),
pReq
->
consumerId
,
pReq
->
epoch
,
pRsp
->
blockNum
,
buf1
,
buf2
);
...
@@ -238,8 +238,8 @@ int32_t tqProcessPollReq(STQ* pTq, SRpcMsg* pMsg, int32_t workerId) {
...
@@ -238,8 +238,8 @@ int32_t tqProcessPollReq(STQ* pTq, SRpcMsg* pMsg, int32_t workerId) {
STqOffsetVal
fetchOffsetNew
;
STqOffsetVal
fetchOffsetNew
;
// 1.find handle
// 1.find handle
char
buf
[
5
0
];
char
buf
[
8
0
];
tFormatOffset
(
buf
,
5
0
,
&
reqOffset
);
tFormatOffset
(
buf
,
8
0
,
&
reqOffset
);
tqDebug
(
"tmq poll: consumer %ld (epoch %d) recv poll req in vg %d, req offset %s"
,
consumerId
,
pReq
->
epoch
,
tqDebug
(
"tmq poll: consumer %ld (epoch %d) recv poll req in vg %d, req offset %s"
,
consumerId
,
pReq
->
epoch
,
TD_VID
(
pTq
->
pVnode
),
buf
);
TD_VID
(
pTq
->
pVnode
),
buf
);
...
@@ -360,7 +360,6 @@ int32_t tqProcessPollReq(STQ* pTq, SRpcMsg* pMsg, int32_t workerId) {
...
@@ -360,7 +360,6 @@ int32_t tqProcessPollReq(STQ* pTq, SRpcMsg* pMsg, int32_t workerId) {
tqInfo
(
"fetch meta msg, ver: %ld, type: %d"
,
pHead
->
version
,
pHead
->
msgType
);
tqInfo
(
"fetch meta msg, ver: %ld, type: %d"
,
pHead
->
version
,
pHead
->
msgType
);
SMqMetaRsp
metaRsp
=
{
0
};
SMqMetaRsp
metaRsp
=
{
0
};
metaRsp
.
reqOffset
=
pReq
->
reqOffset
.
version
;
metaRsp
.
reqOffset
=
pReq
->
reqOffset
.
version
;
/*tqOffsetResetToLog(&metaR)*/
metaRsp
.
rspOffset
=
fetchVer
;
metaRsp
.
rspOffset
=
fetchVer
;
metaRsp
.
resMsgType
=
pHead
->
msgType
;
metaRsp
.
resMsgType
=
pHead
->
msgType
;
metaRsp
.
metaRspLen
=
pHead
->
bodyLen
;
metaRsp
.
metaRspLen
=
pHead
->
bodyLen
;
...
@@ -380,18 +379,14 @@ int32_t tqProcessPollReq(STQ* pTq, SRpcMsg* pMsg, int32_t workerId) {
...
@@ -380,18 +379,14 @@ int32_t tqProcessPollReq(STQ* pTq, SRpcMsg* pMsg, int32_t workerId) {
// 2. get data (rebuild reader if needed)
// 2. get data (rebuild reader if needed)
// 3. get new uid and ts
// 3. get new uid and ts
char
formatBuf
[
50
];
tqInfo
(
"retrieve using snapshot req offset: uid %ld ts %ld"
,
dataRsp
.
reqOffset
.
uid
,
dataRsp
.
reqOffset
.
ts
);
tFormatOffset
(
formatBuf
,
50
,
&
dataRsp
.
reqOffset
);
tqInfo
(
"retrieve using snapshot req offset %s"
,
formatBuf
);
if
(
tqScanSnapshot
(
pTq
,
&
pHandle
->
execHandle
,
&
dataRsp
,
fetchOffsetNew
,
workerId
)
<
0
)
{
if
(
tqScanSnapshot
(
pTq
,
&
pHandle
->
execHandle
,
&
dataRsp
,
fetchOffsetNew
,
workerId
)
<
0
)
{
ASSERT
(
0
);
ASSERT
(
0
);
}
}
// 4. send rsp
// 4. send rsp
if
(
dataRsp
.
blockNum
!=
0
)
{
if
(
tqSendDataRsp
(
pTq
,
pMsg
,
pReq
,
&
dataRsp
)
<
0
)
{
if
(
tqSendDataRsp
(
pTq
,
pMsg
,
pReq
,
&
dataRsp
)
<
0
)
{
code
=
-
1
;
code
=
-
1
;
}
}
}
}
else
if
(
fetchOffsetNew
.
type
==
TMQ_OFFSET__SNAPSHOT_META
)
{
}
else
if
(
fetchOffsetNew
.
type
==
TMQ_OFFSET__SNAPSHOT_META
)
{
ASSERT
(
0
);
ASSERT
(
0
);
...
...
source/libs/executor/src/executorimpl.c
浏览文件 @
4b6ab7fe
...
@@ -2837,12 +2837,10 @@ int32_t doPrepareScan(SOperatorInfo* pOperator, uint64_t uid, int64_t ts) {
...
@@ -2837,12 +2837,10 @@ int32_t doPrepareScan(SOperatorInfo* pOperator, uint64_t uid, int64_t ts) {
if
(
pInfo
->
lastStatus
.
uid
!=
uid
||
pInfo
->
lastStatus
.
ts
!=
ts
)
{
if
(
pInfo
->
lastStatus
.
uid
!=
uid
||
pInfo
->
lastStatus
.
ts
!=
ts
)
{
tsdbSetTableId
(
pInfo
->
dataReader
,
uid
);
tsdbSetTableId
(
pInfo
->
dataReader
,
uid
);
SQueryTableDataCond
tmpCond
=
pInfo
->
cond
;
int64_t
oldSkey
=
pInfo
->
cond
.
twindows
[
0
].
skey
;
tmpCond
.
twindows
[
0
]
=
(
STimeWindow
){
pInfo
->
cond
.
twindows
[
0
].
skey
=
ts
;
.
skey
=
ts
,
tsdbResetReadHandle
(
pInfo
->
dataReader
,
&
pInfo
->
cond
,
0
);
.
ekey
=
INT64_MAX
,
pInfo
->
cond
.
twindows
[
0
].
skey
=
oldSkey
;
};
tsdbResetReadHandle
(
pInfo
->
dataReader
,
&
tmpCond
,
0
);
pInfo
->
scanTimes
=
0
;
pInfo
->
scanTimes
=
0
;
pInfo
->
curTWinIdx
=
0
;
pInfo
->
curTWinIdx
=
0
;
}
}
...
...
source/libs/executor/src/scanoperator.c
浏览文件 @
4b6ab7fe
...
@@ -518,7 +518,6 @@ static SSDataBlock* doTableScan(SOperatorInfo* pOperator) {
...
@@ -518,7 +518,6 @@ static SSDataBlock* doTableScan(SOperatorInfo* pOperator) {
// if scan table by table
// if scan table by table
if
(
pInfo
->
scanMode
==
TABLE_SCAN__TABLE_ORDER
)
{
if
(
pInfo
->
scanMode
==
TABLE_SCAN__TABLE_ORDER
)
{
// check status
while
(
1
)
{
while
(
1
)
{
SSDataBlock
*
result
=
doTableScanGroup
(
pOperator
);
SSDataBlock
*
result
=
doTableScanGroup
(
pOperator
);
if
(
result
)
{
if
(
result
)
{
...
@@ -530,7 +529,6 @@ static SSDataBlock* doTableScan(SOperatorInfo* pOperator) {
...
@@ -530,7 +529,6 @@ static SSDataBlock* doTableScan(SOperatorInfo* pOperator) {
return
NULL
;
return
NULL
;
}
}
STableKeyInfo
*
pTableInfo
=
taosArrayGet
(
pTaskInfo
->
tableqinfoList
.
pTableList
,
pInfo
->
currentTable
);
STableKeyInfo
*
pTableInfo
=
taosArrayGet
(
pTaskInfo
->
tableqinfoList
.
pTableList
,
pInfo
->
currentTable
);
/*pTableInfo->uid */
tsdbSetTableId
(
pInfo
->
dataReader
,
pTableInfo
->
uid
);
tsdbSetTableId
(
pInfo
->
dataReader
,
pTableInfo
->
uid
);
tsdbResetReadHandle
(
pInfo
->
dataReader
,
&
pInfo
->
cond
,
0
);
tsdbResetReadHandle
(
pInfo
->
dataReader
,
&
pInfo
->
cond
,
0
);
pInfo
->
scanTimes
=
0
;
pInfo
->
scanTimes
=
0
;
...
...
source/libs/executor/src/timewindowoperator.c
浏览文件 @
4b6ab7fe
...
@@ -1246,6 +1246,9 @@ void doClearWindowImpl(SResultRowPosition* p1, SDiskbasedBuf* pResultBuf, SExprS
...
@@ -1246,6 +1246,9 @@ void doClearWindowImpl(SResultRowPosition* p1, SDiskbasedBuf* pResultBuf, SExprS
pCtx
[
i
].
fpSet
.
init
(
&
pCtx
[
i
],
pResInfo
);
pCtx
[
i
].
fpSet
.
init
(
&
pCtx
[
i
],
pResInfo
);
}
}
}
}
SFilePage
*
bufPage
=
getBufPage
(
pResultBuf
,
p1
->
pageId
);
setBufPageDirty
(
bufPage
,
true
);
releaseBufPage
(
pResultBuf
,
bufPage
);
}
}
bool
doClearWindow
(
SAggSupporter
*
pAggSup
,
SExprSupp
*
pSup
,
char
*
pData
,
int16_t
bytes
,
uint64_t
groupId
,
bool
doClearWindow
(
SAggSupporter
*
pAggSup
,
SExprSupp
*
pSup
,
char
*
pData
,
int16_t
bytes
,
uint64_t
groupId
,
...
@@ -3171,6 +3174,10 @@ static void doClearSessionWindows(SStreamAggSupporter* pAggSup, SExprSupp* pSup,
...
@@ -3171,6 +3174,10 @@ static void doClearSessionWindows(SStreamAggSupporter* pAggSup, SExprSupp* pSup,
getSessionTimeWindow
(
pAggSup
,
tsCols
[
i
],
INT64_MIN
,
pBlock
->
info
.
groupId
,
gap
,
&
winIndex
);
getSessionTimeWindow
(
pAggSup
,
tsCols
[
i
],
INT64_MIN
,
pBlock
->
info
.
groupId
,
gap
,
&
winIndex
);
step
=
updateSessionWindowInfo
(
pCurWin
,
tsCols
,
NULL
,
pBlock
->
info
.
rows
,
i
,
gap
,
NULL
);
step
=
updateSessionWindowInfo
(
pCurWin
,
tsCols
,
NULL
,
pBlock
->
info
.
rows
,
i
,
gap
,
NULL
);
ASSERT
(
isInWindow
(
pCurWin
,
tsCols
[
i
],
gap
));
ASSERT
(
isInWindow
(
pCurWin
,
tsCols
[
i
],
gap
));
if
(
pCurWin
->
pos
.
pageId
==
-
1
)
{
// window has been closed.
continue
;
}
doClearWindowImpl
(
&
pCurWin
->
pos
,
pAggSup
->
pResultBuf
,
pSup
,
numOfOutput
);
doClearWindowImpl
(
&
pCurWin
->
pos
,
pAggSup
->
pResultBuf
,
pSup
,
numOfOutput
);
if
(
result
)
{
if
(
result
)
{
taosArrayPush
(
result
,
pCurWin
);
taosArrayPush
(
result
,
pCurWin
);
...
@@ -3246,12 +3253,12 @@ static void rebuildTimeWindow(SStreamSessionAggOperatorInfo* pInfo, SArray* pWin
...
@@ -3246,12 +3253,12 @@ static void rebuildTimeWindow(SStreamSessionAggOperatorInfo* pInfo, SArray* pWin
setWindowOutputBuf
(
pChWin
,
&
pChResult
,
pChild
->
exprSupp
.
pCtx
,
groupId
,
numOfOutput
,
setWindowOutputBuf
(
pChWin
,
&
pChResult
,
pChild
->
exprSupp
.
pCtx
,
groupId
,
numOfOutput
,
pChild
->
exprSupp
.
rowEntryInfoOffset
,
&
pChInfo
->
streamAggSup
,
pTaskInfo
);
pChild
->
exprSupp
.
rowEntryInfoOffset
,
&
pChInfo
->
streamAggSup
,
pTaskInfo
);
compactFunctions
(
pSup
->
pCtx
,
pChild
->
exprSupp
.
pCtx
,
numOfOutput
,
pTaskInfo
);
compactFunctions
(
pSup
->
pCtx
,
pChild
->
exprSupp
.
pCtx
,
numOfOutput
,
pTaskInfo
);
SFilePage
*
bufPage
=
getBufPage
(
pInfo
->
streamAggSup
.
pResultBuf
,
pChWin
->
pos
.
pageId
);
SFilePage
*
bufPage
=
getBufPage
(
pChInfo
->
streamAggSup
.
pResultBuf
,
pChWin
->
pos
.
pageId
);
setBufPageDirty
(
bufPage
,
true
);
releaseBufPage
(
pChInfo
->
streamAggSup
.
pResultBuf
,
bufPage
);
releaseBufPage
(
pInfo
->
streamAggSup
.
pResultBuf
,
bufPage
);
continue
;
continue
;
}
else
if
(
!
pChWin
->
isClosed
)
{
break
;
}
}
break
;
}
}
}
}
SFilePage
*
bufPage
=
getBufPage
(
pInfo
->
streamAggSup
.
pResultBuf
,
pParentWin
->
pos
.
pageId
);
SFilePage
*
bufPage
=
getBufPage
(
pInfo
->
streamAggSup
.
pResultBuf
,
pParentWin
->
pos
.
pageId
);
...
@@ -3265,7 +3272,8 @@ typedef SResultWindowInfo* (*__get_win_info_)(void*);
...
@@ -3265,7 +3272,8 @@ typedef SResultWindowInfo* (*__get_win_info_)(void*);
SResultWindowInfo
*
getResWinForSession
(
void
*
pData
)
{
return
(
SResultWindowInfo
*
)
pData
;
}
SResultWindowInfo
*
getResWinForSession
(
void
*
pData
)
{
return
(
SResultWindowInfo
*
)
pData
;
}
SResultWindowInfo
*
getResWinForState
(
void
*
pData
)
{
return
&
((
SStateWindowInfo
*
)
pData
)
->
winInfo
;
}
SResultWindowInfo
*
getResWinForState
(
void
*
pData
)
{
return
&
((
SStateWindowInfo
*
)
pData
)
->
winInfo
;
}
int32_t
closeSessionWindow
(
SHashObj
*
pHashMap
,
STimeWindowAggSupp
*
pTwSup
,
SArray
*
pClosed
,
__get_win_info_
fn
)
{
int32_t
closeSessionWindow
(
SHashObj
*
pHashMap
,
STimeWindowAggSupp
*
pTwSup
,
SArray
*
pClosed
,
__get_win_info_
fn
,
bool
delete
)
{
// Todo(liuyao) save window to tdb
// Todo(liuyao) save window to tdb
void
**
pIte
=
NULL
;
void
**
pIte
=
NULL
;
size_t
keyLen
=
0
;
size_t
keyLen
=
0
;
...
@@ -3279,10 +3287,18 @@ int32_t closeSessionWindow(SHashObj* pHashMap, STimeWindowAggSupp* pTwSup, SArra
...
@@ -3279,10 +3287,18 @@ int32_t closeSessionWindow(SHashObj* pHashMap, STimeWindowAggSupp* pTwSup, SArra
if
(
isCloseWindow
(
&
pSeWin
->
win
,
pTwSup
))
{
if
(
isCloseWindow
(
&
pSeWin
->
win
,
pTwSup
))
{
if
(
!
pSeWin
->
isClosed
)
{
if
(
!
pSeWin
->
isClosed
)
{
pSeWin
->
isClosed
=
true
;
pSeWin
->
isClosed
=
true
;
if
(
pTwSup
->
calTrigger
==
STREAM_TRIGGER_WINDOW_CLOSE
)
{
if
(
pTwSup
->
calTrigger
==
STREAM_TRIGGER_WINDOW_CLOSE
&&
pClosed
)
{
int32_t
code
=
saveResult
(
pSeWin
->
win
.
skey
,
pSeWin
->
pos
.
pageId
,
pSeWin
->
pos
.
offset
,
*
pGroupId
,
pClosed
);
int32_t
code
=
saveResult
(
pSeWin
->
win
.
skey
,
pSeWin
->
pos
.
pageId
,
pSeWin
->
pos
.
offset
,
*
pGroupId
,
pClosed
);
if
(
code
!=
TSDB_CODE_SUCCESS
)
{
return
code
;
}
pSeWin
->
isOutput
=
true
;
pSeWin
->
isOutput
=
true
;
}
}
if
(
delete
)
{
taosArrayRemove
(
pWins
,
i
);
i
--
;
size
=
taosArrayGetSize
(
pWins
);
}
}
}
continue
;
continue
;
}
}
...
@@ -3292,6 +3308,16 @@ int32_t closeSessionWindow(SHashObj* pHashMap, STimeWindowAggSupp* pTwSup, SArra
...
@@ -3292,6 +3308,16 @@ int32_t closeSessionWindow(SHashObj* pHashMap, STimeWindowAggSupp* pTwSup, SArra
return
TSDB_CODE_SUCCESS
;
return
TSDB_CODE_SUCCESS
;
}
}
static
void
closeChildSessionWindow
(
SArray
*
pChildren
,
TSKEY
maxTs
,
bool
delete
)
{
int32_t
size
=
taosArrayGetSize
(
pChildren
);
for
(
int32_t
i
=
0
;
i
<
size
;
i
++
)
{
SOperatorInfo
*
pChildOp
=
taosArrayGetP
(
pChildren
,
i
);
SStreamSessionAggOperatorInfo
*
pChInfo
=
pChildOp
->
info
;
pChInfo
->
twAggSup
.
maxTs
=
TMAX
(
pChInfo
->
twAggSup
.
maxTs
,
maxTs
);
closeSessionWindow
(
pChInfo
->
streamAggSup
.
pResultRows
,
&
pChInfo
->
twAggSup
,
NULL
,
getResWinForSession
,
delete
);
}
}
int32_t
getAllSessionWindow
(
SHashObj
*
pHashMap
,
SArray
*
pClosed
,
__get_win_info_
fn
)
{
int32_t
getAllSessionWindow
(
SHashObj
*
pHashMap
,
SArray
*
pClosed
,
__get_win_info_
fn
)
{
void
**
pIte
=
NULL
;
void
**
pIte
=
NULL
;
while
((
pIte
=
taosHashIterate
(
pHashMap
,
pIte
))
!=
NULL
)
{
while
((
pIte
=
taosHashIterate
(
pHashMap
,
pIte
))
!=
NULL
)
{
...
@@ -3339,6 +3365,7 @@ static SSDataBlock* doStreamSessionAgg(SOperatorInfo* pOperator) {
...
@@ -3339,6 +3365,7 @@ static SSDataBlock* doStreamSessionAgg(SOperatorInfo* pOperator) {
if
(
pBlock
==
NULL
)
{
if
(
pBlock
==
NULL
)
{
break
;
break
;
}
}
printDataBlock
(
pBlock
,
IS_FINAL_OP
(
pInfo
)
?
"Final Session Recv"
:
"Single Session Recv"
);
if
(
pBlock
->
info
.
type
==
STREAM_CLEAR
)
{
if
(
pBlock
->
info
.
type
==
STREAM_CLEAR
)
{
SArray
*
pWins
=
taosArrayInit
(
16
,
sizeof
(
SResultWindowInfo
));
SArray
*
pWins
=
taosArrayInit
(
16
,
sizeof
(
SResultWindowInfo
));
...
@@ -3385,7 +3412,9 @@ static SSDataBlock* doStreamSessionAgg(SOperatorInfo* pOperator) {
...
@@ -3385,7 +3412,9 @@ static SSDataBlock* doStreamSessionAgg(SOperatorInfo* pOperator) {
// restore the value
// restore the value
pOperator
->
status
=
OP_RES_TO_RETURN
;
pOperator
->
status
=
OP_RES_TO_RETURN
;
closeSessionWindow
(
pInfo
->
streamAggSup
.
pResultRows
,
&
pInfo
->
twAggSup
,
pUpdated
,
getResWinForSession
);
closeSessionWindow
(
pInfo
->
streamAggSup
.
pResultRows
,
&
pInfo
->
twAggSup
,
pUpdated
,
getResWinForSession
,
pInfo
->
ignoreCloseWindow
);
closeChildSessionWindow
(
pInfo
->
pChildren
,
pInfo
->
twAggSup
.
maxTs
,
pInfo
->
ignoreCloseWindow
);
copyUpdateResult
(
pStUpdated
,
pUpdated
);
copyUpdateResult
(
pStUpdated
,
pUpdated
);
taosHashCleanup
(
pStUpdated
);
taosHashCleanup
(
pStUpdated
);
...
@@ -3437,10 +3466,11 @@ static SSDataBlock* doStreamSessionSemiAgg(SOperatorInfo* pOperator) {
...
@@ -3437,10 +3466,11 @@ static SSDataBlock* doStreamSessionSemiAgg(SOperatorInfo* pOperator) {
}
else
if
(
pOperator
->
status
==
OP_RES_TO_RETURN
)
{
}
else
if
(
pOperator
->
status
==
OP_RES_TO_RETURN
)
{
doBuildDeleteDataBlock
(
pInfo
->
pStDeleted
,
pInfo
->
pDelRes
,
&
pInfo
->
pDelIterator
);
doBuildDeleteDataBlock
(
pInfo
->
pStDeleted
,
pInfo
->
pDelRes
,
&
pInfo
->
pDelIterator
);
if
(
pInfo
->
pDelRes
->
info
.
rows
>
0
)
{
if
(
pInfo
->
pDelRes
->
info
.
rows
>
0
)
{
printDataBlock
(
pInfo
->
pDelRes
,
"Semi Session"
);
return
pInfo
->
pDelRes
;
return
pInfo
->
pDelRes
;
}
}
doBuildResultDatablock
(
pOperator
,
pBInfo
,
&
pInfo
->
groupResInfo
,
pInfo
->
streamAggSup
.
pResultBuf
);
doBuildResultDatablock
(
pOperator
,
pBInfo
,
&
pInfo
->
groupResInfo
,
pInfo
->
streamAggSup
.
pResultBuf
);
if
(
p
Info
->
binfo
.
pRes
->
info
.
rows
==
0
)
{
if
(
p
BInfo
->
pRes
->
info
.
rows
==
0
)
{
pOperator
->
status
=
OP_EXEC_DONE
;
pOperator
->
status
=
OP_EXEC_DONE
;
if
(
pInfo
->
pUpdateRes
->
info
.
rows
==
0
)
{
if
(
pInfo
->
pUpdateRes
->
info
.
rows
==
0
)
{
// semi interval operator clear disk buffer
// semi interval operator clear disk buffer
...
@@ -3449,9 +3479,11 @@ static SSDataBlock* doStreamSessionSemiAgg(SOperatorInfo* pOperator) {
...
@@ -3449,9 +3479,11 @@ static SSDataBlock* doStreamSessionSemiAgg(SOperatorInfo* pOperator) {
}
}
// process the rest of the data
// process the rest of the data
pOperator
->
status
=
OP_OPENED
;
pOperator
->
status
=
OP_OPENED
;
printDataBlock
(
pInfo
->
pUpdateRes
,
"Semi Session"
);
return
pInfo
->
pUpdateRes
;
return
pInfo
->
pUpdateRes
;
}
}
return
pInfo
->
binfo
.
pRes
;
printDataBlock
(
pBInfo
->
pRes
,
"Semi Session"
);
return
pBInfo
->
pRes
;
}
}
_hash_fn_t
hashFn
=
taosGetDefaultHashFunction
(
TSDB_DATA_TYPE_BINARY
);
_hash_fn_t
hashFn
=
taosGetDefaultHashFunction
(
TSDB_DATA_TYPE_BINARY
);
...
@@ -3495,21 +3527,24 @@ static SSDataBlock* doStreamSessionSemiAgg(SOperatorInfo* pOperator) {
...
@@ -3495,21 +3527,24 @@ static SSDataBlock* doStreamSessionSemiAgg(SOperatorInfo* pOperator) {
finalizeUpdatedResult
(
pOperator
->
exprSupp
.
numOfExprs
,
pInfo
->
streamAggSup
.
pResultBuf
,
pUpdated
,
finalizeUpdatedResult
(
pOperator
->
exprSupp
.
numOfExprs
,
pInfo
->
streamAggSup
.
pResultBuf
,
pUpdated
,
pSup
->
rowEntryInfoOffset
);
pSup
->
rowEntryInfoOffset
);
initMultiResInfoFromArrayList
(
&
pInfo
->
groupResInfo
,
pUpdated
);
initMultiResInfoFromArrayList
(
&
pInfo
->
groupResInfo
,
pUpdated
);
blockDataEnsureCapacity
(
p
Info
->
binfo
.
pRes
,
pOperator
->
resultInfo
.
capacity
);
blockDataEnsureCapacity
(
p
BInfo
->
pRes
,
pOperator
->
resultInfo
.
capacity
);
doBuildDeleteDataBlock
(
pInfo
->
pStDeleted
,
pInfo
->
pDelRes
,
&
pInfo
->
pDelIterator
);
doBuildDeleteDataBlock
(
pInfo
->
pStDeleted
,
pInfo
->
pDelRes
,
&
pInfo
->
pDelIterator
);
if
(
pInfo
->
pDelRes
->
info
.
rows
>
0
)
{
if
(
pInfo
->
pDelRes
->
info
.
rows
>
0
)
{
printDataBlock
(
pInfo
->
pDelRes
,
"Semi Session"
);
return
pInfo
->
pDelRes
;
return
pInfo
->
pDelRes
;
}
}
doBuildResultDatablock
(
pOperator
,
&
pInfo
->
bi
nfo
,
&
pInfo
->
groupResInfo
,
pInfo
->
streamAggSup
.
pResultBuf
);
doBuildResultDatablock
(
pOperator
,
pBI
nfo
,
&
pInfo
->
groupResInfo
,
pInfo
->
streamAggSup
.
pResultBuf
);
if
(
p
Info
->
binfo
.
pRes
->
info
.
rows
==
0
)
{
if
(
p
BInfo
->
pRes
->
info
.
rows
==
0
)
{
pOperator
->
status
=
OP_EXEC_DONE
;
pOperator
->
status
=
OP_EXEC_DONE
;
if
(
pInfo
->
pUpdateRes
->
info
.
rows
==
0
)
{
if
(
pInfo
->
pUpdateRes
->
info
.
rows
==
0
)
{
return
NULL
;
return
NULL
;
}
}
// process the rest of the data
// process the rest of the data
pOperator
->
status
=
OP_OPENED
;
pOperator
->
status
=
OP_OPENED
;
printDataBlock
(
pInfo
->
pUpdateRes
,
"Semi Session"
);
return
pInfo
->
pUpdateRes
;
return
pInfo
->
pUpdateRes
;
}
}
printDataBlock
(
pBInfo
->
pRes
,
"Semi Session"
);
return
pBInfo
->
pRes
->
info
.
rows
==
0
?
NULL
:
pBInfo
->
pRes
;
return
pBInfo
->
pRes
->
info
.
rows
==
0
?
NULL
:
pBInfo
->
pRes
;
}
}
...
@@ -3867,7 +3902,9 @@ static SSDataBlock* doStreamStateAgg(SOperatorInfo* pOperator) {
...
@@ -3867,7 +3902,9 @@ static SSDataBlock* doStreamStateAgg(SOperatorInfo* pOperator) {
// restore the value
// restore the value
pOperator
->
status
=
OP_RES_TO_RETURN
;
pOperator
->
status
=
OP_RES_TO_RETURN
;
closeSessionWindow
(
pInfo
->
streamAggSup
.
pResultRows
,
&
pInfo
->
twAggSup
,
pUpdated
,
getResWinForState
);
closeSessionWindow
(
pInfo
->
streamAggSup
.
pResultRows
,
&
pInfo
->
twAggSup
,
pUpdated
,
getResWinForState
,
pInfo
->
ignoreCloseWindow
);
closeChildSessionWindow
(
pInfo
->
pChildren
,
pInfo
->
twAggSup
.
maxTs
,
pInfo
->
ignoreCloseWindow
);
copyUpdateResult
(
pSeUpdated
,
pUpdated
);
copyUpdateResult
(
pSeUpdated
,
pUpdated
);
taosHashCleanup
(
pSeUpdated
);
taosHashCleanup
(
pSeUpdated
);
...
...
source/libs/parser/src/parTranslater.c
浏览文件 @
4b6ab7fe
...
@@ -783,6 +783,13 @@ static EDealRes translateValueImpl(STranslateContext* pCxt, SValueNode* pVal, SD
...
@@ -783,6 +783,13 @@ static EDealRes translateValueImpl(STranslateContext* pCxt, SValueNode* pVal, SD
if
(
pVal
->
placeholderNo
>
0
||
pVal
->
isNull
)
{
if
(
pVal
->
placeholderNo
>
0
||
pVal
->
isNull
)
{
return
DEAL_RES_CONTINUE
;
return
DEAL_RES_CONTINUE
;
}
}
if
(
TSDB_DATA_TYPE_NULL
==
pVal
->
node
.
resType
.
type
)
{
// TODO
//pVal->node.resType = targetDt;
pVal
->
translate
=
true
;
pVal
->
isNull
=
true
;
return
DEAL_RES_CONTINUE
;
}
if
(
pVal
->
isDuration
)
{
if
(
pVal
->
isDuration
)
{
if
(
parseNatualDuration
(
pVal
->
literal
,
strlen
(
pVal
->
literal
),
&
pVal
->
datum
.
i
,
&
pVal
->
unit
,
precision
)
!=
if
(
parseNatualDuration
(
pVal
->
literal
,
strlen
(
pVal
->
literal
),
&
pVal
->
datum
.
i
,
&
pVal
->
unit
,
precision
)
!=
TSDB_CODE_SUCCESS
)
{
TSDB_CODE_SUCCESS
)
{
...
@@ -5355,7 +5362,7 @@ static int32_t buildKVRowForAllTags(STranslateContext* pCxt, SCreateSubTableClau
...
@@ -5355,7 +5362,7 @@ static int32_t buildKVRowForAllTags(STranslateContext* pCxt, SCreateSubTableClau
if
(
code
!=
TSDB_CODE_SUCCESS
)
{
if
(
code
!=
TSDB_CODE_SUCCESS
)
{
goto
end
;
goto
end
;
}
}
}
else
if
(
pVal
->
node
.
resType
.
type
!=
TSDB_DATA_TYPE_NULL
)
{
}
else
if
(
pVal
->
node
.
resType
.
type
!=
TSDB_DATA_TYPE_NULL
&&
!
pVal
->
isNull
)
{
char
*
tmpVal
=
nodesGetValueFromNode
(
pVal
);
char
*
tmpVal
=
nodesGetValueFromNode
(
pVal
);
STagVal
val
=
{.
cid
=
pTagSchema
->
colId
,
.
type
=
pTagSchema
->
type
};
STagVal
val
=
{.
cid
=
pTagSchema
->
colId
,
.
type
=
pTagSchema
->
type
};
if
(
IS_VAR_DATA_TYPE
(
pTagSchema
->
type
))
{
if
(
IS_VAR_DATA_TYPE
(
pTagSchema
->
type
))
{
...
@@ -5622,8 +5629,8 @@ static int32_t buildUpdateTagValReq(STranslateContext* pCxt, SAlterTableStmt* pS
...
@@ -5622,8 +5629,8 @@ static int32_t buildUpdateTagValReq(STranslateContext* pCxt, SAlterTableStmt* pS
return
TSDB_CODE_OUT_OF_MEMORY
;
return
TSDB_CODE_OUT_OF_MEMORY
;
}
}
if
(
DEAL_RES_ERROR
==
SDataType
targetDt
=
schemaToDataType
(
pTableMeta
->
tableInfo
.
precision
,
pSchema
);
translateValueImpl
(
pCxt
,
pStmt
->
pVal
,
schemaToDataType
(
pTableMeta
->
tableInfo
.
precision
,
pSchema
)
))
{
if
(
DEAL_RES_ERROR
==
translateValueImpl
(
pCxt
,
pStmt
->
pVal
,
targetDt
))
{
return
pCxt
->
errCode
;
return
pCxt
->
errCode
;
}
}
...
@@ -5632,7 +5639,8 @@ static int32_t buildUpdateTagValReq(STranslateContext* pCxt, SAlterTableStmt* pS
...
@@ -5632,7 +5639,8 @@ static int32_t buildUpdateTagValReq(STranslateContext* pCxt, SAlterTableStmt* pS
}
}
pReq
->
isNull
=
(
TSDB_DATA_TYPE_NULL
==
pStmt
->
pVal
->
node
.
resType
.
type
);
pReq
->
isNull
=
(
TSDB_DATA_TYPE_NULL
==
pStmt
->
pVal
->
node
.
resType
.
type
);
if
(
pStmt
->
pVal
->
node
.
resType
.
type
==
TSDB_DATA_TYPE_JSON
)
{
if
(
targetDt
.
type
==
TSDB_DATA_TYPE_JSON
)
{
pReq
->
isNull
=
0
;
if
(
pStmt
->
pVal
->
literal
&&
if
(
pStmt
->
pVal
->
literal
&&
strlen
(
pStmt
->
pVal
->
literal
)
>
(
TSDB_MAX_JSON_TAG_LEN
-
VARSTR_HEADER_SIZE
)
/
TSDB_NCHAR_SIZE
)
{
strlen
(
pStmt
->
pVal
->
literal
)
>
(
TSDB_MAX_JSON_TAG_LEN
-
VARSTR_HEADER_SIZE
)
/
TSDB_NCHAR_SIZE
)
{
return
buildSyntaxErrMsg
(
&
pCxt
->
msgBuf
,
"json string too long than 4095"
,
pStmt
->
pVal
->
literal
);
return
buildSyntaxErrMsg
(
&
pCxt
->
msgBuf
,
"json string too long than 4095"
,
pStmt
->
pVal
->
literal
);
...
...
source/util/src/tlrucache.c
浏览文件 @
4b6ab7fe
...
@@ -16,24 +16,24 @@
...
@@ -16,24 +16,24 @@
#define _DEFAULT_SOURCE
#define _DEFAULT_SOURCE
#include "tlrucache.h"
#include "tlrucache.h"
#include "os.h"
#include "os.h"
#include "tdef.h"
#include "taoserror.h"
#include "taoserror.h"
#include "tlog.h"
#include "tarray.h"
#include "tarray.h"
#include "tdef.h"
#include "tlog.h"
typedef
struct
SLRUEntry
SLRUEntry
;
typedef
struct
SLRUEntry
SLRUEntry
;
typedef
struct
SLRUEntryTable
SLRUEntryTable
;
typedef
struct
SLRUEntryTable
SLRUEntryTable
;
typedef
struct
SLRUCacheShard
SLRUCacheShard
;
typedef
struct
SLRUCacheShard
SLRUCacheShard
;
typedef
struct
SShardedCache
SShardedCache
;
typedef
struct
SShardedCache
SShardedCache
;
enum
{
enum
{
TAOS_LRU_IN_CACHE
=
(
1
<<
0
),
// Whether this entry is referenced by the hash table.
TAOS_LRU_IN_CACHE
=
(
1
<<
0
),
// Whether this entry is referenced by the hash table.
TAOS_LRU_IS_HIGH_PRI
=
(
1
<<
1
),
// Whether this entry is high priority entry.
TAOS_LRU_IS_HIGH_PRI
=
(
1
<<
1
),
// Whether this entry is high priority entry.
TAOS_LRU_IN_HIGH_PRI_POOL
=
(
1
<<
2
),
// Whether this entry is in high-pri pool.
TAOS_LRU_IN_HIGH_PRI_POOL
=
(
1
<<
2
),
// Whether this entry is in high-pri pool.
TAOS_LRU_HAS_HIT
=
(
1
<<
3
),
// Whether this entry has had any lookups (hits).
TAOS_LRU_HAS_HIT
=
(
1
<<
3
),
// Whether this entry has had any lookups (hits).
};
};
struct
SLRUEntry
{
struct
SLRUEntry
{
...
@@ -50,18 +50,39 @@ struct SLRUEntry {
...
@@ -50,18 +50,39 @@ struct SLRUEntry {
char
keyData
[
1
];
char
keyData
[
1
];
};
};
#define TAOS_LRU_ENTRY_IN_CACHE(h) ((h)->flags & TAOS_LRU_IN_CACHE)
#define TAOS_LRU_ENTRY_IN_CACHE(h)
((h)->flags & TAOS_LRU_IN_CACHE)
#define TAOS_LRU_ENTRY_IN_HIGH_POOL(h) ((h)->flags & TAOS_LRU_IN_HIGH_PRI_POOL)
#define TAOS_LRU_ENTRY_IN_HIGH_POOL(h) ((h)->flags & TAOS_LRU_IN_HIGH_PRI_POOL)
#define TAOS_LRU_ENTRY_IS_HIGH_PRI(h) ((h)->flags & TAOS_LRU_IS_HIGH_PRI)
#define TAOS_LRU_ENTRY_IS_HIGH_PRI(h) ((h)->flags & TAOS_LRU_IS_HIGH_PRI)
#define TAOS_LRU_ENTRY_HAS_HIT(h) ((h)->flags & TAOS_LRU_HAS_HIT)
#define TAOS_LRU_ENTRY_HAS_HIT(h) ((h)->flags & TAOS_LRU_HAS_HIT)
#define TAOS_LRU_ENTRY_SET_IN_CACHE(h, inCache) do { if(inCache) {(h)->flags |= TAOS_LRU_IN_CACHE;} else {(h)->flags &= ~TAOS_LRU_IN_CACHE;} } while(0)
#define TAOS_LRU_ENTRY_SET_IN_CACHE(h, inCache) \
#define TAOS_LRU_ENTRY_SET_IN_HIGH_POOL(h, inHigh) do { if(inHigh) {(h)->flags |= TAOS_LRU_IN_HIGH_PRI_POOL;} else {(h)->flags &= ~TAOS_LRU_IN_HIGH_PRI_POOL;} } while(0)
do { \
#define TAOS_LRU_ENTRY_SET_PRIORITY(h, priority) do { if(priority == TAOS_LRU_PRIORITY_HIGH) {(h)->flags |= TAOS_LRU_IS_HIGH_PRI;} else {(h)->flags &= ~TAOS_LRU_IS_HIGH_PRI;} } while(0)
if (inCache) { \
(h)->flags |= TAOS_LRU_IN_CACHE; \
} else { \
(h)->flags &= ~TAOS_LRU_IN_CACHE; \
} \
} while (0)
#define TAOS_LRU_ENTRY_SET_IN_HIGH_POOL(h, inHigh) \
do { \
if (inHigh) { \
(h)->flags |= TAOS_LRU_IN_HIGH_PRI_POOL; \
} else { \
(h)->flags &= ~TAOS_LRU_IN_HIGH_PRI_POOL; \
} \
} while (0)
#define TAOS_LRU_ENTRY_SET_PRIORITY(h, priority) \
do { \
if (priority == TAOS_LRU_PRIORITY_HIGH) { \
(h)->flags |= TAOS_LRU_IS_HIGH_PRI; \
} else { \
(h)->flags &= ~TAOS_LRU_IS_HIGH_PRI; \
} \
} while (0)
#define TAOS_LRU_ENTRY_SET_HIT(h) ((h)->flags |= TAOS_LRU_HAS_HIT)
#define TAOS_LRU_ENTRY_SET_HIT(h) ((h)->flags |= TAOS_LRU_HAS_HIT)
#define TAOS_LRU_ENTRY_HAS_REFS(h) ((h)->refs > 0)
#define TAOS_LRU_ENTRY_HAS_REFS(h) ((h)->refs > 0)
#define TAOS_LRU_ENTRY_REF(h) (++(h)->refs)
#define TAOS_LRU_ENTRY_REF(h)
(++(h)->refs)
static
bool
taosLRUEntryUnref
(
SLRUEntry
*
entry
)
{
static
bool
taosLRUEntryUnref
(
SLRUEntry
*
entry
)
{
assert
(
entry
->
refs
>
0
);
assert
(
entry
->
refs
>
0
);
...
@@ -90,7 +111,7 @@ struct SLRUEntryTable {
...
@@ -90,7 +111,7 @@ struct SLRUEntryTable {
static
int
taosLRUEntryTableInit
(
SLRUEntryTable
*
table
,
int
maxUpperHashBits
)
{
static
int
taosLRUEntryTableInit
(
SLRUEntryTable
*
table
,
int
maxUpperHashBits
)
{
table
->
lengthBits
=
4
;
table
->
lengthBits
=
4
;
table
->
list
=
taosMemoryCalloc
(
1
<<
table
->
lengthBits
,
sizeof
(
SLRUEntry
*
));
table
->
list
=
taosMemoryCalloc
(
1
<<
table
->
lengthBits
,
sizeof
(
SLRUEntry
*
));
if
(
!
table
->
list
)
{
if
(
!
table
->
list
)
{
return
-
1
;
return
-
1
;
}
}
...
@@ -125,7 +146,7 @@ static void taosLRUEntryTableCleanup(SLRUEntryTable *table) {
...
@@ -125,7 +146,7 @@ static void taosLRUEntryTableCleanup(SLRUEntryTable *table) {
taosMemoryFree
(
table
->
list
);
taosMemoryFree
(
table
->
list
);
}
}
static
SLRUEntry
**
taosLRUEntryTableFindPtr
(
SLRUEntryTable
*
table
,
const
void
*
key
,
size_t
keyLen
,
uint32_t
hash
)
{
static
SLRUEntry
**
taosLRUEntryTableFindPtr
(
SLRUEntryTable
*
table
,
const
void
*
key
,
size_t
keyLen
,
uint32_t
hash
)
{
SLRUEntry
**
entry
=
&
table
->
list
[
hash
>>
(
32
-
table
->
lengthBits
)];
SLRUEntry
**
entry
=
&
table
->
list
[
hash
>>
(
32
-
table
->
lengthBits
)];
while
(
*
entry
&&
((
*
entry
)
->
hash
!=
hash
||
memcmp
(
key
,
(
*
entry
)
->
keyData
,
keyLen
)
!=
0
))
{
while
(
*
entry
&&
((
*
entry
)
->
hash
!=
hash
||
memcmp
(
key
,
(
*
entry
)
->
keyData
,
keyLen
)
!=
0
))
{
entry
=
&
(
*
entry
)
->
nextHash
;
entry
=
&
(
*
entry
)
->
nextHash
;
...
@@ -134,7 +155,7 @@ static SLRUEntry **taosLRUEntryTableFindPtr(SLRUEntryTable * table, const void *
...
@@ -134,7 +155,7 @@ static SLRUEntry **taosLRUEntryTableFindPtr(SLRUEntryTable * table, const void *
return
entry
;
return
entry
;
}
}
static
void
taosLRUEntryTableResize
(
SLRUEntryTable
*
table
)
{
static
void
taosLRUEntryTableResize
(
SLRUEntryTable
*
table
)
{
int
lengthBits
=
table
->
lengthBits
;
int
lengthBits
=
table
->
lengthBits
;
if
(
lengthBits
>=
table
->
maxLengthBits
)
{
if
(
lengthBits
>=
table
->
maxLengthBits
)
{
return
;
return
;
...
@@ -144,9 +165,9 @@ static void taosLRUEntryTableResize(SLRUEntryTable * table) {
...
@@ -144,9 +165,9 @@ static void taosLRUEntryTableResize(SLRUEntryTable * table) {
return
;
return
;
}
}
uint32_t
oldLength
=
1
<<
lengthBits
;
uint32_t
oldLength
=
1
<<
lengthBits
;
int
newLengthBits
=
lengthBits
+
1
;
int
newLengthBits
=
lengthBits
+
1
;
SLRUEntry
**
newList
=
taosMemoryCalloc
(
1
<<
newLengthBits
,
sizeof
(
SLRUEntry
*
));
SLRUEntry
**
newList
=
taosMemoryCalloc
(
1
<<
newLengthBits
,
sizeof
(
SLRUEntry
*
));
if
(
!
newList
)
{
if
(
!
newList
)
{
return
;
return
;
}
}
...
@@ -154,8 +175,8 @@ static void taosLRUEntryTableResize(SLRUEntryTable * table) {
...
@@ -154,8 +175,8 @@ static void taosLRUEntryTableResize(SLRUEntryTable * table) {
for
(
uint32_t
i
=
0
;
i
<
oldLength
;
++
i
)
{
for
(
uint32_t
i
=
0
;
i
<
oldLength
;
++
i
)
{
SLRUEntry
*
entry
=
table
->
list
[
i
];
SLRUEntry
*
entry
=
table
->
list
[
i
];
while
(
entry
)
{
while
(
entry
)
{
SLRUEntry
*
next
=
entry
->
nextHash
;
SLRUEntry
*
next
=
entry
->
nextHash
;
uint32_t
hash
=
entry
->
hash
;
uint32_t
hash
=
entry
->
hash
;
SLRUEntry
**
ptr
=
&
newList
[
hash
>>
(
32
-
newLengthBits
)];
SLRUEntry
**
ptr
=
&
newList
[
hash
>>
(
32
-
newLengthBits
)];
entry
->
nextHash
=
*
ptr
;
entry
->
nextHash
=
*
ptr
;
*
ptr
=
entry
;
*
ptr
=
entry
;
...
@@ -170,13 +191,13 @@ static void taosLRUEntryTableResize(SLRUEntryTable * table) {
...
@@ -170,13 +191,13 @@ static void taosLRUEntryTableResize(SLRUEntryTable * table) {
table
->
lengthBits
=
newLengthBits
;
table
->
lengthBits
=
newLengthBits
;
}
}
static
SLRUEntry
*
taosLRUEntryTableLookup
(
SLRUEntryTable
*
table
,
const
void
*
key
,
size_t
keyLen
,
uint32_t
hash
)
{
static
SLRUEntry
*
taosLRUEntryTableLookup
(
SLRUEntryTable
*
table
,
const
void
*
key
,
size_t
keyLen
,
uint32_t
hash
)
{
return
*
taosLRUEntryTableFindPtr
(
table
,
key
,
keyLen
,
hash
);
return
*
taosLRUEntryTableFindPtr
(
table
,
key
,
keyLen
,
hash
);
}
}
static
SLRUEntry
*
taosLRUEntryTableInsert
(
SLRUEntryTable
*
table
,
SLRUEntry
*
entry
)
{
static
SLRUEntry
*
taosLRUEntryTableInsert
(
SLRUEntryTable
*
table
,
SLRUEntry
*
entry
)
{
SLRUEntry
**
ptr
=
taosLRUEntryTableFindPtr
(
table
,
entry
->
keyData
,
entry
->
keyLength
,
entry
->
hash
);
SLRUEntry
**
ptr
=
taosLRUEntryTableFindPtr
(
table
,
entry
->
keyData
,
entry
->
keyLength
,
entry
->
hash
);
SLRUEntry
*
old
=
*
ptr
;
SLRUEntry
*
old
=
*
ptr
;
entry
->
nextHash
=
(
old
==
NULL
)
?
NULL
:
old
->
nextHash
;
entry
->
nextHash
=
(
old
==
NULL
)
?
NULL
:
old
->
nextHash
;
*
ptr
=
entry
;
*
ptr
=
entry
;
if
(
old
==
NULL
)
{
if
(
old
==
NULL
)
{
...
@@ -189,9 +210,9 @@ static SLRUEntry *taosLRUEntryTableInsert(SLRUEntryTable * table, SLRUEntry *ent
...
@@ -189,9 +210,9 @@ static SLRUEntry *taosLRUEntryTableInsert(SLRUEntryTable * table, SLRUEntry *ent
return
old
;
return
old
;
}
}
static
SLRUEntry
*
taosLRUEntryTableRemove
(
SLRUEntryTable
*
table
,
const
void
*
key
,
size_t
keyLen
,
uint32_t
hash
)
{
static
SLRUEntry
*
taosLRUEntryTableRemove
(
SLRUEntryTable
*
table
,
const
void
*
key
,
size_t
keyLen
,
uint32_t
hash
)
{
SLRUEntry
**
entry
=
taosLRUEntryTableFindPtr
(
table
,
key
,
keyLen
,
hash
);
SLRUEntry
**
entry
=
taosLRUEntryTableFindPtr
(
table
,
key
,
keyLen
,
hash
);
SLRUEntry
*
result
=
*
entry
;
SLRUEntry
*
result
=
*
entry
;
if
(
result
)
{
if
(
result
)
{
*
entry
=
result
->
nextHash
;
*
entry
=
result
->
nextHash
;
--
table
->
elems
;
--
table
->
elems
;
...
@@ -201,17 +222,17 @@ static SLRUEntry *taosLRUEntryTableRemove(SLRUEntryTable * table, const void *ke
...
@@ -201,17 +222,17 @@ static SLRUEntry *taosLRUEntryTableRemove(SLRUEntryTable * table, const void *ke
}
}
struct
SLRUCacheShard
{
struct
SLRUCacheShard
{
size_t
capacity
;
size_t
capacity
;
size_t
highPriPoolUsage
;
size_t
highPriPoolUsage
;
bool
strictCapacity
;
bool
strictCapacity
;
double
highPriPoolRatio
;
double
highPriPoolRatio
;
double
highPriPoolCapacity
;
double
highPriPoolCapacity
;
SLRUEntry
lru
;
SLRUEntry
lru
;
SLRUEntry
*
lruLowPri
;
SLRUEntry
*
lruLowPri
;
SLRUEntryTable
table
;
SLRUEntryTable
table
;
size_t
usage
;
// Memory size for entries residing in the cache.
size_t
usage
;
// Memory size for entries residing in the cache.
size_t
lruUsage
;
// Memory size for entries residing only in the LRU list.
size_t
lruUsage
;
// Memory size for entries residing only in the LRU list.
TdThreadMutex
mutex
;
TdThreadMutex
mutex
;
};
};
#define TAOS_LRU_CACHE_SHARD_HASH32(key, len) (MurmurHash3_32((key), (len)))
#define TAOS_LRU_CACHE_SHARD_HASH32(key, len) (MurmurHash3_32((key), (len)))
...
@@ -231,8 +252,7 @@ static void taosLRUCacheShardLRUInsert(SLRUCacheShard *shard, SLRUEntry *e) {
...
@@ -231,8 +252,7 @@ static void taosLRUCacheShardLRUInsert(SLRUCacheShard *shard, SLRUEntry *e) {
assert
(
e
->
next
==
NULL
);
assert
(
e
->
next
==
NULL
);
assert
(
e
->
prev
==
NULL
);
assert
(
e
->
prev
==
NULL
);
if
(
shard
->
highPriPoolRatio
>
0
if
(
shard
->
highPriPoolRatio
>
0
&&
(
TAOS_LRU_ENTRY_IS_HIGH_PRI
(
e
)
||
TAOS_LRU_ENTRY_HAS_HIT
(
e
)))
{
&&
(
TAOS_LRU_ENTRY_IS_HIGH_PRI
(
e
)
||
TAOS_LRU_ENTRY_HAS_HIT
(
e
)))
{
e
->
next
=
&
shard
->
lru
;
e
->
next
=
&
shard
->
lru
;
e
->
prev
=
shard
->
lru
.
prev
;
e
->
prev
=
shard
->
lru
.
prev
;
...
@@ -248,7 +268,7 @@ static void taosLRUCacheShardLRUInsert(SLRUCacheShard *shard, SLRUEntry *e) {
...
@@ -248,7 +268,7 @@ static void taosLRUCacheShardLRUInsert(SLRUCacheShard *shard, SLRUEntry *e) {
e
->
prev
->
next
=
e
;
e
->
prev
->
next
=
e
;
e
->
next
->
prev
=
e
;
e
->
next
->
prev
=
e
;
TAOS_LRU_ENTRY_SET_IN_HIGH_POOL
(
e
,
false
);
TAOS_LRU_ENTRY_SET_IN_HIGH_POOL
(
e
,
false
);
shard
->
lruLowPri
=
e
;
shard
->
lruLowPri
=
e
;
}
}
...
@@ -304,13 +324,13 @@ static void taosLRUCacheShardSetCapacity(SLRUCacheShard *shard, size_t capacity)
...
@@ -304,13 +324,13 @@ static void taosLRUCacheShardSetCapacity(SLRUCacheShard *shard, size_t capacity)
for
(
int
i
=
0
;
i
<
taosArrayGetSize
(
lastReferenceList
);
++
i
)
{
for
(
int
i
=
0
;
i
<
taosArrayGetSize
(
lastReferenceList
);
++
i
)
{
SLRUEntry
*
entry
=
taosArrayGetP
(
lastReferenceList
,
i
);
SLRUEntry
*
entry
=
taosArrayGetP
(
lastReferenceList
,
i
);
taosLRUEntryFree
(
entry
);
taosLRUEntryFree
(
entry
);
}
}
taosArrayDestroy
(
lastReferenceList
);
taosArrayDestroy
(
lastReferenceList
);
}
}
static
int
taosLRUCacheShardInit
(
SLRUCacheShard
*
shard
,
size_t
capacity
,
bool
strict
,
static
int
taosLRUCacheShardInit
(
SLRUCacheShard
*
shard
,
size_t
capacity
,
bool
strict
,
double
highPriPoolRatio
,
double
highPriPoolRatio
,
int
maxUpperHashBits
)
{
int
maxUpperHashBits
)
{
if
(
taosLRUEntryTableInit
(
&
shard
->
table
,
maxUpperHashBits
)
<
0
)
{
if
(
taosLRUEntryTableInit
(
&
shard
->
table
,
maxUpperHashBits
)
<
0
)
{
return
-
1
;
return
-
1
;
}
}
...
@@ -341,23 +361,24 @@ static void taosLRUCacheShardCleanup(SLRUCacheShard *shard) {
...
@@ -341,23 +361,24 @@ static void taosLRUCacheShardCleanup(SLRUCacheShard *shard) {
taosLRUEntryTableCleanup
(
&
shard
->
table
);
taosLRUEntryTableCleanup
(
&
shard
->
table
);
}
}
static
LRUStatus
taosLRUCacheShardInsertEntry
(
SLRUCacheShard
*
shard
,
SLRUEntry
*
e
,
LRUHandle
**
handle
,
bool
freeOnFail
)
{
static
LRUStatus
taosLRUCacheShardInsertEntry
(
SLRUCacheShard
*
shard
,
SLRUEntry
*
e
,
LRUHandle
**
handle
,
bool
freeOnFail
)
{
LRUStatus
status
=
TAOS_LRU_STATUS_OK
;
LRUStatus
status
=
TAOS_LRU_STATUS_OK
;
SArray
*
lastReferenceList
=
taosArrayInit
(
16
,
POINTER_BYTES
);
SArray
*
lastReferenceList
=
taosArrayInit
(
16
,
POINTER_BYTES
);
taosThreadMutexLock
(
&
shard
->
mutex
);
taosThreadMutexLock
(
&
shard
->
mutex
);
taosLRUCacheShardEvictLRU
(
shard
,
e
->
totalCharge
,
lastReferenceList
);
taosLRUCacheShardEvictLRU
(
shard
,
e
->
totalCharge
,
lastReferenceList
);
if
(
shard
->
usage
+
e
->
totalCharge
>
shard
->
capacity
&&
(
shard
->
strictCapacity
||
handle
==
NULL
))
{
if
(
shard
->
usage
+
e
->
totalCharge
>
shard
->
capacity
&&
(
shard
->
strictCapacity
||
handle
==
NULL
))
{
TAOS_LRU_ENTRY_SET_IN_CACHE
(
e
,
false
);
TAOS_LRU_ENTRY_SET_IN_CACHE
(
e
,
false
);
if
(
handle
==
NULL
)
{
if
(
handle
==
NULL
)
{
taosArrayPush
(
lastReferenceList
,
&
e
);
taosArrayPush
(
lastReferenceList
,
&
e
);
}
else
{
}
else
{
if
(
freeOnFail
)
{
if
(
freeOnFail
)
{
taosMemoryFree
(
e
);
taosMemoryFree
(
e
);
*
handle
=
NULL
;
*
handle
=
NULL
;
}
}
status
=
TAOS_LRU_STATUS_INCOMPLETE
;
status
=
TAOS_LRU_STATUS_INCOMPLETE
;
...
@@ -371,21 +392,21 @@ static LRUStatus taosLRUCacheShardInsertEntry(SLRUCacheShard *shard, SLRUEntry *
...
@@ -371,21 +392,21 @@ static LRUStatus taosLRUCacheShardInsertEntry(SLRUCacheShard *shard, SLRUEntry *
assert
(
TAOS_LRU_ENTRY_IN_CACHE
(
old
));
assert
(
TAOS_LRU_ENTRY_IN_CACHE
(
old
));
TAOS_LRU_ENTRY_SET_IN_CACHE
(
old
,
false
);
TAOS_LRU_ENTRY_SET_IN_CACHE
(
old
,
false
);
if
(
!
TAOS_LRU_ENTRY_HAS_REFS
(
e
))
{
if
(
!
TAOS_LRU_ENTRY_HAS_REFS
(
e
))
{
taosLRUCacheShardLRURemove
(
shard
,
old
);
taosLRUCacheShardLRURemove
(
shard
,
old
);
assert
(
shard
->
usage
>=
old
->
totalCharge
);
assert
(
shard
->
usage
>=
old
->
totalCharge
);
shard
->
usage
-=
old
->
totalCharge
;
shard
->
usage
-=
old
->
totalCharge
;
taosArrayPush
(
lastReferenceList
,
&
old
);
taosArrayPush
(
lastReferenceList
,
&
old
);
}
}
}
}
if
(
handle
==
NULL
)
{
if
(
handle
==
NULL
)
{
taosLRUCacheShardLRUInsert
(
shard
,
e
);
taosLRUCacheShardLRUInsert
(
shard
,
e
);
}
else
{
}
else
{
if
(
!
TAOS_LRU_ENTRY_HAS_REFS
(
e
))
{
if
(
!
TAOS_LRU_ENTRY_HAS_REFS
(
e
))
{
TAOS_LRU_ENTRY_REF
(
e
);
TAOS_LRU_ENTRY_REF
(
e
);
}
}
*
handle
=
(
LRUHandle
*
)
e
;
*
handle
=
(
LRUHandle
*
)
e
;
}
}
}
}
...
@@ -394,7 +415,7 @@ static LRUStatus taosLRUCacheShardInsertEntry(SLRUCacheShard *shard, SLRUEntry *
...
@@ -394,7 +415,7 @@ static LRUStatus taosLRUCacheShardInsertEntry(SLRUCacheShard *shard, SLRUEntry *
for
(
int
i
=
0
;
i
<
taosArrayGetSize
(
lastReferenceList
);
++
i
)
{
for
(
int
i
=
0
;
i
<
taosArrayGetSize
(
lastReferenceList
);
++
i
)
{
SLRUEntry
*
entry
=
taosArrayGetP
(
lastReferenceList
,
i
);
SLRUEntry
*
entry
=
taosArrayGetP
(
lastReferenceList
,
i
);
taosLRUEntryFree
(
entry
);
taosLRUEntryFree
(
entry
);
}
}
taosArrayDestroy
(
lastReferenceList
);
taosArrayDestroy
(
lastReferenceList
);
...
@@ -402,8 +423,8 @@ static LRUStatus taosLRUCacheShardInsertEntry(SLRUCacheShard *shard, SLRUEntry *
...
@@ -402,8 +423,8 @@ static LRUStatus taosLRUCacheShardInsertEntry(SLRUCacheShard *shard, SLRUEntry *
}
}
static
LRUStatus
taosLRUCacheShardInsert
(
SLRUCacheShard
*
shard
,
const
void
*
key
,
size_t
keyLen
,
uint32_t
hash
,
static
LRUStatus
taosLRUCacheShardInsert
(
SLRUCacheShard
*
shard
,
const
void
*
key
,
size_t
keyLen
,
uint32_t
hash
,
void
*
value
,
size_t
charge
,
_taos_lru_deleter_t
deleter
,
void
*
value
,
size_t
charge
,
_taos_lru_deleter_t
deleter
,
LRUHandle
**
handle
,
LRUHandle
**
handle
,
LRUPriority
priority
)
{
LRUPriority
priority
)
{
SLRUEntry
*
e
=
taosMemoryCalloc
(
1
,
sizeof
(
SLRUEntry
)
-
1
+
keyLen
);
SLRUEntry
*
e
=
taosMemoryCalloc
(
1
,
sizeof
(
SLRUEntry
)
-
1
+
keyLen
);
if
(
!
e
)
{
if
(
!
e
)
{
return
TAOS_LRU_STATUS_FAIL
;
return
TAOS_LRU_STATUS_FAIL
;
...
@@ -442,7 +463,7 @@ static LRUHandle *taosLRUCacheShardLookup(SLRUCacheShard *shard, const void *key
...
@@ -442,7 +463,7 @@ static LRUHandle *taosLRUCacheShardLookup(SLRUCacheShard *shard, const void *key
taosThreadMutexUnlock
(
&
shard
->
mutex
);
taosThreadMutexUnlock
(
&
shard
->
mutex
);
return
(
LRUHandle
*
)
e
;
return
(
LRUHandle
*
)
e
;
}
}
static
void
taosLRUCacheShardErase
(
SLRUCacheShard
*
shard
,
const
void
*
key
,
size_t
keyLen
,
uint32_t
hash
)
{
static
void
taosLRUCacheShardErase
(
SLRUCacheShard
*
shard
,
const
void
*
key
,
size_t
keyLen
,
uint32_t
hash
)
{
...
@@ -482,7 +503,7 @@ static void taosLRUCacheShardEraseUnrefEntries(SLRUCacheShard *shard) {
...
@@ -482,7 +503,7 @@ static void taosLRUCacheShardEraseUnrefEntries(SLRUCacheShard *shard) {
TAOS_LRU_ENTRY_SET_IN_CACHE
(
old
,
false
);
TAOS_LRU_ENTRY_SET_IN_CACHE
(
old
,
false
);
assert
(
shard
->
usage
>=
old
->
totalCharge
);
assert
(
shard
->
usage
>=
old
->
totalCharge
);
shard
->
usage
-=
old
->
totalCharge
;
shard
->
usage
-=
old
->
totalCharge
;
taosArrayPush
(
lastReferenceList
,
&
old
);
taosArrayPush
(
lastReferenceList
,
&
old
);
}
}
...
@@ -491,14 +512,14 @@ static void taosLRUCacheShardEraseUnrefEntries(SLRUCacheShard *shard) {
...
@@ -491,14 +512,14 @@ static void taosLRUCacheShardEraseUnrefEntries(SLRUCacheShard *shard) {
for
(
int
i
=
0
;
i
<
taosArrayGetSize
(
lastReferenceList
);
++
i
)
{
for
(
int
i
=
0
;
i
<
taosArrayGetSize
(
lastReferenceList
);
++
i
)
{
SLRUEntry
*
entry
=
taosArrayGetP
(
lastReferenceList
,
i
);
SLRUEntry
*
entry
=
taosArrayGetP
(
lastReferenceList
,
i
);
taosLRUEntryFree
(
entry
);
taosLRUEntryFree
(
entry
);
}
}
taosArrayDestroy
(
lastReferenceList
);
taosArrayDestroy
(
lastReferenceList
);
}
}
static
bool
taosLRUCacheShardRef
(
SLRUCacheShard
*
shard
,
LRUHandle
*
handle
)
{
static
bool
taosLRUCacheShardRef
(
SLRUCacheShard
*
shard
,
LRUHandle
*
handle
)
{
SLRUEntry
*
e
=
(
SLRUEntry
*
)
handle
;
SLRUEntry
*
e
=
(
SLRUEntry
*
)
handle
;
taosThreadMutexLock
(
&
shard
->
mutex
);
taosThreadMutexLock
(
&
shard
->
mutex
);
assert
(
TAOS_LRU_ENTRY_HAS_REFS
(
e
));
assert
(
TAOS_LRU_ENTRY_HAS_REFS
(
e
));
...
@@ -514,8 +535,8 @@ static bool taosLRUCacheShardRelease(SLRUCacheShard *shard, LRUHandle *handle, b
...
@@ -514,8 +535,8 @@ static bool taosLRUCacheShardRelease(SLRUCacheShard *shard, LRUHandle *handle, b
return
false
;
return
false
;
}
}
SLRUEntry
*
e
=
(
SLRUEntry
*
)
handle
;
SLRUEntry
*
e
=
(
SLRUEntry
*
)
handle
;
bool
lastReference
=
false
;
bool
lastReference
=
false
;
taosThreadMutexLock
(
&
shard
->
mutex
);
taosThreadMutexLock
(
&
shard
->
mutex
);
...
@@ -537,7 +558,7 @@ static bool taosLRUCacheShardRelease(SLRUCacheShard *shard, LRUHandle *handle, b
...
@@ -537,7 +558,7 @@ static bool taosLRUCacheShardRelease(SLRUCacheShard *shard, LRUHandle *handle, b
assert
(
shard
->
usage
>=
e
->
totalCharge
);
assert
(
shard
->
usage
>=
e
->
totalCharge
);
shard
->
usage
-=
e
->
totalCharge
;
shard
->
usage
-=
e
->
totalCharge
;
}
}
taosThreadMutexUnlock
(
&
shard
->
mutex
);
taosThreadMutexUnlock
(
&
shard
->
mutex
);
if
(
lastReference
)
{
if
(
lastReference
)
{
...
@@ -549,7 +570,7 @@ static bool taosLRUCacheShardRelease(SLRUCacheShard *shard, LRUHandle *handle, b
...
@@ -549,7 +570,7 @@ static bool taosLRUCacheShardRelease(SLRUCacheShard *shard, LRUHandle *handle, b
static
size_t
taosLRUCacheShardGetUsage
(
SLRUCacheShard
*
shard
)
{
static
size_t
taosLRUCacheShardGetUsage
(
SLRUCacheShard
*
shard
)
{
size_t
usage
=
0
;
size_t
usage
=
0
;
taosThreadMutexLock
(
&
shard
->
mutex
);
taosThreadMutexLock
(
&
shard
->
mutex
);
usage
=
shard
->
usage
;
usage
=
shard
->
usage
;
taosThreadMutexUnlock
(
&
shard
->
mutex
);
taosThreadMutexUnlock
(
&
shard
->
mutex
);
...
@@ -559,7 +580,7 @@ static size_t taosLRUCacheShardGetUsage(SLRUCacheShard *shard) {
...
@@ -559,7 +580,7 @@ static size_t taosLRUCacheShardGetUsage(SLRUCacheShard *shard) {
static
size_t
taosLRUCacheShardGetPinnedUsage
(
SLRUCacheShard
*
shard
)
{
static
size_t
taosLRUCacheShardGetPinnedUsage
(
SLRUCacheShard
*
shard
)
{
size_t
usage
=
0
;
size_t
usage
=
0
;
taosThreadMutexLock
(
&
shard
->
mutex
);
taosThreadMutexLock
(
&
shard
->
mutex
);
assert
(
shard
->
usage
>=
shard
->
lruUsage
);
assert
(
shard
->
usage
>=
shard
->
lruUsage
);
...
@@ -579,11 +600,11 @@ static void taosLRUCacheShardSetStrictCapacity(SLRUCacheShard *shard, bool stric
...
@@ -579,11 +600,11 @@ static void taosLRUCacheShardSetStrictCapacity(SLRUCacheShard *shard, bool stric
}
}
struct
SShardedCache
{
struct
SShardedCache
{
uint32_t
shardMask
;
uint32_t
shardMask
;
TdThreadMutex
capacityMutex
;
TdThreadMutex
capacityMutex
;
size_t
capacity
;
size_t
capacity
;
bool
strictCapacity
;
bool
strictCapacity
;
uint64_t
lastId
;
// atomic var for last id
uint64_t
lastId
;
// atomic var for last id
};
};
struct
SLRUCache
{
struct
SLRUCache
{
...
@@ -593,7 +614,7 @@ struct SLRUCache {
...
@@ -593,7 +614,7 @@ struct SLRUCache {
};
};
static
int
getDefaultCacheShardBits
(
size_t
capacity
)
{
static
int
getDefaultCacheShardBits
(
size_t
capacity
)
{
int
numShardBits
=
0
;
int
numShardBits
=
0
;
size_t
minShardSize
=
512
*
1024
;
size_t
minShardSize
=
512
*
1024
;
size_t
numShards
=
capacity
/
minShardSize
;
size_t
numShards
=
capacity
/
minShardSize
;
while
(
numShards
>>=
1
)
{
while
(
numShards
>>=
1
)
{
...
@@ -621,7 +642,7 @@ SLRUCache *taosLRUCacheInit(size_t capacity, int numShardBits, double highPriPoo
...
@@ -621,7 +642,7 @@ SLRUCache *taosLRUCacheInit(size_t capacity, int numShardBits, double highPriPoo
numShardBits
=
getDefaultCacheShardBits
(
capacity
);
numShardBits
=
getDefaultCacheShardBits
(
capacity
);
}
}
int
numShards
=
1
<<
numShardBits
;
int
numShards
=
1
<<
numShardBits
;
cache
->
shards
=
taosMemoryCalloc
(
numShards
,
sizeof
(
SLRUCacheShard
));
cache
->
shards
=
taosMemoryCalloc
(
numShards
,
sizeof
(
SLRUCacheShard
));
if
(
!
cache
->
shards
)
{
if
(
!
cache
->
shards
)
{
taosMemoryFree
(
cache
);
taosMemoryFree
(
cache
);
...
@@ -629,7 +650,7 @@ SLRUCache *taosLRUCacheInit(size_t capacity, int numShardBits, double highPriPoo
...
@@ -629,7 +650,7 @@ SLRUCache *taosLRUCacheInit(size_t capacity, int numShardBits, double highPriPoo
return
NULL
;
return
NULL
;
}
}
bool
strictCapacity
=
1
;
bool
strictCapacity
=
1
;
size_t
perShard
=
(
capacity
+
(
numShards
-
1
))
/
numShards
;
size_t
perShard
=
(
capacity
+
(
numShards
-
1
))
/
numShards
;
for
(
int
i
=
0
;
i
<
numShards
;
++
i
)
{
for
(
int
i
=
0
;
i
<
numShards
;
++
i
)
{
taosLRUCacheShardInit
(
&
cache
->
shards
[
i
],
perShard
,
strictCapacity
,
highPriPoolRatio
,
32
-
numShardBits
);
taosLRUCacheShardInit
(
&
cache
->
shards
[
i
],
perShard
,
strictCapacity
,
highPriPoolRatio
,
32
-
numShardBits
);
...
@@ -653,7 +674,7 @@ void taosLRUCacheCleanup(SLRUCache *cache) {
...
@@ -653,7 +674,7 @@ void taosLRUCacheCleanup(SLRUCache *cache) {
int
numShards
=
cache
->
numShards
;
int
numShards
=
cache
->
numShards
;
assert
(
numShards
>
0
);
assert
(
numShards
>
0
);
for
(
int
i
=
0
;
i
<
numShards
;
++
i
)
{
for
(
int
i
=
0
;
i
<
numShards
;
++
i
)
{
taosLRUCacheShardCleanup
(
&
cache
->
shards
[
i
]);
taosLRUCacheShardCleanup
(
&
cache
->
shards
[
i
]);
}
}
taosMemoryFree
(
cache
->
shards
);
taosMemoryFree
(
cache
->
shards
);
cache
->
shards
=
0
;
cache
->
shards
=
0
;
...
@@ -666,11 +687,12 @@ void taosLRUCacheCleanup(SLRUCache *cache) {
...
@@ -666,11 +687,12 @@ void taosLRUCacheCleanup(SLRUCache *cache) {
}
}
LRUStatus
taosLRUCacheInsert
(
SLRUCache
*
cache
,
const
void
*
key
,
size_t
keyLen
,
void
*
value
,
size_t
charge
,
LRUStatus
taosLRUCacheInsert
(
SLRUCache
*
cache
,
const
void
*
key
,
size_t
keyLen
,
void
*
value
,
size_t
charge
,
_taos_lru_deleter_t
deleter
,
LRUHandle
**
handle
,
LRUPriority
priority
)
{
_taos_lru_deleter_t
deleter
,
LRUHandle
**
handle
,
LRUPriority
priority
)
{
uint32_t
hash
=
TAOS_LRU_CACHE_SHARD_HASH32
(
key
,
keyLen
);
uint32_t
hash
=
TAOS_LRU_CACHE_SHARD_HASH32
(
key
,
keyLen
);
uint32_t
shardIndex
=
hash
&
cache
->
shardedCache
.
shardMask
;
uint32_t
shardIndex
=
hash
&
cache
->
shardedCache
.
shardMask
;
return
taosLRUCacheShardInsert
(
&
cache
->
shards
[
shardIndex
],
key
,
keyLen
,
hash
,
value
,
charge
,
deleter
,
handle
,
priority
);
return
taosLRUCacheShardInsert
(
&
cache
->
shards
[
shardIndex
],
key
,
keyLen
,
hash
,
value
,
charge
,
deleter
,
handle
,
priority
);
}
}
LRUHandle
*
taosLRUCacheLookup
(
SLRUCache
*
cache
,
const
void
*
key
,
size_t
keyLen
)
{
LRUHandle
*
taosLRUCacheLookup
(
SLRUCache
*
cache
,
const
void
*
key
,
size_t
keyLen
)
{
...
@@ -699,7 +721,7 @@ bool taosLRUCacheRef(SLRUCache *cache, LRUHandle *handle) {
...
@@ -699,7 +721,7 @@ bool taosLRUCacheRef(SLRUCache *cache, LRUHandle *handle) {
return
false
;
return
false
;
}
}
uint32_t
hash
=
((
SLRUEntry
*
)
handle
)
->
hash
;
uint32_t
hash
=
((
SLRUEntry
*
)
handle
)
->
hash
;
uint32_t
shardIndex
=
hash
&
cache
->
shardedCache
.
shardMask
;
uint32_t
shardIndex
=
hash
&
cache
->
shardedCache
.
shardMask
;
return
taosLRUCacheShardRef
(
&
cache
->
shards
[
shardIndex
],
handle
);
return
taosLRUCacheShardRef
(
&
cache
->
shards
[
shardIndex
],
handle
);
...
@@ -710,15 +732,13 @@ bool taosLRUCacheRelease(SLRUCache *cache, LRUHandle *handle, bool eraseIfLastRe
...
@@ -710,15 +732,13 @@ bool taosLRUCacheRelease(SLRUCache *cache, LRUHandle *handle, bool eraseIfLastRe
return
false
;
return
false
;
}
}
uint32_t
hash
=
((
SLRUEntry
*
)
handle
)
->
hash
;
uint32_t
hash
=
((
SLRUEntry
*
)
handle
)
->
hash
;
uint32_t
shardIndex
=
hash
&
cache
->
shardedCache
.
shardMask
;
uint32_t
shardIndex
=
hash
&
cache
->
shardedCache
.
shardMask
;
return
taosLRUCacheShardRelease
(
&
cache
->
shards
[
shardIndex
],
handle
,
eraseIfLastRef
);
return
taosLRUCacheShardRelease
(
&
cache
->
shards
[
shardIndex
],
handle
,
eraseIfLastRef
);
}
}
void
*
taosLRUCacheValue
(
SLRUCache
*
cache
,
LRUHandle
*
handle
)
{
void
*
taosLRUCacheValue
(
SLRUCache
*
cache
,
LRUHandle
*
handle
)
{
return
((
SLRUEntry
*
)
handle
)
->
value
;
}
return
((
SLRUEntry
*
)
handle
)
->
value
;
}
size_t
taosLRUCacheGetUsage
(
SLRUCache
*
cache
)
{
size_t
taosLRUCacheGetUsage
(
SLRUCache
*
cache
)
{
size_t
usage
=
0
;
size_t
usage
=
0
;
...
@@ -742,7 +762,7 @@ size_t taosLRUCacheGetPinnedUsage(SLRUCache *cache) {
...
@@ -742,7 +762,7 @@ size_t taosLRUCacheGetPinnedUsage(SLRUCache *cache) {
void
taosLRUCacheSetCapacity
(
SLRUCache
*
cache
,
size_t
capacity
)
{
void
taosLRUCacheSetCapacity
(
SLRUCache
*
cache
,
size_t
capacity
)
{
uint32_t
numShards
=
cache
->
numShards
;
uint32_t
numShards
=
cache
->
numShards
;
size_t
perShard
=
(
capacity
+
(
numShards
=
1
))
/
numShards
;
size_t
perShard
=
(
capacity
+
(
numShards
-
1
))
/
numShards
;
taosThreadMutexLock
(
&
cache
->
shardedCache
.
capacityMutex
);
taosThreadMutexLock
(
&
cache
->
shardedCache
.
capacityMutex
);
...
@@ -751,7 +771,7 @@ void taosLRUCacheSetCapacity(SLRUCache *cache, size_t capacity) {
...
@@ -751,7 +771,7 @@ void taosLRUCacheSetCapacity(SLRUCache *cache, size_t capacity) {
}
}
cache
->
shardedCache
.
capacity
=
capacity
;
cache
->
shardedCache
.
capacity
=
capacity
;
taosThreadMutexUnlock
(
&
cache
->
shardedCache
.
capacityMutex
);
taosThreadMutexUnlock
(
&
cache
->
shardedCache
.
capacityMutex
);
}
}
...
@@ -777,7 +797,7 @@ void taosLRUCacheSetStrictCapacity(SLRUCache *cache, bool strict) {
...
@@ -777,7 +797,7 @@ void taosLRUCacheSetStrictCapacity(SLRUCache *cache, bool strict) {
}
}
cache
->
shardedCache
.
strictCapacity
=
strict
;
cache
->
shardedCache
.
strictCapacity
=
strict
;
taosThreadMutexUnlock
(
&
cache
->
shardedCache
.
capacityMutex
);
taosThreadMutexUnlock
(
&
cache
->
shardedCache
.
capacityMutex
);
}
}
...
...
tests/script/tsim/tmq/snapshot.sim
浏览文件 @
4b6ab7fe
...
@@ -111,7 +111,7 @@ endi
...
@@ -111,7 +111,7 @@ endi
$consumerId = 0
$consumerId = 0
$totalMsgOfStb = $ctbNum * $rowsPerCtb
$totalMsgOfStb = $ctbNum * $rowsPerCtb
$expectmsgcnt = 1
$expectmsgcnt = 1
000000
$expectrowcnt = 100
$expectrowcnt = 100
sql insert into consumeinfo values (now , $consumerId , $topicList , $keyList , $expectmsgcnt , $ifcheckdata , $ifmanualcommit )
sql insert into consumeinfo values (now , $consumerId , $topicList , $keyList , $expectmsgcnt , $ifcheckdata , $ifmanualcommit )
...
@@ -131,9 +131,6 @@ endi
...
@@ -131,9 +131,6 @@ endi
if $data[0][1] != $consumerId then
if $data[0][1] != $consumerId then
return -1
return -1
endi
endi
if $data[0][2] != $expectmsgcnt then
return -1
endi
if $data[0][3] != $expectrowcnt then
if $data[0][3] != $expectrowcnt then
return -1
return -1
endi
endi
...
@@ -183,7 +180,7 @@ endi
...
@@ -183,7 +180,7 @@ endi
$consumerId = 0
$consumerId = 0
$totalMsgOfCtb = $rowsPerCtb
$totalMsgOfCtb = $rowsPerCtb
$expectmsgcnt = 1
$expectmsgcnt = 1
000000
sql insert into consumeinfo values (now , $consumerId , $topicList , $keyList , $expectmsgcnt , $ifcheckdata , $ifmanualcommit )
sql insert into consumeinfo values (now , $consumerId , $topicList , $keyList , $expectmsgcnt , $ifcheckdata , $ifmanualcommit )
print == start consumer to pull msgs from ctb
print == start consumer to pull msgs from ctb
...
@@ -254,7 +251,7 @@ endi
...
@@ -254,7 +251,7 @@ endi
$consumerId = 0
$consumerId = 0
$totalMsgOfNtb = $rowsPerCtb
$totalMsgOfNtb = $rowsPerCtb
$expectmsgcnt =
$totalMsgOfNtb
$expectmsgcnt =
1000000
sql insert into consumeinfo values (now , $consumerId , $topicList , $keyList , $expectmsgcnt , $ifcheckdata , $ifmanualcommit )
sql insert into consumeinfo values (now , $consumerId , $topicList , $keyList , $expectmsgcnt , $ifcheckdata , $ifmanualcommit )
print == start consumer to pull msgs from ntb
print == start consumer to pull msgs from ntb
...
...
tests/script/tsim/tmq/snapshot1.sim
浏览文件 @
4b6ab7fe
...
@@ -80,7 +80,7 @@ $topicList = $topicList . '
...
@@ -80,7 +80,7 @@ $topicList = $topicList . '
$consumerId = 0
$consumerId = 0
$totalMsgOfOneTopic = $ctbNum * $rowsPerCtb
$totalMsgOfOneTopic = $ctbNum * $rowsPerCtb
$totalMsgOfStb = $totalMsgOfOneTopic * $topicNum
$totalMsgOfStb = $totalMsgOfOneTopic * $topicNum
$expectmsgcnt =
$totalMsgOfStb
$expectmsgcnt =
1000000
sql insert into consumeinfo values (now , $consumerId , $topicList , $keyList , $expectmsgcnt , $ifcheckdata , $ifmanualcommit )
sql insert into consumeinfo values (now , $consumerId , $topicList , $keyList , $expectmsgcnt , $ifcheckdata , $ifmanualcommit )
...
@@ -168,7 +168,7 @@ $consumerId = 0
...
@@ -168,7 +168,7 @@ $consumerId = 0
$totalMsgOfOneTopic = $rowsPerCtb
$totalMsgOfOneTopic = $rowsPerCtb
$totalMsgOfCtb = $totalMsgOfOneTopic * $topicNum
$totalMsgOfCtb = $totalMsgOfOneTopic * $topicNum
$expectmsgcnt =
$totalMsgOfCtb
$expectmsgcnt =
1000000
sql insert into consumeinfo values (now , $consumerId , $topicList , $keyList , $expectmsgcnt , $ifcheckdata , $ifmanualcommit )
sql insert into consumeinfo values (now , $consumerId , $topicList , $keyList , $expectmsgcnt , $ifcheckdata , $ifmanualcommit )
$topicList = ' . topic_ctb_function
$topicList = ' . topic_ctb_function
...
@@ -245,7 +245,7 @@ $topicList = $topicList . '
...
@@ -245,7 +245,7 @@ $topicList = $topicList . '
$consumerId = 0
$consumerId = 0
$totalMsgOfOneTopic = $rowsPerCtb
$totalMsgOfOneTopic = $rowsPerCtb
$totalMsgOfNtb = $totalMsgOfOneTopic * $topicNum
$totalMsgOfNtb = $totalMsgOfOneTopic * $topicNum
$expectmsgcnt =
$totalMsgOfNtb
$expectmsgcnt =
1000000
sql insert into consumeinfo values (now , $consumerId , $topicList , $keyList , $expectmsgcnt , $ifcheckdata , $ifmanualcommit )
sql insert into consumeinfo values (now , $consumerId , $topicList , $keyList , $expectmsgcnt , $ifcheckdata , $ifmanualcommit )
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录