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
Hide 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,22 +1798,17 @@ void roleCommand(client *c) {
...
@@ -1790,22 +1798,17 @@ 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
);
switch
(
server
.
repl_state
)
{
if
(
slaveIsInHandshakeState
())
{
case
REPL_STATE_NONE
:
slavestate
=
"none"
;
break
;
slavestate
=
"handshake"
;
case
REPL_STATE_CONNECT
:
slavestate
=
"connect"
;
break
;
}
else
{
case
REPL_STATE_CONNECTING
:
slavestate
=
"connecting"
;
break
;
switch
(
server
.
repl_state
)
{
case
REPL_STATE_RECEIVE_PONG
:
case
REPL_STATE_NONE
:
slavestate
=
"none"
;
break
;
case
REPL_STATE_SEND_AUTH
:
case
REPL_STATE_CONNECT
:
slavestate
=
"connect"
;
break
;
case
REPL_STATE_RECEIVE_AUTH
:
case
REPL_STATE_CONNECTING
:
slavestate
=
"connecting"
;
break
;
case
REPL_STATE_SEND_PORT
:
case
REPL_STATE_TRANSFER
:
slavestate
=
"sync"
;
break
;
case
REPL_STATE_RECEIVE_PORT
:
case
REPL_STATE_CONNECTED
:
slavestate
=
"connected"
;
break
;
case
REPL_STATE_SEND_CAPA
:
default:
slavestate
=
"unknown"
;
break
;
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_CONNECTED
:
slavestate
=
"connected"
;
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,8 +2185,8 @@ void replicationCron(void) {
...
@@ -2182,8 +2185,8 @@ 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..."
);
undoConnectWithMaster
();
undoConnectWithMaster
();
...
...
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