From f3b76d1acfd78cc4a1ae85c8c6a51cfa2afd929c Mon Sep 17 00:00:00 2001 From: slguan Date: Fri, 17 Apr 2020 16:36:31 +0800 Subject: [PATCH] old wal of sdb is deleted after recovery --- src/wal/src/walMain.c | 43 ++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 42 insertions(+), 1 deletion(-) diff --git a/src/wal/src/walMain.c b/src/wal/src/walMain.c index edca4e371c..9a9c658f1b 100644 --- a/src/wal/src/walMain.c +++ b/src/wal/src/walMain.c @@ -52,6 +52,7 @@ static uint32_t walSignature = 0xFAFBFDFE; static int walHandleExistingFiles(const char *path); static int walRestoreWalFile(const char *name, void *pVnode, FWalWrite writeFp); static int walRemoveWalFiles(const char *path); +static int walMoveOldWalFilesBack(const char *path); void *walOpen(const char *path, const SWalCfg *pCfg) { SWal *pWal = calloc(sizeof(SWal), 1); @@ -213,7 +214,11 @@ int walRestore(void *handle, void *pVnode, int (*writeFp)(void *, void *, int)) } if (code == 0) { - code = walRemoveWalFiles(opath); + if (pWal->keep) { + code = walMoveOldWalFilesBack(pWal->path); + } else { + code = walRemoveWalFiles(opath); + } if (code == 0) { if (remove(opath) < 0) { wError("wal:%s, failed to remove directory(%s)", opath, strerror(errno)); @@ -365,4 +370,40 @@ static int walRemoveWalFiles(const char *path) { return code; } +int walMoveOldWalFilesBack(const char *path) { + char oname[TSDB_FILENAME_LEN * 3]; + char nname[TSDB_FILENAME_LEN * 3]; + char opath[TSDB_FILENAME_LEN]; + struct dirent *ent; + int plen = strlen(walPrefix); + int code = 0; + + sprintf(opath, "%s/old", path); + + if (access(opath, F_OK) == 0) { + // move all old files to wal directory + int count = 0; + + DIR *dir = opendir(opath); + while ((ent = readdir(dir))!= NULL) { + if ( strncmp(ent->d_name, walPrefix, plen) == 0) { + sprintf(oname, "%s/%s", opath, ent->d_name); + sprintf(nname, "%s/%s", path, ent->d_name); + if (rename(oname, nname) < 0) { + wError("wal:%s, failed to move to new:%s", oname, nname); + code = -1; + break; + } + + count++; + } + } + + wTrace("wal:%s, %d old files are move back for keep option is set", path, count); + closedir(dir); + } + + return code; +} + -- GitLab