Commit 6b4635f4 authored by antirez's avatar antirez
Browse files

REPLCONF ACK command.

This special command is used by the slave to inform the master the
amount of replication stream it currently consumed.

it does not return anything so that we not need to consume additional
bandwidth needed by the master to reply something.

The master can do a number of things knowing the amount of stream
processed, such as understanding the "lag" in bytes of the slave, verify
if a given command was already processed by the slave, and so forth.
parent a950f489
...@@ -88,6 +88,8 @@ redisClient *createClient(int fd) { ...@@ -88,6 +88,8 @@ redisClient *createClient(int fd) {
c->authenticated = 0; c->authenticated = 0;
c->replstate = REDIS_REPL_NONE; c->replstate = REDIS_REPL_NONE;
c->reploff = 0; c->reploff = 0;
c->repl_ack_off = 0;
c->repl_ack_time = 0;
c->slave_listening_port = 0; c->slave_listening_port = 0;
c->reply = listCreate(); c->reply = listCreate();
c->reply_bytes = 0; c->reply_bytes = 0;
......
...@@ -450,6 +450,8 @@ typedef struct redisClient { ...@@ -450,6 +450,8 @@ typedef struct redisClient {
long repldboff; /* replication DB file offset */ long repldboff; /* replication DB file offset */
off_t repldbsize; /* replication DB file size */ off_t repldbsize; /* replication DB file size */
long long reploff; /* replication offset if this is our master */ long long reploff; /* replication offset if this is our master */
long long repl_ack_off; /* replication ack offset, if this is a slave */
long long repl_ack_time;/* replication ack time, if this is a slave */
char replrunid[REDIS_RUN_ID_SIZE+1]; /* master run id if this is a master */ char replrunid[REDIS_RUN_ID_SIZE+1]; /* master run id if this is a master */
int slave_listening_port; /* As configured with: SLAVECONF listening-port */ int slave_listening_port; /* As configured with: SLAVECONF listening-port */
multiState mstate; /* MULTI/EXEC state */ multiState mstate; /* MULTI/EXEC state */
......
...@@ -588,6 +588,19 @@ void replconfCommand(redisClient *c) { ...@@ -588,6 +588,19 @@ void replconfCommand(redisClient *c) {
&port,NULL) != REDIS_OK)) &port,NULL) != REDIS_OK))
return; return;
c->slave_listening_port = port; c->slave_listening_port = port;
} else if (!strcasecmp(c->argv[j]->ptr,"ack")) {
/* REPLCONF ACK is used by slave to inform the master the amount
* of replication stream that it processed so far. It is an
* internal only command that normal clients should never use. */
long long offset;
if (!(c->flags & REDIS_SLAVE)) return;
if ((getLongLongFromObject(c->argv[j+1], &offset) != REDIS_OK))
return;
if (offset > c->repl_ack_off)
c->repl_ack_off = offset;
c->repl_ack_time = server.unixtime;
/* Note: this command does not reply anything! */
} else { } else {
addReplyErrorFormat(c,"Unrecognized REPLCONF option: %s", addReplyErrorFormat(c,"Unrecognized REPLCONF option: %s",
(char*)c->argv[j]->ptr); (char*)c->argv[j]->ptr);
......
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