Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
taosdata
TDengine
提交
ae8caa82
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看板
提交
ae8caa82
编写于
7月 21, 2023
作者:
D
dapan1121
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
enh: add disk cache
上级
3725cafe
变更
2
隐藏空白更改
内联
并排
Showing
2 changed file
with
157 addition
and
85 deletion
+157
-85
source/libs/executor/inc/groupcache.h
source/libs/executor/inc/groupcache.h
+4
-5
source/libs/executor/src/groupcacheoperator.c
source/libs/executor/src/groupcacheoperator.c
+153
-80
未找到文件。
source/libs/executor/inc/groupcache.h
浏览文件 @
ae8caa82
...
@@ -27,11 +27,11 @@ typedef struct SGcBlkBufBasic {
...
@@ -27,11 +27,11 @@ typedef struct SGcBlkBufBasic {
int64_t
blkId
;
int64_t
blkId
;
int64_t
offset
;
int64_t
offset
;
int64_t
bufSize
;
int64_t
bufSize
;
uint32_t
fileId
;
}
SGcBlkBufBasic
;
}
SGcBlkBufBasic
;
typedef
struct
SGcBlkBufInfo
{
typedef
struct
SGcBlkBufInfo
{
SGcBlkBufBasic
basic
;
SGcBlkBufBasic
basic
;
uint32_t
fileId
;
void
*
next
;
void
*
next
;
void
*
pBuf
;
void
*
pBuf
;
SGcDownstreamCtx
*
pCtx
;
SGcDownstreamCtx
*
pCtx
;
...
@@ -39,10 +39,10 @@ typedef struct SGcBlkBufInfo {
...
@@ -39,10 +39,10 @@ typedef struct SGcBlkBufInfo {
}
SGcBlkBufInfo
;
}
SGcBlkBufInfo
;
#pragma pack(pop)
#pragma pack(pop)
typedef
struct
SG
cVgroup
FileFd
{
typedef
struct
SG
roupCache
FileFd
{
TdThreadMutex
mutex
;
TdThreadMutex
mutex
;
TdFilePtr
fd
;
TdFilePtr
fd
;
}
SG
cVgroup
FileFd
;
}
SG
roupCache
FileFd
;
typedef
struct
SGcVgroupCtx
{
typedef
struct
SGcVgroupCtx
{
SArray
*
pTbList
;
SArray
*
pTbList
;
...
@@ -117,7 +117,7 @@ typedef struct SGcDownstreamCtx {
...
@@ -117,7 +117,7 @@ typedef struct SGcDownstreamCtx {
SHashObj
*
pSessions
;
SHashObj
*
pSessions
;
SHashObj
*
pWaitSessions
;
SHashObj
*
pWaitSessions
;
int32_t
cacheFileFdNum
;
int32_t
cacheFileFdNum
;
TdFilePtr
cacheFileFd
[
GROUP_CACHE_MAX_FILE_FDS
]
;
SGroupCacheFileFd
cacheFileFd
;
char
baseFilename
[
PATH_MAX
];
char
baseFilename
[
PATH_MAX
];
}
SGcDownstreamCtx
;
}
SGcDownstreamCtx
;
...
@@ -126,7 +126,6 @@ typedef struct SGcSessionCtx {
...
@@ -126,7 +126,6 @@ typedef struct SGcSessionCtx {
SGcOperatorParam
*
pParam
;
SGcOperatorParam
*
pParam
;
SGroupCacheData
*
pGroupData
;
SGroupCacheData
*
pGroupData
;
int64_t
lastBlkId
;
int64_t
lastBlkId
;
int64_t
nextOffset
;
bool
semInit
;
bool
semInit
;
tsem_t
waitSem
;
tsem_t
waitSem
;
bool
newFetch
;
bool
newFetch
;
...
...
source/libs/executor/src/groupcacheoperator.c
浏览文件 @
ae8caa82
...
@@ -85,7 +85,7 @@ static void destroyGroupCacheOperator(void* param) {
...
@@ -85,7 +85,7 @@ static void destroyGroupCacheOperator(void* param) {
taosMemoryFreeClear
(
param
);
taosMemoryFreeClear
(
param
);
}
}
static
FORCE_INLINE
int32_t
initOpenCacheFile
(
SG
cVgroup
FileFd
*
pFileFd
,
char
*
filename
)
{
static
FORCE_INLINE
int32_t
initOpenCacheFile
(
SG
roupCache
FileFd
*
pFileFd
,
char
*
filename
)
{
TdFilePtr
newFd
=
taosOpenFile
(
filename
,
TD_FILE_CREATE
|
TD_FILE_READ
|
TD_FILE_WRITE
|
TD_FILE_AUTO_DEL
);
TdFilePtr
newFd
=
taosOpenFile
(
filename
,
TD_FILE_CREATE
|
TD_FILE_READ
|
TD_FILE_WRITE
|
TD_FILE_AUTO_DEL
);
if
(
NULL
==
newFd
)
{
if
(
NULL
==
newFd
)
{
return
TAOS_SYSTEM_ERROR
(
errno
);
return
TAOS_SYSTEM_ERROR
(
errno
);
...
@@ -95,13 +95,13 @@ static FORCE_INLINE int32_t initOpenCacheFile(SGcVgroupFileFd* pFileFd, char* fi
...
@@ -95,13 +95,13 @@ static FORCE_INLINE int32_t initOpenCacheFile(SGcVgroupFileFd* pFileFd, char* fi
return
TSDB_CODE_SUCCESS
;
return
TSDB_CODE_SUCCESS
;
}
}
static
int32_t
acquireVgroupFileFd
(
SGroupCacheOperatorInfo
*
pGCache
,
SGcDownstreamCtx
*
pCtx
,
SGcVgroupCtx
*
pVgCtx
,
uint32_t
fileId
,
SG
cVgroup
FileFd
**
ppFd
)
{
static
int32_t
acquireVgroupFileFd
(
SGroupCacheOperatorInfo
*
pGCache
,
SGcDownstreamCtx
*
pCtx
,
SGcVgroupCtx
*
pVgCtx
,
uint32_t
fileId
,
SG
roupCache
FileFd
**
ppFd
)
{
int32_t
code
=
TSDB_CODE_SUCCESS
;
int32_t
code
=
TSDB_CODE_SUCCESS
;
SG
cVgroup
FileFd
*
pTmp
=
tSimpleHashGet
(
pVgCtx
->
pCacheFile
,
&
fileId
,
sizeof
(
fileId
));
SG
roupCache
FileFd
*
pTmp
=
tSimpleHashGet
(
pVgCtx
->
pCacheFile
,
&
fileId
,
sizeof
(
fileId
));
if
(
NULL
==
pTmp
)
{
if
(
NULL
==
pTmp
)
{
sprintf
(
pVgCtx
->
baseFilename
[
pVgCtx
->
baseNameLen
],
"_%u"
,
fileId
);
sprintf
(
pVgCtx
->
baseFilename
[
pVgCtx
->
baseNameLen
],
"_%u"
,
fileId
);
SG
cVgroup
FileFd
newVgFd
=
{
0
};
SG
roupCache
FileFd
newVgFd
=
{
0
};
tSimpleHashPut
(
pVgCtx
->
pCacheFile
,
&
fileId
,
sizeof
(
fileId
),
&
newVgFd
,
sizeof
(
newVgFd
));
tSimpleHashPut
(
pVgCtx
->
pCacheFile
,
&
fileId
,
sizeof
(
fileId
),
&
newVgFd
,
sizeof
(
newVgFd
));
pTmp
=
tSimpleHashGet
(
pVgCtx
->
pCacheFile
,
&
fileId
,
sizeof
(
fileId
));
pTmp
=
tSimpleHashGet
(
pVgCtx
->
pCacheFile
,
&
fileId
,
sizeof
(
fileId
));
...
@@ -117,7 +117,7 @@ static int32_t acquireVgroupFileFd(SGroupCacheOperatorInfo* pGCache, SGcDownstre
...
@@ -117,7 +117,7 @@ static int32_t acquireVgroupFileFd(SGroupCacheOperatorInfo* pGCache, SGcDownstre
return
TSDB_CODE_SUCCESS
;
return
TSDB_CODE_SUCCESS
;
}
}
static
FORCE_INLINE
void
releaseVgroupFileFd
(
SG
cVgroup
FileFd
*
pFd
)
{
static
FORCE_INLINE
void
releaseVgroupFileFd
(
SG
roupCache
FileFd
*
pFd
)
{
taosThreadMutexUnlock
(
&
pFd
->
mutex
);
taosThreadMutexUnlock
(
&
pFd
->
mutex
);
}
}
...
@@ -126,27 +126,30 @@ static int32_t saveBatchBlocksToDisk(SGroupCacheOperatorInfo* pGCache, SGcBlkBuf
...
@@ -126,27 +126,30 @@ static int32_t saveBatchBlocksToDisk(SGroupCacheOperatorInfo* pGCache, SGcBlkBuf
SGcBlkBufBasic
blkBasic
;
SGcBlkBufBasic
blkBasic
;
while
(
NULL
!=
pHead
)
{
while
(
NULL
!=
pHead
)
{
if
(
NULL
==
pHead
->
pCtx
->
cacheFileFd
[
0
])
{
SGroupCacheFileFd
*
pFd
;
pHead
->
pCtx
->
cacheFileFd
[
0
]
=
taosOpenFile
(
pHead
->
pCtx
->
baseFilename
,
TD_FILE_CREATE
|
TD_FILE_READ
|
TD_FILE_WRITE
|
TD_FILE_AUTO_DEL
);
code
=
acquireDownstreamFileFd
(
pHead
->
pCtx
,
&
pFd
);
if
(
NULL
==
pHead
->
pCtx
->
cacheFileFd
[
0
])
{
if
(
code
)
{
return
TAOS_SYSTEM_ERROR
(
errno
);
return
code
;
}
pHead
->
pCtx
->
cacheFileFdNum
=
1
;
}
}
int32_t
ret
=
taosLSeekFile
(
p
Head
->
pCtx
->
cacheFileFd
[
0
],
pHead
->
offset
,
SEEK_SET
);
int32_t
ret
=
taosLSeekFile
(
p
Fd
->
fd
,
pHead
->
basic
.
offset
,
SEEK_SET
);
if
(
ret
==
-
1
)
{
if
(
ret
==
-
1
)
{
releaseDownstreamFileFd
();
return
TAOS_SYSTEM_ERROR
(
errno
);
return
TAOS_SYSTEM_ERROR
(
errno
);
}
}
ret
=
(
int32_t
)
taosWriteFile
(
pHead
->
pCtx
->
cacheFileFd
[
0
],
pHead
->
pBuf
,
pHead
->
bufSize
);
ret
=
(
int32_t
)
taosWriteFile
(
pFd
->
fd
,
pHead
->
pBuf
,
pHead
->
basic
.
bufSize
);
if
(
ret
!=
pHead
->
bufSize
)
{
if
(
ret
!=
pHead
->
basic
.
bufSize
)
{
releaseDownstreamFileFd
();
return
TAOS_SYSTEM_ERROR
(
errno
);
return
TAOS_SYSTEM_ERROR
(
errno
);
}
}
releaseDownstreamFileFd
();
taos
taosWLockLatch
(
&
pHead
->
pGroup
->
batchList
.
lock
);
taosArrayPush
(
pHead
->
pGroup
->
batchList
.
pList
,
&
pHead
->
basic
);
int64_t
blkId
=
pHead
->
blkId
;
taosWUnLockLatch
(
&
pHead
->
pGroup
->
batchList
.
lock
);
int64_t
blkId
=
pHead
->
basic
.
blkId
;
pHead
=
pHead
->
next
;
pHead
=
pHead
->
next
;
taosHashRemove
(
pGCache
->
blkCache
.
pDirtyBlk
,
&
blkId
,
sizeof
(
blkId
));
taosHashRemove
(
pGCache
->
blkCache
.
pDirtyBlk
,
&
blkId
,
sizeof
(
blkId
));
...
@@ -159,27 +162,32 @@ static int32_t saveBatchBlocksToDisk(SGroupCacheOperatorInfo* pGCache, SGcBlkBuf
...
@@ -159,27 +162,32 @@ static int32_t saveBatchBlocksToDisk(SGroupCacheOperatorInfo* pGCache, SGcBlkBuf
static
int32_t
saveSeqBlocksToDisk
(
SGroupCacheOperatorInfo
*
pGCache
,
SGcBlkBufInfo
*
pHead
)
{
static
int32_t
saveSeqBlocksToDisk
(
SGroupCacheOperatorInfo
*
pGCache
,
SGcBlkBufInfo
*
pHead
)
{
int32_t
code
=
TSDB_CODE_SUCCESS
;
int32_t
code
=
TSDB_CODE_SUCCESS
;
SG
cVgroup
FileFd
*
pFd
=
NULL
;
SG
roupCache
FileFd
*
pFd
=
NULL
;
while
(
NULL
!=
pHead
)
{
while
(
NULL
!=
pHead
)
{
code
=
acquireVgroupFileFd
(
pGCache
,
pHead
->
pCtx
,
pHead
->
pGroup
->
pVgCtx
,
pHead
->
fileId
,
&
pFd
);
code
=
acquireVgroupFileFd
(
pGCache
,
pHead
->
pCtx
,
pHead
->
pGroup
->
pVgCtx
,
pHead
->
fileId
,
&
pFd
);
if
(
TSDB_CODE_SUCCESS
!=
code
)
{
if
(
TSDB_CODE_SUCCESS
!=
code
)
{
return
code
;
return
code
;
}
}
int32_t
ret
=
taosLSeekFile
(
pFd
->
fd
,
pHead
->
offset
,
SEEK_SET
);
int32_t
ret
=
taosLSeekFile
(
pFd
->
fd
,
pHead
->
basic
.
offset
,
SEEK_SET
);
if
(
ret
==
-
1
)
{
if
(
ret
==
-
1
)
{
code
=
TAOS_SYSTEM_ERROR
(
errno
);
code
=
TAOS_SYSTEM_ERROR
(
errno
);
return
code
;
return
code
;
}
}
code
=
(
int32_t
)
taosWriteFile
(
pFd
->
fd
,
pHead
->
pBuf
,
pHead
->
bufSize
);
code
=
(
int32_t
)
taosWriteFile
(
pFd
->
fd
,
pHead
->
pBuf
,
pHead
->
b
asic
.
b
ufSize
);
releaseVgroupFileFd
(
pFd
);
releaseVgroupFileFd
(
pFd
);
if
(
code
!=
pHead
->
bufSize
)
{
if
(
code
!=
pHead
->
b
asic
.
b
ufSize
)
{
code
=
TAOS_SYSTEM_ERROR
(
errno
);
code
=
TAOS_SYSTEM_ERROR
(
errno
);
return
code
;
return
code
;
}
}
taosWLockLatch
(
&
pHead
->
pGroup
->
batchList
.
lock
);
taosArrayPush
(
pHead
->
pGroup
->
batchList
.
pList
,
&
pHead
->
basic
);
taosWUnLockLatch
(
&
pHead
->
pGroup
->
batchList
.
lock
);
int64_t
blkId
=
pHead
->
blkId
;
int64_t
blkId
=
pHead
->
b
asic
.
b
lkId
;
pHead
=
pHead
->
next
;
pHead
=
pHead
->
next
;
taosHashRemove
(
pGCache
->
blkCache
.
pDirtyBlk
,
&
blkId
,
sizeof
(
blkId
));
taosHashRemove
(
pGCache
->
blkCache
.
pDirtyBlk
,
&
blkId
,
sizeof
(
blkId
));
...
@@ -332,23 +340,114 @@ static int32_t buildGroupCacheResultBlock(SGroupCacheOperatorInfo* pGCache, int3
...
@@ -332,23 +340,114 @@ static int32_t buildGroupCacheResultBlock(SGroupCacheOperatorInfo* pGCache, int3
return
blockDataFromBuf
(
*
ppRes
,
pBuf
);
return
blockDataFromBuf
(
*
ppRes
,
pBuf
);
}
}
static
int32_t
retrieveBlkFromBufCache
(
SGroupCacheOperatorInfo
*
pGCache
,
SGroupCacheData
*
pGrp
,
int64_t
sessionId
,
int64_t
blkId
,
int64_t
*
nextOffset
,
SSDataBlock
**
ppRes
)
{
static
int32_t
acquireDownstreamFileFd
(
SGcDownstreamCtx
*
pCtx
,
SGroupCacheFileFd
**
ppFd
)
{
if
(
NULL
==
pCtx
->
cacheFileFd
.
fd
)
{
pCtx
->
cacheFileFd
.
fd
=
taosOpenFile
(
pCtx
->
baseFilename
,
TD_FILE_CREATE
|
TD_FILE_READ
|
TD_FILE_WRITE
|
TD_FILE_AUTO_DEL
);
if
(
NULL
==
pCtx
->
cacheFileFd
.
fd
)
{
return
TAOS_SYSTEM_ERROR
(
errno
);
}
pCtx
->
cacheFileFdNum
=
1
;
taosThreadMutexInit
(
&
pCtx
->
cacheFileFd
.
mutex
,
NULL
);
}
else
{
taosThreadMutexLock
(
&
pCtx
->
cacheFileFd
.
mutex
);
}
*
ppFd
=
&
pCtx
->
cacheFileFd
;
return
TSDB_CODE_SUCCESS
;
}
static
int32_t
readBatchBlocksFromDisk
(
SGroupCacheOperatorInfo
*
pGCache
,
SGroupCacheData
*
pGrp
,
SGcBlkBufBasic
*
pBasic
,
void
**
ppBuf
)
{
TdFilePtr
cacheFileFd
=
NULL
;
SGcDownstreamCtx
*
pCtx
=
&
pGCache
->
pDownstreams
[
pGrp
->
downstreamIdx
];
int32_t
code
=
acquireDownstreamFileFd
(
pCtx
,
&
cacheFileFd
);
if
(
code
)
{
return
code
;
}
int32_t
ret
=
taosLSeekFile
(
cacheFileFd
,
pBasic
->
offset
,
SEEK_SET
);
if
(
ret
==
-
1
)
{
return
TAOS_SYSTEM_ERROR
(
errno
);
}
*
ppBuf
=
taosMemoryMalloc
(
pBasic
->
bufSize
);
if
(
NULL
==
*
ppBuf
)
{
releaseDownstreamFileFd
();
return
TSDB_CODE_OUT_OF_MEMORY
;
}
ret
=
(
int32_t
)
taosReadFile
(
cacheFileFd
,
*
ppBuf
,
pBasic
->
bufSize
);
if
(
ret
!=
pBasic
->
bufSize
)
{
taosMemoryFreeClear
(
*
ppBuf
);
return
TAOS_SYSTEM_ERROR
(
errno
);
}
releaseDownstreamFileFd
();
return
code
;
}
static
int32_t
readSeqBlocksFromDisk
(
SGroupCacheOperatorInfo
*
pGCache
,
SGcBlkBufInfo
*
pHead
)
{
int32_t
code
=
TSDB_CODE_SUCCESS
;
SGroupCacheFileFd
*
pFd
=
NULL
;
while
(
NULL
!=
pHead
)
{
code
=
acquireVgroupFileFd
(
pGCache
,
pHead
->
pCtx
,
pHead
->
pGroup
->
pVgCtx
,
pHead
->
fileId
,
&
pFd
);
if
(
TSDB_CODE_SUCCESS
!=
code
)
{
return
code
;
}
int32_t
ret
=
taosLSeekFile
(
pFd
->
fd
,
pHead
->
basic
.
offset
,
SEEK_SET
);
if
(
ret
==
-
1
)
{
code
=
TAOS_SYSTEM_ERROR
(
errno
);
return
code
;
}
code
=
(
int32_t
)
taosWriteFile
(
pFd
->
fd
,
pHead
->
pBuf
,
pHead
->
basic
.
bufSize
);
releaseVgroupFileFd
(
pFd
);
if
(
code
!=
pHead
->
basic
.
bufSize
)
{
code
=
TAOS_SYSTEM_ERROR
(
errno
);
return
code
;
}
taosWLockLatch
(
&
pHead
->
pGroup
->
batchList
.
lock
);
taosArrayPush
(
pHead
->
pGroup
->
batchList
.
pList
,
&
pHead
->
basic
);
taosWUnLockLatch
(
&
pHead
->
pGroup
->
batchList
.
lock
);
int64_t
blkId
=
pHead
->
basic
.
blkId
;
pHead
=
pHead
->
next
;
taosHashRemove
(
pGCache
->
blkCache
.
pDirtyBlk
,
&
blkId
,
sizeof
(
blkId
));
}
return
code
;
}
static
int32_t
readBlockFromDisk
(
SGroupCacheOperatorInfo
*
pGCache
,
SGroupCacheData
*
pGrp
,
SGcBlkBufBasic
*
pBasic
,
void
**
ppRes
)
{
int32_t
code
=
TSDB_CODE_SUCCESS
;
if
(
pGCache
->
batchFetch
)
{
code
=
readBatchBlocksFromDisk
(
pGCache
,
pGrp
,
pBasic
,
ppRes
);
}
else
{
code
=
readSeqBlocksFromDisk
(
pGCache
,
pGrp
,
pBasic
,
ppRes
);
}
return
code
;
}
static
int32_t
retrieveBlkFromBufCache
(
SGroupCacheOperatorInfo
*
pGCache
,
SGroupCacheData
*
pGrp
,
int64_t
sessionId
,
SGcBlkBufBasic
*
pBasic
,
SSDataBlock
**
ppRes
)
{
int32_t
code
=
TSDB_CODE_SUCCESS
;
int32_t
code
=
TSDB_CODE_SUCCESS
;
SGcBlkCacheInfo
*
pCache
=
&
pGCache
->
blkCache
;
SGcBlkCacheInfo
*
pCache
=
&
pGCache
->
blkCache
;
SGcBlkBufInfo
bufInfo
;
SGcBlkBufBasic
*
pBlkBasic
=
NULL
;
void
*
pBuf
=
NULL
;
void
*
pBuf
=
NULL
;
taosRLockLatch
(
&
pCache
->
dirtyLock
);
taosRLockLatch
(
&
pCache
->
dirtyLock
);
SGcBlkBufInfo
*
pBufInfo
=
taosHashAcquire
(
pCache
->
pDirtyBlk
,
&
blkId
,
sizeof
(
blkId
));
SGcBlkBufInfo
*
pBufInfo
=
taosHashAcquire
(
pCache
->
pDirtyBlk
,
&
pBasic
->
blkId
,
sizeof
(
pBasic
->
blkId
));
if
(
NULL
==
pBufInfo
)
{
if
(
NULL
==
pBufInfo
)
{
code
=
readBlockFromDisk
(
pGCache
,
pGrp
,
blkId
,
nextOffset
,
&
bufInfo
.
b
asic
,
&
pBuf
);
code
=
readBlockFromDisk
(
pGCache
,
pGrp
,
pB
asic
,
&
pBuf
);
if
(
code
)
{
if
(
code
)
{
return
code
;
return
code
;
}
}
pBlkBasic
=
&
bufInfo
.
basic
;
}
else
{
}
else
{
pBlkBasic
=
&
pBufInfo
->
basic
;
pBuf
=
pBufInfo
->
pBuf
;
pBuf
=
pBufInfo
->
pBuf
;
}
}
...
@@ -358,8 +457,6 @@ static int32_t retrieveBlkFromBufCache(SGroupCacheOperatorInfo* pGCache, SGroupC
...
@@ -358,8 +457,6 @@ static int32_t retrieveBlkFromBufCache(SGroupCacheOperatorInfo* pGCache, SGroupC
return
code
;
return
code
;
}
}
*
nextOffset
=
pBlkBasic
->
offset
+
pBlkBasic
->
bufSize
;
taosHashPut
(
pCache
->
pReadBlk
,
&
sessionId
,
sizeof
(
sessionId
),
ppRes
,
POINTER_BYTES
);
taosHashPut
(
pCache
->
pReadBlk
,
&
sessionId
,
sizeof
(
sessionId
),
ppRes
,
POINTER_BYTES
);
return
TSDB_CODE_SUCCESS
;
return
TSDB_CODE_SUCCESS
;
}
}
...
@@ -594,26 +691,18 @@ static int32_t addNewGroupData(struct SOperatorInfo* pOperator, SOperatorParam*
...
@@ -594,26 +691,18 @@ static int32_t addNewGroupData(struct SOperatorInfo* pOperator, SOperatorParam*
return
TSDB_CODE_SUCCESS
;
return
TSDB_CODE_SUCCESS
;
}
}
static
int32_t
addBlkToGroupCache
(
bool
batchFetch
,
SGroupCacheData
*
pGroup
,
SGcBlkBufInfo
*
pNewBlk
)
{
static
int32_t
addBlkToGroupCache
(
bool
batchFetch
,
SGroupCacheData
*
pGroup
,
SGcBlkBufInfo
*
pNewBlk
,
int32_t
*
pIdx
)
{
taosWLockLatch
(
&
pGroup
->
batchList
.
lock
);
if
(
batchFetch
)
{
if
(
batchFetch
)
{
taosWLockLatch
(
&
pGroup
->
batchList
.
lock
);
taosArrayPush
(
pGroup
->
batchList
.
pList
,
&
pNewBlk
->
basic
);
taosArrayPush
(
pGroup
->
batchList
.
pList
,
&
pNewBlk
->
basic
);
qError
(
"block added to group cache, total block num:%"
PRId64
,
(
int64_t
)
taosArrayGetSize
(
pGroup
->
batchList
.
pList
));
taosWUnLockLatch
(
&
pGroup
->
batchList
.
lock
);
return
TSDB_CODE_SUCCESS
;
}
taosWLockLatch
(
&
pGroup
->
batchList
.
lock
);
if
(
pGroup
->
seqList
.
endBlkId
>
0
)
{
atomic_store_64
(
&
pGroup
->
seqList
.
endBlkId
,
pNewBlk
->
blkId
);
}
else
{
}
else
{
atomic_store_64
(
&
pGroup
->
seqList
.
startBlkId
,
pNewBlk
->
blkId
);
taosArrayPush
(
pGroup
->
batchList
.
pList
,
&
pNewBlk
->
basic
.
offset
);
atomic_store_64
(
&
pGroup
->
seqList
.
endBlkId
,
pNewBlk
->
blkId
);
}
}
qError
(
"block added to group cache, total block num:%"
PRId64
,
pGroup
->
seqList
.
endBlkId
-
pGroup
->
seqList
.
startBlkId
+
1
);
*
pIdx
=
taosArrayGetSize
(
pGroup
->
batchList
.
pList
)
-
1
;
qError
(
"block added to group cache, total block num:%"
PRId64
,
(
int64_t
)
taosArrayGetSize
(
pGroup
->
batchList
.
pList
));
taosWUnLockLatch
(
&
pGroup
->
batchList
.
lock
);
return
TSDB_CODE_SUCCESS
;
return
TSDB_CODE_SUCCESS
;
}
}
...
@@ -651,15 +740,15 @@ static int32_t handleGroupCacheRetrievedBlk(struct SOperatorInfo* pOperator, SSD
...
@@ -651,15 +740,15 @@ static int32_t handleGroupCacheRetrievedBlk(struct SOperatorInfo* pOperator, SSD
return
code
;
return
code
;
}
}
code
=
addBlkToGroupCache
(
pGCache
->
batchFetch
,
pGroup
,
&
newBlkBuf
);
int64_t
blkIdx
=
0
;
code
=
addBlkToGroupCache
(
pGCache
->
batchFetch
,
pGroup
,
&
newBlkBuf
,
&
blkIdx
);
if
(
code
)
{
if
(
code
)
{
return
code
;
return
code
;
}
}
notifyWaitingSessions
(
pGroup
->
waitQueue
);
notifyWaitingSessions
(
pGroup
->
waitQueue
);
if
(
pGroup
==
pSession
->
pGroupData
)
{
if
(
pGroup
==
pSession
->
pGroupData
)
{
pSession
->
lastBlkId
=
newBlkBuf
.
blkId
;
pSession
->
lastBlkId
=
blkIdx
;
pSession
->
nextOffset
=
newBlkBuf
.
offset
+
newBlkBuf
.
bufSize
;
*
continueFetch
=
false
;
*
continueFetch
=
false
;
}
}
...
@@ -746,40 +835,25 @@ static int32_t getBlkFromSessionCacheImpl(struct SOperatorInfo* pOperator, int64
...
@@ -746,40 +835,25 @@ static int32_t getBlkFromSessionCacheImpl(struct SOperatorInfo* pOperator, int64
SGroupCacheOperatorInfo
*
pGCache
=
pOperator
->
info
;
SGroupCacheOperatorInfo
*
pGCache
=
pOperator
->
info
;
*
got
=
true
;
*
got
=
true
;
if
(
pGCache
->
batchFetch
)
{
SGroupBatchBlkList
*
pBatchList
=
&
pSession
->
pGroupData
->
batchList
;
SGroupBatchBlkList
*
pBatchList
=
&
pSession
->
pGroupData
->
batchList
;
taosRLockLatch
(
&
pBatchList
->
lock
);
taosRLockLatch
(
&
pBatchList
->
lock
);
int64_t
blkNum
=
taosArrayGetSize
(
pBatchList
->
pList
);
int64_t
blkNum
=
taosArrayGetSize
(
pBatchList
->
pList
);
if
(
pSession
->
lastBlkId
<
0
)
{
if
(
pSession
->
lastBlkId
<
0
)
{
if
(
blkNum
>
0
)
{
if
(
blkNum
>
0
)
{
SGcBlkBufBasic
*
pBasic
=
taosArrayGet
(
pBatchList
->
pList
,
0
);
SGcBlkBufBasic
*
pBasic
=
taosArrayGet
(
pBatchList
->
pList
,
0
);
taosRUnLockLatch
(
&
pBatchList
->
lock
);
code
=
retrieveBlkFromBufCache
(
pGCache
,
pSession
->
pGroupData
,
sessionId
,
pBasic
->
blkId
,
&
pSession
->
nextOffset
,
ppRes
);
pSession
->
lastBlkId
=
0
;
return
code
;
}
}
else
if
((
pSession
->
lastBlkId
+
1
)
<
blkNum
)
{
SGcBlkBufBasic
*
pBasic
=
taosArrayGet
(
pBatchList
->
pList
,
pSession
->
lastBlkId
+
1
);
taosRUnLockLatch
(
&
pBatchList
->
lock
);
taosRUnLockLatch
(
&
pBatchList
->
lock
);
code
=
retrieveBlkFromBufCache
(
pGCache
,
pSession
->
pGroupData
,
sessionId
,
pBasic
->
blkId
,
&
pSession
->
nextOffset
,
ppRes
);
code
=
retrieveBlkFromBufCache
(
pGCache
,
pSession
->
pGroupData
,
sessionId
,
pBasic
,
ppRes
);
pSession
->
lastBlkId
++
;
pSession
->
lastBlkId
=
0
;
return
code
;
return
code
;
}
}
}
else
if
((
pSession
->
lastBlkId
+
1
)
<
blkNum
)
{
SGcBlkBufBasic
*
pBasic
=
taosArrayGet
(
pBatchList
->
pList
,
pSession
->
lastBlkId
+
1
);
taosRUnLockLatch
(
&
pBatchList
->
lock
);
taosRUnLockLatch
(
&
pBatchList
->
lock
);
}
else
{
code
=
retrieveBlkFromBufCache
(
pGCache
,
pSession
->
pGroupData
,
sessionId
,
pBasic
,
ppRes
);
if
(
pSession
->
lastBlkId
<
0
)
{
pSession
->
lastBlkId
++
;
int64_t
startBlkId
=
atomic_load_64
(
&
pSession
->
pGroupData
->
seqList
.
startBlkId
);
return
code
;
if
(
startBlkId
>
0
)
{
code
=
retrieveBlkFromBufCache
(
pGCache
,
pSession
->
pGroupData
,
sessionId
,
startBlkId
,
&
pSession
->
nextOffset
,
ppRes
);
pSession
->
lastBlkId
=
startBlkId
;
return
code
;
}
}
else
if
(
pSession
->
lastBlkId
<
atomic_load_64
(
&
pSession
->
pGroupData
->
seqList
.
endBlkId
))
{
code
=
retrieveBlkFromBufCache
(
pGCache
,
pSession
->
pGroupData
,
sessionId
,
pSession
->
lastBlkId
+
1
,
&
pSession
->
nextOffset
,
ppRes
);
pSession
->
lastBlkId
++
;
return
code
;
}
}
}
taosRUnLockLatch
(
&
pBatchList
->
lock
);
if
(
atomic_load_8
((
int8_t
*
)
&
pSession
->
pGroupData
->
fetchDone
))
{
if
(
atomic_load_8
((
int8_t
*
)
&
pSession
->
pGroupData
->
fetchDone
))
{
*
ppRes
=
NULL
;
*
ppRes
=
NULL
;
...
@@ -897,7 +971,6 @@ static FORCE_INLINE void initGroupCacheSessionCtx(SGcSessionCtx* pSession, SGcOp
...
@@ -897,7 +971,6 @@ static FORCE_INLINE void initGroupCacheSessionCtx(SGcSessionCtx* pSession, SGcOp
pSession
->
downstreamIdx
=
pGcParam
->
downstreamIdx
;
pSession
->
downstreamIdx
=
pGcParam
->
downstreamIdx
;
pSession
->
pGroupData
=
pGroup
;
pSession
->
pGroupData
=
pGroup
;
pSession
->
lastBlkId
=
-
1
;
pSession
->
lastBlkId
=
-
1
;
pSession
->
nextOffset
=
0
;
}
}
static
int32_t
initGroupCacheSession
(
struct
SOperatorInfo
*
pOperator
,
SOperatorParam
*
pParam
,
SGcSessionCtx
**
ppSession
)
{
static
int32_t
initGroupCacheSession
(
struct
SOperatorInfo
*
pOperator
,
SOperatorParam
*
pParam
,
SGcSessionCtx
**
ppSession
)
{
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录