Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
taosdata
TDengine
提交
ebf1a91f
TDengine
项目概览
taosdata
/
TDengine
大约 2 年 前同步成功
通知
1193
Star
22018
Fork
4786
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
1
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
TDengine
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
1
Issue
1
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
提交
ebf1a91f
编写于
7月 24, 2023
作者:
D
dapan1121
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
enh: read/write from disk cache
上级
ae8caa82
变更
2
显示空白变更内容
内联
并排
Showing
2 changed file
with
151 addition
and
261 deletion
+151
-261
source/libs/executor/inc/groupcache.h
source/libs/executor/inc/groupcache.h
+36
-42
source/libs/executor/src/groupcacheoperator.c
source/libs/executor/src/groupcacheoperator.c
+115
-219
未找到文件。
source/libs/executor/inc/groupcache.h
浏览文件 @
ebf1a91f
...
...
@@ -24,19 +24,11 @@ extern "C" {
#pragma pack(push, 1)
typedef
struct
SGcBlkBufBasic
{
uint32_t
fileId
;
int64_t
blkId
;
int64_t
offset
;
int64_t
bufSize
;
}
SGcBlkBufBasic
;
typedef
struct
SGcBlkBufInfo
{
SGcBlkBufBasic
basic
;
uint32_t
fileId
;
void
*
next
;
void
*
pBuf
;
SGcDownstreamCtx
*
pCtx
;
SGroupCacheData
*
pGroup
;
}
SGcBlkBufInfo
;
#pragma pack(pop)
typedef
struct
SGroupCacheFileFd
{
...
...
@@ -44,25 +36,40 @@ typedef struct SGroupCacheFileFd {
TdFilePtr
fd
;
}
SGroupCacheFileFd
;
typedef
struct
SGcVgroupCtx
{
SArray
*
pTbList
;
uint64_t
lastUid
;
typedef
struct
SGcFileCacheCtx
{
int64_t
fileSize
;
uint32_t
fileId
;
S
SHashObj
*
pCacheFile
;
S
HashObj
*
pCacheFile
;
int32_t
baseNameLen
;
char
baseFilename
[
PATH_MAX
];
}
SGc
Vgroup
Ctx
;
}
SGc
FileCache
Ctx
;
typedef
struct
SGroupSeqBlkList
{
SRWLatch
lock
;
SArray
*
pList
;
}
SGroupSeqBlkList
;
typedef
struct
SGcDownstreamCtx
{
int32_t
id
;
SRWLatch
grpLock
;
int64_t
fetchSessionId
;
SArray
*
pNewGrpList
;
// SArray<SGcNewGroupInfo>
SSHashObj
*
pVgTbHash
;
SHashObj
*
pGrpHash
;
SRWLatch
blkLock
;
SSDataBlock
*
pBaseBlock
;
SArray
*
pFreeBlock
;
int64_t
lastBlkUid
;
SHashObj
*
pSessions
;
SHashObj
*
pWaitSessions
;
SGcFileCacheCtx
fileCtx
;
}
SGcDownstreamCtx
;
typedef
struct
SGroupBatchBlkList
{
typedef
struct
SGcVgroupCtx
{
SArray
*
pTbList
;
uint64_t
lastBlkUid
;
SGcFileCacheCtx
fileCtx
;
}
SGcVgroupCtx
;
typedef
struct
SGcBlkList
{
SRWLatch
lock
;
SArray
*
pList
;
}
SG
roupBatch
BlkList
;
}
SG
c
BlkList
;
typedef
struct
SGroupCacheData
{
TdThreadMutex
mutex
;
...
...
@@ -72,10 +79,7 @@ typedef struct SGroupCacheData {
SGcVgroupCtx
*
pVgCtx
;
int32_t
downstreamIdx
;
int32_t
vgId
;
union
{
SGroupSeqBlkList
seqList
;
SGroupBatchBlkList
batchList
;
};
SGcBlkList
blkList
;
uint32_t
fileId
;
int64_t
startOffset
;
}
SGroupCacheData
;
...
...
@@ -103,24 +107,6 @@ typedef struct SGcNewGroupInfo {
SOperatorParam
*
pParam
;
}
SGcNewGroupInfo
;
typedef
struct
SGcDownstreamCtx
{
int32_t
id
;
SRWLatch
grpLock
;
int64_t
fetchSessionId
;
SArray
*
pNewGrpList
;
// SArray<SGcNewGroupInfo>
SSHashObj
*
pVgTbHash
;
SHashObj
*
pGrpHash
;
SRWLatch
blkLock
;
SSDataBlock
*
pBaseBlock
;
SArray
*
pFreeBlock
;
int64_t
lastBlkUid
;
SHashObj
*
pSessions
;
SHashObj
*
pWaitSessions
;
int32_t
cacheFileFdNum
;
SGroupCacheFileFd
cacheFileFd
;
char
baseFilename
[
PATH_MAX
];
}
SGcDownstreamCtx
;
typedef
struct
SGcSessionCtx
{
int32_t
downstreamIdx
;
SGcOperatorParam
*
pParam
;
...
...
@@ -131,6 +117,14 @@ typedef struct SGcSessionCtx {
bool
newFetch
;
}
SGcSessionCtx
;
typedef
struct
SGcBlkBufInfo
{
SGcBlkBufBasic
basic
;
void
*
next
;
void
*
pBuf
;
SGcDownstreamCtx
*
pCtx
;
SGroupCacheData
*
pGroup
;
}
SGcBlkBufInfo
;
typedef
struct
SGcExecInfo
{
int32_t
downstreamNum
;
int64_t
*
pDownstreamBlkNum
;
...
...
source/libs/executor/src/groupcacheoperator.c
浏览文件 @
ebf1a91f
...
...
@@ -95,17 +95,24 @@ static FORCE_INLINE int32_t initOpenCacheFile(SGroupCacheFileFd* pFileFd, char*
return
TSDB_CODE_SUCCESS
;
}
static
int32_t
acquire
VgroupFileFd
(
SGroupCacheOperatorInfo
*
pGCache
,
SGcDownstreamCtx
*
pCtx
,
SGcVgroupCtx
*
pVg
Ctx
,
uint32_t
fileId
,
SGroupCacheFileFd
**
ppFd
)
{
static
int32_t
acquire
FdFromFileCtx
(
SGcFileCacheCtx
*
pFile
Ctx
,
uint32_t
fileId
,
SGroupCacheFileFd
**
ppFd
)
{
int32_t
code
=
TSDB_CODE_SUCCESS
;
SGroupCacheFileFd
*
pTmp
=
tSimpleHashGet
(
pVgCtx
->
pCacheFile
,
&
fileId
,
sizeof
(
fileId
));
if
(
NULL
==
pFileCtx
->
pCacheFile
)
{
pFileCtx
->
pCacheFile
=
taosHashInit
(
10
,
taosGetDefaultHashFunction
(
TSDB_DATA_TYPE_INT
),
false
,
HASH_ENTRY_LOCK
);
if
(
NULL
==
pFileCtx
->
pCacheFile
)
{
return
TSDB_CODE_OUT_OF_MEMORY
;
}
}
SGroupCacheFileFd
*
pTmp
=
taosHashGet
(
pFileCtx
->
pCacheFile
,
&
fileId
,
sizeof
(
fileId
));
if
(
NULL
==
pTmp
)
{
sprintf
(
pVgCtx
->
baseFilename
[
pVg
Ctx
->
baseNameLen
],
"_%u"
,
fileId
);
sprintf
(
&
pFileCtx
->
baseFilename
[
pFile
Ctx
->
baseNameLen
],
"_%u"
,
fileId
);
SGroupCacheFileFd
newVgFd
=
{
0
};
t
SimpleHashPut
(
pVg
Ctx
->
pCacheFile
,
&
fileId
,
sizeof
(
fileId
),
&
newVgFd
,
sizeof
(
newVgFd
));
pTmp
=
t
SimpleHashGet
(
pVg
Ctx
->
pCacheFile
,
&
fileId
,
sizeof
(
fileId
));
t
aosHashPut
(
pFile
Ctx
->
pCacheFile
,
&
fileId
,
sizeof
(
fileId
),
&
newVgFd
,
sizeof
(
newVgFd
));
pTmp
=
t
aosHashGet
(
pFile
Ctx
->
pCacheFile
,
&
fileId
,
sizeof
(
fileId
));
code
=
initOpenCacheFile
(
pTmp
,
p
Vg
Ctx
->
baseFilename
);
code
=
initOpenCacheFile
(
pTmp
,
p
File
Ctx
->
baseFilename
);
if
(
code
)
{
return
code
;
}
...
...
@@ -117,75 +124,41 @@ static int32_t acquireVgroupFileFd(SGroupCacheOperatorInfo* pGCache, SGcDownstre
return
TSDB_CODE_SUCCESS
;
}
static
FORCE_INLINE
void
release
VgroupFileFd
(
SGroupCacheFileFd
*
pFd
)
{
static
FORCE_INLINE
void
release
FdToFileCtx
(
SGroupCacheFileFd
*
pFd
)
{
taosThreadMutexUnlock
(
&
pFd
->
mutex
);
}
static
int32_t
saveB
atchBlocksToDisk
(
SGroupCacheOperatorInfo
*
pGCache
,
SGcBlkBufInfo
*
pHead
)
{
static
int32_t
saveB
locksToDisk
(
SGroupCacheOperatorInfo
*
pGCache
,
SGcDownstreamCtx
*
pCtx
,
SGcBlkBufInfo
*
pHead
)
{
int32_t
code
=
TSDB_CODE_SUCCESS
;
SGcBlkBufBasic
blkBasic
;
SGroupCacheFileFd
*
pFd
;
SGcFileCacheCtx
*
pFileCtx
=
NULL
;
while
(
NULL
!=
pHead
)
{
SGroupCacheFileFd
*
pFd
;
code
=
acquireDownstreamFileFd
(
pHead
->
pCtx
,
&
pFd
);
pFileCtx
=
pGCache
->
batchFetch
?
&
pHead
->
pCtx
->
fileCtx
:
&
pHead
->
pGroup
->
pVgCtx
->
fileCtx
;
code
=
acquireFdFromFileCtx
(
pFileCtx
,
pHead
->
basic
.
fileId
,
&
pFd
);
if
(
code
)
{
return
code
;
goto
_return
;
}
int32_t
ret
=
taosLSeekFile
(
pFd
->
fd
,
pHead
->
basic
.
offset
,
SEEK_SET
);
if
(
ret
==
-
1
)
{
releaseDownstreamFileFd
();
return
TAOS_SYSTEM_ERROR
(
errno
);
releaseFdToFileCtx
(
pFd
);
code
=
TAOS_SYSTEM_ERROR
(
errno
);
goto
_return
;
}
ret
=
(
int32_t
)
taosWriteFile
(
pFd
->
fd
,
pHead
->
pBuf
,
pHead
->
basic
.
bufSize
);
if
(
ret
!=
pHead
->
basic
.
bufSize
)
{
releaseDownstreamFileFd
();
return
TAOS_SYSTEM_ERROR
(
errno
);
}
releaseDownstreamFileFd
();
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
saveSeqBlocksToDisk
(
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
;
releaseFdToFileCtx
(
pFd
);
code
=
TAOS_SYSTEM_ERROR
(
errno
);
goto
_return
;
}
taosWLockLatch
(
&
pHead
->
pGroup
->
batchList
.
lock
);
taosArrayPush
(
pHead
->
pGroup
->
batchList
.
pList
,
&
pHead
->
basic
);
taosWUnLockLatch
(
&
pHead
->
pGroup
->
batchList
.
lock
);
releaseFdToFileCtx
(
pFd
);
qTrace
(
"FileId %u, blk %"
PRIu64
" size %"
PRIu64
" written to offset %"
PRIu64
,
pHead
->
basic
.
fileId
,
pHead
->
basic
.
blkId
,
pHead
->
basic
.
offset
,
pHead
->
basic
.
bufSize
);
int64_t
blkId
=
pHead
->
basic
.
blkId
;
pHead
=
pHead
->
next
;
...
...
@@ -193,18 +166,8 @@ static int32_t saveSeqBlocksToDisk(SGroupCacheOperatorInfo* pGCache, SGcBlkBufIn
taosHashRemove
(
pGCache
->
blkCache
.
pDirtyBlk
,
&
blkId
,
sizeof
(
blkId
));
}
return
code
;
}
static
int32_t
saveBlocksToDisk
(
SGroupCacheOperatorInfo
*
pGCache
,
SGcDownstreamCtx
*
pCtx
,
SGcBlkBufInfo
*
pHead
)
{
int32_t
code
=
TSDB_CODE_SUCCESS
;
if
(
pGCache
->
batchFetch
)
{
code
=
saveBatchBlocksToDisk
(
pGCache
,
pHead
);
}
else
{
code
=
saveSeqBlocksToDisk
(
pGCache
,
pHead
);
}
_return:
atomic_val_compare_exchange_32
(
&
pGCache
->
blkCache
.
writeDownstreamId
,
pCtx
->
id
,
-
1
);
...
...
@@ -212,16 +175,16 @@ static int32_t saveBlocksToDisk(SGroupCacheOperatorInfo* pGCache, SGcDownstreamC
}
static
int32_t
addBlkToDirtyBufList
(
SGroupCacheOperatorInfo
*
pGCache
,
SGcDownstreamCtx
*
pCtx
,
SGcVgroupCtx
*
pVgCtx
,
SGcBlkCacheInfo
*
pCache
,
SGcBlkBufInfo
*
pBufInfo
)
{
if
(
0
!=
taosHashPut
(
pCache
->
pDirtyBlk
,
&
pBufInfo
->
b
lkId
,
sizeof
(
pBufInfo
->
blkId
),
pBufInfo
,
sizeof
(
*
pBufInfo
)))
{
if
(
0
!=
taosHashPut
(
pCache
->
pDirtyBlk
,
&
pBufInfo
->
b
asic
.
blkId
,
sizeof
(
pBufInfo
->
basic
.
blkId
),
pBufInfo
,
sizeof
(
*
pBufInfo
)))
{
return
TSDB_CODE_OUT_OF_MEMORY
;
}
pBufInfo
=
taosHashGet
(
pCache
->
pDirtyBlk
,
&
pBufInfo
->
b
lkId
,
sizeof
(
pBufInfo
->
blkId
));
pBufInfo
=
taosHashGet
(
pCache
->
pDirtyBlk
,
&
pBufInfo
->
b
asic
.
blkId
,
sizeof
(
pBufInfo
->
basic
.
blkId
));
int32_t
code
=
TSDB_CODE_SUCCESS
;
SGcBlkBufInfo
*
pWriteHead
=
NULL
;
taosWLockLatch
(
&
pCache
->
dirtyLock
);
pCache
->
blkCacheSize
+=
pBufInfo
->
bufSize
;
pCache
->
blkCacheSize
+=
pBufInfo
->
b
asic
.
b
ufSize
;
qError
(
"group cache block cache num:%d size:%"
PRId64
,
taosHashGetSize
(
pCache
->
pDirtyBlk
),
pCache
->
blkCacheSize
);
if
(
NULL
==
pCache
->
pDirtyHead
)
{
...
...
@@ -236,7 +199,7 @@ static int32_t addBlkToDirtyBufList(SGroupCacheOperatorInfo* pGCache, SGcDownstr
pWriteHead
=
pCache
->
pDirtyHead
;
SGcBlkBufInfo
*
pTmp
=
pCache
->
pDirtyHead
;
while
(
NULL
!=
pTmp
)
{
pCache
->
blkCacheSize
-=
pTmp
->
bufSize
;
pCache
->
blkCacheSize
-=
pTmp
->
b
asic
.
b
ufSize
;
if
(
pCache
->
blkCacheSize
<=
pGCache
->
maxCacheSize
)
{
pCache
->
pDirtyHead
=
pTmp
->
next
;
pTmp
->
next
=
NULL
;
...
...
@@ -255,6 +218,17 @@ static int32_t addBlkToDirtyBufList(SGroupCacheOperatorInfo* pGCache, SGcDownstr
return
code
;
}
static
FORCE_INLINE
void
groupCacheSwitchNewFile
(
SGcFileCacheCtx
*
pFileCtx
)
{
if
(
pFileCtx
->
fileSize
<
GROUP_CACHE_DEFAULT_MAX_FILE_SIZE
)
{
return
;
}
pFileCtx
->
fileId
++
;
pFileCtx
->
fileSize
=
0
;
}
static
int32_t
addBlkToBufCache
(
struct
SOperatorInfo
*
pOperator
,
SSDataBlock
*
pBlock
,
SGcDownstreamCtx
*
pCtx
,
SGroupCacheData
*
pGroup
,
SGcBlkBufInfo
*
pBufInfo
)
{
SGroupCacheOperatorInfo
*
pGCache
=
pOperator
->
info
;
int64_t
bufSize
=
blockDataGetSize
(
pBlock
)
+
sizeof
(
int32_t
)
+
taosArrayGetSize
(
pBlock
->
pDataBlock
)
*
sizeof
(
int32_t
);
...
...
@@ -265,14 +239,20 @@ static int32_t addBlkToBufCache(struct SOperatorInfo* pOperator, SSDataBlock* pB
}
blockDataToBuf
(
pBufInfo
->
pBuf
,
pBlock
);
SGcFileCacheCtx
*
pFileCtx
=
pGCache
->
batchFetch
?
&
pCtx
->
fileCtx
:
&
pGroup
->
pVgCtx
->
fileCtx
;
pBufInfo
->
next
=
NULL
;
pBufInfo
->
blkId
=
atomic_add_fetch_64
(
&
pGCache
->
currentBlkId
,
1
);
pBufInfo
->
fileId
=
pGroup
->
fileId
;
pBufInfo
->
bufSize
=
bufSize
;
pBufInfo
->
offset
=
atomic_fetch_add_64
(
&
pGroup
->
pVg
Ctx
->
fileSize
,
bufSize
);
pBufInfo
->
b
asic
.
b
lkId
=
atomic_add_fetch_64
(
&
pGCache
->
currentBlkId
,
1
);
pBufInfo
->
basic
.
fileId
=
pGCache
->
batchFetch
?
pFileCtx
->
fileId
:
pGroup
->
fileId
;
pBufInfo
->
b
asic
.
b
ufSize
=
bufSize
;
pBufInfo
->
basic
.
offset
=
atomic_fetch_add_64
(
&
pFile
Ctx
->
fileSize
,
bufSize
);
pBufInfo
->
pCtx
=
pCtx
;
pBufInfo
->
pGroup
=
pGroup
;
if
(
pGCache
->
batchFetch
)
{
groupCacheSwitchNewFile
(
pFileCtx
);
}
int32_t
code
=
addBlkToDirtyBufList
(
pGCache
,
pCtx
,
pGroup
->
pVgCtx
,
&
pGCache
->
blkCache
,
pBufInfo
);
return
code
;
...
...
@@ -340,98 +320,38 @@ static int32_t buildGroupCacheResultBlock(SGroupCacheOperatorInfo* pGCache, int3
return
blockDataFromBuf
(
*
ppRes
,
pBuf
);
}
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
);
static
int32_t
readBlockFromDisk
(
SGroupCacheOperatorInfo
*
pGCache
,
SGroupCacheData
*
pGrp
,
SGcBlkBufBasic
*
pBasic
,
void
**
ppBuf
)
{
SGroupCacheFileFd
*
pFileFd
=
NULL
;
SGcFileCacheCtx
*
pFileCtx
=
pGCache
->
batchFetch
?
&
pGCache
->
pDownstreams
[
pGrp
->
downstreamIdx
].
fileCtx
:
&
pGrp
->
pVgCtx
->
fileCtx
;
int32_t
code
=
acquireFdFromFileCtx
(
pFileCtx
,
pBasic
->
fileId
,
&
pFileFd
);
if
(
code
)
{
return
code
;
}
int32_t
ret
=
taosLSeekFile
(
cacheFileF
d
,
pBasic
->
offset
,
SEEK_SET
);
int32_t
ret
=
taosLSeekFile
(
pFileFd
->
f
d
,
pBasic
->
offset
,
SEEK_SET
);
if
(
ret
==
-
1
)
{
return
TAOS_SYSTEM_ERROR
(
errno
);
code
=
TAOS_SYSTEM_ERROR
(
errno
);
goto
_return
;
}
*
ppBuf
=
taosMemoryMalloc
(
pBasic
->
bufSize
);
if
(
NULL
==
*
ppBuf
)
{
releaseDownstreamFileFd
()
;
return
TSDB_CODE_OUT_OF_MEMORY
;
code
=
TSDB_CODE_OUT_OF_MEMORY
;
goto
_return
;
}
ret
=
(
int32_t
)
taosReadFile
(
cacheFileF
d
,
*
ppBuf
,
pBasic
->
bufSize
);
ret
=
(
int32_t
)
taosReadFile
(
pFileFd
->
f
d
,
*
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
));
code
=
TAOS_SYSTEM_ERROR
(
errno
);
goto
_return
;
}
return
code
;
}
qTrace
(
"FileId %u, blk %"
PRIu64
" size %"
PRIu64
" read from offset %"
PRIu64
,
pBasic
->
fileId
,
pBasic
->
blkId
,
pBasic
->
offset
,
pBasic
->
bufSize
);
_return:
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
);
}
releaseFdToFileCtx
(
pFileFd
);
return
code
;
}
...
...
@@ -440,7 +360,6 @@ static int32_t retrieveBlkFromBufCache(SGroupCacheOperatorInfo* pGCache, SGroupC
SGcBlkCacheInfo
*
pCache
=
&
pGCache
->
blkCache
;
void
*
pBuf
=
NULL
;
taosRLockLatch
(
&
pCache
->
dirtyLock
);
SGcBlkBufInfo
*
pBufInfo
=
taosHashAcquire
(
pCache
->
pDirtyBlk
,
&
pBasic
->
blkId
,
sizeof
(
pBasic
->
blkId
));
if
(
NULL
==
pBufInfo
)
{
code
=
readBlockFromDisk
(
pGCache
,
pGrp
,
pBasic
,
&
pBuf
);
...
...
@@ -452,7 +371,11 @@ static int32_t retrieveBlkFromBufCache(SGroupCacheOperatorInfo* pGCache, SGroupC
}
code
=
buildGroupCacheResultBlock
(
pGCache
,
pGrp
->
downstreamIdx
,
pBuf
,
ppRes
);
taosRUnLockLatch
(
&
pCache
->
dirtyLock
);
taosHashRelease
(
pCache
->
pDirtyBlk
,
pBufInfo
);
if
(
NULL
==
pBufInfo
)
{
taosMemoryFree
(
pBuf
);
}
if
(
code
)
{
return
code
;
}
...
...
@@ -461,16 +384,16 @@ static int32_t retrieveBlkFromBufCache(SGroupCacheOperatorInfo* pGCache, SGroupC
return
TSDB_CODE_SUCCESS
;
}
static
FORCE_INLINE
void
initGcVgroupCtx
(
SGcVgroupCtx
*
pVgCtx
,
int32_t
downstreamId
,
int32_t
vgId
,
SArray
*
pTbList
)
{
static
FORCE_INLINE
void
initGcVgroupCtx
(
S
OperatorInfo
*
pOperator
,
S
GcVgroupCtx
*
pVgCtx
,
int32_t
downstreamId
,
int32_t
vgId
,
SArray
*
pTbList
)
{
pVgCtx
->
pTbList
=
pTbList
;
snprintf
(
pVgCtx
->
baseFilename
,
sizeof
(
pVgCtx
->
baseFilename
)
-
1
,
"%s/gc_%d_%s_%d_%d"
,
tsTempDir
,
getpid
(),
GET_TASKID
(
pOperator
->
pTaskInfo
),
downstreamId
,
vgId
);
pVgCtx
->
baseFilename
[
sizeof
(
pVgCtx
->
baseFilename
)
-
1
]
=
0
;
snprintf
(
pVgCtx
->
fileCtx
.
baseFilename
,
sizeof
(
pVgCtx
->
fileCtx
.
baseFilename
)
-
1
,
"%s/gc_%d_%s_%d_%d"
,
tsTempDir
,
getpid
(),
GET_TASKID
(
pOperator
->
pTaskInfo
),
downstreamId
,
vgId
);
pVgCtx
->
fileCtx
.
baseFilename
[
sizeof
(
pVgCtx
->
fileCtx
.
baseFilename
)
-
1
]
=
0
;
pVgCtx
->
baseNameLen
=
strlen
(
pVgCtx
->
baseFilename
);
pVgCtx
->
fileCtx
.
baseNameLen
=
strlen
(
pVgCtx
->
fileCtx
.
baseFilename
);
}
static
int32_t
addNewGroupToVgHash
(
SSHashObj
*
pHash
,
SGcNewGroupInfo
*
pNew
)
{
static
int32_t
addNewGroupToVgHash
(
S
OperatorInfo
*
pOperator
,
S
SHashObj
*
pHash
,
SGcNewGroupInfo
*
pNew
)
{
SGcVgroupCtx
*
pVgCtx
=
pNew
->
pGroup
->
pVgCtx
;
if
(
NULL
==
pVgCtx
)
{
SArray
*
pList
=
taosArrayInit
(
10
,
sizeof
(
*
pNew
));
...
...
@@ -479,7 +402,7 @@ static int32_t addNewGroupToVgHash(SSHashObj* pHash, SGcNewGroupInfo* pNew) {
}
taosArrayPush
(
pList
,
pNew
);
SGcVgroupCtx
vgCtx
=
{
0
};
initGcVgroupCtx
(
&
vgCtx
,
pNew
->
pGroup
->
downstreamIdx
,
pNew
->
vgId
,
pList
);
initGcVgroupCtx
(
pOperator
,
&
vgCtx
,
pNew
->
pGroup
->
downstreamIdx
,
pNew
->
vgId
,
pList
);
tSimpleHashPut
(
pHash
,
&
pNew
->
vgId
,
sizeof
(
pNew
->
vgId
),
&
vgCtx
,
sizeof
(
vgCtx
));
pNew
->
pGroup
->
pVgCtx
=
tSimpleHashGet
(
pHash
,
&
pNew
->
vgId
,
sizeof
(
pNew
->
vgId
));
return
TSDB_CODE_SUCCESS
;
...
...
@@ -504,7 +427,7 @@ static FORCE_INLINE int32_t appendNewGroupToDownstream(struct SOperatorInfo* pOp
for
(
int32_t
i
=
0
;
i
<
num
;
++
i
)
{
SGcNewGroupInfo
*
pNew
=
taosArrayGet
(
pCtx
->
pNewGrpList
,
i
);
if
(
!
pGCache
->
batchFetch
)
{
code
=
addNewGroupToVgHash
(
pCtx
->
pVgTbHash
,
pNew
);
code
=
addNewGroupToVgHash
(
p
Operator
,
p
Ctx
->
pVgTbHash
,
pNew
);
if
(
code
)
{
goto
_return
;
}
...
...
@@ -586,29 +509,13 @@ static FORCE_INLINE void handleGroupFetchDone(SGroupCacheData* pGroup) {
taosThreadMutexUnlock
(
&
pGroup
->
mutex
);
}
static
int32_t
vgroupSwitchNewFile
(
SGcVgroupCtx
*
pVgCtx
)
{
if
(
NULL
!=
pVgCtx
->
cacheFileFd
)
{
if
(
NULL
==
pVgCtx
->
pCacheFile
)
{
pVgCtx
->
pCacheFile
=
tSimpleHashInit
(
10
,
taosGetDefaultHashFunction
(
TSDB_DATA_TYPE_INT
));
if
(
NULL
==
pVgCtx
->
pCacheFile
)
{
return
TSDB_CODE_OUT_OF_MEMORY
;
}
}
tSimpleHashPut
(
pVgCtx
->
pCacheFile
,
&
pVgCtx
->
fileId
,
sizeof
(
pVgCtx
->
fileId
),
&
pVgCtx
->
cacheFileFd
,
sizeof
(
pVgCtx
->
cacheFileFd
));
}
pVgCtx
->
fileId
++
;
pVgCtx
->
fileSize
=
0
;
return
TSDB_CODE_SUCCESS
;
}
static
int32_t
handleVgroupTableFetchDone
(
SGcDownstreamCtx
*
pCtx
,
SGroupCacheData
*
pGroup
,
uint64_t
uid
)
{
if
(
pCtx
->
lastBlkUid
==
uid
||
pGroup
->
pVgCtx
->
lastUid
==
uid
)
{
if
(
pCtx
->
lastBlkUid
==
uid
||
pGroup
->
pVgCtx
->
last
Blk
Uid
==
uid
)
{
return
TSDB_CODE_SUCCESS
;
}
pCtx
->
lastBlkUid
=
uid
;
pGroup
->
pVgCtx
->
lastUid
=
uid
;
pGroup
->
pVgCtx
->
last
Blk
Uid
=
uid
;
int32_t
i
=
0
;
while
(
true
)
{
...
...
@@ -619,15 +526,10 @@ static int32_t handleVgroupTableFetchDone(SGcDownstreamCtx* pCtx, SGroupCacheDat
handleGroupFetchDone
(
pNew
->
pGroup
);
}
if
(
pGroup
->
pVgCtx
->
fileSize
>=
GROUP_CACHE_DEFAULT_MAX_FILE_SIZE
)
{
int32_t
code
=
vgroupSwitchNewFile
(
pGroup
->
pVgCtx
);
if
(
TSDB_CODE_SUCCESS
!=
code
)
{
return
code
;
}
}
groupCacheSwitchNewFile
(
&
pGroup
->
pVgCtx
->
fileCtx
);
pGroup
->
fileId
=
pGroup
->
pVgCtx
->
fileId
;
pGroup
->
startOffset
=
pGroup
->
pVgCtx
->
fileSize
;
pGroup
->
fileId
=
pGroup
->
pVgCtx
->
file
Ctx
.
file
Id
;
pGroup
->
startOffset
=
pGroup
->
pVgCtx
->
file
Ctx
.
file
Size
;
return
TSDB_CODE_SUCCESS
;
}
...
...
@@ -637,15 +539,8 @@ static FORCE_INLINE void initNewGroupData(SGcDownstreamCtx* pCtx, SGroupCacheDat
taosThreadMutexInit
(
&
pGroup
->
mutex
,
NULL
);
pGroup
->
downstreamIdx
=
downstreamIdx
;
pGroup
->
vgId
=
vgId
;
if
(
batchFetch
)
{
pGroup
->
fileId
=
0
;
pGroup
->
batchList
.
pList
=
taosArrayInit
(
10
,
POINTER_BYTES
);
}
else
{
pGroup
->
fileId
=
-
1
;
pGroup
->
seqList
.
startBlkId
=
-
1
;
pGroup
->
seqList
.
endBlkId
=
-
1
;
}
pGroup
->
blkList
.
pList
=
taosArrayInit
(
10
,
sizeof
(
SGcBlkBufBasic
));
pGroup
->
startOffset
=
-
1
;
pGroup
->
pVgCtx
=
tSimpleHashGet
(
pCtx
->
pVgTbHash
,
&
pGroup
->
vgId
,
sizeof
(
pGroup
->
vgId
));
}
...
...
@@ -691,18 +586,14 @@ static int32_t addNewGroupData(struct SOperatorInfo* pOperator, SOperatorParam*
return
TSDB_CODE_SUCCESS
;
}
static
int32_t
addBlkToGroupCache
(
bool
batchFetch
,
SGroupCacheData
*
pGroup
,
SGcBlkBufInfo
*
pNewBlk
,
int32_t
*
pIdx
)
{
taosWLockLatch
(
&
pGroup
->
batchList
.
lock
);
if
(
batchFetch
)
{
taosArrayPush
(
pGroup
->
batchList
.
pList
,
&
pNewBlk
->
basic
);
}
else
{
taosArrayPush
(
pGroup
->
batchList
.
pList
,
&
pNewBlk
->
basic
.
offset
);
}
static
int32_t
addBlkToGroupCache
(
bool
batchFetch
,
SGroupCacheData
*
pGroup
,
SGcBlkBufInfo
*
pNewBlk
,
int64_t
*
pIdx
)
{
taosWLockLatch
(
&
pGroup
->
blkList
.
lock
);
taosArrayPush
(
pGroup
->
blkList
.
pList
,
&
pNewBlk
->
basic
);
*
pIdx
=
taosArrayGetSize
(
pGroup
->
blkList
.
pList
)
-
1
;
taosWUnLockLatch
(
&
pGroup
->
blkList
.
lock
);
*
pIdx
=
taosArrayGetSize
(
pGroup
->
batchList
.
pList
)
-
1
;
qError
(
"block added to group cache, total block num:%"
PRId64
,
*
pIdx
+
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
;
}
...
...
@@ -835,25 +726,25 @@ static int32_t getBlkFromSessionCacheImpl(struct SOperatorInfo* pOperator, int64
SGroupCacheOperatorInfo
*
pGCache
=
pOperator
->
info
;
*
got
=
true
;
SG
roupBatchBlkList
*
pBatchList
=
&
pSession
->
pGroupData
->
batch
List
;
taosRLockLatch
(
&
pB
atch
List
->
lock
);
int64_t
blkNum
=
taosArrayGetSize
(
pB
atch
List
->
pList
);
SG
cBlkList
*
pBlkList
=
&
pSession
->
pGroupData
->
blk
List
;
taosRLockLatch
(
&
pB
lk
List
->
lock
);
int64_t
blkNum
=
taosArrayGetSize
(
pB
lk
List
->
pList
);
if
(
pSession
->
lastBlkId
<
0
)
{
if
(
blkNum
>
0
)
{
SGcBlkBufBasic
*
pBasic
=
taosArrayGet
(
pB
atch
List
->
pList
,
0
);
taosRUnLockLatch
(
&
pB
atch
List
->
lock
);
SGcBlkBufBasic
*
pBasic
=
taosArrayGet
(
pB
lk
List
->
pList
,
0
);
taosRUnLockLatch
(
&
pB
lk
List
->
lock
);
code
=
retrieveBlkFromBufCache
(
pGCache
,
pSession
->
pGroupData
,
sessionId
,
pBasic
,
ppRes
);
pSession
->
lastBlkId
=
0
;
return
code
;
}
}
else
if
((
pSession
->
lastBlkId
+
1
)
<
blkNum
)
{
SGcBlkBufBasic
*
pBasic
=
taosArrayGet
(
pB
atch
List
->
pList
,
pSession
->
lastBlkId
+
1
);
taosRUnLockLatch
(
&
pB
atch
List
->
lock
);
SGcBlkBufBasic
*
pBasic
=
taosArrayGet
(
pB
lk
List
->
pList
,
pSession
->
lastBlkId
+
1
);
taosRUnLockLatch
(
&
pB
lk
List
->
lock
);
code
=
retrieveBlkFromBufCache
(
pGCache
,
pSession
->
pGroupData
,
sessionId
,
pBasic
,
ppRes
);
pSession
->
lastBlkId
++
;
return
code
;
}
taosRUnLockLatch
(
&
pB
atch
List
->
lock
);
taosRUnLockLatch
(
&
pB
lk
List
->
lock
);
if
(
atomic_load_8
((
int8_t
*
)
&
pSession
->
pGroupData
->
fetchDone
))
{
*
ppRes
=
NULL
;
...
...
@@ -950,6 +841,10 @@ _return:
return
code
;
}
void
freeGcBlkBufInfo
(
void
*
ptr
)
{
SGcBlkBufInfo
*
pBlk
=
(
SGcBlkBufInfo
*
)
ptr
;
taosMemoryFree
(
pBlk
->
pBuf
);
}
static
int32_t
initGroupCacheBlockCache
(
SGroupCacheOperatorInfo
*
pInfo
)
{
SGcBlkCacheInfo
*
pCache
=
&
pInfo
->
blkCache
;
...
...
@@ -957,7 +852,7 @@ static int32_t initGroupCacheBlockCache(SGroupCacheOperatorInfo* pInfo) {
if
(
NULL
==
pCache
->
pDirtyBlk
)
{
return
TSDB_CODE_OUT_OF_MEMORY
;
}
taosHashSetFreeFp
(
pCache
->
pDirtyBlk
,
,,,,,,,
);
taosHashSetFreeFp
(
pCache
->
pDirtyBlk
,
freeGcBlkBufInfo
);
pCache
->
pReadBlk
=
taosHashInit
(
10
,
taosGetDefaultHashFunction
(
TSDB_DATA_TYPE_BIGINT
),
false
,
HASH_ENTRY_LOCK
);
if
(
NULL
==
pCache
->
pReadBlk
)
{
return
TSDB_CODE_OUT_OF_MEMORY
;
...
...
@@ -1057,7 +952,7 @@ static int32_t initGroupCacheDownstreamCtx(SOperatorInfo* pOperator) {
if
(
pInfo
->
batchFetch
)
{
int32_t
defaultVg
=
0
;
SGcVgroupCtx
vgCtx
=
{
0
};
initGcVgroupCtx
(
&
vgCtx
,
pCtx
->
id
,
defaultVg
,
NULL
);
initGcVgroupCtx
(
pOperator
,
&
vgCtx
,
pCtx
->
id
,
defaultVg
,
NULL
);
tSimpleHashPut
(
pCtx
->
pVgTbHash
,
&
defaultVg
,
sizeof
(
defaultVg
),
&
vgCtx
,
sizeof
(
vgCtx
));
}
...
...
@@ -1087,8 +982,9 @@ static int32_t initGroupCacheDownstreamCtx(SOperatorInfo* pOperator) {
return
TSDB_CODE_OUT_OF_MEMORY
;
}
snprintf
(
pCtx
->
baseFilename
,
sizeof
(
pCtx
->
baseFilename
)
-
1
,
"%s/gc_%d_%s_%d"
,
tsTempDir
,
getpid
(),
GET_TASKID
(
pOperator
->
pTaskInfo
),
pCtx
->
id
);
pCtx
->
baseFilename
[
sizeof
(
pCtx
->
baseFilename
)
-
1
]
=
0
;
snprintf
(
pCtx
->
fileCtx
.
baseFilename
,
sizeof
(
pCtx
->
fileCtx
.
baseFilename
)
-
1
,
"%s/gc_%d_%s_%d"
,
tsTempDir
,
getpid
(),
GET_TASKID
(
pOperator
->
pTaskInfo
),
pCtx
->
id
);
pCtx
->
fileCtx
.
baseFilename
[
sizeof
(
pCtx
->
fileCtx
.
baseFilename
)
-
1
]
=
0
;
pCtx
->
fileCtx
.
baseNameLen
=
strlen
(
pCtx
->
fileCtx
.
baseFilename
);
}
return
TSDB_CODE_SUCCESS
;
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录