Skip to content
GitLab
Menu
Projects
Groups
Snippets
Loading...
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
Menu
Open sidebar
ruanhaishen
redis
Commits
ed622885
Commit
ed622885
authored
Oct 15, 2015
by
antirez
Browse files
PR 2813 fix ported to unstable.
parent
35a0c772
Changes
2
Show whitespace changes
Inline
Side-by-side
src/replication.c
View file @
ed622885
...
@@ -909,6 +909,13 @@ void updateSlavesWaitingBgsave(int bgsaveerr, int type) {
...
@@ -909,6 +909,13 @@ void updateSlavesWaitingBgsave(int bgsaveerr, int type) {
/* ----------------------------------- SLAVE -------------------------------- */
/* ----------------------------------- SLAVE -------------------------------- */
/* Returns 1 if the given replication state is a handshake state,
* 0 otherwise. */
int slaveIsInHandshakeState(void) {
return server.repl_state >= REPL_STATE_RECEIVE_PONG &&
server.repl_state <= REPL_STATE_RECEIVE_PSYNC;
}
/* Abort the async download of the bulk dataset while SYNC-ing with master */
/* Abort the async download of the bulk dataset while SYNC-ing with master */
void replicationAbortSyncTransfer(void) {
void replicationAbortSyncTransfer(void) {
serverAssert(server.repl_state == REPL_STATE_TRANSFER);
serverAssert(server.repl_state == REPL_STATE_TRANSFER);
...
@@ -1206,6 +1213,7 @@ char *sendSynchronousCommand(int flags, int fd, ...) {
...
@@ -1206,6 +1213,7 @@ char *sendSynchronousCommand(int flags, int fd, ...) {
return sdscatprintf(sdsempty(),"-Reading from master: %s",
return sdscatprintf(sdsempty(),"-Reading from master: %s",
strerror(errno));
strerror(errno));
}
}
server.repl_transfer_lastio = server.unixtime;
return sdsnew(buf);
return sdsnew(buf);
}
}
return NULL;
return NULL;
...
@@ -1636,7 +1644,7 @@ void undoConnectWithMaster(void) {
...
@@ -1636,7 +1644,7 @@ void undoConnectWithMaster(void) {
int fd = server.repl_transfer_s;
int fd = server.repl_transfer_s;
serverAssert(server.repl_state == REPL_STATE_CONNECTING ||
serverAssert(server.repl_state == REPL_STATE_CONNECTING ||
server
.
repl_state
==
REPL_STATE_RECEIVE_PONG
);
slaveIsInHandshakeState()
);
aeDeleteFileEvent(server.el,fd,AE_READABLE|AE_WRITABLE);
aeDeleteFileEvent(server.el,fd,AE_READABLE|AE_WRITABLE);
close(fd);
close(fd);
server.repl_transfer_s = -1;
server.repl_transfer_s = -1;
...
@@ -1655,7 +1663,7 @@ int cancelReplicationHandshake(void) {
...
@@ -1655,7 +1663,7 @@ int cancelReplicationHandshake(void) {
if (server.repl_state == REPL_STATE_TRANSFER) {
if (server.repl_state == REPL_STATE_TRANSFER) {
replicationAbortSyncTransfer();
replicationAbortSyncTransfer();
} else if (server.repl_state == REPL_STATE_CONNECTING ||
} else if (server.repl_state == REPL_STATE_CONNECTING ||
server
.
repl_state
==
REPL_STATE_RECEIVE_PONG
)
slaveIsInHandshakeState()
)
{
{
undoConnectWithMaster();
undoConnectWithMaster();
} else {
} else {
...
@@ -1790,23 +1798,18 @@ void roleCommand(client *c) {
...
@@ -1790,23 +1798,18 @@ void roleCommand(client *c) {
addReplyBulkCBuffer(c,"slave",5);
addReplyBulkCBuffer(c,"slave",5);
addReplyBulkCString(c,server.masterhost);
addReplyBulkCString(c,server.masterhost);
addReplyLongLong(c,server.masterport);
addReplyLongLong(c,server.masterport);
if (slaveIsInHandshakeState()) {
slavestate = "handshake";
} else {
switch(server.repl_state) {
switch(server.repl_state) {
case REPL_STATE_NONE: slavestate = "none"; break;
case REPL_STATE_NONE: slavestate = "none"; break;
case REPL_STATE_CONNECT: slavestate = "connect"; break;
case REPL_STATE_CONNECT: slavestate = "connect"; break;
case REPL_STATE_CONNECTING: slavestate = "connecting"; break;
case REPL_STATE_CONNECTING: slavestate = "connecting"; break;
case
REPL_STATE_RECEIVE_PONG
:
case
REPL_STATE_SEND_AUTH
:
case
REPL_STATE_RECEIVE_AUTH
:
case
REPL_STATE_SEND_PORT
:
case
REPL_STATE_RECEIVE_PORT
:
case
REPL_STATE_SEND_CAPA
:
case
REPL_STATE_RECEIVE_CAPA
:
case
REPL_STATE_SEND_PSYNC
:
case
REPL_STATE_RECEIVE_PSYNC
:
slavestate
=
"handshake"
;
break
;
case REPL_STATE_TRANSFER: slavestate = "sync"; break;
case REPL_STATE_TRANSFER: slavestate = "sync"; break;
case REPL_STATE_CONNECTED: slavestate = "connected"; break;
case REPL_STATE_CONNECTED: slavestate = "connected"; break;
default: slavestate = "unknown"; break;
default: slavestate = "unknown"; break;
}
}
}
addReplyBulkCString(c,slavestate);
addReplyBulkCString(c,slavestate);
addReplyLongLong(c,server.master ? server.master->reploff : -1);
addReplyLongLong(c,server.master ? server.master->reploff : -1);
}
}
...
@@ -2182,7 +2185,7 @@ void replicationCron(void) {
...
@@ -2182,7 +2185,7 @@ void replicationCron(void) {
/* Non blocking connection timeout? */
/* Non blocking connection timeout? */
if (server.masterhost &&
if (server.masterhost &&
(server.repl_state == REPL_STATE_CONNECTING ||
(server.repl_state == REPL_STATE_CONNECTING ||
s
erver
.
repl_state
==
REPL_STATE_RECEIVE_PONG
)
&&
s
laveIsInHandshakeState()
) &&
(time(NULL)-server.repl_transfer_lastio) > server.repl_timeout)
(time(NULL)-server.repl_transfer_lastio) > server.repl_timeout)
{
{
serverLog(LL_WARNING,"Timeout connecting to the MASTER...");
serverLog(LL_WARNING,"Timeout connecting to the MASTER...");
...
...
src/server.h
View file @
ed622885
...
@@ -271,6 +271,7 @@ typedef long long mstime_t; /* millisecond time type. */
...
@@ -271,6 +271,7 @@ typedef long long mstime_t; /* millisecond time type. */
#define REPL_STATE_NONE 0
/* No active replication */
#define REPL_STATE_NONE 0
/* No active replication */
#define REPL_STATE_CONNECT 1
/* Must connect to master */
#define REPL_STATE_CONNECT 1
/* Must connect to master */
#define REPL_STATE_CONNECTING 2
/* Connecting to master */
#define REPL_STATE_CONNECTING 2
/* Connecting to master */
/* --- Handshake states, must be ordered --- */
#define REPL_STATE_RECEIVE_PONG 3
/* Wait for PING reply */
#define REPL_STATE_RECEIVE_PONG 3
/* Wait for PING reply */
#define REPL_STATE_SEND_AUTH 4
/* Send AUTH to master */
#define REPL_STATE_SEND_AUTH 4
/* Send AUTH to master */
#define REPL_STATE_RECEIVE_AUTH 5
/* Wait for AUTH reply */
#define REPL_STATE_RECEIVE_AUTH 5
/* Wait for AUTH reply */
...
@@ -280,6 +281,7 @@ typedef long long mstime_t; /* millisecond time type. */
...
@@ -280,6 +281,7 @@ typedef long long mstime_t; /* millisecond time type. */
#define REPL_STATE_RECEIVE_CAPA 9
/* Wait for REPLCONF reply */
#define REPL_STATE_RECEIVE_CAPA 9
/* Wait for REPLCONF reply */
#define REPL_STATE_SEND_PSYNC 10
/* Send PSYNC */
#define REPL_STATE_SEND_PSYNC 10
/* Send PSYNC */
#define REPL_STATE_RECEIVE_PSYNC 11
/* Wait for PSYNC reply */
#define REPL_STATE_RECEIVE_PSYNC 11
/* Wait for PSYNC reply */
/* --- End of handshake states --- */
#define REPL_STATE_TRANSFER 12
/* Receiving .rdb from master */
#define REPL_STATE_TRANSFER 12
/* Receiving .rdb from master */
#define REPL_STATE_CONNECTED 13
/* Connected to master */
#define REPL_STATE_CONNECTED 13
/* Connected to master */
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment