Fixed - Closing idle connections causes connection listener to fire #4760

pull/4944/head
Nikita Koksharov 2 years ago
parent 5b3d81ff42
commit 418b3937a5

@ -53,6 +53,7 @@ public class RedisConnection implements RedisCommands {
private volatile CompletableFuture<Void> fastReconnect;
private volatile boolean closed;
private volatile boolean closedIdle;
volatile Channel channel;
private CompletableFuture<?> connectionPromise;
@ -278,10 +279,6 @@ public class RedisConnection implements RedisCommands {
return new CommandData<>(promise, encoder, command, params);
}
private void setClosed(boolean closed) {
this.closed = closed;
}
public boolean isClosed() {
return closed;
}
@ -325,8 +322,17 @@ public class RedisConnection implements RedisCommands {
return channel;
}
public ChannelFuture closeIdleAsync() {
closedIdle = true;
return closeAsync();
}
public boolean isClosedIdle() {
return closedIdle;
}
public ChannelFuture closeAsync() {
setClosed(true);
closed = true;
close();
return channel.closeFuture();
}

@ -70,7 +70,10 @@ public class ConnectionWatchdog extends ChannelInboundHandlerAdapter {
public void channelInactive(ChannelHandlerContext ctx) throws Exception {
RedisConnection connection = RedisConnection.getFrom(ctx.channel());
if (connection != null) {
connection.fireDisconnected();
if (!connection.isClosedIdle()) {
connection.fireDisconnected();
}
if (!connection.isClosed()) {
if (connection.isFastReconnect()) {
tryReconnect(connection, 1);

@ -84,13 +84,9 @@ public class IdleConnectionWatcher {
if (timeInPool > config.getIdleConnectionTimeout()
&& validateAmount(entry)
&& entry.deleteHandler.apply(c)) {
ChannelFuture future = c.closeAsync();
future.addListener(new FutureListener<Void>() {
@Override
public void operationComplete(Future<Void> future) throws Exception {
log.debug("Connection {} has been closed due to idle timeout. Not used for {} ms", c.getChannel(), timeInPool);
}
});
ChannelFuture future = c.closeIdleAsync();
future.addListener((FutureListener<Void>) f ->
log.debug("Connection {} has been closed due to idle timeout. Not used for {} ms", c.getChannel(), timeInPool));
}
}
}

Loading…
Cancel
Save