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
8204ab00
Commit
8204ab00
authored
Jun 10, 2014
by
antirez
Browse files
Cluster: log when a master denies a failover auth.
parent
64e6d7af
Changes
1
Hide whitespace changes
Inline
Side-by-side
src/cluster.c
View file @
8204ab00
...
...
@@ -2288,22 +2288,57 @@ void clusterSendFailoverAuthIfNeeded(clusterNode *node, clusterMsg *request) {
if
(
nodeIsSlave
(
myself
)
||
myself
->
numslots
==
0
)
return
;
/* Request epoch must be >= our currentEpoch. */
if
(
requestCurrentEpoch
<
server
.
cluster
->
currentEpoch
)
return
;
if
(
requestCurrentEpoch
<
server
.
cluster
->
currentEpoch
)
{
redisLog
(
REDIS_WARNING
,
"Failover auth denied to %.40s: reqEpoch (%llu) < curEpoch(%llu)"
,
node
->
name
,
(
unsigned
long
long
)
requestCurrentEpoch
,
(
unsigned
long
long
)
server
.
cluster
->
currentEpoch
);
return
;
}
/* I already voted for this epoch? Return ASAP. */
if
(
server
.
cluster
->
lastVoteEpoch
==
server
.
cluster
->
currentEpoch
)
return
;
if
(
server
.
cluster
->
lastVoteEpoch
==
server
.
cluster
->
currentEpoch
)
{
redisLog
(
REDIS_WARNING
,
"Failover auth denied to %.40s: already voted for epoch %llu"
,
node
->
name
,
(
unsigned
long
long
)
server
.
cluster
->
currentEpoch
);
return
;
}
/* Node must be a slave and its master down.
* The master can be non failing if the request is flagged
* with CLUSTERMSG_FLAG0_FORCEACK (manual failover). */
if
(
nodeIsMaster
(
node
)
||
master
==
NULL
||
(
!
nodeFailed
(
master
)
&&
!
force_ack
))
return
;
(
!
nodeFailed
(
master
)
&&
!
force_ack
))
{
if
(
nodeIsMaster
(
node
))
{
redisLog
(
REDIS_WARNING
,
"Failover auth denied to %.40s: it is a master node"
,
node
->
name
);
}
else
if
(
master
==
NULL
)
{
redisLog
(
REDIS_WARNING
,
"Failover auth denied to %.40s: I don't know its master"
,
node
->
name
);
}
else
if
(
!
nodeFailed
(
master
))
{
redisLog
(
REDIS_WARNING
,
"Failover auth denied to %.40s: its master is up"
,
node
->
name
);
}
return
;
}
/* We did not voted for a slave about this master for two
* times the node timeout. This is not strictly needed for correctness
* of the algorithm but makes the base case more linear. */
if
(
mstime
()
-
node
->
slaveof
->
voted_time
<
server
.
cluster_node_timeout
*
2
)
{
redisLog
(
REDIS_WARNING
,
"Failover auth denied to %.40s: already voted for epoch %llu"
,
node
->
name
,
(
unsigned
long
long
)
server
.
cluster
->
currentEpoch
);
return
;
}
/* The slave requesting the vote must have a configEpoch for the claimed
* slots that is >= the one of the masters currently serving the same
...
...
@@ -2318,6 +2353,12 @@ void clusterSendFailoverAuthIfNeeded(clusterNode *node, clusterMsg *request) {
/* If we reached this point we found a slot that in our current slots
* is served by a master with a greater configEpoch than the one claimed
* by the slave requesting our vote. Refuse to vote for this slave. */
redisLog
(
REDIS_WARNING
,
"Failover auth denied to %.40s: "
"slot %d epoch (%llu) > reqEpoch (%llu)"
,
node
->
name
,
j
,
(
unsigned
long
long
)
server
.
cluster
->
slots
[
j
]
->
configEpoch
,
(
unsigned
long
long
)
requestConfigEpoch
);
return
;
}
...
...
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