提交 1f279b72 编写于 作者: H Hongze Cheng

fix TD-1759

上级 1e14f722
...@@ -60,6 +60,7 @@ static int walRestoreWalFile(SWal *pWal, void *pVnode, FWalWrite writeFp); ...@@ -60,6 +60,7 @@ static int walRestoreWalFile(SWal *pWal, void *pVnode, FWalWrite writeFp);
static int walRemoveWalFiles(const char *path); static int walRemoveWalFiles(const char *path);
static void walProcessFsyncTimer(void *param, void *tmrId); static void walProcessFsyncTimer(void *param, void *tmrId);
static void walRelease(SWal *pWal); static void walRelease(SWal *pWal);
static int walGetMaxOldFileId(char *odir);
static void walModuleInitFunc() { static void walModuleInitFunc() {
walTmrCtrl = taosTmrInit(1000, 100, 300000, "WAL"); walTmrCtrl = taosTmrInit(1000, 100, 300000, "WAL");
...@@ -312,7 +313,7 @@ int walRestore(void *handle, void *pVnode, int (*writeFp)(void *, void *, int)) ...@@ -312,7 +313,7 @@ int walRestore(void *handle, void *pVnode, int (*writeFp)(void *, void *, int))
for (index = minId; index <= maxId; ++index) { for (index = minId; index <= maxId; ++index) {
snprintf(pWal->name, sizeof(pWal->name), "%s/%s%d", opath, walPrefix, index); snprintf(pWal->name, sizeof(pWal->name), "%s/%s%d", opath, walPrefix, index);
terrno = walRestoreWalFile(pWal, pVnode, writeFp); terrno = walRestoreWalFile(pWal, pVnode, writeFp);
if (terrno < 0) break; if (terrno < 0) continue;
} }
} }
...@@ -476,31 +477,26 @@ int walHandleExistingFiles(const char *path) { ...@@ -476,31 +477,26 @@ int walHandleExistingFiles(const char *path) {
int plen = strlen(walPrefix); int plen = strlen(walPrefix);
terrno = 0; terrno = 0;
if (access(opath, F_OK) == 0) { int midx = walGetMaxOldFileId(opath);
// old directory is there, it means restore process is not finished int count = 0;
walRemoveWalFiles(path); while ((ent = readdir(dir)) != NULL) {
if (strncmp(ent->d_name, walPrefix, plen) == 0) {
} else { midx++;
// move all files to old directory snprintf(oname, sizeof(oname), "%s/%s", path, ent->d_name);
int count = 0; snprintf(nname, sizeof(nname), "%s/old/wal%d", path, midx);
while ((ent = readdir(dir)) != NULL) { if (taosMkDir(opath, 0755) != 0) {
if (strncmp(ent->d_name, walPrefix, plen) == 0) { wError("wal:%s, failed to create directory:%s(%s)", oname, opath, strerror(errno));
snprintf(oname, sizeof(oname), "%s/%s", path, ent->d_name); terrno = TAOS_SYSTEM_ERROR(errno);
snprintf(nname, sizeof(nname), "%s/old/%s", path, ent->d_name); break;
if (taosMkDir(opath, 0755) != 0) { }
wError("wal:%s, failed to create directory:%s(%s)", oname, opath, strerror(errno));
terrno = TAOS_SYSTEM_ERROR(errno);
break;
}
if (rename(oname, nname) < 0) {
wError("wal:%s, failed to move to new:%s", oname, nname);
terrno = TAOS_SYSTEM_ERROR(errno);
break;
}
count++; if (rename(oname, nname) < 0) {
wError("wal:%s, failed to move to new:%s", oname, nname);
terrno = TAOS_SYSTEM_ERROR(errno);
break;
} }
count++;
} }
wDebug("wal:%s, %d files are moved for restoration", path, count); wDebug("wal:%s, %d files are moved for restoration", path, count);
...@@ -563,4 +559,30 @@ int64_t walGetVersion(twalh param) { ...@@ -563,4 +559,30 @@ int64_t walGetVersion(twalh param) {
if (pWal == 0) return 0; if (pWal == 0) return 0;
return pWal->version; return pWal->version;
}
static int walGetMaxOldFileId(char *odir) {
int midx = 0;
DIR * dir = NULL;
struct dirent *dp = NULL;
int plen = strlen(walPrefix);
if (access(odir, F_OK) != 0) return midx;
dir = opendir(odir);
if (dir == NULL) {
wError("failed to open directory %s since %s", odir, strerror(errno));
terrno = TAOS_SYSTEM_ERROR(errno);
return -1;
}
while ((dp = readdir(dir)) != NULL) {
if (strncmp(dp->d_name, walPrefix, plen) == 0) {
int idx = atol(dp->d_name + plen);
if (midx < idx) midx = idx;
}
}
closedir(dir);
return midx;
} }
\ No newline at end of file
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册