Skip to content
GitLab
Menu
Projects
Groups
Snippets
Loading...
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
Menu
Open sidebar
ruanhaishen
redis
Commits
e3344b80
Commit
e3344b80
authored
Oct 15, 2015
by
antirez
Browse files
PR 2813 fix ported to unstable.
parent
fcb3aef7
Changes
2
Show whitespace changes
Inline
Side-by-side
src/replication.c
View file @
e3344b80
...
@@ -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
);
...
@@ -1203,6 +1210,7 @@ char *sendSynchronousCommand(int flags, int fd, ...) {
...
@@ -1203,6 +1210,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
;
...
@@ -1633,7 +1641,7 @@ void undoConnectWithMaster(void) {
...
@@ -1633,7 +1641,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
;
...
@@ -1652,7 +1660,7 @@ int cancelReplicationHandshake(void) {
...
@@ -1652,7 +1660,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
{
...
@@ -1787,23 +1795,18 @@ void roleCommand(client *c) {
...
@@ -1787,23 +1795,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
);
}
}
...
@@ -2179,7 +2182,7 @@ void replicationCron(void) {
...
@@ -2179,7 +2182,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 @
e3344b80
...
@@ -288,6 +288,7 @@ typedef long long mstime_t; /* millisecond time type. */
...
@@ -288,6 +288,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 */
...
@@ -297,6 +298,7 @@ typedef long long mstime_t; /* millisecond time type. */
...
@@ -297,6 +298,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