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