commit
bcac36ad4a
|
@ -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))
|
||||||
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) {
|
||||||
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);
|
||||||
|
@ -564,3 +560,29 @@ int64_t walGetVersion(twalh param) {
|
||||||
|
|
||||||
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;
|
||||||
|
}
|
Loading…
Reference in New Issue