diff options
author | antirez <antirez@gmail.com> | 2014-05-05 22:14:23 +0200 |
---|---|---|
committer | antirez <antirez@gmail.com> | 2014-05-07 16:17:11 +0200 |
commit | 3a1a0c32408ddbe2ea06e37b354620b8fb1e2cda (patch) | |
tree | 6f000d9ff49e7f476fd779d07a35a7e58b88342f /src/scripting.c | |
parent | d70281575c224c7339e78cb16107c3c1ddf9f1dc (diff) | |
download | redis-3a1a0c32408ddbe2ea06e37b354620b8fb1e2cda.tar.gz |
Scripting: luaRedisGenericCommand() fast path for buffer-only replies.
When the reply is only contained in the client static output buffer, use
a fast path avoiding the dynamic allocation of an SDS string to
concatenate the client reply objects.
Diffstat (limited to 'src/scripting.c')
-rw-r--r-- | src/scripting.c | 22 |
1 files changed, 15 insertions, 7 deletions
diff --git a/src/scripting.c b/src/scripting.c index 5b8f49097..e28662db1 100644 --- a/src/scripting.c +++ b/src/scripting.c @@ -306,13 +306,21 @@ int luaRedisGenericCommand(lua_State *lua, int raise_error) { /* Convert the result of the Redis command into a suitable Lua type. * The first thing we need is to create a single string from the client * output buffers. */ - reply = sdsnewlen(c->buf,c->bufpos); - c->bufpos = 0; - while(listLength(c->reply)) { - robj *o = listNodeValue(listFirst(c->reply)); + if (listLength(c->reply) == 0 && c->bufpos < REDIS_REPLY_CHUNK_BYTES) { + /* This is a fast path for the common case of a reply inside the + * client static buffer. Don't create an SDS string but just use + * the client buffer directly. */ + c->buf[c->bufpos] = '\0'; + reply = c->buf; + } else { + reply = sdsnewlen(c->buf,c->bufpos); + c->bufpos = 0; + while(listLength(c->reply)) { + robj *o = listNodeValue(listFirst(c->reply)); - reply = sdscatlen(reply,o->ptr,sdslen(o->ptr)); - listDelNode(c->reply,listFirst(c->reply)); + reply = sdscatlen(reply,o->ptr,sdslen(o->ptr)); + listDelNode(c->reply,listFirst(c->reply)); + } } if (raise_error && reply[0] != '-') raise_error = 0; redisProtocolToLuaType(lua,reply); @@ -322,7 +330,7 @@ int luaRedisGenericCommand(lua_State *lua, int raise_error) { (reply[0] == '*' && reply[1] != '-')) { luaSortArray(lua); } - sdsfree(reply); + if (reply != c->buf) sdsfree(reply); c->reply_bytes = 0; cleanup: |