From b8d743e1813abbf3d55e92e9945dc47da3ef7836 Mon Sep 17 00:00:00 2001 From: antirez Date: Wed, 2 Nov 2011 16:52:45 +0100 Subject: [PATCH] sdsIncrLen() / sdsMakeRoomFor() used to avoid copying to intermediate buffer while reading the client query. --- src/networking.c | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/networking.c b/src/networking.c index 862e69f4..f6139f57 100644 --- a/src/networking.c +++ b/src/networking.c @@ -833,12 +833,14 @@ void processInputBuffer(redisClient *c) { void readQueryFromClient(aeEventLoop *el, int fd, void *privdata, int mask) { redisClient *c = (redisClient*) privdata; - char buf[REDIS_IOBUF_LEN]; int nread; + size_t qblen; REDIS_NOTUSED(el); REDIS_NOTUSED(mask); - nread = read(fd, buf, REDIS_IOBUF_LEN); + qblen = sdslen(c->querybuf); + c->querybuf = sdsMakeRoomFor(c->querybuf, REDIS_IOBUF_LEN); + nread = read(fd, c->querybuf+qblen, REDIS_IOBUF_LEN); if (nread == -1) { if (errno == EAGAIN) { nread = 0; @@ -853,7 +855,7 @@ void readQueryFromClient(aeEventLoop *el, int fd, void *privdata, int mask) { return; } if (nread) { - c->querybuf = sdscatlen(c->querybuf,buf,nread); + sdsIncrLen(c->querybuf,nread); c->lastinteraction = time(NULL); } else { return; -- GitLab