提交 ff9d66c4 编写于 作者: A antirez

Don't over-allocate the sds string for large bulk requests.

The call to sdsMakeRoomFor() did not accounted for the amount of data
already present in the query buffer, resulting into over-allocation.
上级 e2180334
...@@ -989,13 +989,13 @@ int processMultibulkBuffer(redisClient *c) { ...@@ -989,13 +989,13 @@ int processMultibulkBuffer(redisClient *c) {
if (ll >= REDIS_MBULK_BIG_ARG) { if (ll >= REDIS_MBULK_BIG_ARG) {
/* If we are going to read a large object from network /* If we are going to read a large object from network
* try to make it likely that it will start at c->querybuf * try to make it likely that it will start at c->querybuf
* boundary so that we can optimized object creation * boundary so that we can optimize object creation
* avoiding a large copy of data. */ * avoiding a large copy of data. */
sdsrange(c->querybuf,pos,-1); sdsrange(c->querybuf,pos,-1);
pos = 0; pos = 0;
/* Hint the sds library about the amount of bytes this string is /* Hint the sds library about the amount of bytes this string is
* going to contain. */ * going to contain. */
c->querybuf = sdsMakeRoomFor(c->querybuf,ll+2); c->querybuf = sdsMakeRoomFor(c->querybuf,ll+2-sdslen(c->querybuf));
} }
c->bulklen = ll; c->bulklen = ll;
} }
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册