mirror of
https://github.com/fluencelabs/redis
synced 2025-03-30 22:31:03 +00:00
Avoids reallocating and double String on truncate
This commit is contained in:
parent
d41bd233d5
commit
3816f16a53
15
src/module.c
15
src/module.c
@ -1093,15 +1093,13 @@ int RM_StringTruncate(RedisModuleKey *key, size_t newlen) {
|
|||||||
* doing anything. */
|
* doing anything. */
|
||||||
if (key->value == NULL && newlen == 0) return REDISMODULE_OK;
|
if (key->value == NULL && newlen == 0) return REDISMODULE_OK;
|
||||||
|
|
||||||
/* Empty key: fill it with a zero-length key so that we can handle the
|
|
||||||
* resize with a common code path. */
|
|
||||||
if (key->value == NULL) {
|
if (key->value == NULL) {
|
||||||
robj *emptyobj = createStringObject("",0);
|
/* Empty key: create it with the new size. */
|
||||||
setKey(key->db,key->key,emptyobj);
|
robj *o = createObject(OBJ_STRING,sdsnewlen(NULL, newlen));
|
||||||
key->value = emptyobj;
|
setKey(key->db,key->key,o);
|
||||||
decrRefCount(emptyobj);
|
key->value = o;
|
||||||
}
|
decrRefCount(o);
|
||||||
|
} else {
|
||||||
/* Unshare and resize. */
|
/* Unshare and resize. */
|
||||||
key->value = dbUnshareStringValue(key->db, key->key, key->value);
|
key->value = dbUnshareStringValue(key->db, key->key, key->value);
|
||||||
size_t curlen = sdslen(key->value->ptr);
|
size_t curlen = sdslen(key->value->ptr);
|
||||||
@ -1113,6 +1111,7 @@ int RM_StringTruncate(RedisModuleKey *key, size_t newlen) {
|
|||||||
if (sdslen(key->value->ptr) < sdsavail(key->value->ptr))
|
if (sdslen(key->value->ptr) < sdsavail(key->value->ptr))
|
||||||
key->value->ptr = sdsRemoveFreeSpace(key->value->ptr);
|
key->value->ptr = sdsRemoveFreeSpace(key->value->ptr);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
return REDISMODULE_OK;
|
return REDISMODULE_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user