From: Salvatore Sanfilippo Date: Wed, 21 Sep 2011 20:32:24 +0000 (-0700) Subject: Merge pull request #97 from jvain/redis-cli X-Git-Url: https://git.saurik.com/redis.git/commitdiff_plain/7c748c061ecb630f52d0041c5d2497783aac5c06?hp=-c Merge pull request #97 from jvain/redis-cli redis-cli segfaults with single numeric argument greater than zero --- 7c748c061ecb630f52d0041c5d2497783aac5c06 diff --combined src/redis-cli.c index 328cd3df,d01b1ed5..b129df61 --- a/src/redis-cli.c +++ b/src/redis-cli.c @@@ -61,7 -61,6 +61,7 @@@ static struct config int shutdown; int monitor_mode; int pubsub_mode; + int latency_mode; int stdinarg; /* get last arg from stdin. (-x option) */ char *auth; int raw_output; /* output mode per command */ @@@ -568,8 -567,6 +568,8 @@@ static int parseOptions(int argc, char i++; } else if (!strcmp(argv[i],"--raw")) { config.raw_output = 1; + } else if (!strcmp(argv[i],"--latency")) { + config.latency_mode = 1; } else if (!strcmp(argv[i],"-d") && !lastarg) { sdsfree(config.mb_delim); config.mb_delim = sdsnew(argv[i+1]); @@@ -620,7 -617,6 +620,7 @@@ static void usage() " -x Read last argument from STDIN\n" " -d Multi-bulk delimiter in for raw formatting (default: \\n)\n" " --raw Use raw formatting for replies (default when STDOUT is not a tty)\n" +" --latency Enter a special mode continuously sampling latency.\n" " --help Output this help and exit\n" " --version Output version and exit\n" "\n" @@@ -697,7 -693,7 +697,7 @@@ static void repl() int repeat, skipargs = 0; repeat = atoi(argv[0]); - if (repeat) { + if (argc > 1 && repeat) { skipargs = 1; } else { repeat = 1; @@@ -743,38 -739,6 +743,38 @@@ static int noninteractive(int argc, cha return retval; } +static void latencyMode(void) { + redisReply *reply; + long long start, latency, min, max, tot, count = 0; + double avg; + + if (!context) exit(1); + while(1) { + start = mstime(); + reply = redisCommand(context,"PING"); + if (reply == NULL) { + fprintf(stderr,"\nI/O error\n"); + exit(1); + } + latency = mstime()-start; + freeReplyObject(reply); + count++; + if (count == 1) { + min = max = tot = latency; + avg = (double) latency; + } else { + if (latency < min) min = latency; + if (latency > max) max = latency; + tot += latency; + avg = (double) tot/count; + } + printf("\x1b[0G\x1b[2Kmin: %lld, max: %lld, avg: %.2f (%lld samples)", + min, max, avg, count); + fflush(stdout); + usleep(10000); + } +} + int main(int argc, char **argv) { int firstarg; @@@ -788,7 -752,6 +788,7 @@@ config.shutdown = 0; config.monitor_mode = 0; config.pubsub_mode = 0; + config.latency_mode = 0; config.stdinarg = 0; config.auth = NULL; config.raw_output = !isatty(fileno(stdout)) && (getenv("FAKETTY") == NULL); @@@ -799,12 -762,6 +799,12 @@@ argc -= firstarg; argv += firstarg; + /* Start in latency mode if appropriate */ + if (config.latency_mode) { + cliConnect(0); + latencyMode(); + } + /* Start interactive mode when no command is provided */ if (argc == 0) { /* Note that in repl mode we don't abort on connection error.