@@ -158,6 +158,17 @@ void dbAdd(redisDb *db, robj *key, robj *val) {
158158 sds copy = sdsdup (key -> ptr );
159159 int retval = dictAdd (db -> dict , copy , val );
160160
161+ do {
162+ uint32_t crc ;
163+ int hastag ;
164+ int slot = slots_num (key -> ptr , & crc , & hastag );
165+ dictAdd (db -> hash_slots [slot ], copy , (void * )(long )crc );
166+ if (hastag ) {
167+ incrRefCount (key );
168+ zslInsert (db -> tagged_keys , (double )crc , key );
169+ }
170+ } while (0 );
171+
161172 serverAssertWithInfo (NULL ,key ,retval == DICT_OK );
162173 if (val -> type == OBJ_LIST ) signalListAsReady (db , key );
163174 if (server .cluster_enabled ) slotToKeyAdd (key );
@@ -227,6 +238,18 @@ int dbDelete(redisDb *db, robj *key) {
227238 /* Deleting an entry from the expires dict will not free the sds of
228239 * the key, because it is shared with the main dictionary. */
229240 if (dictSize (db -> expires ) > 0 ) dictDelete (db -> expires ,key -> ptr );
241+
242+ do {
243+ uint32_t crc ;
244+ int hastag ;
245+ int slot = slots_num (key -> ptr , & crc , & hastag );
246+ if (dictDelete (db -> hash_slots [slot ], key -> ptr ) == DICT_OK ) {
247+ if (hastag ) {
248+ zslDelete (db -> tagged_keys , (double )crc , key );
249+ }
250+ }
251+ } while (0 );
252+
230253 if (dictDelete (db -> dict ,key -> ptr ) == DICT_OK ) {
231254 if (server .cluster_enabled ) slotToKeyDel (key );
232255 return 1 ;
@@ -274,11 +297,18 @@ robj *dbUnshareStringValue(redisDb *db, robj *key, robj *o) {
274297}
275298
276299long long emptyDb (void (callback )(void * )) {
277- int j ;
300+ int i , j ;
278301 long long removed = 0 ;
279302
280303 for (j = 0 ; j < server .dbnum ; j ++ ) {
281304 removed += dictSize (server .db [j ].dict );
305+ for (i = 0 ; i < HASH_SLOTS_SIZE ; i ++ ) {
306+ dictEmpty (server .db [j ].hash_slots [i ], NULL );
307+ }
308+ if (server .db [j ].tagged_keys -> length != 0 ) {
309+ zslFree (server .db [j ].tagged_keys );
310+ server .db [j ].tagged_keys = zslCreate ();
311+ }
282312 dictEmpty (server .db [j ].dict ,callback );
283313 dictEmpty (server .db [j ].expires ,callback );
284314 }
@@ -315,8 +345,16 @@ void signalFlushedDb(int dbid) {
315345 *----------------------------------------------------------------------------*/
316346
317347void flushdbCommand (client * c ) {
348+ int i ;
318349 server .dirty += dictSize (c -> db -> dict );
319350 signalFlushedDb (c -> db -> id );
351+ for (i = 0 ; i < HASH_SLOTS_SIZE ; i ++ ) {
352+ dictEmpty (c -> db -> hash_slots [i ], NULL );
353+ }
354+ if (c -> db -> tagged_keys -> length != 0 ) {
355+ zslFree (c -> db -> tagged_keys );
356+ c -> db -> tagged_keys = zslCreate ();
357+ }
320358 dictEmpty (c -> db -> dict ,NULL );
321359 dictEmpty (c -> db -> expires ,NULL );
322360 if (server .cluster_enabled ) slotToKeyFlush ();
@@ -724,7 +762,15 @@ void shutdownCommand(client *c) {
724762 * Also when in Sentinel mode clear the SAVE flag and force NOSAVE. */
725763 if (server .loading || server .sentinel_mode )
726764 flags = (flags & ~SHUTDOWN_SAVE ) | SHUTDOWN_NOSAVE ;
727- if (prepareForShutdown (flags ) == C_OK ) exit (0 );
765+ if (prepareForShutdown (flags ) == C_OK ) {
766+ for (int j = 0 ; j < server .dbnum ; j ++ ) {
767+ for (int i = 0 ; i < HASH_SLOTS_SIZE ; i ++ ) {
768+ dictRelease (server .db [j ].hash_slots [i ]);
769+ }
770+ zslFree (server .db [j ].tagged_keys );
771+ }
772+ exit (0 );
773+ }
728774 addReplyError (c ,"Errors trying to SHUTDOWN. Check logs." );
729775}
730776
0 commit comments