diff --git a/src/main/java/org/redisson/ReadMode.java b/src/main/java/org/redisson/ReadMode.java index 0f7e6a6df..543c46032 100644 --- a/src/main/java/org/redisson/ReadMode.java +++ b/src/main/java/org/redisson/ReadMode.java @@ -25,6 +25,11 @@ public enum ReadMode { /** * Read from master node */ - MASTER + MASTER, + + /** + * Read from master and slave nodes + */ + MASTER_SLAVE, } diff --git a/src/main/java/org/redisson/cluster/ClusterConnectionManager.java b/src/main/java/org/redisson/cluster/ClusterConnectionManager.java index cbace80ab..229b0067d 100644 --- a/src/main/java/org/redisson/cluster/ClusterConnectionManager.java +++ b/src/main/java/org/redisson/cluster/ClusterConnectionManager.java @@ -200,7 +200,7 @@ public class ClusterConnectionManager extends MasterSlaveConnectionManager { config.setSlaveAddresses(partition.getSlaveAddresses()); e = new MasterSlaveEntry(partition.getSlotRanges(), ClusterConnectionManager.this, config); - List> fs = e.initSlaveBalancer(config); + List> fs = e.initSlaveBalancer(); futures.addAll(fs); if (!partition.getSlaveAddresses().isEmpty()) { diff --git a/src/main/java/org/redisson/connection/MasterSlaveConnectionManager.java b/src/main/java/org/redisson/connection/MasterSlaveConnectionManager.java index a7f9abf20..9b5adb9a9 100644 --- a/src/main/java/org/redisson/connection/MasterSlaveConnectionManager.java +++ b/src/main/java/org/redisson/connection/MasterSlaveConnectionManager.java @@ -195,20 +195,17 @@ public class MasterSlaveConnectionManager implements ConnectionManager { } protected void initEntry(MasterSlaveServersConfig config) { - if (config.getReadMode() == ReadMode.MASTER) { - HashSet slots = new HashSet(); - slots.add(singleSlotRange); + HashSet slots = new HashSet(); + slots.add(singleSlotRange); + if (config.getReadMode() == ReadMode.MASTER) { SingleEntry entry = new SingleEntry(slots, this, config); Future f = entry.setupMasterEntry(config.getMasterAddress().getHost(), config.getMasterAddress().getPort()); f.syncUninterruptibly(); addEntry(singleSlotRange, entry); } else { - HashSet slots = new HashSet(); - slots.add(singleSlotRange); - MasterSlaveEntry entry = new MasterSlaveEntry(slots, this, config); - List> fs = entry.initSlaveBalancer(config); + List> fs = entry.initSlaveBalancer(); Future f = entry.setupMasterEntry(config.getMasterAddress().getHost(), config.getMasterAddress().getPort()); fs.add(f); for (Future future : fs) { diff --git a/src/main/java/org/redisson/connection/MasterSlaveEntry.java b/src/main/java/org/redisson/connection/MasterSlaveEntry.java index 909bd9ac6..8992113f2 100644 --- a/src/main/java/org/redisson/connection/MasterSlaveEntry.java +++ b/src/main/java/org/redisson/connection/MasterSlaveEntry.java @@ -24,6 +24,7 @@ import java.util.Set; import java.util.concurrent.atomic.AtomicBoolean; import org.redisson.MasterSlaveServersConfig; +import org.redisson.ReadMode; import org.redisson.client.RedisClient; import org.redisson.client.RedisConnection; import org.redisson.client.RedisPubSubConnection; @@ -67,8 +68,8 @@ public class MasterSlaveEntry { writeConnectionHolder = new MasterConnectionPool(config, connectionManager, this); } - public List> initSlaveBalancer(MasterSlaveServersConfig config) { - boolean freezeMasterAsSlave = !config.getSlaveAddresses().isEmpty(); + public List> initSlaveBalancer() { + boolean freezeMasterAsSlave = !config.getSlaveAddresses().isEmpty() && config.getReadMode() == ReadMode.SLAVE; List> result = new LinkedList>(); Future f = addSlave(config.getMasterAddress().getHost(), config.getMasterAddress().getPort(), freezeMasterAsSlave, NodeType.MASTER); @@ -89,8 +90,9 @@ public class MasterSlaveEntry { public Collection slaveDown(String host, int port, FreezeReason freezeReason) { Collection conns = slaveBalancer.freeze(host, port, freezeReason); + // add master as slave if no more slaves available - if (slaveBalancer.getAvailableClients() == 0) { + if (config.getReadMode() == ReadMode.SLAVE && slaveBalancer.getAvailableClients() == 0) { InetSocketAddress addr = masterEntry.getClient().getAddr(); if (slaveUp(addr.getHostName(), addr.getPort(), FreezeReason.SYSTEM)) { log.info("master {}:{} used as slave", addr.getHostName(), addr.getPort()); @@ -128,7 +130,8 @@ public class MasterSlaveEntry { InetSocketAddress addr = masterEntry.getClient().getAddr(); // exclude master from slaves - if (!addr.getHostName().equals(host) || port != addr.getPort()) { + if (config.getReadMode() == ReadMode.SLAVE + && (!addr.getHostName().equals(host) || port != addr.getPort())) { connectionManager.slaveDown(this, addr.getHostName(), addr.getPort(), FreezeReason.SYSTEM); } return true; @@ -146,8 +149,9 @@ public class MasterSlaveEntry { writeConnectionHolder.remove(oldMaster); oldMaster.freezeMaster(FreezeReason.MANAGER); - if (slaveBalancer.getAvailableClients() > 1) { - // more than one slave available, so master could be removed from slaves + // more than one slave available, so master can be removed from slaves + if (config.getReadMode() == ReadMode.SLAVE + && slaveBalancer.getAvailableClients() > 1) { connectionManager.slaveDown(this, host, port, FreezeReason.SYSTEM); } connectionManager.shutdownAsync(oldMaster.getClient());