From 37922f299f3f26be48cf550092a0153012e285ec Mon Sep 17 00:00:00 2001 From: Shengliang Guan Date: Tue, 8 Sep 2020 04:27:55 +0000 Subject: [PATCH] TD-1263 --- src/client/src/tscSystem.c | 4 --- src/common/inc/tglobal.h | 1 - src/common/src/tglobal.c | 10 ------- src/dnode/src/dnodeMain.c | 5 ---- src/os/inc/osDir.h | 1 + src/os/src/alpine/alpineEnv.c | 1 - src/os/src/darwin/darwinEnv.c | 1 - src/os/src/detail/osDir.c | 49 +++++++++++++++++++++++++++++++---- src/os/src/linux/linuxEnv.c | 2 -- src/os/src/windows/wEnv.c | 2 -- src/util/src/tlog.c | 23 +++++++++++++--- src/vnode/src/vnodeMain.c | 8 +++++- 12 files changed, 71 insertions(+), 36 deletions(-) diff --git a/src/client/src/tscSystem.c b/src/client/src/tscSystem.c index 15f06f5a3b..72f23881d2 100644 --- a/src/client/src/tscSystem.c +++ b/src/client/src/tscSystem.c @@ -94,10 +94,6 @@ void taos_init_imp(void) { printf("failed to create log dir:%s\n", tsLogDir); } - if (mkdir(tsLogbakDir, 0755) != 0 && errno != EEXIST) { - printf("failed to create logbak dir:%s\n", tsLogbakDir); - } - sprintf(temp, "%s/taoslog", tsLogDir); if (taosInitLog(temp, tsNumOfLogLines, 10) < 0) { printf("failed to open log file in directory:%s\n", tsLogDir); diff --git a/src/common/inc/tglobal.h b/src/common/inc/tglobal.h index bf9859d58c..77e8b76456 100644 --- a/src/common/inc/tglobal.h +++ b/src/common/inc/tglobal.h @@ -126,7 +126,6 @@ extern char tsDnodeDir[]; extern char tsMnodeDir[]; extern char tsDataDir[]; extern char tsLogDir[]; -extern char tsLogbakDir[]; extern char tsScriptDir[]; extern int64_t tsMsPerDay[3]; extern char tsVnodeBakDir[]; diff --git a/src/common/src/tglobal.c b/src/common/src/tglobal.c index acbfd34d10..5250d2947e 100644 --- a/src/common/src/tglobal.c +++ b/src/common/src/tglobal.c @@ -370,16 +370,6 @@ static void doInitGlobalConfig(void) { cfg.unitType = TAOS_CFG_UTYPE_NONE; taosInitConfigOption(cfg); - cfg.option = "logBakDir"; - cfg.ptr = tsLogbakDir; - cfg.valType = TAOS_CFG_VTYPE_DIRECTORY; - cfg.cfgType = TSDB_CFG_CTYPE_B_CONFIG | TSDB_CFG_CTYPE_B_CLIENT | TSDB_CFG_CTYPE_B_LOG; - cfg.minValue = 0; - cfg.maxValue = 0; - cfg.ptrLength = TSDB_FILENAME_LEN; - cfg.unitType = TAOS_CFG_UTYPE_NONE; - taosInitConfigOption(cfg); - cfg.option = "scriptDir"; cfg.ptr = tsScriptDir; cfg.valType = TAOS_CFG_VTYPE_DIRECTORY; diff --git a/src/dnode/src/dnodeMain.c b/src/dnode/src/dnodeMain.c index a00124098a..97e6f2ce6d 100644 --- a/src/dnode/src/dnodeMain.c +++ b/src/dnode/src/dnodeMain.c @@ -106,11 +106,6 @@ int32_t dnodeInitSystem() { return -1; } - if (dnodeCreateDir(tsLogbakDir) < 0) { - printf("failed to create dir: %s, reason: %s\n", tsLogbakDir, strerror(errno)); - return -1; - } - char temp[TSDB_FILENAME_LEN]; sprintf(temp, "%s/taosdlog", tsLogDir); if (taosInitLog(temp, tsNumOfLogLines, 1) < 0) { diff --git a/src/os/inc/osDir.h b/src/os/inc/osDir.h index e7dc04fd15..17683743e3 100644 --- a/src/os/inc/osDir.h +++ b/src/os/inc/osDir.h @@ -24,6 +24,7 @@ extern "C" { void taosRemoveDir(char *rootDir); int taosMkDir(const char *pathname, mode_t mode); void taosRename(char* oldName, char *newName); +void taosRemoveOldLogFiles(char *rootDir, int32_t keepDays); #ifdef __cplusplus } diff --git a/src/os/src/alpine/alpineEnv.c b/src/os/src/alpine/alpineEnv.c index 972a7ae7f1..811d98ad7f 100644 --- a/src/os/src/alpine/alpineEnv.c +++ b/src/os/src/alpine/alpineEnv.c @@ -27,7 +27,6 @@ void osInit() { strcpy(tsMnodeDir, ""); strcpy(tsDataDir, "/var/lib/taos"); strcpy(tsLogDir, "/var/log/taos"); - strcpy(tsLogbakDir, "/var/log/taos/bak"); strcpy(tsScriptDir, "/etc/taos"); strcpy(tsOsName, "Linux"); } \ No newline at end of file diff --git a/src/os/src/darwin/darwinEnv.c b/src/os/src/darwin/darwinEnv.c index 79f01c2459..6adebabec0 100644 --- a/src/os/src/darwin/darwinEnv.c +++ b/src/os/src/darwin/darwinEnv.c @@ -27,7 +27,6 @@ void osInit() { strcpy(tsMnodeDir, ""); strcpy(tsDataDir, "~/TDengine/data"); strcpy(tsLogDir, "~/TDengine/log"); - strcpy(tsLogbakDir, "~/TDengine/log/bak"); strcpy(tsScriptDir, "~/TDengine/cfg"); strcpy(tsOsName, "Darwin"); } diff --git a/src/os/src/detail/osDir.c b/src/os/src/detail/osDir.c index 7a537cdfea..2daee85762 100644 --- a/src/os/src/detail/osDir.c +++ b/src/os/src/detail/osDir.c @@ -51,11 +51,6 @@ int taosMkDir(const char *path, mode_t mode) { } void taosRename(char* oldName, char *newName) { - if (0 == tsEnableVnodeBak) { - uInfo("vnode backup not enabled"); - return; - } - // if newName in not empty, rename return fail. // the newName must be empty or does not exist if (rename(oldName, newName)) { @@ -65,4 +60,48 @@ void taosRename(char* oldName, char *newName) { } } +void taosRemoveOldLogFiles(char *rootDir, int32_t keepDays) { + DIR *dir = opendir(rootDir); + if (dir == NULL) return; + + int64_t ms = taosGetTimestampMs(); + struct dirent *de = NULL; + + while ((de = readdir(dir)) != NULL) { + if (strcmp(de->d_name, ".") == 0 || strcmp(de->d_name, "..") == 0) continue; + + char filename[1024]; + snprintf(filename, 1023, "%s/%s", rootDir, de->d_name); + if (de->d_type & DT_DIR) { + continue; + } else { + // struct stat fState; + // if (stat(fname, &fState) < 0) { + // continue; + // } + int32_t len = strlen(filename); + int64_t fileMs = 0; + for (int i = len - 1; i >= 0; ++i) { + if (filename[i] == '.') { + fileMs = atoll(filename + i + 1); + break; + } + } + + if (fileMs <= 0) continue; + int32_t days = (fileMs - ms) / 86400 + 1; + if (days > keepDays) { + (void)remove(filename); + uInfo("file:%s is removed, days:%d keepDays:%d", filename, days, keepDays); + + } else { + uTrace("file:%s won't be removed, days:%d keepDays:%d", filename, days, keepDays); + } + } + } + + closedir(dir); + rmdir(rootDir); +} + #endif diff --git a/src/os/src/linux/linuxEnv.c b/src/os/src/linux/linuxEnv.c index af3af97df2..14b40a1f18 100644 --- a/src/os/src/linux/linuxEnv.c +++ b/src/os/src/linux/linuxEnv.c @@ -25,7 +25,6 @@ void osInit() { } strcpy(tsDataDir, "/var/lib/power"); strcpy(tsLogDir, "/var/log/power"); - strcpy(tsLogbakDir, "/var/log/power/bak"); strcpy(tsScriptDir, "/etc/power"); #else if (configDir[0] == 0) { @@ -33,7 +32,6 @@ void osInit() { } strcpy(tsDataDir, "/var/lib/taos"); strcpy(tsLogDir, "/var/log/taos"); - strcpy(tsLogbakDir, "/var/log/taos/bak"); strcpy(tsScriptDir, "/etc/taos"); #endif diff --git a/src/os/src/windows/wEnv.c b/src/os/src/windows/wEnv.c index 2a758f31c3..8110a19490 100644 --- a/src/os/src/windows/wEnv.c +++ b/src/os/src/windows/wEnv.c @@ -30,7 +30,6 @@ void osInit() { strcpy(tsVnodeDir, "C:/PowerDB/data"); strcpy(tsDataDir, "C:/PowerDB/data"); strcpy(tsLogDir, "C:/PowerDB/log"); - strcpy(tsLogbakDir, "C:/PowerDB/log/bak"); strcpy(tsScriptDir, "C:/PowerDB/script"); #else @@ -41,7 +40,6 @@ void osInit() { strcpy(tsVnodeDir, "C:/TDengine/data"); strcpy(tsDataDir, "C:/TDengine/data"); strcpy(tsLogDir, "C:/TDengine/log"); - strcpy(tsLogbakDir, "C:/TDengine/log/bak"); strcpy(tsScriptDir, "C:/TDengine/script"); #endif diff --git a/src/util/src/tlog.c b/src/util/src/tlog.c index ab129b0ad4..b027304437 100644 --- a/src/util/src/tlog.c +++ b/src/util/src/tlog.c @@ -69,10 +69,8 @@ float tsAvailLogDirGB = 0; float tsMinimalLogDirGB = 0.1f; #ifdef _TD_POWER_ char tsLogDir[TSDB_FILENAME_LEN] = "/var/log/power"; -char tsLogbakDir[TSDB_FILENAME_LEN] = "/var/log/power/bak"; #else char tsLogDir[TSDB_FILENAME_LEN] = "/var/log/taos"; -char tsLogbakDir[TSDB_FILENAME_LEN] = "/var/log/taos/bak"; #endif static SLogObj tsLogObj = { .fileNum = 1 }; @@ -139,11 +137,25 @@ static void taosUnLockFile(int32_t fd) { } } +static void taosKeepOldLog(char *oldName) { + if (tsLogKeepDays <= 0) return; + + int64_t ms = taosGetTimestampMs(); + char fileName[LOG_FILE_NAME_LEN + 20]; + snprintf(fileName, LOG_FILE_NAME_LEN + 20, "%s.%" PRId64, tsLogObj.logName, ms); + + uInfo("rename log file %s to %s", oldName, fileName); + taosRename(oldName, fileName); + taosRemoveOldLogFiles(tsLogDir, tsLogKeepDays); +} + static void *taosThreadToOpenNewFile(void *param) { - char name[LOG_FILE_NAME_LEN + 20]; + char keepName[LOG_FILE_NAME_LEN + 20]; + sprintf(keepName, "%s.%d", tsLogObj.logName, tsLogObj.flag); tsLogObj.flag ^= 1; tsLogObj.lines = 0; + char name[LOG_FILE_NAME_LEN + 20]; sprintf(name, "%s.%d", tsLogObj.logName, tsLogObj.flag); umask(0); @@ -153,6 +165,7 @@ static void *taosThreadToOpenNewFile(void *param) { uError("open new log file fail! fd:%d reason:%s", fd, strerror(errno)); return NULL; } + taosLockFile(fd); (void)lseek(fd, 0, SEEK_SET); @@ -160,9 +173,11 @@ static void *taosThreadToOpenNewFile(void *param) { tsLogObj.logHandle->fd = fd; tsLogObj.lines = 0; tsLogObj.openInProgress = 0; + taosCloseLogByFd(oldFd); uInfo("new log file is opened!!!"); - taosCloseLogByFd(oldFd); + taosKeepOldLog(keepName); + return NULL; } diff --git a/src/vnode/src/vnodeMain.c b/src/vnode/src/vnodeMain.c index 5a778156ff..a463a2c90a 100644 --- a/src/vnode/src/vnodeMain.c +++ b/src/vnode/src/vnodeMain.c @@ -382,7 +382,13 @@ void vnodeRelease(void *pVnodeRaw) { char newDir[TSDB_FILENAME_LEN] = {0}; sprintf(rootDir, "%s/vnode%d", tsVnodeDir, vgId); sprintf(newDir, "%s/vnode%d", tsVnodeBakDir, vgId); - taosRename(rootDir, newDir); + + if (0 == tsEnableVnodeBak) { + vInfo("vgId:%d, vnode backup not enabled", pVnode->vgId); + } else { + taosRename(rootDir, newDir); + } + taosRemoveDir(rootDir); dnodeSendStatusMsgToMnode(); } -- GitLab