提交 6c4e61b3 编写于 作者: A antirez

redis-benchmark multi bulk reply support hopefully fixed

上级 2895e862
...@@ -48,7 +48,7 @@ ...@@ -48,7 +48,7 @@
#define REPLY_INT 0 #define REPLY_INT 0
#define REPLY_RETCODE 1 #define REPLY_RETCODE 1
#define REPLY_BULK 2 #define REPLY_BULK 2
#define REPLY_MBULK 2 #define REPLY_MBULK 3
#define CLIENT_CONNECTING 0 #define CLIENT_CONNECTING 0
#define CLIENT_SENDQUERY 1 #define CLIENT_SENDQUERY 1
...@@ -218,6 +218,8 @@ static void readHandler(aeEventLoop *el, int fd, void *privdata, int mask) ...@@ -218,6 +218,8 @@ static void readHandler(aeEventLoop *el, int fd, void *privdata, int mask)
c->ibuf = sdscatlen(c->ibuf,buf,nread); c->ibuf = sdscatlen(c->ibuf,buf,nread);
processdata: 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 || if (c->replytype == REPLY_INT ||
c->replytype == REPLY_RETCODE || c->replytype == REPLY_RETCODE ||
(c->replytype == REPLY_BULK && c->readlen == -1) || (c->replytype == REPLY_BULK && c->readlen == -1) ||
...@@ -225,10 +227,14 @@ processdata: ...@@ -225,10 +227,14 @@ processdata:
(c->replytype == REPLY_MBULK && c->mbulk == -1)) { (c->replytype == REPLY_MBULK && c->mbulk == -1)) {
char *p; 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 ((p = strchr(c->ibuf,'\n')) != NULL) {
if (c->replytype == REPLY_BULK || if (c->replytype == REPLY_BULK ||
(c->replytype == REPLY_MBULK && c->mbulk != -1)) (c->replytype == REPLY_MBULK && c->mbulk != -1))
{ {
/* Read the count of a bulk reply (being it a single bulk or
* a multi bulk reply). "$<count>" for the protocol spec. */
*p = '\0'; *p = '\0';
*(p-1) = '\0'; *(p-1) = '\0';
c->readlen = atoi(c->ibuf+1)+2; c->readlen = atoi(c->ibuf+1)+2;
...@@ -239,7 +245,11 @@ processdata: ...@@ -239,7 +245,11 @@ processdata:
} }
/* Leave all the rest in the input buffer */ /* Leave all the rest in the input buffer */
c->ibuf = sdsrange(c->ibuf,(p-c->ibuf)+1,-1); 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) { } 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. "*<count>" protocol. */
*p = '\0'; *p = '\0';
*(p-1) = '\0'; *(p-1) = '\0';
c->mbulk = atoi(c->ibuf+1); c->mbulk = atoi(c->ibuf+1);
...@@ -259,8 +269,9 @@ processdata: ...@@ -259,8 +269,9 @@ processdata:
} }
} }
/* bulk read, did we read everything? */ /* bulk read, did we read everything? */
if ((c->replytype == REPLY_BULK || c->replytype == REPLY_MBULK) && if (((c->replytype == REPLY_MBULK && c->mbulk != -1) ||
(unsigned)c->readlen <= sdslen(c->ibuf)) (c->replytype == REPLY_BULK)) && c->readlen != -1 &&
(unsigned)c->readlen <= sdslen(c->ibuf))
{ {
if (c->replytype == REPLY_BULK) { if (c->replytype == REPLY_BULK) {
clientDone(c); clientDone(c);
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册