mirror of
https://github.com/fluencelabs/redis
synced 2025-04-01 15:21:03 +00:00
multi-bulk reply support for redis-bench, and as a result LRANGE is not tested, providing some number for the tuning of multi-bulk requests performances server-side
This commit is contained in:
parent
ef3ac64a27
commit
2fd309522d
92
benchmark.c
92
benchmark.c
@ -48,6 +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 CLIENT_CONNECTING 0
|
#define CLIENT_CONNECTING 0
|
||||||
#define CLIENT_SENDQUERY 1
|
#define CLIENT_SENDQUERY 1
|
||||||
@ -83,6 +84,7 @@ typedef struct _client {
|
|||||||
int fd;
|
int fd;
|
||||||
sds obuf;
|
sds obuf;
|
||||||
sds ibuf;
|
sds ibuf;
|
||||||
|
int mbulk; /* Number of elements in an mbulk reply */
|
||||||
int readlen; /* readlen == -1 means read a single line */
|
int readlen; /* readlen == -1 means read a single line */
|
||||||
unsigned int written; /* bytes of 'obuf' already written */
|
unsigned int written; /* bytes of 'obuf' already written */
|
||||||
int replytype;
|
int replytype;
|
||||||
@ -136,6 +138,7 @@ static void resetClient(client c) {
|
|||||||
sdsfree(c->ibuf);
|
sdsfree(c->ibuf);
|
||||||
c->ibuf = sdsempty();
|
c->ibuf = sdsempty();
|
||||||
c->readlen = (c->replytype == REPLY_BULK) ? -1 : 0;
|
c->readlen = (c->replytype == REPLY_BULK) ? -1 : 0;
|
||||||
|
c->mbulk = -1;
|
||||||
c->written = 0;
|
c->written = 0;
|
||||||
c->state = CLIENT_SENDQUERY;
|
c->state = CLIENT_SENDQUERY;
|
||||||
c->start = mstime();
|
c->start = mstime();
|
||||||
@ -155,6 +158,20 @@ static void randomizeClientKey(client c) {
|
|||||||
memcpy(p,buf,strlen(buf));
|
memcpy(p,buf,strlen(buf));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void prepareClientForReply(client c, int type) {
|
||||||
|
if (type == REPLY_BULK) {
|
||||||
|
c->replytype = REPLY_BULK;
|
||||||
|
c->readlen = -1;
|
||||||
|
} else if (type == REPLY_MBULK) {
|
||||||
|
c->replytype = REPLY_MBULK;
|
||||||
|
c->readlen = -1;
|
||||||
|
c->mbulk = -1;
|
||||||
|
} else {
|
||||||
|
c->replytype = type;
|
||||||
|
c->readlen = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static void clientDone(client c) {
|
static void clientDone(client c) {
|
||||||
long long latency;
|
long long latency;
|
||||||
config.donerequests ++;
|
config.donerequests ++;
|
||||||
@ -200,21 +217,40 @@ 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:
|
||||||
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) ||
|
||||||
|
(c->replytype == REPLY_MBULK && c->readlen == -1) ||
|
||||||
|
(c->replytype == REPLY_MBULK && c->mbulk == -1)) {
|
||||||
char *p;
|
char *p;
|
||||||
|
|
||||||
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))
|
||||||
|
{
|
||||||
*p = '\0';
|
*p = '\0';
|
||||||
*(p-1) = '\0';
|
*(p-1) = '\0';
|
||||||
c->readlen = atoi(c->ibuf+1)+2;
|
c->readlen = atoi(c->ibuf+1)+2;
|
||||||
|
/* Handle null bulk reply "$-1" */
|
||||||
if (c->readlen-2 == -1) {
|
if (c->readlen-2 == -1) {
|
||||||
clientDone(c);
|
clientDone(c);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
/* 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);
|
||||||
|
} else if (c->replytype == REPLY_MBULK && c->mbulk == -1) {
|
||||||
|
*p = '\0';
|
||||||
|
*(p-1) = '\0';
|
||||||
|
c->mbulk = atoi(c->ibuf+1);
|
||||||
|
/* Handle null bulk reply "*-1" */
|
||||||
|
if (c->mbulk == -1) {
|
||||||
|
clientDone(c);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
/* Leave all the rest in the input buffer */
|
||||||
|
c->ibuf = sdsrange(c->ibuf,(p-c->ibuf)+1,-1);
|
||||||
|
goto processdata;
|
||||||
} else {
|
} else {
|
||||||
c->ibuf = sdstrim(c->ibuf,"\r\n");
|
c->ibuf = sdstrim(c->ibuf,"\r\n");
|
||||||
clientDone(c);
|
clientDone(c);
|
||||||
@ -222,9 +258,22 @@ static void readHandler(aeEventLoop *el, int fd, void *privdata, int mask)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
/* bulk read */
|
/* bulk read, did we read everything? */
|
||||||
if ((unsigned)c->readlen == sdslen(c->ibuf))
|
if ((c->replytype == REPLY_BULK || c->replytype == REPLY_MBULK) &&
|
||||||
clientDone(c);
|
(unsigned)c->readlen <= sdslen(c->ibuf))
|
||||||
|
{
|
||||||
|
if (c->replytype == REPLY_BULK) {
|
||||||
|
clientDone(c);
|
||||||
|
} else if (c->replytype == REPLY_MBULK) {
|
||||||
|
if (--c->mbulk == 0) {
|
||||||
|
clientDone(c);
|
||||||
|
} else {
|
||||||
|
c->ibuf = sdsrange(c->ibuf,c->readlen,-1);
|
||||||
|
c->readlen = -1;
|
||||||
|
goto processdata;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void writeHandler(aeEventLoop *el, int fd, void *privdata, int mask)
|
static void writeHandler(aeEventLoop *el, int fd, void *privdata, int mask)
|
||||||
@ -269,6 +318,7 @@ static client createClient(void) {
|
|||||||
anetTcpNoDelay(NULL,c->fd);
|
anetTcpNoDelay(NULL,c->fd);
|
||||||
c->obuf = sdsempty();
|
c->obuf = sdsempty();
|
||||||
c->ibuf = sdsempty();
|
c->ibuf = sdsempty();
|
||||||
|
c->mbulk = -1;
|
||||||
c->readlen = 0;
|
c->readlen = 0;
|
||||||
c->written = 0;
|
c->written = 0;
|
||||||
c->state = CLIENT_CONNECTING;
|
c->state = CLIENT_CONNECTING;
|
||||||
@ -436,7 +486,7 @@ int main(int argc, char **argv) {
|
|||||||
data[config.datasize+1] = '\n';
|
data[config.datasize+1] = '\n';
|
||||||
c->obuf = sdscatlen(c->obuf,data,config.datasize+2);
|
c->obuf = sdscatlen(c->obuf,data,config.datasize+2);
|
||||||
}
|
}
|
||||||
c->replytype = REPLY_RETCODE;
|
prepareClientForReply(c,REPLY_RETCODE);
|
||||||
createMissingClients(c);
|
createMissingClients(c);
|
||||||
aeMain(config.el);
|
aeMain(config.el);
|
||||||
endBenchmark("SET");
|
endBenchmark("SET");
|
||||||
@ -445,8 +495,7 @@ int main(int argc, char **argv) {
|
|||||||
c = createClient();
|
c = createClient();
|
||||||
if (!c) exit(1);
|
if (!c) exit(1);
|
||||||
c->obuf = sdscat(c->obuf,"GET foo_rand000000000000\r\n");
|
c->obuf = sdscat(c->obuf,"GET foo_rand000000000000\r\n");
|
||||||
c->replytype = REPLY_BULK;
|
prepareClientForReply(c,REPLY_BULK);
|
||||||
c->readlen = -1;
|
|
||||||
createMissingClients(c);
|
createMissingClients(c);
|
||||||
aeMain(config.el);
|
aeMain(config.el);
|
||||||
endBenchmark("GET");
|
endBenchmark("GET");
|
||||||
@ -455,7 +504,7 @@ int main(int argc, char **argv) {
|
|||||||
c = createClient();
|
c = createClient();
|
||||||
if (!c) exit(1);
|
if (!c) exit(1);
|
||||||
c->obuf = sdscat(c->obuf,"INCR counter_rand000000000000\r\n");
|
c->obuf = sdscat(c->obuf,"INCR counter_rand000000000000\r\n");
|
||||||
c->replytype = REPLY_INT;
|
prepareClientForReply(c,REPLY_INT);
|
||||||
createMissingClients(c);
|
createMissingClients(c);
|
||||||
aeMain(config.el);
|
aeMain(config.el);
|
||||||
endBenchmark("INCR");
|
endBenchmark("INCR");
|
||||||
@ -464,7 +513,7 @@ int main(int argc, char **argv) {
|
|||||||
c = createClient();
|
c = createClient();
|
||||||
if (!c) exit(1);
|
if (!c) exit(1);
|
||||||
c->obuf = sdscat(c->obuf,"LPUSH mylist 3\r\nbar\r\n");
|
c->obuf = sdscat(c->obuf,"LPUSH mylist 3\r\nbar\r\n");
|
||||||
c->replytype = REPLY_INT;
|
prepareClientForReply(c,REPLY_INT);
|
||||||
createMissingClients(c);
|
createMissingClients(c);
|
||||||
aeMain(config.el);
|
aeMain(config.el);
|
||||||
endBenchmark("LPUSH");
|
endBenchmark("LPUSH");
|
||||||
@ -473,8 +522,7 @@ int main(int argc, char **argv) {
|
|||||||
c = createClient();
|
c = createClient();
|
||||||
if (!c) exit(1);
|
if (!c) exit(1);
|
||||||
c->obuf = sdscat(c->obuf,"LPOP mylist\r\n");
|
c->obuf = sdscat(c->obuf,"LPOP mylist\r\n");
|
||||||
c->replytype = REPLY_BULK;
|
prepareClientForReply(c,REPLY_BULK);
|
||||||
c->readlen = -1;
|
|
||||||
createMissingClients(c);
|
createMissingClients(c);
|
||||||
aeMain(config.el);
|
aeMain(config.el);
|
||||||
endBenchmark("LPOP");
|
endBenchmark("LPOP");
|
||||||
@ -483,11 +531,29 @@ int main(int argc, char **argv) {
|
|||||||
c = createClient();
|
c = createClient();
|
||||||
if (!c) exit(1);
|
if (!c) exit(1);
|
||||||
c->obuf = sdscat(c->obuf,"PING\r\n");
|
c->obuf = sdscat(c->obuf,"PING\r\n");
|
||||||
c->replytype = REPLY_RETCODE;
|
prepareClientForReply(c,REPLY_RETCODE);
|
||||||
createMissingClients(c);
|
createMissingClients(c);
|
||||||
aeMain(config.el);
|
aeMain(config.el);
|
||||||
endBenchmark("PING");
|
endBenchmark("PING");
|
||||||
|
|
||||||
|
prepareForBenchmark();
|
||||||
|
c = createClient();
|
||||||
|
if (!c) exit(1);
|
||||||
|
c->obuf = sdscat(c->obuf,"LPUSH mylist 3\r\nbar\r\n");
|
||||||
|
prepareClientForReply(c,REPLY_RETCODE);
|
||||||
|
createMissingClients(c);
|
||||||
|
aeMain(config.el);
|
||||||
|
endBenchmark("LPUSH (again, in order to bench LRANGE)");
|
||||||
|
|
||||||
|
prepareForBenchmark();
|
||||||
|
c = createClient();
|
||||||
|
if (!c) exit(1);
|
||||||
|
c->obuf = sdscat(c->obuf,"LRANGE mylist 0 99\r\n");
|
||||||
|
prepareClientForReply(c,REPLY_MBULK);
|
||||||
|
createMissingClients(c);
|
||||||
|
aeMain(config.el);
|
||||||
|
endBenchmark("LRANGE (first 100 elements)");
|
||||||
|
|
||||||
printf("\n");
|
printf("\n");
|
||||||
} while(config.loop);
|
} while(config.loop);
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user