提交 cb98cd3f 编写于 作者: H Hongze Cheng

refact

上级 aaa1c1cc
...@@ -389,6 +389,14 @@ TAOS_DEFINE_ERROR(TSDB_CODE_ODBC_CONV_SRC_BAD_SEQ, 0, 0x2113, "src bad se ...@@ -389,6 +389,14 @@ TAOS_DEFINE_ERROR(TSDB_CODE_ODBC_CONV_SRC_BAD_SEQ, 0, 0x2113, "src bad se
TAOS_DEFINE_ERROR(TSDB_CODE_ODBC_CONV_SRC_INCOMPLETE, 0, 0x2114, "src incomplete") TAOS_DEFINE_ERROR(TSDB_CODE_ODBC_CONV_SRC_INCOMPLETE, 0, 0x2114, "src incomplete")
TAOS_DEFINE_ERROR(TSDB_CODE_ODBC_CONV_SRC_GENERAL, 0, 0x2115, "src general") TAOS_DEFINE_ERROR(TSDB_CODE_ODBC_CONV_SRC_GENERAL, 0, 0x2115, "src general")
// tfs
TAOS_DEFINE_ERROR(TSDB_CODE_FS_OUT_OF_MEMORY, 0, 0x2200, "tfs out of memory")
TAOS_DEFINE_ERROR(TSDB_CODE_FS_INVLD_CFG 0, 0x2201, "tfs invalid mount config")
TAOS_DEFINE_ERROR(TSDB_CODE_FS_TOO_MANY_MOUNT 0, 0x2202, "tfs too many mount")
TAOS_DEFINE_ERROR(TSDB_CODE_FS_DUP_PRIMARY 0, 0x2203, "tfs duplicate primary mount")
TAOS_DEFINE_ERROR(TSDB_CODE_FS_NO_PRIMARY_DISK 0, 0x2204, "tfs no primary mount")
TAOS_DEFINE_ERROR(TSDB_CODE_FS_NO_MOUNT_AT_TIER 0, 0x2205, "tfs no mount at tier")
#ifdef TAOS_ERROR_C #ifdef TAOS_ERROR_C
}; };
......
...@@ -16,6 +16,8 @@ ...@@ -16,6 +16,8 @@
#ifndef TD_TDISK_H #ifndef TD_TDISK_H
#define TD_TDISK_H #define TD_TDISK_H
#include "tfslog.h"
#ifdef __cplusplus #ifdef __cplusplus
extern "C" { extern "C" {
#endif #endif
......
/*
* Copyright (c) 2019 TAOS Data, Inc. <jhtao@taosdata.com>
*
* This program is free software: you can use, redistribute, and/or modify
* it under the terms of the GNU Affero General Public License, version 3
* or later ("AGPL"), as published by the Free Software Foundation.
*
* This program is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#ifndef TD_TFSLOG_H
#define TD_TFSLOG_H
#ifdef __cplusplus
extern "C" {
#endif
#define fFatal(...) { if (fsDebugFlag & DEBUG_FATAL) { taosPrintLog("FS FATAL ", 255, __VA_ARGS__); }}
#define fError(...) { if (fsDebugFlag & DEBUG_ERROR) { taosPrintLog("FS ERROR ", 255, __VA_ARGS__); }}
#define fWarn(...) { if (fsDebugFlag & DEBUG_WARN) { taosPrintLog("FS WARN ", 255, __VA_ARGS__); }}
#define fInfo(...) { if (fsDebugFlag & DEBUG_INFO) { taosPrintLog("FS ", 255, __VA_ARGS__); }}
#define fDebug(...) { if (fsDebugFlag & DEBUG_DEBUG) { taosPrintLog("FS ", cqDebugFlag, __VA_ARGS__); }}
#define fTrace(...) { if (fsDebugFlag & DEBUG_TRACE) { taosPrintLog("FS ", cqDebugFlag, __VA_ARGS__); }}
#ifdef __cplusplus
}
#endif
#endif
\ No newline at end of file
...@@ -30,7 +30,7 @@ typedef struct { ...@@ -30,7 +30,7 @@ typedef struct {
SDisk *disks[TSDB_MAX_DISK_PER_TIER]; SDisk *disks[TSDB_MAX_DISK_PER_TIER];
} STier; } STier;
#define DISK_AT_TIER(pTier, id) ((pTier)->disks + (id)) #define DISK_AT_TIER(pTier, id) ((pTier)->disks[id])
void tdInitTier(STier *pTier, int level); void tdInitTier(STier *pTier, int level);
void tdDestroyTier(STier *pTier); void tdDestroyTier(STier *pTier);
......
...@@ -14,6 +14,7 @@ ...@@ -14,6 +14,7 @@
*/ */
#include "tdisk.h" #include "tdisk.h"
#include "taoserror.h"
SDisk *tdNewDisk(int level, int id, char *dir) { SDisk *tdNewDisk(int level, int id, char *dir) {
SDisk *pDisk = (SDisk *)calloc(1, sizeof(*pDisk)); SDisk *pDisk = (SDisk *)calloc(1, sizeof(*pDisk));
......
...@@ -14,17 +14,12 @@ ...@@ -14,17 +14,12 @@
*/ */
#include "os.h" #include "os.h"
#include "hash.h" #include "hash.h"
#include "ttier.h"
#include "tglobal.h"
#include "taoserror.h" #include "taoserror.h"
#include "tfs.h"
#define fFatal(...) { if (fsDebugFlag & DEBUG_FATAL) { taosPrintLog("FS FATAL ", 255, __VA_ARGS__); }} #include "tglobal.h"
#define fError(...) { if (fsDebugFlag & DEBUG_ERROR) { taosPrintLog("FS ERROR ", 255, __VA_ARGS__); }} #include "ttier.h"
#define fWarn(...) { if (fsDebugFlag & DEBUG_WARN) { taosPrintLog("FS WARN ", 255, __VA_ARGS__); }}
#define fInfo(...) { if (fsDebugFlag & DEBUG_INFO) { taosPrintLog("FS ", 255, __VA_ARGS__); }}
#define fDebug(...) { if (fsDebugFlag & DEBUG_DEBUG) { taosPrintLog("FS ", cqDebugFlag, __VA_ARGS__); }}
#define fTrace(...) { if (fsDebugFlag & DEBUG_TRACE) { taosPrintLog("FS ", cqDebugFlag, __VA_ARGS__); }}
#define TSDB_MAX_TIER 3 #define TSDB_MAX_TIER 3
...@@ -69,7 +64,7 @@ int tfsInit(SDiskCfg *pDiskCfg, int ndisk) { ...@@ -69,7 +64,7 @@ int tfsInit(SDiskCfg *pDiskCfg, int ndisk) {
} }
for (int idisk = 0; idisk < ndisk; idisk++) { for (int idisk = 0; idisk < ndisk; idisk++) {
if (tfsAddDisk(pDiskCfg + idisk) < 0) { if (tfsMount(pDiskCfg + idisk) < 0) {
tfsDestroy(); tfsDestroy();
return -1; return -1;
} }
...@@ -106,7 +101,7 @@ int tfsUpdateInfo() { ...@@ -106,7 +101,7 @@ int tfsUpdateInfo() {
} }
void tfsPrimaryPath(char *dst) { void tfsPrimaryPath(char *dst) {
strncpy(dst, DISK_AT) strncpy(dst, DISK_AT(0, 0)->dir, TSDB_FILENAME_LEN);
} }
int tfsCreateDir(char *name) { int tfsCreateDir(char *name) {
...@@ -131,16 +126,23 @@ int tfsCreateDir(char *name) { ...@@ -131,16 +126,23 @@ int tfsCreateDir(char *name) {
return 0; return 0;
} }
static int tfsAddDisk(SDiskCfg *pCfg) { static int tfsMount(SDiskCfg *pCfg) {
SDiskID did;
if (tfsCheckAndFormatCfg(pCfg) < 0) return -1; if (tfsCheckAndFormatCfg(pCfg) < 0) return -1;
if (tdAddDiskToTier(pCfg, TIER_AT(pCfg->level)) < 0) { did.level = pCfg->level;
did.id = tdAddDiskToTier(TIER_AT(pCfg->level), pCfg);
if (did.id < 0) {
fError("failed to add disk %s to FS since %s", pCfg->dir, tstrerror(terrno)); fError("failed to add disk %s to FS since %s", pCfg->dir, tstrerror(terrno));
return -1;
} }
taosHashPut(pTiers->map, (void *)dirName, strnlen(dirName, TSDB_FILENAME_LEN), (void *)(&diskid), sizeof(diskid)); taosHashPut(pTiers->map, pCfg->dir, strnlen(pCfg->dir, TSDB_FILENAME_LEN), (void *)(&did), sizeof(did));
if (pfs->nlevel < pCfg->level + 1) pfs->nlevel = pCfg->level + 1; if (pfs->nlevel < pCfg->level + 1) pfs->nlevel = pCfg->level + 1;
// TODO: update meta info
return 0; return 0;
} }
...@@ -154,12 +156,19 @@ static int tfsCheckAndFormatCfg(SDiskCfg *pCfg) { ...@@ -154,12 +156,19 @@ static int tfsCheckAndFormatCfg(SDiskCfg *pCfg) {
return -1; return -1;
} }
if (pCfg->primary && pCfg->level != 0) { if (pCfg->primary) {
fError("failed to add disk %s to FS since disk is primary but level %d not 0", pCfg->dir, pCfg->level); if (pCfg->level != 0) {
terrno = TSDB_CODE_FS_INVLD_CFG; fError("failed to add disk %s to FS since disk is primary but level %d not 0", pCfg->dir, pCfg->level);
return -1; terrno = TSDB_CODE_FS_INVLD_CFG;
} return -1;
}
if (DISK_AT(0, 0) != NULL) {
fError("failed to add disk %s to FS since duplicate primary mount", pCfg->dir, pCfg->level);
terrno = TSDB_CODE_FS_DUP_PRIMARY;
return -1;
}
}
if (tfsFormatDir(pCfg->dir, dirName) < 0) { if (tfsFormatDir(pCfg->dir, dirName) < 0) {
fError("failed to add disk %s to FS since invalid dir format", pCfg->dir); fError("failed to add disk %s to FS since invalid dir format", pCfg->dir);
...@@ -167,14 +176,14 @@ static int tfsCheckAndFormatCfg(SDiskCfg *pCfg) { ...@@ -167,14 +176,14 @@ static int tfsCheckAndFormatCfg(SDiskCfg *pCfg) {
return -1; return -1;
} }
if (tdGetDiskByName(dirName)) { if (tfsGetDiskByName(dirName) != NULL) {
fError("failed to add disk %s to FS since duplicate add", pCfg->dir); fError("failed to add disk %s to FS since duplicate mount", pCfg->dir);
terrno = TSDB_CODE_FS_INVLD_CFG; terrno = TSDB_CODE_FS_INVLD_CFG;
return -1; return -1;
} }
if (access(dirName, W_OK | R_OK | F_OK) != 0) { if (access(dirName, W_OK | R_OK | F_OK) != 0) {
fError("failed to add disk %s to FS since no enough access rights", pCfg->dir); fError("failed to add disk %s to FS since no R/W access rights", pCfg->dir);
terrno = TSDB_CODE_FS_INVLD_CFG; terrno = TSDB_CODE_FS_INVLD_CFG;
return -1; return -1;
} }
...@@ -223,13 +232,14 @@ static int tfsCheck() { ...@@ -223,13 +232,14 @@ static int tfsCheck() {
return -1; return -1;
} }
for (int level = 0; level < pfs->nlevel; level++) { int level = 0;
do {
if (TIER_AT(level)->ndisk == 0) { if (TIER_AT(level)->ndisk == 0) {
fError("no disk at level %d", level); fError("no disk at level %d", level);
terrno = TSDB_CODE_FS_NO_DISK_AT_TIER; terrno = TSDB_CODE_FS_NO_MOUNT_AT_TIER;
return -1; return -1;
} }
} } while (level < pfs->nlevel);
return 0; return 0;
} }
...@@ -252,4 +262,9 @@ static tfsUnLock() { ...@@ -252,4 +262,9 @@ static tfsUnLock() {
} }
return 0; return 0;
} }
\ No newline at end of file
static tfsGetDiskByName(char *dirName) {
}
static SDisk *tfsGetDiskByID(SDiskID did) { return DISK_AT(did.level, did.id); }
\ No newline at end of file
...@@ -15,6 +15,7 @@ ...@@ -15,6 +15,7 @@
#include "ttier.h" #include "ttier.h"
#include "tglobal.h" #include "tglobal.h"
#include "taoserror.h"
void tdInitTier(STier *pTier, int level) { void tdInitTier(STier *pTier, int level) {
pTier->level = level; pTier->level = level;
...@@ -23,8 +24,9 @@ void tdInitTier(STier *pTier, int level) { ...@@ -23,8 +24,9 @@ void tdInitTier(STier *pTier, int level) {
void tdDestroyTier(STier *pTier) { void tdDestroyTier(STier *pTier) {
for (int id = 0; id < TSDB_MAX_DISK_PER_TIER; id++) { for (int id = 0; id < TSDB_MAX_DISK_PER_TIER; id++) {
tdFreeDisk(DISK_AT_TIER(pTier, id)); tdFreeDisk(DISK_AT_TIER(pTier, id));
DISK_AT_TIER(pTier, id) = NULL; pTier->disks[id] = NULL;
} }
pTier->ndisk = 0;
} }
SDisk *tdAddDiskToTier(STier *pTier, SDiskCfg *pCfg) { SDisk *tdAddDiskToTier(STier *pTier, SDiskCfg *pCfg) {
...@@ -32,35 +34,29 @@ SDisk *tdAddDiskToTier(STier *pTier, SDiskCfg *pCfg) { ...@@ -32,35 +34,29 @@ SDisk *tdAddDiskToTier(STier *pTier, SDiskCfg *pCfg) {
int id = 0; int id = 0;
if (pTier->ndisk >= TSDB_MAX_DISK_PER_TIER) { if (pTier->ndisk >= TSDB_MAX_DISK_PER_TIER) {
terrno = TSDB_CODE_FS_TOO_MANY_DISKS; terrno = TSDB_CODE_FS_TOO_MANY_MOUNT;
return -1; return -1;
} }
if (pCfg->primary) { if (pTier->level == 0) {
if (DISK_AT(0, 0) != NULL) { if (DISK_AT_TIER(pTier, 0) != NULL) {
terrno = TSDB_CODE_FS_DUP_PRIMARY;
return -1;
}
} else {
if (pTier->level == 0) {
if (DISK_AT_TIER(pTier, 0) != NULL) {
id = pTier->ndisk;
} else {
id = pTier->ndisk + 1;
if (id >= TSDB_MAX_DISK_PER_TIER) {
terrno = TSDB_CODE_FS_TOO_MANY_DISKS;
return -1;
}
}
} else {
id = pTier->ndisk; id = pTier->ndisk;
} else {
id = pTier->ndisk + 1;
if (id >= TSDB_MAX_DISK_PER_TIER) {
terrno = TSDB_CODE_FS_TOO_MANY_MOUNT;
return -1;
}
} }
} else {
id = pTier->ndisk;
} }
pTier->disks[id] = tdNewDisk(pCfg->level, id, pCfg->dir); pTier->disks[id] = tdNewDisk(pCfg->level, id, pCfg->dir);
if (pTier->disks[id] == NULL) return -1; if (pTier->disks[id] == NULL) return -1;
pTier->ndisk++;
return 0; return id;
} }
int tdUpdateTierInfo(STier *pTier) { int tdUpdateTierInfo(STier *pTier) {
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册