summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorViktor Söderqvist <viktor.soderqvist@est.tech>2021-02-05 18:54:01 +0100
committerOran Agra <oran@redislabs.com>2021-02-22 23:22:53 +0200
commite461f599289e70cde088d621fcd8fde6d6761ee6 (patch)
tree903450554128a2fcf3696b85e0895d5b555f1adb
parent321f98726c88c3c5447fb3aa886b29206dbb6824 (diff)
downloadredis-e461f599289e70cde088d621fcd8fde6d6761ee6.tar.gz
RM_ZsetRem: Delete key if empty (#8453)
Without this fix, RM_ZsetRem can leave empty sorted sets which are not allowed to exist. Removing from a sorted set while iterating seems to work (while inserting causes failed assetions). RM_ZsetRangeEndReached is modified to return 1 if the key doesn't exist, to terminate iteration when the last element has been removed. (cherry picked from commit aea6e71ef82701e07177744e600e1ef20d60b7d0)
-rw-r--r--src/module.c2
1 files changed, 2 insertions, 0 deletions
diff --git a/src/module.c b/src/module.c
index 5515cfcad..521807141 100644
--- a/src/module.c
+++ b/src/module.c
@@ -2035,6 +2035,7 @@ int RM_ZsetRem(RedisModuleKey *key, RedisModuleString *ele, int *deleted) {
if (key->value && key->value->type != OBJ_ZSET) return REDISMODULE_ERR;
if (key->value != NULL && zsetDel(key->value,ele->ptr)) {
if (deleted) *deleted = 1;
+ moduleDelKeyIfEmpty(key);
} else {
if (deleted) *deleted = 0;
}
@@ -2079,6 +2080,7 @@ void RM_ZsetRangeStop(RedisModuleKey *key) {
/* Return the "End of range" flag value to signal the end of the iteration. */
int RM_ZsetRangeEndReached(RedisModuleKey *key) {
+ if (!key->value || key->value->type != OBJ_ZSET) return 1;
return key->zer;
}