@@ -79,6 +79,7 @@ void printCrashReport(void);
7979void bugReportEnd (int killViaSignal, int sig);
8080void logStackTrace (void *eip, int uplevel);
8181void getTempFileName (char tmpfile[], int tmpfileNum);
82+ bool initializeStorageProvider (const char **err);
8283
8384/* ================================= Debugging ============================== */
8485
@@ -535,29 +536,74 @@ NULL
535536 return ;
536537 }
537538 }
539+
540+ if (g_pserver->m_pstorageFactory ) {
541+ protectClient (c);
538542
539- /* The default behavior is to save the RDB file before loading
540- * it back. */
541- if (save) {
542- rdbSaveInfo rsi, *rsiptr;
543- rsiptr = rdbPopulateSaveInfo (&rsi);
544- if (rdbSave (nullptr , rsiptr) != C_OK) {
545- addReply (c,shared.err );
546- return ;
543+ for (int idb = 0 ; idb < cserver.dbnum ; ++idb) {
544+ if (g_pserver->db [idb]->processChanges (false ))
545+ g_pserver->db [idb]->commitChanges ();
546+ g_pserver->db [idb]->storageProviderDelete ();
547547 }
548- }
548+ delete g_pserver-> metadataDb ;
549549
550- /* The default behavior is to remove the current dataset from
551- * memory before loading the RDB file, however when MERGE is
552- * used together with NOFLUSH, we are able to merge two datasets. */
553- if (flush) emptyDb (-1 ,EMPTYDB_NO_FLAGS,NULL );
550+ if (flush) emptyDb (-1 ,EMPTYDB_NO_FLAGS,NULL );
554551
555- protectClient (c);
556- int ret = rdbLoadFile (g_pserver->rdb_filename ,NULL ,flags);
557- unprotectClient (c);
558- if (ret != C_OK) {
559- addReplyError (c," Error trying to load the RDB dump" );
560- return ;
552+ delete g_pserver->m_pstorageFactory ;
553+
554+ const char *err;
555+ if (!initializeStorageProvider (&err))
556+ {
557+ serverLog (LL_WARNING, " Failed to initialize storage provider: %s" ,err);
558+ exit (EXIT_FAILURE);
559+ }
560+
561+ g_pserver->metadataDb = g_pserver->m_pstorageFactory ->createMetadataDb ();
562+ for (int idb = 0 ; idb < cserver.dbnum ; ++idb)
563+ {
564+ int dbid = idb;
565+ std::string dbid_key = " db-" + std::to_string (idb);
566+ g_pserver->metadataDb ->retrieve (dbid_key.c_str (), dbid_key.length (), [&](const char *, size_t , const void *data, size_t ){
567+ dbid = *(int *)data;
568+ });
569+ delete g_pserver->db [idb];
570+ g_pserver->db [idb] = new (MALLOC_LOCAL) redisDb ();
571+ g_pserver->db [idb]->initialize (dbid);
572+ }
573+
574+ moduleFireServerEvent (REDISMODULE_EVENT_LOADING, REDISMODULE_SUBEVENT_LOADING_FLASH_START, NULL );
575+ for (int idb = 0 ; idb < cserver.dbnum ; ++idb)
576+ {
577+ g_pserver->db [idb]->storageProviderInitialize ();
578+ g_pserver->db [idb]->trackChanges (false );
579+ }
580+ moduleFireServerEvent (REDISMODULE_EVENT_LOADING, REDISMODULE_SUBEVENT_LOADING_ENDED, NULL );
581+
582+ unprotectClient (c);
583+ } else {
584+ /* The default behavior is to save the RDB file before loading
585+ * it back. */
586+ if (save) {
587+ rdbSaveInfo rsi, *rsiptr;
588+ rsiptr = rdbPopulateSaveInfo (&rsi);
589+ if (rdbSave (nullptr , rsiptr) != C_OK) {
590+ addReply (c,shared.err );
591+ return ;
592+ }
593+ }
594+
595+ /* The default behavior is to remove the current dataset from
596+ * memory before loading the RDB file, however when MERGE is
597+ * used together with NOFLUSH, we are able to merge two datasets. */
598+ if (flush) emptyDb (-1 ,EMPTYDB_NO_FLAGS,NULL );
599+
600+ protectClient (c);
601+ int ret = rdbLoadFile (g_pserver->rdb_filename ,NULL ,flags);
602+ unprotectClient (c);
603+ if (ret != C_OK) {
604+ addReplyError (c," Error trying to load the RDB dump" );
605+ return ;
606+ }
561607 }
562608 serverLog (LL_WARNING," DB reloaded by DEBUG RELOAD" );
563609 addReply (c,shared.ok );
0 commit comments