diff --git a/src/t_hash.c b/src/t_hash.c index e1503b7e6b..a7a00bfb67 100644 --- a/src/t_hash.c +++ b/src/t_hash.c @@ -1127,6 +1127,7 @@ void hdelCommand(client *c) { if ((o = lookupKeyWriteOrReply(c, c->argv[1], shared.czero)) == NULL || checkType(c, o, OBJ_HASH)) return; bool hash_volatile_items = hashTypeHasVolatileFields(o); + if (o->encoding == OBJ_ENCODING_HASHTABLE) hashtablePauseAutoShrink(objectGetVal(o)); for (j = 2; j < c->argc; j++) { if (hashTypeDelete(o, objectGetVal(c->argv[j]))) { deleted++; @@ -1138,6 +1139,7 @@ void hdelCommand(client *c) { } } } + if (!keyremoved && o->encoding == OBJ_ENCODING_HASHTABLE) hashtableResumeAutoShrink(objectGetVal(o)); if (deleted) { if (!keyremoved && hash_volatile_items != hashTypeHasVolatileFields(o)) { dbUpdateObjectWithVolatileItemsTracking(c->db, o); diff --git a/src/t_set.c b/src/t_set.c index 94e61f3d1e..32f86e710a 100644 --- a/src/t_set.c +++ b/src/t_set.c @@ -625,6 +625,7 @@ void sremCommand(client *c) { if ((set = lookupKeyWriteOrReply(c, c->argv[1], shared.czero)) == NULL || checkType(c, set, OBJ_SET)) return; + if (set->encoding == OBJ_ENCODING_HASHTABLE) hashtablePauseAutoShrink(objectGetVal(set)); for (j = 2; j < c->argc; j++) { if (setTypeRemove(set, objectGetVal(c->argv[j]))) { deleted++; @@ -635,6 +636,8 @@ void sremCommand(client *c) { } } } + if (!keyremoved && set->encoding == OBJ_ENCODING_HASHTABLE) hashtableResumeAutoShrink(objectGetVal(set)); + if (deleted) { signalModifiedKey(c, c->db, c->argv[1]); notifyKeyspaceEvent(NOTIFY_SET, "srem", c->argv[1], c->db->id); diff --git a/src/t_zset.c b/src/t_zset.c index 2c7565d64c..c64f262c87 100644 --- a/src/t_zset.c +++ b/src/t_zset.c @@ -1933,6 +1933,7 @@ void zremCommand(client *c) { if ((zobj = lookupKeyWriteOrReply(c, key, shared.czero)) == NULL || checkType(c, zobj, OBJ_ZSET)) return; + if (zobj->encoding == OBJ_ENCODING_SKIPLIST) hashtablePauseAutoShrink(((zset *)objectGetVal(zobj))->ht); for (j = 2; j < c->argc; j++) { if (zsetDel(zobj, objectGetVal(c->argv[j]))) deleted++; if (zsetLength(zobj) == 0) { @@ -1941,6 +1942,7 @@ void zremCommand(client *c) { break; } } + if (!keyremoved && zobj->encoding == OBJ_ENCODING_SKIPLIST) hashtableResumeAutoShrink(((zset *)objectGetVal(zobj))->ht); if (deleted) { notifyKeyspaceEvent(NOTIFY_ZSET, "zrem", key, c->db->id);