Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
taosdata
TDengine
提交
684dd823
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看板
提交
684dd823
编写于
7月 21, 2022
作者:
H
Hongze Cheng
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
fix read concurrency
上级
bb2e923f
变更
10
显示空白变更内容
内联
并排
Showing
10 changed file
with
1429 addition
and
1059 deletion
+1429
-1059
source/dnode/vnode/src/inc/tsdb.h
source/dnode/vnode/src/inc/tsdb.h
+18
-29
source/dnode/vnode/src/tsdb/tsdbCache.c
source/dnode/vnode/src/tsdb/tsdbCache.c
+485
-483
source/dnode/vnode/src/tsdb/tsdbCommit.c
source/dnode/vnode/src/tsdb/tsdbCommit.c
+23
-19
source/dnode/vnode/src/tsdb/tsdbFS.c
source/dnode/vnode/src/tsdb/tsdbFS.c
+833
-436
source/dnode/vnode/src/tsdb/tsdbFile.c
source/dnode/vnode/src/tsdb/tsdbFile.c
+3
-14
source/dnode/vnode/src/tsdb/tsdbMemTable.c
source/dnode/vnode/src/tsdb/tsdbMemTable.c
+0
-45
source/dnode/vnode/src/tsdb/tsdbOpen.c
source/dnode/vnode/src/tsdb/tsdbOpen.c
+2
-2
source/dnode/vnode/src/tsdb/tsdbRead.c
source/dnode/vnode/src/tsdb/tsdbRead.c
+20
-17
source/dnode/vnode/src/tsdb/tsdbRetention.c
source/dnode/vnode/src/tsdb/tsdbRetention.c
+6
-2
source/dnode/vnode/src/tsdb/tsdbSnapshot.c
source/dnode/vnode/src/tsdb/tsdbSnapshot.c
+39
-12
未找到文件。
source/dnode/vnode/src/inc/tsdb.h
浏览文件 @
684dd823
...
@@ -62,7 +62,6 @@ typedef struct SDelFReader SDelFReader;
...
@@ -62,7 +62,6 @@ typedef struct SDelFReader SDelFReader;
typedef
struct
SRowIter
SRowIter
;
typedef
struct
SRowIter
SRowIter
;
typedef
struct
STsdbFS
STsdbFS
;
typedef
struct
STsdbFS
STsdbFS
;
typedef
struct
SRowMerger
SRowMerger
;
typedef
struct
SRowMerger
SRowMerger
;
typedef
struct
STsdbFSState
STsdbFSState
;
typedef
struct
STsdbSnapHdr
STsdbSnapHdr
;
typedef
struct
STsdbSnapHdr
STsdbSnapHdr
;
typedef
struct
STsdbReadSnap
STsdbReadSnap
;
typedef
struct
STsdbReadSnap
STsdbReadSnap
;
...
@@ -177,8 +176,6 @@ void tsdbMemTableDestroy(SMemTable *pMemTable);
...
@@ -177,8 +176,6 @@ void tsdbMemTableDestroy(SMemTable *pMemTable);
void
tsdbGetTbDataFromMemTable
(
SMemTable
*
pMemTable
,
tb_uid_t
suid
,
tb_uid_t
uid
,
STbData
**
ppTbData
);
void
tsdbGetTbDataFromMemTable
(
SMemTable
*
pMemTable
,
tb_uid_t
suid
,
tb_uid_t
uid
,
STbData
**
ppTbData
);
void
tsdbRefMemTable
(
SMemTable
*
pMemTable
);
void
tsdbRefMemTable
(
SMemTable
*
pMemTable
);
void
tsdbUnrefMemTable
(
SMemTable
*
pMemTable
);
void
tsdbUnrefMemTable
(
SMemTable
*
pMemTable
);
int32_t
tsdbTakeMemSnapshot
(
STsdb
*
pTsdb
,
SMemTable
**
ppMem
,
SMemTable
**
ppIMem
);
void
tsdbUntakeMemSnapshot
(
STsdb
*
pTsdb
,
SMemTable
*
pMem
,
SMemTable
*
pIMem
);
// STbDataIter
// STbDataIter
int32_t
tsdbTbDataIterCreate
(
STbData
*
pTbData
,
TSDBKEY
*
pFrom
,
int8_t
backward
,
STbDataIter
**
ppIter
);
int32_t
tsdbTbDataIterCreate
(
STbData
*
pTbData
,
TSDBKEY
*
pFrom
,
int8_t
backward
,
STbDataIter
**
ppIter
);
void
*
tsdbTbDataIterDestroy
(
STbDataIter
*
pIter
);
void
*
tsdbTbDataIterDestroy
(
STbDataIter
*
pIter
);
...
@@ -208,17 +205,20 @@ void tsdbSmaFileName(STsdb *pTsdb, SDiskID did, int32_t fid, SSmaFile *pSmaF, ch
...
@@ -208,17 +205,20 @@ void tsdbSmaFileName(STsdb *pTsdb, SDiskID did, int32_t fid, SSmaFile *pSmaF, ch
// SDelFile
// SDelFile
void
tsdbDelFileName
(
STsdb
*
pTsdb
,
SDelFile
*
pFile
,
char
fname
[]);
void
tsdbDelFileName
(
STsdb
*
pTsdb
,
SDelFile
*
pFile
,
char
fname
[]);
// tsdbFS.c ==============================================================================================
// tsdbFS.c ==============================================================================================
int32_t
tsdbFSOpen
(
STsdb
*
pTsdb
,
STsdbFS
**
ppFS
);
int32_t
tsdbFSOpen
(
STsdb
*
pTsdb
);
int32_t
tsdbFSClose
(
STsdbFS
*
pFS
);
int32_t
tsdbFSClose
(
STsdb
*
pTsdb
);
int32_t
tsdbFSBegin
(
STsdbFS
*
pFS
);
int32_t
tsdbFSCopy
(
STsdb
*
pTsdb
,
STsdbFS
*
pFS
);
int32_t
tsdbFSCommit
(
STsdbFS
*
pFS
);
void
tsdbFSDestroy
(
STsdbFS
*
pFS
);
int32_t
tDFileSetCmprFn
(
const
void
*
p1
,
const
void
*
p2
);
int32_t
tsdbFSCommit1
(
STsdb
*
pTsdb
,
STsdbFS
*
pFS
);
int32_t
tsdbFSCommit2
(
STsdb
*
pTsdb
,
STsdbFS
*
pFS
);
int32_t
tsdbFSRef
(
STsdb
*
pTsdb
,
STsdbFS
*
pFS
);
void
tsdbFSUnref
(
STsdb
*
pTsdb
,
STsdbFS
*
pFS
);
int32_t
tsdbFSRollback
(
STsdbFS
*
pFS
);
int32_t
tsdbFSRollback
(
STsdbFS
*
pFS
);
int32_t
tsdbFSStateUpsertDelFile
(
STsdbFSState
*
pState
,
SDelFile
*
pDelFile
);
int32_t
tsdbFSUpsertFSet
(
STsdbFS
*
pFS
,
SDFileSet
*
pSet
);
int32_t
tsdbFSStateUpsertDFileSet
(
STsdbFSState
*
pState
,
SDFileSet
*
pSet
);
int32_t
tsdbFSUpsertDelFile
(
STsdbFS
*
pFS
,
SDelFile
*
pDelFile
);
void
tsdbFSStateDeleteDFileSet
(
STsdbFSState
*
pState
,
int32_t
fid
);
SDelFile
*
tsdbFSStateGetDelFile
(
STsdbFSState
*
pState
);
SDFileSet
*
tsdbFSStateGetDFileSet
(
STsdbFSState
*
pState
,
int32_t
fid
,
int32_t
flag
);
// tsdbReaderWriter.c ==============================================================================================
// tsdbReaderWriter.c ==============================================================================================
// SDataFWriter
// SDataFWriter
int32_t
tsdbDataFWriterOpen
(
SDataFWriter
**
ppWriter
,
STsdb
*
pTsdb
,
SDFileSet
*
pSet
);
int32_t
tsdbDataFWriterOpen
(
SDataFWriter
**
ppWriter
,
STsdb
*
pTsdb
,
SDFileSet
*
pSet
);
...
@@ -285,6 +285,11 @@ typedef struct {
...
@@ -285,6 +285,11 @@ typedef struct {
TSKEY
minKey
;
TSKEY
minKey
;
}
SRtn
;
}
SRtn
;
struct
STsdbFS
{
SDelFile
*
pDelFile
;
SArray
*
aDFileSet
;
// SArray<SDFileSet>
};
struct
STsdb
{
struct
STsdb
{
char
*
path
;
char
*
path
;
SVnode
*
pVnode
;
SVnode
*
pVnode
;
...
@@ -292,7 +297,7 @@ struct STsdb {
...
@@ -292,7 +297,7 @@ struct STsdb {
TdThreadRwlock
rwLock
;
TdThreadRwlock
rwLock
;
SMemTable
*
mem
;
SMemTable
*
mem
;
SMemTable
*
imem
;
SMemTable
*
imem
;
STsdbFS
*
pFS
;
STsdbFS
fs
;
SLRUCache
*
lruCache
;
SLRUCache
*
lruCache
;
};
};
...
@@ -540,22 +545,6 @@ struct SRowMerger {
...
@@ -540,22 +545,6 @@ struct SRowMerger {
SArray
*
pArray
;
// SArray<SColVal>
SArray
*
pArray
;
// SArray<SColVal>
};
};
struct
STsdbFSState
{
SDelFile
*
pDelFile
;
SArray
*
aDFileSet
;
// SArray<aDFileSet>
SDelFile
delFile
;
};
struct
STsdbFS
{
STsdb
*
pTsdb
;
STsdbFSState
*
cState
;
STsdbFSState
*
nState
;
// new
SDelFile
*
pDelFile
;
SArray
aDFileSetP
;
// SArray<SDFileSet *>
};
struct
SDelFWriter
{
struct
SDelFWriter
{
STsdb
*
pTsdb
;
STsdb
*
pTsdb
;
SDelFile
fDel
;
SDelFile
fDel
;
...
...
source/dnode/vnode/src/tsdb/tsdbCache.c
浏览文件 @
684dd823
...
@@ -464,7 +464,7 @@ static int32_t getNextRowFromFS(void *iter, TSDBROW **ppRow) {
...
@@ -464,7 +464,7 @@ static int32_t getNextRowFromFS(void *iter, TSDBROW **ppRow) {
switch
(
state
->
state
)
{
switch
(
state
->
state
)
{
case
SFSNEXTROW_FS
:
case
SFSNEXTROW_FS
:
state
->
aDFileSet
=
state
->
pTsdb
->
pFS
->
cState
->
aDFileSet
;
//
state->aDFileSet = state->pTsdb->pFS->cState->aDFileSet;
state
->
nFileSet
=
taosArrayGetSize
(
state
->
aDFileSet
);
state
->
nFileSet
=
taosArrayGetSize
(
state
->
aDFileSet
);
state
->
iFileSet
=
state
->
nFileSet
;
state
->
iFileSet
=
state
->
nFileSet
;
...
@@ -793,8 +793,9 @@ typedef struct {
...
@@ -793,8 +793,9 @@ typedef struct {
TSDBROW
memRow
,
imemRow
,
fsRow
;
TSDBROW
memRow
,
imemRow
,
fsRow
;
TsdbNextRowState
input
[
3
];
TsdbNextRowState
input
[
3
];
SMemTable
*
pMemTable
;
// SMemTable *pMemTable;
SMemTable
*
pIMemTable
;
// SMemTable *pIMemTable;
STsdbReadSnap
*
pReadSnap
;
STsdb
*
pTsdb
;
STsdb
*
pTsdb
;
}
CacheNextRowIter
;
}
CacheNextRowIter
;
...
@@ -803,16 +804,16 @@ static int32_t nextRowIterOpen(CacheNextRowIter *pIter, tb_uid_t uid, STsdb *pTs
...
@@ -803,16 +804,16 @@ static int32_t nextRowIterOpen(CacheNextRowIter *pIter, tb_uid_t uid, STsdb *pTs
tb_uid_t
suid
=
getTableSuidByUid
(
uid
,
pTsdb
);
tb_uid_t
suid
=
getTableSuidByUid
(
uid
,
pTsdb
);
tsdbTake
MemSnapshot
(
pTsdb
,
&
pIter
->
pMemTable
,
&
pIter
->
pIMemTable
);
tsdbTake
ReadSnap
(
pTsdb
,
&
pIter
->
pReadSnap
);
STbData
*
pMem
=
NULL
;
STbData
*
pMem
=
NULL
;
if
(
pIter
->
p
MemTable
)
{
if
(
pIter
->
p
ReadSnap
->
pMem
)
{
tsdbGetTbDataFromMemTable
(
pIter
->
p
MemTable
,
suid
,
uid
,
&
pMem
);
tsdbGetTbDataFromMemTable
(
pIter
->
p
ReadSnap
->
pMem
,
suid
,
uid
,
&
pMem
);
}
}
STbData
*
pIMem
=
NULL
;
STbData
*
pIMem
=
NULL
;
if
(
pIter
->
p
IMemTable
)
{
if
(
pIter
->
p
ReadSnap
->
pIMem
)
{
tsdbGetTbDataFromMemTable
(
pIter
->
p
IMemTable
,
suid
,
uid
,
&
pIMem
);
tsdbGetTbDataFromMemTable
(
pIter
->
p
ReadSnap
->
pIMem
,
suid
,
uid
,
&
pIMem
);
}
}
pIter
->
pTsdb
=
pTsdb
;
pIter
->
pTsdb
=
pTsdb
;
...
@@ -821,7 +822,7 @@ static int32_t nextRowIterOpen(CacheNextRowIter *pIter, tb_uid_t uid, STsdb *pTs
...
@@ -821,7 +822,7 @@ static int32_t nextRowIterOpen(CacheNextRowIter *pIter, tb_uid_t uid, STsdb *pTs
SDelIdx
delIdx
;
SDelIdx
delIdx
;
SDelFile
*
pDelFile
=
tsdbFSStateGetDelFile
(
pTsdb
->
pFS
->
cState
)
;
SDelFile
*
pDelFile
=
pIter
->
pReadSnap
->
fs
.
pDelFile
;
if
(
pDelFile
)
{
if
(
pDelFile
)
{
SDelFReader
*
pDelFReader
;
SDelFReader
*
pDelFReader
;
...
@@ -846,6 +847,7 @@ static int32_t nextRowIterOpen(CacheNextRowIter *pIter, tb_uid_t uid, STsdb *pTs
...
@@ -846,6 +847,7 @@ static int32_t nextRowIterOpen(CacheNextRowIter *pIter, tb_uid_t uid, STsdb *pTs
pIter
->
fsState
.
state
=
SFSNEXTROW_FS
;
pIter
->
fsState
.
state
=
SFSNEXTROW_FS
;
pIter
->
fsState
.
pTsdb
=
pTsdb
;
pIter
->
fsState
.
pTsdb
=
pTsdb
;
pIter
->
fsState
.
aDFileSet
=
pIter
->
pReadSnap
->
fs
.
aDFileSet
;
pIter
->
fsState
.
pBlockIdxExp
=
&
pIter
->
idx
;
pIter
->
fsState
.
pBlockIdxExp
=
&
pIter
->
idx
;
pIter
->
input
[
0
]
=
(
TsdbNextRowState
){
&
pIter
->
memRow
,
true
,
false
,
&
pIter
->
memState
,
getNextRowFromMem
,
NULL
};
pIter
->
input
[
0
]
=
(
TsdbNextRowState
){
&
pIter
->
memRow
,
true
,
false
,
&
pIter
->
memState
,
getNextRowFromMem
,
NULL
};
...
@@ -885,7 +887,7 @@ static int32_t nextRowIterClose(CacheNextRowIter *pIter) {
...
@@ -885,7 +887,7 @@ static int32_t nextRowIterClose(CacheNextRowIter *pIter) {
taosArrayDestroy
(
pIter
->
pSkyline
);
taosArrayDestroy
(
pIter
->
pSkyline
);
}
}
tsdbUntake
MemSnapshot
(
pIter
->
pTsdb
,
pIter
->
pMemTable
,
pIter
->
pIMemTable
);
tsdbUntake
ReadSnap
(
pIter
->
pTsdb
,
pIter
->
pReadSnap
);
return
code
;
return
code
;
_err:
_err:
...
@@ -1172,480 +1174,480 @@ _err:
...
@@ -1172,480 +1174,480 @@ _err:
return
code
;
return
code
;
}
}
static
int32_t
mergeLastRow
(
tb_uid_t
uid
,
STsdb
*
pTsdb
,
bool
*
dup
,
STSRow
**
ppRow
)
{
//
static int32_t mergeLastRow(tb_uid_t uid, STsdb *pTsdb, bool *dup, STSRow **ppRow) {
int32_t
code
=
0
;
//
int32_t code = 0;
SArray
*
pSkyline
=
NULL
;
//
SArray *pSkyline = NULL;
STSchema
*
pTSchema
=
metaGetTbTSchema
(
pTsdb
->
pVnode
->
pMeta
,
uid
,
-
1
);
//
STSchema *pTSchema = metaGetTbTSchema(pTsdb->pVnode->pMeta, uid, -1);
int16_t
nCol
=
pTSchema
->
numOfCols
;
//
int16_t nCol = pTSchema->numOfCols;
SArray
*
pColArray
=
taosArrayInit
(
nCol
,
sizeof
(
SColVal
));
//
SArray *pColArray = taosArrayInit(nCol, sizeof(SColVal));
tb_uid_t
suid
=
getTableSuidByUid
(
uid
,
pTsdb
);
//
tb_uid_t suid = getTableSuidByUid(uid, pTsdb);
STbData
*
pMem
=
NULL
;
//
STbData *pMem = NULL;
if
(
pTsdb
->
mem
)
{
//
if (pTsdb->mem) {
tsdbGetTbDataFromMemTable
(
pTsdb
->
mem
,
suid
,
uid
,
&
pMem
);
//
tsdbGetTbDataFromMemTable(pTsdb->mem, suid, uid, &pMem);
}
//
}
STbData
*
pIMem
=
NULL
;
//
STbData *pIMem = NULL;
if
(
pTsdb
->
imem
)
{
//
if (pTsdb->imem) {
tsdbGetTbDataFromMemTable
(
pTsdb
->
imem
,
suid
,
uid
,
&
pIMem
);
//
tsdbGetTbDataFromMemTable(pTsdb->imem, suid, uid, &pIMem);
}
//
}
*
ppRow
=
NULL
;
//
*ppRow = NULL;
pSkyline
=
taosArrayInit
(
32
,
sizeof
(
TSDBKEY
));
//
pSkyline = taosArrayInit(32, sizeof(TSDBKEY));
SDelIdx
delIdx
;
//
SDelIdx delIdx;
SDelFile
*
pDelFile
=
tsdbFSStateGetDelFile
(
pTsdb
->
pFS
->
cState
);
//
SDelFile *pDelFile = tsdbFSStateGetDelFile(pTsdb->pFS->cState);
if
(
pDelFile
)
{
//
if (pDelFile) {
SDelFReader
*
pDelFReader
;
//
SDelFReader *pDelFReader;
code
=
tsdbDelFReaderOpen
(
&
pDelFReader
,
pDelFile
,
pTsdb
,
NULL
);
//
code = tsdbDelFReaderOpen(&pDelFReader, pDelFile, pTsdb, NULL);
if
(
code
)
goto
_err
;
//
if (code) goto _err;
code
=
getTableDelIdx
(
pDelFReader
,
suid
,
uid
,
&
delIdx
);
//
code = getTableDelIdx(pDelFReader, suid, uid, &delIdx);
if
(
code
)
goto
_err
;
//
if (code) goto _err;
code
=
getTableDelSkyline
(
pMem
,
pIMem
,
pDelFReader
,
&
delIdx
,
pSkyline
);
//
code = getTableDelSkyline(pMem, pIMem, pDelFReader, &delIdx, pSkyline);
if
(
code
)
goto
_err
;
//
if (code) goto _err;
tsdbDelFReaderClose
(
&
pDelFReader
);
//
tsdbDelFReaderClose(&pDelFReader);
}
else
{
//
} else {
code
=
getTableDelSkyline
(
pMem
,
pIMem
,
NULL
,
NULL
,
pSkyline
);
//
code = getTableDelSkyline(pMem, pIMem, NULL, NULL, pSkyline);
if
(
code
)
goto
_err
;
//
if (code) goto _err;
}
//
}
int64_t
iSkyline
=
taosArrayGetSize
(
pSkyline
)
-
1
;
//
int64_t iSkyline = taosArrayGetSize(pSkyline) - 1;
SBlockIdx
idx
=
{.
suid
=
suid
,
.
uid
=
uid
};
//
SBlockIdx idx = {.suid = suid, .uid = uid};
SFSNextRowIter
fsState
=
{
0
};
//
SFSNextRowIter fsState = {0};
fsState
.
state
=
SFSNEXTROW_FS
;
//
fsState.state = SFSNEXTROW_FS;
fsState
.
pTsdb
=
pTsdb
;
//
fsState.pTsdb = pTsdb;
fsState
.
pBlockIdxExp
=
&
idx
;
//
fsState.pBlockIdxExp = &idx;
SMemNextRowIter
memState
=
{
0
};
//
SMemNextRowIter memState = {0};
SMemNextRowIter
imemState
=
{
0
};
//
SMemNextRowIter imemState = {0};
TSDBROW
memRow
,
imemRow
,
fsRow
;
//
TSDBROW memRow, imemRow, fsRow;
TsdbNextRowState
input
[
3
]
=
{{
&
memRow
,
true
,
false
,
&
memState
,
getNextRowFromMem
,
NULL
},
//
TsdbNextRowState input[3] = {{&memRow, true, false, &memState, getNextRowFromMem, NULL},
{
&
imemRow
,
true
,
false
,
&
imemState
,
getNextRowFromMem
,
NULL
},
//
{&imemRow, true, false, &imemState, getNextRowFromMem, NULL},
{
&
fsRow
,
false
,
true
,
&
fsState
,
getNextRowFromFS
,
clearNextRowFromFS
}};
//
{&fsRow, false, true, &fsState, getNextRowFromFS, clearNextRowFromFS}};
if
(
pMem
)
{
//
if (pMem) {
memState
.
pMem
=
pMem
;
//
memState.pMem = pMem;
memState
.
state
=
SMEMNEXTROW_ENTER
;
//
memState.state = SMEMNEXTROW_ENTER;
input
[
0
].
stop
=
false
;
//
input[0].stop = false;
input
[
0
].
next
=
true
;
//
input[0].next = true;
}
//
}
if
(
pIMem
)
{
//
if (pIMem) {
imemState
.
pMem
=
pIMem
;
//
imemState.pMem = pIMem;
imemState
.
state
=
SMEMNEXTROW_ENTER
;
//
imemState.state = SMEMNEXTROW_ENTER;
input
[
1
].
stop
=
false
;
//
input[1].stop = false;
input
[
1
].
next
=
true
;
//
input[1].next = true;
}
//
}
int16_t
nilColCount
=
nCol
-
1
;
// count of null & none cols
//
int16_t nilColCount = nCol - 1; // count of null & none cols
int
iCol
=
0
;
// index of first nil col index from left to right
//
int iCol = 0; // index of first nil col index from left to right
bool
setICol
=
false
;
//
bool setICol = false;
do
{
//
do {
for
(
int
i
=
0
;
i
<
3
;
++
i
)
{
//
for (int i = 0; i < 3; ++i) {
if
(
input
[
i
].
next
&&
!
input
[
i
].
stop
)
{
//
if (input[i].next && !input[i].stop) {
if
(
input
[
i
].
pRow
==
NULL
)
{
//
if (input[i].pRow == NULL) {
code
=
input
[
i
].
nextRowFn
(
input
[
i
].
iter
,
&
input
[
i
].
pRow
);
//
code = input[i].nextRowFn(input[i].iter, &input[i].pRow);
if
(
code
)
goto
_err
;
//
if (code) goto _err;
if
(
input
[
i
].
pRow
==
NULL
)
{
//
if (input[i].pRow == NULL) {
input
[
i
].
stop
=
true
;
//
input[i].stop = true;
input
[
i
].
next
=
false
;
//
input[i].next = false;
}
//
}
}
//
}
}
//
}
}
//
}
if
(
input
[
0
].
stop
&&
input
[
1
].
stop
&&
input
[
2
].
stop
)
{
//
if (input[0].stop && input[1].stop && input[2].stop) {
break
;
//
break;
}
//
}
// select maxpoint(s) from mem, imem, fs
//
// select maxpoint(s) from mem, imem, fs
TSDBROW
*
max
[
3
]
=
{
0
};
//
TSDBROW *max[3] = {0};
int
iMax
[
3
]
=
{
-
1
,
-
1
,
-
1
};
//
int iMax[3] = {-1, -1, -1};
int
nMax
=
0
;
//
int nMax = 0;
TSKEY
maxKey
=
TSKEY_MIN
;
//
TSKEY maxKey = TSKEY_MIN;
for
(
int
i
=
0
;
i
<
3
;
++
i
)
{
//
for (int i = 0; i < 3; ++i) {
if
(
!
input
[
i
].
stop
&&
input
[
i
].
pRow
!=
NULL
)
{
//
if (!input[i].stop && input[i].pRow != NULL) {
TSDBKEY
key
=
TSDBROW_KEY
(
input
[
i
].
pRow
);
//
TSDBKEY key = TSDBROW_KEY(input[i].pRow);
// merging & deduplicating on client side
//
// merging & deduplicating on client side
if
(
maxKey
<=
key
.
ts
)
{
//
if (maxKey <= key.ts) {
if
(
maxKey
<
key
.
ts
)
{
//
if (maxKey < key.ts) {
nMax
=
0
;
//
nMax = 0;
maxKey
=
key
.
ts
;
//
maxKey = key.ts;
}
//
}
iMax
[
nMax
]
=
i
;
//
iMax[nMax] = i;
max
[
nMax
++
]
=
input
[
i
].
pRow
;
//
max[nMax++] = input[i].pRow;
}
//
}
}
//
}
}
//
}
// delete detection
//
// delete detection
TSDBROW
*
merge
[
3
]
=
{
0
};
//
TSDBROW *merge[3] = {0};
int
iMerge
[
3
]
=
{
-
1
,
-
1
,
-
1
};
//
int iMerge[3] = {-1, -1, -1};
int
nMerge
=
0
;
//
int nMerge = 0;
for
(
int
i
=
0
;
i
<
nMax
;
++
i
)
{
//
for (int i = 0; i < nMax; ++i) {
TSDBKEY
maxKey
=
TSDBROW_KEY
(
max
[
i
]);
//
TSDBKEY maxKey = TSDBROW_KEY(max[i]);
bool
deleted
=
tsdbKeyDeleted
(
&
maxKey
,
pSkyline
,
&
iSkyline
);
//
bool deleted = tsdbKeyDeleted(&maxKey, pSkyline, &iSkyline);
if
(
!
deleted
)
{
//
if (!deleted) {
iMerge
[
nMerge
]
=
i
;
//
iMerge[nMerge] = i;
merge
[
nMerge
++
]
=
max
[
i
];
//
merge[nMerge++] = max[i];
}
//
}
input
[
iMax
[
i
]].
next
=
deleted
;
//
input[iMax[i]].next = deleted;
}
//
}
// merge if nMerge > 1
//
// merge if nMerge > 1
if
(
nMerge
>
0
)
{
//
if (nMerge > 0) {
*
dup
=
false
;
//
*dup = false;
if
(
nMerge
==
1
)
{
//
if (nMerge == 1) {
code
=
tsRowFromTsdbRow
(
pTSchema
,
merge
[
nMerge
-
1
],
ppRow
);
//
code = tsRowFromTsdbRow(pTSchema, merge[nMerge - 1], ppRow);
if
(
code
)
goto
_err
;
//
if (code) goto _err;
}
else
{
//
} else {
// merge 2 or 3 rows
//
// merge 2 or 3 rows
SRowMerger
merger
=
{
0
};
//
SRowMerger merger = {0};
tRowMergerInit
(
&
merger
,
merge
[
0
],
pTSchema
);
//
tRowMergerInit(&merger, merge[0], pTSchema);
for
(
int
i
=
1
;
i
<
nMerge
;
++
i
)
{
//
for (int i = 1; i < nMerge; ++i) {
tRowMerge
(
&
merger
,
merge
[
i
]);
//
tRowMerge(&merger, merge[i]);
}
//
}
tRowMergerGetRow
(
&
merger
,
ppRow
);
//
tRowMergerGetRow(&merger, ppRow);
tRowMergerClear
(
&
merger
);
//
tRowMergerClear(&merger);
}
//
}
}
//
}
}
while
(
1
);
//
} while (1);
for
(
int
i
=
0
;
i
<
3
;
++
i
)
{
//
for (int i = 0; i < 3; ++i) {
if
(
input
[
i
].
nextRowClearFn
)
{
//
if (input[i].nextRowClearFn) {
input
[
i
].
nextRowClearFn
(
input
[
i
].
iter
);
//
input[i].nextRowClearFn(input[i].iter);
}
//
}
}
//
}
if
(
pSkyline
)
{
//
if (pSkyline) {
taosArrayDestroy
(
pSkyline
);
//
taosArrayDestroy(pSkyline);
}
//
}
taosMemoryFreeClear
(
pTSchema
);
//
taosMemoryFreeClear(pTSchema);
return
code
;
//
return code;
_err:
//
_err:
for
(
int
i
=
0
;
i
<
3
;
++
i
)
{
//
for (int i = 0; i < 3; ++i) {
if
(
input
[
i
].
nextRowClearFn
)
{
//
if (input[i].nextRowClearFn) {
input
[
i
].
nextRowClearFn
(
input
[
i
].
iter
);
//
input[i].nextRowClearFn(input[i].iter);
}
//
}
}
//
}
if
(
pSkyline
)
{
//
if (pSkyline) {
taosArrayDestroy
(
pSkyline
);
//
taosArrayDestroy(pSkyline);
}
//
}
taosMemoryFreeClear
(
pTSchema
);
//
taosMemoryFreeClear(pTSchema);
tsdbError
(
"vgId:%d merge last_row failed since %s"
,
TD_VID
(
pTsdb
->
pVnode
),
tstrerror
(
code
));
//
tsdbError("vgId:%d merge last_row failed since %s", TD_VID(pTsdb->pVnode), tstrerror(code));
return
code
;
//
return code;
}
//
}
// static int32_t mergeLast(tb_uid_t uid, STsdb *pTsdb, STSRow **ppRow) {
// static int32_t mergeLast(tb_uid_t uid, STsdb *pTsdb, STSRow **ppRow) {
static
int32_t
mergeLast
(
tb_uid_t
uid
,
STsdb
*
pTsdb
,
SArray
**
ppLastArray
)
{
//
static int32_t mergeLast(tb_uid_t uid, STsdb *pTsdb, SArray **ppLastArray) {
int32_t
code
=
0
;
//
int32_t code = 0;
SArray
*
pSkyline
=
NULL
;
//
SArray *pSkyline = NULL;
STSRow
*
pRow
=
NULL
;
//
STSRow *pRow = NULL;
STSRow
**
ppRow
=
&
pRow
;
//
STSRow **ppRow = &pRow;
STSchema
*
pTSchema
=
metaGetTbTSchema
(
pTsdb
->
pVnode
->
pMeta
,
uid
,
-
1
);
//
STSchema *pTSchema = metaGetTbTSchema(pTsdb->pVnode->pMeta, uid, -1);
int16_t
nCol
=
pTSchema
->
numOfCols
;
//
int16_t nCol = pTSchema->numOfCols;
// SArray *pColArray = taosArrayInit(nCol, sizeof(SColVal));
//
// SArray *pColArray = taosArrayInit(nCol, sizeof(SColVal));
SArray
*
pColArray
=
taosArrayInit
(
nCol
,
sizeof
(
SLastCol
));
//
SArray *pColArray = taosArrayInit(nCol, sizeof(SLastCol));
tb_uid_t
suid
=
getTableSuidByUid
(
uid
,
pTsdb
);
//
tb_uid_t suid = getTableSuidByUid(uid, pTsdb);
STbData
*
pMem
=
NULL
;
//
STbData *pMem = NULL;
if
(
pTsdb
->
mem
)
{
//
if (pTsdb->mem) {
tsdbGetTbDataFromMemTable
(
pTsdb
->
mem
,
suid
,
uid
,
&
pMem
);
//
tsdbGetTbDataFromMemTable(pTsdb->mem, suid, uid, &pMem);
}
//
}
STbData
*
pIMem
=
NULL
;
//
STbData *pIMem = NULL;
if
(
pTsdb
->
imem
)
{
//
if (pTsdb->imem) {
tsdbGetTbDataFromMemTable
(
pTsdb
->
imem
,
suid
,
uid
,
&
pIMem
);
//
tsdbGetTbDataFromMemTable(pTsdb->imem, suid, uid, &pIMem);
}
//
}
*
ppLastArray
=
NULL
;
//
*ppLastArray = NULL;
pSkyline
=
taosArrayInit
(
32
,
sizeof
(
TSDBKEY
));
//
pSkyline = taosArrayInit(32, sizeof(TSDBKEY));
SDelIdx
delIdx
;
//
SDelIdx delIdx;
SDelFile
*
pDelFile
=
tsdbFSStateGetDelFile
(
pTsdb
->
pFS
->
cState
);
//
SDelFile *pDelFile = tsdbFSStateGetDelFile(pTsdb->pFS->cState);
if
(
pDelFile
)
{
//
if (pDelFile) {
SDelFReader
*
pDelFReader
;
//
SDelFReader *pDelFReader;
code
=
tsdbDelFReaderOpen
(
&
pDelFReader
,
pDelFile
,
pTsdb
,
NULL
);
//
code = tsdbDelFReaderOpen(&pDelFReader, pDelFile, pTsdb, NULL);
if
(
code
)
goto
_err
;
//
if (code) goto _err;
code
=
getTableDelIdx
(
pDelFReader
,
suid
,
uid
,
&
delIdx
);
//
code = getTableDelIdx(pDelFReader, suid, uid, &delIdx);
if
(
code
)
goto
_err
;
//
if (code) goto _err;
code
=
getTableDelSkyline
(
pMem
,
pIMem
,
pDelFReader
,
&
delIdx
,
pSkyline
);
//
code = getTableDelSkyline(pMem, pIMem, pDelFReader, &delIdx, pSkyline);
if
(
code
)
goto
_err
;
//
if (code) goto _err;
tsdbDelFReaderClose
(
&
pDelFReader
);
//
tsdbDelFReaderClose(&pDelFReader);
}
else
{
//
} else {
code
=
getTableDelSkyline
(
pMem
,
pIMem
,
NULL
,
NULL
,
pSkyline
);
//
code = getTableDelSkyline(pMem, pIMem, NULL, NULL, pSkyline);
if
(
code
)
goto
_err
;
//
if (code) goto _err;
}
//
}
int64_t
iSkyline
=
taosArrayGetSize
(
pSkyline
)
-
1
;
//
int64_t iSkyline = taosArrayGetSize(pSkyline) - 1;
SBlockIdx
idx
=
{.
suid
=
suid
,
.
uid
=
uid
};
//
SBlockIdx idx = {.suid = suid, .uid = uid};
SFSNextRowIter
fsState
=
{
0
};
//
SFSNextRowIter fsState = {0};
fsState
.
state
=
SFSNEXTROW_FS
;
//
fsState.state = SFSNEXTROW_FS;
fsState
.
pTsdb
=
pTsdb
;
//
fsState.pTsdb = pTsdb;
fsState
.
pBlockIdxExp
=
&
idx
;
//
fsState.pBlockIdxExp = &idx;
SMemNextRowIter
memState
=
{
0
};
//
SMemNextRowIter memState = {0};
SMemNextRowIter
imemState
=
{
0
};
//
SMemNextRowIter imemState = {0};
TSDBROW
memRow
,
imemRow
,
fsRow
;
//
TSDBROW memRow, imemRow, fsRow;
TsdbNextRowState
input
[
3
]
=
{{
&
memRow
,
true
,
false
,
&
memState
,
getNextRowFromMem
,
NULL
},
//
TsdbNextRowState input[3] = {{&memRow, true, false, &memState, getNextRowFromMem, NULL},
{
&
imemRow
,
true
,
false
,
&
imemState
,
getNextRowFromMem
,
NULL
},
//
{&imemRow, true, false, &imemState, getNextRowFromMem, NULL},
{
&
fsRow
,
false
,
true
,
&
fsState
,
getNextRowFromFS
,
clearNextRowFromFS
}};
//
{&fsRow, false, true, &fsState, getNextRowFromFS, clearNextRowFromFS}};
if
(
pMem
)
{
//
if (pMem) {
memState
.
pMem
=
pMem
;
//
memState.pMem = pMem;
memState
.
state
=
SMEMNEXTROW_ENTER
;
//
memState.state = SMEMNEXTROW_ENTER;
input
[
0
].
stop
=
false
;
//
input[0].stop = false;
input
[
0
].
next
=
true
;
//
input[0].next = true;
}
//
}
if
(
pIMem
)
{
//
if (pIMem) {
imemState
.
pMem
=
pIMem
;
//
imemState.pMem = pIMem;
imemState
.
state
=
SMEMNEXTROW_ENTER
;
//
imemState.state = SMEMNEXTROW_ENTER;
input
[
1
].
stop
=
false
;
//
input[1].stop = false;
input
[
1
].
next
=
true
;
//
input[1].next = true;
}
//
}
int16_t
nilColCount
=
nCol
-
1
;
// count of null & none cols
//
int16_t nilColCount = nCol - 1; // count of null & none cols
int
iCol
=
0
;
// index of first nil col index from left to right
//
int iCol = 0; // index of first nil col index from left to right
bool
setICol
=
false
;
//
bool setICol = false;
do
{
//
do {
for
(
int
i
=
0
;
i
<
3
;
++
i
)
{
//
for (int i = 0; i < 3; ++i) {
if
(
input
[
i
].
next
&&
!
input
[
i
].
stop
)
{
//
if (input[i].next && !input[i].stop) {
code
=
input
[
i
].
nextRowFn
(
input
[
i
].
iter
,
&
input
[
i
].
pRow
);
//
code = input[i].nextRowFn(input[i].iter, &input[i].pRow);
if
(
code
)
goto
_err
;
//
if (code) goto _err;
if
(
input
[
i
].
pRow
==
NULL
)
{
//
if (input[i].pRow == NULL) {
input
[
i
].
stop
=
true
;
//
input[i].stop = true;
input
[
i
].
next
=
false
;
//
input[i].next = false;
}
//
}
}
//
}
}
//
}
if
(
input
[
0
].
stop
&&
input
[
1
].
stop
&&
input
[
2
].
stop
)
{
//
if (input[0].stop && input[1].stop && input[2].stop) {
break
;
//
break;
}
//
}
// select maxpoint(s) from mem, imem, fs
//
// select maxpoint(s) from mem, imem, fs
TSDBROW
*
max
[
3
]
=
{
0
};
//
TSDBROW *max[3] = {0};
int
iMax
[
3
]
=
{
-
1
,
-
1
,
-
1
};
//
int iMax[3] = {-1, -1, -1};
int
nMax
=
0
;
//
int nMax = 0;
TSKEY
maxKey
=
TSKEY_MIN
;
//
TSKEY maxKey = TSKEY_MIN;
for
(
int
i
=
0
;
i
<
3
;
++
i
)
{
//
for (int i = 0; i < 3; ++i) {
if
(
!
input
[
i
].
stop
&&
input
[
i
].
pRow
!=
NULL
)
{
//
if (!input[i].stop && input[i].pRow != NULL) {
TSDBKEY
key
=
TSDBROW_KEY
(
input
[
i
].
pRow
);
//
TSDBKEY key = TSDBROW_KEY(input[i].pRow);
// merging & deduplicating on client side
//
// merging & deduplicating on client side
if
(
maxKey
<=
key
.
ts
)
{
//
if (maxKey <= key.ts) {
if
(
maxKey
<
key
.
ts
)
{
//
if (maxKey < key.ts) {
nMax
=
0
;
//
nMax = 0;
maxKey
=
key
.
ts
;
//
maxKey = key.ts;
}
//
}
iMax
[
nMax
]
=
i
;
//
iMax[nMax] = i;
max
[
nMax
++
]
=
input
[
i
].
pRow
;
//
max[nMax++] = input[i].pRow;
}
//
}
}
//
}
}
//
}
// delete detection
//
// delete detection
TSDBROW
*
merge
[
3
]
=
{
0
};
//
TSDBROW *merge[3] = {0};
int
iMerge
[
3
]
=
{
-
1
,
-
1
,
-
1
};
//
int iMerge[3] = {-1, -1, -1};
int
nMerge
=
0
;
//
int nMerge = 0;
for
(
int
i
=
0
;
i
<
nMax
;
++
i
)
{
//
for (int i = 0; i < nMax; ++i) {
TSDBKEY
maxKey
=
TSDBROW_KEY
(
max
[
i
]);
//
TSDBKEY maxKey = TSDBROW_KEY(max[i]);
bool
deleted
=
tsdbKeyDeleted
(
&
maxKey
,
pSkyline
,
&
iSkyline
);
//
bool deleted = tsdbKeyDeleted(&maxKey, pSkyline, &iSkyline);
if
(
!
deleted
)
{
//
if (!deleted) {
iMerge
[
nMerge
]
=
iMax
[
i
];
//
iMerge[nMerge] = iMax[i];
merge
[
nMerge
++
]
=
max
[
i
];
//
merge[nMerge++] = max[i];
}
//
}
input
[
iMax
[
i
]].
next
=
deleted
;
//
input[iMax[i]].next = deleted;
}
//
}
// merge if nMerge > 1
//
// merge if nMerge > 1
if
(
nMerge
>
0
)
{
//
if (nMerge > 0) {
if
(
nMerge
==
1
)
{
//
if (nMerge == 1) {
code
=
tsRowFromTsdbRow
(
pTSchema
,
merge
[
nMerge
-
1
],
ppRow
);
//
code = tsRowFromTsdbRow(pTSchema, merge[nMerge - 1], ppRow);
if
(
code
)
goto
_err
;
//
if (code) goto _err;
}
else
{
//
} else {
// merge 2 or 3 rows
//
// merge 2 or 3 rows
SRowMerger
merger
=
{
0
};
//
SRowMerger merger = {0};
tRowMergerInit
(
&
merger
,
merge
[
0
],
pTSchema
);
//
tRowMergerInit(&merger, merge[0], pTSchema);
for
(
int
i
=
1
;
i
<
nMerge
;
++
i
)
{
//
for (int i = 1; i < nMerge; ++i) {
tRowMerge
(
&
merger
,
merge
[
i
]);
//
tRowMerge(&merger, merge[i]);
}
//
}
tRowMergerGetRow
(
&
merger
,
ppRow
);
//
tRowMergerGetRow(&merger, ppRow);
tRowMergerClear
(
&
merger
);
//
tRowMergerClear(&merger);
}
//
}
}
else
{
//
} else {
/* *ppRow = NULL; */
//
/* *ppRow = NULL; */
/* return code; */
//
/* return code; */
continue
;
//
continue;
}
//
}
if
(
iCol
==
0
)
{
//
if (iCol == 0) {
STColumn
*
pTColumn
=
&
pTSchema
->
columns
[
0
];
//
STColumn *pTColumn = &pTSchema->columns[0];
SColVal
*
pColVal
=
&
(
SColVal
){
0
};
//
SColVal *pColVal = &(SColVal){0};
*
pColVal
=
COL_VAL_VALUE
(
pTColumn
->
colId
,
pTColumn
->
type
,
(
SValue
){.
ts
=
maxKey
});
//
*pColVal = COL_VAL_VALUE(pTColumn->colId, pTColumn->type, (SValue){.ts = maxKey});
// if (taosArrayPush(pColArray, pColVal) == NULL) {
//
// if (taosArrayPush(pColArray, pColVal) == NULL) {
if
(
taosArrayPush
(
pColArray
,
&
(
SLastCol
){.
ts
=
maxKey
,
.
colVal
=
*
pColVal
})
==
NULL
)
{
//
if (taosArrayPush(pColArray, &(SLastCol){.ts = maxKey, .colVal = *pColVal}) == NULL) {
code
=
TSDB_CODE_OUT_OF_MEMORY
;
//
code = TSDB_CODE_OUT_OF_MEMORY;
goto
_err
;
//
goto _err;
}
//
}
++
iCol
;
//
++iCol;
setICol
=
false
;
//
setICol = false;
for
(
int16_t
i
=
iCol
;
i
<
nCol
;
++
i
)
{
//
for (int16_t i = iCol; i < nCol; ++i) {
// tsdbRowGetColVal(*ppRow, pTSchema, i, pColVal);
//
// tsdbRowGetColVal(*ppRow, pTSchema, i, pColVal);
tTSRowGetVal
(
*
ppRow
,
pTSchema
,
i
,
pColVal
);
//
tTSRowGetVal(*ppRow, pTSchema, i, pColVal);
// if (taosArrayPush(pColArray, pColVal) == NULL) {
//
// if (taosArrayPush(pColArray, pColVal) == NULL) {
if
(
taosArrayPush
(
pColArray
,
&
(
SLastCol
){.
ts
=
maxKey
,
.
colVal
=
*
pColVal
})
==
NULL
)
{
//
if (taosArrayPush(pColArray, &(SLastCol){.ts = maxKey, .colVal = *pColVal}) == NULL) {
code
=
TSDB_CODE_OUT_OF_MEMORY
;
//
code = TSDB_CODE_OUT_OF_MEMORY;
goto
_err
;
//
goto _err;
}
//
}
if
(
pColVal
->
isNull
||
pColVal
->
isNone
)
{
//
if (pColVal->isNull || pColVal->isNone) {
for
(
int
j
=
0
;
j
<
nMerge
;
++
j
)
{
//
for (int j = 0; j < nMerge; ++j) {
SColVal
jColVal
=
{
0
};
//
SColVal jColVal = {0};
tsdbRowGetColVal
(
merge
[
j
],
pTSchema
,
i
,
&
jColVal
);
//
tsdbRowGetColVal(merge[j], pTSchema, i, &jColVal);
if
(
jColVal
.
isNull
||
jColVal
.
isNone
)
{
//
if (jColVal.isNull || jColVal.isNone) {
input
[
iMerge
[
j
]].
next
=
true
;
//
input[iMerge[j]].next = true;
}
//
}
}
//
}
if
(
!
setICol
)
{
//
if (!setICol) {
iCol
=
i
;
//
iCol = i;
setICol
=
true
;
//
setICol = true;
}
//
}
}
else
{
//
} else {
--
nilColCount
;
//
--nilColCount;
}
//
}
}
//
}
if
(
*
ppRow
)
{
//
if (*ppRow) {
taosMemoryFreeClear
(
*
ppRow
);
//
taosMemoryFreeClear(*ppRow);
}
//
}
continue
;
//
continue;
}
//
}
setICol
=
false
;
//
setICol = false;
for
(
int16_t
i
=
iCol
;
i
<
nCol
;
++
i
)
{
//
for (int16_t i = iCol; i < nCol; ++i) {
SColVal
colVal
=
{
0
};
//
SColVal colVal = {0};
tTSRowGetVal
(
*
ppRow
,
pTSchema
,
i
,
&
colVal
);
//
tTSRowGetVal(*ppRow, pTSchema, i, &colVal);
TSKEY
rowTs
=
(
*
ppRow
)
->
ts
;
//
TSKEY rowTs = (*ppRow)->ts;
// SColVal *tColVal = (SColVal *)taosArrayGet(pColArray, i);
//
// SColVal *tColVal = (SColVal *)taosArrayGet(pColArray, i);
SLastCol
*
tTsVal
=
(
SLastCol
*
)
taosArrayGet
(
pColArray
,
i
);
//
SLastCol *tTsVal = (SLastCol *)taosArrayGet(pColArray, i);
SColVal
*
tColVal
=
&
tTsVal
->
colVal
;
//
SColVal *tColVal = &tTsVal->colVal;
if
(
!
colVal
.
isNone
&&
!
colVal
.
isNull
)
{
//
if (!colVal.isNone && !colVal.isNull) {
if
(
tColVal
->
isNull
||
tColVal
->
isNone
)
{
//
if (tColVal->isNull || tColVal->isNone) {
// taosArraySet(pColArray, i, &colVal);
//
// taosArraySet(pColArray, i, &colVal);
taosArraySet
(
pColArray
,
i
,
&
(
SLastCol
){.
ts
=
rowTs
,
.
colVal
=
colVal
});
//
taosArraySet(pColArray, i, &(SLastCol){.ts = rowTs, .colVal = colVal});
--
nilColCount
;
//
--nilColCount;
}
//
}
}
else
{
//
} else {
if
((
tColVal
->
isNull
||
tColVal
->
isNone
)
&&
!
setICol
)
{
//
if ((tColVal->isNull || tColVal->isNone) && !setICol) {
iCol
=
i
;
//
iCol = i;
setICol
=
true
;
//
setICol = true;
for
(
int
j
=
0
;
j
<
nMerge
;
++
j
)
{
//
for (int j = 0; j < nMerge; ++j) {
SColVal
jColVal
=
{
0
};
//
SColVal jColVal = {0};
tsdbRowGetColVal
(
merge
[
j
],
pTSchema
,
i
,
&
jColVal
);
//
tsdbRowGetColVal(merge[j], pTSchema, i, &jColVal);
if
(
jColVal
.
isNull
||
jColVal
.
isNone
)
{
//
if (jColVal.isNull || jColVal.isNone) {
input
[
iMerge
[
j
]].
next
=
true
;
//
input[iMerge[j]].next = true;
}
//
}
}
//
}
}
//
}
}
//
}
}
//
}
if
(
*
ppRow
)
{
//
if (*ppRow) {
taosMemoryFreeClear
(
*
ppRow
);
//
taosMemoryFreeClear(*ppRow);
}
//
}
}
while
(
nilColCount
>
0
);
//
} while (nilColCount > 0);
// if () new ts row from pColArray if non empty
//
// if () new ts row from pColArray if non empty
/* if (taosArrayGetSize(pColArray) == nCol) { */
//
/* if (taosArrayGetSize(pColArray) == nCol) { */
/* code = tdSTSRowNew(pColArray, pTSchema, ppRow); */
//
/* code = tdSTSRowNew(pColArray, pTSchema, ppRow); */
/* if (code) goto _err; */
//
/* if (code) goto _err; */
/* } */
//
/* } */
/* taosArrayDestroy(pColArray); */
//
/* taosArrayDestroy(pColArray); */
if
(
taosArrayGetSize
(
pColArray
)
<=
0
)
{
//
if (taosArrayGetSize(pColArray) <= 0) {
*
ppLastArray
=
NULL
;
//
*ppLastArray = NULL;
taosArrayDestroy
(
pColArray
);
//
taosArrayDestroy(pColArray);
}
else
{
//
} else {
*
ppLastArray
=
pColArray
;
//
*ppLastArray = pColArray;
}
//
}
if
(
*
ppRow
)
{
//
if (*ppRow) {
taosMemoryFreeClear
(
*
ppRow
);
//
taosMemoryFreeClear(*ppRow);
}
//
}
for
(
int
i
=
0
;
i
<
3
;
++
i
)
{
//
for (int i = 0; i < 3; ++i) {
if
(
input
[
i
].
nextRowClearFn
)
{
//
if (input[i].nextRowClearFn) {
input
[
i
].
nextRowClearFn
(
input
[
i
].
iter
);
//
input[i].nextRowClearFn(input[i].iter);
}
//
}
}
//
}
if
(
pSkyline
)
{
//
if (pSkyline) {
taosArrayDestroy
(
pSkyline
);
//
taosArrayDestroy(pSkyline);
}
//
}
taosMemoryFreeClear
(
pTSchema
);
//
taosMemoryFreeClear(pTSchema);
return
code
;
//
return code;
_err:
//
_err:
taosArrayDestroy
(
pColArray
);
//
taosArrayDestroy(pColArray);
if
(
*
ppRow
)
{
//
if (*ppRow) {
taosMemoryFreeClear
(
*
ppRow
);
//
taosMemoryFreeClear(*ppRow);
}
//
}
for
(
int
i
=
0
;
i
<
3
;
++
i
)
{
//
for (int i = 0; i < 3; ++i) {
if
(
input
[
i
].
nextRowClearFn
)
{
//
if (input[i].nextRowClearFn) {
input
[
i
].
nextRowClearFn
(
input
[
i
].
iter
);
//
input[i].nextRowClearFn(input[i].iter);
}
//
}
}
//
}
if
(
pSkyline
)
{
//
if (pSkyline) {
taosArrayDestroy
(
pSkyline
);
//
taosArrayDestroy(pSkyline);
}
//
}
taosMemoryFreeClear
(
pTSchema
);
//
taosMemoryFreeClear(pTSchema);
tsdbError
(
"vgId:%d merge last_row failed since %s"
,
TD_VID
(
pTsdb
->
pVnode
),
tstrerror
(
code
));
//
tsdbError("vgId:%d merge last_row failed since %s", TD_VID(pTsdb->pVnode), tstrerror(code));
return
code
;
//
return code;
}
//
}
int32_t
tsdbCacheGetLastrowH
(
SLRUCache
*
pCache
,
tb_uid_t
uid
,
STsdb
*
pTsdb
,
LRUHandle
**
handle
)
{
int32_t
tsdbCacheGetLastrowH
(
SLRUCache
*
pCache
,
tb_uid_t
uid
,
STsdb
*
pTsdb
,
LRUHandle
**
handle
)
{
int32_t
code
=
0
;
int32_t
code
=
0
;
...
...
source/dnode/vnode/src/tsdb/tsdbCommit.c
浏览文件 @
684dd823
...
@@ -29,6 +29,7 @@ typedef struct {
...
@@ -29,6 +29,7 @@ typedef struct {
int32_t
minRow
;
int32_t
minRow
;
int32_t
maxRow
;
int32_t
maxRow
;
int8_t
cmprAlg
;
int8_t
cmprAlg
;
STsdbFS
fs
;
// --------------
// --------------
TSKEY
nextKey
;
// reset by each table commit
TSKEY
nextKey
;
// reset by each table commit
int32_t
commitFid
;
int32_t
commitFid
;
...
@@ -119,9 +120,6 @@ int32_t tsdbCommit(STsdb *pTsdb) {
...
@@ -119,9 +120,6 @@ int32_t tsdbCommit(STsdb *pTsdb) {
code
=
tsdbCommitDel
(
&
commith
);
code
=
tsdbCommitDel
(
&
commith
);
if
(
code
)
goto
_err
;
if
(
code
)
goto
_err
;
code
=
tsdbCommitCache
(
&
commith
);
if
(
code
)
goto
_err
;
// end commit
// end commit
code
=
tsdbEndCommit
(
&
commith
,
0
);
code
=
tsdbEndCommit
(
&
commith
,
0
);
if
(
code
)
goto
_err
;
if
(
code
)
goto
_err
;
...
@@ -158,7 +156,7 @@ static int32_t tsdbCommitDelStart(SCommitter *pCommitter) {
...
@@ -158,7 +156,7 @@ static int32_t tsdbCommitDelStart(SCommitter *pCommitter) {
goto
_err
;
goto
_err
;
}
}
SDelFile
*
pDelFileR
=
p
Tsdb
->
pFS
->
nState
->
pDelFile
;
SDelFile
*
pDelFileR
=
p
Committer
->
fs
.
pDelFile
;
if
(
pDelFileR
)
{
if
(
pDelFileR
)
{
code
=
tsdbDelFReaderOpen
(
&
pCommitter
->
pDelFReader
,
pDelFileR
,
pTsdb
,
NULL
);
code
=
tsdbDelFReaderOpen
(
&
pCommitter
->
pDelFReader
,
pDelFileR
,
pTsdb
,
NULL
);
if
(
code
)
goto
_err
;
if
(
code
)
goto
_err
;
...
@@ -247,7 +245,7 @@ static int32_t tsdbCommitDelEnd(SCommitter *pCommitter) {
...
@@ -247,7 +245,7 @@ static int32_t tsdbCommitDelEnd(SCommitter *pCommitter) {
code
=
tsdbUpdateDelFileHdr
(
pCommitter
->
pDelFWriter
);
code
=
tsdbUpdateDelFileHdr
(
pCommitter
->
pDelFWriter
);
if
(
code
)
goto
_err
;
if
(
code
)
goto
_err
;
code
=
tsdbFS
StateUpsertDelFile
(
pTsdb
->
pFS
->
nState
,
&
pCommitter
->
pDelFWriter
->
fDel
);
code
=
tsdbFS
UpsertDelFile
(
&
pCommitter
->
fs
,
&
pCommitter
->
pDelFWriter
->
fDel
);
if
(
code
)
goto
_err
;
if
(
code
)
goto
_err
;
code
=
tsdbDelFWriterClose
(
&
pCommitter
->
pDelFWriter
,
1
);
code
=
tsdbDelFWriterClose
(
&
pCommitter
->
pDelFWriter
,
1
);
...
@@ -281,7 +279,8 @@ static int32_t tsdbCommitFileDataStart(SCommitter *pCommitter) {
...
@@ -281,7 +279,8 @@ static int32_t tsdbCommitFileDataStart(SCommitter *pCommitter) {
taosArrayClear
(
pCommitter
->
aBlockIdx
);
taosArrayClear
(
pCommitter
->
aBlockIdx
);
tMapDataReset
(
&
pCommitter
->
oBlockMap
);
tMapDataReset
(
&
pCommitter
->
oBlockMap
);
tBlockDataReset
(
&
pCommitter
->
oBlockData
);
tBlockDataReset
(
&
pCommitter
->
oBlockData
);
pRSet
=
tsdbFSStateGetDFileSet
(
pTsdb
->
pFS
->
nState
,
pCommitter
->
commitFid
,
TD_EQ
);
pRSet
=
(
SDFileSet
*
)
taosArraySearch
(
pCommitter
->
fs
.
aDFileSet
,
&
(
SDFileSet
){.
fid
=
pCommitter
->
commitFid
},
tDFileSetCmprFn
,
TD_EQ
);
if
(
pRSet
)
{
if
(
pRSet
)
{
code
=
tsdbDataFReaderOpen
(
&
pCommitter
->
pReader
,
pTsdb
,
pRSet
);
code
=
tsdbDataFReaderOpen
(
&
pCommitter
->
pReader
,
pTsdb
,
pRSet
);
if
(
code
)
goto
_err
;
if
(
code
)
goto
_err
;
...
@@ -860,7 +859,7 @@ static int32_t tsdbCommitFileDataEnd(SCommitter *pCommitter) {
...
@@ -860,7 +859,7 @@ static int32_t tsdbCommitFileDataEnd(SCommitter *pCommitter) {
if
(
code
)
goto
_err
;
if
(
code
)
goto
_err
;
// upsert SDFileSet
// upsert SDFileSet
code
=
tsdbFS
StateUpsertDFileSet
(
pCommitter
->
pTsdb
->
pFS
->
nState
,
&
pCommitter
->
pWriter
->
wSet
);
code
=
tsdbFS
UpsertFSet
(
&
pCommitter
->
fs
,
&
pCommitter
->
pWriter
->
wSet
);
if
(
code
)
goto
_err
;
if
(
code
)
goto
_err
;
// close and sync
// close and sync
...
@@ -978,7 +977,7 @@ static int32_t tsdbStartCommit(STsdb *pTsdb, SCommitter *pCommitter) {
...
@@ -978,7 +977,7 @@ static int32_t tsdbStartCommit(STsdb *pTsdb, SCommitter *pCommitter) {
pCommitter
->
maxRow
=
pTsdb
->
pVnode
->
config
.
tsdbCfg
.
maxRows
;
pCommitter
->
maxRow
=
pTsdb
->
pVnode
->
config
.
tsdbCfg
.
maxRows
;
pCommitter
->
cmprAlg
=
pTsdb
->
pVnode
->
config
.
tsdbCfg
.
compression
;
pCommitter
->
cmprAlg
=
pTsdb
->
pVnode
->
config
.
tsdbCfg
.
compression
;
code
=
tsdbFS
Begin
(
pTsdb
->
pFS
);
code
=
tsdbFS
Copy
(
pTsdb
,
&
pCommitter
->
fs
);
if
(
code
)
goto
_err
;
if
(
code
)
goto
_err
;
return
code
;
return
code
;
...
@@ -1147,28 +1146,33 @@ _err:
...
@@ -1147,28 +1146,33 @@ _err:
return
code
;
return
code
;
}
}
static
int32_t
tsdbCommitCache
(
SCommitter
*
pCommitter
)
{
int32_t
code
=
0
;
// TODO
return
code
;
}
static
int32_t
tsdbEndCommit
(
SCommitter
*
pCommitter
,
int32_t
eno
)
{
static
int32_t
tsdbEndCommit
(
SCommitter
*
pCommitter
,
int32_t
eno
)
{
int32_t
code
=
0
;
int32_t
code
=
0
;
STsdb
*
pTsdb
=
pCommitter
->
pTsdb
;
STsdb
*
pTsdb
=
pCommitter
->
pTsdb
;
SMemTable
*
pMemTable
=
pTsdb
->
imem
;
SMemTable
*
pMemTable
=
pTsdb
->
imem
;
if
(
eno
==
0
)
{
ASSERT
(
eno
);
code
=
tsdbFSCommit
(
pTsdb
->
pFS
);
}
else
{
code
=
tsdbFSCommit1
(
pTsdb
,
&
pCommitter
->
fs
);
code
=
tsdbFSRollback
(
pTsdb
->
pFS
);
if
(
code
)
goto
_err
;
}
// lock
taosThreadRwlockWrlock
(
&
pTsdb
->
rwLock
);
taosThreadRwlockWrlock
(
&
pTsdb
->
rwLock
);
// commit or rollback
code
=
tsdbFSCommit2
(
pTsdb
,
&
pCommitter
->
fs
);
if
(
code
)
{
taosThreadRwlockUnlock
(
&
pTsdb
->
rwLock
);
goto
_err
;
}
pTsdb
->
imem
=
NULL
;
pTsdb
->
imem
=
NULL
;
// unlock
taosThreadRwlockUnlock
(
&
pTsdb
->
rwLock
);
taosThreadRwlockUnlock
(
&
pTsdb
->
rwLock
);
tsdbUnrefMemTable
(
pMemTable
);
tsdbUnrefMemTable
(
pMemTable
);
tsdbFSDestroy
(
&
pCommitter
->
fs
);
tsdbInfo
(
"vgId:%d tsdb end commit"
,
TD_VID
(
pTsdb
->
pVnode
));
tsdbInfo
(
"vgId:%d tsdb end commit"
,
TD_VID
(
pTsdb
->
pVnode
));
return
code
;
return
code
;
...
...
source/dnode/vnode/src/tsdb/tsdbFS.c
浏览文件 @
684dd823
...
@@ -16,67 +16,41 @@
...
@@ -16,67 +16,41 @@
#include "tsdb.h"
#include "tsdb.h"
// =================================================================================================
// =================================================================================================
static
int32_t
t
PutFSState
(
uint8_t
*
p
,
STsdbFSState
*
pState
)
{
static
int32_t
t
sdbEncodeFS
(
uint8_t
*
p
,
STsdbFS
*
pFS
)
{
int32_t
n
=
0
;
int32_t
n
=
0
;
int8_t
hasDel
=
p
State
->
pDelFile
?
1
:
0
;
int8_t
hasDel
=
p
FS
->
pDelFile
?
1
:
0
;
uint32_t
n
DFileSet
=
taosArrayGetSize
(
pState
->
aDFileSet
);
uint32_t
n
Set
=
taosArrayGetSize
(
pFS
->
aDFileSet
);
// SDelFile
// SDelFile
n
+=
tPutI8
(
p
?
p
+
n
:
p
,
hasDel
);
n
+=
tPutI8
(
p
?
p
+
n
:
p
,
hasDel
);
if
(
hasDel
)
{
if
(
hasDel
)
{
n
+=
tPutDelFile
(
p
?
p
+
n
:
p
,
p
State
->
pDelFile
);
n
+=
tPutDelFile
(
p
?
p
+
n
:
p
,
p
FS
->
pDelFile
);
}
}
// SArray<SDFileSet>
// SArray<SDFileSet>
n
+=
tPutU32v
(
p
?
p
+
n
:
p
,
n
DFile
Set
);
n
+=
tPutU32v
(
p
?
p
+
n
:
p
,
nSet
);
for
(
uint32_t
i
DFileSet
=
0
;
iDFileSet
<
nDFileSet
;
iDFile
Set
++
)
{
for
(
uint32_t
i
Set
=
0
;
iSet
<
nSet
;
i
Set
++
)
{
n
+=
tPutDFileSet
(
p
?
p
+
n
:
p
,
(
SDFileSet
*
)
taosArrayGet
(
p
State
->
aDFileSet
,
iDFile
Set
));
n
+=
tPutDFileSet
(
p
?
p
+
n
:
p
,
(
SDFileSet
*
)
taosArrayGet
(
p
FS
->
aDFileSet
,
i
Set
));
}
}
return
n
;
return
n
;
}
}
static
int32_t
tGetFSState
(
uint8_t
*
p
,
STsdbFSState
*
pState
)
{
static
int32_t
tsdbGnrtCurrent
(
STsdb
*
pTsdb
,
STsdbFS
*
pFS
,
char
*
fname
)
{
int32_t
n
=
0
;
int8_t
hasDel
;
uint32_t
nDFileSet
;
SDFileSet
*
pSet
=
&
(
SDFileSet
){
0
};
// SDelFile
n
+=
tGetI8
(
p
+
n
,
&
hasDel
);
if
(
hasDel
)
{
pState
->
pDelFile
=
&
pState
->
delFile
;
n
+=
tGetDelFile
(
p
+
n
,
pState
->
pDelFile
);
}
else
{
pState
->
pDelFile
=
NULL
;
}
// SArray<SDFileSet>
taosArrayClear
(
pState
->
aDFileSet
);
n
+=
tGetU32v
(
p
+
n
,
&
nDFileSet
);
for
(
uint32_t
iDFileSet
=
0
;
iDFileSet
<
nDFileSet
;
iDFileSet
++
)
{
n
+=
tGetDFileSet
(
p
+
n
,
pSet
);
taosArrayPush
(
pState
->
aDFileSet
,
pSet
);
}
return
n
;
}
static
int32_t
tsdbGnrtCurrent
(
const
char
*
fname
,
STsdbFSState
*
pState
)
{
int32_t
code
=
0
;
int32_t
code
=
0
;
int64_t
n
;
int64_t
n
;
int64_t
size
;
int64_t
size
;
uint8_t
*
pData
;
uint8_t
*
pData
=
NULL
;
TdFilePtr
pFD
=
NULL
;
TdFilePtr
pFD
=
NULL
;
// to binary
// to binary
size
=
t
PutFSState
(
NULL
,
pState
)
+
sizeof
(
TSCKSUM
);
size
=
t
sdbEncodeFS
(
NULL
,
pFS
)
+
sizeof
(
TSCKSUM
);
pData
=
taosMemoryMalloc
(
size
);
pData
=
taosMemoryMalloc
(
size
);
if
(
pData
==
NULL
)
{
if
(
pData
==
NULL
)
{
code
=
TSDB_CODE_OUT_OF_MEMORY
;
code
=
TSDB_CODE_OUT_OF_MEMORY
;
goto
_err
;
goto
_err
;
}
}
n
=
t
PutFSState
(
pData
,
pState
);
n
=
t
sdbEncodeFS
(
pData
,
pFS
);
ASSERT
(
n
+
sizeof
(
TSCKSUM
)
==
size
);
ASSERT
(
n
+
sizeof
(
TSCKSUM
)
==
size
);
taosCalcChecksumAppend
(
0
,
pData
,
size
);
taosCalcChecksumAppend
(
0
,
pData
,
size
);
...
@@ -104,585 +78,1008 @@ static int32_t tsdbGnrtCurrent(const char *fname, STsdbFSState *pState) {
...
@@ -104,585 +78,1008 @@ static int32_t tsdbGnrtCurrent(const char *fname, STsdbFSState *pState) {
return
code
;
return
code
;
_err:
_err:
tsdbError
(
"
tsdb gnrt current failed since %s"
,
tstrerror
(
code
));
tsdbError
(
"
vgId:%d tsdb gnrt current failed since %s"
,
TD_VID
(
pTsdb
->
pVnode
)
,
tstrerror
(
code
));
if
(
pData
)
taosMemoryFree
(
pData
);
if
(
pData
)
taosMemoryFree
(
pData
);
return
code
;
return
code
;
}
}
static
int32_t
tsdbLoadCurrentState
(
STsdbFS
*
pFS
,
STsdbFSState
*
pState
)
{
// static int32_t tsdbApplyDFileSetChange(STsdbFS *pFS, SDFileSet *pFrom, SDFileSet *pTo) {
// int32_t code = 0;
// char fname[TSDB_FILENAME_LEN];
// if (pFrom && pTo) {
// bool isSameDisk = (pFrom->diskId.level == pTo->diskId.level) && (pFrom->diskId.id == pTo->diskId.id);
// // head
// if (isSameDisk && pFrom->pHeadF->commitID == pTo->pHeadF->commitID) {
// ASSERT(pFrom->pHeadF->size == pTo->pHeadF->size);
// ASSERT(pFrom->pHeadF->offset == pTo->pHeadF->offset);
// } else {
// tsdbHeadFileName(pFS->pTsdb, pFrom->diskId, pFrom->fid, pFrom->pHeadF, fname);
// taosRemoveFile(fname);
// }
// // data
// if (isSameDisk && pFrom->pDataF->commitID == pTo->pDataF->commitID) {
// if (pFrom->pDataF->size > pTo->pDataF->size) {
// code = tsdbDFileRollback(pFS->pTsdb, pTo, TSDB_DATA_FILE);
// if (code) goto _err;
// }
// } else {
// tsdbDataFileName(pFS->pTsdb, pFrom->diskId, pFrom->fid, pFrom->pDataF, fname);
// taosRemoveFile(fname);
// }
// // last
// if (isSameDisk && pFrom->pLastF->commitID == pTo->pLastF->commitID) {
// if (pFrom->pLastF->size > pTo->pLastF->size) {
// code = tsdbDFileRollback(pFS->pTsdb, pTo, TSDB_LAST_FILE);
// if (code) goto _err;
// }
// } else {
// tsdbLastFileName(pFS->pTsdb, pFrom->diskId, pFrom->fid, pFrom->pLastF, fname);
// taosRemoveFile(fname);
// }
// // sma
// if (isSameDisk && pFrom->pSmaF->commitID == pTo->pSmaF->commitID) {
// if (pFrom->pSmaF->size > pTo->pSmaF->size) {
// code = tsdbDFileRollback(pFS->pTsdb, pTo, TSDB_SMA_FILE);
// if (code) goto _err;
// }
// } else {
// tsdbSmaFileName(pFS->pTsdb, pFrom->diskId, pFrom->fid, pFrom->pSmaF, fname);
// taosRemoveFile(fname);
// }
// } else if (pFrom) {
// // head
// tsdbHeadFileName(pFS->pTsdb, pFrom->diskId, pFrom->fid, pFrom->pHeadF, fname);
// taosRemoveFile(fname);
// // data
// tsdbDataFileName(pFS->pTsdb, pFrom->diskId, pFrom->fid, pFrom->pDataF, fname);
// taosRemoveFile(fname);
// // last
// tsdbLastFileName(pFS->pTsdb, pFrom->diskId, pFrom->fid, pFrom->pLastF, fname);
// taosRemoveFile(fname);
// // fsm
// tsdbSmaFileName(pFS->pTsdb, pFrom->diskId, pFrom->fid, pFrom->pSmaF, fname);
// taosRemoveFile(fname);
// }
// return code;
// _err:
// tsdbError("vgId:%d tsdb apply disk file set change failed since %s", TD_VID(pFS->pTsdb->pVnode), tstrerror(code));
// return code;
// }
// static int32_t tsdbApplyDelFileChange(STsdbFS *pFS, SDelFile *pFrom, SDelFile *pTo) {
// int32_t code = 0;
// char fname[TSDB_FILENAME_LEN];
// if (pFrom && pTo) {
// if (!tsdbDelFileIsSame(pFrom, pTo)) {
// tsdbDelFileName(pFS->pTsdb, pFrom, fname);
// if (taosRemoveFile(fname) < 0) {
// code = TAOS_SYSTEM_ERROR(errno);
// goto _err;
// }
// }
// } else if (pFrom) {
// tsdbDelFileName(pFS->pTsdb, pFrom, fname);
// if (taosRemoveFile(fname) < 0) {
// code = TAOS_SYSTEM_ERROR(errno);
// goto _err;
// }
// } else {
// // do nothing
// }
// return code;
// _err:
// tsdbError("vgId:%d tsdb apply del file change failed since %s", TD_VID(pFS->pTsdb->pVnode), tstrerror(code));
// return code;
// }
// static int32_t tsdbFSApplyDiskChange(STsdbFS *pFS, STsdbFSState *pFrom, STsdbFSState *pTo) {
// int32_t code = 0;
// int32_t iFrom = 0;
// int32_t nFrom = taosArrayGetSize(pFrom->aDFileSet);
// int32_t iTo = 0;
// int32_t nTo = taosArrayGetSize(pTo->aDFileSet);
// SDFileSet *pDFileSetFrom;
// SDFileSet *pDFileSetTo;
// // SDelFile
// code = tsdbApplyDelFileChange(pFS, pFrom->pDelFile, pTo->pDelFile);
// if (code) goto _err;
// // SDFileSet
// while (iFrom < nFrom && iTo < nTo) {
// pDFileSetFrom = (SDFileSet *)taosArrayGet(pFrom->aDFileSet, iFrom);
// pDFileSetTo = (SDFileSet *)taosArrayGet(pTo->aDFileSet, iTo);
// if (pDFileSetFrom->fid == pDFileSetTo->fid) {
// code = tsdbApplyDFileSetChange(pFS, pDFileSetFrom, pDFileSetTo);
// if (code) goto _err;
// iFrom++;
// iTo++;
// } else if (pDFileSetFrom->fid < pDFileSetTo->fid) {
// code = tsdbApplyDFileSetChange(pFS, pDFileSetFrom, NULL);
// if (code) goto _err;
// iFrom++;
// } else {
// iTo++;
// }
// }
// while (iFrom < nFrom) {
// pDFileSetFrom = (SDFileSet *)taosArrayGet(pFrom->aDFileSet, iFrom);
// code = tsdbApplyDFileSetChange(pFS, pDFileSetFrom, NULL);
// if (code) goto _err;
// iFrom++;
// }
// #if 0
// // do noting
// while (iTo < nTo) {
// pDFileSetTo = (SDFileSet *)taosArrayGetP(pTo->aDFileSet, iTo);
// code = tsdbApplyDFileSetChange(pFS, NULL, pDFileSetTo);
// if (code) goto _err;
// iTo++;
// }
// #endif
// return code;
// _err:
// tsdbError("vgId:%d tsdb fs apply disk change failed sicne %s", TD_VID(pFS->pTsdb->pVnode), tstrerror(code));
// return code;
// }
void
tsdbFSDestroy
(
STsdbFS
*
pFS
)
{
if
(
pFS
->
pDelFile
)
{
taosMemoryFree
(
pFS
->
pDelFile
);
}
for
(
int32_t
iSet
=
0
;
iSet
<
taosArrayGetSize
(
pFS
->
aDFileSet
);
iSet
++
)
{
SDFileSet
*
pSet
=
(
SDFileSet
*
)
taosArrayGet
(
pFS
->
aDFileSet
,
iSet
);
taosMemoryFree
(
pSet
->
pHeadF
);
taosMemoryFree
(
pSet
->
pDataF
);
taosMemoryFree
(
pSet
->
pLastF
);
taosMemoryFree
(
pSet
->
pSmaF
);
}
taosArrayDestroy
(
pFS
->
aDFileSet
);
}
static
int32_t
tsdbScanAndTryFixFS
(
STsdb
*
pTsdb
)
{
int32_t
code
=
0
;
int32_t
code
=
0
;
int64_t
size
;
int64_t
size
;
int64_t
n
;
char
fname
[
TSDB_FILENAME_LEN
];
char
fname
[
TSDB_FILENAME_LEN
];
uint8_t
*
pData
=
NULL
;
TdFilePtr
pFD
;
snprintf
(
fname
,
TSDB_FILENAME_LEN
-
1
,
"%s%s%s%sCURRENT"
,
tfsGetPrimaryPath
(
pFS
->
pTsdb
->
pVnode
->
pTfs
),
TD_DIRSEP
,
// SDelFile
pFS
->
pTsdb
->
path
,
TD_DIRSEP
);
if
(
pTsdb
->
fs
.
pDelFile
)
{
tsdbDelFileName
(
pTsdb
,
pTsdb
->
fs
.
pDelFile
,
fname
);
if
(
!
taosCheckExistFile
(
fname
))
{
if
(
taosStatFile
(
fname
,
&
size
,
NULL
))
{
// create an empry CURRENT file if not exists
code
=
tsdbGnrtCurrent
(
fname
,
pState
);
if
(
code
)
goto
_err
;
}
else
{
// open the file and load
pFD
=
taosOpenFile
(
fname
,
TD_FILE_READ
);
if
(
pFD
==
NULL
)
{
code
=
TAOS_SYSTEM_ERROR
(
errno
);
code
=
TAOS_SYSTEM_ERROR
(
errno
);
goto
_err
;
goto
_err
;
}
}
if
(
taosFStatFile
(
pFD
,
&
size
,
NULL
)
<
0
)
{
if
(
size
!=
pTsdb
->
fs
.
pDelFile
->
size
)
{
code
=
T
AOS_SYSTEM_ERROR
(
errno
)
;
code
=
T
SDB_CODE_FILE_CORRUPTED
;
goto
_err
;
goto
_err
;
}
}
}
pData
=
taosMemoryMalloc
(
size
);
// SArray<SDFileSet>
if
(
pData
==
NULL
)
{
for
(
int32_t
iSet
=
0
;
iSet
<
taosArrayGetSize
(
pTsdb
->
fs
.
aDFileSet
);
iSet
++
)
{
code
=
TSDB_CODE_OUT_OF_MEMORY
;
SDFileSet
*
pSet
=
(
SDFileSet
*
)
taosArrayGet
(
pTsdb
->
fs
.
aDFileSet
,
iSet
);
// head =========
tsdbHeadFileName
(
pTsdb
,
pSet
->
diskId
,
pSet
->
fid
,
pSet
->
pHeadF
,
fname
);
if
(
taosStatFile
(
fname
,
&
size
,
NULL
))
{
code
=
TAOS_SYSTEM_ERROR
(
errno
);
goto
_err
;
}
if
(
size
!=
pSet
->
pHeadF
->
size
)
{
code
=
TSDB_CODE_FILE_CORRUPTED
;
goto
_err
;
goto
_err
;
}
}
n
=
taosReadFile
(
pFD
,
pData
,
size
);
// data =========
if
(
n
<
0
)
{
tsdbDataFileName
(
pTsdb
,
pSet
->
diskId
,
pSet
->
fid
,
pSet
->
pDataF
,
fname
);
if
(
taosStatFile
(
fname
,
&
size
,
NULL
))
{
code
=
TAOS_SYSTEM_ERROR
(
errno
);
code
=
TAOS_SYSTEM_ERROR
(
errno
);
goto
_err
;
goto
_err
;
}
}
if
(
size
<
pSet
->
pDataF
->
size
)
{
code
=
TSDB_CODE_FILE_CORRUPTED
;
goto
_err
;
}
else
if
(
size
>
pSet
->
pDataF
->
size
)
{
code
=
tsdbDFileRollback
(
pTsdb
,
pSet
,
TSDB_DATA_FILE
);
if
(
code
)
goto
_err
;
}
if
(
!
taosCheckChecksumWhole
(
pData
,
size
))
{
// last ===========
tsdbLastFileName
(
pTsdb
,
pSet
->
diskId
,
pSet
->
fid
,
pSet
->
pLastF
,
fname
);
if
(
taosStatFile
(
fname
,
&
size
,
NULL
))
{
code
=
TAOS_SYSTEM_ERROR
(
errno
);
goto
_err
;
}
if
(
size
!=
pSet
->
pLastF
->
size
)
{
code
=
TSDB_CODE_FILE_CORRUPTED
;
code
=
TSDB_CODE_FILE_CORRUPTED
;
goto
_err
;
goto
_err
;
}
}
taosCloseFile
(
&
pFD
);
// sma =============
tsdbSmaFileName
(
pTsdb
,
pSet
->
diskId
,
pSet
->
fid
,
pSet
->
pSmaF
,
fname
);
if
(
taosStatFile
(
fname
,
&
size
,
NULL
))
{
code
=
TAOS_SYSTEM_ERROR
(
errno
);
goto
_err
;
}
if
(
size
<
pSet
->
pSmaF
->
size
)
{
code
=
TSDB_CODE_FILE_CORRUPTED
;
goto
_err
;
}
else
if
(
size
>
pSet
->
pSmaF
->
size
)
{
code
=
tsdbDFileRollback
(
pTsdb
,
pSet
,
TSDB_SMA_FILE
);
if
(
code
)
goto
_err
;
}
}
// decode
{
tGetFSState
(
pData
,
pState
);
// remove those invalid files (todo)
}
}
if
(
pData
)
taosMemoryFree
(
pData
);
return
code
;
return
code
;
_err:
_err:
tsdbError
(
"vgId:%d tsdb load current state failed since %s"
,
TD_VID
(
pFS
->
pTsdb
->
pVnode
),
tstrerror
(
code
));
tsdbError
(
"vgId:%d tsdb scan and try fix fs failed since %s"
,
TD_VID
(
pTsdb
->
pVnode
),
tstrerror
(
code
));
if
(
pData
)
taosMemoryFree
(
pData
);
return
code
;
return
code
;
}
}
static
int32_t
tsdbApplyDFileSetChange
(
STsdbFS
*
pFS
,
SDFileSet
*
pFrom
,
SDFileSet
*
pTo
)
{
int32_t
tDFileSetCmprFn
(
const
void
*
p1
,
const
void
*
p2
)
{
if
(((
SDFileSet
*
)
p1
)
->
fid
<
((
SDFileSet
*
)
p2
)
->
fid
)
{
return
-
1
;
}
else
if
(((
SDFileSet
*
)
p1
)
->
fid
>
((
SDFileSet
*
)
p2
)
->
fid
)
{
return
1
;
}
return
0
;
}
static
int32_t
tsdbRecoverFS
(
STsdb
*
pTsdb
,
uint8_t
*
pData
,
int64_t
nData
)
{
int32_t
code
=
0
;
int32_t
code
=
0
;
char
fname
[
TSDB_FILENAME_LEN
];
int8_t
hasDel
;
uint32_t
nSet
;
int32_t
n
;
// SDelFile
n
=
0
;
n
+=
tGetI8
(
pData
+
n
,
&
hasDel
);
if
(
hasDel
)
{
pTsdb
->
fs
.
pDelFile
=
(
SDelFile
*
)
taosMemoryMalloc
(
sizeof
(
SDelFile
));
if
(
pTsdb
->
fs
.
pDelFile
==
NULL
)
{
code
=
TSDB_CODE_OUT_OF_MEMORY
;
goto
_err
;
}
if
(
pFrom
&&
pTo
)
{
pTsdb
->
fs
.
pDelFile
->
nRef
=
1
;
bool
isSameDisk
=
(
pFrom
->
diskId
.
level
==
pTo
->
diskId
.
level
)
&&
(
pFrom
->
diskId
.
id
==
pTo
->
diskId
.
id
);
n
+=
tGetDelFile
(
pData
+
n
,
pTsdb
->
fs
.
pDelFile
);
}
else
{
pTsdb
->
fs
.
pDelFile
=
NULL
;
}
// SArray<SDFileSet>
taosArrayClear
(
pTsdb
->
fs
.
aDFileSet
);
n
+=
tGetU32v
(
pData
+
n
,
&
nSet
);
for
(
uint32_t
iSet
=
0
;
iSet
<
nSet
;
iSet
++
)
{
SDFileSet
fSet
;
// head
// head
if
(
isSameDisk
&&
pFrom
->
pHeadF
->
commitID
==
pTo
->
pHeadF
->
commitID
)
{
fSet
.
pHeadF
=
(
SHeadFile
*
)
taosMemoryCalloc
(
1
,
sizeof
(
SHeadFile
));
ASSERT
(
pFrom
->
pHeadF
->
size
==
pTo
->
pHeadF
->
size
);
if
(
fSet
.
pHeadF
==
NULL
)
{
ASSERT
(
pFrom
->
pHeadF
->
offset
==
pTo
->
pHeadF
->
offset
);
code
=
TSDB_CODE_OUT_OF_MEMORY
;
}
else
{
goto
_err
;
tsdbHeadFileName
(
pFS
->
pTsdb
,
pFrom
->
diskId
,
pFrom
->
fid
,
pFrom
->
pHeadF
,
fname
);
taosRemoveFile
(
fname
);
}
}
fSet
.
pHeadF
->
nRef
=
1
;
// data
// data
if
(
isSameDisk
&&
pFrom
->
pDataF
->
commitID
==
pTo
->
pDataF
->
commitID
)
{
fSet
.
pDataF
=
(
SDataFile
*
)
taosMemoryCalloc
(
1
,
sizeof
(
SDataFile
));
if
(
pFrom
->
pDataF
->
size
>
pTo
->
pDataF
->
size
)
{
if
(
fSet
.
pDataF
==
NULL
)
{
code
=
tsdbDFileRollback
(
pFS
->
pTsdb
,
pTo
,
TSDB_DATA_FILE
);
code
=
TSDB_CODE_OUT_OF_MEMORY
;
if
(
code
)
goto
_err
;
goto
_err
;
}
}
else
{
tsdbDataFileName
(
pFS
->
pTsdb
,
pFrom
->
diskId
,
pFrom
->
fid
,
pFrom
->
pDataF
,
fname
);
taosRemoveFile
(
fname
);
}
}
fSet
.
pDataF
->
nRef
=
1
;
// last
// last
if
(
isSameDisk
&&
pFrom
->
pLastF
->
commitID
==
pTo
->
pLastF
->
commitID
)
{
fSet
.
pLastF
=
(
SLastFile
*
)
taosMemoryCalloc
(
1
,
sizeof
(
SLastFile
));
if
(
pFrom
->
pLastF
->
size
>
pTo
->
pLastF
->
size
)
{
if
(
fSet
.
pLastF
==
NULL
)
{
code
=
tsdbDFileRollback
(
pFS
->
pTsdb
,
pTo
,
TSDB_LAST_FILE
);
code
=
TSDB_CODE_OUT_OF_MEMORY
;
if
(
code
)
goto
_err
;
goto
_err
;
}
}
else
{
tsdbLastFileName
(
pFS
->
pTsdb
,
pFrom
->
diskId
,
pFrom
->
fid
,
pFrom
->
pLastF
,
fname
);
taosRemoveFile
(
fname
);
}
}
fSet
.
pLastF
->
nRef
=
1
;
// sma
// sma
if
(
isSameDisk
&&
pFrom
->
pSmaF
->
commitID
==
pTo
->
pSmaF
->
commitID
)
{
fSet
.
pSmaF
=
(
SSmaFile
*
)
taosMemoryCalloc
(
1
,
sizeof
(
SSmaFile
));
if
(
pFrom
->
pSmaF
->
size
>
pTo
->
pSmaF
->
size
)
{
if
(
fSet
.
pSmaF
==
NULL
)
{
code
=
tsdbDFileRollback
(
pFS
->
pTsdb
,
pTo
,
TSDB_SMA_FILE
);
code
=
TSDB_CODE_OUT_OF_MEMORY
;
if
(
code
)
goto
_err
;
goto
_err
;
}
}
else
{
tsdbSmaFileName
(
pFS
->
pTsdb
,
pFrom
->
diskId
,
pFrom
->
fid
,
pFrom
->
pSmaF
,
fname
);
taosRemoveFile
(
fname
);
}
}
}
else
if
(
pFrom
)
{
fSet
.
pSmaF
->
nRef
=
1
;
// head
tsdbHeadFileName
(
pFS
->
pTsdb
,
pFrom
->
diskId
,
pFrom
->
fid
,
pFrom
->
pHeadF
,
fname
);
taosRemoveFile
(
fname
);
// data
tsdbDataFileName
(
pFS
->
pTsdb
,
pFrom
->
diskId
,
pFrom
->
fid
,
pFrom
->
pDataF
,
fname
);
taosRemoveFile
(
fname
);
// last
n
+=
tGetDFileSet
(
pData
+
n
,
&
fSet
);
tsdbLastFileName
(
pFS
->
pTsdb
,
pFrom
->
diskId
,
pFrom
->
fid
,
pFrom
->
pLastF
,
fname
);
taosRemoveFile
(
fname
);
// fsm
if
(
taosArrayPush
(
pTsdb
->
fs
.
aDFileSet
,
&
fSet
)
==
NULL
)
{
tsdbSmaFileName
(
pFS
->
pTsdb
,
pFrom
->
diskId
,
pFrom
->
fid
,
pFrom
->
pSmaF
,
fname
);
code
=
TSDB_CODE_OUT_OF_MEMORY
;
taosRemoveFile
(
fname
);
goto
_err
;
}
}
}
ASSERT
(
n
+
sizeof
(
TSCKSUM
)
==
nData
);
return
code
;
return
code
;
_err:
_err:
tsdbError
(
"vgId:%d tsdb apply disk file set change failed since %s"
,
TD_VID
(
pFS
->
pTsdb
->
pVnode
),
tstrerror
(
code
));
return
code
;
return
code
;
}
}
static
int32_t
tsdbApplyDelFileChange
(
STsdbFS
*
pFS
,
SDelFile
*
pFrom
,
SDelFile
*
pTo
)
{
// EXPOSED APIS ====================================================================================
int32_t
tsdbFSOpen
(
STsdb
*
pTsdb
)
{
int32_t
code
=
0
;
int32_t
code
=
0
;
// open handle
pTsdb
->
fs
.
pDelFile
=
NULL
;
pTsdb
->
fs
.
aDFileSet
=
taosArrayInit
(
0
,
sizeof
(
SDFileSet
));
if
(
pTsdb
->
fs
.
aDFileSet
==
NULL
)
{
code
=
TSDB_CODE_OUT_OF_MEMORY
;
goto
_err
;
}
// load fs or keep empty
char
fname
[
TSDB_FILENAME_LEN
];
char
fname
[
TSDB_FILENAME_LEN
];
if
(
pFrom
&&
pTo
)
{
snprintf
(
fname
,
TSDB_FILENAME_LEN
-
1
,
"%s%s%s%sCURRENT"
,
tfsGetPrimaryPath
(
pTsdb
->
pVnode
->
pTfs
),
TD_DIRSEP
,
if
(
!
tsdbDelFileIsSame
(
pFrom
,
pTo
))
{
pTsdb
->
path
,
TD_DIRSEP
);
tsdbDelFileName
(
pFS
->
pTsdb
,
pFrom
,
fname
);
if
(
taosRemoveFile
(
fname
)
<
0
)
{
if
(
!
taosCheckExistFile
(
fname
))
{
// empty one
code
=
tsdbGnrtCurrent
(
pTsdb
,
&
pTsdb
->
fs
,
fname
);
if
(
code
)
goto
_err
;
}
else
{
// read
TdFilePtr
pFD
=
taosOpenFile
(
fname
,
TD_FILE_READ
);
if
(
pFD
==
NULL
)
{
code
=
TAOS_SYSTEM_ERROR
(
errno
);
code
=
TAOS_SYSTEM_ERROR
(
errno
);
goto
_err
;
goto
_err
;
}
}
int64_t
size
;
if
(
taosFStatFile
(
pFD
,
&
size
,
NULL
)
<
0
)
{
code
=
TAOS_SYSTEM_ERROR
(
errno
);
taosCloseFile
(
&
pFD
);
goto
_err
;
}
}
}
else
if
(
pFrom
)
{
tsdbDelFileName
(
pFS
->
pTsdb
,
pFrom
,
fname
);
uint8_t
*
pData
=
taosMemoryMalloc
(
size
);
if
(
taosRemoveFile
(
fname
)
<
0
)
{
if
(
pData
==
NULL
)
{
code
=
TSDB_CODE_OUT_OF_MEMORY
;
taosCloseFile
(
&
pFD
);
goto
_err
;
}
int64_t
n
=
taosReadFile
(
pFD
,
pData
,
size
);
if
(
n
<
0
)
{
code
=
TAOS_SYSTEM_ERROR
(
errno
);
code
=
TAOS_SYSTEM_ERROR
(
errno
);
taosMemoryFree
(
pData
);
taosCloseFile
(
&
pFD
);
goto
_err
;
goto
_err
;
}
}
}
else
{
// do nothing
if
(
!
taosCheckChecksumWhole
(
pData
,
size
))
{
code
=
TSDB_CODE_FILE_CORRUPTED
;
taosMemoryFree
(
pData
);
taosCloseFile
(
&
pFD
);
goto
_err
;
}
taosCloseFile
(
&
pFD
);
// recover fs
code
=
tsdbRecoverFS
(
pTsdb
,
pData
,
size
);
if
(
code
)
{
taosMemoryFree
(
pData
);
goto
_err
;
}
taosMemoryFree
(
pData
);
}
}
// scan and fix FS
code
=
tsdbScanAndTryFixFS
(
pTsdb
);
if
(
code
)
goto
_err
;
return
code
;
return
code
;
_err:
_err:
tsdbError
(
"vgId:%d tsdb
apply del file change failed since %s"
,
TD_VID
(
pFS
->
pTsdb
->
pVnode
),
tstrerror
(
code
));
tsdbError
(
"vgId:%d tsdb
fs open failed since %s"
,
TD_VID
(
pTsdb
->
pVnode
),
tstrerror
(
code
));
return
code
;
return
code
;
}
}
static
int32_t
tsdbFSApplyDiskChange
(
STsdbFS
*
pFS
,
STsdbFSState
*
pFrom
,
STsdbFSState
*
pTo
)
{
int32_t
tsdbFSClose
(
STsdb
*
pTsdb
)
{
int32_t
code
=
0
;
int32_t
code
=
0
;
int32_t
iFrom
=
0
;
int32_t
nFrom
=
taosArrayGetSize
(
pFrom
->
aDFileSet
);
int32_t
iTo
=
0
;
int32_t
nTo
=
taosArrayGetSize
(
pTo
->
aDFileSet
);
SDFileSet
*
pDFileSetFrom
;
SDFileSet
*
pDFileSetTo
;
// SDelFile
if
(
pTsdb
->
fs
.
pDelFile
)
{
code
=
tsdbApplyDelFileChange
(
pFS
,
pFrom
->
pDelFile
,
pTo
->
pDelFile
);
ASSERT
(
pTsdb
->
fs
.
pDelFile
->
nRef
==
1
);
if
(
code
)
goto
_err
;
taosMemoryFree
(
pTsdb
->
fs
.
pDelFile
);
}
// SDFileSet
for
(
int32_t
iSet
=
0
;
iSet
<
taosArrayGetSize
(
pTsdb
->
fs
.
aDFileSet
);
iSet
++
)
{
while
(
iFrom
<
nFrom
&&
iTo
<
nTo
)
{
SDFileSet
*
pSet
=
(
SDFileSet
*
)
taosArrayGet
(
pTsdb
->
fs
.
aDFileSet
,
iSet
);
pDFileSetFrom
=
(
SDFileSet
*
)
taosArrayGet
(
pFrom
->
aDFileSet
,
iFrom
);
pDFileSetTo
=
(
SDFileSet
*
)
taosArrayGet
(
pTo
->
aDFileSet
,
iTo
);
if
(
pDFileSetFrom
->
fid
==
pDFileSetTo
->
fid
)
{
// head
code
=
tsdbApplyDFileSetChange
(
pFS
,
pDFileSetFrom
,
pDFileSetTo
);
ASSERT
(
pSet
->
pHeadF
->
nRef
==
1
);
if
(
code
)
goto
_err
;
taosMemoryFree
(
pSet
->
pHeadF
)
;
iFrom
++
;
// data
iTo
++
;
ASSERT
(
pSet
->
pDataF
->
nRef
==
1
);
}
else
if
(
pDFileSetFrom
->
fid
<
pDFileSetTo
->
fid
)
{
taosMemoryFree
(
pSet
->
pDataF
);
code
=
tsdbApplyDFileSetChange
(
pFS
,
pDFileSetFrom
,
NULL
);
if
(
code
)
goto
_err
;
iFrom
++
;
// last
}
else
{
ASSERT
(
pSet
->
pLastF
->
nRef
==
1
);
iTo
++
;
taosMemoryFree
(
pSet
->
pLastF
);
// sma
ASSERT
(
pSet
->
pSmaF
->
nRef
==
1
);
taosMemoryFree
(
pSet
->
pSmaF
);
}
taosArrayClear
(
pTsdb
->
fs
.
aDFileSet
);
return
code
;
}
int32_t
tsdbFSCopy
(
STsdb
*
pTsdb
,
STsdbFS
*
pFS
)
{
int32_t
code
=
0
;
pFS
->
pDelFile
=
NULL
;
pFS
->
aDFileSet
=
taosArrayInit
(
taosArrayGetSize
(
pTsdb
->
fs
.
aDFileSet
),
sizeof
(
SDFileSet
));
if
(
pFS
->
aDFileSet
==
NULL
)
{
code
=
TSDB_CODE_OUT_OF_MEMORY
;
goto
_exit
;
}
if
(
pTsdb
->
fs
.
pDelFile
)
{
pFS
->
pDelFile
=
(
SDelFile
*
)
taosMemoryMalloc
(
sizeof
(
SDelFile
));
if
(
pFS
->
pDelFile
==
NULL
)
{
code
=
TSDB_CODE_OUT_OF_MEMORY
;
goto
_exit
;
}
}
*
pFS
->
pDelFile
=
*
pTsdb
->
fs
.
pDelFile
;
}
}
while
(
iFrom
<
nFrom
)
{
for
(
int32_t
iSet
=
0
;
iSet
<
taosArrayGetSize
(
pTsdb
->
fs
.
aDFileSet
);
iSet
++
)
{
pDFileSetFrom
=
(
SDFileSet
*
)
taosArrayGet
(
pFrom
->
aDFileSet
,
iFrom
);
SDFileSet
*
pSet
=
(
SDFileSet
*
)
taosArrayGet
(
pTsdb
->
fs
.
aDFileSet
,
iSet
);
code
=
tsdbApplyDFileSetChange
(
pFS
,
pDFileSetFrom
,
NULL
);
SDFileSet
fSet
=
{.
diskId
=
pSet
->
diskId
,
.
fid
=
pSet
->
fid
};
if
(
code
)
goto
_err
;
iFrom
++
;
// head
fSet
.
pHeadF
=
(
SHeadFile
*
)
taosMemoryMalloc
(
sizeof
(
SHeadFile
));
if
(
fSet
.
pHeadF
==
NULL
)
{
code
=
TSDB_CODE_OUT_OF_MEMORY
;
goto
_exit
;
}
}
fSet
.
pHeadF
->
nRef
=
0
;
fSet
.
pHeadF
->
commitID
=
pSet
->
pHeadF
->
commitID
;
fSet
.
pHeadF
->
size
=
pSet
->
pHeadF
->
size
;
fSet
.
pHeadF
->
offset
=
pSet
->
pHeadF
->
offset
;
#if 0
// data
// do noting
fSet
.
pDataF
=
(
SDataFile
*
)
taosMemoryMalloc
(
sizeof
(
SDataFile
));
while (iTo < nTo) {
if
(
fSet
.
pDataF
==
NULL
)
{
pDFileSetTo = (SDFileSet *)taosArrayGetP(pTo->aDFileSet, iTo);
code
=
TSDB_CODE_OUT_OF_MEMORY
;
code = tsdbApplyDFileSetChange(pFS, NULL, pDFileSetTo);
goto
_exit
;
if (code) goto _err;
}
fSet
.
pDataF
->
nRef
=
0
;
fSet
.
pDataF
->
commitID
=
pSet
->
pDataF
->
commitID
;
fSet
.
pDataF
->
size
=
pSet
->
pDataF
->
size
;
// data
fSet
.
pLastF
=
(
SLastFile
*
)
taosMemoryMalloc
(
sizeof
(
SLastFile
));
if
(
fSet
.
pLastF
==
NULL
)
{
code
=
TSDB_CODE_OUT_OF_MEMORY
;
goto
_exit
;
}
fSet
.
pLastF
->
nRef
=
0
;
fSet
.
pLastF
->
commitID
=
pSet
->
pLastF
->
commitID
;
fSet
.
pLastF
->
size
=
pSet
->
pLastF
->
size
;
// last
fSet
.
pSmaF
=
(
SSmaFile
*
)
taosMemoryMalloc
(
sizeof
(
SSmaFile
));
if
(
fSet
.
pSmaF
==
NULL
)
{
code
=
TSDB_CODE_OUT_OF_MEMORY
;
goto
_exit
;
}
fSet
.
pSmaF
->
nRef
=
0
;
fSet
.
pSmaF
->
commitID
=
pSet
->
pSmaF
->
commitID
;
fSet
.
pSmaF
->
size
=
pSet
->
pSmaF
->
size
;
iTo++;
if
(
taosArrayPush
(
pFS
->
aDFileSet
,
&
fSet
)
==
NULL
)
{
code
=
TSDB_CODE_OUT_OF_MEMORY
;
goto
_exit
;
}
}
#endif
}
_exit:
return
code
;
}
int32_t
tsdbFSRollback
(
STsdbFS
*
pFS
)
{
int32_t
code
=
0
;
ASSERT
(
0
);
return
code
;
return
code
;
_err:
_err:
tsdbError
(
"vgId:%d tsdb fs apply disk change failed sicne %s"
,
TD_VID
(
pFS
->
pTsdb
->
pVnode
),
tstrerror
(
code
));
return
code
;
return
code
;
}
}
static
void
tsdbFSDestroy
(
STsdbFS
*
pFS
)
{
int32_t
tsdbFSUpsertDelFile
(
STsdbFS
*
pFS
,
SDelFile
*
pDelFile
)
{
if
(
pFS
)
{
int32_t
code
=
0
;
if
(
pFS
->
nState
)
{
taosArrayDestroy
(
pFS
->
nState
->
aDFileSet
);
taosMemoryFree
(
pFS
->
nState
);
}
if
(
pFS
->
cState
)
{
if
(
pFS
->
pDelFile
==
NULL
)
{
taosArrayDestroy
(
pFS
->
cState
->
aDFileSet
);
pFS
->
pDelFile
=
(
SDelFile
*
)
taosMemoryMalloc
(
sizeof
(
SDelFile
));
taosMemoryFree
(
pFS
->
cState
);
if
(
pFS
->
pDelFile
==
NULL
)
{
code
=
TSDB_CODE_OUT_OF_MEMORY
;
goto
_exit
;
}
}
taosMemoryFree
(
pFS
);
}
}
// TODO
*
pFS
->
pDelFile
=
*
pDelFile
;
_exit:
return
code
;
}
}
static
int32_t
tsdbFSCreate
(
STsdb
*
pTsdb
,
STsdbFS
**
ppFS
)
{
int32_t
tsdbFSUpsertFSet
(
STsdbFS
*
pFS
,
SDFileSet
*
pSet
)
{
int32_t
code
=
0
;
int32_t
code
=
0
;
STsdbFS
*
pFS
=
NULL
;
int32_t
idx
=
taosArraySearchIdx
(
pFS
->
aDFileSet
,
pSet
,
tDFileSetCmprFn
,
TD_GE
);
if
(
idx
<
0
)
{
idx
=
taosArrayGetSize
(
pFS
->
aDFileSet
);
}
else
{
SDFileSet
*
pDFileSet
=
(
SDFileSet
*
)
taosArrayGet
(
pFS
->
aDFileSet
,
idx
);
int32_t
c
=
tDFileSetCmprFn
(
pSet
,
pDFileSet
);
if
(
c
==
0
)
{
*
pDFileSet
->
pHeadF
=
*
pSet
->
pHeadF
;
*
pDFileSet
->
pDataF
=
*
pSet
->
pDataF
;
*
pDFileSet
->
pLastF
=
*
pSet
->
pLastF
;
*
pDFileSet
->
pSmaF
=
*
pSet
->
pSmaF
;
goto
_exit
;
}
}
SDFileSet
fSet
=
{.
diskId
=
pSet
->
diskId
,
.
fid
=
pSet
->
fid
};
pFS
=
(
STsdbFS
*
)
taosMemoryCalloc
(
1
,
sizeof
(
*
pFS
));
// head
if
(
pFS
==
NULL
)
{
fSet
.
pHeadF
=
(
SHeadFile
*
)
taosMemoryMalloc
(
sizeof
(
SHeadFile
));
if
(
fSet
.
pHeadF
==
NULL
)
{
code
=
TSDB_CODE_OUT_OF_MEMORY
;
code
=
TSDB_CODE_OUT_OF_MEMORY
;
goto
_e
rr
;
goto
_e
xit
;
}
}
pFS
->
pTsdb
=
pTsdb
;
*
fSet
.
pHeadF
=
*
pSet
->
pHeadF
;
pFS
->
cState
=
(
STsdbFSState
*
)
taosMemoryCalloc
(
1
,
sizeof
(
STsdbFSState
));
// data
if
(
pFS
->
cState
==
NULL
)
{
fSet
.
pDataF
=
(
SDataFile
*
)
taosMemoryMalloc
(
sizeof
(
SDataFile
));
if
(
fSet
.
pDataF
==
NULL
)
{
code
=
TSDB_CODE_OUT_OF_MEMORY
;
code
=
TSDB_CODE_OUT_OF_MEMORY
;
goto
_e
rr
;
goto
_e
xit
;
}
}
pFS
->
cState
->
aDFileSet
=
taosArrayInit
(
0
,
sizeof
(
SDFileSet
));
*
fSet
.
pDataF
=
*
pSet
->
pDataF
;
if
(
pFS
->
cState
->
aDFileSet
==
NULL
)
{
// data
fSet
.
pLastF
=
(
SLastFile
*
)
taosMemoryMalloc
(
sizeof
(
SLastFile
));
if
(
fSet
.
pLastF
==
NULL
)
{
code
=
TSDB_CODE_OUT_OF_MEMORY
;
code
=
TSDB_CODE_OUT_OF_MEMORY
;
goto
_e
rr
;
goto
_e
xit
;
}
}
*
fSet
.
pLastF
=
*
pSet
->
pLastF
;
pFS
->
nState
=
(
STsdbFSState
*
)
taosMemoryCalloc
(
1
,
sizeof
(
STsdbFSState
));
// last
if
(
pFS
->
nState
==
NULL
)
{
fSet
.
pSmaF
=
(
SSmaFile
*
)
taosMemoryMalloc
(
sizeof
(
SSmaFile
));
if
(
fSet
.
pSmaF
==
NULL
)
{
code
=
TSDB_CODE_OUT_OF_MEMORY
;
code
=
TSDB_CODE_OUT_OF_MEMORY
;
goto
_e
rr
;
goto
_e
xit
;
}
}
pFS
->
nState
->
aDFileSet
=
taosArrayInit
(
0
,
sizeof
(
SDFileSet
));
*
fSet
.
pSmaF
=
*
pSet
->
pSmaF
;
if
(
pFS
->
nState
->
aDFileSet
==
NULL
)
{
if
(
taosArrayInsert
(
pFS
->
aDFileSet
,
idx
,
&
fSet
)
==
NULL
)
{
code
=
TSDB_CODE_OUT_OF_MEMORY
;
code
=
TSDB_CODE_OUT_OF_MEMORY
;
goto
_exit
;
}
_exit:
return
code
;
}
int32_t
tsdbFSCommit1
(
STsdb
*
pTsdb
,
STsdbFS
*
pFSNew
)
{
int32_t
code
=
0
;
char
tfname
[
TSDB_FILENAME_LEN
];
char
fname
[
TSDB_FILENAME_LEN
];
snprintf
(
tfname
,
TSDB_FILENAME_LEN
-
1
,
"%s%s%s%sCURRENT.t"
,
tfsGetPrimaryPath
(
pTsdb
->
pVnode
->
pTfs
),
TD_DIRSEP
,
pTsdb
->
path
,
TD_DIRSEP
);
snprintf
(
fname
,
TSDB_FILENAME_LEN
-
1
,
"%s%s%s%sCURRENT"
,
tfsGetPrimaryPath
(
pTsdb
->
pVnode
->
pTfs
),
TD_DIRSEP
,
pTsdb
->
path
,
TD_DIRSEP
);
// gnrt CURRENT.t
code
=
tsdbGnrtCurrent
(
pTsdb
,
pFSNew
,
tfname
);
if
(
code
)
goto
_err
;
// rename
code
=
taosRenameFile
(
tfname
,
fname
);
if
(
code
)
{
code
=
TAOS_SYSTEM_ERROR
(
code
);
goto
_err
;
goto
_err
;
}
}
*
ppFS
=
pFS
;
return
code
;
return
code
;
_err:
_err:
tsdbError
(
"vgId:%d tsdb fs create failed since %s"
,
TD_VID
(
pTsdb
->
pVnode
),
tstrerror
(
code
));
tsdbError
(
"vgId:%d tsdb fs commit phase 1 failed since %s"
,
TD_VID
(
pTsdb
->
pVnode
),
tstrerror
(
code
));
tsdbFSDestroy
(
pFS
);
*
ppFS
=
NULL
;
return
code
;
return
code
;
}
}
static
int32_t
tsdbScanAndTryFixFS
(
STsdbFS
*
pFS
,
int8_t
deepScan
)
{
int32_t
tsdbFSCommit2
(
STsdb
*
pTsdb
,
STsdbFS
*
pFSNew
)
{
int32_t
code
=
0
;
int32_t
code
=
0
;
STsdb
*
pTsdb
=
pFS
->
pTsdb
;
int32_t
nRef
;
STfs
*
pTfs
=
pTsdb
->
pVnode
->
pTfs
;
int64_t
size
;
char
fname
[
TSDB_FILENAME_LEN
];
char
fname
[
TSDB_FILENAME_LEN
];
char
pHdr
[
TSDB_FHDR_SIZE
];
TdFilePtr
pFD
;
// SDelFile
// del
if
(
pFS
->
cState
->
pDelFile
)
{
if
(
pFSNew
->
pDelFile
)
{
tsdbDelFileName
(
pTsdb
,
pFS
->
cState
->
pDelFile
,
fname
);
SDelFile
*
pDelFile
=
pTsdb
->
fs
.
pDelFile
;
if
(
taosStatFile
(
fname
,
&
size
,
NULL
))
{
code
=
TAOS_SYSTEM_ERROR
(
errno
);
if
(
pDelFile
==
NULL
||
(
pDelFile
->
commitID
!=
pFSNew
->
pDelFile
->
commitID
))
{
pTsdb
->
fs
.
pDelFile
=
(
SDelFile
*
)
taosMemoryMalloc
(
sizeof
(
SDelFile
));
if
(
pTsdb
->
fs
.
pDelFile
==
NULL
)
{
code
=
TSDB_CODE_OUT_OF_MEMORY
;
goto
_err
;
goto
_err
;
}
}
if
(
size
!=
pFS
->
cState
->
pDelFile
->
size
)
{
*
pTsdb
->
fs
.
pDelFile
=
*
pFSNew
->
pDelFile
;
code
=
TSDB_CODE_FILE_CORRUPTED
;
pTsdb
->
fs
.
pDelFile
->
nRef
=
1
;
goto
_err
;
if
(
pDelFile
)
{
nRef
=
atomic_sub_fetch_32
(
&
pDelFile
->
nRef
,
1
);
if
(
nRef
==
0
)
{
tsdbDelFileName
(
pTsdb
,
pDelFile
,
fname
);
taosRemoveFile
(
fname
);
taosMemoryFree
(
pDelFile
);
}
}
}
}
else
{
ASSERT
(
pTsdb
->
fs
.
pDelFile
==
NULL
);
}
}
if
(
deepScan
)
{
// data
// TODO
int32_t
iOld
=
0
;
int32_t
iNew
=
0
;
while
(
true
)
{
int32_t
nOld
=
taosArrayGetSize
(
pTsdb
->
fs
.
aDFileSet
);
int32_t
nNew
=
taosArrayGetSize
(
pFSNew
->
aDFileSet
);
SDFileSet
fSet
;
int8_t
sameDisk
;
if
(
iOld
>=
nOld
&&
iNew
>=
nNew
)
break
;
SDFileSet
*
pSetOld
=
(
iOld
<
nOld
)
?
taosArrayGet
(
pTsdb
->
fs
.
aDFileSet
,
iOld
)
:
NULL
;
SDFileSet
*
pSetNew
=
(
iNew
<
nNew
)
?
taosArrayGet
(
pFSNew
->
aDFileSet
,
iNew
)
:
NULL
;
if
(
pSetOld
&&
pSetNew
)
{
if
(
pSetOld
->
fid
==
pSetNew
->
fid
)
{
goto
_merge_old_and_new
;
}
else
if
(
pSetOld
->
fid
<
pSetNew
->
fid
)
{
goto
_remove_old
;
}
else
{
goto
_add_new
;
}
}
}
else
if
(
pSetOld
)
{
goto
_remove_old
;
}
else
{
goto
_add_new
;
}
}
// SArray<SDFileSet>
_merge_old_and_new:
for
(
int32_t
iSet
=
0
;
iSet
<
taosArrayGetSize
(
pFS
->
cState
->
aDFileSet
);
iSet
++
)
{
sameDisk
=
((
pSetOld
->
diskId
.
level
==
pSetNew
->
diskId
.
level
)
&&
(
pSetOld
->
diskId
.
id
==
pSetNew
->
diskId
.
id
));
SDFileSet
*
pDFileSet
=
(
SDFileSet
*
)
taosArrayGet
(
pFS
->
cState
->
aDFileSet
,
iSet
);
// head =========
// head
tsdbHeadFileName
(
pTsdb
,
pDFileSet
->
diskId
,
pDFileSet
->
fid
,
pDFileSet
->
pHeadF
,
fname
);
fSet
.
pHeadF
=
pSetOld
->
pHeadF
;
if
(
taosStatFile
(
fname
,
&
size
,
NULL
))
{
if
((
!
sameDisk
)
||
(
pSetOld
->
pHeadF
->
commitID
!=
pSetNew
->
pHeadF
->
commitID
))
{
code
=
TAOS_SYSTEM_ERROR
(
errno
);
pSetOld
->
pHeadF
=
(
SHeadFile
*
)
taosMemoryMalloc
(
sizeof
(
SHeadFile
));
if
(
pSetOld
->
pHeadF
==
NULL
)
{
code
=
TSDB_CODE_OUT_OF_MEMORY
;
goto
_err
;
goto
_err
;
}
}
*
pSetOld
->
pHeadF
=
*
pSetNew
->
pHeadF
;
pSetOld
->
pHeadF
->
nRef
=
1
;
if
(
deepScan
)
{
nRef
=
atomic_sub_fetch_32
(
&
fSet
.
pHeadF
->
nRef
,
1
);
// TODO
if
(
nRef
==
0
)
{
tsdbHeadFileName
(
pTsdb
,
pSetOld
->
diskId
,
pSetOld
->
fid
,
fSet
.
pHeadF
,
fname
);
taosRemoveFile
(
fname
);
taosMemoryFree
(
fSet
.
pHeadF
);
}
}
}
else
{
// data =========
ASSERT
(
fSet
.
pHeadF
->
size
==
pSetNew
->
pHeadF
->
size
);
tsdbDataFileName
(
pTsdb
,
pDFileSet
->
diskId
,
pDFileSet
->
fid
,
pDFileSet
->
pDataF
,
fname
);
ASSERT
(
fSet
.
pHeadF
->
offset
==
pSetNew
->
pHeadF
->
offset
);
if
(
taosStatFile
(
fname
,
&
size
,
NULL
))
{
code
=
TAOS_SYSTEM_ERROR
(
errno
);
goto
_err
;
}
}
if
(
size
<
pDFileSet
->
pDataF
->
size
)
{
// data
code
=
TSDB_CODE_FILE_CORRUPTED
;
fSet
.
pDataF
=
pSetOld
->
pDataF
;
if
((
!
sameDisk
)
||
(
pSetOld
->
pDataF
->
commitID
!=
pSetNew
->
pDataF
->
commitID
))
{
pSetOld
->
pDataF
=
(
SDataFile
*
)
taosMemoryMalloc
(
sizeof
(
SDataFile
));
if
(
pSetOld
->
pDataF
==
NULL
)
{
code
=
TSDB_CODE_OUT_OF_MEMORY
;
goto
_err
;
goto
_err
;
}
else
if
(
size
>
pDFileSet
->
pDataF
->
size
)
{
ASSERT
(
0
);
// need to rollback the file
}
}
*
pSetOld
->
pDataF
=
*
pSetNew
->
pDataF
;
pSetOld
->
pDataF
->
nRef
=
1
;
if
(
deepScan
)
{
nRef
=
atomic_sub_fetch_32
(
&
fSet
.
pDataF
->
nRef
,
1
);
// TODO
if
(
nRef
==
0
)
{
tsdbDataFileName
(
pTsdb
,
pSetOld
->
diskId
,
pSetOld
->
fid
,
fSet
.
pDataF
,
fname
);
taosRemoveFile
(
fname
);
taosMemoryFree
(
fSet
.
pDataF
);
}
}
}
else
{
// last ===========
ASSERT
(
pSetOld
->
pDataF
->
size
<=
pSetNew
->
pDataF
->
size
);
tsdbLastFileName
(
pTsdb
,
pDFileSet
->
diskId
,
pDFileSet
->
fid
,
pDFileSet
->
pLastF
,
fname
);
pSetOld
->
pDataF
->
size
=
pSetNew
->
pDataF
->
size
;
if
(
taosStatFile
(
fname
,
&
size
,
NULL
))
{
code
=
TAOS_SYSTEM_ERROR
(
errno
);
goto
_err
;
}
}
if
(
size
<
pDFileSet
->
pLastF
->
size
)
{
// last
code
=
TSDB_CODE_FILE_CORRUPTED
;
fSet
.
pLastF
=
pSetOld
->
pLastF
;
if
((
!
sameDisk
)
||
(
pSetOld
->
pLastF
->
commitID
!=
pSetNew
->
pLastF
->
commitID
))
{
pSetOld
->
pLastF
=
(
SLastFile
*
)
taosMemoryMalloc
(
sizeof
(
SLastFile
));
if
(
pSetOld
->
pLastF
==
NULL
)
{
code
=
TSDB_CODE_OUT_OF_MEMORY
;
goto
_err
;
goto
_err
;
}
else
if
(
size
>
pDFileSet
->
pLastF
->
size
)
{
ASSERT
(
0
);
// need to rollback the file
}
}
*
pSetOld
->
pLastF
=
*
pSetNew
->
pLastF
;
pSetOld
->
pLastF
->
nRef
=
1
;
if
(
deepScan
)
{
nRef
=
atomic_sub_fetch_32
(
&
fSet
.
pLastF
->
nRef
,
1
);
// TODO
if
(
nRef
==
0
)
{
tsdbLastFileName
(
pTsdb
,
pSetOld
->
diskId
,
pSetOld
->
fid
,
fSet
.
pLastF
,
fname
);
taosRemoveFile
(
fname
);
taosMemoryFree
(
fSet
.
pLastF
);
}
}
}
else
{
// sma =============
ASSERT
(
pSetOld
->
pLastF
->
size
==
pSetNew
->
pLastF
->
size
);
tsdbSmaFileName
(
pTsdb
,
pDFileSet
->
diskId
,
pDFileSet
->
fid
,
pDFileSet
->
pSmaF
,
fname
);
if
(
taosStatFile
(
fname
,
&
size
,
NULL
))
{
code
=
TAOS_SYSTEM_ERROR
(
errno
);
goto
_err
;
}
}
if
(
size
<
pDFileSet
->
pSmaF
->
size
)
{
// sma
code
=
TSDB_CODE_FILE_CORRUPTED
;
fSet
.
pSmaF
=
pSetOld
->
pSmaF
;
if
((
!
sameDisk
)
||
(
pSetOld
->
pSmaF
->
commitID
!=
pSetNew
->
pSmaF
->
commitID
))
{
pSetOld
->
pSmaF
=
(
SSmaFile
*
)
taosMemoryMalloc
(
sizeof
(
SSmaFile
));
if
(
pSetOld
->
pSmaF
==
NULL
)
{
code
=
TSDB_CODE_OUT_OF_MEMORY
;
goto
_err
;
goto
_err
;
}
else
if
(
size
>
pDFileSet
->
pSmaF
->
size
)
{
ASSERT
(
0
);
// need to rollback the file
}
}
*
pSetOld
->
pSmaF
=
*
pSetNew
->
pSmaF
;
pSetOld
->
pSmaF
->
nRef
=
1
;
if
(
deepScan
)
{
nRef
=
atomic_sub_fetch_32
(
&
fSet
.
pSmaF
->
nRef
,
1
);
// TODO
if
(
nRef
==
0
)
{
}
tsdbSmaFileName
(
pTsdb
,
pSetOld
->
diskId
,
pSetOld
->
fid
,
fSet
.
pSmaF
,
fname
);
taosRemoveFile
(
fname
);
taosMemoryFree
(
fSet
.
pSmaF
);
}
}
}
else
{
// remove those invalid files (todo)
ASSERT
(
pSetOld
->
pSmaF
->
size
<=
pSetNew
->
pSmaF
->
size
);
#if 0
pSetOld
->
pSmaF
->
size
=
pSetNew
->
pSmaF
->
size
;
STfsDir *tdir;
const STfsFile *pf;
tdir = tfsOpendir(pTfs, pTsdb->path);
if (tdir == NULL) {
code = TAOS_SYSTEM_ERROR(errno);
goto _err;
}
}
while ((pf = tfsReaddir(tdir))
) {
if
(
!
sameDisk
)
{
tfsBasename(pf, fname)
;
pSetOld
->
diskId
=
pSetNew
->
diskId
;
}
}
tfsClosedir(tdir);
iOld
++
;
#endif
iNew
++
;
continue
;
return
code
;
_remove_old:
nRef
=
atomic_sub_fetch_32
(
&
pSetOld
->
pHeadF
->
nRef
,
1
);
if
(
nRef
==
0
)
{
tsdbHeadFileName
(
pTsdb
,
pSetOld
->
diskId
,
pSetOld
->
fid
,
pSetOld
->
pHeadF
,
fname
);
taosRemoveFile
(
fname
);
taosMemoryFree
(
pSetOld
->
pHeadF
);
}
_err:
nRef
=
atomic_sub_fetch_32
(
&
pSetOld
->
pDataF
->
nRef
,
1
);
tsdbError
(
"vgId:%d tsdb scan and try fix fs failed since %s"
,
TD_VID
(
pTsdb
->
pVnode
),
tstrerror
(
code
));
if
(
nRef
==
0
)
{
return
code
;
tsdbDataFileName
(
pTsdb
,
pSetOld
->
diskId
,
pSetOld
->
fid
,
pSetOld
->
pDataF
,
fname
);
}
taosRemoveFile
(
fname
);
taosMemoryFree
(
pSetOld
->
pDataF
);
}
static
int32_t
tDFileSetCmprFn
(
const
void
*
p1
,
const
void
*
p2
)
{
nRef
=
atomic_sub_fetch_32
(
&
pSetOld
->
pLastF
->
nRef
,
1
);
if
(((
SDFileSet
*
)
p1
)
->
fid
<
((
SDFileSet
*
)
p2
)
->
fid
)
{
if
(
nRef
==
0
)
{
return
-
1
;
tsdbLastFileName
(
pTsdb
,
pSetOld
->
diskId
,
pSetOld
->
fid
,
pSetOld
->
pLastF
,
fname
)
;
}
else
if
(((
SDFileSet
*
)
p1
)
->
fid
>
((
SDFileSet
*
)
p2
)
->
fid
)
{
taosRemoveFile
(
fname
);
return
1
;
taosMemoryFree
(
pSetOld
->
pLastF
)
;
}
}
return
0
;
nRef
=
atomic_sub_fetch_32
(
&
pSetOld
->
pSmaF
->
nRef
,
1
);
}
if
(
nRef
==
0
)
{
tsdbSmaFileName
(
pTsdb
,
pSetOld
->
diskId
,
pSetOld
->
fid
,
pSetOld
->
pSmaF
,
fname
);
taosRemoveFile
(
fname
);
taosMemoryFree
(
pSetOld
->
pSmaF
);
}
// EXPOSED APIS ====================================================================================
taosArrayRemove
(
pTsdb
->
fs
.
aDFileSet
,
iOld
);
int32_t
tsdbFSOpen
(
STsdb
*
pTsdb
,
STsdbFS
**
ppFS
)
{
continue
;
int32_t
code
=
0
;
// create handle
_add_new:
code
=
tsdbFSCreate
(
pTsdb
,
ppFS
)
;
fSet
.
diskId
=
pSetNew
->
diskId
;
if
(
code
)
goto
_err
;
fSet
.
fid
=
pSetNew
->
fid
;
// load current state
// head
code
=
tsdbLoadCurrentState
(
*
ppFS
,
(
*
ppFS
)
->
cState
);
fSet
.
pHeadF
=
(
SHeadFile
*
)
taosMemoryMalloc
(
sizeof
(
SHeadFile
)
);
if
(
code
)
{
if
(
fSet
.
pHeadF
==
NULL
)
{
tsdbFSDestroy
(
*
ppFS
)
;
code
=
TSDB_CODE_OUT_OF_MEMORY
;
goto
_err
;
goto
_err
;
}
}
*
fSet
.
pHeadF
=
*
pSetNew
->
pHeadF
;
fSet
.
pHeadF
->
nRef
=
1
;
// scan and fix FS
// data
code
=
tsdbScanAndTryFixFS
(
*
ppFS
,
0
);
fSet
.
pDataF
=
(
SDataFile
*
)
taosMemoryMalloc
(
sizeof
(
SDataFile
)
);
if
(
code
)
{
if
(
fSet
.
pDataF
==
NULL
)
{
tsdbFSDestroy
(
*
ppFS
)
;
code
=
TSDB_CODE_OUT_OF_MEMORY
;
goto
_err
;
goto
_err
;
}
}
*
fSet
.
pDataF
=
*
pSetNew
->
pDataF
;
fSet
.
pDataF
->
nRef
=
1
;
return
code
;
// last
fSet
.
pLastF
=
(
SLastFile
*
)
taosMemoryMalloc
(
sizeof
(
SLastFile
));
_err:
if
(
fSet
.
pLastF
==
NULL
)
{
*
ppFS
=
NULL
;
code
=
TSDB_CODE_OUT_OF_MEMORY
;
tsdbError
(
"vgId:%d tsdb fs open failed since %s"
,
TD_VID
(
pTsdb
->
pVnode
),
tstrerror
(
code
));
goto
_err
;
return
code
;
}
int32_t
tsdbFSClose
(
STsdbFS
*
pFS
)
{
int32_t
code
=
0
;
tsdbFSDestroy
(
pFS
);
return
code
;
}
int32_t
tsdbFSBegin
(
STsdbFS
*
pFS
)
{
int32_t
code
=
0
;
// SDelFile
pFS
->
nState
->
pDelFile
=
NULL
;
if
(
pFS
->
cState
->
pDelFile
)
{
pFS
->
nState
->
delFile
=
pFS
->
cState
->
delFile
;
pFS
->
nState
->
pDelFile
=
&
pFS
->
nState
->
delFile
;
}
}
*
fSet
.
pLastF
=
*
pSetNew
->
pLastF
;
fSet
.
pLastF
->
nRef
=
1
;
// SArray<aDFileSet>
// sma
taosArrayClear
(
pFS
->
nState
->
aDFileSet
);
fSet
.
pSmaF
=
(
SSmaFile
*
)
taosMemoryMalloc
(
sizeof
(
SSmaFile
));
for
(
int32_t
iSet
=
0
;
iSet
<
taosArrayGetSize
(
pFS
->
cState
->
aDFileSet
);
iSet
++
)
{
if
(
fSet
.
pSmaF
==
NULL
)
{
SDFileSet
*
pDFileSet
=
(
SDFileSet
*
)
taosArrayGet
(
pFS
->
cState
->
aDFileSet
,
iSet
);
code
=
TSDB_CODE_OUT_OF_MEMORY
;
goto
_err
;
}
*
fSet
.
pSmaF
=
*
pSetNew
->
pSmaF
;
fSet
.
pSmaF
->
nRef
=
1
;
if
(
taosArray
Push
(
pFS
->
nState
->
aDFileSet
,
pDFile
Set
)
==
NULL
)
{
if
(
taosArray
Insert
(
pTsdb
->
fs
.
aDFileSet
,
iOld
,
&
f
Set
)
==
NULL
)
{
code
=
TSDB_CODE_OUT_OF_MEMORY
;
code
=
TSDB_CODE_OUT_OF_MEMORY
;
goto
_err
;
goto
_err
;
}
}
iOld
++
;
iNew
++
;
continue
;
}
}
return
code
;
return
code
;
_err:
_err:
tsdbError
(
"vgId:%d tsdb fs
begin failed since %s"
,
TD_VID
(
pFS
->
pTsdb
->
pVnode
),
tstrerror
(
code
));
tsdbError
(
"vgId:%d tsdb fs
commit phase 2 failed since %s"
,
TD_VID
(
pTsdb
->
pVnode
),
tstrerror
(
code
));
return
code
;
return
code
;
}
}
int32_t
tsdbFS
Commit
(
STsdbFS
*
pFS
)
{
int32_t
tsdbFS
Ref
(
STsdb
*
pTsdb
,
STsdbFS
*
pFS
)
{
int32_t
code
=
0
;
int32_t
code
=
0
;
STsdbFSState
*
pState
=
pFS
->
nState
;
int32_t
nRef
;
char
tfname
[
TSDB_FILENAME_LEN
];
char
fname
[
TSDB_FILENAME_LEN
];
// need lock (todo)
pFS
->
nState
=
pFS
->
cState
;
pFS
->
cState
=
pState
;
snprintf
(
tfname
,
TSDB_FILENAME_LEN
-
1
,
"%s%s%s%sCURRENT.t"
,
tfsGetPrimaryPath
(
pFS
->
pTsdb
->
pVnode
->
pTfs
),
TD_DIRSEP
,
pFS
->
aDFileSet
=
taosArrayInit
(
taosArrayGetSize
(
pTsdb
->
fs
.
aDFileSet
),
sizeof
(
SDFileSet
));
pFS
->
pTsdb
->
path
,
TD_DIRSEP
);
if
(
pFS
->
aDFileSet
==
NULL
)
{
snprintf
(
fname
,
TSDB_FILENAME_LEN
-
1
,
"%s%s%s%sCURRENT"
,
tfsGetPrimaryPath
(
pFS
->
pTsdb
->
pVnode
->
pTfs
),
TD_DIRSEP
,
code
=
TSDB_CODE_OUT_OF_MEMORY
;
pFS
->
pTsdb
->
path
,
TD_DIRSEP
);
goto
_exit
;
// gnrt CURRENT.t
code
=
tsdbGnrtCurrent
(
tfname
,
pFS
->
cState
);
if
(
code
)
goto
_err
;
// rename
code
=
taosRenameFile
(
tfname
,
fname
);
if
(
code
)
{
code
=
TAOS_SYSTEM_ERROR
(
code
);
goto
_err
;
}
}
// apply commit on disk
pFS
->
pDelFile
=
pTsdb
->
fs
.
pDelFile
;
code
=
tsdbFSApplyDiskChange
(
pFS
,
pFS
->
nState
,
pFS
->
cState
);
if
(
pFS
->
pDelFile
)
{
if
(
code
)
goto
_err
;
nRef
=
atomic_fetch_add_32
(
&
pFS
->
pDelFile
->
nRef
,
1
);
ASSERT
(
nRef
>
0
);
return
code
;
}
_err:
tsdbError
(
"vgId:%d tsdb fs commit failed since %s"
,
TD_VID
(
pFS
->
pTsdb
->
pVnode
),
tstrerror
(
code
));
return
code
;
}
int32_t
tsdbFSRollback
(
STsdbFS
*
pFS
)
{
int32_t
code
=
0
;
code
=
tsdbFSApplyDiskChange
(
pFS
,
pFS
->
nState
,
pFS
->
cState
);
SDFileSet
fSet
;
if
(
code
)
goto
_err
;
for
(
int32_t
iSet
=
0
;
iSet
<
taosArrayGetSize
(
pTsdb
->
fs
.
aDFileSet
);
iSet
++
)
{
SDFileSet
*
pSet
=
(
SDFileSet
*
)
taosArrayGet
(
pTsdb
->
fs
.
aDFileSet
,
iSet
);
fSet
=
*
pSet
;
return
code
;
nRef
=
atomic_fetch_add_32
(
&
pSet
->
pHeadF
->
nRef
,
1
);
ASSERT
(
nRef
>
0
);
_err:
nRef
=
atomic_fetch_add_32
(
&
pSet
->
pDataF
->
nRef
,
1
);
tsdbError
(
"vgId:%d tsdb fs rollback failed since %s"
,
TD_VID
(
pFS
->
pTsdb
->
pVnode
),
tstrerror
(
code
));
ASSERT
(
nRef
>
0
);
return
code
;
}
int32_t
tsdbFSStateUpsertDelFile
(
STsdbFSState
*
pState
,
SDelFile
*
pDelFile
)
{
nRef
=
atomic_fetch_add_32
(
&
pSet
->
pLastF
->
nRef
,
1
);
int32_t
code
=
0
;
ASSERT
(
nRef
>
0
);
pState
->
delFile
=
*
pDelFile
;
pState
->
pDelFile
=
&
pState
->
delFile
;
return
code
;
}
int32_t
tsdbFSStateUpsertDFileSet
(
STsdbFSState
*
pState
,
SDFileSet
*
pSet
)
{
nRef
=
atomic_fetch_add_32
(
&
pSet
->
pSmaF
->
nRef
,
1
);
int32_t
code
=
0
;
ASSERT
(
nRef
>
0
);
int32_t
idx
=
taosArraySearchIdx
(
pState
->
aDFileSet
,
pSet
,
tDFileSetCmprFn
,
TD_GE
);
if
(
idx
<
0
)
{
if
(
taosArrayPush
(
pFS
->
aDFileSet
,
&
fSet
)
==
NULL
)
{
if
(
taosArrayPush
(
pState
->
aDFileSet
,
pSet
)
==
NULL
)
{
code
=
TSDB_CODE_OUT_OF_MEMORY
;
goto
_exit
;
}
}
else
{
SDFileSet
*
tDFileSet
=
(
SDFileSet
*
)
taosArrayGet
(
pState
->
aDFileSet
,
idx
);
int32_t
c
=
tDFileSetCmprFn
(
pSet
,
tDFileSet
);
if
(
c
==
0
)
{
taosArraySet
(
pState
->
aDFileSet
,
idx
,
pSet
);
}
else
{
if
(
taosArrayInsert
(
pState
->
aDFileSet
,
idx
,
pSet
)
==
NULL
)
{
code
=
TSDB_CODE_OUT_OF_MEMORY
;
code
=
TSDB_CODE_OUT_OF_MEMORY
;
goto
_exit
;
goto
_exit
;
}
}
}
}
}
_exit:
_exit:
return
code
;
return
code
;
}
}
void
tsdbFSStateDeleteDFileSet
(
STsdbFSState
*
pState
,
int32_t
fid
)
{
void
tsdbFSUnref
(
STsdb
*
pTsdb
,
STsdbFS
*
pFS
)
{
int32_t
idx
;
int32_t
nRef
;
char
fname
[
TSDB_FILENAME_LEN
];
if
(
pFS
->
pDelFile
)
{
nRef
=
atomic_sub_fetch_32
(
&
pFS
->
pDelFile
->
nRef
,
1
);
ASSERT
(
nRef
>=
0
);
if
(
nRef
==
0
)
{
tsdbDelFileName
(
pTsdb
,
pFS
->
pDelFile
,
fname
);
taosRemoveFile
(
fname
);
taosMemoryFree
(
pFS
->
pDelFile
);
}
}
idx
=
taosArraySearchIdx
(
pState
->
aDFileSet
,
&
(
SDFileSet
){.
fid
=
fid
},
tDFileSetCmprFn
,
TD_EQ
);
for
(
int32_t
iSet
=
0
;
iSet
<
taosArrayGetSize
(
pFS
->
aDFileSet
);
iSet
++
)
{
ASSERT
(
idx
>=
0
);
SDFileSet
*
pSet
=
(
SDFileSet
*
)
taosArrayGet
(
pFS
->
aDFileSet
,
iSet
);
taosArrayRemove
(
pState
->
aDFileSet
,
idx
);
}
// head
nRef
=
atomic_sub_fetch_32
(
&
pSet
->
pHeadF
->
nRef
,
1
);
ASSERT
(
nRef
>=
0
);
if
(
nRef
==
0
)
{
tsdbHeadFileName
(
pTsdb
,
pSet
->
diskId
,
pSet
->
fid
,
pSet
->
pHeadF
,
fname
);
taosRemoveFile
(
fname
);
taosMemoryFree
(
pSet
->
pHeadF
);
}
// data
nRef
=
atomic_sub_fetch_32
(
&
pSet
->
pDataF
->
nRef
,
1
);
ASSERT
(
nRef
>=
0
);
if
(
nRef
==
0
)
{
tsdbDataFileName
(
pTsdb
,
pSet
->
diskId
,
pSet
->
fid
,
pSet
->
pDataF
,
fname
);
taosRemoveFile
(
fname
);
taosMemoryFree
(
pSet
->
pDataF
);
}
// last
nRef
=
atomic_sub_fetch_32
(
&
pSet
->
pLastF
->
nRef
,
1
);
ASSERT
(
nRef
>=
0
);
if
(
nRef
==
0
)
{
tsdbLastFileName
(
pTsdb
,
pSet
->
diskId
,
pSet
->
fid
,
pSet
->
pLastF
,
fname
);
taosRemoveFile
(
fname
);
taosMemoryFree
(
pSet
->
pLastF
);
}
SDelFile
*
tsdbFSStateGetDelFile
(
STsdbFSState
*
pState
)
{
return
pState
->
pDelFile
;
}
// sma
nRef
=
atomic_sub_fetch_32
(
&
pSet
->
pSmaF
->
nRef
,
1
);
ASSERT
(
nRef
>=
0
);
if
(
nRef
==
0
)
{
tsdbSmaFileName
(
pTsdb
,
pSet
->
diskId
,
pSet
->
fid
,
pSet
->
pSmaF
,
fname
);
taosRemoveFile
(
fname
);
taosMemoryFree
(
pSet
->
pSmaF
);
}
}
SDFileSet
*
tsdbFSStateGetDFileSet
(
STsdbFSState
*
pState
,
int32_t
fid
,
int32_t
flag
)
{
taosArrayDestroy
(
pFS
->
aDFileSet
);
return
(
SDFileSet
*
)
taosArraySearch
(
pState
->
aDFileSet
,
&
(
SDFileSet
){.
fid
=
fid
},
tDFileSetCmprFn
,
flag
);
}
}
\ No newline at end of file
source/dnode/vnode/src/tsdb/tsdbFile.c
浏览文件 @
684dd823
...
@@ -122,21 +122,11 @@ int32_t tsdbDFileRollback(STsdb *pTsdb, SDFileSet *pSet, EDataFileT ftype) {
...
@@ -122,21 +122,11 @@ int32_t tsdbDFileRollback(STsdb *pTsdb, SDFileSet *pSet, EDataFileT ftype) {
// truncate
// truncate
switch
(
ftype
)
{
switch
(
ftype
)
{
case
TSDB_HEAD_FILE
:
size
=
pSet
->
pHeadF
->
size
;
tsdbHeadFileName
(
pTsdb
,
pSet
->
diskId
,
pSet
->
fid
,
pSet
->
pHeadF
,
fname
);
tPutHeadFile
(
hdr
,
pSet
->
pHeadF
);
break
;
case
TSDB_DATA_FILE
:
case
TSDB_DATA_FILE
:
size
=
pSet
->
pDataF
->
size
;
size
=
pSet
->
pDataF
->
size
;
tsdbDataFileName
(
pTsdb
,
pSet
->
diskId
,
pSet
->
fid
,
pSet
->
pDataF
,
fname
);
tsdbDataFileName
(
pTsdb
,
pSet
->
diskId
,
pSet
->
fid
,
pSet
->
pDataF
,
fname
);
tPutDataFile
(
hdr
,
pSet
->
pDataF
);
tPutDataFile
(
hdr
,
pSet
->
pDataF
);
break
;
break
;
case
TSDB_LAST_FILE
:
size
=
pSet
->
pLastF
->
size
;
tsdbLastFileName
(
pTsdb
,
pSet
->
diskId
,
pSet
->
fid
,
pSet
->
pLastF
,
fname
);
tPutLastFile
(
hdr
,
pSet
->
pLastF
);
break
;
case
TSDB_SMA_FILE
:
case
TSDB_SMA_FILE
:
size
=
pSet
->
pSmaF
->
size
;
size
=
pSet
->
pSmaF
->
size
;
tsdbSmaFileName
(
pTsdb
,
pSet
->
diskId
,
pSet
->
fid
,
pSet
->
pSmaF
,
fname
);
tsdbSmaFileName
(
pTsdb
,
pSet
->
diskId
,
pSet
->
fid
,
pSet
->
pSmaF
,
fname
);
...
@@ -186,6 +176,7 @@ int32_t tsdbDFileRollback(STsdb *pTsdb, SDFileSet *pSet, EDataFileT ftype) {
...
@@ -186,6 +176,7 @@ int32_t tsdbDFileRollback(STsdb *pTsdb, SDFileSet *pSet, EDataFileT ftype) {
return
code
;
return
code
;
_err:
_err:
tsdbError
(
"vgId:%d tsdb rollback file failed since %s"
,
TD_VID
(
pTsdb
->
pVnode
),
tstrerror
(
code
));
return
code
;
return
code
;
}
}
...
@@ -219,10 +210,8 @@ int32_t tGetDFileSet(uint8_t *p, SDFileSet *pSet) {
...
@@ -219,10 +210,8 @@ int32_t tGetDFileSet(uint8_t *p, SDFileSet *pSet) {
// SDelFile ===============================================
// SDelFile ===============================================
void
tsdbDelFileName
(
STsdb
*
pTsdb
,
SDelFile
*
pFile
,
char
fname
[])
{
void
tsdbDelFileName
(
STsdb
*
pTsdb
,
SDelFile
*
pFile
,
char
fname
[])
{
STfs
*
pTfs
=
pTsdb
->
pVnode
->
pTfs
;
snprintf
(
fname
,
TSDB_FILENAME_LEN
-
1
,
"%s%s%s%sv%dver%"
PRId64
"%s"
,
tfsGetPrimaryPath
(
pTsdb
->
pVnode
->
pTfs
),
TD_DIRSEP
,
pTsdb
->
path
,
TD_DIRSEP
,
TD_VID
(
pTsdb
->
pVnode
),
pFile
->
commitID
,
".del"
);
snprintf
(
fname
,
TSDB_FILENAME_LEN
-
1
,
"%s%s%s%sv%dver%"
PRId64
"%s"
,
tfsGetPrimaryPath
(
pTfs
),
TD_DIRSEP
,
pTsdb
->
path
,
TD_DIRSEP
,
TD_VID
(
pTsdb
->
pVnode
),
pFile
->
commitID
,
".del"
);
}
}
int32_t
tPutDelFile
(
uint8_t
*
p
,
SDelFile
*
pDelFile
)
{
int32_t
tPutDelFile
(
uint8_t
*
p
,
SDelFile
*
pDelFile
)
{
...
...
source/dnode/vnode/src/tsdb/tsdbMemTable.c
浏览文件 @
684dd823
...
@@ -605,48 +605,3 @@ void tsdbUnrefMemTable(SMemTable *pMemTable) {
...
@@ -605,48 +605,3 @@ void tsdbUnrefMemTable(SMemTable *pMemTable) {
tsdbMemTableDestroy
(
pMemTable
);
tsdbMemTableDestroy
(
pMemTable
);
}
}
}
}
int32_t
tsdbTakeMemSnapshot
(
STsdb
*
pTsdb
,
SMemTable
**
ppMem
,
SMemTable
**
ppIMem
)
{
ASSERT
(
0
);
int32_t
code
=
0
;
// lock
code
=
taosThreadRwlockRdlock
(
&
pTsdb
->
rwLock
);
if
(
code
)
{
code
=
TAOS_SYSTEM_ERROR
(
code
);
goto
_exit
;
}
// take snapshot
*
ppMem
=
pTsdb
->
mem
;
*
ppIMem
=
pTsdb
->
imem
;
if
(
*
ppMem
)
{
tsdbRefMemTable
(
*
ppMem
);
}
if
(
*
ppIMem
)
{
tsdbRefMemTable
(
*
ppIMem
);
}
// unlock
code
=
taosThreadRwlockUnlock
(
&
pTsdb
->
rwLock
);
if
(
code
)
{
code
=
TAOS_SYSTEM_ERROR
(
code
);
goto
_exit
;
}
_exit:
return
code
;
}
void
tsdbUntakeMemSnapshot
(
STsdb
*
pTsdb
,
SMemTable
*
pMem
,
SMemTable
*
pIMem
)
{
ASSERT
(
0
);
if
(
pMem
)
{
tsdbUnrefMemTable
(
pMem
);
}
if
(
pIMem
)
{
tsdbUnrefMemTable
(
pIMem
);
}
}
\ No newline at end of file
source/dnode/vnode/src/tsdb/tsdbOpen.c
浏览文件 @
684dd823
...
@@ -66,7 +66,7 @@ int tsdbOpen(SVnode *pVnode, STsdb **ppTsdb, const char *dir, STsdbKeepCfg *pKee
...
@@ -66,7 +66,7 @@ int tsdbOpen(SVnode *pVnode, STsdb **ppTsdb, const char *dir, STsdbKeepCfg *pKee
tfsMkdir
(
pVnode
->
pTfs
,
pTsdb
->
path
);
tfsMkdir
(
pVnode
->
pTfs
,
pTsdb
->
path
);
// open tsdb
// open tsdb
if
(
tsdbFSOpen
(
pTsdb
,
&
pTsdb
->
pFS
)
<
0
)
{
if
(
tsdbFSOpen
(
pTsdb
)
<
0
)
{
goto
_err
;
goto
_err
;
}
}
...
@@ -88,7 +88,7 @@ _err:
...
@@ -88,7 +88,7 @@ _err:
int
tsdbClose
(
STsdb
**
pTsdb
)
{
int
tsdbClose
(
STsdb
**
pTsdb
)
{
if
(
*
pTsdb
)
{
if
(
*
pTsdb
)
{
taosThreadRwlockDestroy
(
&
(
*
pTsdb
)
->
rwLock
);
taosThreadRwlockDestroy
(
&
(
*
pTsdb
)
->
rwLock
);
tsdbFSClose
(
(
*
pTsdb
)
->
pFS
);
tsdbFSClose
(
*
pTsdb
);
tsdbCloseCache
((
*
pTsdb
)
->
lruCache
);
tsdbCloseCache
((
*
pTsdb
)
->
lruCache
);
taosMemoryFreeClear
(
*
pTsdb
);
taosMemoryFreeClear
(
*
pTsdb
);
}
}
...
...
source/dnode/vnode/src/tsdb/tsdbRead.c
浏览文件 @
684dd823
...
@@ -118,8 +118,7 @@ struct STsdbReader {
...
@@ -118,8 +118,7 @@ struct STsdbReader {
char
*
idStr
;
// query info handle, for debug purpose
char
*
idStr
;
// query info handle, for debug purpose
int32_t
type
;
// query type: 1. retrieve all data blocks, 2. retrieve direct prev|next rows
int32_t
type
;
// query type: 1. retrieve all data blocks, 2. retrieve direct prev|next rows
SBlockLoadSuppInfo
suppInfo
;
SBlockLoadSuppInfo
suppInfo
;
SMemTable
*
pMem
;
STsdbReadSnap
*
pReadSnap
;
SMemTable
*
pIMem
;
SIOCostSummary
cost
;
SIOCostSummary
cost
;
STSchema
*
pSchema
;
STSchema
*
pSchema
;
...
@@ -275,12 +274,12 @@ static void limitOutputBufferSize(const SQueryTableDataCond* pCond, int32_t* cap
...
@@ -275,12 +274,12 @@ static void limitOutputBufferSize(const SQueryTableDataCond* pCond, int32_t* cap
}
}
// init file iterator
// init file iterator
static
int32_t
initFilesetIterator
(
SFilesetIter
*
pIter
,
const
STsdbFSState
*
pFState
,
int32_t
order
,
const
char
*
idstr
)
{
static
int32_t
initFilesetIterator
(
SFilesetIter
*
pIter
,
SArray
*
aDFileSet
,
int32_t
order
,
const
char
*
idstr
)
{
size_t
numOfFileset
=
taosArrayGetSize
(
pFState
->
aDFileSet
);
size_t
numOfFileset
=
taosArrayGetSize
(
aDFileSet
);
pIter
->
index
=
ASCENDING_TRAVERSE
(
order
)
?
-
1
:
numOfFileset
;
pIter
->
index
=
ASCENDING_TRAVERSE
(
order
)
?
-
1
:
numOfFileset
;
pIter
->
order
=
order
;
pIter
->
order
=
order
;
pIter
->
pFileList
=
taosArrayDup
(
pFState
->
aDFileSet
)
;
pIter
->
pFileList
=
aDFileSet
;
pIter
->
numOfFiles
=
numOfFileset
;
pIter
->
numOfFiles
=
numOfFileset
;
tsdbDebug
(
"init fileset iterator, total files:%d %s"
,
pIter
->
numOfFiles
,
idstr
);
tsdbDebug
(
"init fileset iterator, total files:%d %s"
,
pIter
->
numOfFiles
,
idstr
);
...
@@ -1881,8 +1880,8 @@ static int32_t initMemDataIterator(STableBlockScanInfo* pBlockScanInfo, STsdbRea
...
@@ -1881,8 +1880,8 @@ static int32_t initMemDataIterator(STableBlockScanInfo* pBlockScanInfo, STsdbRea
int32_t
backward
=
(
!
ASCENDING_TRAVERSE
(
pReader
->
order
));
int32_t
backward
=
(
!
ASCENDING_TRAVERSE
(
pReader
->
order
));
STbData
*
d
=
NULL
;
STbData
*
d
=
NULL
;
if
(
pReader
->
pMem
!=
NULL
)
{
if
(
pReader
->
p
ReadSnap
->
p
Mem
!=
NULL
)
{
tsdbGetTbDataFromMemTable
(
pReader
->
pMem
,
pReader
->
suid
,
pBlockScanInfo
->
uid
,
&
d
);
tsdbGetTbDataFromMemTable
(
pReader
->
p
ReadSnap
->
p
Mem
,
pReader
->
suid
,
pBlockScanInfo
->
uid
,
&
d
);
if
(
d
!=
NULL
)
{
if
(
d
!=
NULL
)
{
code
=
tsdbTbDataIterCreate
(
d
,
&
startKey
,
backward
,
&
pBlockScanInfo
->
iter
.
iter
);
code
=
tsdbTbDataIterCreate
(
d
,
&
startKey
,
backward
,
&
pBlockScanInfo
->
iter
.
iter
);
if
(
code
==
TSDB_CODE_SUCCESS
)
{
if
(
code
==
TSDB_CODE_SUCCESS
)
{
...
@@ -1902,8 +1901,8 @@ static int32_t initMemDataIterator(STableBlockScanInfo* pBlockScanInfo, STsdbRea
...
@@ -1902,8 +1901,8 @@ static int32_t initMemDataIterator(STableBlockScanInfo* pBlockScanInfo, STsdbRea
}
}
STbData
*
di
=
NULL
;
STbData
*
di
=
NULL
;
if
(
pReader
->
pIMem
!=
NULL
)
{
if
(
pReader
->
p
ReadSnap
->
p
IMem
!=
NULL
)
{
tsdbGetTbDataFromMemTable
(
pReader
->
pIMem
,
pReader
->
suid
,
pBlockScanInfo
->
uid
,
&
di
);
tsdbGetTbDataFromMemTable
(
pReader
->
p
ReadSnap
->
p
IMem
,
pReader
->
suid
,
pBlockScanInfo
->
uid
,
&
di
);
if
(
di
!=
NULL
)
{
if
(
di
!=
NULL
)
{
code
=
tsdbTbDataIterCreate
(
di
,
&
startKey
,
backward
,
&
pBlockScanInfo
->
iiter
.
iter
);
code
=
tsdbTbDataIterCreate
(
di
,
&
startKey
,
backward
,
&
pBlockScanInfo
->
iiter
.
iter
);
if
(
code
==
TSDB_CODE_SUCCESS
)
{
if
(
code
==
TSDB_CODE_SUCCESS
)
{
...
@@ -1939,7 +1938,7 @@ int32_t initDelSkylineIterator(STableBlockScanInfo* pBlockScanInfo, STsdbReader*
...
@@ -1939,7 +1938,7 @@ int32_t initDelSkylineIterator(STableBlockScanInfo* pBlockScanInfo, STsdbReader*
SArray
*
pDelData
=
taosArrayInit
(
4
,
sizeof
(
SDelData
));
SArray
*
pDelData
=
taosArrayInit
(
4
,
sizeof
(
SDelData
));
SDelFile
*
pDelFile
=
tsdbFSStateGetDelFile
(
pTsdb
->
pFS
->
cState
)
;
SDelFile
*
pDelFile
=
pReader
->
pReadSnap
->
fs
.
pDelFile
;
if
(
pDelFile
)
{
if
(
pDelFile
)
{
SDelFReader
*
pDelFReader
=
NULL
;
SDelFReader
*
pDelFReader
=
NULL
;
code
=
tsdbDelFReaderOpen
(
&
pDelFReader
,
pDelFile
,
pTsdb
,
NULL
);
code
=
tsdbDelFReaderOpen
(
&
pDelFReader
,
pDelFile
,
pTsdb
,
NULL
);
...
@@ -2830,8 +2829,7 @@ int32_t tsdbReaderOpen(SVnode* pVnode, SQueryTableDataCond* pCond, SArray* pTabl
...
@@ -2830,8 +2829,7 @@ int32_t tsdbReaderOpen(SVnode* pVnode, SQueryTableDataCond* pCond, SArray* pTabl
SDataBlockIter
*
pBlockIter
=
&
pReader
->
status
.
blockIter
;
SDataBlockIter
*
pBlockIter
=
&
pReader
->
status
.
blockIter
;
STsdbFSState
*
pFState
=
pReader
->
pTsdb
->
pFS
->
cState
;
initFilesetIterator
(
&
pReader
->
status
.
fileIter
,
(
*
ppReader
)
->
pReadSnap
->
fs
.
aDFileSet
,
pReader
->
order
,
pReader
->
idStr
);
initFilesetIterator
(
&
pReader
->
status
.
fileIter
,
pFState
,
pReader
->
order
,
pReader
->
idStr
);
resetDataBlockIterator
(
&
pReader
->
status
.
blockIter
,
pReader
->
order
);
resetDataBlockIterator
(
&
pReader
->
status
.
blockIter
,
pReader
->
order
);
// no data in files, let's try buffer in memory
// no data in files, let's try buffer in memory
...
@@ -2844,7 +2842,8 @@ int32_t tsdbReaderOpen(SVnode* pVnode, SQueryTableDataCond* pCond, SArray* pTabl
...
@@ -2844,7 +2842,8 @@ int32_t tsdbReaderOpen(SVnode* pVnode, SQueryTableDataCond* pCond, SArray* pTabl
}
}
}
}
tsdbTakeMemSnapshot
(
pReader
->
pTsdb
,
&
pReader
->
pMem
,
&
pReader
->
pIMem
);
code
=
tsdbTakeReadSnap
(
pVnode
->
pTsdb
,
&
pReader
->
pReadSnap
);
if
(
code
)
goto
_err
;
tsdbDebug
(
"%p total numOfTable:%d in this query %s"
,
pReader
,
numOfTables
,
pReader
->
idStr
);
tsdbDebug
(
"%p total numOfTable:%d in this query %s"
,
pReader
,
numOfTables
,
pReader
->
idStr
);
return
code
;
return
code
;
...
@@ -2861,7 +2860,7 @@ void tsdbReaderClose(STsdbReader* pReader) {
...
@@ -2861,7 +2860,7 @@ void tsdbReaderClose(STsdbReader* pReader) {
SBlockLoadSuppInfo
*
pSupInfo
=
&
pReader
->
suppInfo
;
SBlockLoadSuppInfo
*
pSupInfo
=
&
pReader
->
suppInfo
;
tsdbUntake
MemSnapshot
(
pReader
->
pTsdb
,
pReader
->
pMem
,
pReader
->
pIMem
);
tsdbUntake
ReadSnap
(
pReader
->
pTsdb
,
pReader
->
pReadSnap
);
taosMemoryFreeClear
(
pSupInfo
->
plist
);
taosMemoryFreeClear
(
pSupInfo
->
plist
);
taosMemoryFree
(
pSupInfo
->
colIds
);
taosMemoryFree
(
pSupInfo
->
colIds
);
...
@@ -3081,8 +3080,7 @@ int32_t tsdbReaderReset(STsdbReader* pReader, SQueryTableDataCond* pCond) {
...
@@ -3081,8 +3080,7 @@ int32_t tsdbReaderReset(STsdbReader* pReader, SQueryTableDataCond* pCond) {
tsdbDataFReaderClose
(
&
pReader
->
pFileReader
);
tsdbDataFReaderClose
(
&
pReader
->
pFileReader
);
STsdbFSState
*
pFState
=
pReader
->
pTsdb
->
pFS
->
cState
;
initFilesetIterator
(
&
pReader
->
status
.
fileIter
,
pReader
->
pReadSnap
->
fs
.
aDFileSet
,
pReader
->
order
,
pReader
->
idStr
);
initFilesetIterator
(
&
pReader
->
status
.
fileIter
,
pFState
,
pReader
->
order
,
pReader
->
idStr
);
resetDataBlockIterator
(
&
pReader
->
status
.
blockIter
,
pReader
->
order
);
resetDataBlockIterator
(
&
pReader
->
status
.
blockIter
,
pReader
->
order
);
resetDataBlockScanInfo
(
pReader
->
status
.
pTableMap
);
resetDataBlockScanInfo
(
pReader
->
status
.
pTableMap
);
...
@@ -3275,6 +3273,11 @@ int32_t tsdbTakeReadSnap(STsdb* pTsdb, STsdbReadSnap** ppSnap) {
...
@@ -3275,6 +3273,11 @@ int32_t tsdbTakeReadSnap(STsdb* pTsdb, STsdbReadSnap** ppSnap) {
}
}
// fs (todo)
// fs (todo)
code
=
tsdbFSRef
(
pTsdb
,
&
(
*
ppSnap
)
->
fs
);
if
(
code
)
{
taosThreadRwlockUnlock
(
&
pTsdb
->
rwLock
);
goto
_exit
;
}
// unlock
// unlock
code
=
taosThreadRwlockUnlock
(
&
pTsdb
->
rwLock
);
code
=
taosThreadRwlockUnlock
(
&
pTsdb
->
rwLock
);
...
@@ -3297,6 +3300,6 @@ void tsdbUntakeReadSnap(STsdb* pTsdb, STsdbReadSnap* pSnap) {
...
@@ -3297,6 +3300,6 @@ void tsdbUntakeReadSnap(STsdb* pTsdb, STsdbReadSnap* pSnap) {
tsdbUnrefMemTable
(
pSnap
->
pIMem
);
tsdbUnrefMemTable
(
pSnap
->
pIMem
);
}
}
// fs (todo)
tsdbFSUnref
(
pTsdb
,
&
pSnap
->
fs
);
}
}
}
}
source/dnode/vnode/src/tsdb/tsdbRetention.c
浏览文件 @
684dd823
...
@@ -17,6 +17,7 @@
...
@@ -17,6 +17,7 @@
static
int32_t
tsdbDoRetentionImpl
(
STsdb
*
pTsdb
,
int64_t
now
,
int8_t
try
,
int8_t
*
canDo
)
{
static
int32_t
tsdbDoRetentionImpl
(
STsdb
*
pTsdb
,
int64_t
now
,
int8_t
try
,
int8_t
*
canDo
)
{
int32_t
code
=
0
;
int32_t
code
=
0
;
#if 0
STsdbFSState *pState;
STsdbFSState *pState;
if (try) {
if (try) {
...
@@ -64,18 +65,20 @@ static int32_t tsdbDoRetentionImpl(STsdb *pTsdb, int64_t now, int8_t try, int8_t
...
@@ -64,18 +65,20 @@ static int32_t tsdbDoRetentionImpl(STsdb *pTsdb, int64_t now, int8_t try, int8_t
code = tsdbDFileSetCopy(pTsdb, pDFileSet, &nDFileSet);
code = tsdbDFileSetCopy(pTsdb, pDFileSet, &nDFileSet);
if (code) goto _exit;
if (code) goto _exit;
code
=
tsdbFS
StateUpsertDFile
Set
(
pState
,
&
nDFileSet
);
code = tsdbFS
UpsertF
Set(pState, &nDFileSet);
if (code) goto _exit;
if (code) goto _exit;
}
}
}
}
}
}
#endif
_exit:
_exit:
return
code
;
return
code
;
}
}
int32_t
tsdbDoRetention
(
STsdb
*
pTsdb
,
int64_t
now
)
{
int32_t
tsdbDoRetention
(
STsdb
*
pTsdb
,
int64_t
now
)
{
int32_t
code
=
0
;
int32_t
code
=
0
;
#if 0
int8_t canDo;
int8_t canDo;
// try
// try
...
@@ -100,5 +103,6 @@ _exit:
...
@@ -100,5 +103,6 @@ _exit:
_err:
_err:
tsdbError("vgId:%d tsdb do retention failed since %s", TD_VID(pTsdb->pVnode), tstrerror(code));
tsdbError("vgId:%d tsdb do retention failed since %s", TD_VID(pTsdb->pVnode), tstrerror(code));
tsdbFSRollback(pTsdb->pFS);
tsdbFSRollback(pTsdb->pFS);
#endif
return
code
;
return
code
;
}
}
\ No newline at end of file
source/dnode/vnode/src/tsdb/tsdbSnapshot.c
浏览文件 @
684dd823
...
@@ -20,6 +20,7 @@ struct STsdbSnapReader {
...
@@ -20,6 +20,7 @@ struct STsdbSnapReader {
STsdb
*
pTsdb
;
STsdb
*
pTsdb
;
int64_t
sver
;
int64_t
sver
;
int64_t
ever
;
int64_t
ever
;
STsdbFS
fs
;
// for data file
// for data file
int8_t
dataDone
;
int8_t
dataDone
;
int32_t
fid
;
int32_t
fid
;
...
@@ -45,7 +46,8 @@ static int32_t tsdbSnapReadData(STsdbSnapReader* pReader, uint8_t** ppData) {
...
@@ -45,7 +46,8 @@ static int32_t tsdbSnapReadData(STsdbSnapReader* pReader, uint8_t** ppData) {
while
(
true
)
{
while
(
true
)
{
if
(
pReader
->
pDataFReader
==
NULL
)
{
if
(
pReader
->
pDataFReader
==
NULL
)
{
SDFileSet
*
pSet
=
tsdbFSStateGetDFileSet
(
pTsdb
->
pFS
->
cState
,
pReader
->
fid
,
TD_GT
);
SDFileSet
*
pSet
=
taosArraySearch
(
pReader
->
fs
.
aDFileSet
,
&
(
SDFileSet
){.
fid
=
pReader
->
fid
},
tDFileSetCmprFn
,
TD_GT
);
if
(
pSet
==
NULL
)
goto
_exit
;
if
(
pSet
==
NULL
)
goto
_exit
;
...
@@ -159,7 +161,7 @@ _err:
...
@@ -159,7 +161,7 @@ _err:
static
int32_t
tsdbSnapReadDel
(
STsdbSnapReader
*
pReader
,
uint8_t
**
ppData
)
{
static
int32_t
tsdbSnapReadDel
(
STsdbSnapReader
*
pReader
,
uint8_t
**
ppData
)
{
int32_t
code
=
0
;
int32_t
code
=
0
;
STsdb
*
pTsdb
=
pReader
->
pTsdb
;
STsdb
*
pTsdb
=
pReader
->
pTsdb
;
SDelFile
*
pDelFile
=
p
Tsdb
->
pFS
->
cState
->
pDelFile
;
SDelFile
*
pDelFile
=
p
Reader
->
fs
.
pDelFile
;
if
(
pReader
->
pDelFReader
==
NULL
)
{
if
(
pReader
->
pDelFReader
==
NULL
)
{
if
(
pDelFile
==
NULL
)
{
if
(
pDelFile
==
NULL
)
{
...
@@ -254,6 +256,24 @@ int32_t tsdbSnapReaderOpen(STsdb* pTsdb, int64_t sver, int64_t ever, STsdbSnapRe
...
@@ -254,6 +256,24 @@ int32_t tsdbSnapReaderOpen(STsdb* pTsdb, int64_t sver, int64_t ever, STsdbSnapRe
pReader
->
sver
=
sver
;
pReader
->
sver
=
sver
;
pReader
->
ever
=
ever
;
pReader
->
ever
=
ever
;
code
=
taosThreadRwlockRdlock
(
&
pTsdb
->
rwLock
);
if
(
code
)
{
code
=
TAOS_SYSTEM_ERROR
(
code
);
goto
_err
;
}
code
=
tsdbFSRef
(
pTsdb
,
&
pReader
->
fs
);
if
(
code
)
{
taosThreadRwlockUnlock
(
&
pTsdb
->
rwLock
);
goto
_err
;
}
code
=
taosThreadRwlockUnlock
(
&
pTsdb
->
rwLock
);
if
(
code
)
{
code
=
TAOS_SYSTEM_ERROR
(
code
);
goto
_err
;
}
pReader
->
fid
=
INT32_MIN
;
pReader
->
fid
=
INT32_MIN
;
pReader
->
aBlockIdx
=
taosArrayInit
(
0
,
sizeof
(
SBlockIdx
));
pReader
->
aBlockIdx
=
taosArrayInit
(
0
,
sizeof
(
SBlockIdx
));
if
(
pReader
->
aBlockIdx
==
NULL
)
{
if
(
pReader
->
aBlockIdx
==
NULL
)
{
...
@@ -305,6 +325,8 @@ int32_t tsdbSnapReaderClose(STsdbSnapReader** ppReader) {
...
@@ -305,6 +325,8 @@ int32_t tsdbSnapReaderClose(STsdbSnapReader** ppReader) {
taosArrayDestroy
(
pReader
->
aDelIdx
);
taosArrayDestroy
(
pReader
->
aDelIdx
);
taosArrayDestroy
(
pReader
->
aDelData
);
taosArrayDestroy
(
pReader
->
aDelData
);
tsdbFSUnref
(
pReader
->
pTsdb
,
&
pReader
->
fs
);
tsdbInfo
(
"vgId:%d vnode snapshot tsdb reader closed"
,
TD_VID
(
pReader
->
pTsdb
->
pVnode
));
tsdbInfo
(
"vgId:%d vnode snapshot tsdb reader closed"
,
TD_VID
(
pReader
->
pTsdb
->
pVnode
));
taosMemoryFree
(
pReader
);
taosMemoryFree
(
pReader
);
...
@@ -358,6 +380,7 @@ struct STsdbSnapWriter {
...
@@ -358,6 +380,7 @@ struct STsdbSnapWriter {
STsdb
*
pTsdb
;
STsdb
*
pTsdb
;
int64_t
sver
;
int64_t
sver
;
int64_t
ever
;
int64_t
ever
;
STsdbFS
fs
;
// config
// config
int32_t
minutes
;
int32_t
minutes
;
...
@@ -798,7 +821,7 @@ static int32_t tsdbSnapWriteDataEnd(STsdbSnapWriter* pWriter) {
...
@@ -798,7 +821,7 @@ static int32_t tsdbSnapWriteDataEnd(STsdbSnapWriter* pWriter) {
code
=
tsdbWriteBlockIdx
(
pWriter
->
pDataFWriter
,
pWriter
->
aBlockIdxW
,
NULL
);
code
=
tsdbWriteBlockIdx
(
pWriter
->
pDataFWriter
,
pWriter
->
aBlockIdxW
,
NULL
);
if
(
code
)
goto
_err
;
if
(
code
)
goto
_err
;
code
=
tsdbFS
StateUpsertDFileSet
(
pTsdb
->
pFS
->
nState
,
&
pWriter
->
pDataFWriter
->
wSet
);
code
=
tsdbFS
UpsertFSet
(
&
pWriter
->
fs
,
&
pWriter
->
pDataFWriter
->
wSet
);
if
(
code
)
goto
_err
;
if
(
code
)
goto
_err
;
code
=
tsdbDataFWriterClose
(
&
pWriter
->
pDataFWriter
,
1
);
code
=
tsdbDataFWriterClose
(
&
pWriter
->
pDataFWriter
,
1
);
...
@@ -843,7 +866,7 @@ static int32_t tsdbSnapWriteData(STsdbSnapWriter* pWriter, uint8_t* pData, uint3
...
@@ -843,7 +866,7 @@ static int32_t tsdbSnapWriteData(STsdbSnapWriter* pWriter, uint8_t* pData, uint3
pWriter
->
fid
=
fid
;
pWriter
->
fid
=
fid
;
// read
// read
SDFileSet
*
pSet
=
t
sdbFSStateGetDFileSet
(
pTsdb
->
pFS
->
nState
,
fid
,
TD_EQ
);
SDFileSet
*
pSet
=
t
aosArraySearch
(
pWriter
->
fs
.
aDFileSet
,
&
(
SDFileSet
){.
fid
=
fid
},
tDFileSetCmprFn
,
TD_EQ
);
if
(
pSet
)
{
if
(
pSet
)
{
code
=
tsdbDataFReaderOpen
(
&
pWriter
->
pDataFReader
,
pTsdb
,
pSet
);
code
=
tsdbDataFReaderOpen
(
&
pWriter
->
pDataFReader
,
pTsdb
,
pSet
);
if
(
code
)
goto
_err
;
if
(
code
)
goto
_err
;
...
@@ -911,7 +934,7 @@ static int32_t tsdbSnapWriteDel(STsdbSnapWriter* pWriter, uint8_t* pData, uint32
...
@@ -911,7 +934,7 @@ static int32_t tsdbSnapWriteDel(STsdbSnapWriter* pWriter, uint8_t* pData, uint32
STsdb
*
pTsdb
=
pWriter
->
pTsdb
;
STsdb
*
pTsdb
=
pWriter
->
pTsdb
;
if
(
pWriter
->
pDelFWriter
==
NULL
)
{
if
(
pWriter
->
pDelFWriter
==
NULL
)
{
SDelFile
*
pDelFile
=
tsdbFSStateGetDelFile
(
pTsdb
->
pFS
->
nState
)
;
SDelFile
*
pDelFile
=
pWriter
->
fs
.
pDelFile
;
// reader
// reader
if
(
pDelFile
)
{
if
(
pDelFile
)
{
...
@@ -1021,7 +1044,7 @@ static int32_t tsdbSnapWriteDelEnd(STsdbSnapWriter* pWriter) {
...
@@ -1021,7 +1044,7 @@ static int32_t tsdbSnapWriteDelEnd(STsdbSnapWriter* pWriter) {
code
=
tsdbUpdateDelFileHdr
(
pWriter
->
pDelFWriter
);
code
=
tsdbUpdateDelFileHdr
(
pWriter
->
pDelFWriter
);
if
(
code
)
goto
_err
;
if
(
code
)
goto
_err
;
code
=
tsdbFS
StateUpsertDelFile
(
pTsdb
->
pFS
->
nState
,
&
pWriter
->
pDelFWriter
->
fDel
);
code
=
tsdbFS
UpsertDelFile
(
&
pWriter
->
fs
,
&
pWriter
->
pDelFWriter
->
fDel
);
if
(
code
)
goto
_err
;
if
(
code
)
goto
_err
;
code
=
tsdbDelFWriterClose
(
&
pWriter
->
pDelFWriter
,
1
);
code
=
tsdbDelFWriterClose
(
&
pWriter
->
pDelFWriter
,
1
);
...
@@ -1055,6 +1078,9 @@ int32_t tsdbSnapWriterOpen(STsdb* pTsdb, int64_t sver, int64_t ever, STsdbSnapWr
...
@@ -1055,6 +1078,9 @@ int32_t tsdbSnapWriterOpen(STsdb* pTsdb, int64_t sver, int64_t ever, STsdbSnapWr
pWriter
->
sver
=
sver
;
pWriter
->
sver
=
sver
;
pWriter
->
ever
=
ever
;
pWriter
->
ever
=
ever
;
code
=
tsdbFSCopy
(
pTsdb
,
&
pWriter
->
fs
);
if
(
code
)
goto
_err
;
// config
// config
pWriter
->
minutes
=
pTsdb
->
keepCfg
.
days
;
pWriter
->
minutes
=
pTsdb
->
keepCfg
.
days
;
pWriter
->
precision
=
pTsdb
->
keepCfg
.
precision
;
pWriter
->
precision
=
pTsdb
->
keepCfg
.
precision
;
...
@@ -1100,9 +1126,6 @@ int32_t tsdbSnapWriterOpen(STsdb* pTsdb, int64_t sver, int64_t ever, STsdbSnapWr
...
@@ -1100,9 +1126,6 @@ int32_t tsdbSnapWriterOpen(STsdb* pTsdb, int64_t sver, int64_t ever, STsdbSnapWr
goto
_err
;
goto
_err
;
}
}
code
=
tsdbFSBegin
(
pTsdb
->
pFS
);
if
(
code
)
goto
_err
;
*
ppWriter
=
pWriter
;
*
ppWriter
=
pWriter
;
return
code
;
return
code
;
...
@@ -1117,8 +1140,9 @@ int32_t tsdbSnapWriterClose(STsdbSnapWriter** ppWriter, int8_t rollback) {
...
@@ -1117,8 +1140,9 @@ int32_t tsdbSnapWriterClose(STsdbSnapWriter** ppWriter, int8_t rollback) {
STsdbSnapWriter
*
pWriter
=
*
ppWriter
;
STsdbSnapWriter
*
pWriter
=
*
ppWriter
;
if
(
rollback
)
{
if
(
rollback
)
{
code
=
tsdbFSRollback
(
pWriter
->
pTsdb
->
pFS
);
ASSERT
(
0
);
if
(
code
)
goto
_err
;
// code = tsdbFSRollback(pWriter->pTsdb->pFS);
// if (code) goto _err;
}
else
{
}
else
{
code
=
tsdbSnapWriteDataEnd
(
pWriter
);
code
=
tsdbSnapWriteDataEnd
(
pWriter
);
if
(
code
)
goto
_err
;
if
(
code
)
goto
_err
;
...
@@ -1126,7 +1150,10 @@ int32_t tsdbSnapWriterClose(STsdbSnapWriter** ppWriter, int8_t rollback) {
...
@@ -1126,7 +1150,10 @@ int32_t tsdbSnapWriterClose(STsdbSnapWriter** ppWriter, int8_t rollback) {
code
=
tsdbSnapWriteDelEnd
(
pWriter
);
code
=
tsdbSnapWriteDelEnd
(
pWriter
);
if
(
code
)
goto
_err
;
if
(
code
)
goto
_err
;
code
=
tsdbFSCommit
(
pWriter
->
pTsdb
->
pFS
);
code
=
tsdbFSCommit1
(
pWriter
->
pTsdb
,
&
pWriter
->
fs
);
if
(
code
)
goto
_err
;
code
=
tsdbFSCommit2
(
pWriter
->
pTsdb
,
&
pWriter
->
fs
);
if
(
code
)
goto
_err
;
if
(
code
)
goto
_err
;
}
}
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录