Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
taosdata
TDengine
提交
1adfaef8
T
TDengine
项目概览
taosdata
/
TDengine
大约 2 年 前同步成功
通知
1192
Star
22018
Fork
4786
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
1
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
T
TDengine
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
1
Issue
1
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
提交
1adfaef8
编写于
10月 16, 2020
作者:
H
Hongze Cheng
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
refactor more code
上级
464df615
变更
3
隐藏空白更改
内联
并排
Showing
3 changed file
with
106 addition
and
159 deletion
+106
-159
src/tsdb/inc/tsdbMain.h
src/tsdb/inc/tsdbMain.h
+1
-100
src/tsdb/src/tsdbReadUtil.c
src/tsdb/src/tsdbReadUtil.c
+84
-56
src/tsdb/src/tsdbUtil.c
src/tsdb/src/tsdbUtil.c
+21
-3
未找到文件。
src/tsdb/inc/tsdbMain.h
浏览文件 @
1adfaef8
...
...
@@ -272,48 +272,6 @@ typedef struct {
SBlockCol
cols
[];
}
SBlockData
;
// typedef enum { TSDB_WRITE_HELPER, TSDB_READ_HELPER } tsdb_rw_helper_t;
// typedef struct {
// TSKEY minKey;
// TSKEY maxKey;
// SFileGroup fGroup;
// SFile nHeadF;
// SFile nLastF;
// } SHelperFile;
// typedef struct {
// uint64_t uid;
// int32_t tid;
// } SHelperTable;
// typedef struct {
// SBlockIdx* pIdxArray;
// int numOfIdx;
// int curIdx;
// } SIdxH;
// typedef struct {
// tsdb_rw_helper_t type;
// STsdbRepo* pRepo;
// int8_t state;
// // For file set usage
// SHelperFile files;
// SIdxH idxH;
// SBlockIdx curCompIdx;
// void* pWIdx;
// // For table set usage
// SHelperTable tableInfo;
// SBlockInfo* pCompInfo;
// bool hasOldLastBlock;
// // For block set usage
// SBlockData* pCompData;
// SDataCols* pDataCols[2];
// void* pBuffer; // Buffer to hold the whole data block
// void* compBuffer; // Buffer for temperary compress/decompress purpose
// } SRWHelper;
// ------------------ tsdbScan.c
typedef
struct
{
SFileGroup
fGroup
;
...
...
@@ -342,7 +300,6 @@ typedef struct {
void
*
pCBuf
;
}
SReadHandle
;
#define TSDB_READ_FILE(pReadH, type) (&((pReadH)->fGroup.files[(type)]))
#define TSDB_BLOCK_DATA_LEN(nCols) (sizeof(SBlockData) + sizeof(SBlockCol) * (nCols) + sizeof(TSCKSUM))
// Operations
...
...
@@ -506,62 +463,6 @@ int tsdbLoadFileHeader(SFile* pFile, uint32_t* version);
void
tsdbGetFileInfoImpl
(
char
*
fname
,
uint32_t
*
magic
,
int64_t
*
size
);
void
tsdbGetFidKeyRange
(
int
daysPerFile
,
int8_t
precision
,
int
fileId
,
TSKEY
*
minKey
,
TSKEY
*
maxKey
);
// ------------------ tsdbRWHelper.c
// #define TSDB_HELPER_CLEAR_STATE 0x0 // Clear state
// #define TSDB_HELPER_FILE_SET_AND_OPEN 0x1 // File is set
// #define TSDB_HELPER_IDX_LOAD 0x2 // SCompIdx part is loaded
// #define TSDB_HELPER_TABLE_SET 0x4 // Table is set
// #define TSDB_HELPER_INFO_LOAD 0x8 // SCompInfo part is loaded
// #define TSDB_HELPER_FILE_DATA_LOAD 0x10 // SCompData part is loaded
// #define helperSetState(h, s) (((h)->state) |= (s))
// #define helperClearState(h, s) ((h)->state &= (~(s)))
// #define helperHasState(h, s) ((((h)->state) & (s)) == (s))
// #define blockAtIdx(h, idx) ((h)->pCompInfo->blocks + idx)
// #define TSDB_MAX_SUBBLOCKS 8
// #define IS_SUB_BLOCK(pBlock) ((pBlock)->numOfSubBlocks == 0)
// #define helperType(h) (h)->type
// #define helperRepo(h) (h)->pRepo
// #define helperState(h) (h)->state
// #define TSDB_NLAST_FILE_OPENED(h) ((h)->files.nLastF.fd > 0)
// #define helperFileId(h) ((h)->files.fGroup.fileId)
// #define helperHeadF(h) (&((h)->files.fGroup.files[TSDB_FILE_TYPE_HEAD]))
// #define helperDataF(h) (&((h)->files.fGroup.files[TSDB_FILE_TYPE_DATA]))
// #define helperLastF(h) (&((h)->files.fGroup.files[TSDB_FILE_TYPE_LAST]))
// #define helperNewHeadF(h) (&((h)->files.nHeadF))
// #define helperNewLastF(h) (&((h)->files.nLastF))
// int tsdbInitReadHelper(SRWHelper* pHelper, STsdbRepo* pRepo);
// int tsdbInitWriteHelper(SRWHelper* pHelper, STsdbRepo* pRepo);
// void tsdbDestroyHelper(SRWHelper* pHelper);
// void tsdbResetHelper(SRWHelper* pHelper);
// int tsdbSetAndOpenHelperFile(SRWHelper* pHelper, SFileGroup* pGroup);
// int tsdbCloseHelperFile(SRWHelper* pHelper, bool hasError, SFileGroup* pGroup);
// int tsdbSetHelperTable(SRWHelper* pHelper, STable* pTable, STsdbRepo* pRepo);
// int tsdbCommitTableData(SRWHelper* pHelper, SCommitIter* pCommitIter, SDataCols* pDataCols, TSKEY maxKey);
// int tsdbMoveLastBlockIfNeccessary(SRWHelper* pHelper);
// int tsdbWriteCompInfo(SRWHelper* pHelper);
// int tsdbWriteCompIdx(SRWHelper* pHelper);
// int tsdbLoadCompIdxImpl(SFile* pFile, uint32_t offset, uint32_t len, void* buffer);
// int tsdbDecodeSCompIdxImpl(void* buffer, uint32_t len, SBlockIdx** ppCompIdx, int* numOfIdx);
// int tsdbLoadCompIdx(SRWHelper* pHelper, void* target);
// int tsdbLoadCompInfoImpl(SFile* pFile, SBlockIdx* pIdx, SBlockInfo** ppCompInfo);
// int tsdbLoadCompInfo(SRWHelper* pHelper, void* target);
// int tsdbLoadCompData(SRWHelper* phelper, SBlock* pcompblock, void* target);
// void tsdbGetDataStatis(SRWHelper* pHelper, SDataStatis* pStatis, int numOfCols);
// int tsdbLoadBlockDataCols(SRWHelper* pHelper, SBlock* pCompBlock, SBlockInfo* pCompInfo, int16_t* colIds,
// int numOfColIds);
// int tsdbLoadBlockData(SRWHelper* pHelper, SBlock* pCompBlock, SBlockInfo* pCompInfo);
// static FORCE_INLINE int compTSKEY(const void* key1, const void* key2) {
// if (*(TSKEY*)key1 > *(TSKEY*)key2) {
// return 1;
// } else if (*(TSKEY*)key1 == *(TSKEY*)key2) {
// return 0;
// } else {
// return -1;
// }
// }
// ------------------ tsdbMain.c
#define REPO_ID(r) (r)->config.tsdbId
#define IS_REPO_LOCKED(r) (r)->repoLocked
...
...
@@ -609,7 +510,7 @@ int tsdbLoadBlockDataInfo(SReadHandle* pReadH, SBlock* pBlock);
#define TSDB_FILE_IN_FGROUP(pGroup, type) (&((pGroup)->files[(type)]))
int
tsdbAllocBuf
(
void
**
ppBuf
,
in
t
size
);
int
tsdbAllocBuf
(
void
**
ppBuf
,
uint32_
t
size
);
#ifdef __cplusplus
}
...
...
src/tsdb/src/tsdbReadUtil.c
浏览文件 @
1adfaef8
...
...
@@ -12,6 +12,7 @@
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#include <errno.h>
#include <fcntl.h>
#include <sys/stat.h>
#include <sys/types.h>
...
...
@@ -23,6 +24,15 @@
#define TSDB_KEY_COL_OFFSET 0
static
int
tsdbLoadBlockDataImpl
(
SReadHandle
*
pReadH
,
SBlock
*
pBlock
,
SDataCols
*
pDataCols
);
static
int
tsdbLoadBlockDataColsImpl
(
SReadHandle
*
pReadH
,
SBlock
*
pBlock
,
SDataCols
*
pDataCols
,
int16_t
*
colIds
,
int
numOfColIds
);
static
int
tsdbDecodeBlockIdxArray
(
SReadHandle
*
pReadH
);
static
int
tsdbVerifyBlockInfo
(
SBlockInfo
*
pBlockInfo
,
SBlockIdx
*
pBlockIdx
);
static
int
tsdbCheckAndDecodeColumnData
(
SDataCol
*
pDataCol
,
void
*
content
,
int32_t
len
,
int8_t
comp
,
int
numOfRows
,
int
maxPoints
,
char
*
buffer
,
int
bsize
);
static
int
tsdbLoadColData
(
SReadHandle
*
pReadH
,
SFile
*
pFile
,
SBlock
*
pBlock
,
SBlockCol
*
pBlockCol
,
SDataCol
*
pDataCol
);
SReadHandle
*
tsdbNewReadHandle
(
STsdbRepo
*
pRepo
)
{
SReadHandle
*
pReadH
=
(
SReadHandle
*
)
calloc
(
1
,
sizeof
(
*
pReadH
));
if
(
pReadH
==
NULL
)
{
...
...
@@ -35,6 +45,7 @@ SReadHandle *tsdbNewReadHandle(STsdbRepo *pRepo) {
STsdbMeta
*
pMeta
=
pRepo
->
tsdbMeta
;
STsdbCfg
*
pCfg
=
&
(
pRepo
->
config
);
// TODO: make the memory allocation on demand
if
((
pReadH
->
pDataCols
[
0
]
=
tdNewDataCols
(
pMeta
->
maxRowBytes
,
pMeta
->
maxCols
,
pCfg
->
maxRowsPerFileBlock
))
==
NULL
||
(
pReadH
->
pDataCols
[
1
]
=
tdNewDataCols
(
pMeta
->
maxRowBytes
,
pMeta
->
maxCols
,
pCfg
->
maxRowsPerFileBlock
))
==
NULL
)
{
terrno
=
TSDB_CODE_TDB_OUT_OF_MEMORY
;
...
...
@@ -61,6 +72,8 @@ void tsdbFreeReadHandle(SReadHandle *pReadH) {
}
int
tsdbSetAndOpenReadFGroup
(
SReadHandle
*
pReadH
,
SFileGroup
*
pFGroup
)
{
ASSERT
(
pReadH
!=
NULL
&&
pFGroup
!=
NULL
);
STsdbRepo
*
pRepo
=
pReadH
->
pRepo
;
STsdbCfg
*
pCfg
=
&
(
pRepo
->
config
);
...
...
@@ -69,7 +82,7 @@ int tsdbSetAndOpenReadFGroup(SReadHandle *pReadH, SFileGroup *pFGroup) {
tsdbResetFGroupFd
(
&
(
pReadH
->
fGroup
));
for
(
int
type
=
0
;
type
<
TSDB_FILE_TYPE_MAX
;
type
++
)
{
SFile
*
pFile
=
TSDB_
READ_FILE
(
pReadH
,
type
);
SFile
*
pFile
=
TSDB_
FILE_IN_FGROUP
(
&
(
pReadH
->
fGroup
)
,
type
);
if
(
pFile
->
fname
[
0
]
!=
'\0'
)
{
// pFile->fname[0] == '\0' is for commit usage
pFile
->
fd
=
open
(
pFile
->
fname
,
O_RDONLY
);
...
...
@@ -89,7 +102,7 @@ int tsdbSetAndOpenReadFGroup(SReadHandle *pReadH, SFileGroup *pFGroup) {
void
tsdbCloseAndUnsetReadFile
(
SReadHandle
*
pReadH
)
{
for
(
int
type
=
0
;
type
<
TSDB_FILE_TYPE_MAX
;
type
++
)
{
SFile
*
pFile
=
TSDB_
READ_FILE
(
pReadH
,
type
);
SFile
*
pFile
=
TSDB_
FILE_IN_FGROUP
(
&
(
pReadH
->
fGroup
)
,
type
);
if
(
pFile
->
fd
>=
0
)
{
(
void
)
close
(
pFile
->
fd
);
...
...
@@ -99,15 +112,19 @@ void tsdbCloseAndUnsetReadFile(SReadHandle *pReadH) {
}
int
tsdbLoadBlockIdx
(
SReadHandle
*
pReadH
)
{
ASSERT
(
pReadH
!=
NULL
);
STsdbRepo
*
pRepo
=
pReadH
->
pRepo
;
SFile
*
pFile
=
TSDB_
READ_FILE
(
pReadH
,
TSDB_FILE_TYPE_HEAD
);
SFile
*
pFile
=
TSDB_
FILE_IN_FGROUP
(
&
(
pReadH
->
fGroup
)
,
TSDB_FILE_TYPE_HEAD
);
if
(
pFile
->
fd
<
0
||
pFile
->
info
.
len
==
0
)
{
if
(
pFile
->
fd
<
0
||
pFile
->
info
.
len
==
0
)
{
// for backward compatibility
pReadH
->
nBlockIdx
=
0
;
pReadH
->
pCurBlockIdx
=
NULL
;
return
0
;
}
ASSERT
(
pFile
->
info
.
size
==
pFile
->
info
.
offset
+
pFile
->
info
.
len
);
if
(
tsdbAllocBuf
(
&
(
pReadH
->
pBuf
),
pFile
->
info
.
len
)
<
0
)
{
terrno
=
TSDB_CODE_TDB_OUT_OF_MEMORY
;
return
-
1
;
...
...
@@ -129,15 +146,15 @@ int tsdbLoadBlockIdx(SReadHandle *pReadH) {
}
if
(
ret
<
pFile
->
info
.
len
||
!
taosCheckChecksumWhole
((
uint8_t
*
)(
pReadH
->
pBuf
),
pFile
->
info
.
len
))
{
tsdbError
(
"vgId:%d block idx part is corrupted in file %s, offset %u len %u
"
,
REPO_ID
(
pRepo
),
pFile
->
fname
,
pFile
->
info
.
offset
,
pFile
->
info
.
len
);
tsdbError
(
"vgId:%d block idx part is corrupted in file %s, offset %u len %u
file size %"
PRIu64
,
REPO_ID
(
pRepo
)
,
pFile
->
fname
,
pFile
->
info
.
offset
,
pFile
->
info
.
len
,
pFile
->
info
.
size
);
terrno
=
TSDB_CODE_TDB_FILE_CORRUPTED
;
return
-
1
;
}
if
(
tsdbDecodeBlockIdxArray
(
pReadH
)
<
0
)
{
tsdbError
(
"vgId:%d error occurs while decoding block idx part from file %s
"
,
REPO_ID
(
pRepo
),
pFile
->
fname
);
terrno
=
TSDB_CODE_TDB_FILE_CORRUPTED
;
tsdbError
(
"vgId:%d error occurs while decoding block idx part from file %s
since %s"
,
REPO_ID
(
pRepo
),
pFile
->
fname
,
tstrerror
(
terrno
))
;
return
-
1
;
}
...
...
@@ -147,7 +164,7 @@ int tsdbLoadBlockIdx(SReadHandle *pReadH) {
}
int
tsdbSetReadTable
(
SReadHandle
*
pReadH
,
STable
*
pTable
)
{
ASSERT
(
pTable
!=
NULL
);
ASSERT
(
p
ReadH
!=
NULL
&&
p
Table
!=
NULL
);
pReadH
->
pTable
=
pTable
;
...
...
@@ -162,6 +179,7 @@ int tsdbSetReadTable(SReadHandle *pReadH, STable *pTable) {
if
(
pReadH
->
nBlockIdx
>
0
)
{
ASSERT
(
pReadH
->
cBlockIdx
<=
pReadH
->
nBlockIdx
);
// linear search TABLE_TID(pTable)
while
(
true
)
{
if
(
pReadH
->
cBlockIdx
>=
pReadH
->
nBlockIdx
)
{
pReadH
->
pCurBlockIdx
=
NULL
;
...
...
@@ -192,15 +210,17 @@ int tsdbSetReadTable(SReadHandle *pReadH, STable *pTable) {
}
int
tsdbLoadBlockInfo
(
SReadHandle
*
pReadH
)
{
ASSERT
(
pReadH
!=
NULL
);
if
(
pReadH
->
pCurBlockIdx
==
NULL
)
return
0
;
SFile
*
pFile
=
TSDB_
READ_FILE
(
pReadH
,
TSDB_FILE_TYPE_HEAD
);
SFile
*
pFile
=
TSDB_
FILE_IN_FGROUP
(
&
(
pReadH
->
fGroup
)
,
TSDB_FILE_TYPE_HEAD
);
SBlockIdx
*
pBlockIdx
=
pReadH
->
pCurBlockIdx
;
STsdbRepo
*
pRepo
=
pReadH
->
pRepo
;
ASSERT
(
pFile
->
fd
>
0
);
ASSERT
(
pFile
->
fd
>
0
&&
pBlockIdx
->
len
>
0
);
if
(
tsdbAllocBuf
(
&
((
void
*
)
pReadH
->
pBlockInfo
),
pBlockIdx
->
len
)
<
0
)
{
if
(
tsdbAllocBuf
(
&
((
void
*
)
(
pReadH
->
pBlockInfo
)
),
pBlockIdx
->
len
)
<
0
)
{
terrno
=
TSDB_CODE_TDB_OUT_OF_MEMORY
;
return
-
1
;
}
...
...
@@ -221,7 +241,7 @@ int tsdbLoadBlockInfo(SReadHandle *pReadH) {
}
if
(
ret
<
pBlockIdx
->
len
||
tsdbVerifyBlockInfo
(
pReadH
->
pBlockInfo
,
pBlockIdx
)
<
0
)
{
tsdbError
(
"vgId:%d table %s block info part is corrupted
from
file %s"
,
REPO_ID
(
pRepo
),
tsdbError
(
"vgId:%d table %s block info part is corrupted
in
file %s"
,
REPO_ID
(
pRepo
),
TABLE_CHAR_NAME
(
pReadH
->
pTable
),
pFile
->
fname
);
terrno
=
TSDB_CODE_TDB_FILE_CORRUPTED
;
return
-
1
;
...
...
@@ -270,7 +290,7 @@ int tsdbLoadBlockDataCols(SReadHandle *pReadH, SBlock *pBlock, SBlockInfo *pBloc
for
(
int
i
=
1
;
i
<
nSubBlock
;
i
++
)
{
pSubBlock
++
;
if
(
tsdbLoadBlockDataColsImpl
(
pReadH
,
pSubBlock
,
pReadH
->
pDataCols
[
1
],
colIds
,
numOfCols
)
<
0
)
return
-
1
;
if
(
tdMergeDataCols
(
pReadH
->
pDataCols
[
0
],
pReadH
->
pDataCols
[
1
],
pReadH
->
pDataCols
[
1
]
->
numOfRows
)
<
0
)
goto
_err
;
if
(
tdMergeDataCols
(
pReadH
->
pDataCols
[
0
],
pReadH
->
pDataCols
[
1
],
pReadH
->
pDataCols
[
1
]
->
numOfRows
)
<
0
)
return
-
1
;
}
ASSERT
(
pReadH
->
pDataCols
[
0
]
->
numOfRows
==
pBlock
->
numOfRows
);
...
...
@@ -284,8 +304,12 @@ int tsdbLoadBlockDataInfo(SReadHandle *pReadH, SBlock *pBlock) {
ASSERT
(
pBlock
->
numOfSubBlocks
<=
1
);
STsdbRepo
*
pRepo
=
pReadH
->
pRepo
;
SFile
*
pFile
=
(
pBlock
->
last
)
?
TSDB_READ_FILE
(
pReadH
,
TSDB_FILE_TYPE_LAST
)
:
TSDB_READ_FILE
(
pReadH
,
TSDB_FILE_TYPE_DATA
);
SFile
*
pFile
=
NULL
;
if
(
pBlock
->
last
)
{
pFile
=
TSDB_FILE_IN_FGROUP
(
&
(
pReadH
->
fGroup
),
TSDB_FILE_TYPE_LAST
);
}
else
{
pFile
=
TSDB_FILE_IN_FGROUP
(
&
(
pReadH
->
fGroup
),
TSDB_FILE_TYPE_DATA
);
}
if
(
lseek
(
pFile
->
fd
,
pBlock
->
offset
,
SEEK_SET
)
<
0
)
{
tsdbError
(
"vgId:%d failed to lseek file %s to offset %"
PRId64
" since %s"
,
REPO_ID
(
pRepo
),
pFile
->
fname
,
...
...
@@ -316,6 +340,9 @@ int tsdbLoadBlockDataInfo(SReadHandle *pReadH, SBlock *pBlock) {
}
ASSERT
(
pReadH
->
pBlockData
->
numOfCols
==
pBlock
->
numOfCols
);
ASSERT
(
pReadH
->
pBlockData
->
delimiter
==
TSDB_FILE_DELIMITER
);
ASSERT
(
pReadH
->
pBlockData
->
numOfCols
==
pBlock
->
numOfCols
);
return
0
;
}
...
...
@@ -323,8 +350,12 @@ static int tsdbLoadBlockDataImpl(SReadHandle *pReadH, SBlock *pBlock, SDataCols
ASSERT
(
pBlock
->
numOfSubBlocks
<=
1
);
STsdbRepo
*
pRepo
=
pReadH
->
pRepo
;
SFile
*
pFile
=
(
pBlock
->
last
)
?
TSDB_READ_FILE
(
pReadH
,
TSDB_FILE_TYPE_LAST
)
:
TSDB_READ_FILE
(
pReadH
,
TSDB_FILE_TYPE_DATA
);
SFile
*
pFile
=
NULL
;
if
(
pBlock
->
last
)
{
pFile
=
TSDB_FILE_IN_FGROUP
(
&
(
pReadH
->
fGroup
),
TSDB_FILE_TYPE_LAST
);
}
else
{
pFile
=
TSDB_FILE_IN_FGROUP
(
&
(
pReadH
->
fGroup
),
TSDB_FILE_TYPE_DATA
);
}
if
(
tsdbAllocBuf
(
&
(
pReadH
->
pBuf
),
pBlock
->
len
)
<
0
)
{
terrno
=
TSDB_CODE_TDB_OUT_OF_MEMORY
;
...
...
@@ -347,8 +378,9 @@ static int tsdbLoadBlockDataImpl(SReadHandle *pReadH, SBlock *pBlock, SDataCols
}
int
tsize
=
TSDB_BLOCK_DATA_LEN
(
pBlock
->
numOfCols
);
if
(
ret
<
pBlock
->
len
||
!
taosCheckChecksumWhole
((
uint8_t
*
)
pReadH
->
pBuf
,
tsize
))
{
tsdbError
(
"vgId:%d block data part from file %s is corrupted"
,
REPO_ID
(
pRepo
),
pFile
->
fname
);
if
(
ret
<
pBlock
->
len
||
!
taosCheckChecksumWhole
((
uint8_t
*
)(
pReadH
->
pBuf
),
tsize
))
{
tsdbError
(
"vgId:%d block data part from file %s at offset %"
PRId64
" len %d is corrupted"
,
REPO_ID
(
pRepo
),
pFile
->
fname
,
pBlock
->
offset
,
pBlock
->
len
);
terrno
=
TSDB_CODE_TDB_FILE_CORRUPTED
;
return
-
1
;
}
...
...
@@ -362,8 +394,8 @@ static int tsdbLoadBlockDataImpl(SReadHandle *pReadH, SBlock *pBlock, SDataCols
ASSERT
(
pBlock
->
numOfRows
<=
pDataCols
->
maxPoints
);
pDataCols
->
numOfRows
=
pBlock
->
numOfRows
;
int
ccol
=
0
;
int
dcol
=
0
;
int
ccol
=
0
;
// loop iter over SBlockCols
int
dcol
=
0
;
// loop iter over pDataCols
while
(
dcol
<
pDataCols
->
numOfCols
)
{
SDataCol
*
pDataCol
=
&
(
pDataCols
->
cols
[
dcol
]);
if
(
dcol
!=
0
&&
ccol
>=
pBlockData
->
numOfCols
)
{
...
...
@@ -422,24 +454,32 @@ static int tsdbLoadBlockDataColsImpl(SReadHandle *pReadH, SBlock *pBlock, SDataC
int
numOfColIds
)
{
ASSERT
(
pBlock
->
numOfSubBlocks
<=
1
);
ASSERT
(
colIds
[
0
]
==
0
);
ASSERT
(
pBlock
->
numOfRows
<=
pDataCols
->
maxPoints
);
SFile
*
pFile
=
pBlock
->
last
?
TSDB_READ_FILE
(
pReadH
,
TSDB_FILE_TYPE_LAST
)
:
TSDB_READ_FILE
(
pReadH
,
TSDB_FILE_TYPE_DATA
);
SFile
*
pFile
=
NULL
;
if
(
pBlock
->
last
)
{
pFile
=
TSDB_FILE_IN_FGROUP
(
&
(
pReadH
->
fGroup
),
TSDB_FILE_TYPE_LAST
);
}
else
{
pFile
=
TSDB_FILE_IN_FGROUP
(
&
(
pReadH
->
fGroup
),
TSDB_FILE_TYPE_DATA
);
}
SBlockCol
blockCol
=
{
0
};
// If only load timestamp column, no need to load SBlockData part
if
(
numOfColIds
>
1
&&
tsdbLoadBlockDataInfo
(
pReadH
,
pBlock
)
<
0
)
return
-
1
;
// if only load the key timestamp column, no need to load SBlockData part
if
(
numOfColIds
>
1
)
{
if
(
tsdbLoadBlockDataInfo
(
pReadH
,
pBlock
)
<
0
)
return
-
1
;
}
tdResetDataCols
(
pDataCols
);
pDataCols
->
numOfRows
=
pBlock
->
numOfRows
;
int
dcol
=
0
;
int
ccol
=
0
;
int
dcol
=
0
;
// loop iter over pDataCols
int
ccol
=
0
;
// loop iter over SBlockCol
for
(
int
i
=
0
;
i
<
numOfColIds
;
i
++
)
{
int16_t
colId
=
colIds
[
i
];
SDataCol
*
pDataCol
=
NULL
;
SBlockCol
*
pBlockCol
=
NULL
;
// linear search over pDataCols of colId
while
(
true
)
{
if
(
dcol
>=
pDataCols
->
numOfCols
)
{
pDataCol
=
NULL
;
...
...
@@ -458,6 +498,7 @@ static int tsdbLoadBlockDataColsImpl(SReadHandle *pReadH, SBlock *pBlock, SDataC
if
(
pDataCol
==
NULL
)
continue
;
ASSERT
(
pDataCol
->
colId
==
colId
);
// linear search over SBlockCols
if
(
colId
==
0
)
{
// load the key row
blockCol
.
colId
=
colId
;
blockCol
.
len
=
pBlock
->
keyLen
;
...
...
@@ -497,7 +538,7 @@ static int tsdbLoadBlockDataColsImpl(SReadHandle *pReadH, SBlock *pBlock, SDataC
static
int
tsdbDecodeBlockIdxArray
(
SReadHandle
*
pReadH
)
{
void
*
pBuf
=
pReadH
->
pBuf
;
SFile
*
pFile
=
TSDB_
READ_FILE
(
pReadH
,
TSDB_FILE_TYPE_HEAD
);
SFile
*
pFile
=
TSDB_
FILE_IN_FGROUP
(
&
(
pReadH
->
fGroup
)
,
TSDB_FILE_TYPE_HEAD
);
pReadH
->
nBlockIdx
=
0
;
while
(
POINTER_DISTANCE
(
pBuf
,
pReadH
->
pBuf
)
<
(
int
)(
pFile
->
info
.
len
-
sizeof
(
TSCKSUM
)))
{
...
...
@@ -508,7 +549,8 @@ static int tsdbDecodeBlockIdxArray(SReadHandle *pReadH) {
pBuf
=
tsdbDecodeBlockIdx
(
pBuf
,
&
(
pReadH
->
pBlockIdx
[
pReadH
->
nBlockIdx
]));
if
(
pBuf
==
NULL
)
{
tsdbError
(
"vgId:%d failed to decode block idx part from file %s"
,
REPO_ID
(
pRepo
),
pFile
->
fname
);
tsdbError
(
"vgId:%d failed to decode block idx part from file %s at idx %d"
,
REPO_ID
(
pRepo
),
pFile
->
fname
,
pReadH
->
nBlockIdx
);
terrno
=
TSDB_CODE_TDB_FILE_CORRUPTED
;
return
-
1
;
}
...
...
@@ -516,21 +558,9 @@ static int tsdbDecodeBlockIdxArray(SReadHandle *pReadH) {
pReadH
->
nBlockIdx
++
;
ASSERT
(
pReadH
->
nBlockIdx
==
1
||
(
pReadH
->
pBlockIdx
[
pReadH
->
nBlockIdx
-
1
].
tid
<
(
pReadH
->
pBlockIdx
[
pReadH
->
nBlockIdx
-
2
].
tid
));
}
return
0
;
}
int
tsdbAllocBuf
(
void
**
ppBuf
,
int
size
)
{
void
*
pBuf
=
*
pBuf
;
int
tsize
=
taosTSizeof
(
pBuf
);
if
(
tsize
==
0
)
tsize
=
1024
;
while
(
tsize
<
size
)
{
tsize
*=
2
;
}
*
ppBuf
=
taosTRealloc
(
pBuf
,
tsize
);
if
(
*
ppBuf
==
NULL
)
return
-
1
;
ASSERT
(
pReadH
->
nBlockIdx
>
0
);
return
0
;
}
static
int
tsdbVerifyBlockInfo
(
SBlockInfo
*
pBlockInfo
,
SBlockIdx
*
pBlockIdx
)
{
...
...
@@ -561,21 +591,18 @@ static int tsdbCheckAndDecodeColumnData(SDataCol *pDataCol, void *content, int32
return
-
1
;
}
pDataCol
->
len
=
tlen
;
if
(
pDataCol
->
type
==
TSDB_DATA_TYPE_BINARY
||
pDataCol
->
type
==
TSDB_DATA_TYPE_NCHAR
)
{
dataColSetOffset
(
pDataCol
,
numOfRows
);
}
else
{
ASSERT
(
pDataCol
->
len
==
pDataCol
->
bytes
*
numOfRows
);
}
}
else
{
// No need to decompress, just memcpy it
pDataCol
->
len
=
len
-
sizeof
(
TSCKSUM
);
memcpy
(
pDataCol
->
pData
,
content
,
pDataCol
->
len
);
if
(
pDataCol
->
type
==
TSDB_DATA_TYPE_BINARY
||
pDataCol
->
type
==
TSDB_DATA_TYPE_NCHAR
)
{
dataColSetOffset
(
pDataCol
,
numOfRows
);
}
else
{
ASSERT
(
pDataCol
->
len
==
pDataCol
->
bytes
*
numOfRows
);
}
}
if
(
pDataCol
->
type
==
TSDB_DATA_TYPE_BINARY
||
pDataCol
->
type
==
TSDB_DATA_TYPE_NCHAR
)
{
dataColSetOffset
(
pDataCol
,
numOfRows
);
}
else
{
ASSERT
(
pDataCol
->
len
==
pDataCol
->
bytes
*
numOfRows
);
}
return
0
;
}
...
...
@@ -591,9 +618,10 @@ static int tsdbLoadColData(SReadHandle *pReadH, SFile *pFile, SBlock *pBlock, SB
return
-
1
;
}
int64_t
offset
=
pBlock
->
offset
+
TSDB_
GET_COMPCOL
_LEN
(
pBlock
->
numOfCols
)
+
pBlockCol
->
offset
;
int64_t
offset
=
pBlock
->
offset
+
TSDB_
BLOCK_DATA
_LEN
(
pBlock
->
numOfCols
)
+
pBlockCol
->
offset
;
if
(
lseek
(
pFile
->
fd
,
(
off_t
)
offset
,
SEEK_SET
)
<
0
)
{
tsdbError
(
"vgId:%d failed to lseek file %s since %s"
,
REPO_ID
(
pRepo
),
pFile
->
fname
,
strerror
(
errno
));
tsdbError
(
"vgId:%d failed to lseek file %s to offset %"
PRId64
" since %s"
,
REPO_ID
(
pRepo
),
pFile
->
fname
,
offset
,
strerror
(
errno
));
terrno
=
TAOS_SYSTEM_ERROR
(
errno
);
return
-
1
;
}
...
...
src/tsdb/src/tsdbUtil.c
浏览文件 @
1adfaef8
...
...
@@ -100,14 +100,32 @@ void *tsdbDecodeBlockIdx(void *buf, SBlockIdx *pBlockIdx) {
pBlockIdx
->
hasLast
=
hasLast
;
pBlockIdx
->
numOfBlocks
=
numOfBlocks
;
pBlockIdx
->
uid
=
value
;
pBlockIdx
->
uid
=
uid
;
pBlockIdx
->
maxKey
=
(
TSKEY
)
maxKey
;
return
buf
;
}
// TODO: make it static FORCE_INLINE
void
tsdbResetFGroupFd
(
SFileGroup
*
pFGroup
)
{
for
(
int
type
=
0
;
type
<
TSDB_FILE_TYPE_MAX
;
type
++
)
{
pFGroup
->
files
[
type
].
fd
=
-
1
;
TSDB_FILE_IN_FGROUP
(
pFGroup
,
type
)
->
fd
=
-
1
;
}
}
\ No newline at end of file
}
int
tsdbAllocBuf
(
void
**
ppBuf
,
uint32_t
size
)
{
ASSERT
(
size
>
0
);
void
*
pBuf
=
*
pBuf
;
uint32_t
tsize
=
taosTSizeof
(
pBuf
);
if
(
tsize
>=
size
)
return
0
;
if
(
tsize
==
0
)
tsize
=
1024
;
while
(
tsize
<
size
)
{
tsize
*=
2
;
}
*
ppBuf
=
taosTRealloc
(
pBuf
,
tsize
);
if
(
*
ppBuf
==
NULL
)
return
-
1
;
}
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录