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
49b1e788
Commit
49b1e788
authored
Jan 11, 2016
by
antirez
Browse files
CLUSTER BUMPEPOCH initial implementation fixed.
parent
7942e709
Changes
2
Show whitespace changes
Inline
Side-by-side
src/cluster.c
View file @
49b1e788
...
...
@@ -4027,13 +4027,6 @@ void clusterCommand(redisClient *c) {
}
clusterDelSlot
(
slot
);
clusterAddSlot
(
n
,
slot
);
}
else
if
(
!
strcasecmp
(
c
->
argv
[
3
]
->
ptr
,
"bumpepoch"
)
&&
c
->
argc
==
2
)
{
/* CLUSTER BUMPEPOCH */
int
retval
=
clusterBumpConfigEpochWithoutConsensus
();
sds
reply
=
sdscatprintf
(
sdsempty
(),
"%s %llu
\r\n
"
,
(
retval
==
C_OK
)
?
"BUMPED"
:
"STILL"
,
(
unsigned
long
long
)
myself
->
configEpoch
);
addReplySds
(
c
,
reply
);
}
else
{
addReplyError
(
c
,
"Invalid CLUSTER SETSLOT action or number of arguments"
);
...
...
@@ -4041,6 +4034,13 @@ void clusterCommand(redisClient *c) {
}
clusterDoBeforeSleep
(
CLUSTER_TODO_SAVE_CONFIG
|
CLUSTER_TODO_UPDATE_STATE
);
addReply
(
c
,
shared
.
ok
);
}
else
if
(
!
strcasecmp
(
c
->
argv
[
1
]
->
ptr
,
"bumpepoch"
)
&&
c
->
argc
==
2
)
{
/* CLUSTER BUMPEPOCH */
int
retval
=
clusterBumpConfigEpochWithoutConsensus
();
sds
reply
=
sdscatprintf
(
sdsempty
(),
"+%s %llu
\r\n
"
,
(
retval
==
C_OK
)
?
"BUMPED"
:
"STILL"
,
(
unsigned
long
long
)
myself
->
configEpoch
);
addReplySds
(
c
,
reply
);
}
else
if
(
!
strcasecmp
(
c
->
argv
[
1
]
->
ptr
,
"info"
)
&&
c
->
argc
==
2
)
{
/* CLUSTER INFO */
char
*
statestr
[]
=
{
"ok"
,
"fail"
,
"needhelp"
};
...
...
src/redis-trib.rb
View file @
49b1e788
...
...
@@ -499,13 +499,15 @@ class RedisTrib
end
# Return the owner of the specified slot
def
get_slot_owner
(
slot
)
def
get_slot_owners
(
slot
)
owners
=
[]
@nodes
.
each
{
|
n
|
next
if
n
.
has_flag?
(
"slave"
)
n
.
slots
.
each
{
|
s
,
_
|
return
n
if
s
==
slot
owners
<<
n
if
s
==
slot
}
}
nil
owners
end
# Return the node, among 'nodes' with the greatest number of keys
...
...
@@ -532,7 +534,8 @@ class RedisTrib
# Try to obtain the current slot owner, according to the current
# nodes configuration.
owner
=
get_slot_owner
(
slot
)
owners
=
get_slot_owners
(
slot
)
owner
=
owners
[
0
]
if
owners
.
length
==
1
migrating
=
[]
importing
=
[]
...
...
@@ -585,9 +588,17 @@ class RedisTrib
# Note that this case also covers multiple nodes having the slot
# in migrating state, since migrating is a valid state only for
# slot owners.
#
# TODO: Use CLUSTER BUMPEPOCH in order to make the
# winner able to claim the slot over all the other nodes.
if
owners
.
length
>
1
owner
=
get_node_with_most_keys_in_slot
(
owners
,
slot
)
owners
.
each
{
|
n
|
next
if
n
==
owner
n
.
r
.
cluster
(
'delslots'
,
slot
)
n
.
r
.
cluster
(
'setslot'
,
slot
,
'importing'
,
owner
.
info
[
:name
])
importing
.
delete
(
n
)
# Avoid duplciates
importing
<<
n
}
owner
.
r
.
cluster
(
'bumpepoch'
)
end
# Case 1: The slot is in migrating state in one slot, and in
# importing state in 1 slot. That's trivial to address.
...
...
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