From 6ffb79766b78b11976ff50cc2080d6313f452bca Mon Sep 17 00:00:00 2001 From: Nikita Date: Mon, 1 Oct 2018 18:28:18 +0300 Subject: [PATCH] Master node failover handling improvements --- .../redisson/client/handler/CommandsQueue.java | 2 +- .../cluster/ClusterConnectionManager.java | 16 ++++++++++++---- .../connection/MasterSlaveConnectionManager.java | 6 ++++-- .../redisson/connection/MasterSlaveEntry.java | 2 +- 4 files changed, 18 insertions(+), 8 deletions(-) diff --git a/redisson/src/main/java/org/redisson/client/handler/CommandsQueue.java b/redisson/src/main/java/org/redisson/client/handler/CommandsQueue.java index 448e24593..9e1b0fa94 100644 --- a/redisson/src/main/java/org/redisson/client/handler/CommandsQueue.java +++ b/redisson/src/main/java/org/redisson/client/handler/CommandsQueue.java @@ -78,7 +78,7 @@ public class CommandsQueue extends ChannelDuplexHandler { } command.getChannelPromise().tryFailure( - new WriteRedisConnectionException("Can't write command: " + command.getCommand() + " to channel: " + ctx.channel())); + new WriteRedisConnectionException("Channel has been closed! Can't write command: " + command.getCommand() + " to channel: " + ctx.channel())); } super.channelInactive(ctx); diff --git a/redisson/src/main/java/org/redisson/cluster/ClusterConnectionManager.java b/redisson/src/main/java/org/redisson/cluster/ClusterConnectionManager.java index 7c26ea6b6..974b97cca 100644 --- a/redisson/src/main/java/org/redisson/cluster/ClusterConnectionManager.java +++ b/redisson/src/main/java/org/redisson/cluster/ClusterConnectionManager.java @@ -507,7 +507,7 @@ public class ClusterConnectionManager extends MasterSlaveConnectionManager { Set lastPartitions = getLastPartitions(); for (final ClusterPartition newPart : newPartitions) { boolean masterFound = false; - for (ClusterPartition currentPart : lastPartitions) { + for (final ClusterPartition currentPart : lastPartitions) { if (!newPart.getMasterAddress().equals(currentPart.getMasterAddress())) { continue; } @@ -521,11 +521,19 @@ public class ClusterConnectionManager extends MasterSlaveConnectionManager { // does partition has a new master? if (!newMasterPart.getMasterAddress().equals(currentPart.getMasterAddress())) { URI newUri = newMasterPart.getMasterAddress(); - URI oldUri = currentPart.getMasterAddress(); + final URI oldUri = currentPart.getMasterAddress(); - changeMaster(slot, newUri); + RFuture future = changeMaster(slot, newUri); + future.addListener(new FutureListener() { + @Override + public void operationComplete(Future future) throws Exception { + if (!future.isSuccess()) { + currentPart.setMasterAddress(oldUri); + } + } + }); - currentPart.setMasterAddress(newMasterPart.getMasterAddress()); + currentPart.setMasterAddress(newUri); } } break; diff --git a/redisson/src/main/java/org/redisson/connection/MasterSlaveConnectionManager.java b/redisson/src/main/java/org/redisson/connection/MasterSlaveConnectionManager.java index 285800204..a167b2a73 100644 --- a/redisson/src/main/java/org/redisson/connection/MasterSlaveConnectionManager.java +++ b/redisson/src/main/java/org/redisson/connection/MasterSlaveConnectionManager.java @@ -504,10 +504,11 @@ public class MasterSlaveConnectionManager implements ConnectionManager { return slot2entry.get(slot); } - protected final void changeMaster(int slot, URI address) { + protected final RFuture changeMaster(int slot, URI address) { final MasterSlaveEntry entry = getEntry(slot); final RedisClient oldClient = entry.getClient(); - entry.changeMaster(address).addListener(new FutureListener() { + RFuture future = entry.changeMaster(address); + future.addListener(new FutureListener() { @Override public void operationComplete(Future future) throws Exception { if (future.isSuccess()) { @@ -516,6 +517,7 @@ public class MasterSlaveConnectionManager implements ConnectionManager { } } }); + return future; } protected final void addEntry(Integer slot, MasterSlaveEntry entry) { diff --git a/redisson/src/main/java/org/redisson/connection/MasterSlaveEntry.java b/redisson/src/main/java/org/redisson/connection/MasterSlaveEntry.java index eb06ce46a..03957704d 100644 --- a/redisson/src/main/java/org/redisson/connection/MasterSlaveEntry.java +++ b/redisson/src/main/java/org/redisson/connection/MasterSlaveEntry.java @@ -422,7 +422,7 @@ public class MasterSlaveEntry { @Override public void operationComplete(Future future) throws Exception { if (!future.isSuccess()) { - log.error("Can't change master to: {}", address); + log.error("Unable to change master from: " + oldMaster.getClient().getAddr() + " to: " + address, future.cause()); return; }