more experiments with long replies, glue output buffer, and writev.

This commit is contained in:
antirez 2009-11-18 20:32:03 +01:00
parent cc30e368a3
commit c28b42acd9
3 changed files with 25 additions and 20 deletions

View File

@ -486,6 +486,7 @@ int main(int argc, char **argv) {
} }
do { do {
#if 0
prepareForBenchmark(); prepareForBenchmark();
c = createClient(); c = createClient();
if (!c) exit(1); if (!c) exit(1);
@ -547,6 +548,7 @@ int main(int argc, char **argv) {
aeMain(config.el); aeMain(config.el);
endBenchmark("PING"); endBenchmark("PING");
#endif
prepareForBenchmark(); prepareForBenchmark();
c = createClient(); c = createClient();
if (!c) exit(1); if (!c) exit(1);
@ -556,6 +558,7 @@ int main(int argc, char **argv) {
aeMain(config.el); aeMain(config.el);
endBenchmark("LPUSH (again, in order to bench LRANGE)"); endBenchmark("LPUSH (again, in order to bench LRANGE)");
#if 0
prepareForBenchmark(); prepareForBenchmark();
c = createClient(); c = createClient();
if (!c) exit(1); if (!c) exit(1);
@ -582,6 +585,7 @@ int main(int argc, char **argv) {
createMissingClients(c); createMissingClients(c);
aeMain(config.el); aeMain(config.el);
endBenchmark("LRANGE (first 450 elements)"); endBenchmark("LRANGE (first 450 elements)");
#endif
prepareForBenchmark(); prepareForBenchmark();
c = createClient(); c = createClient();

35
redis.c
View File

@ -1351,33 +1351,29 @@ static void freeClient(redisClient *c) {
#define GLUEREPLY_UP_TO (1024) #define GLUEREPLY_UP_TO (1024)
static void glueReplyBuffersIfNeeded(redisClient *c) { static void glueReplyBuffersIfNeeded(redisClient *c) {
int totlen = 0; int copylen = 0;
char buf[GLUEREPLY_UP_TO];
listNode *ln; listNode *ln;
robj *o; robj *o;
listRewind(c->reply); listRewind(c->reply);
while((ln = listYield(c->reply))) { while((ln = listYield(c->reply))) {
o = ln->value; int objlen;
totlen += sdslen(o->ptr);
/* This optimization makes more sense if we don't have to copy
* too much data */
if (totlen > GLUEREPLY_UP_TO) return;
}
if (totlen > 0) {
char buf[GLUEREPLY_UP_TO];
int copylen = 0;
listRewind(c->reply);
while((ln = listYield(c->reply))) {
o = ln->value; o = ln->value;
memcpy(buf+copylen,o->ptr,sdslen(o->ptr)); objlen = sdslen(o->ptr);
copylen += sdslen(o->ptr); if (copylen + objlen <= GLUEREPLY_UP_TO) {
memcpy(buf+copylen,o->ptr,objlen);
copylen += objlen;
listDelNode(c->reply,ln); listDelNode(c->reply,ln);
} else {
if (copylen == 0) return;
break;
}
} }
/* Now the output buffer is empty, add the new single element */ /* Now the output buffer is empty, add the new single element */
o = createObject(REDIS_STRING,sdsnewlen(buf,totlen)); o = createObject(REDIS_STRING,sdsnewlen(buf,copylen));
listAddNodeTail(c->reply,o); listAddNodeHead(c->reply,o);
}
} }
static void sendReplyToClient(aeEventLoop *el, int fd, void *privdata, int mask) { static void sendReplyToClient(aeEventLoop *el, int fd, void *privdata, int mask) {
@ -1387,8 +1383,6 @@ static void sendReplyToClient(aeEventLoop *el, int fd, void *privdata, int mask)
REDIS_NOTUSED(el); REDIS_NOTUSED(el);
REDIS_NOTUSED(mask); REDIS_NOTUSED(mask);
if (server.glueoutputbuf && listLength(c->reply) > 1)
glueReplyBuffersIfNeeded(c);
/* Use writev() if we have enough buffers to send */ /* Use writev() if we have enough buffers to send */
#if 0 #if 0
@ -1401,6 +1395,9 @@ static void sendReplyToClient(aeEventLoop *el, int fd, void *privdata, int mask)
#endif #endif
while(listLength(c->reply)) { while(listLength(c->reply)) {
if (server.glueoutputbuf && listLength(c->reply) > 1)
glueReplyBuffersIfNeeded(c);
o = listNodeValue(listFirst(c->reply)); o = listNodeValue(listFirst(c->reply));
objlen = sdslen(o->ptr); objlen = sdslen(o->ptr);

View File

@ -912,6 +912,10 @@ proc main {server port} {
lappend aux [$r dbsize] lappend aux [$r dbsize]
} {0 0} } {0 0}
test {Perform a final SAVE to leave a clean DB on disk} {
$r save
} {OK}
puts "\n[expr $::passed+$::failed] tests, $::passed passed, $::failed failed" puts "\n[expr $::passed+$::failed] tests, $::passed passed, $::failed failed"
if {$::failed > 0} { if {$::failed > 0} {
puts "\n*** WARNING!!! $::failed FAILED TESTS ***\n" puts "\n*** WARNING!!! $::failed FAILED TESTS ***\n"