Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
冷面1992
TDengine
提交
14be1790
TDengine
项目概览
冷面1992
/
TDengine
与 Fork 源项目一致
Fork自
taosdata / TDengine
通知
1
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
TDengine
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
提交
14be1790
编写于
12月 16, 2019
作者:
H
hjxilinx
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
fix bug #929.[TBASE-1349]
上级
e03f3364
变更
4
显示空白变更内容
内联
并排
Showing
4 changed file
with
203 addition
and
158 deletion
+203
-158
src/system/detail/inc/vnode.h
src/system/detail/inc/vnode.h
+0
-2
src/system/detail/inc/vnodeRead.h
src/system/detail/inc/vnodeRead.h
+1
-0
src/system/detail/src/vnodeQueryImpl.c
src/system/detail/src/vnodeQueryImpl.c
+202
-154
src/system/detail/src/vnodeRead.c
src/system/detail/src/vnodeRead.c
+0
-2
未找到文件。
src/system/detail/inc/vnode.h
浏览文件 @
14be1790
...
...
@@ -267,9 +267,7 @@ typedef struct SQuery {
int16_t
checkBufferInLoop
;
// check if the buffer is full during scan each block
SLimitVal
limit
;
int32_t
rowSize
;
int32_t
dataRowSize
;
// row size of each loaded data from disk, the value is
// used for prepare buffer
SSqlGroupbyExpr
*
pGroupbyExpr
;
SSqlFunctionExpr
*
pSelectExpr
;
SColumnInfoEx
*
colList
;
...
...
src/system/detail/inc/vnodeRead.h
浏览文件 @
14be1790
...
...
@@ -40,6 +40,7 @@ typedef struct SQueryLoadBlockInfo {
int32_t
fileId
;
int32_t
slotIdx
;
int32_t
sid
;
bool
tsLoaded
;
// if timestamp column of current block is loaded or not
}
SQueryLoadBlockInfo
;
typedef
struct
SQueryLoadCompBlockInfo
{
...
...
src/system/detail/src/vnodeQueryImpl.c
浏览文件 @
14be1790
...
...
@@ -38,9 +38,16 @@ enum {
TS_JOIN_TAG_NOT_EQUALS
=
2
,
};
enum
{
DISK_BLOCK_NO_NEED_TO_LOAD
=
0
,
DISK_BLOCK_LOAD_TS
=
1
,
DISK_BLOCK_LOAD_BLOCK
=
2
,
};
#define IS_DISK_DATA_BLOCK(q) ((q)->fileId >= 0)
//static int32_t copyDataFromMMapBuffer(int fd, SQInfo *pQInfo, SQueryFilesInfo *pQueryFile, char *buf, uint64_t offset,
// static int32_t copyDataFromMMapBuffer(int fd, SQInfo *pQInfo, SQueryFilesInfo *pQueryFile, char *buf, uint64_t
// offset,
// int32_t size);
static
int32_t
readDataFromDiskFile
(
int
fd
,
SQInfo
*
pQInfo
,
SQueryFilesInfo
*
pQueryFile
,
char
*
buf
,
uint64_t
offset
,
int32_t
size
);
...
...
@@ -121,8 +128,8 @@ static FORCE_INLINE int32_t validateCompBlockInfoSegment(SQInfo *pQInfo, const c
return
0
;
}
static
FORCE_INLINE
int32_t
validateCompBlockSegment
(
SQInfo
*
pQInfo
,
const
char
*
filePath
,
SCompInfo
*
compInfo
,
char
*
pBlock
,
int32_t
vid
,
TSCKSUM
checksum
)
{
static
FORCE_INLINE
int32_t
validateCompBlockSegment
(
SQInfo
*
pQInfo
,
const
char
*
filePath
,
SCompInfo
*
compInfo
,
char
*
pBlock
,
int32_t
vid
,
TSCKSUM
checksum
)
{
uint32_t
size
=
compInfo
->
numOfBlocks
*
sizeof
(
SCompBlock
);
if
(
checksum
!=
taosCalcChecksum
(
0
,
(
uint8_t
*
)
pBlock
,
size
))
{
...
...
@@ -195,7 +202,8 @@ static bool vnodeIsCompBlockInfoLoaded(SQueryRuntimeEnv *pRuntimeEnv, SMeterObj
// if vnodeFreeFields is called, the pQuery->pFields is NULL
if
(
pLoadCompBlockInfo
->
fileListIndex
==
fileIndex
&&
pLoadCompBlockInfo
->
sid
==
pMeterObj
->
sid
&&
pQuery
->
pFields
!=
NULL
&&
pQuery
->
fileId
>
0
)
{
assert
(
pRuntimeEnv
->
vnodeFileInfo
.
pFileInfo
[
fileIndex
].
fileID
==
pLoadCompBlockInfo
->
fileId
&&
pQuery
->
numOfBlocks
>
0
);
assert
(
pRuntimeEnv
->
vnodeFileInfo
.
pFileInfo
[
fileIndex
].
fileID
==
pLoadCompBlockInfo
->
fileId
&&
pQuery
->
numOfBlocks
>
0
);
return
true
;
}
...
...
@@ -216,7 +224,8 @@ static void vnodeInitLoadCompBlockInfo(SQueryLoadCompBlockInfo *pCompBlockLoadIn
pCompBlockLoadInfo
->
fileListIndex
=
-
1
;
}
static
bool
vnodeIsDatablockLoaded
(
SQueryRuntimeEnv
*
pRuntimeEnv
,
SMeterObj
*
pMeterObj
,
int32_t
fileIndex
)
{
static
int32_t
vnodeIsDatablockLoaded
(
SQueryRuntimeEnv
*
pRuntimeEnv
,
SMeterObj
*
pMeterObj
,
int32_t
fileIndex
,
bool
loadPrimaryTS
)
{
SQuery
*
pQuery
=
pRuntimeEnv
->
pQuery
;
SQueryLoadBlockInfo
*
pLoadInfo
=
&
pRuntimeEnv
->
loadBlockInfo
;
...
...
@@ -224,13 +233,20 @@ static bool vnodeIsDatablockLoaded(SQueryRuntimeEnv *pRuntimeEnv, SMeterObj *pMe
if
(
pLoadInfo
->
fileId
==
pQuery
->
fileId
&&
pLoadInfo
->
slotIdx
==
pQuery
->
slot
&&
pQuery
->
slot
!=
-
1
&&
pLoadInfo
->
sid
==
pMeterObj
->
sid
)
{
assert
(
fileIndex
==
pLoadInfo
->
fileListIndex
);
return
true
;
// previous load operation does not load the primary timestamp column, we only need to load the timestamp column
if
(
pLoadInfo
->
tsLoaded
==
false
&&
pLoadInfo
->
tsLoaded
!=
loadPrimaryTS
)
{
return
DISK_BLOCK_LOAD_TS
;
}
else
{
return
DISK_BLOCK_NO_NEED_TO_LOAD
;
}
}
return
false
;
return
DISK_BLOCK_LOAD_BLOCK
;
}
static
void
vnodeSetDataBlockInfoLoaded
(
SQueryRuntimeEnv
*
pRuntimeEnv
,
SMeterObj
*
pMeterObj
,
int32_t
fileIndex
)
{
static
void
vnodeSetDataBlockInfoLoaded
(
SQueryRuntimeEnv
*
pRuntimeEnv
,
SMeterObj
*
pMeterObj
,
int32_t
fileIndex
,
bool
tsLoaded
)
{
SQuery
*
pQuery
=
pRuntimeEnv
->
pQuery
;
SQueryLoadBlockInfo
*
pLoadInfo
=
&
pRuntimeEnv
->
loadBlockInfo
;
...
...
@@ -238,6 +254,7 @@ static void vnodeSetDataBlockInfoLoaded(SQueryRuntimeEnv *pRuntimeEnv, SMeterObj
pLoadInfo
->
slotIdx
=
pQuery
->
slot
;
pLoadInfo
->
fileListIndex
=
fileIndex
;
pLoadInfo
->
sid
=
pMeterObj
->
sid
;
pLoadInfo
->
tsLoaded
=
tsLoaded
;
}
static
void
vnodeInitDataBlockInfo
(
SQueryLoadBlockInfo
*
pBlockLoadInfo
)
{
...
...
@@ -247,10 +264,10 @@ static void vnodeInitDataBlockInfo(SQueryLoadBlockInfo *pBlockLoadInfo) {
pBlockLoadInfo
->
fileListIndex
=
-
1
;
}
static
void
vnodeSetOpenedFileNames
(
SQueryFilesInfo
*
pVnodeFilesInfo
)
{
static
void
vnodeSetOpenedFileNames
(
SQueryFilesInfo
*
pVnodeFilesInfo
)
{
assert
(
pVnodeFilesInfo
->
current
>=
0
&&
pVnodeFilesInfo
->
current
<
pVnodeFilesInfo
->
numOfFiles
);
SHeaderFileInfo
*
pCurrentFileInfo
=
&
pVnodeFilesInfo
->
pFileInfo
[
pVnodeFilesInfo
->
current
];
SHeaderFileInfo
*
pCurrentFileInfo
=
&
pVnodeFilesInfo
->
pFileInfo
[
pVnodeFilesInfo
->
current
];
/*
* set the full file path for current opened files
...
...
@@ -287,11 +304,11 @@ static void vnodeSetOpenedFileNames(SQueryFilesInfo* pVnodeFilesInfo) {
* @return
*/
static
FORCE_INLINE
bool
isHeaderFileEmpty
(
int32_t
vnodeId
,
size_t
headerFileSize
)
{
SVnodeCfg
*
pVnodeCfg
=
&
vnodeList
[
vnodeId
].
cfg
;
SVnodeCfg
*
pVnodeCfg
=
&
vnodeList
[
vnodeId
].
cfg
;
return
headerFileSize
<=
getCompHeaderStartPosition
(
pVnodeCfg
);
}
static
bool
checkIsHeaderFileEmpty
(
SQueryFilesInfo
*
pVnodeFilesInfo
,
int32_t
vnodeId
)
{
static
bool
checkIsHeaderFileEmpty
(
SQueryFilesInfo
*
pVnodeFilesInfo
,
int32_t
vnodeId
)
{
struct
stat
fstat
=
{
0
};
if
(
stat
(
pVnodeFilesInfo
->
headerFilePath
,
&
fstat
)
<
0
)
{
return
true
;
...
...
@@ -302,13 +319,13 @@ static bool checkIsHeaderFileEmpty(SQueryFilesInfo* pVnodeFilesInfo, int32_t vno
return
isHeaderFileEmpty
(
vnodeId
,
pVnodeFilesInfo
->
headFileSize
);
}
static
void
doCloseQueryFileInfoFD
(
SQueryFilesInfo
*
pVnodeFilesInfo
)
{
static
void
doCloseQueryFileInfoFD
(
SQueryFilesInfo
*
pVnodeFilesInfo
)
{
tclose
(
pVnodeFilesInfo
->
headerFd
);
tclose
(
pVnodeFilesInfo
->
dataFd
);
tclose
(
pVnodeFilesInfo
->
lastFd
);
}
static
void
doInitQueryFileInfoFD
(
SQueryFilesInfo
*
pVnodeFilesInfo
)
{
static
void
doInitQueryFileInfoFD
(
SQueryFilesInfo
*
pVnodeFilesInfo
)
{
pVnodeFilesInfo
->
current
=
-
1
;
pVnodeFilesInfo
->
headFileSize
=
-
1
;
...
...
@@ -320,8 +337,8 @@ static void doInitQueryFileInfoFD(SQueryFilesInfo* pVnodeFilesInfo) {
/*
* clean memory and other corresponding resources are delegated to invoker
*/
static
int32_t
doOpenQueryFileData
(
SQInfo
*
pQInfo
,
SQueryFilesInfo
*
pVnodeFileInfo
,
int32_t
vnodeId
)
{
SHeaderFileInfo
*
pHeaderFileInfo
=
&
pVnodeFileInfo
->
pFileInfo
[
pVnodeFileInfo
->
current
];
static
int32_t
doOpenQueryFileData
(
SQInfo
*
pQInfo
,
SQueryFilesInfo
*
pVnodeFileInfo
,
int32_t
vnodeId
)
{
SHeaderFileInfo
*
pHeaderFileInfo
=
&
pVnodeFileInfo
->
pFileInfo
[
pVnodeFileInfo
->
current
];
pVnodeFileInfo
->
headerFd
=
open
(
pVnodeFileInfo
->
headerFilePath
,
O_RDONLY
);
if
(
!
FD_VALID
(
pVnodeFileInfo
->
headerFd
))
{
...
...
@@ -355,8 +372,8 @@ static int32_t doOpenQueryFileData(SQInfo* pQInfo, SQueryFilesInfo* pVnodeFileIn
return
-
1
;
}
pVnodeFileInfo
->
pHeaderFileData
=
mmap
(
NULL
,
pVnodeFileInfo
->
headFileSize
,
PROT_READ
,
MAP_SHARED
,
pVnodeFileInfo
->
headerFd
,
0
);
pVnodeFileInfo
->
pHeaderFileData
=
mmap
(
NULL
,
pVnodeFileInfo
->
headFileSize
,
PROT_READ
,
MAP_SHARED
,
pVnodeFileInfo
->
headerFd
,
0
);
if
(
pVnodeFileInfo
->
pHeaderFileData
==
MAP_FAILED
)
{
pVnodeFileInfo
->
pHeaderFileData
=
NULL
;
...
...
@@ -377,15 +394,14 @@ static int32_t doOpenQueryFileData(SQInfo* pQInfo, SQueryFilesInfo* pVnodeFileIn
return
TSDB_CODE_SUCCESS
;
}
static
void
doUnmapHeaderFile
(
SQueryFilesInfo
*
pVnodeFileInfo
)
{
static
void
doUnmapHeaderFile
(
SQueryFilesInfo
*
pVnodeFileInfo
)
{
munmap
(
pVnodeFileInfo
->
pHeaderFileData
,
pVnodeFileInfo
->
headFileSize
);
pVnodeFileInfo
->
pHeaderFileData
=
NULL
;
pVnodeFileInfo
->
headFileSize
=
-
1
;
}
static
void
doCloseOpenedFileData
(
SQueryFilesInfo
*
pVnodeFileInfo
)
{
static
void
doCloseOpenedFileData
(
SQueryFilesInfo
*
pVnodeFileInfo
)
{
if
(
pVnodeFileInfo
->
current
>=
0
)
{
assert
(
pVnodeFileInfo
->
current
<
pVnodeFileInfo
->
numOfFiles
&&
pVnodeFileInfo
->
current
>=
0
);
doUnmapHeaderFile
(
pVnodeFileInfo
);
...
...
@@ -487,7 +503,8 @@ static int vnodeGetCompBlockInfo(SMeterObj *pMeterObj, SQueryRuntimeEnv *pRuntim
}
// corrupted file may cause the invalid compInfoOffset, check needs
if
(
validateCompBlockOffset
(
pQInfo
,
pMeterObj
,
compHeader
,
&
pRuntimeEnv
->
vnodeFileInfo
,
getCompHeaderStartPosition
(
pCfg
))
<
0
)
{
if
(
validateCompBlockOffset
(
pQInfo
,
pMeterObj
,
compHeader
,
&
pRuntimeEnv
->
vnodeFileInfo
,
getCompHeaderStartPosition
(
pCfg
))
<
0
)
{
return
-
1
;
}
...
...
@@ -751,8 +768,7 @@ static int32_t loadColumnIntoMem(SQuery *pQuery, SQueryFilesInfo *pQueryFileInfo
// load checksum
TSCKSUM
checksum
=
0
;
ret
=
readDataFromDiskFile
(
fd
,
pQInfo
,
pQueryFileInfo
,
(
char
*
)
&
checksum
,
offset
+
pFields
[
col
].
len
,
sizeof
(
TSCKSUM
));
ret
=
readDataFromDiskFile
(
fd
,
pQInfo
,
pQueryFileInfo
,
(
char
*
)
&
checksum
,
offset
+
pFields
[
col
].
len
,
sizeof
(
TSCKSUM
));
if
(
ret
!=
0
)
{
return
ret
;
}
...
...
@@ -776,7 +792,7 @@ static int32_t loadColumnIntoMem(SQuery *pQuery, SQueryFilesInfo *pQueryFileInfo
static
int32_t
loadDataBlockFieldsInfo
(
SQueryRuntimeEnv
*
pRuntimeEnv
,
SCompBlock
*
pBlock
,
SField
**
pField
)
{
SQuery
*
pQuery
=
pRuntimeEnv
->
pQuery
;
SQInfo
*
pQInfo
=
(
SQInfo
*
)
GET_QINFO_ADDR
(
pQuery
);
SMeterObj
*
pMeterObj
=
pRuntimeEnv
->
pMeterObj
;
SMeterObj
*
pMeterObj
=
pRuntimeEnv
->
pMeterObj
;
SQueryFilesInfo
*
pVnodeFilesInfo
=
&
pRuntimeEnv
->
vnodeFileInfo
;
size_t
size
=
sizeof
(
SField
)
*
(
pBlock
->
numOfCols
)
+
sizeof
(
TSCKSUM
);
...
...
@@ -822,6 +838,21 @@ static void fillWithNull(SQuery *pQuery, char *dst, int32_t col, int32_t numOfPo
setNullN
(
dst
,
type
,
bytes
,
numOfPoints
);
}
static
int32_t
loadPrimaryTSColumn
(
SQueryRuntimeEnv
*
pRuntimeEnv
,
SCompBlock
*
pBlock
,
SField
**
pField
,
int32_t
*
columnBytes
)
{
SQuery
*
pQuery
=
pRuntimeEnv
->
pQuery
;
assert
(
PRIMARY_TSCOL_LOADED
(
pQuery
)
==
false
);
if
(
columnBytes
!=
NULL
)
{
(
*
columnBytes
)
+=
(
*
pField
)[
PRIMARYKEY_TIMESTAMP_COL_INDEX
].
len
+
sizeof
(
TSCKSUM
);
}
int32_t
ret
=
loadColumnIntoMem
(
pQuery
,
&
pRuntimeEnv
->
vnodeFileInfo
,
pBlock
,
*
pField
,
PRIMARYKEY_TIMESTAMP_COL_INDEX
,
pRuntimeEnv
->
primaryColBuffer
,
pRuntimeEnv
->
unzipBuffer
,
pRuntimeEnv
->
secondaryUnzipBuffer
,
pRuntimeEnv
->
unzipBufSize
);
return
ret
;
}
static
int32_t
loadDataBlockIntoMem
(
SCompBlock
*
pBlock
,
SField
**
pField
,
SQueryRuntimeEnv
*
pRuntimeEnv
,
int32_t
fileIdx
,
bool
loadPrimaryCol
,
bool
loadSField
)
{
int32_t
i
=
0
,
j
=
0
;
...
...
@@ -832,15 +863,39 @@ static int32_t loadDataBlockIntoMem(SCompBlock *pBlock, SField **pField, SQueryR
assert
(
fileIdx
==
pRuntimeEnv
->
vnodeFileInfo
.
current
);
SData
**
primaryTSBuf
=
&
pRuntimeEnv
->
primaryColBuffer
;
SData
**
primaryTSBuf
=
&
pRuntimeEnv
->
primaryColBuffer
;
void
*
tmpBuf
=
pRuntimeEnv
->
unzipBuffer
;
int32_t
columnBytes
=
0
;
if
(
vnodeIsDatablockLoaded
(
pRuntimeEnv
,
pMeterObj
,
fileIdx
))
{
dTrace
(
"QInfo:%p vid:%d sid:%d id:%s, data block has been loaded, ts:%d, slot:%d, brange:%lld-%lld, rows:%d"
,
GET_QINFO_ADDR
(
pQuery
),
pMeterObj
->
vnode
,
pMeterObj
->
sid
,
pMeterObj
->
meterId
,
loadPrimaryCol
,
pQuery
->
slot
,
pBlock
->
keyFirst
,
pBlock
->
keyLast
,
pBlock
->
numOfPoints
);
SQueryCostSummary
*
pSummary
=
&
pRuntimeEnv
->
summary
;
return
0
;
int32_t
status
=
vnodeIsDatablockLoaded
(
pRuntimeEnv
,
pMeterObj
,
fileIdx
,
loadPrimaryCol
);
if
(
status
==
DISK_BLOCK_NO_NEED_TO_LOAD
)
{
dTrace
(
"QInfo:%p vid:%d sid:%d id:%s, fileId:%d, data block has been loaded, no need to load again, ts:%d, slot:%d, "
"brange:%lld-%lld, rows:%d"
,
GET_QINFO_ADDR
(
pQuery
),
pMeterObj
->
vnode
,
pMeterObj
->
sid
,
pMeterObj
->
meterId
,
pQuery
->
fileId
,
loadPrimaryCol
,
pQuery
->
slot
,
pBlock
->
keyFirst
,
pBlock
->
keyLast
,
pBlock
->
numOfPoints
);
if
(
loadSField
&&
(
pQuery
->
pFields
==
NULL
||
pQuery
->
pFields
[
pQuery
->
slot
]
==
NULL
))
{
loadDataBlockFieldsInfo
(
pRuntimeEnv
,
pBlock
,
&
pQuery
->
pFields
[
pQuery
->
slot
]);
}
return
TSDB_CODE_SUCCESS
;
}
else
if
(
status
==
DISK_BLOCK_LOAD_TS
)
{
dTrace
(
"QInfo:%p vid:%d sid:%d id:%s, fileId:%d, data block has been loaded, incrementally load ts"
,
GET_QINFO_ADDR
(
pQuery
),
pMeterObj
->
vnode
,
pMeterObj
->
sid
,
pMeterObj
->
meterId
,
pQuery
->
fileId
);
assert
(
PRIMARY_TSCOL_LOADED
(
pQuery
)
==
false
&&
loadSField
==
true
);
if
(
pQuery
->
pFields
==
NULL
||
pQuery
->
pFields
[
pQuery
->
slot
]
==
NULL
)
{
loadDataBlockFieldsInfo
(
pRuntimeEnv
,
pBlock
,
&
pQuery
->
pFields
[
pQuery
->
slot
]);
}
// load primary timestamp
int32_t
ret
=
loadPrimaryTSColumn
(
pRuntimeEnv
,
pBlock
,
pField
,
&
columnBytes
);
vnodeSetDataBlockInfoLoaded
(
pRuntimeEnv
,
pMeterObj
,
fileIdx
,
loadPrimaryCol
);
return
ret
;
}
/* failed to load fields info, return with error info */
...
...
@@ -848,21 +903,15 @@ static int32_t loadDataBlockIntoMem(SCompBlock *pBlock, SField **pField, SQueryR
return
-
1
;
}
SQueryCostSummary
*
pSummary
=
&
pRuntimeEnv
->
summary
;
int32_t
columnBytes
=
0
;
int64_t
st
=
taosGetTimestampUs
();
if
(
loadPrimaryCol
)
{
if
(
PRIMARY_TSCOL_LOADED
(
pQuery
))
{
*
primaryTSBuf
=
sdata
[
0
];
}
else
{
columnBytes
+=
(
*
pField
)[
PRIMARYKEY_TIMESTAMP_COL_INDEX
].
len
+
sizeof
(
TSCKSUM
);
int32_t
ret
=
loadColumnIntoMem
(
pQuery
,
&
pRuntimeEnv
->
vnodeFileInfo
,
pBlock
,
*
pField
,
PRIMARYKEY_TIMESTAMP_COL_INDEX
,
*
primaryTSBuf
,
tmpBuf
,
pRuntimeEnv
->
secondaryUnzipBuffer
,
pRuntimeEnv
->
unzipBufSize
);
if
(
ret
!=
0
)
{
return
-
1
;
int32_t
ret
=
loadPrimaryTSColumn
(
pRuntimeEnv
,
pBlock
,
pField
,
&
columnBytes
);
if
(
ret
!=
TSDB_CODE_SUCCESS
)
{
return
ret
;
}
pSummary
->
numOfSeek
++
;
...
...
@@ -936,7 +985,7 @@ static int32_t loadDataBlockIntoMem(SCompBlock *pBlock, SField **pField, SQueryR
pSummary
->
loadBlocksUs
+=
(
et
-
st
);
pSummary
->
readDiskBlocks
++
;
vnodeSetDataBlockInfoLoaded
(
pRuntimeEnv
,
pMeterObj
,
fileIdx
);
vnodeSetDataBlockInfoLoaded
(
pRuntimeEnv
,
pMeterObj
,
fileIdx
,
loadPrimaryCol
);
return
ret
;
}
...
...
@@ -1848,7 +1897,7 @@ int32_t vnodeGetVnodeHeaderFileIdx(int32_t *fid, SQueryRuntimeEnv *pRuntimeEnv,
return
-
1
;
}
SQueryFilesInfo
*
pVnodeFiles
=
&
pRuntimeEnv
->
vnodeFileInfo
;
SQueryFilesInfo
*
pVnodeFiles
=
&
pRuntimeEnv
->
vnodeFileInfo
;
/* set the initial file for current query */
if
(
order
==
TSQL_SO_ASC
&&
*
fid
<
pVnodeFiles
->
pFileInfo
[
0
].
fileID
)
{
...
...
@@ -3119,7 +3168,8 @@ static void vnodeRecordAllFiles(SQInfo *pQInfo, int32_t vnodeId) {
pVnodeFilesInfo
->
dbFilePathPrefix
);
/* order the files information according their names */
qsort
(
pVnodeFilesInfo
->
pFileInfo
,
(
size_t
)
pVnodeFilesInfo
->
numOfFiles
,
sizeof
(
SHeaderFileInfo
),
file_order_comparator
);
qsort
(
pVnodeFilesInfo
->
pFileInfo
,
(
size_t
)
pVnodeFilesInfo
->
numOfFiles
,
sizeof
(
SHeaderFileInfo
),
file_order_comparator
);
}
static
void
updateOffsetVal
(
SQueryRuntimeEnv
*
pRuntimeEnv
,
SBlockInfo
*
pBlockInfo
,
void
*
pBlock
)
{
...
...
@@ -3602,9 +3652,9 @@ void pointInterpSupporterInit(SQuery *pQuery, SPointInterpoSupporter *pInterpoSu
int32_t
offset
=
0
;
for
(
int32_t
i
=
0
,
j
=
0
;
i
<
pQuery
->
numOfCols
;
++
i
,
++
j
)
{
pInterpoSupport
->
pPrevPoint
[
j
]
=
prev
+
offset
;
pInterpoSupport
->
pNextPoint
[
j
]
=
next
+
offset
;
for
(
int32_t
i
=
0
;
i
<
pQuery
->
numOfCols
;
++
i
)
{
pInterpoSupport
->
pPrevPoint
[
i
]
=
prev
+
offset
;
pInterpoSupport
->
pNextPoint
[
i
]
=
next
+
offset
;
offset
+=
pQuery
->
colList
[
i
].
data
.
bytes
;
}
...
...
@@ -4026,7 +4076,7 @@ TSKEY getTimestampInCacheBlock(SCacheBlock *pBlock, int32_t index) {
/*
* NOTE: pQuery->pos will not change, the corresponding data block will be loaded into buffer
* loadDataBlockOnDemand will change the value of pQuery->pos, according to the pQuery->lastKey
*
*
/
*/
TSKEY
getTimestampInDiskBlock
(
SQueryRuntimeEnv
*
pRuntimeEnv
,
int32_t
index
)
{
SQuery
*
pQuery
=
pRuntimeEnv
->
pQuery
;
...
...
@@ -4046,20 +4096,13 @@ TSKEY getTimestampInDiskBlock(SQueryRuntimeEnv *pRuntimeEnv, int32_t index) {
int32_t
fileId
=
pQuery
->
fileId
;
int32_t
fileIndex
=
vnodeGetVnodeHeaderFileIdx
(
&
fileId
,
pRuntimeEnv
,
pQuery
->
order
.
order
);
if
(
!
vnodeIsDatablockLoaded
(
pRuntimeEnv
,
pMeterObj
,
fileIndex
))
{
dTrace
(
"QInfo:%p vid:%d sid:%d id:%s, fileId:%d, slot:%d load data block due to primary key required"
,
GET_QINFO_ADDR
(
pQuery
),
pMeterObj
->
vnode
,
pMeterObj
->
sid
,
pMeterObj
->
meterId
,
pQuery
->
fileId
,
pQuery
->
slot
);
// todo handle failed to load data, file corrupted
// todo refactor the return value
int32_t
ret
=
loadDataBlockIntoMem
(
pBlock
,
&
pQuery
->
pFields
[
pQuery
->
slot
],
pRuntimeEnv
,
fileIndex
,
loadTimestamp
,
true
);
UNUSED
(
ret
);
}
// the fields info is not loaded, load it into memory
if
(
pQuery
->
pFields
==
NULL
||
pQuery
->
pFields
[
pQuery
->
slot
]
==
NULL
)
{
loadDataBlockFieldsInfo
(
pRuntimeEnv
,
pBlock
,
&
pQuery
->
pFields
[
pQuery
->
slot
]);
if
(
ret
!=
TSDB_CODE_SUCCESS
)
{
return
-
1
;
}
SET_DATA_BLOCK_LOADED
(
pRuntimeEnv
->
blockStatus
);
...
...
@@ -4914,7 +4957,8 @@ int32_t doMergeMetersResultsToGroupRes(SMeterQuerySupportObj *pSupporter, SQuery
if
(
buffer
[
0
]
->
numOfElems
!=
0
)
{
// there are data in buffer
if
(
flushFromResultBuf
(
pSupporter
,
pQuery
,
pRuntimeEnv
)
!=
TSDB_CODE_SUCCESS
)
{
dError
(
"QInfo:%p failed to flush data into temp file, abort query"
,
GET_QINFO_ADDR
(
pQuery
),
pSupporter
->
extBufFile
);
dError
(
"QInfo:%p failed to flush data into temp file, abort query"
,
GET_QINFO_ADDR
(
pQuery
),
pSupporter
->
extBufFile
);
tfree
(
pTree
);
tfree
(
pValidMeter
);
tfree
(
posArray
);
...
...
@@ -4939,10 +4983,10 @@ int32_t doMergeMetersResultsToGroupRes(SMeterQuerySupportObj *pSupporter, SQuery
return
pSupporter
->
numOfGroupResultPages
;
}
static
int32_t
extendDiskBuf
(
const
SQuery
*
pQuery
,
SMeterQuerySupportObj
*
pSupporter
,
int32_t
numOfPages
)
{
static
int32_t
extendDiskBuf
(
const
SQuery
*
pQuery
,
SMeterQuerySupportObj
*
pSupporter
,
int32_t
numOfPages
)
{
assert
(
pSupporter
->
numOfPages
*
DEFAULT_INTERN_BUF_SIZE
==
pSupporter
->
bufSize
);
SQInfo
*
pQInfo
=
(
SQInfo
*
)
GET_QINFO_ADDR
(
pQuery
);
SQInfo
*
pQInfo
=
(
SQInfo
*
)
GET_QINFO_ADDR
(
pQuery
);
int32_t
ret
=
munmap
(
pSupporter
->
meterOutputMMapBuf
,
pSupporter
->
bufSize
);
pSupporter
->
numOfPages
=
numOfPages
;
...
...
@@ -4976,7 +5020,8 @@ static int32_t extendDiskBuf(const SQuery* pQuery, SMeterQuerySupportObj *pSuppo
return
TSDB_CODE_SUCCESS
;
}
int32_t
flushFromResultBuf
(
SMeterQuerySupportObj
*
pSupporter
,
const
SQuery
*
pQuery
,
const
SQueryRuntimeEnv
*
pRuntimeEnv
)
{
int32_t
flushFromResultBuf
(
SMeterQuerySupportObj
*
pSupporter
,
const
SQuery
*
pQuery
,
const
SQueryRuntimeEnv
*
pRuntimeEnv
)
{
int32_t
numOfMeterResultBufPages
=
pSupporter
->
lastPageId
+
1
;
int64_t
dstSize
=
numOfMeterResultBufPages
*
DEFAULT_INTERN_BUF_SIZE
+
pSupporter
->
groupResultSize
*
(
pSupporter
->
numOfGroupResultPages
+
1
);
...
...
@@ -5355,6 +5400,7 @@ static void doSingleMeterSupplementScan(SQueryRuntimeEnv *pRuntimeEnv) {
// usually this load operation will incure load disk block operation
TSKEY
endKey
=
loadRequiredBlockIntoMem
(
pRuntimeEnv
,
&
pRuntimeEnv
->
endPos
);
assert
((
QUERY_IS_ASC_QUERY
(
pQuery
)
&&
endKey
<=
pQuery
->
ekey
)
||
(
!
QUERY_IS_ASC_QUERY
(
pQuery
)
&&
endKey
>=
pQuery
->
ekey
));
...
...
@@ -5603,7 +5649,7 @@ SMeterDataInfo **vnodeFilterQualifiedMeters(SQInfo *pQInfo, int32_t vid, int32_t
SVnodeObj
*
pVnode
=
&
vnodeList
[
vid
];
char
*
pHeaderFileData
=
vnodeGetHeaderFileData
(
pRuntimeEnv
,
vid
,
fileIndex
);
char
*
pHeaderFileData
=
vnodeGetHeaderFileData
(
pRuntimeEnv
,
vid
,
fileIndex
);
if
(
pHeaderFileData
==
NULL
)
{
// failed to load header file into buffer
return
0
;
}
...
...
@@ -5611,7 +5657,8 @@ SMeterDataInfo **vnodeFilterQualifiedMeters(SQInfo *pQInfo, int32_t vid, int32_t
int32_t
tmsize
=
sizeof
(
SCompHeader
)
*
(
pVnode
->
cfg
.
maxSessions
)
+
sizeof
(
TSCKSUM
);
// file is corrupted, abort query in current file
if
(
validateHeaderOffsetSegment
(
pQInfo
,
pRuntimeEnv
->
vnodeFileInfo
.
headerFilePath
,
vid
,
pHeaderFileData
,
tmsize
)
<
0
)
{
if
(
validateHeaderOffsetSegment
(
pQInfo
,
pRuntimeEnv
->
vnodeFileInfo
.
headerFilePath
,
vid
,
pHeaderFileData
,
tmsize
)
<
0
)
{
*
numOfMeters
=
0
;
return
0
;
}
...
...
@@ -5754,7 +5801,7 @@ void changeMeterQueryInfoForSuppleQuery(SMeterQueryInfo *pMeterQueryInfo, TSKEY
}
}
static
tFilePage
*
allocNewPage
(
SQuery
*
pQuery
,
SMeterQuerySupportObj
*
pSupporter
,
uint32_t
*
pageId
)
{
static
tFilePage
*
allocNewPage
(
SQuery
*
pQuery
,
SMeterQuerySupportObj
*
pSupporter
,
uint32_t
*
pageId
)
{
if
(
pSupporter
->
lastPageId
==
pSupporter
->
numOfPages
-
1
)
{
if
(
extendDiskBuf
(
pQuery
,
pSupporter
,
pSupporter
->
numOfPages
+
pSupporter
->
numOfMeters
)
!=
TSDB_CODE_SUCCESS
)
{
return
NULL
;
...
...
@@ -5765,7 +5812,8 @@ static tFilePage *allocNewPage(SQuery* pQuery, SMeterQuerySupportObj *pSupporter
return
getFilePage
(
pSupporter
,
*
pageId
);
}
tFilePage
*
addDataPageForMeterQueryInfo
(
SQuery
*
pQuery
,
SMeterQueryInfo
*
pMeterQueryInfo
,
SMeterQuerySupportObj
*
pSupporter
)
{
tFilePage
*
addDataPageForMeterQueryInfo
(
SQuery
*
pQuery
,
SMeterQueryInfo
*
pMeterQueryInfo
,
SMeterQuerySupportObj
*
pSupporter
)
{
uint32_t
pageId
=
0
;
tFilePage
*
pPage
=
allocNewPage
(
pQuery
,
pSupporter
,
&
pageId
);
...
...
@@ -5907,7 +5955,7 @@ static bool setCurrentQueryRange(SMeterDataInfo *pMeterDataInfo, SQuery *pQuery,
* @return
*/
uint32_t
getDataBlocksForMeters
(
SMeterQuerySupportObj
*
pSupporter
,
SQuery
*
pQuery
,
char
*
pHeaderData
,
int32_t
numOfMeters
,
const
char
*
filePath
,
SMeterDataInfo
**
pMeterDataInfo
)
{
int32_t
numOfMeters
,
const
char
*
filePath
,
SMeterDataInfo
**
pMeterDataInfo
)
{
uint32_t
numOfBlocks
=
0
;
SQInfo
*
pQInfo
=
(
SQInfo
*
)
GET_QINFO_ADDR
(
pQuery
);
SQueryCostSummary
*
pSummary
=
&
pSupporter
->
runtimeEnv
.
summary
;
...
...
@@ -6273,7 +6321,7 @@ int32_t setOutputBufferForIntervalQuery(SMeterQuerySupportObj *pSupporter, SMete
SQueryRuntimeEnv
*
pRuntimeEnv
=
&
pSupporter
->
runtimeEnv
;
tFilePage
*
pData
=
NULL
;
SQuery
*
pQuery
=
pRuntimeEnv
->
pQuery
;
SQuery
*
pQuery
=
pRuntimeEnv
->
pQuery
;
// in the first scan, new space needed for results
if
(
pMeterQueryInfo
->
numOfPages
==
0
)
{
...
...
@@ -6621,7 +6669,7 @@ bool needPrimaryTimestampCol(SQuery *pQuery, SBlockInfo *pBlockInfo) {
int32_t
LoadDatablockOnDemand
(
SCompBlock
*
pBlock
,
SField
**
pFields
,
uint8_t
*
blkStatus
,
SQueryRuntimeEnv
*
pRuntimeEnv
,
int32_t
fileIdx
,
int32_t
slotIdx
,
__block_search_fn_t
searchFn
,
bool
onDemand
)
{
SQuery
*
pQuery
=
pRuntimeEnv
->
pQuery
;
SMeterObj
*
pMeterObj
=
pRuntimeEnv
->
pMeterObj
;
SMeterObj
*
pMeterObj
=
pRuntimeEnv
->
pMeterObj
;
TSKEY
*
primaryKeys
=
(
TSKEY
*
)
pRuntimeEnv
->
primaryColBuffer
->
data
;
...
...
src/system/detail/src/vnodeRead.c
浏览文件 @
14be1790
...
...
@@ -193,8 +193,6 @@ static SQInfo *vnodeAllocateQInfoCommon(SQueryMeterMsg *pQueryMsg, SMeterObj *pM
}
else
{
pQuery
->
colList
[
i
].
data
.
filters
=
NULL
;
}
pQuery
->
dataRowSize
+=
colList
[
i
].
bytes
;
}
vnodeUpdateQueryColumnIndex
(
pQuery
,
pMeterObj
);
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录