mirror of
https://codeberg.org/redict/redict.git
synced 2025-01-23 00:28:26 -05:00
RDB file creation refactored to target non-disk target.
This commit is contained in:
parent
034ca98678
commit
8beb98574a
109
src/rdb.c
109
src/rdb.c
@ -627,17 +627,74 @@ int rdbSaveKeyValuePair(rio *rdb, robj *key, robj *val,
|
|||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Save the DB on disk. Return REDIS_ERR on error, REDIS_OK on success */
|
/* Produces a dump of the database in RDB format sending it to the specified
|
||||||
int rdbSave(char *filename) {
|
* Redis I/O channel. On success REDIS_OK is returned, otherwise REDIS_ERR
|
||||||
|
* is returned and part of the output, or all the output, can be
|
||||||
|
* missing because of I/O errors.
|
||||||
|
*
|
||||||
|
* When the function returns REDIS_ERR and if 'error' is not NULL, the
|
||||||
|
* integer pointed by 'error' is set to the value of errno just after the I/O
|
||||||
|
* error. */
|
||||||
|
int rdbSaveRio(rio *rdb, int *error) {
|
||||||
dictIterator *di = NULL;
|
dictIterator *di = NULL;
|
||||||
dictEntry *de;
|
dictEntry *de;
|
||||||
char tmpfile[256];
|
|
||||||
char magic[10];
|
char magic[10];
|
||||||
int j;
|
int j;
|
||||||
long long now = mstime();
|
long long now = mstime();
|
||||||
|
uint64_t cksum;
|
||||||
|
|
||||||
|
if (server.rdb_checksum)
|
||||||
|
rdb->update_cksum = rioGenericUpdateChecksum;
|
||||||
|
snprintf(magic,sizeof(magic),"REDIS%04d",REDIS_RDB_VERSION);
|
||||||
|
if (rdbWriteRaw(rdb,magic,9) == -1) goto werr;
|
||||||
|
|
||||||
|
for (j = 0; j < server.dbnum; j++) {
|
||||||
|
redisDb *db = server.db+j;
|
||||||
|
dict *d = db->dict;
|
||||||
|
if (dictSize(d) == 0) continue;
|
||||||
|
di = dictGetSafeIterator(d);
|
||||||
|
if (!di) return REDIS_ERR;
|
||||||
|
|
||||||
|
/* Write the SELECT DB opcode */
|
||||||
|
if (rdbSaveType(rdb,REDIS_RDB_OPCODE_SELECTDB) == -1) goto werr;
|
||||||
|
if (rdbSaveLen(rdb,j) == -1) goto werr;
|
||||||
|
|
||||||
|
/* Iterate this DB writing every entry */
|
||||||
|
while((de = dictNext(di)) != NULL) {
|
||||||
|
sds keystr = dictGetKey(de);
|
||||||
|
robj key, *o = dictGetVal(de);
|
||||||
|
long long expire;
|
||||||
|
|
||||||
|
initStaticStringObject(key,keystr);
|
||||||
|
expire = getExpire(db,&key);
|
||||||
|
if (rdbSaveKeyValuePair(rdb,&key,o,expire,now) == -1) goto werr;
|
||||||
|
}
|
||||||
|
dictReleaseIterator(di);
|
||||||
|
}
|
||||||
|
di = NULL; /* So that we don't release it again on error. */
|
||||||
|
|
||||||
|
/* EOF opcode */
|
||||||
|
if (rdbSaveType(rdb,REDIS_RDB_OPCODE_EOF) == -1) goto werr;
|
||||||
|
|
||||||
|
/* CRC64 checksum. It will be zero if checksum computation is disabled, the
|
||||||
|
* loading code skips the check in this case. */
|
||||||
|
cksum = rdb->cksum;
|
||||||
|
memrev64ifbe(&cksum);
|
||||||
|
if (rioWrite(rdb,&cksum,8) == 0) goto werr;
|
||||||
|
return REDIS_OK;
|
||||||
|
|
||||||
|
werr:
|
||||||
|
if (error) *error = errno;
|
||||||
|
if (di) dictReleaseIterator(di);
|
||||||
|
return REDIS_ERR;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Save the DB on disk. Return REDIS_ERR on error, REDIS_OK on success. */
|
||||||
|
int rdbSave(char *filename) {
|
||||||
|
char tmpfile[256];
|
||||||
FILE *fp;
|
FILE *fp;
|
||||||
rio rdb;
|
rio rdb;
|
||||||
uint64_t cksum;
|
int error;
|
||||||
|
|
||||||
snprintf(tmpfile,256,"temp-%d.rdb", (int) getpid());
|
snprintf(tmpfile,256,"temp-%d.rdb", (int) getpid());
|
||||||
fp = fopen(tmpfile,"w");
|
fp = fopen(tmpfile,"w");
|
||||||
@ -648,48 +705,11 @@ int rdbSave(char *filename) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
rioInitWithFile(&rdb,fp);
|
rioInitWithFile(&rdb,fp);
|
||||||
if (server.rdb_checksum)
|
if (rdbSaveRio(&rdb,&error) == REDIS_ERR) {
|
||||||
rdb.update_cksum = rioGenericUpdateChecksum;
|
errno = error;
|
||||||
snprintf(magic,sizeof(magic),"REDIS%04d",REDIS_RDB_VERSION);
|
goto werr;
|
||||||
if (rdbWriteRaw(&rdb,magic,9) == -1) goto werr;
|
|
||||||
|
|
||||||
for (j = 0; j < server.dbnum; j++) {
|
|
||||||
redisDb *db = server.db+j;
|
|
||||||
dict *d = db->dict;
|
|
||||||
if (dictSize(d) == 0) continue;
|
|
||||||
di = dictGetSafeIterator(d);
|
|
||||||
if (!di) {
|
|
||||||
fclose(fp);
|
|
||||||
return REDIS_ERR;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Write the SELECT DB opcode */
|
|
||||||
if (rdbSaveType(&rdb,REDIS_RDB_OPCODE_SELECTDB) == -1) goto werr;
|
|
||||||
if (rdbSaveLen(&rdb,j) == -1) goto werr;
|
|
||||||
|
|
||||||
/* Iterate this DB writing every entry */
|
|
||||||
while((de = dictNext(di)) != NULL) {
|
|
||||||
sds keystr = dictGetKey(de);
|
|
||||||
robj key, *o = dictGetVal(de);
|
|
||||||
long long expire;
|
|
||||||
|
|
||||||
initStaticStringObject(key,keystr);
|
|
||||||
expire = getExpire(db,&key);
|
|
||||||
if (rdbSaveKeyValuePair(&rdb,&key,o,expire,now) == -1) goto werr;
|
|
||||||
}
|
|
||||||
dictReleaseIterator(di);
|
|
||||||
}
|
|
||||||
di = NULL; /* So that we don't release it again on error. */
|
|
||||||
|
|
||||||
/* EOF opcode */
|
|
||||||
if (rdbSaveType(&rdb,REDIS_RDB_OPCODE_EOF) == -1) goto werr;
|
|
||||||
|
|
||||||
/* CRC64 checksum. It will be zero if checksum computation is disabled, the
|
|
||||||
* loading code skips the check in this case. */
|
|
||||||
cksum = rdb.cksum;
|
|
||||||
memrev64ifbe(&cksum);
|
|
||||||
if (rioWrite(&rdb,&cksum,8) == 0) goto werr;
|
|
||||||
|
|
||||||
/* Make sure data will not remain on the OS's output buffers */
|
/* Make sure data will not remain on the OS's output buffers */
|
||||||
if (fflush(fp) == EOF) goto werr;
|
if (fflush(fp) == EOF) goto werr;
|
||||||
if (fsync(fileno(fp)) == -1) goto werr;
|
if (fsync(fileno(fp)) == -1) goto werr;
|
||||||
@ -712,7 +732,6 @@ werr:
|
|||||||
fclose(fp);
|
fclose(fp);
|
||||||
unlink(tmpfile);
|
unlink(tmpfile);
|
||||||
redisLog(REDIS_WARNING,"Write error saving DB on disk: %s", strerror(errno));
|
redisLog(REDIS_WARNING,"Write error saving DB on disk: %s", strerror(errno));
|
||||||
if (di) dictReleaseIterator(di);
|
|
||||||
return REDIS_ERR;
|
return REDIS_ERR;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user