summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorantirez <antirez@gmail.com>2015-02-08 23:28:27 +0100
committerantirez <antirez@gmail.com>2015-02-08 23:28:27 +0100
commitca23b2a6b739f179ed0dab3a3639153d8b18fd59 (patch)
treeb6ac5bc5f7b850c1b5e0dfd410c5e0d0d8139ae2
parentcfe21852e79792b08afd2fe0872440edcddf577e (diff)
downloadredis-ca23b2a6b739f179ed0dab3a3639153d8b18fd59.tar.gz
redis-cli: interactive reconnection for latency modes.
--stat mode already used to reconnect automatically if the server is no longer available. This is useful since this is an interactive mode used for debugging, however the same applies to --latency and --latency-dist modes, so now both use the reconnecting command execution as well. The reconnection code was modified to use basic VT100 escape sequences in order to play better with different kinds of output on the screen when the reconnection happens, and to hide the reconnection attempt output when finally the reconnection happens.
-rw-r--r--src/redis-cli.c22
1 files changed, 13 insertions, 9 deletions
diff --git a/src/redis-cli.c b/src/redis-cli.c
index e95c5b413..4171e69c8 100644
--- a/src/redis-cli.c
+++ b/src/redis-cli.c
@@ -702,16 +702,17 @@ static int cliSendCommand(int argc, char **argv, int repeat) {
return REDIS_OK;
}
-/* Send the INFO command, reconnecting the link if needed. */
-static redisReply *reconnectingInfo(void) {
- redisContext *c = context;
+/* Send a command reconnecting the link if needed. */
+static redisReply *reconnectingRedisCommand(redisContext *c, const char *fmt, ...) {
redisReply *reply = NULL;
int tries = 0;
+ va_list ap;
assert(!c->err);
while(reply == NULL) {
while (c->err & (REDIS_ERR_IO | REDIS_ERR_EOF)) {
- printf("Reconnecting (%d)...\r", ++tries);
+ printf("\r\x1b[0K"); /* Cursor to left edge + clear line. */
+ printf("Reconnecting... %d\r", ++tries);
fflush(stdout);
redisFree(c);
@@ -719,12 +720,15 @@ static redisReply *reconnectingInfo(void) {
usleep(1000000);
}
- reply = redisCommand(c,"INFO");
+ va_start(ap,fmt);
+ reply = redisvCommand(c,fmt,ap);
+ va_end(ap);
+
if (c->err && !(c->err & (REDIS_ERR_IO | REDIS_ERR_EOF))) {
fprintf(stderr, "Error: %s\n", c->errstr);
exit(1);
} else if (tries > 0) {
- printf("\n");
+ printf("\r\x1b[0K"); /* Cursor to left edge + clear line. */
}
}
@@ -1083,7 +1087,7 @@ static void latencyMode(void) {
if (!context) exit(1);
while(1) {
start = mstime();
- reply = redisCommand(context,"PING");
+ reply = reconnectingRedisCommand(context,"PING");
if (reply == NULL) {
fprintf(stderr,"\nI/O error\n");
exit(1);
@@ -1233,7 +1237,7 @@ static void latencyDistMode(void) {
if (!context) exit(1);
while(1) {
start = ustime();
- reply = redisCommand(context,"PING");
+ reply = reconnectingRedisCommand(context,"PING");
if (reply == NULL) {
fprintf(stderr,"\nI/O error\n");
exit(1);
@@ -1881,7 +1885,7 @@ static void statMode(void) {
char buf[64];
int j;
- reply = reconnectingInfo();
+ reply = reconnectingRedisCommand(context,"INFO");
if (reply->type == REDIS_REPLY_ERROR) {
printf("ERROR: %s\n", reply->str);
exit(1);