Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
taosdata
TDengine
提交
ed9709c3
TDengine
项目概览
taosdata
/
TDengine
1 年多 前同步成功
通知
1185
Star
22016
Fork
4786
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
1
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
TDengine
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
1
Issue
1
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
提交
ed9709c3
编写于
1月 18, 2022
作者:
S
Shengliang Guan
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
refact tfs module
上级
d6359f3a
变更
20
显示空白变更内容
内联
并排
Showing
20 changed file
with
587 addition
and
453 deletion
+587
-453
include/libs/tfs/tfs.h
include/libs/tfs/tfs.h
+206
-57
include/util/tdef.h
include/util/tdef.h
+8
-4
source/common/src/tglobal.c
source/common/src/tglobal.c
+1
-1
source/dnode/mgmt/impl/inc/dndEnv.h
source/dnode/mgmt/impl/inc/dndEnv.h
+1
-0
source/dnode/mgmt/impl/inc/dndInt.h
source/dnode/mgmt/impl/inc/dndInt.h
+1
-0
source/dnode/mgmt/impl/src/dndEnv.c
source/dnode/mgmt/impl/src/dndEnv.c
+29
-4
source/dnode/vnode/inc/tsdb.h
source/dnode/vnode/inc/tsdb.h
+1
-1
source/dnode/vnode/inc/vnode.h
source/dnode/vnode/inc/vnode.h
+2
-1
source/dnode/vnode/src/inc/tsdbDef.h
source/dnode/vnode/src/inc/tsdbDef.h
+1
-0
source/dnode/vnode/src/inc/tsdbFile.h
source/dnode/vnode/src/inc/tsdbFile.h
+8
-8
source/dnode/vnode/src/inc/vnd.h
source/dnode/vnode/src/inc/vnd.h
+1
-0
source/dnode/vnode/src/tsdb/tsdbCommit.c
source/dnode/vnode/src/tsdb/tsdbCommit.c
+2
-4
source/dnode/vnode/src/tsdb/tsdbCompact.c
source/dnode/vnode/src/tsdb/tsdbCompact.c
+1
-2
source/dnode/vnode/src/tsdb/tsdbFS.c
source/dnode/vnode/src/tsdb/tsdbFS.c
+31
-31
source/dnode/vnode/src/tsdb/tsdbMain.c
source/dnode/vnode/src/tsdb/tsdbMain.c
+6
-5
source/dnode/vnode/src/vnd/vnodeMain.c
source/dnode/vnode/src/vnd/vnodeMain.c
+2
-1
source/libs/tfs/inc/tfsInt.h
source/libs/tfs/inc/tfsInt.h
+58
-24
source/libs/tfs/src/tfs.c
source/libs/tfs/src/tfs.c
+205
-284
source/libs/tfs/src/tfsDisk.c
source/libs/tfs/src/tfsDisk.c
+4
-4
source/libs/tfs/src/tfsTier.c
source/libs/tfs/src/tfsTier.c
+19
-22
未找到文件。
include/libs/tfs/tfs.h
浏览文件 @
ed9709c3
...
...
@@ -16,77 +16,226 @@
#ifndef _TD_TFS_H_
#define _TD_TFS_H_
#include "t
global
.h"
#include "t
cfg
.h"
#ifdef __cplusplus
extern
"C"
{
#endif
/* ------------------------ TYPES EXPOSED ------------------------ */
typedef
struct
STfs
STfs
;
typedef
struct
STfsDir
STfsDir
;
typedef
struct
{
int32_t
level
;
int32_t
id
;
}
SDiskID
;
#define TFS_UNDECIDED_LEVEL -1
#define TFS_UNDECIDED_ID -1
#define TFS_PRIMARY_LEVEL 0
#define TFS_PRIMARY_ID 0
#define TFS_MIN_LEVEL 0
#define TFS_MAX_LEVEL (TSDB_MAX_TIERS - 1)
// FS APIs ====================================
typedef
struct
{
int64_t
total
;
int64_t
used
;
int64_t
avail
;
}
SFSMeta
;
SDiskID
did
;
char
aname
[
TSDB_FILENAME_LEN
];
// ABS name
char
rname
[
TSDB_FILENAME_LEN
];
// REL name
STfs
*
pTfs
;
}
STfsFile
;
int32_t
tfsInit
(
SDiskCfg
*
pDiskCfg
,
int32_t
ndisk
);
void
tfsCleanup
();
void
tfsUpdateSize
(
SFSMeta
*
pFSMeta
);
void
tfsAllocDisk
(
int32_t
expLevel
,
int32_t
*
level
,
int32_t
*
id
);
/**
* @brief Open a fs.
*
* @param pCfg Config of the fs.
* @param ndisk Length of the config.
* @return STfs* The fs object.
*/
STfs
*
tfsOpen
(
SDiskCfg
*
pCfg
,
int32_t
ndisk
);
const
char
*
TFS_PRIMARY_PATH
();
const
char
*
TFS_DISK_PATH
(
int32_t
level
,
int32_t
id
);
/**
* @brief Close a fs.
*
* @param pTfs The fs object to close.
*/
void
tfsClose
(
STfs
*
pTfs
);
// TFILE APIs ====================================
typedef
struct
{
int32_t
level
;
int32_t
id
;
char
rname
[
TSDB_FILENAME_LEN
];
// REL name
char
aname
[
TSDB_FILENAME_LEN
];
// ABS name
}
TFILE
;
#define TFILE_LEVEL(pf) ((pf)->level)
#define TFILE_ID(pf) ((pf)->id)
#define TFILE_NAME(pf) ((pf)->aname)
#define TFILE_REL_NAME(pf) ((pf)->rname)
#define tfsopen(pf, flags) open(TFILE_NAME(pf), flags)
#define tfsclose(fd) close(fd)
#define tfsremove(pf) remove(TFILE_NAME(pf))
#define tfscopy(sf, df) taosCopyFile(TFILE_NAME(sf), TFILE_NAME(df))
#define tfsrename(sf, df) taosRename(TFILE_NAME(sf), TFILE_NAME(df))
void
tfsInitFile
(
TFILE
*
pf
,
int32_t
level
,
int32_t
id
,
const
char
*
bname
);
bool
tfsIsSameFile
(
const
TFILE
*
pf1
,
const
TFILE
*
pf2
);
int32_t
tfsEncodeFile
(
void
**
buf
,
TFILE
*
pf
);
void
*
tfsDecodeFile
(
void
*
buf
,
TFILE
*
pf
);
void
tfsbasename
(
const
TFILE
*
pf
,
char
*
dest
);
void
tfsdirname
(
const
TFILE
*
pf
,
char
*
dest
);
// DIR APIs ====================================
int32_t
tfsMkdirAt
(
const
char
*
rname
,
int32_t
level
,
int32_t
id
);
int32_t
tfsMkdirRecurAt
(
const
char
*
rname
,
int32_t
level
,
int32_t
id
);
int32_t
tfsMkdir
(
const
char
*
rname
);
int32_t
tfsRmdir
(
const
char
*
rname
);
int32_t
tfsRename
(
char
*
orname
,
char
*
nrname
);
typedef
struct
TDIR
TDIR
;
TDIR
*
tfsOpendir
(
const
char
*
rname
);
const
TFILE
*
tfsReaddir
(
TDIR
*
tdir
);
void
tfsClosedir
(
TDIR
*
tdir
);
/**
* @brief Update the disk size.
*
* @param pTfs The fs object.
*/
void
tfsUpdateSize
(
STfs
*
pTfs
);
/**
* @brief Get the disk size.
*
* @param pTfs The fs object.
*/
SDiskSize
tfsGetSize
(
STfs
*
pTfs
);
/**
* @brief Allocate an existing available tier level from fs.
*
* @param pTfs The fs object.
* @param expLevel Disk level want to allocate.
* @param pDiskId The disk ID after allocation.
* @return int32_t 0 for success, -1 for failure.
*/
int32_t
tfsAllocDisk
(
STfs
*
pTfs
,
int32_t
expLevel
,
SDiskID
*
pDiskId
);
/**
* @brief Get the primary path.
*
* @param pTfs The fs object.
* @return const char * The primary path.
*/
const
char
*
tfsGetPrimaryPath
(
STfs
*
pTfs
);
/**
* @brief Get the disk path.
*
* @param pTfs The fs object.
* @param diskId The diskId.
* @return const char * The primary path.
*/
const
char
*
tfsGetDiskPath
(
STfs
*
pTfs
,
SDiskID
diskId
);
/**
* @brief Make directory at all levels in tfs.
*
* @param pTfs The fs object.
* @param rname The rel name of directory.
* @return int32_t 0 for success, -1 for failure.
*/
int32_t
tfsMkdir
(
STfs
*
pTfs
,
const
char
*
rname
);
/**
* @brief Create directories in tfs.
*
* @param pTfs The fs object.
* @param rname The rel name of directory.
* @param diskId The disk ID.
* @return int32_t 0 for success, -1 for failure.
*/
int32_t
tfsMkdirAt
(
STfs
*
pTfs
,
const
char
*
rname
,
SDiskID
diskId
);
/**
* @brief Recursive create directories in tfs.
*
* @param pTfs The fs object.
* @param rname The rel name of directory.
* @param diskId The disk ID.
* @return int32_t 0 for success, -1 for failure.
*/
int32_t
tfsMkdirRecurAt
(
STfs
*
pTfs
,
const
char
*
rname
,
SDiskID
diskId
);
/**
* @brief Remove directory at all levels in tfs.
*
* @param pTfs The fs object.
* @param rname The rel name of directory.
* @return int32_t 0 for success, -1 for failure.
*/
int32_t
tfsRmdir
(
STfs
*
pTfs
,
const
char
*
rname
);
/**
* @brief Rename file/directory in tfs.
*
* @param pTfs The fs object.
* @param orname The rel name of old file.
* @param nrname The rel name of new file.
* @return int32_t 0 for success, -1 for failure.
*/
int32_t
tfsRename
(
STfs
*
pTfs
,
char
*
orname
,
char
*
nrname
);
/**
* @brief Init file object in tfs.
*
* @param pTfs The fs object.
* @param pFile The file object.
* @param diskId The disk ID.
* @param rname The rel name of file.
*/
void
tfsInitFile
(
STfs
*
pTfs
,
STfsFile
*
pFile
,
SDiskID
diskId
,
const
char
*
rname
);
/**
* @brief Determine whether they are the same file.
*
* @param pFile1 The file object.
* @param pFile2 The file object.
* @param bool The compare result.
*/
bool
tfsIsSameFile
(
const
STfsFile
*
pFile1
,
const
STfsFile
*
pFile2
);
/**
* @brief Encode file name to a buffer.
*
* @param buf The buffer where file name are saved.
* @param pFile The file object.
* @return int32_t 0 for success, -1 for failure.
*/
int32_t
tfsEncodeFile
(
void
**
buf
,
STfsFile
*
pFile
);
/**
* @brief Decode file name from a buffer.
*
* @param pTfs The fs object.
* @param buf The buffer where file name are saved.
* @param pFile The file object.
* @return void * Buffer address after decode.
*/
void
*
tfsDecodeFile
(
STfs
*
pTfs
,
void
*
buf
,
STfsFile
*
pFile
);
/**
* @brief Get the basename of the file.
*
* @param pFile The file object.
* @param dest The buffer where basename will be saved.
*/
void
tfsBasename
(
const
STfsFile
*
pFile
,
char
*
dest
);
/**
* @brief Get the dirname of the file.
*
* @param pFile The file object.
* @param dest The buffer where dirname will be saved.
*/
void
tfsDirname
(
const
STfsFile
*
pFile
,
char
*
dest
);
/**
* @brief Remove file in tfs.
*
* @param pFile The file to be removed.
* @return int32_t 0 for success, -1 for failure.
*/
int32_t
tfsRemoveFile
(
const
STfsFile
*
pFile
);
/**
* @brief Copy file in tfs.
*
* @param pFile1 The src file.
* @param pFile2 The dest file.
* @return int32_t 0 for success, -1 for failure.
*/
int32_t
tfsCopyFile
(
const
STfsFile
*
pFile1
,
const
STfsFile
*
pFile2
);
/**
* @brief Open a directory for traversal.
*
* @param rname The rel name of file.
* @return STfsDir* The dir object.
*/
STfsDir
*
tfsOpendir
(
STfs
*
pTfs
,
const
char
*
rname
);
/**
* @brief Get a file from dir and move to next pos.
*
* @param pDir The dir object.
* @return STfsFile* The file in dir.
*/
const
STfsFile
*
tfsReaddir
(
STfsDir
*
pDir
);
/**
* @brief Close a directory.
*
* @param pDir The dir object.
*/
void
tfsClosedir
(
STfsDir
*
pDir
);
#ifdef __cplusplus
}
...
...
include/util/tdef.h
浏览文件 @
ed9709c3
...
...
@@ -372,10 +372,14 @@ do { \
#define TSDB_ARB_DUMMY_TIME 4765104000000 // 2121-01-01 00:00:00.000, :P
#define TSDB_MAX_TIERS 3
#define TSDB_MAX_DISKS_PER_TIER 16
#define TSDB_MAX_DISKS (TSDB_MAX_TIERS * TSDB_MAX_DISKS_PER_TIER)
#define TFS_MAX_TIERS 3
#define TFS_MAX_DISKS_PER_TIER 16
#define TFS_MAX_DISKS (TFS_MAX_TIERS * TFS_MAX_DISKS_PER_TIER)
#define TFS_MIN_LEVEL 0
#define TFS_MAX_LEVEL (TFS_MAX_TIERS - 1)
#define TFS_PRIMARY_LEVEL 0
#define TFS_PRIMARY_ID 0
#define TFS_MIN_DISK_FREE_SIZE 50 * 1024 * 1024
enum
{
TRANS_STAT_INIT
=
0
,
TRANS_STAT_EXECUTING
,
TRANS_STAT_EXECUTED
,
TRANS_STAT_ROLLBACKING
,
TRANS_STAT_ROLLBACKED
};
enum
{
TRANS_OPER_INIT
=
0
,
TRANS_OPER_EXECUTE
,
TRANS_OPER_ROLLBACK
};
...
...
source/common/src/tglobal.c
浏览文件 @
ed9709c3
...
...
@@ -137,7 +137,7 @@ int32_t tsDiskCfgNum = 0;
#ifndef _STORAGE
SDiskCfg
tsDiskCfg
[
1
];
#else
SDiskCfg
tsDiskCfg
[
T
SDB
_MAX_DISKS
];
SDiskCfg
tsDiskCfg
[
T
FS
_MAX_DISKS
];
#endif
/*
...
...
source/dnode/mgmt/impl/inc/dndEnv.h
浏览文件 @
ed9709c3
...
...
@@ -134,6 +134,7 @@ typedef struct SDnode {
SBnodeMgmt
bmgmt
;
SVnodesMgmt
vmgmt
;
STransMgmt
tmgmt
;
STfs
*
pTfs
;
SStartupReq
startup
;
}
SDnode
;
...
...
source/dnode/mgmt/impl/inc/dndInt.h
浏览文件 @
ed9709c3
...
...
@@ -43,6 +43,7 @@ extern "C" {
#include "qnode.h"
#include "snode.h"
#include "vnode.h"
#include "tfs.h"
extern
int32_t
dDebugFlag
;
...
...
source/dnode/mgmt/impl/src/dndEnv.c
浏览文件 @
ed9709c3
...
...
@@ -173,11 +173,12 @@ SDnode *dndCreate(SDnodeObjCfg *pCfg) {
return
NULL
;
}
SDiskCfg
dCfg
;
strcpy
(
dCfg
.
dir
,
pDnode
->
cfg
.
dataDir
);
SDiskCfg
dCfg
=
{
0
}
;
tstrncpy
(
dCfg
.
dir
,
pDnode
->
cfg
.
dataDir
,
TSDB_FILENAME_LEN
);
dCfg
.
level
=
0
;
dCfg
.
primary
=
1
;
if
(
tfsInit
(
&
dCfg
,
1
)
!=
0
)
{
pDnode
->
pTfs
=
tfsOpen
(
&
dCfg
,
1
);
if
(
pDnode
->
pTfs
==
NULL
)
{
dError
(
"failed to init tfs since %s"
,
terrstr
());
dndClose
(
pDnode
);
return
NULL
;
...
...
@@ -251,7 +252,7 @@ void dndClose(SDnode *pDnode) {
dndCleanupQnode
(
pDnode
);
dndCleanupVnodes
(
pDnode
);
dndCleanupMgmt
(
pDnode
);
tfsCl
eanup
(
);
tfsCl
ose
(
pDnode
->
pTfs
);
dndCloseImp
(
pDnode
);
free
(
pDnode
);
...
...
@@ -314,3 +315,27 @@ void dndCleanup() {
taosStopCacheRefreshWorker
();
dInfo
(
"dnode env is cleaned up"
);
}
// OTHER FUNCTIONS ===================================
void
taosGetDisk
()
{
#if 0
const double unit = 1024 * 1024 * 1024;
SDiskSize diskSize = tfsGetSize(pTfs);
tfsUpdateSize(&fsMeta);
tsTotalDataDirGB = (float)(fsMeta.total / unit);
tsUsedDataDirGB = (float)(fsMeta.used / unit);
tsAvailDataDirGB = (float)(fsMeta.avail / unit);
if (taosGetDiskSize(tsLogDir, &diskSize) == 0) {
tsTotalLogDirGB = (float)(diskSize.total / unit);
tsAvailLogDirGB = (float)(diskSize.avail / unit);
}
if (taosGetDiskSize(tsTempDir, &diskSize) == 0) {
tsTotalTmpDirGB = (float)(diskSize.total / unit);
tsAvailTmpDirectorySpace = (float)(diskSize.avail / unit);
}
#endif
}
\ No newline at end of file
source/dnode/vnode/inc/tsdb.h
浏览文件 @
ed9709c3
...
...
@@ -80,7 +80,7 @@ typedef struct {
}
STableKeyInfo
;
// STsdb
STsdb
*
tsdbOpen
(
const
char
*
path
,
int32_t
vgId
,
const
STsdbCfg
*
pTsdbCfg
,
SMemAllocatorFactory
*
pMAF
,
SMeta
*
pMeta
);
STsdb
*
tsdbOpen
(
const
char
*
path
,
int32_t
vgId
,
const
STsdbCfg
*
pTsdbCfg
,
SMemAllocatorFactory
*
pMAF
,
SMeta
*
pMeta
,
STfs
*
pTfs
);
void
tsdbClose
(
STsdb
*
);
void
tsdbRemove
(
const
char
*
path
);
int
tsdbInsertData
(
STsdb
*
pTsdb
,
SSubmitMsg
*
pMsg
,
SSubmitRsp
*
pRsp
);
...
...
source/dnode/vnode/inc/vnode.h
浏览文件 @
ed9709c3
...
...
@@ -36,7 +36,8 @@ typedef int32_t (*PutReqToVQueryQFp)(SDnode *pDnode, struct SRpcMsg *pReq);
typedef
struct
SVnodeCfg
{
int32_t
vgId
;
SDnode
*
pDnode
;
SDnode
*
pDnode
;
STfs
*
pTfs
;
uint64_t
wsize
;
uint64_t
ssize
;
uint64_t
lsize
;
...
...
source/dnode/vnode/src/inc/tsdbDef.h
浏览文件 @
ed9709c3
...
...
@@ -50,6 +50,7 @@ struct STsdb {
SMemAllocatorFactory
*
pmaf
;
STsdbFS
*
fs
;
SMeta
*
pMeta
;
STfs
*
pTfs
;
};
#define REPO_ID(r) ((r)->vgId)
...
...
source/dnode/vnode/src/inc/tsdbFile.h
浏览文件 @
ed9709c3
...
...
@@ -55,7 +55,7 @@ typedef struct {
typedef struct {
SMFInfo info;
TFILE
f;
STfsFile
f;
int fd;
uint8_t state;
} SMFile;
...
...
@@ -176,7 +176,7 @@ typedef struct {
typedef
struct
{
SDFInfo
info
;
TFILE
f
;
STfsFile
f
;
int
fd
;
uint8_t
state
;
}
SDFile
;
...
...
source/dnode/vnode/src/inc/vnd.h
浏览文件 @
ed9709c3
...
...
@@ -78,6 +78,7 @@ struct SVnode {
tsem_t
canCommit
;
SQHandle
*
pQuery
;
SDnode
*
pDnode
;
STfs
*
pTfs
;
};
int
vnodeScheduleTask
(
SVnodeTask
*
task
);
...
...
source/dnode/vnode/src/tsdb/tsdbCommit.c
浏览文件 @
ed9709c3
...
...
@@ -97,8 +97,7 @@ int tsdbApplyRtnOnFSet(STsdb *pRepo, SDFileSet *pSet, SRtn *pRtn) {
level
=
tsdbGetFidLevel
(
pSet
->
fid
,
pRtn
);
tfsAllocDisk
(
level
,
&
(
did
.
level
),
&
(
did
.
id
));
if
(
did
.
level
==
TFS_UNDECIDED_LEVEL
)
{
if
(
tfsAllocDisk
(
pRepo
->
pTfs
,
level
,
&
did
)
<
0
)
{
terrno
=
TSDB_CODE_TDB_NO_AVAIL_DISK
;
return
-
1
;
}
...
...
@@ -456,8 +455,7 @@ static int tsdbSetAndOpenCommitFile(SCommitH *pCommith, SDFileSet *pSet, int fid
STsdb
*
pRepo
=
TSDB_COMMIT_REPO
(
pCommith
);
SDFileSet
*
pWSet
=
TSDB_COMMIT_WRITE_FSET
(
pCommith
);
tfsAllocDisk
(
tsdbGetFidLevel
(
fid
,
&
(
pCommith
->
rtn
)),
&
(
did
.
level
),
&
(
did
.
id
));
if
(
did
.
level
==
TFS_UNDECIDED_LEVEL
)
{
if
(
tfsAllocDisk
(
pRepo
->
pTfs
,
tsdbGetFidLevel
(
fid
,
&
(
pCommith
->
rtn
)),
&
did
)
<
0
)
{
terrno
=
TSDB_CODE_TDB_NO_AVAIL_DISK
;
return
-
1
;
}
...
...
source/dnode/vnode/src/tsdb/tsdbCompact.c
浏览文件 @
ed9709c3
...
...
@@ -186,8 +186,7 @@ static int tsdbCompactMeta(STsdbRepo *pRepo) {
}
} else {
// Create new fset as compacted fset
tfsAllocDisk(tsdbGetFidLevel(pSet->fid, &(pComph->rtn)), &(did.level), &(did.id));
if (did.level == TFS_UNDECIDED_LEVEL) {
if (tfsAllocDisk(pRepo->pTfs, tsdbGetFidLevel(pSet->fid, &(pComph->rtn)), &did) < 0) {
terrno = TSDB_CODE_TDB_NO_AVAIL_DISK;
tsdbError("vgId:%d failed to compact FSET %d since %s", REPO_ID(pRepo), pSet->fid, tstrerror(terrno));
tsdbCompactFSetEnd(pComph);
...
...
source/dnode/vnode/src/tsdb/tsdbFS.c
浏览文件 @
ed9709c3
...
...
@@ -23,14 +23,14 @@ static const char *tsdbTxnFname[] = {"current.t", "current"};
static
int
tsdbComparFidFSet
(
const
void
*
arg1
,
const
void
*
arg2
);
static
void
tsdbResetFSStatus
(
SFSStatus
*
pStatus
);
static
int
tsdbSaveFSStatus
(
SFSStatus
*
pStatus
,
int
vid
);
static
int
tsdbSaveFSStatus
(
S
Tfs
*
pTfs
,
S
FSStatus
*
pStatus
,
int
vid
);
static
void
tsdbApplyFSTxnOnDisk
(
SFSStatus
*
pFrom
,
SFSStatus
*
pTo
);
static
void
tsdbGetTxnFname
(
int
repoid
,
TSDB_TXN_FILE_T
ftype
,
char
fname
[]);
static
void
tsdbGetTxnFname
(
STfs
*
pTfs
,
int
repoid
,
TSDB_TXN_FILE_T
ftype
,
char
fname
[]);
static
int
tsdbOpenFSFromCurrent
(
STsdb
*
pRepo
);
static
int
tsdbScanAndTryFixFS
(
STsdb
*
pRepo
);
static
int
tsdbScanRootDir
(
STsdb
*
pRepo
);
static
int
tsdbScanDataDir
(
STsdb
*
pRepo
);
static
bool
tsdbIsTFileInFS
(
STsdbFS
*
pfs
,
const
TFILE
*
pf
);
static
bool
tsdbIsTFileInFS
(
STsdbFS
*
pfs
,
const
STfsFile
*
pf
);
static
int
tsdbRestoreCurrent
(
STsdb
*
pRepo
);
static
int
tsdbComparTFILE
(
const
void
*
arg1
,
const
void
*
arg2
);
static
void
tsdbScanAndTryFixDFilesHeader
(
STsdb
*
pRepo
,
int32_t
*
nExpired
);
...
...
@@ -311,7 +311,7 @@ int tsdbOpenFS(STsdb *pRepo) {
ASSERT
(
pfs
!=
NULL
);
tsdbGetTxnFname
(
REPO_ID
(
pRepo
),
TSDB_TXN_CURR_FILE
,
current
);
tsdbGetTxnFname
(
pRepo
->
pTfs
,
REPO_ID
(
pRepo
),
TSDB_TXN_CURR_FILE
,
current
);
tsdbGetRtnSnap
(
pRepo
,
&
pRepo
->
rtn
);
if
(
access
(
current
,
F_OK
)
==
0
)
{
...
...
@@ -375,7 +375,7 @@ int tsdbEndFSTxn(STsdb *pRepo) {
SFSStatus
*
pStatus
;
// Write current file system snapshot
if
(
tsdbSaveFSStatus
(
pfs
->
nstatus
,
REPO_ID
(
pRepo
))
<
0
)
{
if
(
tsdbSaveFSStatus
(
p
Repo
->
pTfs
,
p
fs
->
nstatus
,
REPO_ID
(
pRepo
))
<
0
)
{
tsdbEndFSTxnWithError
(
pfs
);
return
-
1
;
}
...
...
@@ -405,7 +405,7 @@ int tsdbEndFSTxnWithError(STsdbFS *pfs) {
int
tsdbUpdateDFileSet
(
STsdbFS
*
pfs
,
const
SDFileSet
*
pSet
)
{
return
tsdbAddDFileSetToStatus
(
pfs
->
nstatus
,
pSet
);
}
static
int
tsdbSaveFSStatus
(
SFSStatus
*
pStatus
,
int
vid
)
{
static
int
tsdbSaveFSStatus
(
S
Tfs
*
pTfs
,
S
FSStatus
*
pStatus
,
int
vid
)
{
SFSHeader
fsheader
;
void
*
pBuf
=
NULL
;
void
*
ptr
;
...
...
@@ -413,8 +413,8 @@ static int tsdbSaveFSStatus(SFSStatus *pStatus, int vid) {
char
tfname
[
TSDB_FILENAME_LEN
]
=
"
\0
"
;
char
cfname
[
TSDB_FILENAME_LEN
]
=
"
\0
"
;
tsdbGetTxnFname
(
vid
,
TSDB_TXN_TEMP_FILE
,
tfname
);
tsdbGetTxnFname
(
vid
,
TSDB_TXN_CURR_FILE
,
cfname
);
tsdbGetTxnFname
(
pTfs
,
vid
,
TSDB_TXN_TEMP_FILE
,
tfname
);
tsdbGetTxnFname
(
pTfs
,
vid
,
TSDB_TXN_CURR_FILE
,
cfname
);
int
fd
=
open
(
tfname
,
O_WRONLY
|
O_CREAT
|
O_TRUNC
|
O_BINARY
,
0755
);
if
(
fd
<
0
)
{
...
...
@@ -645,8 +645,8 @@ static int tsdbComparFidFSet(const void *arg1, const void *arg2) {
}
}
static
void
tsdbGetTxnFname
(
int
repoid
,
TSDB_TXN_FILE_T
ftype
,
char
fname
[])
{
snprintf
(
fname
,
TSDB_FILENAME_LEN
,
"%s/vnode/vnode%d/tsdb/%s"
,
TFS_PRIMARY_PATH
(
),
repoid
,
tsdbTxnFname
[
ftype
]);
static
void
tsdbGetTxnFname
(
STfs
*
pTfs
,
int
repoid
,
TSDB_TXN_FILE_T
ftype
,
char
fname
[])
{
snprintf
(
fname
,
TSDB_FILENAME_LEN
,
"%s/vnode/vnode%d/tsdb/%s"
,
tfsGetPrimaryPath
(
pTfs
),
repoid
,
tsdbTxnFname
[
ftype
]);
}
static
int
tsdbOpenFSFromCurrent
(
STsdb
*
pRepo
)
{
...
...
@@ -657,7 +657,7 @@ static int tsdbOpenFSFromCurrent(STsdb *pRepo) {
char
current
[
TSDB_FILENAME_LEN
]
=
"
\0
"
;
void
*
ptr
;
tsdbGetTxnFname
(
REPO_ID
(
pRepo
),
TSDB_TXN_CURR_FILE
,
current
);
tsdbGetTxnFname
(
pRepo
->
pTfs
,
REPO_ID
(
pRepo
),
TSDB_TXN_CURR_FILE
,
current
);
// current file exists, try to recover
fd
=
open
(
current
,
O_RDONLY
|
O_BINARY
);
...
...
@@ -910,17 +910,17 @@ static int tsdbScanRootDir(STsdb *pRepo) {
char
rootDir
[
TSDB_FILENAME_LEN
];
char
bname
[
TSDB_FILENAME_LEN
];
STsdbFS
*
pfs
=
REPO_FS
(
pRepo
);
const
TFILE
*
pf
;
const
STfsFile
*
pf
;
tsdbGetRootDir
(
REPO_ID
(
pRepo
),
rootDir
);
TDIR
*
tdir
=
tfsOpendir
(
rootDir
);
STfsDir
*
tdir
=
tfsOpendir
(
rootDir
);
if
(
tdir
==
NULL
)
{
tsdbError
(
"vgId:%d failed to open directory %s since %s"
,
REPO_ID
(
pRepo
),
rootDir
,
tstrerror
(
terrno
));
return
-
1
;
}
while
((
pf
=
tfsReaddir
(
tdir
)))
{
tfs
b
asename
(
pf
,
bname
);
tfs
B
asename
(
pf
,
bname
);
if
(
strcmp
(
bname
,
tsdbTxnFname
[
TSDB_TXN_CURR_FILE
])
==
0
||
strcmp
(
bname
,
"data"
)
==
0
)
{
// Skip current file and data directory
...
...
@@ -944,17 +944,17 @@ static int tsdbScanDataDir(STsdb *pRepo) {
char
dataDir
[
TSDB_FILENAME_LEN
];
char
bname
[
TSDB_FILENAME_LEN
];
STsdbFS
*
pfs
=
REPO_FS
(
pRepo
);
const
TFILE
*
pf
;
const
STfsFile
*
pf
;
tsdbGetDataDir
(
REPO_ID
(
pRepo
),
dataDir
);
TDIR
*
tdir
=
tfsOpendir
(
dataDir
);
STfsDir
*
tdir
=
tfsOpendir
(
dataDir
);
if
(
tdir
==
NULL
)
{
tsdbError
(
"vgId:%d failed to open directory %s since %s"
,
REPO_ID
(
pRepo
),
dataDir
,
tstrerror
(
terrno
));
return
-
1
;
}
while
((
pf
=
tfsReaddir
(
tdir
)))
{
tfs
b
asename
(
pf
,
bname
);
tfs
B
asename
(
pf
,
bname
);
if
(
!
tsdbIsTFileInFS
(
pfs
,
pf
))
{
(
void
)
tfsremove
(
pf
);
...
...
@@ -967,7 +967,7 @@ static int tsdbScanDataDir(STsdb *pRepo) {
return
0
;
}
static
bool
tsdbIsTFileInFS
(
STsdbFS
*
pfs
,
const
TFILE
*
pf
)
{
static
bool
tsdbIsTFileInFS
(
STsdbFS
*
pfs
,
const
STfsFile
*
pf
)
{
SFSIter
fsiter
;
tsdbFSIterInit
(
&
fsiter
,
pfs
,
TSDB_FS_ITER_FORWARD
);
SDFileSet
*
pSet
;
...
...
@@ -987,8 +987,8 @@ static bool tsdbIsTFileInFS(STsdbFS *pfs, const TFILE *pf) {
// static int tsdbRestoreMeta(STsdb *pRepo) {
// char rootDir[TSDB_FILENAME_LEN];
// char bname[TSDB_FILENAME_LEN];
//
TDIR
* tdir = NULL;
// const
TFILE
*pf = NULL;
//
STfsDir
* tdir = NULL;
// const
STfsFile
*pf = NULL;
// const char * pattern = "^meta(-ver[0-9]+)?$";
// regex_t regex;
// STsdbFS * pfs = REPO_FS(pRepo);
...
...
@@ -1007,7 +1007,7 @@ static bool tsdbIsTFileInFS(STsdbFS *pfs, const TFILE *pf) {
// }
// while ((pf = tfsReaddir(tdir))) {
// tfs
b
asename(pf, bname);
// tfs
B
asename(pf, bname);
// if (strcmp(bname, "data") == 0) {
// // Skip the data/ directory
...
...
@@ -1108,8 +1108,8 @@ static bool tsdbIsTFileInFS(STsdbFS *pfs, const TFILE *pf) {
static
int
tsdbRestoreDFileSet
(
STsdb
*
pRepo
)
{
char
dataDir
[
TSDB_FILENAME_LEN
];
char
bname
[
TSDB_FILENAME_LEN
];
TDIR
*
tdir
=
NULL
;
const
TFILE
*
pf
=
NULL
;
STfsDir
*
tdir
=
NULL
;
const
STfsFile
*
pf
=
NULL
;
const
char
*
pattern
=
"^v[0-9]+f[0-9]+
\\
.(head|data|last)(-ver[0-9]+)?$"
;
SArray
*
fArray
=
NULL
;
regex_t
regex
;
...
...
@@ -1120,7 +1120,7 @@ static int tsdbRestoreDFileSet(STsdb *pRepo) {
// Resource allocation and init
regcomp
(
&
regex
,
pattern
,
REG_EXTENDED
);
fArray
=
taosArrayInit
(
1024
,
sizeof
(
TFILE
));
fArray
=
taosArrayInit
(
1024
,
sizeof
(
STfsFile
));
if
(
fArray
==
NULL
)
{
terrno
=
TSDB_CODE_TDB_OUT_OF_MEMORY
;
tsdbError
(
"vgId:%d failed to restore DFileSet while open directory %s since %s"
,
REPO_ID
(
pRepo
),
dataDir
,
...
...
@@ -1139,7 +1139,7 @@ static int tsdbRestoreDFileSet(STsdb *pRepo) {
}
while
((
pf
=
tfsReaddir
(
tdir
)))
{
tfs
b
asename
(
pf
,
bname
);
tfs
B
asename
(
pf
,
bname
);
int
code
=
regexec
(
&
regex
,
bname
,
0
,
NULL
,
0
);
if
(
code
==
0
)
{
...
...
@@ -1200,7 +1200,7 @@ static int tsdbRestoreDFileSet(STsdb *pRepo) {
uint32_t
tversion
;
char
_bname
[
TSDB_FILENAME_LEN
];
tfs
b
asename
(
pf
,
_bname
);
tfs
B
asename
(
pf
,
_bname
);
tsdbParseDFilename
(
_bname
,
&
tvid
,
&
tfid
,
&
ttype
,
&
tversion
);
ASSERT
(
tvid
==
REPO_ID
(
pRepo
));
...
...
@@ -1287,7 +1287,7 @@ static int tsdbRestoreCurrent(STsdb *pRepo) {
return
-
1
;
}
if
(
tsdbSaveFSStatus
(
pRepo
->
fs
->
cstatus
,
REPO_ID
(
pRepo
))
<
0
)
{
if
(
tsdbSaveFSStatus
(
pRepo
->
pTfs
,
pRepo
->
fs
->
cstatus
,
REPO_ID
(
pRepo
))
<
0
)
{
tsdbError
(
"vgId:%d failed to restore corrent since %s"
,
REPO_ID
(
pRepo
),
tstrerror
(
terrno
));
return
-
1
;
}
...
...
@@ -1296,8 +1296,8 @@ static int tsdbRestoreCurrent(STsdb *pRepo) {
}
static
int
tsdbComparTFILE
(
const
void
*
arg1
,
const
void
*
arg2
)
{
TFILE
*
pf1
=
(
TFILE
*
)
arg1
;
TFILE
*
pf2
=
(
TFILE
*
)
arg2
;
STfsFile
*
pf1
=
(
STfsFile
*
)
arg1
;
STfsFile
*
pf2
=
(
STfsFile
*
)
arg2
;
int
vid1
,
fid1
,
vid2
,
fid2
;
TSDB_FILE_T
ftype1
,
ftype2
;
...
...
@@ -1305,8 +1305,8 @@ static int tsdbComparTFILE(const void *arg1, const void *arg2) {
char
bname1
[
TSDB_FILENAME_LEN
];
char
bname2
[
TSDB_FILENAME_LEN
];
tfs
b
asename
(
pf1
,
bname1
);
tfs
b
asename
(
pf2
,
bname2
);
tfs
B
asename
(
pf1
,
bname1
);
tfs
B
asename
(
pf2
,
bname2
);
tsdbParseDFilename
(
bname1
,
&
vid1
,
&
fid1
,
&
ftype1
,
&
version1
);
tsdbParseDFilename
(
bname2
,
&
vid2
,
&
fid2
,
&
ftype2
,
&
version2
);
...
...
source/dnode/vnode/src/tsdb/tsdbMain.c
浏览文件 @
ed9709c3
...
...
@@ -16,12 +16,12 @@
#include "tsdbDef.h"
static
STsdb
*
tsdbNew
(
const
char
*
path
,
int32_t
vgId
,
const
STsdbCfg
*
pTsdbCfg
,
SMemAllocatorFactory
*
pMAF
,
SMeta
*
pMeta
);
SMeta
*
pMeta
,
STfs
*
pTfs
);
static
void
tsdbFree
(
STsdb
*
pTsdb
);
static
int
tsdbOpenImpl
(
STsdb
*
pTsdb
);
static
void
tsdbCloseImpl
(
STsdb
*
pTsdb
);
STsdb
*
tsdbOpen
(
const
char
*
path
,
int32_t
vgId
,
const
STsdbCfg
*
pTsdbCfg
,
SMemAllocatorFactory
*
pMAF
,
SMeta
*
pMeta
)
{
STsdb
*
tsdbOpen
(
const
char
*
path
,
int32_t
vgId
,
const
STsdbCfg
*
pTsdbCfg
,
SMemAllocatorFactory
*
pMAF
,
SMeta
*
pMeta
,
STfs
*
pTfs
)
{
STsdb
*
pTsdb
=
NULL
;
// Set default TSDB Options
...
...
@@ -36,7 +36,7 @@ STsdb *tsdbOpen(const char *path, int32_t vgId, const STsdbCfg *pTsdbCfg, SMemAl
}
// Create the handle
pTsdb
=
tsdbNew
(
path
,
vgId
,
pTsdbCfg
,
pMAF
,
pMeta
);
pTsdb
=
tsdbNew
(
path
,
vgId
,
pTsdbCfg
,
pMAF
,
pMeta
,
pTfs
);
if
(
pTsdb
==
NULL
)
{
// TODO: handle error
return
NULL
;
...
...
@@ -64,7 +64,7 @@ void tsdbRemove(const char *path) { taosRemoveDir(path); }
/* ------------------------ STATIC METHODS ------------------------ */
static
STsdb
*
tsdbNew
(
const
char
*
path
,
int32_t
vgId
,
const
STsdbCfg
*
pTsdbCfg
,
SMemAllocatorFactory
*
pMAF
,
SMeta
*
pMeta
)
{
SMeta
*
pMeta
,
STfs
*
pTfs
)
{
STsdb
*
pTsdb
=
NULL
;
pTsdb
=
(
STsdb
*
)
calloc
(
1
,
sizeof
(
STsdb
));
...
...
@@ -78,6 +78,7 @@ static STsdb *tsdbNew(const char *path, int32_t vgId, const STsdbCfg *pTsdbCfg,
tsdbOptionsCopy
(
&
(
pTsdb
->
config
),
pTsdbCfg
);
pTsdb
->
pmaf
=
pMAF
;
pTsdb
->
pMeta
=
pMeta
;
pTsdb
->
pTfs
=
pTfs
;
pTsdb
->
fs
=
tsdbNewFS
(
pTsdbCfg
);
...
...
@@ -494,7 +495,7 @@ uint32_t tsdbGetFileInfo(STsdbRepo *repo, char *name, uint32_t *index, uint32_t
}
} else { // get the named file at the specified index. If not there, return 0
fname = malloc(256);
sprintf(fname, "%s/vnode/vnode%d/%s",
TFS_PRIMARY_PATH(
), REPO_ID(pRepo), name);
sprintf(fname, "%s/vnode/vnode%d/%s",
tfsGetPrimaryPath(pRepo->pTfs
), REPO_ID(pRepo), name);
if (access(fname, F_OK) != 0) {
tfree(fname);
return 0;
...
...
source/dnode/vnode/src/vnd/vnodeMain.c
浏览文件 @
ed9709c3
...
...
@@ -75,6 +75,7 @@ static SVnode *vnodeNew(const char *path, const SVnodeCfg *pVnodeCfg) {
pVnode
->
vgId
=
pVnodeCfg
->
vgId
;
pVnode
->
pDnode
=
pVnodeCfg
->
pDnode
;
pVnode
->
pTfs
=
pVnodeCfg
->
pTfs
;
pVnode
->
path
=
strdup
(
path
);
vnodeOptionsCopy
(
&
(
pVnode
->
config
),
pVnodeCfg
);
...
...
@@ -109,7 +110,7 @@ static int vnodeOpenImpl(SVnode *pVnode) {
// Open tsdb
sprintf
(
dir
,
"%s/tsdb"
,
pVnode
->
path
);
pVnode
->
pTsdb
=
tsdbOpen
(
dir
,
pVnode
->
vgId
,
&
(
pVnode
->
config
.
tsdbCfg
),
vBufPoolGetMAF
(
pVnode
),
pVnode
->
pMeta
);
pVnode
->
pTsdb
=
tsdbOpen
(
dir
,
pVnode
->
vgId
,
&
(
pVnode
->
config
.
tsdbCfg
),
vBufPoolGetMAF
(
pVnode
),
pVnode
->
pMeta
,
pVnode
->
pTfs
);
if
(
pVnode
->
pTsdb
==
NULL
)
{
// TODO: handle error
return
-
1
;
...
...
source/libs/tfs/inc/tfsInt.h
浏览文件 @
ed9709c3
...
...
@@ -33,28 +33,73 @@ extern int32_t fsDebugFlag;
#define fError(...) { if (fsDebugFlag & DEBUG_ERROR) { taosPrintLog("TFS ERROR ", 255, __VA_ARGS__); }}
#define fWarn(...) { if (fsDebugFlag & DEBUG_WARN) { taosPrintLog("TFS WARN ", 255, __VA_ARGS__); }}
#define fInfo(...) { if (fsDebugFlag & DEBUG_INFO) { taosPrintLog("TFS ", 255, __VA_ARGS__); }}
#define fDebug(...) { if (fsDebugFlag & DEBUG_DEBUG) { taosPrintLog("TFS ",
cq
DebugFlag, __VA_ARGS__); }}
#define fTrace(...) { if (fsDebugFlag & DEBUG_TRACE) { taosPrintLog("TFS ",
cq
DebugFlag, __VA_ARGS__); }}
#define fDebug(...) { if (fsDebugFlag & DEBUG_DEBUG) { taosPrintLog("TFS ",
fs
DebugFlag, __VA_ARGS__); }}
#define fTrace(...) { if (fsDebugFlag & DEBUG_TRACE) { taosPrintLog("TFS ",
fs
DebugFlag, __VA_ARGS__); }}
// Global Definitions
#define TFS_MIN_DISK_FREE_SIZE 50 * 1024 * 1024
typedef
struct
SDisk
{
typedef
struct
{
int32_t
level
;
int32_t
id
;
char
*
path
;
SDiskSize
size
;
}
SDisk
;
}
S
Tfs
Disk
;
typedef
struct
STier
{
typedef
struct
{
pthread_spinlock_t
lock
;
int32_t
level
;
int16_t
nextid
;
// next disk id to allocate
int16_t
ndisk
;
// # of disks mounted to this tier
int16_t
nAvailDisks
;
// # of Available disks
SDisk
*
disks
[
TSDB_MAX_DISKS_PER_TIER
];
int32_t
nextid
;
// next disk id to allocate
int32_t
ndisk
;
// # of disks mounted to this tier
int32_t
nAvailDisks
;
// # of Available disks
STfsDisk
*
disks
[
TFS_MAX_DISKS_PER_TIER
];
SDiskSize
size
;
}
STfsTier
;
typedef
struct
{
STfsDisk
*
pDisk
;
}
SDiskIter
;
typedef
struct
STfsDir
{
SDiskIter
*
iter
;
SDiskID
did
;
char
dirname
[
TSDB_FILENAME_LEN
];
STfsFile
tfile
;
DIR
*
dir
;
STfs
*
pTfs
;
}
STfsDir
;
typedef
struct
STfs
{
pthread_spinlock_t
lock
;
SDiskSize
size
;
}
STier
;
int32_t
nlevel
;
STfsTier
tiers
[
TFS_MAX_TIERS
];
SHashObj
*
hash
;
// name to did map
}
STfs
;
STfsDisk
*
tfsNewDisk
(
int32_t
level
,
int32_t
id
,
const
char
*
dir
);
STfsDisk
*
tfsFreeDisk
(
STfsDisk
*
pDisk
);
int32_t
tfsUpdateDiskSize
(
STfsDisk
*
pDisk
);
int32_t
tfsInitTier
(
STfsTier
*
pTier
,
int32_t
level
);
void
tfsDestroyTier
(
STfsTier
*
pTier
);
STfsDisk
*
tfsMountDiskToTier
(
STfsTier
*
pTier
,
SDiskCfg
*
pCfg
);
void
tfsUpdateTierSize
(
STfsTier
*
pTier
);
int32_t
tfsAllocDiskOnTier
(
STfsTier
*
pTier
);
void
tfsPosNextId
(
STfsTier
*
pTier
);
#define tfsLockTier(pTier) pthread_spin_lock(&(pTier)->lock)
#define tfsUnLockTier(pTier) pthread_spin_unlock(&(pTier)->lock)
#define TMPNAME_LEN (TSDB_FILENAME_LEN * 2 + 32)
#define tfsLock(pTfs) pthread_spin_lock(&(pTfs)->lock)
#define tfsUnLock(pTfs) pthread_spin_unlock(&(pTfs)->lock)
#define TFS_TIER_AT(pTfs, level) (&pTfs->tiers[level])
#define TFS_DISK_AT(pTfs, did) (pTfs->tiers[(did).level].disks[(did).id])
#define TFS_PRIMARY_DISK(pTfs) (pTfs->tiers[0].disks[0])
#define TFS_IS_VALID_LEVEL(level) (((level) >= 0) && ((level) < TFS_NLEVEL()))
#define TFS_IS_VALID_ID(level, id) (((id) >= 0) && ((id) < TIER_NDISKS(TFS_TIER_AT(level))))
#define TFS_IS_VALID_DISK(level, id) (TFS_IS_VALID_LEVEL(level) && TFS_IS_VALID_ID(level, id))
#define TIER_LEVEL(pt) ((pt)->level)
#define TIER_NDISKS(pt) ((pt)->ndisk)
...
...
@@ -64,17 +109,6 @@ typedef struct STier {
#define DISK_AT_TIER(pt, id) ((pt)->disks[id])
#define DISK_DIR(pd) ((pd)->path)
SDisk
*
tfsNewDisk
(
int32_t
level
,
int32_t
id
,
const
char
*
dir
);
SDisk
*
tfsFreeDisk
(
SDisk
*
pDisk
);
int32_t
tfsUpdateDiskSize
(
SDisk
*
pDisk
);
int32_t
tfsInitTier
(
STier
*
pTier
,
int32_t
level
);
void
tfsDestroyTier
(
STier
*
pTier
);
SDisk
*
tfsMountDiskToTier
(
STier
*
pTier
,
SDiskCfg
*
pCfg
);
void
tfsUpdateTierSize
(
STier
*
pTier
);
int32_t
tfsAllocDiskOnTier
(
STier
*
pTier
);
void
tfsPosNextId
(
STier
*
pTier
);
#ifdef __cplusplus
}
#endif
...
...
source/libs/tfs/src/tfs.c
浏览文件 @
ed9709c3
...
...
@@ -16,227 +16,193 @@
#define _DEFAULT_SOURCE
#include "tfsInt.h"
#define TMPNAME_LEN (TSDB_FILENAME_LEN * 2 + 32)
typedef
struct
{
pthread_spinlock_t
lock
;
SFSMeta
meta
;
int32_t
nlevel
;
STier
tiers
[
TSDB_MAX_TIERS
];
SHashObj
*
map
;
// name to did map
}
SFS
;
typedef
struct
{
SDisk
*
pDisk
;
}
SDiskIter
;
#define TFS_META() (pfs->meta)
#define TFS_NLEVEL() (pfs->nlevel)
#define TFS_TIERS() (pfs->tiers)
#define TFS_TIER_AT(level) (TFS_TIERS() + (level))
#define TFS_DISK_AT(level, id) DISK_AT_TIER(TFS_TIER_AT(level), id)
#define TFS_PRIMARY_DISK() TFS_DISK_AT(TFS_PRIMARY_LEVEL, TFS_PRIMARY_ID)
#define TFS_IS_VALID_LEVEL(level) (((level) >= 0) && ((level) < TFS_NLEVEL()))
#define TFS_IS_VALID_ID(level, id) (((id) >= 0) && ((id) < TIER_NDISKS(TFS_TIER_AT(level))))
#define TFS_IS_VALID_DISK(level, id) (TFS_IS_VALID_LEVEL(level) && TFS_IS_VALID_ID(level, id))
#define tfsLock() pthread_spin_lock(&(pfs->lock))
#define tfsUnLock() pthread_spin_unlock(&(pfs->lock))
static
SFS
tfs
=
{
0
};
static
SFS
*
pfs
=
&
tfs
;
// STATIC DECLARATION
static
int32_t
tfsMount
(
SDiskCfg
*
pCfg
);
static
int32_t
tfsCheck
();
static
int32_t
tfsCheckAndFormatCfg
(
SDiskCfg
*
pCfg
);
static
int32_t
tfsMount
(
STfs
*
pTfs
,
SDiskCfg
*
pCfg
);
static
int32_t
tfsCheck
(
STfs
*
pTfs
);
static
int32_t
tfsCheckAndFormatCfg
(
STfs
*
pTfs
,
SDiskCfg
*
pCfg
);
static
int32_t
tfsFormatDir
(
char
*
idir
,
char
*
odir
);
static
SDisk
*
tfsGetDiskByID
(
SDiskID
did
);
static
SDisk
*
tfsGetDiskByName
(
const
char
*
dir
);
static
int32_t
tfsOpendirImpl
(
TDIR
*
tdir
);
static
void
tfsInitDiskIter
(
SDiskIter
*
pIter
);
static
SDisk
*
tfsNextDisk
(
SDiskIter
*
pIter
);
// FS APIs ====================================
int32_t
tfsInit
(
SDiskCfg
*
pDiskCfg
,
int32_t
ndisk
)
{
if
(
ndisk
<
0
)
{
static
STfsDisk
*
tfsGetDiskByName
(
STfs
*
pTfs
,
const
char
*
dir
);
static
int32_t
tfsOpendirImpl
(
STfs
*
pTfs
,
STfsDir
*
pDir
);
static
STfsDisk
*
tfsNextDisk
(
STfs
*
pTfs
,
SDiskIter
*
pIter
);
STfs
*
tfsOpen
(
SDiskCfg
*
pCfg
,
int32_t
ndisk
)
{
if
(
ndisk
<
0
||
ndisk
>
TFS_MAX_DISKS
)
{
terrno
=
TSDB_CODE_INVALID_PARA
;
return
-
1
;
return
NULL
;
}
for
(
int32_t
level
=
0
;
level
<
TSDB_MAX_TIERS
;
level
++
)
{
if
(
tfsInitTier
(
TFS_TIER_AT
(
level
),
level
)
<
0
)
{
while
(
true
)
{
level
--
;
if
(
level
<
0
)
break
;
STfs
*
pTfs
=
calloc
(
1
,
sizeof
(
STfs
));
if
(
pTfs
==
NULL
)
{
terrno
=
TSDB_CODE_OUT_OF_MEMORY
;
return
NULL
;
}
tfsDestroyTier
(
TFS_TIER_AT
(
level
));
if
(
pthread_spin_init
(
&
pTfs
->
lock
,
0
)
!=
0
)
{
terrno
=
TAOS_SYSTEM_ERROR
(
errno
);
tfsClose
(
pTfs
);
return
NULL
;
}
return
-
1
;
for
(
int32_t
level
=
0
;
level
<
TFS_MAX_TIERS
;
level
++
)
{
STfsTier
*
pTier
=
&
pTfs
->
tiers
[
level
];
if
(
tfsInitTier
(
pTier
,
level
)
<
0
)
{
tfsClose
(
pTfs
);
return
NULL
;
}
}
pthread_spin_init
(
&
(
pfs
->
lock
),
0
);
pfs
->
map
=
taosHashInit
(
TSDB_MAX_TIERS
*
TSDB_MAX_DISKS_PER_TIER
*
2
,
taosGetDefaultHashFunction
(
TSDB_DATA_TYPE_BINARY
),
false
,
HASH_NO_LOCK
);
if
(
pfs
->
map
==
NULL
)
{
pTfs
->
hash
=
taosHashInit
(
TFS_MAX_DISKS
*
2
,
taosGetDefaultHashFunction
(
TSDB_DATA_TYPE_BINARY
),
false
,
HASH_NO_LOCK
);
if
(
pTfs
->
hash
==
NULL
)
{
terrno
=
TSDB_CODE_OUT_OF_MEMORY
;
tfsCl
eanup
(
);
return
-
1
;
tfsCl
ose
(
pTfs
);
return
NULL
;
}
for
(
int32_t
idisk
=
0
;
idisk
<
ndisk
;
idisk
++
)
{
if
(
tfsMount
(
p
DiskCfg
+
idisk
)
<
0
)
{
tfsCl
eanup
(
);
return
-
1
;
if
(
tfsMount
(
p
Tfs
,
&
pCfg
[
idisk
]
)
<
0
)
{
tfsCl
ose
(
pTfs
);
return
NULL
;
}
}
if
(
tfsCheck
()
<
0
)
{
tfsCl
eanup
(
);
return
-
1
;
if
(
tfsCheck
(
pTfs
)
<
0
)
{
tfsCl
ose
(
pTfs
);
return
NULL
;
}
tfsUpdateSize
(
NULL
);
for
(
int32_t
level
=
0
;
level
<
TFS_NLEVEL
()
;
level
++
)
{
tfsPosNextId
(
TFS_TIER_AT
(
level
)
);
tfsUpdateSize
(
pTfs
);
for
(
int32_t
level
=
0
;
level
<
pTfs
->
nlevel
;
level
++
)
{
tfsPosNextId
(
&
pTfs
->
tiers
[
level
]
);
}
return
0
;
return
pTfs
;
}
void
tfsCleanup
()
{
taosHashCleanup
(
pfs
->
map
);
pfs
->
map
=
NULL
;
void
tfsClose
(
STfs
*
pTfs
)
{
if
(
pTfs
==
NULL
)
return
;
pthread_spin_destroy
(
&
(
pfs
->
lock
));
for
(
int32_t
level
=
0
;
level
<
TFS_NLEVEL
();
level
++
)
{
tfsDestroyTier
(
TFS_TIER_AT
(
level
));
for
(
int32_t
level
=
0
;
level
<
TFS_MAX_LEVEL
;
level
++
)
{
tfsDestroyTier
(
&
pTfs
->
tiers
[
level
]);
}
taosHashCleanup
(
pTfs
->
hash
);
pthread_spin_destroy
(
&
pTfs
->
lock
);
free
(
pTfs
);
}
void
tfsUpdateSize
(
SFSMeta
*
pFSMeta
)
{
SFSMeta
fsMeta
=
{
0
};
void
tfsUpdateSize
(
STfs
*
pTfs
)
{
SDiskSize
size
=
{
0
};
if
(
pFSMeta
==
NULL
)
{
pFSMeta
=
&
fsMeta
;
}
memset
(
pFSMeta
,
0
,
sizeof
(
SFSMeta
));
for
(
int32_t
level
=
0
;
level
<
TFS_NLEVEL
();
level
++
)
{
STier
*
pTier
=
TFS_TIER_AT
(
level
);
for
(
int32_t
level
=
0
;
level
<
pTfs
->
nlevel
;
level
++
)
{
STfsTier
*
pTier
=
&
pTfs
->
tiers
[
level
];
tfsUpdateTierSize
(
pTier
);
pFSMeta
->
total
+=
pTier
->
size
.
total
;
pFSMeta
->
avail
+=
pTier
->
size
.
avail
;
pFSMeta
->
used
+=
pTier
->
size
.
used
;
size
.
total
+=
pTier
->
size
.
total
;
size
.
avail
+=
pTier
->
size
.
avail
;
size
.
used
+=
pTier
->
size
.
used
;
}
tfsLock
();
p
fs
->
meta
=
*
pFSMeta
;
tfsUnLock
();
tfsLock
(
pTfs
);
p
Tfs
->
size
=
size
;
tfsUnLock
(
pTfs
);
}
/* Allocate an existing available tier level
*/
void
tfsAllocDisk
(
int32_t
expLevel
,
int32_t
*
level
,
int32_t
*
id
)
{
ASSERT
(
expLevel
>=
0
);
SDiskSize
tfsGetSize
(
STfs
*
pTfs
)
{
tfsLock
(
pTfs
);
SDiskSize
size
=
pTfs
->
size
;
tfsUnLock
(
pTfs
);
*
level
=
expLevel
;
*
id
=
TFS_UNDECIDED_ID
;
return
size
;
}
if
(
*
level
>=
TFS_NLEVEL
())
{
*
level
=
TFS_NLEVEL
()
-
1
;
int32_t
tfsAllocDisk
(
STfs
*
pTfs
,
int32_t
expLevel
,
SDiskID
*
pDiskId
)
{
pDiskId
->
level
=
expLevel
;
pDiskId
->
id
=
-
1
;
if
(
pDiskId
->
level
>=
pTfs
->
nlevel
)
{
pDiskId
->
level
--
;
}
while
(
*
level
>=
0
)
{
*
id
=
tfsAllocDiskOnTier
(
TFS_TIER_AT
(
*
level
)
);
if
(
*
id
==
TFS_UNDECIDED_ID
)
{
(
*
level
)
--
;
while
(
pDiskId
->
level
>=
0
)
{
pDiskId
->
id
=
tfsAllocDiskOnTier
(
&
pTfs
->
tiers
[
pDiskId
->
level
]
);
if
(
pDiskId
->
id
<
0
)
{
pDiskId
->
level
--
;
continue
;
}
return
;
return
0
;
}
*
level
=
TFS_UNDECIDED_LEVEL
;
*
id
=
TFS_UNDECIDED_ID
;
terrno
=
TSDB_CODE_FS_NO_VALID_DISK
;
return
-
1
;
}
const
char
*
TFS_PRIMARY_PATH
()
{
return
DISK_DIR
(
TFS_PRIMARY_DISK
());
}
const
char
*
TFS_DISK_PATH
(
int32_t
level
,
int32_t
id
)
{
return
DISK_DIR
(
TFS_DISK_AT
(
level
,
id
));
}
const
char
*
tfsGetPrimaryPath
(
STfs
*
pTfs
)
{
return
TFS_PRIMARY_DISK
(
pTfs
)
->
path
;
}
// TFILE APIs ====================================
void
tfsInitFile
(
TFILE
*
pf
,
int32_t
level
,
int32_t
id
,
const
char
*
bname
)
{
ASSERT
(
TFS_IS_VALID_DISK
(
level
,
id
));
const
char
*
tfsGetDiskPath
(
STfs
*
pTfs
,
SDiskID
diskId
)
{
return
TFS_DISK_AT
(
pTfs
,
diskId
)
->
path
;
}
SDisk
*
pDisk
=
TFS_DISK_AT
(
level
,
id
);
void
tfsInitFile
(
STfs
*
pTfs
,
STfsFile
*
pFile
,
SDiskID
diskId
,
const
char
*
rname
)
{
STfsDisk
*
pDisk
=
TFS_DISK_AT
(
pTfs
,
diskId
);
pf
->
level
=
level
;
pf
->
id
=
id
;
tstrncpy
(
pf
->
rname
,
bname
,
TSDB_FILENAME_LEN
);
pFile
->
did
=
diskId
;
tstrncpy
(
pFile
->
rname
,
rname
,
TSDB_FILENAME_LEN
);
char
tmpName
[
TMPNAME_LEN
]
=
{
0
};
snprintf
(
tmpName
,
TMPNAME_LEN
,
"%s/%s"
,
DISK_DIR
(
pDisk
),
bname
);
tstrncpy
(
pf
->
aname
,
tmpName
,
TSDB_FILENAME_LEN
);
snprintf
(
tmpName
,
TMPNAME_LEN
,
"%s%s%s"
,
DISK_DIR
(
pDisk
),
TD_DIRSEP
,
rname
);
tstrncpy
(
pFile
->
aname
,
tmpName
,
TSDB_FILENAME_LEN
);
pFile
->
pTfs
=
pTfs
;
}
bool
tfsIsSameFile
(
const
TFILE
*
pf1
,
const
TFILE
*
pf
2
)
{
ASSERT
(
p
f1
!=
NULL
||
pf
2
!=
NULL
);
if
(
p
f1
==
NULL
||
pf2
==
NULL
)
return
false
;
if
(
p
f1
->
level
!=
pf2
->
level
)
return
false
;
if
(
p
f1
->
id
!=
pf2
->
id
)
return
false
;
if
(
strncmp
(
p
f1
->
rname
,
pf
2
->
rname
,
TSDB_FILENAME_LEN
)
!=
0
)
return
false
;
bool
tfsIsSameFile
(
const
STfsFile
*
pFile1
,
const
STfsFile
*
pFile
2
)
{
ASSERT
(
p
File1
!=
NULL
||
pFile
2
!=
NULL
);
if
(
p
File1
==
NULL
||
pFile2
==
NULL
||
pFile1
->
pTfs
!=
pFile2
->
pTfs
)
return
false
;
if
(
p
File1
->
did
.
level
!=
pFile2
->
did
.
level
)
return
false
;
if
(
p
File1
->
did
.
id
!=
pFile2
->
did
.
id
)
return
false
;
if
(
strncmp
(
p
File1
->
rname
,
pFile
2
->
rname
,
TSDB_FILENAME_LEN
)
!=
0
)
return
false
;
return
true
;
}
int32_t
tfsEncodeFile
(
void
**
buf
,
TFILE
*
pf
)
{
int32_t
tfsEncodeFile
(
void
**
buf
,
STfsFile
*
pFile
)
{
int32_t
tlen
=
0
;
tlen
+=
taosEncodeVariantI32
(
buf
,
p
f
->
level
);
tlen
+=
taosEncodeVariantI32
(
buf
,
p
f
->
id
);
tlen
+=
taosEncodeString
(
buf
,
p
f
->
rname
);
tlen
+=
taosEncodeVariantI32
(
buf
,
p
File
->
did
.
level
);
tlen
+=
taosEncodeVariantI32
(
buf
,
p
File
->
did
.
id
);
tlen
+=
taosEncodeString
(
buf
,
p
File
->
rname
);
return
tlen
;
}
void
*
tfsDecodeFile
(
void
*
buf
,
TFILE
*
pf
)
{
int32_t
level
,
id
;
char
*
rname
;
void
*
tfsDecodeFile
(
STfs
*
pTfs
,
void
*
buf
,
STfsFile
*
pFile
)
{
SDiskID
diskId
=
{
0
}
;
char
*
rname
=
NULL
;
buf
=
taosDecodeVariantI32
(
buf
,
&
(
level
)
);
buf
=
taosDecodeVariantI32
(
buf
,
&
(
id
)
);
buf
=
taosDecodeVariantI32
(
buf
,
&
diskId
.
level
);
buf
=
taosDecodeVariantI32
(
buf
,
&
diskId
.
id
);
buf
=
taosDecodeString
(
buf
,
&
rname
);
tfsInitFile
(
p
f
,
level
,
i
d
,
rname
);
tfsInitFile
(
p
Tfs
,
pFile
,
diskI
d
,
rname
);
tfree
(
rname
);
return
buf
;
}
void
tfs
basename
(
const
TFILE
*
pf
,
char
*
dest
)
{
void
tfs
Basename
(
const
STfsFile
*
pFile
,
char
*
dest
)
{
char
tname
[
TSDB_FILENAME_LEN
]
=
"
\0
"
;
tstrncpy
(
tname
,
p
f
->
aname
,
TSDB_FILENAME_LEN
);
tstrncpy
(
tname
,
p
File
->
aname
,
TSDB_FILENAME_LEN
);
tstrncpy
(
dest
,
basename
(
tname
),
TSDB_FILENAME_LEN
);
}
void
tfs
dirname
(
const
TFILE
*
pf
,
char
*
dest
)
{
void
tfs
Dirname
(
const
STfsFile
*
pFile
,
char
*
dest
)
{
char
tname
[
TSDB_FILENAME_LEN
]
=
"
\0
"
;
tstrncpy
(
tname
,
p
f
->
aname
,
TSDB_FILENAME_LEN
);
tstrncpy
(
tname
,
p
File
->
aname
,
TSDB_FILENAME_LEN
);
tstrncpy
(
dest
,
dirname
(
tname
),
TSDB_FILENAME_LEN
);
}
// DIR APIs ====================================
int32_t
tfsMkdirAt
(
const
char
*
rname
,
int32_t
level
,
int32_t
id
)
{
SDisk
*
pDisk
=
TFS_DISK_AT
(
level
,
id
);
int32_t
tfsMkdirAt
(
STfs
*
pTfs
,
const
char
*
rname
,
SDiskID
diskId
)
{
STfsDisk
*
pDisk
=
TFS_DISK_AT
(
pTfs
,
diskId
);
char
aname
[
TMPNAME_LEN
];
snprintf
(
aname
,
TMPNAME_LEN
,
"%s
/%s"
,
DISK_DIR
(
pDisk
)
,
rname
);
snprintf
(
aname
,
TMPNAME_LEN
,
"%s
%s%s"
,
pDisk
->
path
,
TD_DIRSEP
,
rname
);
if
(
taosMkDir
(
aname
)
!=
0
)
{
terrno
=
TAOS_SYSTEM_ERROR
(
errno
);
return
-
1
;
...
...
@@ -245,8 +211,8 @@ int32_t tfsMkdirAt(const char *rname, int32_t level, int32_t id) {
return
0
;
}
int32_t
tfsMkdirRecurAt
(
const
char
*
rname
,
int32_t
level
,
int32_t
i
d
)
{
if
(
tfsMkdirAt
(
rname
,
level
,
i
d
)
<
0
)
{
int32_t
tfsMkdirRecurAt
(
STfs
*
pTfs
,
const
char
*
rname
,
SDiskID
diskI
d
)
{
if
(
tfsMkdirAt
(
pTfs
,
rname
,
diskI
d
)
<
0
)
{
if
(
errno
==
ENOENT
)
{
// Try to create upper
char
*
s
=
strdup
(
rname
);
...
...
@@ -259,7 +225,7 @@ int32_t tfsMkdirRecurAt(const char *rname, int32_t level, int32_t id) {
// https://developer.apple.com/library/archive/documentation/System/Conceptual/ManPages_iPhoneOS/man3/dirname.3.html
char
*
dir
=
strdup
(
dirname
(
s
));
if
(
tfsMkdirRecurAt
(
dir
,
level
,
i
d
)
<
0
)
{
if
(
tfsMkdirRecurAt
(
pTfs
,
dir
,
diskI
d
)
<
0
)
{
free
(
s
);
free
(
dir
);
return
-
1
;
...
...
@@ -267,7 +233,7 @@ int32_t tfsMkdirRecurAt(const char *rname, int32_t level, int32_t id) {
free
(
s
);
free
(
dir
);
if
(
tfsMkdirAt
(
rname
,
level
,
i
d
)
<
0
)
{
if
(
tfsMkdirAt
(
pTfs
,
rname
,
diskI
d
)
<
0
)
{
return
-
1
;
}
}
else
{
...
...
@@ -278,11 +244,12 @@ int32_t tfsMkdirRecurAt(const char *rname, int32_t level, int32_t id) {
return
0
;
}
int32_t
tfsMkdir
(
const
char
*
rname
)
{
for
(
int32_t
level
=
0
;
level
<
TFS_NLEVEL
();
level
++
)
{
STier
*
pTier
=
TFS_TIER_AT
(
level
);
for
(
int32_t
id
=
0
;
id
<
TIER_NDISKS
(
pTier
);
id
++
)
{
if
(
tfsMkdirAt
(
rname
,
level
,
id
)
<
0
)
{
int32_t
tfsMkdir
(
STfs
*
pTfs
,
const
char
*
rname
)
{
for
(
int32_t
level
=
0
;
level
<
pTfs
->
nlevel
;
level
++
)
{
STfsTier
*
pTier
=
TFS_TIER_AT
(
pTfs
,
level
);
for
(
int32_t
id
=
0
;
id
<
pTier
->
ndisk
;
id
++
)
{
SDiskID
did
=
{.
id
=
id
,
.
level
=
level
};
if
(
tfsMkdirAt
(
pTfs
,
rname
,
did
)
<
0
)
{
return
-
1
;
}
}
...
...
@@ -291,16 +258,14 @@ int32_t tfsMkdir(const char *rname) {
return
0
;
}
int32_t
tfsRmdir
(
const
char
*
rname
)
{
int32_t
tfsRmdir
(
STfs
*
pTfs
,
const
char
*
rname
)
{
char
aname
[
TMPNAME_LEN
]
=
"
\0
"
;
for
(
int32_t
level
=
0
;
level
<
TFS_NLEVEL
();
level
++
)
{
STier
*
pTier
=
TFS_TIER_AT
(
level
);
for
(
int32_t
id
=
0
;
id
<
TIER_NDISKS
(
pTier
);
id
++
)
{
SDisk
*
pDisk
=
pTier
->
disks
[
id
];
snprintf
(
aname
,
TMPNAME_LEN
,
"%s%s%s"
,
DISK_DIR
(
pDisk
),
TS_PATH_DELIMITER
,
rname
);
for
(
int32_t
level
=
0
;
level
<
pTfs
->
nlevel
;
level
++
)
{
STfsTier
*
pTier
=
TFS_TIER_AT
(
pTfs
,
level
);
for
(
int32_t
id
=
0
;
id
<
pTier
->
ndisk
;
id
++
)
{
STfsDisk
*
pDisk
=
pTier
->
disks
[
id
];
snprintf
(
aname
,
TMPNAME_LEN
,
"%s%s%s"
,
pDisk
->
path
,
TD_DIRSEP
,
rname
);
taosRemoveDir
(
aname
);
}
}
...
...
@@ -308,117 +273,108 @@ int32_t tfsRmdir(const char *rname) {
return
0
;
}
#if 0
int32_t tfsRename(char *orname, char *nrname) {
int32_t
tfsRename
(
STfs
*
pTfs
,
char
*
orname
,
char
*
nrname
)
{
char
oaname
[
TMPNAME_LEN
]
=
"
\0
"
;
char
naname
[
TMPNAME_LEN
]
=
"
\0
"
;
for (int32_t level = 0; level < pfs->nlevel; level++) {
ST
ier *pTier = TFS_TIER_AT(
level);
for (int32_t id = 0; id <
TIER_NDISKS(pTier)
; id++) {
S
Disk *pDisk = DISK_AT_TIER(pTier, id)
;
snprintf(
oaname, TMPNAME_LEN, "%s/%s", DISK_DIR(pDisk), o
rname);
snprintf(naname, TMPNAME_LEN, "%s/%s", DISK_DIR(pDisk), nrname);
taosRenameFile(oaname, naname);
for
(
int32_t
level
=
0
;
level
<
p
T
fs
->
nlevel
;
level
++
)
{
ST
fsTier
*
pTier
=
TFS_TIER_AT
(
pTfs
,
level
);
for
(
int32_t
id
=
0
;
id
<
pTier
->
ndisk
;
id
++
)
{
S
TfsDisk
*
pDisk
=
pTier
->
disks
[
id
]
;
snprintf
(
oaname
,
TMPNAME_LEN
,
"%s%s%s"
,
DISK_DIR
(
pDisk
),
TD_DIRSEP
,
orname
);
snprintf
(
naname
,
TMPNAME_LEN
,
"%s%s%s"
,
DISK_DIR
(
pDisk
),
TD_DIRSEP
,
n
rname
);
if
(
taosRenameFile
(
oaname
,
naname
)
!=
0
)
{
return
-
1
;
}
}
}
return
0
;
}
#endif
struct
TDIR
{
SDiskIter
iter
;
int32_t
level
;
int32_t
id
;
char
dirname
[
TSDB_FILENAME_LEN
];
TFILE
tfile
;
DIR
*
dir
;
};
TDIR
*
tfsOpendir
(
const
char
*
rname
)
{
TDIR
*
tdir
=
(
TDIR
*
)
calloc
(
1
,
sizeof
(
*
tdir
));
if
(
tdir
==
NULL
)
{
STfsDir
*
tfsOpendir
(
STfs
*
pTfs
,
const
char
*
rname
)
{
STfsDir
*
pDir
=
calloc
(
1
,
sizeof
(
STfsDir
));
if
(
pDir
==
NULL
)
{
terrno
=
TSDB_CODE_OUT_OF_MEMORY
;
return
NULL
;
}
tfsInitDiskIter
(
&
(
tdir
->
iter
));
tstrncpy
(
tdir
->
dirname
,
rname
,
TSDB_FILENAME_LEN
);
SDiskID
diskId
=
{.
id
=
0
,
.
level
=
0
};
pDir
->
iter
->
pDisk
=
TFS_DISK_AT
(
pTfs
,
diskId
);
pDir
->
pTfs
=
pTfs
;
tstrncpy
(
pDir
->
dirname
,
rname
,
TSDB_FILENAME_LEN
);
if
(
tfsOpendirImpl
(
td
ir
)
<
0
)
{
free
(
td
ir
);
if
(
tfsOpendirImpl
(
pTfs
,
pD
ir
)
<
0
)
{
free
(
pD
ir
);
return
NULL
;
}
return
td
ir
;
return
pD
ir
;
}
const
TFILE
*
tfsReaddir
(
TDIR
*
td
ir
)
{
if
(
tdir
==
NULL
||
td
ir
->
dir
==
NULL
)
return
NULL
;
const
STfsFile
*
tfsReaddir
(
STfsDir
*
pD
ir
)
{
if
(
pDir
==
NULL
||
pD
ir
->
dir
==
NULL
)
return
NULL
;
char
bname
[
TMPNAME_LEN
*
2
]
=
"
\0
"
;
while
(
true
)
{
struct
dirent
*
dp
=
NULL
;
dp
=
readdir
(
td
ir
->
dir
);
dp
=
readdir
(
pD
ir
->
dir
);
if
(
dp
!=
NULL
)
{
// Skip . and ..
if
(
strcmp
(
dp
->
d_name
,
"."
)
==
0
||
strcmp
(
dp
->
d_name
,
".."
)
==
0
)
continue
;
snprintf
(
bname
,
TMPNAME_LEN
*
2
,
"%s/%s"
,
td
ir
->
dirname
,
dp
->
d_name
);
tfsInitFile
(
&
(
tdir
->
tfile
),
tdir
->
level
,
tdir
->
id
,
bname
);
return
&
(
tdir
->
tfile
)
;
snprintf
(
bname
,
TMPNAME_LEN
*
2
,
"%s/%s"
,
pD
ir
->
dirname
,
dp
->
d_name
);
tfsInitFile
(
pDir
->
pTfs
,
&
pDir
->
tfile
,
pDir
->
d
id
,
bname
);
return
&
pDir
->
tfile
;
}
if
(
tfsOpendirImpl
(
td
ir
)
<
0
)
{
if
(
tfsOpendirImpl
(
pDir
->
pTfs
,
pD
ir
)
<
0
)
{
return
NULL
;
}
if
(
td
ir
->
dir
==
NULL
)
{
if
(
pD
ir
->
dir
==
NULL
)
{
terrno
=
TSDB_CODE_SUCCESS
;
return
NULL
;
}
}
}
void
tfsClosedir
(
TDIR
*
td
ir
)
{
if
(
td
ir
)
{
if
(
td
ir
->
dir
!=
NULL
)
{
closedir
(
td
ir
->
dir
);
td
ir
->
dir
=
NULL
;
void
tfsClosedir
(
STfsDir
*
pD
ir
)
{
if
(
pD
ir
)
{
if
(
pD
ir
->
dir
!=
NULL
)
{
closedir
(
pD
ir
->
dir
);
pD
ir
->
dir
=
NULL
;
}
free
(
td
ir
);
free
(
pD
ir
);
}
}
// private
static
int32_t
tfsMount
(
SDiskCfg
*
pCfg
)
{
SDiskID
did
;
SDisk
*
pDisk
=
NULL
;
if
(
tfsCheckAndFormatCfg
(
pCfg
)
<
0
)
return
-
1
;
static
int32_t
tfsMount
(
STfs
*
pTfs
,
SDiskCfg
*
pCfg
)
{
if
(
tfsCheckAndFormatCfg
(
pTfs
,
pCfg
)
<
0
)
{
return
-
1
;
}
did
.
level
=
pCfg
->
level
;
pDisk
=
tfsMountDiskToTier
(
TFS_TIER_AT
(
did
.
level
),
pCfg
);
SDiskID
did
=
{.
level
=
pCfg
->
level
}
;
STfsDisk
*
pDisk
=
tfsMountDiskToTier
(
TFS_TIER_AT
(
pTfs
,
did
.
level
),
pCfg
);
if
(
pDisk
==
NULL
)
{
fError
(
"failed to mount disk %s to level %d since %s"
,
pCfg
->
dir
,
pCfg
->
level
,
t
strerror
(
terrno
));
fError
(
"failed to mount disk %s to level %d since %s"
,
pCfg
->
dir
,
pCfg
->
level
,
t
errstr
(
));
return
-
1
;
}
did
.
id
=
pDisk
->
id
;
taosHashPut
(
pfs
->
map
,
(
void
*
)(
pCfg
->
dir
),
strnlen
(
pCfg
->
dir
,
TSDB_FILENAME_LEN
),
(
void
*
)(
&
did
),
sizeof
(
did
));
if
(
pfs
->
nlevel
<
pCfg
->
level
+
1
)
pfs
->
nlevel
=
pCfg
->
level
+
1
;
taosHashPut
(
pTfs
->
hash
,
(
void
*
)(
pCfg
->
dir
),
strnlen
(
pCfg
->
dir
,
TSDB_FILENAME_LEN
),
(
void
*
)(
&
did
),
sizeof
(
did
));
if
(
pTfs
->
nlevel
<
pCfg
->
level
+
1
)
{
pTfs
->
nlevel
=
pCfg
->
level
+
1
;
}
return
0
;
}
static
int32_t
tfsCheckAndFormatCfg
(
SDiskCfg
*
pCfg
)
{
static
int32_t
tfsCheckAndFormatCfg
(
S
Tfs
*
pTfs
,
S
DiskCfg
*
pCfg
)
{
char
dirName
[
TSDB_FILENAME_LEN
]
=
"
\0
"
;
struct
stat
pstat
;
if
(
pCfg
->
level
<
0
||
pCfg
->
level
>=
T
SDB
_MAX_TIERS
)
{
if
(
pCfg
->
level
<
0
||
pCfg
->
level
>=
T
FS
_MAX_TIERS
)
{
fError
(
"failed to mount %s to FS since invalid level %d"
,
pCfg
->
dir
,
pCfg
->
level
);
terrno
=
TSDB_CODE_FS_INVLD_CFG
;
return
-
1
;
...
...
@@ -431,7 +387,7 @@ static int32_t tfsCheckAndFormatCfg(SDiskCfg *pCfg) {
return
-
1
;
}
if
(
TFS_PRIMARY_DISK
()
!=
NULL
)
{
if
(
TFS_PRIMARY_DISK
(
pTfs
)
!=
NULL
)
{
fError
(
"failed to mount %s to FS since duplicate primary mount"
,
pCfg
->
dir
);
terrno
=
TSDB_CODE_FS_DUP_PRIMARY
;
return
-
1
;
...
...
@@ -444,7 +400,7 @@ static int32_t tfsCheckAndFormatCfg(SDiskCfg *pCfg) {
return
-
1
;
}
if
(
tfsGetDiskByName
(
dirName
)
!=
NULL
)
{
if
(
tfsGetDiskByName
(
pTfs
,
dirName
)
!=
NULL
)
{
fError
(
"failed to mount %s to FS since duplicate mount"
,
pCfg
->
dir
);
terrno
=
TSDB_CODE_FS_INVLD_CFG
;
return
-
1
;
...
...
@@ -494,15 +450,15 @@ static int32_t tfsFormatDir(char *idir, char *odir) {
return
0
;
}
static
int32_t
tfsCheck
()
{
if
(
TFS_PRIMARY_DISK
()
==
NULL
)
{
static
int32_t
tfsCheck
(
STfs
*
pTfs
)
{
if
(
TFS_PRIMARY_DISK
(
pTfs
)
==
NULL
)
{
fError
(
"no primary disk is set"
);
terrno
=
TSDB_CODE_FS_NO_PRIMARY_DISK
;
return
-
1
;
}
for
(
int32_t
level
=
0
;
level
<
TFS_NLEVEL
()
;
level
++
)
{
if
(
T
IER_NDISKS
(
TFS_TIER_AT
(
level
))
==
0
)
{
for
(
int32_t
level
=
0
;
level
<
pTfs
->
nlevel
;
level
++
)
{
if
(
T
FS_TIER_AT
(
pTfs
,
level
)
->
ndisk
==
0
)
{
fError
(
"no disk at level %d"
,
level
);
terrno
=
TSDB_CODE_FS_NO_MOUNT_AT_TIER
;
return
-
1
;
...
...
@@ -512,66 +468,53 @@ static int32_t tfsCheck() {
return
0
;
}
static
SDisk
*
tfsGetDiskByID
(
SDiskID
did
)
{
return
TFS_DISK_AT
(
did
.
level
,
did
.
id
);
}
static
SDisk
*
tfsGetDiskByName
(
const
char
*
dir
)
{
SDiskID
did
;
SDisk
*
pDisk
=
NULL
;
void
*
pr
=
NULL
;
pr
=
taosHashGet
(
pfs
->
map
,
(
void
*
)
dir
,
strnlen
(
dir
,
TSDB_FILENAME_LEN
));
static
STfsDisk
*
tfsGetDiskByName
(
STfs
*
pTfs
,
const
char
*
dir
)
{
void
*
pr
=
taosHashGet
(
pTfs
->
hash
,
(
void
*
)
dir
,
strnlen
(
dir
,
TSDB_FILENAME_LEN
));
if
(
pr
==
NULL
)
return
NULL
;
did
=
*
(
SDiskID
*
)
pr
;
pDisk
=
tfsGetDiskByID
(
did
);
ASSERT
(
pDisk
!=
NULL
);
SDiskID
did
=
*
(
SDiskID
*
)
pr
;
STfsDisk
*
pDisk
=
TFS_DISK_AT
(
pTfs
,
did
);
return
pDisk
;
}
static
int32_t
tfsOpendirImpl
(
TDIR
*
td
ir
)
{
SDisk
*
pDisk
=
NULL
;
static
int32_t
tfsOpendirImpl
(
STfs
*
pTfs
,
STfsDir
*
pD
ir
)
{
S
Tfs
Disk
*
pDisk
=
NULL
;
char
adir
[
TMPNAME_LEN
*
2
]
=
"
\0
"
;
if
(
td
ir
->
dir
!=
NULL
)
{
closedir
(
td
ir
->
dir
);
td
ir
->
dir
=
NULL
;
if
(
pD
ir
->
dir
!=
NULL
)
{
closedir
(
pD
ir
->
dir
);
pD
ir
->
dir
=
NULL
;
}
while
(
true
)
{
pDisk
=
tfsNextDisk
(
&
(
tdir
->
iter
)
);
pDisk
=
tfsNextDisk
(
pTfs
,
pDir
->
iter
);
if
(
pDisk
==
NULL
)
return
0
;
tdir
->
level
=
pDisk
->
level
;
tdir
->
id
=
pDisk
->
id
;
pDir
->
did
.
level
=
pDisk
->
level
;
pDir
->
did
.
id
=
pDisk
->
id
;
snprintf
(
adir
,
TMPNAME_LEN
*
2
,
"%s%s%s"
,
pDisk
->
path
,
T
S_PATH_DELIMITER
,
td
ir
->
dirname
);
td
ir
->
dir
=
opendir
(
adir
);
if
(
td
ir
->
dir
!=
NULL
)
break
;
snprintf
(
adir
,
TMPNAME_LEN
*
2
,
"%s%s%s"
,
pDisk
->
path
,
T
D_DIRSEP
,
pD
ir
->
dirname
);
pD
ir
->
dir
=
opendir
(
adir
);
if
(
pD
ir
->
dir
!=
NULL
)
break
;
}
return
0
;
}
static
void
tfsInitDiskIter
(
SDiskIter
*
pIter
)
{
pIter
->
pDisk
=
TFS_DISK_AT
(
0
,
0
);
}
static
STfsDisk
*
tfsNextDisk
(
STfs
*
pTfs
,
SDiskIter
*
pIter
)
{
if
(
pIter
==
NULL
)
return
NULL
;
static
SDisk
*
tfsNextDisk
(
SDiskIter
*
pIter
)
{
SDisk
*
pDisk
=
pIter
->
pDisk
;
STfsDisk
*
pDisk
=
pIter
->
pDisk
;
SDisk
ID
did
=
{.
level
=
pDisk
->
level
,
.
id
=
pDisk
->
id
+
1
}
;
if
(
pDisk
==
NULL
)
return
NULL
;
int32_t
level
=
pDisk
->
level
;
int32_t
id
=
pDisk
->
id
;
id
++
;
if
(
id
<
TIER_NDISKS
(
TFS_TIER_AT
(
level
)))
{
pIter
->
pDisk
=
TFS_DISK_AT
(
level
,
id
);
ASSERT
(
pIter
->
pDisk
!=
NULL
);
if
(
did
.
id
<
TFS_TIER_AT
(
pTfs
,
did
.
level
)
->
ndisk
)
{
pIter
->
pDisk
=
TFS_DISK_AT
(
pTfs
,
did
);
}
else
{
level
++
;
id
=
0
;
if
(
level
<
TFS_NLEVEL
())
{
pIter
->
pDisk
=
TFS_DISK_AT
(
level
,
id
);
ASSERT
(
pIter
->
pDisk
!=
NULL
);
did
.
level
++
;
did
.
id
=
0
;
if
(
did
.
level
<
pTfs
->
nlevel
)
{
pIter
->
pDisk
=
TFS_DISK_AT
(
pTfs
,
did
);
}
else
{
pIter
->
pDisk
=
NULL
;
}
...
...
@@ -579,25 +522,3 @@ static SDisk *tfsNextDisk(SDiskIter *pIter) {
return
pDisk
;
}
// OTHER FUNCTIONS ===================================
void
taosGetDisk
()
{
const
double
unit
=
1024
*
1024
*
1024
;
SDiskSize
diskSize
;
SFSMeta
fsMeta
;
tfsUpdateSize
(
&
fsMeta
);
tsTotalDataDirGB
=
(
float
)(
fsMeta
.
total
/
unit
);
tsUsedDataDirGB
=
(
float
)(
fsMeta
.
used
/
unit
);
tsAvailDataDirGB
=
(
float
)(
fsMeta
.
avail
/
unit
);
if
(
taosGetDiskSize
(
tsLogDir
,
&
diskSize
)
==
0
)
{
tsTotalLogDirGB
=
(
float
)(
diskSize
.
total
/
unit
);
tsAvailLogDirGB
=
(
float
)(
diskSize
.
avail
/
unit
);
}
if
(
taosGetDiskSize
(
tsTempDir
,
&
diskSize
)
==
0
)
{
tsTotalTmpDirGB
=
(
float
)(
diskSize
.
total
/
unit
);
tsAvailTmpDirectorySpace
=
(
float
)(
diskSize
.
avail
/
unit
);
}
}
source/libs/tfs/src/tfsDisk.c
浏览文件 @
ed9709c3
...
...
@@ -16,8 +16,8 @@
#define _DEFAULT_SOURCE
#include "tfsInt.h"
SDisk
*
tfsNewDisk
(
int32_t
level
,
int32_t
id
,
const
char
*
path
)
{
S
Disk
*
pDisk
=
calloc
(
1
,
sizeof
(
S
Disk
));
S
Tfs
Disk
*
tfsNewDisk
(
int32_t
level
,
int32_t
id
,
const
char
*
path
)
{
S
TfsDisk
*
pDisk
=
calloc
(
1
,
sizeof
(
STfs
Disk
));
if
(
pDisk
==
NULL
)
{
terrno
=
TSDB_CODE_OUT_OF_MEMORY
;
return
NULL
;
...
...
@@ -36,7 +36,7 @@ SDisk *tfsNewDisk(int32_t level, int32_t id, const char *path) {
return
pDisk
;
}
S
Disk
*
tfsFreeDisk
(
S
Disk
*
pDisk
)
{
S
TfsDisk
*
tfsFreeDisk
(
STfs
Disk
*
pDisk
)
{
if
(
pDisk
!=
NULL
)
{
free
(
pDisk
->
path
);
free
(
pDisk
);
...
...
@@ -45,7 +45,7 @@ SDisk *tfsFreeDisk(SDisk *pDisk) {
return
NULL
;
}
int32_t
tfsUpdateDiskSize
(
SDisk
*
pDisk
)
{
int32_t
tfsUpdateDiskSize
(
S
Tfs
Disk
*
pDisk
)
{
if
(
taosGetDiskSize
(
pDisk
->
path
,
&
pDisk
->
size
)
!=
0
)
{
terrno
=
TAOS_SYSTEM_ERROR
(
errno
);
fError
(
"failed to get disk:%s size, level:%d id:%d since %s"
,
pDisk
->
path
,
pDisk
->
level
,
pDisk
->
id
,
terrstr
());
...
...
source/libs/tfs/src/tfsTier.c
浏览文件 @
ed9709c3
...
...
@@ -16,11 +16,8 @@
#define _DEFAULT_SOURCE
#include "tfsInt.h"
#define tfsLockTier(pTier) pthread_spin_lock(&(pTier)->lock)
#define tfsUnLockTier(pTier) pthread_spin_unlock(&(pTier)->lock)
int32_t
tfsInitTier
(
STier
*
pTier
,
int32_t
level
)
{
memset
(
pTier
,
0
,
sizeof
(
STier
));
int32_t
tfsInitTier
(
STfsTier
*
pTier
,
int32_t
level
)
{
memset
(
pTier
,
0
,
sizeof
(
STfsTier
));
if
(
pthread_spin_init
(
&
pTier
->
lock
,
0
)
!=
0
)
{
terrno
=
TAOS_SYSTEM_ERROR
(
errno
);
...
...
@@ -31,17 +28,17 @@ int32_t tfsInitTier(STier *pTier, int32_t level) {
return
0
;
}
void
tfsDestroyTier
(
STier
*
pTier
)
{
for
(
int32_t
id
=
0
;
id
<
T
SDB
_MAX_DISKS_PER_TIER
;
id
++
)
{
void
tfsDestroyTier
(
ST
fsT
ier
*
pTier
)
{
for
(
int32_t
id
=
0
;
id
<
T
FS
_MAX_DISKS_PER_TIER
;
id
++
)
{
pTier
->
disks
[
id
]
=
tfsFreeDisk
(
pTier
->
disks
[
id
]);
}
pTier
->
ndisk
=
0
;
pthread_spin_destroy
(
&
(
pTier
->
lock
)
);
pthread_spin_destroy
(
&
pTier
->
lock
);
}
S
Disk
*
tfsMountDiskToTier
(
S
Tier
*
pTier
,
SDiskCfg
*
pCfg
)
{
if
(
pTier
->
ndisk
>=
T
SDB
_MAX_DISKS_PER_TIER
)
{
S
TfsDisk
*
tfsMountDiskToTier
(
STfs
Tier
*
pTier
,
SDiskCfg
*
pCfg
)
{
if
(
pTier
->
ndisk
>=
T
FS
_MAX_DISKS_PER_TIER
)
{
terrno
=
TSDB_CODE_FS_TOO_MANY_MOUNT
;
return
NULL
;
}
...
...
@@ -61,12 +58,12 @@ SDisk *tfsMountDiskToTier(STier *pTier, SDiskCfg *pCfg) {
id
=
pTier
->
ndisk
;
}
if
(
id
>=
T
SDB
_MAX_DISKS_PER_TIER
)
{
if
(
id
>=
T
FS
_MAX_DISKS_PER_TIER
)
{
terrno
=
TSDB_CODE_FS_TOO_MANY_MOUNT
;
return
NULL
;
}
SDisk
*
pDisk
=
tfsNewDisk
(
pCfg
->
level
,
id
,
pCfg
->
dir
);
S
Tfs
Disk
*
pDisk
=
tfsNewDisk
(
pCfg
->
level
,
id
,
pCfg
->
dir
);
if
(
pDisk
==
NULL
)
return
NULL
;
pTier
->
disks
[
id
]
=
pDisk
;
...
...
@@ -76,14 +73,14 @@ SDisk *tfsMountDiskToTier(STier *pTier, SDiskCfg *pCfg) {
return
pTier
->
disks
[
id
];
}
void
tfsUpdateTierSize
(
STier
*
pTier
)
{
void
tfsUpdateTierSize
(
ST
fsT
ier
*
pTier
)
{
SDiskSize
size
=
{
0
};
int
16
_t
nAvailDisks
=
0
;
int
32
_t
nAvailDisks
=
0
;
tfsLockTier
(
pTier
);
for
(
int32_t
id
=
0
;
id
<
pTier
->
ndisk
;
id
++
)
{
SDisk
*
pDisk
=
pTier
->
disks
[
id
];
S
Tfs
Disk
*
pDisk
=
pTier
->
disks
[
id
];
if
(
pDisk
==
NULL
)
continue
;
size
.
total
+=
pDisk
->
size
.
total
;
...
...
@@ -99,7 +96,7 @@ void tfsUpdateTierSize(STier *pTier) {
}
// Round-Robin to allocate disk on a tier
int32_t
tfsAllocDiskOnTier
(
STier
*
pTier
)
{
int32_t
tfsAllocDiskOnTier
(
ST
fsT
ier
*
pTier
)
{
terrno
=
TSDB_CODE_FS_NO_VALID_DISK
;
tfsLockTier
(
pTier
);
...
...
@@ -110,9 +107,9 @@ int32_t tfsAllocDiskOnTier(STier *pTier) {
}
int32_t
retId
=
-
1
;
for
(
int32_t
id
=
0
;
id
<
T
SDB
_MAX_DISKS_PER_TIER
;
++
id
)
{
for
(
int32_t
id
=
0
;
id
<
T
FS
_MAX_DISKS_PER_TIER
;
++
id
)
{
int32_t
diskId
=
(
pTier
->
nextid
+
id
)
%
pTier
->
ndisk
;
S
Disk
*
pDisk
=
pTier
->
disks
[
diskId
];
S
TfsDisk
*
pDisk
=
pTier
->
disks
[
diskId
];
if
(
pDisk
==
NULL
)
continue
;
...
...
@@ -128,12 +125,12 @@ int32_t tfsAllocDiskOnTier(STier *pTier) {
return
retId
;
}
void
tfsPosNextId
(
STier
*
pTier
)
{
void
tfsPosNextId
(
ST
fsT
ier
*
pTier
)
{
int32_t
nextid
=
0
;
for
(
int32_t
id
=
1
;
id
<
pTier
->
ndisk
;
id
++
)
{
SDisk
*
pLDisk
=
pTier
->
disks
[
nextid
];
SDisk
*
pDisk
=
pTier
->
disks
[
id
];
S
Tfs
Disk
*
pLDisk
=
pTier
->
disks
[
nextid
];
S
Tfs
Disk
*
pDisk
=
pTier
->
disks
[
id
];
if
(
pDisk
->
size
.
avail
>
TFS_MIN_DISK_FREE_SIZE
&&
pDisk
->
size
.
avail
>
pLDisk
->
size
.
avail
)
{
nextid
=
id
;
}
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录