Skip to content

Commit

Permalink
Issue #1248: Avoid queueing multiple cluster discovers of the same type
Browse files Browse the repository at this point in the history
  • Loading branch information
Spikhalskiy committed Apr 3, 2016
1 parent 8f62c4c commit c386056
Showing 1 changed file with 27 additions and 21 deletions.
48 changes: 27 additions & 21 deletions src/main/java/redis/clients/jedis/JedisClusterInfoCache.java
Expand Up @@ -22,6 +22,7 @@ public class JedisClusterInfoCache {
private final ReentrantReadWriteLock rwl = new ReentrantReadWriteLock();
private final Lock r = rwl.readLock();
private final Lock w = rwl.writeLock();
private volatile boolean rediscovering;
private final GenericObjectPoolConfig poolConfig;

private int connectionTimeout;
Expand Down Expand Up @@ -79,36 +80,41 @@ public void discoverClusterNodesAndSlots(Jedis jedis) {
}

public void discoverClusterSlots(Jedis jedis) {
w.lock();
//If rediscovering is already in process - no need to start one more same rediscovering, just return
if (!rediscovering) {
w.lock();
rediscovering = true;

try {
this.slots.clear();
try {
this.slots.clear();

List<Object> slots = jedis.clusterSlots();
List<Object> slots = jedis.clusterSlots();

for (Object slotInfoObj : slots) {
List<Object> slotInfo = (List<Object>) slotInfoObj;
for (Object slotInfoObj : slots) {
List<Object> slotInfo = (List<Object>) slotInfoObj;

if (slotInfo.size() <= 2) {
continue;
}
if (slotInfo.size() <= 2) {
continue;
}

List<Integer> slotNums = getAssignedSlotArray(slotInfo);
List<Integer> slotNums = getAssignedSlotArray(slotInfo);

// hostInfos
List<Object> hostInfos = (List<Object>) slotInfo.get(2);
if (hostInfos.isEmpty()) {
continue;
}
// hostInfos
List<Object> hostInfos = (List<Object>) slotInfo.get(2);
if (hostInfos.isEmpty()) {
continue;
}

// at this time, we just use master, discard slave information
HostAndPort targetNode = generateHostAndPort(hostInfos);
// at this time, we just use master, discard slave information
HostAndPort targetNode = generateHostAndPort(hostInfos);

setNodeIfNotExist(targetNode);
assignSlotsToNode(slotNums, targetNode);
setNodeIfNotExist(targetNode);
assignSlotsToNode(slotNums, targetNode);
}
} finally {
rediscovering = false;
w.unlock();
}
} finally {
w.unlock();
}
}

Expand Down

0 comments on commit c386056

Please sign in to comment.