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
9e718a1f
Commit
9e718a1f
authored
Dec 23, 2014
by
antirez
Browse files
Merge branch 'unstable' of github.com:/antirez/redis into unstable
parents
840435ad
f7bc1fce
Changes
2
Hide whitespace changes
Inline
Side-by-side
src/redis-trib.rb
View file @
9e718a1f
...
...
@@ -540,7 +540,6 @@ class RedisTrib
nodes_count
=
@nodes
.
length
masters_count
=
@nodes
.
length
/
(
@replicas
+
1
)
masters
=
[]
slaves
=
[]
# The first step is to split instances by IP. This is useful as
# we'll try to allocate master nodes in different physical machines
...
...
@@ -558,16 +557,22 @@ class RedisTrib
# Select master instances
puts
"Using
#{
masters_count
}
masters:"
while
masters
.
length
<
masters_count
ips
.
each
{
|
ip
,
nodes_list
|
next
if
nodes_list
.
length
==
0
masters
<<
nodes_list
.
shift
puts
masters
[
-
1
]
nodes_count
-=
1
break
if
masters
.
length
==
masters_count
}
interleaved
=
[]
stop
=
false
while
not
stop
do
# Take one node from each IP until we run out of nodes
# across every IP.
ips
.
each
do
|
ip
,
nodes
|
stop
=
nodes
.
empty?
and
next
interleaved
.
push
nodes
.
shift
end
end
masters
=
interleaved
.
slice!
(
0
,
masters_count
)
nodes_count
-=
masters
.
length
masters
.
each
{
|
m
|
puts
m
}
# Alloc slots on masters
slots_per_node
=
ClusterHashSlots
.
to_f
/
masters_count
first
=
0
...
...
@@ -594,8 +599,8 @@ class RedisTrib
# all nodes will be used.
assignment_verbose
=
false
[
:requested
,
:unused
].
each
{
|
assign
|
masters
.
each
{
|
m
|
[
:requested
,
:unused
].
each
do
|
assign
|
masters
.
each
do
|
m
|
assigned_replicas
=
0
while
assigned_replicas
<
@replicas
break
if
nodes_count
==
0
...
...
@@ -609,21 +614,33 @@ class RedisTrib
"role too (
#{
nodes_count
}
remaining)."
end
end
ips
.
each
{
|
ip
,
nodes_list
|
next
if
nodes_list
.
length
==
0
# Skip instances with the same IP as the master if we
# have some more IPs available.
next
if
ip
==
m
.
info
[
:host
]
&&
nodes_count
>
nodes_list
.
length
slave
=
nodes_list
.
shift
slave
.
set_as_replica
(
m
.
info
[
:name
])
nodes_count
-=
1
assigned_replicas
+=
1
puts
"Adding replica
#{
slave
}
to
#{
m
}
"
break
}
# Return the first node not matching our current master
node
=
interleaved
.
find
{
|
n
|
n
.
info
[
:host
]
!=
m
.
info
[
:host
]}
# If we found a node, use it as a best-first match.
# Otherwise, we didn't find a node on a different IP, so we
# go ahead and use a same-IP replica.
if
node
slave
=
node
interleaved
.
delete
node
else
slave
=
interleaved
.
shift
end
slave
.
set_as_replica
(
m
.
info
[
:name
])
nodes_count
-=
1
assigned_replicas
+=
1
puts
"Adding replica
#{
slave
}
to
#{
m
}
"
# If we are in the "assign extra nodes" loop,
# we want to assign one extra replica to each
# master before repeating masters.
# This break lets us assign extra replicas to masters
# in a round-robin way.
break
if
assign
==
:unused
end
}
}
end
end
end
def
flush_nodes_config
...
...
src/sentinel.c
View file @
9e718a1f
...
...
@@ -2784,6 +2784,7 @@ void sentinelCommand(redisClient *c) {
sentinelSetCommand
(
c
);
}
else
if
(
!
strcasecmp
(
c
->
argv
[
1
]
->
ptr
,
"info-cache"
))
{
if
(
c
->
argc
<
2
)
goto
numargserr
;
mstime_t
now
=
mstime
();
/* Create an ad-hoc dictionary type so that we can iterate
* a dictionary composed of just the master groups the user
...
...
@@ -2819,6 +2820,8 @@ void sentinelCommand(redisClient *c) {
sentinelRedisInstance
*
ri
=
dictGetVal
(
de
);
addReplyBulkCBuffer
(
c
,
ri
->
name
,
strlen
(
ri
->
name
));
addReplyMultiBulkLen
(
c
,
dictSize
(
ri
->
slaves
)
+
1
);
/* +1 for self */
addReplyMultiBulkLen
(
c
,
2
);
addReplyLongLong
(
c
,
now
-
ri
->
info_refresh
);
if
(
ri
->
info
)
addReplyBulkCBuffer
(
c
,
ri
->
info
,
sdslen
(
ri
->
info
));
else
...
...
@@ -2829,6 +2832,8 @@ void sentinelCommand(redisClient *c) {
sdi
=
dictGetIterator
(
ri
->
slaves
);
while
((
sde
=
dictNext
(
sdi
))
!=
NULL
)
{
sentinelRedisInstance
*
sri
=
dictGetVal
(
sde
);
addReplyMultiBulkLen
(
c
,
2
);
addReplyLongLong
(
c
,
now
-
sri
->
info_refresh
);
if
(
sri
->
info
)
addReplyBulkCBuffer
(
c
,
sri
->
info
,
sdslen
(
sri
->
info
));
else
...
...
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