From: antirez Date: Wed, 18 Nov 2009 17:47:05 +0000 (+0100) Subject: redis-benchmark multi bulk reply support hopefully fixed X-Git-Url: https://git.saurik.com/redis.git/commitdiff_plain/6c4e61b389bc9a9ce909e3ee6addb5ef6fddcf39 redis-benchmark multi bulk reply support hopefully fixed --- diff --git a/benchmark.c b/benchmark.c index 29fc7f32..ca2a0f0b 100644 --- a/benchmark.c +++ b/benchmark.c @@ -48,7 +48,7 @@ #define REPLY_INT 0 #define REPLY_RETCODE 1 #define REPLY_BULK 2 -#define REPLY_MBULK 2 +#define REPLY_MBULK 3 #define CLIENT_CONNECTING 0 #define CLIENT_SENDQUERY 1 @@ -218,6 +218,8 @@ static void readHandler(aeEventLoop *el, int fd, void *privdata, int mask) c->ibuf = sdscatlen(c->ibuf,buf,nread); processdata: + /* Are we waiting for the first line of the command of for sdf + * count in bulk or multi bulk operations? */ if (c->replytype == REPLY_INT || c->replytype == REPLY_RETCODE || (c->replytype == REPLY_BULK && c->readlen == -1) || @@ -225,10 +227,14 @@ processdata: (c->replytype == REPLY_MBULK && c->mbulk == -1)) { char *p; + /* Check if the first line is complete. This is only true if + * there is a newline inside the buffer. */ if ((p = strchr(c->ibuf,'\n')) != NULL) { if (c->replytype == REPLY_BULK || (c->replytype == REPLY_MBULK && c->mbulk != -1)) { + /* Read the count of a bulk reply (being it a single bulk or + * a multi bulk reply). "$" for the protocol spec. */ *p = '\0'; *(p-1) = '\0'; c->readlen = atoi(c->ibuf+1)+2; @@ -239,7 +245,11 @@ processdata: } /* Leave all the rest in the input buffer */ c->ibuf = sdsrange(c->ibuf,(p-c->ibuf)+1,-1); + /* fall through to reach the point where the code will try + * to check if the bulk reply is complete. */ } else if (c->replytype == REPLY_MBULK && c->mbulk == -1) { + /* Read the count of a multi bulk reply. That is, how many + * bulk replies we have to read next. "*" protocol. */ *p = '\0'; *(p-1) = '\0'; c->mbulk = atoi(c->ibuf+1); @@ -259,8 +269,9 @@ processdata: } } /* bulk read, did we read everything? */ - if ((c->replytype == REPLY_BULK || c->replytype == REPLY_MBULK) && - (unsigned)c->readlen <= sdslen(c->ibuf)) + if (((c->replytype == REPLY_MBULK && c->mbulk != -1) || + (c->replytype == REPLY_BULK)) && c->readlen != -1 && + (unsigned)c->readlen <= sdslen(c->ibuf)) { if (c->replytype == REPLY_BULK) { clientDone(c);