diff options
Diffstat (limited to 'src/rdb.c')
-rw-r--r-- | src/rdb.c | 28 |
1 files changed, 17 insertions, 11 deletions
@@ -48,6 +48,10 @@ /* This macro is called when RDB read failed (possibly a short read) */ #define rdbReportReadError(...) rdbReportError(0, __LINE__,__VA_ARGS__) +/* This macro tells if we are in the context of a RESTORE command, and not loading an RDB or AOF. */ +#define isRestoreContext() \ + (server.current_client == NULL || server.current_client->id == CLIENT_ID_AOF) ? 0 : 1 + char* rdbFileBeingLoaded = NULL; /* used for rdb checking on read error */ extern int rdbCheckMode; void rdbCheckError(const char *fmt, ...); @@ -68,7 +72,7 @@ void rdbReportError(int corruption_error, int linenum, char *reason, ...) { vsnprintf(msg+len,sizeof(msg)-len,reason,ap); va_end(ap); - if (!server.loading) { + if (isRestoreContext()) { /* If we're in the context of a RESTORE command, just propagate the error. */ /* log in VERBOSE, and return (don't exit). */ serverLog(LL_VERBOSE, "%s", msg); @@ -381,7 +385,7 @@ void *rdbLoadLzfStringObject(rio *rdb, int flags, size_t *lenptr) { if ((clen = rdbLoadLen(rdb,NULL)) == RDB_LENERR) return NULL; if ((len = rdbLoadLen(rdb,NULL)) == RDB_LENERR) return NULL; if ((c = ztrymalloc(clen)) == NULL) { - serverLog(server.loading? LL_WARNING: LL_VERBOSE, "rdbLoadLzfStringObject failed allocating %llu bytes", (unsigned long long)clen); + serverLog(isRestoreContext()? LL_VERBOSE: LL_WARNING, "rdbLoadLzfStringObject failed allocating %llu bytes", (unsigned long long)clen); goto err; } @@ -392,7 +396,7 @@ void *rdbLoadLzfStringObject(rio *rdb, int flags, size_t *lenptr) { val = sdstrynewlen(SDS_NOINIT,len); } if (!val) { - serverLog(server.loading? LL_WARNING: LL_VERBOSE, "rdbLoadLzfStringObject failed allocating %llu bytes", (unsigned long long)len); + serverLog(isRestoreContext()? LL_VERBOSE: LL_WARNING, "rdbLoadLzfStringObject failed allocating %llu bytes", (unsigned long long)len); goto err; } @@ -525,7 +529,7 @@ void *rdbGenericLoadStringObject(rio *rdb, int flags, size_t *lenptr) { if (plain || sds) { void *buf = plain ? ztrymalloc(len) : sdstrynewlen(SDS_NOINIT,len); if (!buf) { - serverLog(server.loading? LL_WARNING: LL_VERBOSE, "rdbGenericLoadStringObject failed allocating %llu bytes", len); + serverLog(isRestoreContext()? LL_VERBOSE: LL_WARNING, "rdbGenericLoadStringObject failed allocating %llu bytes", len); return NULL; } if (lenptr) *lenptr = len; @@ -541,7 +545,7 @@ void *rdbGenericLoadStringObject(rio *rdb, int flags, size_t *lenptr) { robj *o = encode ? tryCreateStringObject(SDS_NOINIT,len) : tryCreateRawStringObject(SDS_NOINIT,len); if (!o) { - serverLog(server.loading? LL_WARNING: LL_VERBOSE, "rdbGenericLoadStringObject failed allocating %llu bytes", len); + serverLog(isRestoreContext()? LL_VERBOSE: LL_WARNING, "rdbGenericLoadStringObject failed allocating %llu bytes", len); return NULL; } if (len && rioRead(rdb,o->ptr,len) == 0) { @@ -2517,9 +2521,10 @@ emptykey: /* Mark that we are loading in the global state and setup the fields * needed to provide loading stats. */ -void startLoading(size_t size, int rdbflags) { +void startLoading(size_t size, int rdbflags, int async) { /* Load the DB */ server.loading = 1; + if (async == 1) server.async_loading = 1; server.loading_start_time = time(NULL); server.loading_loaded_bytes = 0; server.loading_total_bytes = size; @@ -2547,7 +2552,7 @@ void startLoadingFile(FILE *fp, char* filename, int rdbflags) { if (fstat(fileno(fp), &sb) == -1) sb.st_size = 0; rdbFileBeingLoaded = filename; - startLoading(sb.st_size, rdbflags); + startLoading(sb.st_size, rdbflags, 0); } /* Refresh the loading progress info */ @@ -2560,6 +2565,7 @@ void loadingProgress(off_t pos) { /* Loading finished */ void stopLoading(int success) { server.loading = 0; + server.async_loading = 0; blockingOperationEnds(); rdbFileBeingLoaded = NULL; @@ -2610,10 +2616,10 @@ void rdbLoadProgressCallback(rio *r, const void *buf, size_t len) { /* Load an RDB file from the rio stream 'rdb'. On success C_OK is returned, * otherwise C_ERR is returned and 'errno' is set accordingly. */ -int rdbLoadRio(rio *rdb, int rdbflags, rdbSaveInfo *rsi) { +int rdbLoadRio(rio *rdb, int rdbflags, rdbSaveInfo *rsi, redisDb *dbarray) { uint64_t dbid = 0; int type, rdbver; - redisDb *db = server.db+0; + redisDb *db = dbarray+0; char buf[1024]; int error; long long empty_keys_skipped = 0; @@ -2685,7 +2691,7 @@ int rdbLoadRio(rio *rdb, int rdbflags, rdbSaveInfo *rsi) { "databases. Exiting\n", server.dbnum); exit(1); } - db = server.db+dbid; + db = dbarray+dbid; continue; /* Read next opcode. */ } else if (type == RDB_OPCODE_RESIZEDB) { /* RESIZEDB: Hint about the size of the keys in the currently @@ -2962,7 +2968,7 @@ int rdbLoad(char *filename, rdbSaveInfo *rsi, int rdbflags) { if ((fp = fopen(filename,"r")) == NULL) return C_ERR; startLoadingFile(fp, filename,rdbflags); rioInitWithFile(&rdb,fp); - retval = rdbLoadRio(&rdb,rdbflags,rsi); + retval = rdbLoadRio(&rdb,rdbflags,rsi,server.db); fclose(fp); stopLoading(retval==C_OK); return retval; |