Skip to content
GitLab
Menu
Projects
Groups
Snippets
Loading...
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
Menu
Open sidebar
ruanhaishen
redis
Commits
3816f16a
Commit
3816f16a
authored
Apr 25, 2016
by
Itamar Haber
Committed by
antirez
May 10, 2016
Browse files
Avoids reallocating and double String on truncate
parent
d41bd233
Changes
1
Hide whitespace changes
Inline
Side-by-side
src/module.c
View file @
3816f16a
...
@@ -1093,25 +1093,24 @@ int RM_StringTruncate(RedisModuleKey *key, size_t newlen) {
...
@@ -1093,25 +1093,24 @@ 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
);
if
(
newlen
>
curlen
)
{
if
(
newlen
>
curlen
)
{
key
->
value
->
ptr
=
sdsgrowzero
(
key
->
value
->
ptr
,
newlen
);
key
->
value
->
ptr
=
sdsgrowzero
(
key
->
value
->
ptr
,
newlen
);
}
else
if
(
newlen
<
curlen
)
{
}
else
if
(
newlen
<
curlen
)
{
sdsrange
(
key
->
value
->
ptr
,
0
,
newlen
-
1
);
sdsrange
(
key
->
value
->
ptr
,
0
,
newlen
-
1
);
/* If the string is too wasteful, reallocate it. */
/* If the string is too wasteful, reallocate it. */
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
;
}
}
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment