discard kvstore snapshot
This commit is contained in:
parent
027131231c
commit
204998316e
|
@ -37,10 +37,6 @@ typedef struct {
|
||||||
typedef struct {
|
typedef struct {
|
||||||
char * fname;
|
char * fname;
|
||||||
int fd;
|
int fd;
|
||||||
char * fsnap;
|
|
||||||
int sfd;
|
|
||||||
char * fnew;
|
|
||||||
int nfd;
|
|
||||||
SHashObj * map;
|
SHashObj * map;
|
||||||
iterFunc iFunc;
|
iterFunc iFunc;
|
||||||
afterFunc aFunc;
|
afterFunc aFunc;
|
||||||
|
|
|
@ -40,8 +40,6 @@ static int tdInitKVStoreHeader(int fd, char *fname);
|
||||||
static int tdEncodeStoreInfo(void **buf, SStoreInfo *pInfo);
|
static int tdEncodeStoreInfo(void **buf, SStoreInfo *pInfo);
|
||||||
static void * tdDecodeStoreInfo(void *buf, SStoreInfo *pInfo);
|
static void * tdDecodeStoreInfo(void *buf, SStoreInfo *pInfo);
|
||||||
static SKVStore *tdNewKVStore(char *fname, iterFunc iFunc, afterFunc aFunc, void *appH);
|
static SKVStore *tdNewKVStore(char *fname, iterFunc iFunc, afterFunc aFunc, void *appH);
|
||||||
static char * tdGetKVStoreSnapshotFname(char *fdata);
|
|
||||||
static char * tdGetKVStoreNewFname(char *fdata);
|
|
||||||
static void tdFreeKVStore(SKVStore *pStore);
|
static void tdFreeKVStore(SKVStore *pStore);
|
||||||
static int tdUpdateKVStoreHeader(int fd, char *fname, SStoreInfo *pInfo);
|
static int tdUpdateKVStoreHeader(int fd, char *fname, SStoreInfo *pInfo);
|
||||||
static int tdLoadKVStoreHeader(int fd, char *fname, SStoreInfo *pInfo, uint32_t *version);
|
static int tdLoadKVStoreHeader(int fd, char *fname, SStoreInfo *pInfo, uint32_t *version);
|
||||||
|
@ -103,41 +101,6 @@ SKVStore *tdOpenKVStore(char *fname, iterFunc iFunc, afterFunc aFunc, void *appH
|
||||||
goto _err;
|
goto _err;
|
||||||
}
|
}
|
||||||
|
|
||||||
pStore->sfd = open(pStore->fsnap, O_RDONLY);
|
|
||||||
if (pStore->sfd < 0) {
|
|
||||||
if (errno != ENOENT) {
|
|
||||||
uError("failed to open file %s since %s", pStore->fsnap, strerror(errno));
|
|
||||||
terrno = TAOS_SYSTEM_ERROR(errno);
|
|
||||||
goto _err;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
uDebug("file %s exists, try to recover the KV store", pStore->fsnap);
|
|
||||||
if (tdLoadKVStoreHeader(pStore->sfd, pStore->fsnap, &info, &version) < 0) {
|
|
||||||
if (terrno != TSDB_CODE_COM_FILE_CORRUPTED) goto _err;
|
|
||||||
} else {
|
|
||||||
if (version != KVSTORE_FILE_VERSION) {
|
|
||||||
uError("file %s version %u is not the same as program version %u, this may cause problem", pStore->fsnap,
|
|
||||||
version, KVSTORE_FILE_VERSION);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (taosFtruncate(pStore->fd, info.size) < 0) {
|
|
||||||
uError("failed to truncate %s to %" PRId64 " size since %s", pStore->fname, info.size, strerror(errno));
|
|
||||||
terrno = TAOS_SYSTEM_ERROR(errno);
|
|
||||||
goto _err;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (tdUpdateKVStoreHeader(pStore->fd, pStore->fname, &info) < 0) goto _err;
|
|
||||||
if (fsync(pStore->fd) < 0) {
|
|
||||||
uError("failed to fsync file %s since %s", pStore->fname, strerror(errno));
|
|
||||||
goto _err;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
close(pStore->sfd);
|
|
||||||
pStore->sfd = -1;
|
|
||||||
(void)remove(pStore->fsnap);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (tdLoadKVStoreHeader(pStore->fd, pStore->fname, &info, &version) < 0) goto _err;
|
if (tdLoadKVStoreHeader(pStore->fd, pStore->fname, &info, &version) < 0) goto _err;
|
||||||
if (version != KVSTORE_FILE_VERSION) {
|
if (version != KVSTORE_FILE_VERSION) {
|
||||||
uError("file %s version %u is not the same as program version %u, this may cause problem", pStore->fname, version,
|
uError("file %s version %u is not the same as program version %u, this may cause problem", pStore->fname, version,
|
||||||
|
@ -159,10 +122,6 @@ _err:
|
||||||
close(pStore->fd);
|
close(pStore->fd);
|
||||||
pStore->fd = -1;
|
pStore->fd = -1;
|
||||||
}
|
}
|
||||||
if (pStore->sfd > 0) {
|
|
||||||
close(pStore->sfd);
|
|
||||||
pStore->sfd = -1;
|
|
||||||
}
|
|
||||||
tdFreeKVStore(pStore);
|
tdFreeKVStore(pStore);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
@ -179,32 +138,6 @@ int tdKVStoreStartCommit(SKVStore *pStore) {
|
||||||
goto _err;
|
goto _err;
|
||||||
}
|
}
|
||||||
|
|
||||||
pStore->sfd = open(pStore->fsnap, O_WRONLY | O_CREAT, 0755);
|
|
||||||
if (pStore->sfd < 0) {
|
|
||||||
uError("failed to open file %s since %s", pStore->fsnap, strerror(errno));
|
|
||||||
terrno = TAOS_SYSTEM_ERROR(errno);
|
|
||||||
goto _err;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (taosSendFile(pStore->sfd, pStore->fd, NULL, TD_KVSTORE_HEADER_SIZE) < TD_KVSTORE_HEADER_SIZE) {
|
|
||||||
uError("failed to send file %d bytes since %s", TD_KVSTORE_HEADER_SIZE, strerror(errno));
|
|
||||||
terrno = TAOS_SYSTEM_ERROR(errno);
|
|
||||||
goto _err;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (fsync(pStore->sfd) < 0) {
|
|
||||||
uError("failed to fsync file %s since %s", pStore->fsnap, strerror(errno));
|
|
||||||
terrno = TAOS_SYSTEM_ERROR(errno);
|
|
||||||
goto _err;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (close(pStore->sfd) < 0) {
|
|
||||||
uError("failed to close file %s since %s", pStore->fsnap, strerror(errno));
|
|
||||||
terrno = TAOS_SYSTEM_ERROR(errno);
|
|
||||||
goto _err;
|
|
||||||
}
|
|
||||||
pStore->sfd = -1;
|
|
||||||
|
|
||||||
if (lseek(pStore->fd, 0, SEEK_END) < 0) {
|
if (lseek(pStore->fd, 0, SEEK_END) < 0) {
|
||||||
uError("failed to lseek file %s since %s", pStore->fname, strerror(errno));
|
uError("failed to lseek file %s since %s", pStore->fname, strerror(errno));
|
||||||
terrno = TAOS_SYSTEM_ERROR(errno);
|
terrno = TAOS_SYSTEM_ERROR(errno);
|
||||||
|
@ -216,11 +149,6 @@ int tdKVStoreStartCommit(SKVStore *pStore) {
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
_err:
|
_err:
|
||||||
if (pStore->sfd > 0) {
|
|
||||||
close(pStore->sfd);
|
|
||||||
pStore->sfd = -1;
|
|
||||||
(void)remove(pStore->fsnap);
|
|
||||||
}
|
|
||||||
if (pStore->fd > 0) {
|
if (pStore->fd > 0) {
|
||||||
close(pStore->fd);
|
close(pStore->fd);
|
||||||
pStore->fd = -1;
|
pStore->fd = -1;
|
||||||
|
@ -328,7 +256,6 @@ int tdKVStoreEndCommit(SKVStore *pStore) {
|
||||||
}
|
}
|
||||||
pStore->fd = -1;
|
pStore->fd = -1;
|
||||||
|
|
||||||
(void)remove(pStore->fsnap);
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -448,17 +375,7 @@ static SKVStore *tdNewKVStore(char *fname, iterFunc iFunc, afterFunc aFunc, void
|
||||||
goto _err;
|
goto _err;
|
||||||
}
|
}
|
||||||
|
|
||||||
pStore->fsnap = tdGetKVStoreSnapshotFname(fname);
|
|
||||||
if (pStore->fsnap == NULL) {
|
|
||||||
goto _err;
|
|
||||||
}
|
|
||||||
|
|
||||||
pStore->fnew = tdGetKVStoreNewFname(fname);
|
|
||||||
if (pStore->fnew == NULL) goto _err;
|
|
||||||
|
|
||||||
pStore->fd = -1;
|
pStore->fd = -1;
|
||||||
pStore->sfd = -1;
|
|
||||||
pStore->nfd = -1;
|
|
||||||
pStore->iFunc = iFunc;
|
pStore->iFunc = iFunc;
|
||||||
pStore->aFunc = aFunc;
|
pStore->aFunc = aFunc;
|
||||||
pStore->appH = appH;
|
pStore->appH = appH;
|
||||||
|
@ -478,35 +395,11 @@ _err:
|
||||||
static void tdFreeKVStore(SKVStore *pStore) {
|
static void tdFreeKVStore(SKVStore *pStore) {
|
||||||
if (pStore) {
|
if (pStore) {
|
||||||
tfree(pStore->fname);
|
tfree(pStore->fname);
|
||||||
tfree(pStore->fsnap);
|
|
||||||
tfree(pStore->fnew);
|
|
||||||
taosHashCleanup(pStore->map);
|
taosHashCleanup(pStore->map);
|
||||||
free(pStore);
|
free(pStore);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static char *tdGetKVStoreSnapshotFname(char *fdata) {
|
|
||||||
size_t size = strlen(fdata) + strlen(TD_KVSTORE_SNAP_SUFFIX) + 1;
|
|
||||||
char * fname = malloc(size);
|
|
||||||
if (fname == NULL) {
|
|
||||||
terrno = TSDB_CODE_COM_OUT_OF_MEMORY;
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
sprintf(fname, "%s%s", fdata, TD_KVSTORE_SNAP_SUFFIX);
|
|
||||||
return fname;
|
|
||||||
}
|
|
||||||
|
|
||||||
static char *tdGetKVStoreNewFname(char *fdata) {
|
|
||||||
size_t size = strlen(fdata) + strlen(TD_KVSTORE_NEW_SUFFIX) + 1;
|
|
||||||
char * fname = malloc(size);
|
|
||||||
if (fname == NULL) {
|
|
||||||
terrno = TSDB_CODE_COM_OUT_OF_MEMORY;
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
sprintf(fname, "%s%s", fdata, TD_KVSTORE_NEW_SUFFIX);
|
|
||||||
return fname;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int tdEncodeKVRecord(void **buf, SKVRecord *pRecord) {
|
static int tdEncodeKVRecord(void **buf, SKVRecord *pRecord) {
|
||||||
int tlen = 0;
|
int tlen = 0;
|
||||||
tlen += taosEncodeFixedU64(buf, pRecord->uid);
|
tlen += taosEncodeFixedU64(buf, pRecord->uid);
|
||||||
|
|
Loading…
Reference in New Issue