Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
慢慢CG
TDengine
提交
9ce66f4a
T
TDengine
项目概览
慢慢CG
/
TDengine
与 Fork 源项目一致
Fork自
taosdata / TDengine
通知
1
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
T
TDengine
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
提交
9ce66f4a
编写于
1月 20, 2021
作者:
S
Shengliang Guan
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
TD-2798
上级
b01addfd
变更
1
隐藏空白更改
内联
并排
Showing
1 changed file
with
174 addition
and
84 deletion
+174
-84
src/tsdb/src/tsdbSync.c
src/tsdb/src/tsdbSync.c
+174
-84
未找到文件。
src/tsdb/src/tsdbSync.c
浏览文件 @
9ce66f4a
...
...
@@ -13,13 +13,16 @@
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#define _DEFAULT_SOURCE
#include "os.h"
#include "taoserror.h"
#include "tsdbint.h"
// Sync handle
typedef
struct
{
STsdbRepo
*
pRepo
;
SRtn
rtn
;
int
socketFd
;
int
32_t
socketFd
;
void
*
pBuf
;
SMFile
*
pmf
;
SMFile
mf
;
...
...
@@ -29,22 +32,22 @@ typedef struct {
#define SYNC_BUFFER(sh) ((sh)->pBuf)
static
void
tsdbInitSyncH
(
SSyncH
*
pSyncH
,
STsdbRepo
*
pRepo
,
in
t
socketFd
);
static
void
tsdbDestroySyncH
(
SSyncH
*
pSyncH
);
static
int
tsdbSyncSendMeta
(
SSyncH
*
pSynch
);
static
int
tsdbSyncRecvMeta
(
SSyncH
*
pSynch
);
static
int
tsdbSendMetaInfo
(
SSyncH
*
pSynch
);
static
int
tsdbRecvMetaInfo
(
SSyncH
*
pSynch
);
static
int
tsdbSendDecision
(
SSyncH
*
pSynch
,
bool
toSend
);
static
int
tsdbRecvDecision
(
SSyncH
*
pSynch
,
bool
*
toSend
);
static
int
tsdbSyncSendDFileSetArray
(
SSyncH
*
pSynch
);
static
int
tsdbSyncRecvDFileSetArray
(
SSyncH
*
pSynch
);
static
bool
tsdbIsTowFSetSame
(
SDFileSet
*
pSet1
,
SDFileSet
*
pSet2
);
static
int
tsdbSyncSendDFileSet
(
SSyncH
*
pSynch
,
SDFileSet
*
pSet
);
static
int
tsdbSendDFileSetInfo
(
SSyncH
*
pSynch
,
SDFileSet
*
pSet
);
static
int
tsdbRecvDFileSetInfo
(
SSyncH
*
pSynch
);
int
tsdbSyncSend
(
STsdbRepo
*
pRepo
,
in
t
socketFd
)
{
static
void
tsdbInitSyncH
(
SSyncH
*
pSyncH
,
STsdbRepo
*
pRepo
,
int32_
t
socketFd
);
static
void
tsdbDestroySyncH
(
SSyncH
*
pSyncH
);
static
int
32_t
tsdbSyncSendMeta
(
SSyncH
*
pSynch
);
static
int
32_t
tsdbSyncRecvMeta
(
SSyncH
*
pSynch
);
static
int
32_t
tsdbSendMetaInfo
(
SSyncH
*
pSynch
);
static
int
32_t
tsdbRecvMetaInfo
(
SSyncH
*
pSynch
);
static
int
32_t
tsdbSendDecision
(
SSyncH
*
pSynch
,
bool
toSend
);
static
int
32_t
tsdbRecvDecision
(
SSyncH
*
pSynch
,
bool
*
toSend
);
static
int
32_t
tsdbSyncSendDFileSetArray
(
SSyncH
*
pSynch
);
static
int
32_t
tsdbSyncRecvDFileSetArray
(
SSyncH
*
pSynch
);
static
bool
tsdbIsTowFSetSame
(
SDFileSet
*
pSet1
,
SDFileSet
*
pSet2
);
static
int
32_t
tsdbSyncSendDFileSet
(
SSyncH
*
pSynch
,
SDFileSet
*
pSet
);
static
int
32_t
tsdbSendDFileSetInfo
(
SSyncH
*
pSynch
,
SDFileSet
*
pSet
);
static
int
32_t
tsdbRecvDFileSetInfo
(
SSyncH
*
pSynch
);
int
32_t
tsdbSyncSend
(
STsdbRepo
*
pRepo
,
int32_
t
socketFd
)
{
SSyncH
synch
=
{
0
};
tsdbInitSyncH
(
&
synch
,
pRepo
,
socketFd
);
...
...
@@ -52,12 +55,12 @@ int tsdbSyncSend(STsdbRepo *pRepo, int socketFd) {
sem_wait
(
&
(
pRepo
->
readyToCommit
));
if
(
tsdbSyncSendMeta
(
&
synch
)
<
0
)
{
tsdbError
(
"vgId:%d
failed to send meta
file since %s"
,
REPO_ID
(
pRepo
),
tstrerror
(
terrno
));
tsdbError
(
"vgId:%d
, failed to send meta
file since %s"
,
REPO_ID
(
pRepo
),
tstrerror
(
terrno
));
goto
_err
;
}
if
(
tsdbSyncSendDFileSetArray
(
&
synch
)
<
0
)
{
tsdbError
(
"vgId:%d
failed to send data file set array
since %s"
,
REPO_ID
(
pRepo
),
tstrerror
(
terrno
));
tsdbError
(
"vgId:%d
, failed to send filesets
since %s"
,
REPO_ID
(
pRepo
),
tstrerror
(
terrno
));
goto
_err
;
}
...
...
@@ -72,19 +75,19 @@ _err:
return
-
1
;
}
int
tsdbSyncRecv
(
STsdbRepo
*
pRepo
,
in
t
socketFd
)
{
int
32_t
tsdbSyncRecv
(
STsdbRepo
*
pRepo
,
int32_
t
socketFd
)
{
SSyncH
synch
;
tsdbInitSyncH
(
&
synch
,
pRepo
,
socketFd
);
tsdbStartFSTxn
(
pRepo
,
0
,
0
);
if
(
tsdbSyncRecvMeta
(
&
synch
)
<
0
)
{
tsdbError
(
"vgId:%d
failed to sync recv meta file from remot
e since %s"
,
REPO_ID
(
pRepo
),
tstrerror
(
terrno
));
tsdbError
(
"vgId:%d
, failed to recv metafil
e since %s"
,
REPO_ID
(
pRepo
),
tstrerror
(
terrno
));
goto
_err
;
}
if
(
tsdbSyncRecvDFileSetArray
(
&
synch
)
<
0
)
{
tsdbError
(
"vgId:%d
failed to sync recv data file set from remote
since %s"
,
REPO_ID
(
pRepo
),
tstrerror
(
terrno
));
tsdbError
(
"vgId:%d
, failed to recv filesets
since %s"
,
REPO_ID
(
pRepo
),
tstrerror
(
terrno
));
goto
_err
;
}
...
...
@@ -100,7 +103,7 @@ _err:
return
-
1
;
}
static
void
tsdbInitSyncH
(
SSyncH
*
pSyncH
,
STsdbRepo
*
pRepo
,
int
socketFd
)
{
static
void
tsdbInitSyncH
(
SSyncH
*
pSyncH
,
STsdbRepo
*
pRepo
,
int
32_t
socketFd
)
{
pSyncH
->
pRepo
=
pRepo
;
pSyncH
->
socketFd
=
socketFd
;
tsdbGetRtnSnap
(
pRepo
,
&
(
pSyncH
->
rtn
));
...
...
@@ -108,90 +111,109 @@ static void tsdbInitSyncH(SSyncH *pSyncH, STsdbRepo *pRepo, int socketFd) {
static
void
tsdbDestroySyncH
(
SSyncH
*
pSyncH
)
{
taosTZfree
(
pSyncH
->
pBuf
);
}
// ============ SYNC META API
static
int
tsdbSyncSendMeta
(
SSyncH
*
pSynch
)
{
static
int32_t
tsdbSyncSendMeta
(
SSyncH
*
pSynch
)
{
STsdbRepo
*
pRepo
=
pSynch
->
pRepo
;
bool
toSendMeta
=
false
;
SMFile
mf
;
// Send meta info to remote
if
(
tsdbSendMetaInfo
(
pSynch
)
<
0
)
{
tsdbError
(
"vgId:%d
failed to send meta file
info since %s"
,
REPO_ID
(
pRepo
),
tstrerror
(
terrno
));
tsdbError
(
"vgId:%d
, failed to send meta
info since %s"
,
REPO_ID
(
pRepo
),
tstrerror
(
terrno
));
return
-
1
;
}
if
(
pRepo
->
fs
->
cstatus
->
pmf
==
NULL
)
{
// No meta file, not need to wait to retrieve meta file
tsdbInfo
(
"vgId:%d, metafile not exist, no need to send"
,
REPO_ID
(
pRepo
));
return
0
;
}
if
(
tsdbRecvDecision
(
pSynch
,
&
toSendMeta
)
<
0
)
{
tsdbError
(
"vgId:%d
failed to recv send file decision
since %s"
,
REPO_ID
(
pRepo
),
tstrerror
(
terrno
));
tsdbError
(
"vgId:%d
, failed to recv decision while send meta
since %s"
,
REPO_ID
(
pRepo
),
tstrerror
(
terrno
));
return
-
1
;
}
if
(
toSendMeta
)
{
tsdbInfo
(
"vgId:%d, metafile will be sent"
,
REPO_ID
(
pRepo
));
tsdbInitMFileEx
(
&
mf
,
pRepo
->
fs
->
cstatus
->
pmf
);
if
(
tsdbOpenMFile
(
&
mf
,
O_RDONLY
)
<
0
)
{
tsdbError
(
"vgId:%d
failed to open meta file while sync send meta
since %s"
,
REPO_ID
(
pRepo
),
tstrerror
(
terrno
));
tsdbError
(
"vgId:%d
, failed to open file while send metafile
since %s"
,
REPO_ID
(
pRepo
),
tstrerror
(
terrno
));
return
-
1
;
}
if
(
taosSendFile
(
pSynch
->
socketFd
,
TSDB_FILE_FD
(
&
mf
),
0
,
mf
.
info
.
size
)
<
mf
.
info
.
size
)
{
tsdbError
(
"vgId:%d failed to copy meta file to remote since %s"
,
REPO_ID
(
pRepo
),
tstrerror
(
terrno
));
int32_t
writeLen
=
mf
.
info
.
size
;
int32_t
ret
=
taosSendFile
(
pSynch
->
socketFd
,
TSDB_FILE_FD
(
&
mf
),
0
,
writeLen
);
if
(
ret
!=
writeLen
)
{
terrno
=
TAOS_SYSTEM_ERROR
(
errno
);
tsdbError
(
"vgId:%d, failed to send metafile since %s, ret:%d writeLen:%d"
,
REPO_ID
(
pRepo
),
tstrerror
(
terrno
),
ret
,
writeLen
);
tsdbCloseMFile
(
&
mf
);
return
-
1
;
}
tsdbCloseMFile
(
&
mf
);
tsdbInfo
(
"vgId:%d, metafile is sent, size:%d"
,
REPO_ID
(
pRepo
),
writeLen
);
}
else
{
tsdbInfo
(
"vgId:%d, metafile is same, no need to send"
,
REPO_ID
(
pRepo
));
}
return
0
;
}
static
int
tsdbSyncRecvMeta
(
SSyncH
*
pSynch
)
{
static
int
32_t
tsdbSyncRecvMeta
(
SSyncH
*
pSynch
)
{
STsdbRepo
*
pRepo
=
pSynch
->
pRepo
;
SMFile
*
pLMFile
=
pRepo
->
fs
->
cstatus
->
pmf
;
// Recv meta info from remote
if
(
tsdbRecvMetaInfo
(
pSynch
)
<
0
)
{
tsdbError
(
"vgId:%d
failed to recv meta info from remote
since %s"
,
REPO_ID
(
pRepo
),
tstrerror
(
terrno
));
tsdbError
(
"vgId:%d
, failed to recv metainfo
since %s"
,
REPO_ID
(
pRepo
),
tstrerror
(
terrno
));
return
-
1
;
}
// No meta file, do nothing (rm local meta file)
if
(
pSynch
->
pmf
==
NULL
)
{
tsdbInfo
(
"vgId:%d, metafile not exist in remote, no need to recv"
,
REPO_ID
(
pRepo
));
return
0
;
}
if
(
pLMFile
==
NULL
||
memcmp
(
&
(
pSynch
->
pmf
->
info
),
&
(
pLMFile
->
info
),
sizeof
(
SMFInfo
))
!=
0
)
{
// Local has no meta file or has a different meta file, need to copy from remote
if
(
tsdbSendDecision
(
pSynch
,
true
)
<
0
)
{
// TODO
tsdbError
(
"vgId:%d, failed to send decision while recv metafile since %s"
,
REPO_ID
(
pRepo
),
tstrerror
(
terrno
));
return
-
1
;
}
tsdbInfo
(
"vgId:%d, metafile will be received"
,
REPO_ID
(
pRepo
));
// Recv from remote
SMFile
mf
;
SDiskID
did
=
{.
level
=
TFS_PRIMARY_LEVEL
,
.
id
=
TFS_PRIMARY_ID
};
tsdbInitMFile
(
&
mf
,
did
,
REPO_ID
(
pRepo
),
FS_TXN_VERSION
(
REPO_FS
(
pRepo
)));
if
(
tsdbCreateMFile
(
&
mf
,
false
)
<
0
)
{
// TODO
tsdbError
(
"vgId:%d, failed to create file while recv metafile since %s"
,
REPO_ID
(
pRepo
),
tstrerror
(
terrno
));
return
-
1
;
}
if
(
taosCopyFds
(
pSynch
->
socketFd
,
TSDB_FILE_FD
(
&
mf
),
pSynch
->
pmf
->
info
.
size
)
<
pSynch
->
pmf
->
info
.
size
)
{
// TODO
int32_t
readLen
=
pSynch
->
pmf
->
info
.
size
;
int32_t
ret
=
taosCopyFds
(
pSynch
->
socketFd
,
TSDB_FILE_FD
(
&
mf
),
readLen
);
if
(
ret
!=
readLen
)
{
terrno
=
TAOS_SYSTEM_ERROR
(
errno
);
tsdbError
(
"vgId:%d, failed to recv metafile since %s, ret:%d readLen:%d"
,
REPO_ID
(
pRepo
),
tstrerror
(
terrno
),
ret
,
readLen
);
tsdbCloseMFile
(
&
mf
);
tsdbRemoveMFile
(
&
mf
);
return
-
1
;
}
tsdbInfo
(
"vgId:%d, metafile is received, size:%d"
,
REPO_ID
(
pRepo
),
readLen
);
tsdbCloseMFile
(
&
mf
);
tsdbUpdateMFile
(
REPO_FS
(
pRepo
),
&
mf
);
}
else
{
tsdbInfo
(
"vgId:%d, metafile is same, no need to recv"
,
REPO_ID
(
pRepo
));
if
(
tsdbSendDecision
(
pSynch
,
false
)
<
0
)
{
// TODO
tsdbError
(
"vgId:%d, failed to send decision while recv metafile since %s"
,
REPO_ID
(
pRepo
),
tstrerror
(
terrno
));
return
-
1
;
}
}
...
...
@@ -199,7 +221,7 @@ static int tsdbSyncRecvMeta(SSyncH *pSynch) {
return
0
;
}
static
int
tsdbSendMetaInfo
(
SSyncH
*
pSynch
)
{
static
int
32_t
tsdbSendMetaInfo
(
SSyncH
*
pSynch
)
{
STsdbRepo
*
pRepo
=
pSynch
->
pRepo
;
uint32_t
tlen
=
0
;
SMFile
*
pMFile
=
pRepo
->
fs
->
cstatus
->
pmf
;
...
...
@@ -209,6 +231,7 @@ static int tsdbSendMetaInfo(SSyncH *pSynch) {
}
if
(
tsdbMakeRoom
((
void
**
)(
&
SYNC_BUFFER
(
pSynch
)),
tlen
)
<
0
)
{
tsdbError
(
"vgId:%d, failed to makeroom while send metainfo since %s"
,
REPO_ID
(
pRepo
),
tstrerror
(
terrno
));
return
-
1
;
}
...
...
@@ -220,45 +243,55 @@ static int tsdbSendMetaInfo(SSyncH *pSynch) {
taosCalcChecksumAppend
(
0
,
(
uint8_t
*
)
tptr
,
tlen
);
}
if
(
taosWriteMsg
(
pSynch
->
socketFd
,
SYNC_BUFFER
(
pSynch
),
tlen
+
sizeof
(
uint32_t
))
<
tlen
+
sizeof
(
uint32_t
))
{
tsdbError
(
"vgId:%d failed to send sync meta file info to remote since %s"
,
REPO_ID
(
pRepo
),
strerror
(
errno
));
int32_t
writeLen
=
tlen
+
sizeof
(
uint32_t
);
int32_t
ret
=
taosWriteMsg
(
pSynch
->
socketFd
,
SYNC_BUFFER
(
pSynch
),
writeLen
);
if
(
ret
!=
writeLen
)
{
terrno
=
TAOS_SYSTEM_ERROR
(
errno
);
tsdbError
(
"vgId:%d, failed to send metainfo since %s, ret:%d writeLen:%d"
,
REPO_ID
(
pRepo
),
tstrerror
(
terrno
),
ret
,
writeLen
);
return
-
1
;
}
return
0
;
}
static
int
tsdbRecvMetaInfo
(
SSyncH
*
pSynch
)
{
uint32_t
tlen
;
char
buf
[
64
]
=
"
\0
"
;
static
int32_t
tsdbRecvMetaInfo
(
SSyncH
*
pSynch
)
{
STsdbRepo
*
pRepo
=
pSynch
->
pRepo
;
uint32_t
tlen
=
0
;
char
buf
[
64
]
=
{
0
};
if
(
taosReadMsg
(
pSynch
->
socketFd
,
buf
,
sizeof
(
tlen
))
<
sizeof
(
tlen
))
{
// TODO
int32_t
readLen
=
sizeof
(
uint32_t
);
int32_t
ret
=
taosReadMsg
(
pSynch
->
socketFd
,
buf
,
readLen
);
if
(
ret
!=
readLen
)
{
terrno
=
TAOS_SYSTEM_ERROR
(
errno
);
tsdbError
(
"vgId:%d, failed to recv metainfo len, ret:%d readLen:%d"
,
REPO_ID
(
pRepo
),
ret
,
readLen
);
return
-
1
;
}
taosDecodeFixedU32
(
buf
,
&
tlen
);
tsdbInfo
(
"vgId:%d, metainfo len:%d is received"
,
REPO_ID
(
pRepo
),
tlen
);
if
(
tlen
==
0
)
{
pSynch
->
pmf
=
NULL
;
return
0
;
}
if
(
tsdbMakeRoom
((
void
**
)(
&
SYNC_BUFFER
(
pSynch
)),
tlen
)
<
0
)
{
tsdbError
(
"vgId:%d, failed to makeroom while recv metainfo since %s"
,
REPO_ID
(
pRepo
),
tstrerror
(
terrno
));
return
-
1
;
}
if
(
taosReadMsg
(
pSynch
->
socketFd
,
SYNC_BUFFER
(
pSynch
),
tlen
)
<
tlen
)
{
// TODO
ret
=
taosReadMsg
(
pSynch
->
socketFd
,
SYNC_BUFFER
(
pSynch
),
tlen
);
if
(
ret
!=
tlen
)
{
terrno
=
TAOS_SYSTEM_ERROR
(
errno
);
tsdbError
(
"vgId:%d, failed to recv metainfo, ret:%d readLen:%d"
,
REPO_ID
(
pRepo
),
ret
,
tlen
);
return
-
1
;
}
tsdbInfo
(
"vgId:%d, metainfo is received"
,
REPO_ID
(
pRepo
));
if
(
!
taosCheckChecksumWhole
((
uint8_t
*
)
SYNC_BUFFER
(
pSynch
),
tlen
))
{
// TODO
terrno
=
TSDB_CODE_TDB_MESSED_MSG
;
tsdbError
(
"vgId:%d, failed to checksum while recv metainfo since %s"
,
REPO_ID
(
pRepo
),
tstrerror
(
terrno
));
return
-
1
;
}
...
...
@@ -268,34 +301,38 @@ static int tsdbRecvMetaInfo(SSyncH *pSynch) {
return
0
;
}
static
int
tsdbSendDecision
(
SSyncH
*
pSynch
,
bool
toSend
)
{
uint8_t
decision
=
toSend
;
static
int32_t
tsdbSendDecision
(
SSyncH
*
pSynch
,
bool
toSend
)
{
STsdbRepo
*
pRepo
=
pSynch
->
pRepo
;
uint8_t
decision
=
toSend
;
if
(
taosWriteMsg
(
pSynch
->
socketFd
,
(
void
*
)(
&
decision
),
sizeof
(
decision
))
<
sizeof
(
decision
))
{
// TODO
int32_t
writeLen
=
sizeof
(
uint8_t
);
int32_t
ret
=
taosWriteMsg
(
pSynch
->
socketFd
,
(
void
*
)(
&
decision
),
writeLen
);
if
(
ret
!=
writeLen
)
{
terrno
=
TAOS_SYSTEM_ERROR
(
errno
);
tsdbError
(
"vgId:%d, failed to send decison, ret:%d writeLen:%d"
,
REPO_ID
(
pRepo
),
ret
,
writeLen
);
return
-
1
;
}
return
0
;
}
static
int
tsdbRecvDecision
(
SSyncH
*
pSynch
,
bool
*
toSend
)
{
uint8_t
decision
;
static
int32_t
tsdbRecvDecision
(
SSyncH
*
pSynch
,
bool
*
toSend
)
{
STsdbRepo
*
pRepo
=
pSynch
->
pRepo
;
uint8_t
decision
=
0
;
if
(
taosReadMsg
(
pSynch
->
socketFd
,
(
void
*
)(
&
decision
),
sizeof
(
decision
))
<
sizeof
(
decision
))
{
// TODO
int32_t
readLen
=
sizeof
(
uint8_t
);
int32_t
ret
=
taosReadMsg
(
pSynch
->
socketFd
,
(
void
*
)(
&
decision
),
readLen
);
if
(
ret
!=
readLen
)
{
terrno
=
TAOS_SYSTEM_ERROR
(
errno
);
tsdbError
(
"vgId:%d, failed to recv decison, ret:%d readLen:%d"
,
REPO_ID
(
pRepo
),
ret
,
readLen
);
return
-
1
;
}
*
toSend
=
decision
;
return
0
;
}
// ========== SYNC DATA FILE SET ARRAY API
static
int
tsdbSyncSendDFileSetArray
(
SSyncH
*
pSynch
)
{
static
int32_t
tsdbSyncSendDFileSetArray
(
SSyncH
*
pSynch
)
{
STsdbRepo
*
pRepo
=
pSynch
->
pRepo
;
STsdbFS
*
pfs
=
REPO_FS
(
pRepo
);
SFSIter
fsiter
;
...
...
@@ -306,12 +343,13 @@ static int tsdbSyncSendDFileSetArray(SSyncH *pSynch) {
do
{
pSet
=
tsdbFSIterNext
(
&
fsiter
);
if
(
tsdbSyncSendDFileSet
(
pSynch
,
pSet
)
<
0
)
{
// TODO
tsdbError
(
"vgId:%d, failed to send fileset:%d since %s"
,
REPO_ID
(
pRepo
),
pSet
->
fid
,
tstrerror
(
terrno
));
return
-
1
;
}
// No more file set to send, jut break
if
(
pSet
==
NULL
)
{
tsdbInfo
(
"vgId:%d, no filesets any more"
,
REPO_ID
(
pRepo
));
break
;
}
}
while
(
true
);
...
...
@@ -319,7 +357,7 @@ static int tsdbSyncSendDFileSetArray(SSyncH *pSynch) {
return
0
;
}
static
int
tsdbSyncRecvDFileSetArray
(
SSyncH
*
pSynch
)
{
static
int
32_t
tsdbSyncRecvDFileSetArray
(
SSyncH
*
pSynch
)
{
STsdbRepo
*
pRepo
=
pSynch
->
pRepo
;
STsdbFS
*
pfs
=
REPO_FS
(
pRepo
);
SFSIter
fsiter
;
...
...
@@ -329,34 +367,44 @@ static int tsdbSyncRecvDFileSetArray(SSyncH *pSynch) {
pLSet
=
tsdbFSIterNext
(
&
fsiter
);
if
(
tsdbRecvDFileSetInfo
(
pSynch
)
<
0
)
{
// TODO
tsdbError
(
"vgId:%d, failed to recv fileset since %s"
,
REPO_ID
(
pRepo
),
tstrerror
(
terrno
));
return
-
1
;
}
while
(
true
)
{
if
(
pLSet
==
NULL
&&
pSynch
->
pdf
==
NULL
)
break
;
if
(
pLSet
==
NULL
&&
pSynch
->
pdf
==
NULL
)
{
tsdbInfo
(
"vgId:%d, all filesets is disposed"
,
REPO_ID
(
pRepo
));
break
;
}
else
{
tsdbInfo
(
"vgId:%d, fileset local:%d remote:%d, will be disposed"
,
REPO_ID
(
pRepo
),
pLSet
!=
NULL
?
pLSet
->
fid
:
-
1
,
pSynch
->
pdf
!=
NULL
?
pSynch
->
pdf
->
fid
:
-
1
);
}
if
(
pLSet
&&
(
pSynch
->
pdf
==
NULL
||
pLSet
->
fid
<
pSynch
->
pdf
->
fid
))
{
// remote not has pLSet->fid set, just remove local (do nothing to remote the fset)
tsdbInfo
(
"vgId:%d, fileset:%d smaller than remote:%d, remove it"
,
REPO_ID
(
pRepo
),
pLSet
->
fid
,
pSynch
->
pdf
->
fid
);
pLSet
=
tsdbFSIterNext
(
&
fsiter
);
}
else
{
if
(
pLSet
&&
pSynch
->
pdf
&&
pLSet
->
fid
==
pSynch
->
pdf
->
fid
&&
tsdbIsTowFSetSame
(
pLSet
,
pSynch
->
pdf
))
{
// Just keep local files and notify remote not to send
tsdbInfo
(
"vgId:%d, fileset:%d is same and no need to recv"
,
REPO_ID
(
pRepo
),
pLSet
->
fid
);
if
(
tsdbUpdateDFileSet
(
pfs
,
pLSet
)
<
0
)
{
// TODO
tsdbError
(
"vgId:%d, failed to update fileset since %s"
,
REPO_ID
(
pRepo
),
tstrerror
(
terrno
));
return
-
1
;
}
if
(
tsdbSendDecision
(
pSynch
,
false
)
<
0
)
{
// TODO
tsdbError
(
"vgId:%d, filed to send decision since %s"
,
REPO_ID
(
pRepo
),
tstrerror
(
terrno
));
return
-
1
;
}
}
else
{
// Need to copy from remote
tsdbInfo
(
"vgId:%d, fileset:%d will be received"
,
REPO_ID
(
pRepo
),
pSynch
->
pdf
->
fid
);
// Notify remote to send there file here
if
(
tsdbSendDecision
(
pSynch
,
true
)
<
0
)
{
// TODO
tsdbError
(
"vgId:%d, failed to send decision since %s"
,
REPO_ID
(
pRepo
),
tstrerror
(
terrno
));
return
-
1
;
}
...
...
@@ -367,6 +415,7 @@ static int tsdbSyncRecvDFileSetArray(SSyncH *pSynch) {
tfsAllocDisk
(
tsdbGetFidLevel
(
pSynch
->
pdf
->
fid
,
&
(
pSynch
->
rtn
)),
&
(
did
.
level
),
&
(
did
.
id
));
if
(
did
.
level
==
TFS_UNDECIDED_LEVEL
)
{
terrno
=
TSDB_CODE_TDB_NO_AVAIL_DISK
;
tsdbError
(
"vgId:%d, failed allc disk since %s"
,
REPO_ID
(
pRepo
),
tstrerror
(
terrno
));
return
-
1
;
}
...
...
@@ -374,34 +423,45 @@ static int tsdbSyncRecvDFileSetArray(SSyncH *pSynch) {
// Create new FSET
if
(
tsdbCreateDFileSet
(
&
fset
,
false
)
<
0
)
{
// TODO
tsdbError
(
"vgId:%d, failed to create fileset since %s"
,
REPO_ID
(
pRepo
),
tstrerror
(
terrno
));
return
-
1
;
}
for
(
TSDB_FILE_T
ftype
=
0
;
ftype
<
TSDB_FILE_MAX
;
ftype
++
)
{
SDFile
*
pDFile
=
TSDB_DFILE_IN_SET
(
&
fset
,
ftype
);
// local file
SDFile
*
pRDFile
=
TSDB_DFILE_IN_SET
(
pSynch
->
pdf
,
ftype
);
// remote file
if
(
taosCopyFds
(
pSynch
->
socketFd
,
pDFile
->
fd
,
pRDFile
->
info
.
size
)
<
pRDFile
->
info
.
size
)
{
// TODO
tsdbInfo
(
"vgId:%d, file:%s will be received, osize:%"
PRIu64
" rsize:%"
PRIu64
,
REPO_ID
(
pRepo
),
pDFile
->
f
.
aname
,
pDFile
->
info
.
size
,
pRDFile
->
info
.
size
);
int32_t
writeLen
=
pRDFile
->
info
.
size
;
int32_t
ret
=
taosCopyFds
(
pSynch
->
socketFd
,
pDFile
->
fd
,
writeLen
);
if
(
ret
!=
writeLen
)
{
terrno
=
TAOS_SYSTEM_ERROR
(
errno
);
tsdbError
(
"vgId:%d, failed to recv file:%s since %s, ret:%d writeLen:%d"
,
REPO_ID
(
pRepo
),
pDFile
->
f
.
aname
,
tstrerror
(
terrno
),
ret
,
writeLen
);
tsdbCloseDFileSet
(
&
fset
);
tsdbRemoveDFileSet
(
&
fset
);
return
-
1
;
}
// Update new file info
pDFile
->
info
=
pRDFile
->
info
;
tsdbInfo
(
"vgId:%d, file:%s is received, size:%d"
,
REPO_ID
(
pRepo
),
pDFile
->
f
.
aname
,
writeLen
);
}
tsdbCloseDFileSet
(
&
fset
);
if
(
tsdbUpdateDFileSet
(
pfs
,
&
fset
)
<
0
)
{
// TODO
tsdbInfo
(
"vgId:%d, fileset:%d failed to update since %s"
,
REPO_ID
(
pRepo
),
fset
.
fid
,
tstrerror
(
terrno
));
return
-
1
;
}
tsdbInfo
(
"vgId:%d, fileset:%d is received"
,
REPO_ID
(
pRepo
),
pSynch
->
pdf
->
fid
);
}
// Move forward
if
(
tsdbRecvDFileSetInfo
(
pSynch
)
<
0
)
{
// TODO
tsdbError
(
"vgId:%d, failed to recv fileset since %s"
,
REPO_ID
(
pRepo
),
tstrerror
(
terrno
));
return
-
1
;
}
...
...
@@ -455,11 +515,12 @@ static bool tsdbIsTowFSetSame(SDFileSet *pSet1, SDFileSet *pSet2) {
return
true
;
}
static
int
tsdbSyncSendDFileSet
(
SSyncH
*
pSynch
,
SDFileSet
*
pSet
)
{
static
int32_t
tsdbSyncSendDFileSet
(
SSyncH
*
pSynch
,
SDFileSet
*
pSet
)
{
STsdbRepo
*
pRepo
=
pSynch
->
pRepo
;
bool
toSend
=
false
;
if
(
tsdbSendDFileSetInfo
(
pSynch
,
pSet
)
<
0
)
{
// TODO
tsdbError
(
"vgId:%d, failed to send fileset:%d info since %s"
,
REPO_ID
(
pRepo
),
pSet
->
fid
,
tstrerror
(
terrno
));
return
-
1
;
}
...
...
@@ -469,37 +530,56 @@ static int tsdbSyncSendDFileSet(SSyncH *pSynch, SDFileSet *pSet) {
}
if
(
tsdbRecvDecision
(
pSynch
,
&
toSend
)
<
0
)
{
tsdbError
(
"vgId:%d, failed to recv decision while send fileset:%d since %s"
,
REPO_ID
(
pRepo
),
pSet
->
fid
,
tstrerror
(
terrno
));
return
-
1
;
}
if
(
toSend
)
{
tsdbInfo
(
"vgId:%d, fileset:%d will be sent"
,
REPO_ID
(
pRepo
),
pSet
->
fid
);
for
(
TSDB_FILE_T
ftype
=
0
;
ftype
<
TSDB_FILE_MAX
;
ftype
++
)
{
SDFile
df
=
*
TSDB_DFILE_IN_SET
(
pSet
,
ftype
);
if
(
tsdbOpenDFile
(
&
df
,
O_RDONLY
)
<
0
)
{
tsdbError
(
"vgId:%d, failed to file:%s since %s"
,
REPO_ID
(
pRepo
),
df
.
f
.
aname
,
tstrerror
(
terrno
));
return
-
1
;
}
if
(
taosSendFile
(
pSynch
->
socketFd
,
TSDB_FILE_FD
(
&
df
),
0
,
df
.
info
.
size
)
<
df
.
info
.
size
)
{
int32_t
writeLen
=
df
.
info
.
size
;
tsdbInfo
(
"vgId:%d, file:%s will be sent, size:%d"
,
REPO_ID
(
pRepo
),
df
.
f
.
aname
,
writeLen
);
int32_t
ret
=
taosSendFile
(
pSynch
->
socketFd
,
TSDB_FILE_FD
(
&
df
),
0
,
writeLen
);
if
(
ret
!=
writeLen
)
{
terrno
=
TAOS_SYSTEM_ERROR
(
errno
);
tsdbError
(
"vgId:%d, failed to send file:%s since %s, ret:%d writeLen:%d"
,
REPO_ID
(
pRepo
),
df
.
f
.
aname
,
tstrerror
(
terrno
),
ret
,
writeLen
);
tsdbCloseDFile
(
&
df
);
return
-
1
;
}
tsdbInfo
(
"vgId:%d, file:%s is sent"
,
REPO_ID
(
pRepo
),
df
.
f
.
aname
);
tsdbCloseDFile
(
&
df
);
}
tsdbInfo
(
"vgId:%d, fileset:%d is sent"
,
REPO_ID
(
pRepo
),
pSet
->
fid
);
}
else
{
tsdbInfo
(
"vgId:%d, fileset:%d is same, no need to send"
,
REPO_ID
(
pRepo
),
pSet
->
fid
);
}
return
0
;
}
static
int
tsdbSendDFileSetInfo
(
SSyncH
*
pSynch
,
SDFileSet
*
pSet
)
{
uint32_t
tlen
=
0
;
static
int32_t
tsdbSendDFileSetInfo
(
SSyncH
*
pSynch
,
SDFileSet
*
pSet
)
{
STsdbRepo
*
pRepo
=
pSynch
->
pRepo
;
uint32_t
tlen
=
0
;
if
(
pSet
)
{
tlen
=
tsdbEncodeDFileSetEx
(
NULL
,
pSet
)
+
sizeof
(
TSCKSUM
);
}
if
(
tsdbMakeRoom
((
void
**
)(
&
SYNC_BUFFER
(
pSynch
)),
tlen
+
sizeof
(
tlen
))
<
0
)
{
tsdbError
(
"vgId:%d, failed to makeroom while send fileinfo since %s"
,
REPO_ID
(
pRepo
),
tstrerror
(
terrno
));
return
-
1
;
}
...
...
@@ -511,42 +591,52 @@ static int tsdbSendDFileSetInfo(SSyncH *pSynch, SDFileSet *pSet) {
taosCalcChecksumAppend
(
0
,
(
uint8_t
*
)
tptr
,
tlen
);
}
if
(
taosWriteMsg
(
pSynch
->
socketFd
,
SYNC_BUFFER
(
pSynch
),
tlen
+
sizeof
(
tlen
))
<
tlen
+
sizeof
(
tlen
))
{
// TODO
int32_t
writeLen
=
tlen
+
sizeof
(
uint32_t
);
int32_t
ret
=
taosWriteMsg
(
pSynch
->
socketFd
,
SYNC_BUFFER
(
pSynch
),
writeLen
);
if
(
ret
!=
writeLen
)
{
terrno
=
TAOS_SYSTEM_ERROR
(
errno
);
tsdbError
(
"vgId:%d, failed to send fileinfo, ret:%d writeLen:%d"
,
REPO_ID
(
pRepo
),
ret
,
writeLen
);
return
-
1
;
}
return
0
;
}
static
int
tsdbRecvDFileSetInfo
(
SSyncH
*
pSynch
)
{
uint32_t
tlen
;
char
buf
[
64
]
=
"
\0
"
;
static
int32_t
tsdbRecvDFileSetInfo
(
SSyncH
*
pSynch
)
{
STsdbRepo
*
pRepo
=
pSynch
->
pRepo
;
uint32_t
tlen
;
char
buf
[
64
]
=
{
0
};
if
(
taosReadMsg
(
pSynch
->
socketFd
,
buf
,
sizeof
(
tlen
))
<
sizeof
(
tlen
))
{
int32_t
readLen
=
sizeof
(
uint32_t
);
int32_t
ret
=
taosReadMsg
(
pSynch
->
socketFd
,
buf
,
readLen
);
if
(
ret
!=
readLen
)
{
terrno
=
TAOS_SYSTEM_ERROR
(
errno
);
return
-
1
;
}
taosDecodeFixedU32
(
buf
,
&
tlen
);
tsdbInfo
(
"vgId:%d, fileinfo len:%d is received"
,
REPO_ID
(
pRepo
),
tlen
);
if
(
tlen
==
0
)
{
pSynch
->
pdf
=
NULL
;
return
0
;
}
if
(
tsdbMakeRoom
((
void
**
)(
&
SYNC_BUFFER
(
pSynch
)),
tlen
)
<
0
)
{
tsdbError
(
"vgId:%d, failed to makeroom while recv fileinfo since %s"
,
REPO_ID
(
pRepo
),
tstrerror
(
terrno
));
return
-
1
;
}
if
(
taosReadMsg
(
pSynch
->
socketFd
,
SYNC_BUFFER
(
pSynch
),
tlen
)
<
tlen
)
{
ret
=
taosReadMsg
(
pSynch
->
socketFd
,
SYNC_BUFFER
(
pSynch
),
tlen
);
if
(
ret
!=
tlen
)
{
terrno
=
TAOS_SYSTEM_ERROR
(
errno
);
tsdbError
(
"vgId:%d, failed to recv fileinfo, ret:%d readLen:%d"
,
REPO_ID
(
pRepo
),
ret
,
tlen
);
return
-
1
;
}
if
(
!
taosCheckChecksumWhole
((
uint8_t
*
)
SYNC_BUFFER
(
pSynch
),
tlen
))
{
terrno
=
TSDB_CODE_TDB_MESSED_MSG
;
tsdbError
(
"vgId:%d, failed to checksum while recv fileinfo since %s"
,
REPO_ID
(
pRepo
),
tstrerror
(
terrno
));
return
-
1
;
}
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录