@@ -571,7 +571,7 @@ robj *dbUnshareStringValue(serverDb *db, robj *key, robj *o) {
571571 * The dbnum can be -1 if all the DBs should be emptied, or the specified
572572 * DB index if we want to empty only a single database.
573573 * The function returns the number of keys removed from the database(s). */
574- long long emptyDbStructure (serverDb * dbarray , int dbnum , int async , void (callback )(hashtable * )) {
574+ long long emptyDbStructure (serverDb * * dbarray , int dbnum , int async , void (callback )(hashtable * )) {
575575 long long removed = 0 ;
576576 int startdb , enddb ;
577577
@@ -583,16 +583,17 @@ long long emptyDbStructure(serverDb *dbarray, int dbnum, int async, void(callbac
583583 }
584584
585585 for (int j = startdb ; j <= enddb ; j ++ ) {
586- removed += kvstoreSize (dbarray [j ].keys );
586+ if (dbarray [j ] == NULL ) continue ;
587+ removed += kvstoreSize (dbarray [j ]-> keys );
587588 if (async ) {
588- emptyDbAsync (& dbarray [j ]);
589+ emptyDbAsync (dbarray [j ]);
589590 } else {
590- kvstoreEmpty (dbarray [j ]. keys , callback );
591- kvstoreEmpty (dbarray [j ]. expires , callback );
591+ kvstoreEmpty (dbarray [j ]-> keys , callback );
592+ kvstoreEmpty (dbarray [j ]-> expires , callback );
592593 }
593594 /* Because all keys of database are removed, reset average ttl. */
594- dbarray [j ]. avg_ttl = 0 ;
595- dbarray [j ]. expires_cursor = 0 ;
595+ dbarray [j ]-> avg_ttl = 0 ;
596+ dbarray [j ]-> expires_cursor = 0 ;
596597 }
597598
598599 return removed ;
@@ -668,29 +669,36 @@ serverDb *initTempDb(void) {
668669 return tempDb ;
669670}
670671
672+ void freeServerdb (serverDb * db ) {
673+ if (db == NULL ) return ;
674+ kvstoreRelease (db -> keys );
675+ kvstoreRelease (db -> expires );
676+ zfree (db );
677+ }
678+
671679/* Discard tempDb, it's always async. */
672- void discardTempDb (serverDb * tempDb ) {
680+ void discardTempDb (serverDb * * tempDb ) {
673681 /* Release temp DBs. */
674682 emptyDbStructure (tempDb , -1 , 1 , NULL );
675683 for (int i = 0 ; i < server .dbnum ; i ++ ) {
676- kvstoreRelease (tempDb [i ].keys );
677- kvstoreRelease (tempDb [i ].expires );
684+ freeServerdb (tempDb [i ]);
678685 }
679-
680686 zfree (tempDb );
681687}
682688
683689int selectDb (client * c , int id ) {
684690 if (id < 0 || id >= server .dbnum ) return C_ERR ;
685- c -> db = & server .db [id ];
691+ initDatabase (id );
692+ c -> db = server .db [id ];
686693 return C_OK ;
687694}
688695
689696long long dbTotalServerKeyCount (void ) {
690697 long long total = 0 ;
691698 int j ;
692699 for (j = 0 ; j < server .dbnum ; j ++ ) {
693- total += kvstoreSize (server .db [j ].keys );
700+ if (server .db [j ] == NULL ) continue ;
701+ total += kvstoreSize (server .db [j ]-> keys );
694702 }
695703 return total ;
696704}
@@ -721,8 +729,9 @@ void signalFlushedDb(int dbid, int async) {
721729 }
722730
723731 for (int j = startdb ; j <= enddb ; j ++ ) {
724- scanDatabaseForDeletedKeys (& server .db [j ], NULL );
725- touchAllWatchedKeysInDb (& server .db [j ], NULL );
732+ if (server .db [j ] == NULL ) continue ;
733+ scanDatabaseForDeletedKeys (server .db [j ], NULL );
734+ touchAllWatchedKeysInDb (server .db [j ], NULL );
726735 }
727736
728737 trackingInvalidateKeysOnFlush (async );
@@ -1641,8 +1650,10 @@ void scanDatabaseForDeletedKeys(serverDb *emptied, serverDb *replaced_with) {
16411650int dbSwapDatabases (int id1 , int id2 ) {
16421651 if (id1 < 0 || id1 >= server .dbnum || id2 < 0 || id2 >= server .dbnum ) return C_ERR ;
16431652 if (id1 == id2 ) return C_OK ;
1644- serverDb aux = server .db [id1 ];
1645- serverDb * db1 = & server .db [id1 ], * db2 = & server .db [id2 ];
1653+ initDatabase (id1 );
1654+ initDatabase (id2 );
1655+ serverDb aux = * server .db [id1 ];
1656+ serverDb * db1 = server .db [id1 ], * db2 = server .db [id2 ];
16461657
16471658 /* Swapdb should make transaction fail if there is any
16481659 * client watching keys */
@@ -1683,10 +1694,13 @@ int dbSwapDatabases(int id1, int id2) {
16831694/* Logically, this discards (flushes) the old main database, and apply the newly loaded
16841695 * database (temp) as the main (active) database, the actual freeing of old database
16851696 * (which will now be placed in the temp one) is done later. */
1686- void swapMainDbWithTempDb (serverDb * tempDb ) {
1697+ void swapMainDbWithTempDb (serverDb * * tempDb ) {
16871698 for (int i = 0 ; i < server .dbnum ; i ++ ) {
1688- serverDb aux = server .db [i ];
1689- serverDb * activedb = & server .db [i ], * newdb = & tempDb [i ];
1699+ if (tempDb [i ] == NULL && server .db [i ] == NULL ) continue ;
1700+ if (tempDb [i ] == NULL ) tempDb [i ] = createDatabase (i );
1701+ if (server .db [i ] == NULL ) tempDb [i ] = createDatabase (i );
1702+ serverDb aux = * server .db [i ];
1703+ serverDb * activedb = server .db [i ], * newdb = tempDb [i ];
16901704
16911705 /* Swapping databases should make transaction fail if there is any
16921706 * client watching keys. */
0 commit comments