diff --git a/src/networking.c b/src/networking.c index e7879384d54b70c5474b82fabb0c160cbcb5b350..071f5aafdf40ceb25a008a93485a95c0fa330346 100644 --- a/src/networking.c +++ b/src/networking.c @@ -88,6 +88,8 @@ redisClient *createClient(int fd) { c->authenticated = 0; c->replstate = REDIS_REPL_NONE; c->reploff = 0; + c->repl_ack_off = 0; + c->repl_ack_time = 0; c->slave_listening_port = 0; c->reply = listCreate(); c->reply_bytes = 0; diff --git a/src/redis.h b/src/redis.h index 3002dd9733fc203d5ab4d029d163c1d0e6841b7a..f9a692ea67cee28d649dca57136abd1ad515dc03 100644 --- a/src/redis.h +++ b/src/redis.h @@ -450,6 +450,8 @@ typedef struct redisClient { long repldboff; /* replication DB file offset */ off_t repldbsize; /* replication DB file size */ 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 */ int slave_listening_port; /* As configured with: SLAVECONF listening-port */ multiState mstate; /* MULTI/EXEC state */ diff --git a/src/replication.c b/src/replication.c index 6e89d873902fd419d294176eba561fd322c6e306..06cfe89aeeeb783bbe6b00feb3ca303bf293ff30 100644 --- a/src/replication.c +++ b/src/replication.c @@ -588,6 +588,19 @@ void replconfCommand(redisClient *c) { &port,NULL) != REDIS_OK)) return; 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 { addReplyErrorFormat(c,"Unrecognized REPLCONF option: %s", (char*)c->argv[j]->ptr);