Skip to content

Commit e6ee5e0

Browse files
author
Zhen
committed
Fixed a bug found on idle and inUse counters
Before we always decrement idle counters when a channel is closed. However, this is wrong when a channel is closed before it is returen to the pool. So change the code to make sure that no matter the channel is closed inside or outside the pool, the idle and inUse counters should be correct.
1 parent e6e4846 commit e6ee5e0

File tree

3 files changed

+46
-1
lines changed

3 files changed

+46
-1
lines changed

driver/src/main/java/org/neo4j/driver/internal/async/pool/NettyChannelPool.java

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,6 @@ protected ChannelFuture connectChannel( Bootstrap bootstrap )
6969
// notify pool handler about a successful connection
7070
Channel channel = channelFuture.channel();
7171
handler.channelCreated( channel, creatingEvent );
72-
channel.closeFuture().addListener( closeFuture -> handler.channelClosed( channel ) );
7372
}
7473
else
7574
{

driver/src/main/java/org/neo4j/driver/internal/async/pool/NettyChannelTracker.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
package org.neo4j.driver.internal.async.pool;
2020

2121
import io.netty.channel.Channel;
22+
import io.netty.channel.ChannelFutureListener;
2223
import io.netty.channel.pool.ChannelPoolHandler;
2324

2425
import java.util.Map;
@@ -39,6 +40,7 @@ public class NettyChannelTracker implements ChannelPoolHandler
3940
private final Map<BoltServerAddress,AtomicInteger> addressToIdleChannelCount = new ConcurrentHashMap<>();
4041
private final Logger log;
4142
private final MetricsListener metricsListener;
43+
private final ChannelFutureListener closeListener = future -> channelClosed( future.channel() );
4244

4345
public NettyChannelTracker( MetricsListener metricsListener, Logging logging )
4446
{
@@ -52,6 +54,7 @@ public void channelReleased( Channel channel )
5254
log.debug( "Channel %s released back to the pool", channel );
5355
decrementInUse( channel );
5456
incrementIdle( channel );
57+
channel.closeFuture().addListener( closeListener );
5558
}
5659

5760
@Override
@@ -60,6 +63,7 @@ public void channelAcquired( Channel channel )
6063
log.debug( "Channel %s acquired from the pool", channel );
6164
incrementInUse( channel );
6265
decrementIdle( channel );
66+
channel.closeFuture().removeListener( closeListener );
6367
}
6468

6569
@Override

driver/src/test/java/org/neo4j/driver/internal/async/pool/NettyChannelTrackerTest.java

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -110,6 +110,48 @@ public void shouldDecrementCountForAddress()
110110
assertEquals( 3, tracker.idleChannelCount( address ) );
111111
}
112112

113+
@Test
114+
public void shouldDecreaseIdleWhenClosedOutsidePool() throws Throwable
115+
{
116+
// Given
117+
Channel channel = newChannel();
118+
tracker.channelCreated( channel, null );
119+
assertEquals( 1, tracker.inUseChannelCount( address ) );
120+
assertEquals( 0, tracker.idleChannelCount( address ) );
121+
122+
// When closed before session.close
123+
channel.close();
124+
125+
// Then
126+
assertEquals( 1, tracker.inUseChannelCount( address ) );
127+
assertEquals( 0, tracker.idleChannelCount( address ) );
128+
129+
tracker.channelReleased( channel );
130+
assertEquals( 0, tracker.inUseChannelCount( address ) );
131+
assertEquals( 0, tracker.idleChannelCount( address ) );
132+
}
133+
134+
@Test
135+
public void shouldDecreaseIdleWhenClosedInsidePool() throws Throwable
136+
{
137+
// Given
138+
Channel channel = newChannel();
139+
tracker.channelCreated( channel, null );
140+
assertEquals( 1, tracker.inUseChannelCount( address ) );
141+
assertEquals( 0, tracker.idleChannelCount( address ) );
142+
143+
tracker.channelReleased( channel );
144+
assertEquals( 0, tracker.inUseChannelCount( address ) );
145+
assertEquals( 1, tracker.idleChannelCount( address ) );
146+
147+
// When closed before acquire
148+
channel.close();
149+
// Then
150+
assertEquals( 0, tracker.inUseChannelCount( address ) );
151+
assertEquals( 0, tracker.idleChannelCount( address ) );
152+
153+
}
154+
113155
@Test
114156
public void shouldThrowWhenDecrementingForUnknownAddress()
115157
{

0 commit comments

Comments
 (0)