tdb/journal: rollback & restore multiple journal files
This commit is contained in:
parent
629c87685f
commit
0b1cd9f824
|
@ -832,12 +832,12 @@ static int tdbPagerPWritePageToDB(SPager *pPager, SPage *pPage) {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int tdbPagerRestore(SPager *pPager, SBTree *pBt) {
|
static int tdbPagerRestore(SPager *pPager, SBTree *pBt, const char *jFileName) {
|
||||||
int ret = 0;
|
int ret = 0;
|
||||||
SPgno journalSize = 0;
|
SPgno journalSize = 0;
|
||||||
u8 *pageBuf = NULL;
|
u8 *pageBuf = NULL;
|
||||||
|
|
||||||
tdb_fd_t jfd = tdbOsOpen(pPager->jFileName, TDB_O_RDWR, 0755);
|
tdb_fd_t jfd = tdbOsOpen(jFileName, TDB_O_RDWR, 0755);
|
||||||
if (jfd == NULL) {
|
if (jfd == NULL) {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -910,12 +910,50 @@ int tdbPagerRestore(SPager *pPager, SBTree *pBt) {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int tdbPagerRollback(SPager *pPager) {
|
int tdbPagerRestoreJournals(SPager *pPager, SBTree *pBt) {
|
||||||
if (tdbOsRemove(pPager->jFileName) < 0 && errno != ENOENT) {
|
tdbDirEntryPtr pDirEntry;
|
||||||
tdbError("failed to remove file due to %s. jFileName:%s", strerror(errno), pPager->jFileName);
|
tdbDirPtr pDir = taosOpenDir(pPager->pEnv->dbName);
|
||||||
terrno = TAOS_SYSTEM_ERROR(errno);
|
if (pDir == NULL) {
|
||||||
|
tdbError("failed to open %s since %s", pPager->pEnv->dbName, strerror(errno));
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
while ((pDirEntry = tdbReadDir(pDir)) != NULL) {
|
||||||
|
char *name = tdbDirEntryBaseName(tdbGetDirEntryName(pDirEntry));
|
||||||
|
if (strncmp(TDB_MAINDB_NAME "-journal", name, 16) == 0) {
|
||||||
|
if (tdbPagerRestore(pPager, pBt, name) < 0) {
|
||||||
|
tdbError("failed to restore file due to %s. jFileName:%s", strerror(errno), name);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
tdbCloseDir(&pDir);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int tdbPagerRollback(SPager *pPager) {
|
||||||
|
tdbDirEntryPtr pDirEntry;
|
||||||
|
tdbDirPtr pDir = taosOpenDir(pPager->pEnv->dbName);
|
||||||
|
if (pDir == NULL) {
|
||||||
|
tdbError("failed to open %s since %s", pPager->pEnv->dbName, strerror(errno));
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
while ((pDirEntry = tdbReadDir(pDir)) != NULL) {
|
||||||
|
char *name = tdbDirEntryBaseName(tdbGetDirEntryName(pDirEntry));
|
||||||
|
|
||||||
|
if (strncmp(TDB_MAINDB_NAME "-journal", name, 16) == 0) {
|
||||||
|
if (tdbOsRemove(name) < 0 && errno != ENOENT) {
|
||||||
|
tdbError("failed to remove file due to %s. jFileName:%s", strerror(errno), name);
|
||||||
|
terrno = TAOS_SYSTEM_ERROR(errno);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
tdbCloseDir(&pDir);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
|
@ -117,7 +117,7 @@ int tdbTbOpen(const char *tbname, int keyLen, int valLen, tdb_cmpr_fn_t keyCmprF
|
||||||
if (rollback) {
|
if (rollback) {
|
||||||
tdbPagerRollback(pPager);
|
tdbPagerRollback(pPager);
|
||||||
} else {
|
} else {
|
||||||
ret = tdbPagerRestore(pPager, pTb->pBt);
|
ret = tdbPagerRestoreJournals(pPager, pTb->pBt);
|
||||||
if (ret < 0) {
|
if (ret < 0) {
|
||||||
tdbOsFree(pTb);
|
tdbOsFree(pTb);
|
||||||
return -1;
|
return -1;
|
||||||
|
|
|
@ -197,7 +197,7 @@ int tdbPagerFetchPage(SPager *pPager, SPgno *ppgno, SPage **ppPage, int (*initP
|
||||||
TXN *pTxn);
|
TXN *pTxn);
|
||||||
void tdbPagerReturnPage(SPager *pPager, SPage *pPage, TXN *pTxn);
|
void tdbPagerReturnPage(SPager *pPager, SPage *pPage, TXN *pTxn);
|
||||||
int tdbPagerAllocPage(SPager *pPager, SPgno *ppgno);
|
int tdbPagerAllocPage(SPager *pPager, SPgno *ppgno);
|
||||||
int tdbPagerRestore(SPager *pPager, SBTree *pBt);
|
int tdbPagerRestoreJournals(SPager *pPager, SBTree *pBt);
|
||||||
int tdbPagerRollback(SPager *pPager);
|
int tdbPagerRollback(SPager *pPager);
|
||||||
|
|
||||||
// tdbPCache.c ====================================
|
// tdbPCache.c ====================================
|
||||||
|
|
|
@ -47,7 +47,6 @@ typedef TdFilePtr tdb_fd_t;
|
||||||
#define TDB_O_RDWR (TD_FILE_WRITE) | (TD_FILE_READ)
|
#define TDB_O_RDWR (TD_FILE_WRITE) | (TD_FILE_READ)
|
||||||
|
|
||||||
#define tdbOsOpen(PATH, OPTION, MODE) taosOpenFile((PATH), (OPTION))
|
#define tdbOsOpen(PATH, OPTION, MODE) taosOpenFile((PATH), (OPTION))
|
||||||
|
|
||||||
#define tdbOsClose(FD) taosCloseFile(&(FD))
|
#define tdbOsClose(FD) taosCloseFile(&(FD))
|
||||||
#define tdbOsRead taosReadFile
|
#define tdbOsRead taosReadFile
|
||||||
#define tdbOsPRead taosPReadFile
|
#define tdbOsPRead taosPReadFile
|
||||||
|
@ -55,6 +54,12 @@ typedef TdFilePtr tdb_fd_t;
|
||||||
#define tdbOsPWrite taosPWriteFile
|
#define tdbOsPWrite taosPWriteFile
|
||||||
#define tdbOsFSync taosFsyncFile
|
#define tdbOsFSync taosFsyncFile
|
||||||
#define tdbOsLSeek taosLSeekFile
|
#define tdbOsLSeek taosLSeekFile
|
||||||
|
#define tdbDirPtr TdDirPtr
|
||||||
|
#define tdbDirEntryPtr TdDirEntryPtr
|
||||||
|
#define tdbReadDir taosReadDir
|
||||||
|
#define tdbGetDirEntryName taosGetDirEntryName
|
||||||
|
#define tdbDirEntryBaseName taosDirEntryBaseName
|
||||||
|
#define tdbCloseDir taosCloseDir
|
||||||
#define tdbOsRemove remove
|
#define tdbOsRemove remove
|
||||||
#define tdbOsFileSize(FD, PSIZE) taosFStatFile(FD, PSIZE, NULL)
|
#define tdbOsFileSize(FD, PSIZE) taosFStatFile(FD, PSIZE, NULL)
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue