Commit 3ced78dc authored by Matt Stancliff's avatar Matt Stancliff Committed by antirez
Browse files

Auto-enter slaveMode when SYNC from redis-cli

If someone asks for SYNC or PSYNC from redis-cli,
automatically enter slaveMode (as if they ran
redis-cli --slave) and continue printing the replication
stream until either they Ctrl-C or the master gets disconnected.
parent 6441a41f
...@@ -94,6 +94,7 @@ static struct config { ...@@ -94,6 +94,7 @@ static struct config {
} config; } config;
static void usage(); static void usage();
static void slaveMode(void);
char *redisGitSHA1(void); char *redisGitSHA1(void);
char *redisGitDirty(void); char *redisGitDirty(void);
...@@ -599,6 +600,8 @@ static int cliSendCommand(int argc, char **argv, int repeat) { ...@@ -599,6 +600,8 @@ static int cliSendCommand(int argc, char **argv, int repeat) {
if (!strcasecmp(command,"monitor")) config.monitor_mode = 1; if (!strcasecmp(command,"monitor")) config.monitor_mode = 1;
if (!strcasecmp(command,"subscribe") || if (!strcasecmp(command,"subscribe") ||
!strcasecmp(command,"psubscribe")) config.pubsub_mode = 1; !strcasecmp(command,"psubscribe")) config.pubsub_mode = 1;
if (!strcasecmp(command,"sync") ||
!strcasecmp(command,"psync")) config.slave_mode = 1;
/* Setup argument length */ /* Setup argument length */
argvlen = malloc(argc*sizeof(size_t)); argvlen = malloc(argc*sizeof(size_t));
...@@ -620,6 +623,13 @@ static int cliSendCommand(int argc, char **argv, int repeat) { ...@@ -620,6 +623,13 @@ static int cliSendCommand(int argc, char **argv, int repeat) {
} }
} }
if (config.slave_mode) {
printf("Entering slave output mode... (press Ctrl-C to quit)\n");
slaveMode();
config.slave_mode = 0;
return REDIS_ERR; /* Error = slaveMode lost connection to master */
}
if (cliReadReply(output_raw) != REDIS_OK) { if (cliReadReply(output_raw) != REDIS_OK) {
free(argvlen); free(argvlen);
return REDIS_ERR; return REDIS_ERR;
...@@ -1060,6 +1070,7 @@ static void slaveMode(void) { ...@@ -1060,6 +1070,7 @@ static void slaveMode(void) {
int fd = context->fd; int fd = context->fd;
unsigned long long payload = sendSync(fd); unsigned long long payload = sendSync(fd);
char buf[1024]; char buf[1024];
int original_output = config.output;
fprintf(stderr,"SYNC with master, discarding %llu " fprintf(stderr,"SYNC with master, discarding %llu "
"bytes of bulk transfer...\n", payload); "bytes of bulk transfer...\n", payload);
...@@ -1080,6 +1091,7 @@ static void slaveMode(void) { ...@@ -1080,6 +1091,7 @@ static void slaveMode(void) {
/* Now we can use hiredis to read the incoming protocol. */ /* Now we can use hiredis to read the incoming protocol. */
config.output = OUTPUT_CSV; config.output = OUTPUT_CSV;
while (cliReadReply(0) == REDIS_OK); while (cliReadReply(0) == REDIS_OK);
config.output = original_output;
} }
/* This function implements --rdb, so it uses the replication protocol in order /* This function implements --rdb, so it uses the replication protocol in order
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment