From ee849cd6d0280f0156863046a398ae33d5893680 Mon Sep 17 00:00:00 2001 From: Zhen Date: Wed, 28 Feb 2018 17:42:44 +0100 Subject: [PATCH 1/4] Added connection `acquired` count and `timedOutToAcquire` count on connection pool metrics Change the histogram only record value generated by successful requests. --- .../internal/async/NettyConnection.java | 6 +-- .../async/pool/ConnectionPoolImpl.java | 21 ++++----- .../internal/async/pool/NettyChannelPool.java | 7 ++- .../async/pool/NettyChannelTracker.java | 21 ++++----- .../metrics/ConnectionMetricsListener.java | 2 +- .../ConnectionPoolMetricsListener.java | 8 +++- .../metrics/InternalAbstractMetrics.java | 34 ++++++++++----- .../metrics/InternalConnectionMetrics.java | 2 +- .../InternalConnectionPoolMetrics.java | 42 ++++++++++++++---- .../internal/metrics/InternalMetrics.java | 37 ++++++++++------ .../internal/metrics/ListenerEvent.java | 10 ++++- .../internal/metrics/MetricsListener.java | 39 +++++++++-------- .../metrics/NanoTimeBasedListenerEvent.java | 5 ++- .../metrics/spi/ConnectionPoolMetrics.java | 43 +++++++++++++------ .../internal/metrics/spi/PoolStatus.java | 15 ++++++- ...mplTest.java => ConnectionPoolImplIT.java} | 2 +- ...lPoolTest.java => NettyChannelPoolIT.java} | 6 ++- .../async/pool/NettyChannelTrackerTest.java | 16 +++---- 18 files changed, 206 insertions(+), 110 deletions(-) rename driver/src/test/java/org/neo4j/driver/internal/async/pool/{ConnectionPoolImplTest.java => ConnectionPoolImplIT.java} (99%) rename driver/src/test/java/org/neo4j/driver/internal/async/pool/{NettyChannelPoolTest.java => NettyChannelPoolIT.java} (97%) diff --git a/driver/src/main/java/org/neo4j/driver/internal/async/NettyConnection.java b/driver/src/main/java/org/neo4j/driver/internal/async/NettyConnection.java index 8035010730..e1ce673b40 100644 --- a/driver/src/main/java/org/neo4j/driver/internal/async/NettyConnection.java +++ b/driver/src/main/java/org/neo4j/driver/internal/async/NettyConnection.java @@ -34,7 +34,7 @@ import org.neo4j.driver.internal.messaging.PullAllMessage; import org.neo4j.driver.internal.messaging.ResetMessage; import org.neo4j.driver.internal.messaging.RunMessage; -import org.neo4j.driver.internal.metrics.ListenerEvent; +import org.neo4j.driver.internal.metrics.ListenerEvent.ConnectionListenerEvent; import org.neo4j.driver.internal.metrics.MetricsListener; import org.neo4j.driver.internal.spi.Connection; import org.neo4j.driver.internal.spi.ResponseHandler; @@ -57,7 +57,7 @@ public class NettyConnection implements Connection private final AtomicReference status = new AtomicReference<>( Status.OPEN ); private final MetricsListener metricsListener; - private final ListenerEvent inUseEvent; + private final ConnectionListenerEvent inUseEvent; public NettyConnection( Channel channel, ChannelPool channelPool, Clock clock, MetricsListener metricsListener ) { @@ -69,7 +69,7 @@ public NettyConnection( Channel channel, ChannelPool channelPool, Clock clock, M this.releaseFuture = new CompletableFuture<>(); this.clock = clock; this.metricsListener = metricsListener; - this.inUseEvent = metricsListener.createListenerEvent(); + this.inUseEvent = metricsListener.createConnectionListenerEvent(); metricsListener.afterAcquiredOrCreated( this.serverAddress, this.inUseEvent ); } diff --git a/driver/src/main/java/org/neo4j/driver/internal/async/pool/ConnectionPoolImpl.java b/driver/src/main/java/org/neo4j/driver/internal/async/pool/ConnectionPoolImpl.java index 474ec9e56e..9d7dff9480 100644 --- a/driver/src/main/java/org/neo4j/driver/internal/async/pool/ConnectionPoolImpl.java +++ b/driver/src/main/java/org/neo4j/driver/internal/async/pool/ConnectionPoolImpl.java @@ -87,22 +87,18 @@ public CompletionStage acquire( BoltServerAddress address ) assertNotClosed(); ChannelPool pool = getOrCreatePool( address ); - ListenerEvent acquireEvent = metricsListener.createListenerEvent(); + ListenerEvent.PoolListenerEvent acquireEvent = metricsListener.createPoolListenerEvent(); metricsListener.beforeAcquiringOrCreating( address, acquireEvent ); Future connectionFuture = pool.acquire(); return Futures.asCompletionStage( connectionFuture ).handle( ( channel, error ) -> { - try - { - processAcquisitionError( error ); - assertNotClosed( address, channel, pool ); - return new NettyConnection( channel, pool, clock, metricsListener ); - } - finally - { - metricsListener.afterAcquiringOrCreating( address, acquireEvent ); - } + processAcquisitionError( address, error ); + assertNotClosed( address, channel, pool ); + NettyConnection nettyConnection = new NettyConnection( channel, pool, clock, metricsListener ); + + metricsListener.afterAcquiredOrCreated( address, acquireEvent ); + return nettyConnection; } ); } @@ -210,7 +206,7 @@ private EventLoopGroup eventLoopGroup() return bootstrap.config().group(); } - private void processAcquisitionError( Throwable error ) + private void processAcquisitionError( BoltServerAddress serverAddress, Throwable error ) { Throwable cause = Futures.completionExceptionCause( error ); if ( cause != null ) @@ -219,6 +215,7 @@ private void processAcquisitionError( Throwable error ) { // NettyChannelPool returns future failed with TimeoutException if acquire operation takes more than // configured time, translate this exception to a prettier one and re-throw + metricsListener.afterTimedOutToAcquireOrCreate( serverAddress ); throw new ClientException( "Unable to acquire connection from the pool within configured maximum time of " + settings.connectionAcquisitionTimeout() + "ms" ); diff --git a/driver/src/main/java/org/neo4j/driver/internal/async/pool/NettyChannelPool.java b/driver/src/main/java/org/neo4j/driver/internal/async/pool/NettyChannelPool.java index e350ae0388..84520f5405 100644 --- a/driver/src/main/java/org/neo4j/driver/internal/async/pool/NettyChannelPool.java +++ b/driver/src/main/java/org/neo4j/driver/internal/async/pool/NettyChannelPool.java @@ -26,7 +26,7 @@ import org.neo4j.driver.internal.BoltServerAddress; import org.neo4j.driver.internal.async.ChannelConnector; -import org.neo4j.driver.internal.metrics.ListenerEvent; +import org.neo4j.driver.internal.metrics.ListenerEvent.ConnectionListenerEvent; import static java.util.Objects.requireNonNull; @@ -60,7 +60,7 @@ public NettyChannelPool( BoltServerAddress address, ChannelConnector connector, @Override protected ChannelFuture connectChannel( Bootstrap bootstrap ) { - ListenerEvent creatingEvent = handler.beforeChannelCreating( address ); + ConnectionListenerEvent creatingEvent = handler.channelCreating( address ); ChannelFuture channelFuture = connector.connect( address, bootstrap ); channelFuture.addListener( future -> { @@ -68,14 +68,13 @@ protected ChannelFuture connectChannel( Bootstrap bootstrap ) { // notify pool handler about a successful connection Channel channel = channelFuture.channel(); - handler.channelCreated( channel ); + handler.channelCreated( channel, creatingEvent ); channel.closeFuture().addListener( closeFuture -> handler.channelClosed( channel ) ); } else { handler.channelFailedToCreate( address ); } - handler.afterChannelCreating( address, creatingEvent ); } ); return channelFuture; } diff --git a/driver/src/main/java/org/neo4j/driver/internal/async/pool/NettyChannelTracker.java b/driver/src/main/java/org/neo4j/driver/internal/async/pool/NettyChannelTracker.java index 11e98cbad0..a560c36343 100644 --- a/driver/src/main/java/org/neo4j/driver/internal/async/pool/NettyChannelTracker.java +++ b/driver/src/main/java/org/neo4j/driver/internal/async/pool/NettyChannelTracker.java @@ -26,7 +26,7 @@ import java.util.concurrent.atomic.AtomicInteger; import org.neo4j.driver.internal.BoltServerAddress; -import org.neo4j.driver.internal.metrics.ListenerEvent; +import org.neo4j.driver.internal.metrics.ListenerEvent.ConnectionListenerEvent; import org.neo4j.driver.internal.metrics.MetricsListener; import org.neo4j.driver.v1.Logger; import org.neo4j.driver.v1.Logging; @@ -65,26 +65,27 @@ public void channelAcquired( Channel channel ) @Override public void channelCreated( Channel channel ) { - log.debug( "Channel %s created", channel ); - incrementInUse( channel ); - metricsListener.afterCreated( serverAddress( channel ) ); + throw new IllegalStateException( "A fatal error happened in this driver as this method should never be called. " + + "Contact the driver developer." ); } - public void channelFailedToCreate( BoltServerAddress address ) + public void channelCreated( Channel channel, ConnectionListenerEvent creatingEvent ) { - metricsListener.afterFailedToCreate( address ); + log.debug( "Channel %s created", channel ); + incrementInUse( channel ); + metricsListener.afterCreated( serverAddress( channel ), creatingEvent ); } - public ListenerEvent beforeChannelCreating( BoltServerAddress address ) + public ConnectionListenerEvent channelCreating( BoltServerAddress address ) { - ListenerEvent creatingEvent = metricsListener.createListenerEvent(); + ConnectionListenerEvent creatingEvent = metricsListener.createConnectionListenerEvent(); metricsListener.beforeCreating( address, creatingEvent ); return creatingEvent; } - public void afterChannelCreating( BoltServerAddress address, ListenerEvent creatingEvent ) + public void channelFailedToCreate( BoltServerAddress address ) { - metricsListener.afterCreating( address, creatingEvent ); + metricsListener.afterFailedToCreate( address ); } public void channelClosed( Channel channel ) diff --git a/driver/src/main/java/org/neo4j/driver/internal/metrics/ConnectionMetricsListener.java b/driver/src/main/java/org/neo4j/driver/internal/metrics/ConnectionMetricsListener.java index a8b55a2787..074b27faa3 100644 --- a/driver/src/main/java/org/neo4j/driver/internal/metrics/ConnectionMetricsListener.java +++ b/driver/src/main/java/org/neo4j/driver/internal/metrics/ConnectionMetricsListener.java @@ -23,7 +23,7 @@ public interface ConnectionMetricsListener { void beforeCreating( ListenerEvent listenerEvent ); - void afterCreating( ListenerEvent listenerEvent ); + void afterCreated( ListenerEvent listenerEvent ); void acquiredOrCreated( ListenerEvent listenerEvent ); diff --git a/driver/src/main/java/org/neo4j/driver/internal/metrics/ConnectionPoolMetricsListener.java b/driver/src/main/java/org/neo4j/driver/internal/metrics/ConnectionPoolMetricsListener.java index 93f414c7f9..a0f2af953d 100644 --- a/driver/src/main/java/org/neo4j/driver/internal/metrics/ConnectionPoolMetricsListener.java +++ b/driver/src/main/java/org/neo4j/driver/internal/metrics/ConnectionPoolMetricsListener.java @@ -18,6 +18,8 @@ */ package org.neo4j.driver.internal.metrics; +import org.neo4j.driver.internal.metrics.ListenerEvent.PoolListenerEvent; + public interface ConnectionPoolMetricsListener { void beforeCreating(); @@ -28,8 +30,10 @@ public interface ConnectionPoolMetricsListener void afterClosed(); - void beforeAcquiringOrCreating( ListenerEvent listenerEvent ); + void beforeAcquiringOrCreating( PoolListenerEvent listenerEvent ); + + void afterAcquiredOrCreated( PoolListenerEvent listenerEvent ); - void afterAcquiringOrCreating( ListenerEvent listenerEvent ); + void afterTimedOutToAcquireOrCreate(); } diff --git a/driver/src/main/java/org/neo4j/driver/internal/metrics/InternalAbstractMetrics.java b/driver/src/main/java/org/neo4j/driver/internal/metrics/InternalAbstractMetrics.java index 959bfe8361..c7eab26c27 100644 --- a/driver/src/main/java/org/neo4j/driver/internal/metrics/InternalAbstractMetrics.java +++ b/driver/src/main/java/org/neo4j/driver/internal/metrics/InternalAbstractMetrics.java @@ -33,56 +33,70 @@ public abstract class InternalAbstractMetrics implements Metrics, MetricsListene { @Override - public void beforeCreating( BoltServerAddress serverAddress, ListenerEvent creatingEvent ) + public void beforeCreating( BoltServerAddress serverAddress, ListenerEvent.ConnectionListenerEvent creatingEvent ) { + } @Override - public void afterCreating( BoltServerAddress serverAddress, ListenerEvent creatingEvent ) + public void afterCreated( BoltServerAddress serverAddress, ListenerEvent.ConnectionListenerEvent creatingEvent ) { + } @Override - public void afterCreated( BoltServerAddress serverAddress ) + public void afterFailedToCreate( BoltServerAddress serverAddress ) { + } @Override - public void afterFailedToCreate( BoltServerAddress serverAddress ) + public void afterClosed( BoltServerAddress serverAddress ) { + } @Override - public void afterClosed( BoltServerAddress serverAddress ) + public void afterTimedOutToAcquireOrCreate( BoltServerAddress serverAddress ) { + } @Override - public void beforeAcquiringOrCreating( BoltServerAddress serverAddress, ListenerEvent acquireEvent ) + public void beforeAcquiringOrCreating( BoltServerAddress serverAddress, ListenerEvent.PoolListenerEvent acquireEvent ) { + } @Override - public void afterAcquiringOrCreating( BoltServerAddress serverAddress, ListenerEvent acquireEvent ) + public void afterAcquiredOrCreated( BoltServerAddress serverAddress, ListenerEvent.PoolListenerEvent acquireEvent ) { + } @Override - public void afterAcquiredOrCreated( BoltServerAddress serverAddress, ListenerEvent inUseEvent ) + public void afterAcquiredOrCreated( BoltServerAddress serverAddress, ListenerEvent.ConnectionListenerEvent inUseEvent ) { + } @Override - public void afterReleased( BoltServerAddress serverAddress, ListenerEvent inUseEvent ) + public void afterReleased( BoltServerAddress serverAddress, ListenerEvent.ConnectionListenerEvent inUseEvent ) { + } @Override - public ListenerEvent createListenerEvent() + public ListenerEvent.PoolListenerEvent createPoolListenerEvent() { return null; } + @Override + public ListenerEvent.ConnectionListenerEvent createConnectionListenerEvent() + { + return null; + } @Override public void addMetrics( BoltServerAddress address, ConnectionPoolImpl connectionPool ) diff --git a/driver/src/main/java/org/neo4j/driver/internal/metrics/InternalConnectionMetrics.java b/driver/src/main/java/org/neo4j/driver/internal/metrics/InternalConnectionMetrics.java index 6db36f3b71..20c9ce66e6 100644 --- a/driver/src/main/java/org/neo4j/driver/internal/metrics/InternalConnectionMetrics.java +++ b/driver/src/main/java/org/neo4j/driver/internal/metrics/InternalConnectionMetrics.java @@ -66,7 +66,7 @@ public void beforeCreating( ListenerEvent connEvent ) } @Override - public void afterCreating( ListenerEvent connEvent ) + public void afterCreated( ListenerEvent connEvent ) { // finished conn creation long elapsed = connEvent.elapsed(); diff --git a/driver/src/main/java/org/neo4j/driver/internal/metrics/InternalConnectionPoolMetrics.java b/driver/src/main/java/org/neo4j/driver/internal/metrics/InternalConnectionPoolMetrics.java index 47130fef65..375ac4056c 100644 --- a/driver/src/main/java/org/neo4j/driver/internal/metrics/InternalConnectionPoolMetrics.java +++ b/driver/src/main/java/org/neo4j/driver/internal/metrics/InternalConnectionPoolMetrics.java @@ -25,6 +25,7 @@ import java.util.concurrent.atomic.AtomicLong; import org.neo4j.driver.internal.BoltServerAddress; +import org.neo4j.driver.internal.metrics.ListenerEvent.PoolListenerEvent; import org.neo4j.driver.internal.metrics.spi.ConnectionPoolMetrics; import org.neo4j.driver.internal.metrics.spi.Histogram; import org.neo4j.driver.internal.metrics.spi.PoolStatus; @@ -38,10 +39,14 @@ public class InternalConnectionPoolMetrics implements ConnectionPoolMetrics, Con private final BoltServerAddress address; private final ConnectionPool pool; - private AtomicLong created = new AtomicLong(); - private AtomicLong closed = new AtomicLong(); - private AtomicInteger creating = new AtomicInteger(); - private AtomicLong failedToCreate = new AtomicLong(); + private final AtomicLong closed = new AtomicLong(); + + private final AtomicInteger creating = new AtomicInteger(); + private final AtomicLong created = new AtomicLong(); + private final AtomicLong failedToCreate = new AtomicLong(); + + private final AtomicLong acquired = new AtomicLong(); + private final AtomicLong timedOutToAcquire = new AtomicLong(); private InternalHistogram acquisitionTimeHistogram; @@ -82,16 +87,24 @@ public void afterClosed() } @Override - public void beforeAcquiringOrCreating( ListenerEvent listenerEvent ) + public void beforeAcquiringOrCreating( PoolListenerEvent listenerEvent ) { listenerEvent.start(); } @Override - public void afterAcquiringOrCreating( ListenerEvent listenerEvent ) + public void afterAcquiredOrCreated( PoolListenerEvent listenerEvent ) { long elapsed = listenerEvent.elapsed(); acquisitionTimeHistogram.recordValue( elapsed ); + + this.acquired.incrementAndGet(); + } + + @Override + public void afterTimedOutToAcquireOrCreate() + { + this.timedOutToAcquire.incrementAndGet(); } @Override @@ -143,12 +156,24 @@ public long failedToCreate() return failedToCreate.get(); } + @Override + public long timedOutToAcquire() + { + return timedOutToAcquire.get(); + } + @Override public long closed() { return closed.get(); } + @Override + public long acquired() + { + return this.acquired.get(); + } + @Override public Histogram acquisitionTimeHistogram() { @@ -158,7 +183,8 @@ public Histogram acquisitionTimeHistogram() @Override public String toString() { - return format( "[created=%s, closed=%s, creating=%s, failedToCreate=%s inUse=%s, idle=%s, poolStatus=%s, acquisitionTimeHistogram=%s]", created(), - closed(), creating(), failedToCreate(), inUse(), idle(), poolStatus(), acquisitionTimeHistogram() ); + return format( "[created=%s, closed=%s, creating=%s, failedToCreate=%s, acquired=%s, " + + "timedOutToAcquire=%s, inUse=%s, idle=%s, poolStatus=%s, acquisitionTimeHistogram=%s]", + created(), closed(), creating(), failedToCreate(), acquired(), timedOutToAcquire(), inUse(), idle(), poolStatus(), acquisitionTimeHistogram() ); } } diff --git a/driver/src/main/java/org/neo4j/driver/internal/metrics/InternalMetrics.java b/driver/src/main/java/org/neo4j/driver/internal/metrics/InternalMetrics.java index 23b83587b7..245d212ce4 100644 --- a/driver/src/main/java/org/neo4j/driver/internal/metrics/InternalMetrics.java +++ b/driver/src/main/java/org/neo4j/driver/internal/metrics/InternalMetrics.java @@ -24,6 +24,8 @@ import org.neo4j.driver.internal.BoltServerAddress; import org.neo4j.driver.internal.async.pool.ConnectionPoolImpl; +import org.neo4j.driver.internal.metrics.ListenerEvent.ConnectionListenerEvent; +import org.neo4j.driver.internal.metrics.ListenerEvent.PoolListenerEvent; import org.neo4j.driver.internal.metrics.spi.ConnectionMetrics; import org.neo4j.driver.internal.metrics.spi.ConnectionPoolMetrics; import org.neo4j.driver.internal.spi.ConnectionPool; @@ -54,22 +56,17 @@ public void addMetrics( BoltServerAddress serverAddress, ConnectionPoolImpl pool } @Override - public void beforeCreating( BoltServerAddress serverAddress, ListenerEvent creatingEvent ) + public void beforeCreating( BoltServerAddress serverAddress, ConnectionListenerEvent creatingEvent ) { poolMetrics( serverAddress ).beforeCreating(); connectionMetrics( serverAddress ).beforeCreating( creatingEvent ); } @Override - public void afterCreating( BoltServerAddress serverAddress, ListenerEvent creatingEvent ) - { - connectionMetrics( serverAddress ).afterCreating( creatingEvent ); - } - - @Override - public void afterCreated( BoltServerAddress serverAddress ) + public void afterCreated( BoltServerAddress serverAddress, ConnectionListenerEvent creatingEvent ) { poolMetrics( serverAddress ).afterCreated(); + connectionMetrics( serverAddress ).afterCreated( creatingEvent ); } @Override @@ -85,31 +82,43 @@ public void afterClosed( BoltServerAddress serverAddress ) } @Override - public void beforeAcquiringOrCreating( BoltServerAddress serverAddress, ListenerEvent listenerEvent ) + public void beforeAcquiringOrCreating( BoltServerAddress serverAddress, PoolListenerEvent listenerEvent ) { poolMetrics( serverAddress ).beforeAcquiringOrCreating( listenerEvent ); } @Override - public void afterAcquiringOrCreating( BoltServerAddress serverAddress, ListenerEvent listenerEvent ) + public void afterAcquiredOrCreated( BoltServerAddress serverAddress, PoolListenerEvent listenerEvent ) { - poolMetrics( serverAddress ).afterAcquiringOrCreating( listenerEvent ); + poolMetrics( serverAddress ).afterAcquiredOrCreated( listenerEvent ); } @Override - public void afterAcquiredOrCreated( BoltServerAddress serverAddress, ListenerEvent inUseEvent ) + public void afterAcquiredOrCreated( BoltServerAddress serverAddress, ConnectionListenerEvent inUseEvent ) { connectionMetrics( serverAddress ).acquiredOrCreated( inUseEvent ); } @Override - public void afterReleased( BoltServerAddress serverAddress, ListenerEvent inUseEvent ) + public void afterReleased( BoltServerAddress serverAddress, ConnectionListenerEvent inUseEvent ) { connectionMetrics( serverAddress ).released( inUseEvent ); } @Override - public ListenerEvent createListenerEvent() + public void afterTimedOutToAcquireOrCreate( BoltServerAddress serverAddress ) + { + poolMetrics( serverAddress ).afterTimedOutToAcquireOrCreate(); + } + + @Override + public PoolListenerEvent createPoolListenerEvent() + { + return new NanoTimeBasedListenerEvent(); + } + + @Override + public ConnectionListenerEvent createConnectionListenerEvent() { return new NanoTimeBasedListenerEvent(); } diff --git a/driver/src/main/java/org/neo4j/driver/internal/metrics/ListenerEvent.java b/driver/src/main/java/org/neo4j/driver/internal/metrics/ListenerEvent.java index 6eece7d235..833129df14 100644 --- a/driver/src/main/java/org/neo4j/driver/internal/metrics/ListenerEvent.java +++ b/driver/src/main/java/org/neo4j/driver/internal/metrics/ListenerEvent.java @@ -18,10 +18,18 @@ */ package org.neo4j.driver.internal.metrics; - public interface ListenerEvent { void start(); + long elapsed(); + + interface PoolListenerEvent extends ListenerEvent + { + } + + interface ConnectionListenerEvent extends ListenerEvent + { + } } diff --git a/driver/src/main/java/org/neo4j/driver/internal/metrics/MetricsListener.java b/driver/src/main/java/org/neo4j/driver/internal/metrics/MetricsListener.java index 41d337b1ac..b1ae89e397 100644 --- a/driver/src/main/java/org/neo4j/driver/internal/metrics/MetricsListener.java +++ b/driver/src/main/java/org/neo4j/driver/internal/metrics/MetricsListener.java @@ -18,9 +18,14 @@ */ package org.neo4j.driver.internal.metrics; +import java.util.concurrent.TimeUnit; + import org.neo4j.driver.internal.BoltServerAddress; import org.neo4j.driver.internal.async.NettyConnection; import org.neo4j.driver.internal.async.pool.ConnectionPoolImpl; +import org.neo4j.driver.internal.metrics.ListenerEvent.ConnectionListenerEvent; +import org.neo4j.driver.internal.metrics.ListenerEvent.PoolListenerEvent; +import org.neo4j.driver.v1.Config; public interface MetricsListener { @@ -29,25 +34,16 @@ public interface MetricsListener * @param serverAddress the server the netty channel binds to. * @param creatingEvent a connection listener event registered when a connection is creating. */ - void beforeCreating( BoltServerAddress serverAddress, ListenerEvent creatingEvent ); - - /** - * After creating a netty channel regardless succeeded or failed. - * @param serverAddress the server the netty channel binds to. - * @param creatingEvent a connection listener event registered when a connection is creating. - */ - void afterCreating( BoltServerAddress serverAddress, ListenerEvent creatingEvent ); + void beforeCreating( BoltServerAddress serverAddress, ConnectionListenerEvent creatingEvent ); /** * After a netty channel is created successfully - * This method will not invoke {@link this#afterCreating(BoltServerAddress, ListenerEvent)} * @param serverAddress the server the netty channel binds to */ - void afterCreated( BoltServerAddress serverAddress ); + void afterCreated( BoltServerAddress serverAddress, ConnectionListenerEvent creatingEvent ); /** * After a netty channel is created with failure - * This method will not invoke {@link this#afterCreating(BoltServerAddress, ListenerEvent)} * @param serverAddress the server the netty channel binds to */ void afterFailedToCreate( BoltServerAddress serverAddress ); @@ -58,36 +54,43 @@ public interface MetricsListener */ void afterClosed( BoltServerAddress serverAddress ); + /** + * After failed to acquire a connection from pool within maximum connection acquisition timeout set by + * {@link Config.ConfigBuilder#withConnectionAcquisitionTimeout(long, TimeUnit)} + * @param serverAddress + */ + void afterTimedOutToAcquireOrCreate( BoltServerAddress serverAddress ); + /** * Before acquiring or creating a new netty channel from pool * @param serverAddress the server the netty channel binds to * @param acquireEvent a pool listener event registered in pool for this acquire event */ - void beforeAcquiringOrCreating( BoltServerAddress serverAddress, ListenerEvent acquireEvent ); + void beforeAcquiringOrCreating( BoltServerAddress serverAddress, PoolListenerEvent acquireEvent ); /** - * After acquiring or creating a new netty channel from pool regardless succeeded or failed + * After acquiring or creating a new netty channel from pool successfully. * @param serverAddress the server the netty channel binds to * @param acquireEvent a pool listener event registered in pool for this acquire event */ - void afterAcquiringOrCreating( BoltServerAddress serverAddress, ListenerEvent acquireEvent ); + void afterAcquiredOrCreated( BoltServerAddress serverAddress, PoolListenerEvent acquireEvent ); /** * After acquiring or creating a new netty channel from pool successfully. - * This method will not invoke {@link this#afterAcquiringOrCreating(BoltServerAddress, ListenerEvent)} * @param serverAddress the server the netty channel binds to * @param inUseEvent a connection listener registered with a {@link NettyConnection} when created */ - void afterAcquiredOrCreated( BoltServerAddress serverAddress, ListenerEvent inUseEvent ); + void afterAcquiredOrCreated( BoltServerAddress serverAddress, ConnectionListenerEvent inUseEvent ); /** * After releasing a netty channel back to pool successfully * @param serverAddress the server the netty channel binds to * @param inUseEvent a connection listener registered with a {@link NettyConnection} when destroyed */ - void afterReleased( BoltServerAddress serverAddress, ListenerEvent inUseEvent ); + void afterReleased( BoltServerAddress serverAddress, ConnectionListenerEvent inUseEvent ); - ListenerEvent createListenerEvent(); + PoolListenerEvent createPoolListenerEvent(); + ConnectionListenerEvent createConnectionListenerEvent(); void addMetrics( BoltServerAddress address, ConnectionPoolImpl connectionPool ); } diff --git a/driver/src/main/java/org/neo4j/driver/internal/metrics/NanoTimeBasedListenerEvent.java b/driver/src/main/java/org/neo4j/driver/internal/metrics/NanoTimeBasedListenerEvent.java index a2c315c4fd..4310f18015 100644 --- a/driver/src/main/java/org/neo4j/driver/internal/metrics/NanoTimeBasedListenerEvent.java +++ b/driver/src/main/java/org/neo4j/driver/internal/metrics/NanoTimeBasedListenerEvent.java @@ -19,7 +19,10 @@ package org.neo4j.driver.internal.metrics; -public class NanoTimeBasedListenerEvent implements ListenerEvent +import org.neo4j.driver.internal.metrics.ListenerEvent.ConnectionListenerEvent; +import org.neo4j.driver.internal.metrics.ListenerEvent.PoolListenerEvent; + +public class NanoTimeBasedListenerEvent implements PoolListenerEvent, ConnectionListenerEvent { private long startNanoTime; diff --git a/driver/src/main/java/org/neo4j/driver/internal/metrics/spi/ConnectionPoolMetrics.java b/driver/src/main/java/org/neo4j/driver/internal/metrics/spi/ConnectionPoolMetrics.java index 40a8afddab..1a5f5b93f7 100644 --- a/driver/src/main/java/org/neo4j/driver/internal/metrics/spi/ConnectionPoolMetrics.java +++ b/driver/src/main/java/org/neo4j/driver/internal/metrics/spi/ConnectionPoolMetrics.java @@ -18,6 +18,10 @@ */ package org.neo4j.driver.internal.metrics.spi; +import java.util.concurrent.TimeUnit; + +import org.neo4j.driver.v1.Config; + public interface ConnectionPoolMetrics { /** @@ -28,51 +32,64 @@ public interface ConnectionPoolMetrics /** * The status of the pool - * @return The status of the pool in a string + * @return The status of the pool. */ PoolStatus poolStatus(); /** - * The amount of connections that is in-use (borrowed out of the pool). + * The amount of channels that are in-use (borrowed out of the pool). * The number is changing up and down from time to time. - * @return The amount of connections that is in-use + * @return The amount of channels that are in-use */ int inUse(); /** - * The amount of connections that is idle (buffered inside the pool). + * The amount of channels that are idle (buffered inside the pool). * The number is changing up and down from time to time. - * @return The amount of connections that is idle. + * @return The amount of channels that are idle. */ int idle(); /** - * The amount of connections that is going to be created. + * The amount of channels that are waiting to be created. * The amount is increased by one when the pool noticed a request to create a new connection. * The amount is decreased by one when the pool noticed a new connection is created regardless successfully or not. * The number is changing up and down from time to time. - * @return The amount of connection that is creating. + * @return The amount of channels that are waiting to be created. */ int creating(); /** - * An increasing-only number to record how many connections have been created by this pool successfully. - * @return The amount of connections have ever been created by this pool. + * An increasing-only number to record how many channels have been created by this pool successfully. + * @return The amount of channels have ever been created by this pool. */ long created(); /** - * An increasing-only number to record how many connections have been failed to create. - * @return The amount of connections have been failed to create by this pool. + * An increasing-only number to record how many channels have been failed to create. + * @return The amount of channels have been failed to create by this pool. */ long failedToCreate(); /** - * An increasing-only number to record how many connections have been closed by this pool. - * @return The amount of connections have been closed by this pool. + * An increasing-only number to record how many channels have been closed by this pool. + * @return The amount of channels have been closed by this pool. */ long closed(); + /** + * An increasing-only number to record how many connections have been acquired from the pool. + * @return The amount of connections that have been acquired from the pool. + */ + long acquired(); + + /** + * An increasing-only number to record how many times that we've failed to acquire a connection from the pool within configured maximum acquisition timeout + * set by {@link Config.ConfigBuilder#withConnectionAcquisitionTimeout(long, TimeUnit)}. + * @return The amount of failures to acquire a connection from the pool within maximum connection acquisition timeout. + */ + long timedOutToAcquire(); + /** * An acquisition time histogram records how long it takes to acquire an connection from this pool. * The connection acquired from the pool could either be a connection idling inside the pool or a connection created by the pool. diff --git a/driver/src/main/java/org/neo4j/driver/internal/metrics/spi/PoolStatus.java b/driver/src/main/java/org/neo4j/driver/internal/metrics/spi/PoolStatus.java index 6fe7099805..9fce59bccd 100644 --- a/driver/src/main/java/org/neo4j/driver/internal/metrics/spi/PoolStatus.java +++ b/driver/src/main/java/org/neo4j/driver/internal/metrics/spi/PoolStatus.java @@ -20,5 +20,18 @@ public enum PoolStatus { - Open, Closed + Open( 0 ), + Closed( 1 ); + + private final int value; + + PoolStatus( int value ) + { + this.value = value; + } + + public int value() + { + return value; + } } diff --git a/driver/src/test/java/org/neo4j/driver/internal/async/pool/ConnectionPoolImplTest.java b/driver/src/test/java/org/neo4j/driver/internal/async/pool/ConnectionPoolImplIT.java similarity index 99% rename from driver/src/test/java/org/neo4j/driver/internal/async/pool/ConnectionPoolImplTest.java rename to driver/src/test/java/org/neo4j/driver/internal/async/pool/ConnectionPoolImplIT.java index 3f4f9dde66..ee280d4d1f 100644 --- a/driver/src/test/java/org/neo4j/driver/internal/async/pool/ConnectionPoolImplTest.java +++ b/driver/src/test/java/org/neo4j/driver/internal/async/pool/ConnectionPoolImplIT.java @@ -62,7 +62,7 @@ import static org.neo4j.driver.internal.metrics.InternalAbstractMetrics.DEV_NULL_METRICS; import static org.neo4j.driver.v1.util.TestUtil.await; -public class ConnectionPoolImplTest +public class ConnectionPoolImplIT { private static final BoltServerAddress ADDRESS_1 = new BoltServerAddress( "server:1" ); private static final BoltServerAddress ADDRESS_2 = new BoltServerAddress( "server:2" ); diff --git a/driver/src/test/java/org/neo4j/driver/internal/async/pool/NettyChannelPoolTest.java b/driver/src/test/java/org/neo4j/driver/internal/async/pool/NettyChannelPoolIT.java similarity index 97% rename from driver/src/test/java/org/neo4j/driver/internal/async/pool/NettyChannelPoolTest.java rename to driver/src/test/java/org/neo4j/driver/internal/async/pool/NettyChannelPoolIT.java index 93ce7774c7..6648131e99 100644 --- a/driver/src/test/java/org/neo4j/driver/internal/async/pool/NettyChannelPoolTest.java +++ b/driver/src/test/java/org/neo4j/driver/internal/async/pool/NettyChannelPoolIT.java @@ -47,12 +47,14 @@ import org.neo4j.driver.v1.util.TestNeo4j; import static org.hamcrest.Matchers.instanceOf; +import static org.hamcrest.Matchers.is; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertThat; import static org.junit.Assert.assertTrue; import static org.junit.Assert.fail; import static org.mockito.Matchers.any; +import static org.mockito.Matchers.argThat; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.never; import static org.mockito.Mockito.verify; @@ -60,7 +62,7 @@ import static org.neo4j.driver.internal.metrics.InternalAbstractMetrics.DEV_NULL_METRICS; import static org.neo4j.driver.v1.Values.value; -public class NettyChannelPoolTest +public class NettyChannelPoolIT { @Rule public final TestNeo4j neo4j = new TestNeo4j(); @@ -100,7 +102,7 @@ public void shouldAcquireAndReleaseWithCorrectCredentials() throws Exception assertTrue( acquireFuture.isSuccess() ); Channel channel = acquireFuture.getNow(); assertNotNull( channel ); - verify( poolHandler ).channelCreated( channel ); + verify( poolHandler ).channelCreated( argThat( is( channel ) ), any() ); verify( poolHandler, never() ).channelReleased( channel ); Future releaseFuture = pool.release( channel ); diff --git a/driver/src/test/java/org/neo4j/driver/internal/async/pool/NettyChannelTrackerTest.java b/driver/src/test/java/org/neo4j/driver/internal/async/pool/NettyChannelTrackerTest.java index 122478543e..51aaa35102 100644 --- a/driver/src/test/java/org/neo4j/driver/internal/async/pool/NettyChannelTrackerTest.java +++ b/driver/src/test/java/org/neo4j/driver/internal/async/pool/NettyChannelTrackerTest.java @@ -44,7 +44,7 @@ public void shouldIncrementInUseCountWhenChannelCreated() assertEquals( 0, tracker.inUseChannelCount( address ) ); assertEquals( 0, tracker.idleChannelCount( address ) ); - tracker.channelCreated( channel ); + tracker.channelCreated( channel, null ); assertEquals( 1, tracker.inUseChannelCount( address ) ); assertEquals( 0, tracker.idleChannelCount( address ) ); } @@ -56,7 +56,7 @@ public void shouldIncrementInUseCountWhenChannelAcquired() assertEquals( 0, tracker.inUseChannelCount( address ) ); assertEquals( 0, tracker.idleChannelCount( address ) ); - tracker.channelCreated( channel ); + tracker.channelCreated( channel, null ); assertEquals( 1, tracker.inUseChannelCount( address ) ); assertEquals( 0, tracker.idleChannelCount( address ) ); @@ -77,11 +77,11 @@ public void shouldIncrementInuseCountForAddress() Channel channel3 = newChannel(); assertEquals( 0, tracker.inUseChannelCount( address ) ); - tracker.channelCreated( channel1 ); + tracker.channelCreated( channel1, null ); assertEquals( 1, tracker.inUseChannelCount( address ) ); - tracker.channelCreated( channel2 ); + tracker.channelCreated( channel2, null ); assertEquals( 2, tracker.inUseChannelCount( address ) ); - tracker.channelCreated( channel3 ); + tracker.channelCreated( channel3, null ); assertEquals( 3, tracker.inUseChannelCount( address ) ); assertEquals( 0, tracker.idleChannelCount( address ) ); } @@ -93,9 +93,9 @@ public void shouldDecrementCountForAddress() Channel channel2 = newChannel(); Channel channel3 = newChannel(); - tracker.channelCreated( channel1 ); - tracker.channelCreated( channel2 ); - tracker.channelCreated( channel3 ); + tracker.channelCreated( channel1, null ); + tracker.channelCreated( channel2, null ); + tracker.channelCreated( channel3, null ); assertEquals( 3, tracker.inUseChannelCount( address ) ); assertEquals( 0, tracker.idleChannelCount( address ) ); From 42cfee87414c8db28c4557f3f440612117bbb701 Mon Sep 17 00:00:00 2001 From: Zhen Date: Thu, 1 Mar 2018 15:27:22 +0100 Subject: [PATCH 2/4] Added acquiring to describe how many application threads are waiting for a connection from the pool. Fixed the bug where the pool status was not showing the correct status of each small pool. --- .../async/pool/ConnectionPoolImpl.java | 21 ++++++++---- .../ConnectionPoolMetricsListener.java | 2 ++ .../metrics/InternalAbstractMetrics.java | 6 ++++ .../InternalConnectionPoolMetrics.java | 21 ++++++++++-- .../internal/metrics/InternalMetrics.java | 6 ++++ .../internal/metrics/MetricsListener.java | 6 ++++ .../metrics/spi/ConnectionPoolMetrics.java | 32 +++++++++++-------- .../driver/internal/spi/ConnectionPool.java | 2 +- .../util/FailingConnectionDriverFactory.java | 4 +-- 9 files changed, 74 insertions(+), 26 deletions(-) diff --git a/driver/src/main/java/org/neo4j/driver/internal/async/pool/ConnectionPoolImpl.java b/driver/src/main/java/org/neo4j/driver/internal/async/pool/ConnectionPoolImpl.java index 9d7dff9480..692474bfe1 100644 --- a/driver/src/main/java/org/neo4j/driver/internal/async/pool/ConnectionPoolImpl.java +++ b/driver/src/main/java/org/neo4j/driver/internal/async/pool/ConnectionPoolImpl.java @@ -93,12 +93,19 @@ public CompletionStage acquire( BoltServerAddress address ) return Futures.asCompletionStage( connectionFuture ).handle( ( channel, error ) -> { - processAcquisitionError( address, error ); - assertNotClosed( address, channel, pool ); - NettyConnection nettyConnection = new NettyConnection( channel, pool, clock, metricsListener ); + try + { + processAcquisitionError( address, error ); + assertNotClosed( address, channel, pool ); + NettyConnection nettyConnection = new NettyConnection( channel, pool, clock, metricsListener ); - metricsListener.afterAcquiredOrCreated( address, acquireEvent ); - return nettyConnection; + metricsListener.afterAcquiredOrCreated( address, acquireEvent ); + return nettyConnection; + } + finally + { + metricsListener.afterAcquiringOrCreating( address ); + } } ); } @@ -167,9 +174,9 @@ public CompletionStage close() } @Override - public boolean isOpen() + public boolean isOpen( BoltServerAddress address ) { - return !closed.get(); + return pools.containsKey( address ); } private ChannelPool getOrCreatePool( BoltServerAddress address ) diff --git a/driver/src/main/java/org/neo4j/driver/internal/metrics/ConnectionPoolMetricsListener.java b/driver/src/main/java/org/neo4j/driver/internal/metrics/ConnectionPoolMetricsListener.java index a0f2af953d..9cc92a2051 100644 --- a/driver/src/main/java/org/neo4j/driver/internal/metrics/ConnectionPoolMetricsListener.java +++ b/driver/src/main/java/org/neo4j/driver/internal/metrics/ConnectionPoolMetricsListener.java @@ -32,6 +32,8 @@ public interface ConnectionPoolMetricsListener void beforeAcquiringOrCreating( PoolListenerEvent listenerEvent ); + void afterAcquiringOrCreating(); + void afterAcquiredOrCreated( PoolListenerEvent listenerEvent ); void afterTimedOutToAcquireOrCreate(); diff --git a/driver/src/main/java/org/neo4j/driver/internal/metrics/InternalAbstractMetrics.java b/driver/src/main/java/org/neo4j/driver/internal/metrics/InternalAbstractMetrics.java index c7eab26c27..80a67b0df7 100644 --- a/driver/src/main/java/org/neo4j/driver/internal/metrics/InternalAbstractMetrics.java +++ b/driver/src/main/java/org/neo4j/driver/internal/metrics/InternalAbstractMetrics.java @@ -68,6 +68,12 @@ public void beforeAcquiringOrCreating( BoltServerAddress serverAddress, Listener } + @Override + public void afterAcquiringOrCreating( BoltServerAddress serverAddress ) + { + + } + @Override public void afterAcquiredOrCreated( BoltServerAddress serverAddress, ListenerEvent.PoolListenerEvent acquireEvent ) { diff --git a/driver/src/main/java/org/neo4j/driver/internal/metrics/InternalConnectionPoolMetrics.java b/driver/src/main/java/org/neo4j/driver/internal/metrics/InternalConnectionPoolMetrics.java index 375ac4056c..da6db67365 100644 --- a/driver/src/main/java/org/neo4j/driver/internal/metrics/InternalConnectionPoolMetrics.java +++ b/driver/src/main/java/org/neo4j/driver/internal/metrics/InternalConnectionPoolMetrics.java @@ -45,6 +45,7 @@ public class InternalConnectionPoolMetrics implements ConnectionPoolMetrics, Con private final AtomicLong created = new AtomicLong(); private final AtomicLong failedToCreate = new AtomicLong(); + private final AtomicInteger acquiring = new AtomicInteger(); private final AtomicLong acquired = new AtomicLong(); private final AtomicLong timedOutToAcquire = new AtomicLong(); @@ -90,6 +91,13 @@ public void afterClosed() public void beforeAcquiringOrCreating( PoolListenerEvent listenerEvent ) { listenerEvent.start(); + acquiring.incrementAndGet(); + } + + @Override + public void afterAcquiringOrCreating() + { + acquiring.decrementAndGet(); } @Override @@ -116,7 +124,7 @@ public String uniqueName() @Override public PoolStatus poolStatus() { - if ( pool.isOpen() ) + if ( pool.isOpen( address ) ) { return PoolStatus.Open; } @@ -168,6 +176,12 @@ public long closed() return closed.get(); } + @Override + public int acquiring() + { + return acquiring.get(); + } + @Override public long acquired() { @@ -183,8 +197,9 @@ public Histogram acquisitionTimeHistogram() @Override public String toString() { - return format( "[created=%s, closed=%s, creating=%s, failedToCreate=%s, acquired=%s, " + + return format( "[created=%s, closed=%s, creating=%s, failedToCreate=%s, acquiring=%s, acquired=%s, " + "timedOutToAcquire=%s, inUse=%s, idle=%s, poolStatus=%s, acquisitionTimeHistogram=%s]", - created(), closed(), creating(), failedToCreate(), acquired(), timedOutToAcquire(), inUse(), idle(), poolStatus(), acquisitionTimeHistogram() ); + created(), closed(), creating(), failedToCreate(), acquiring(), acquired(), + timedOutToAcquire(), inUse(), idle(), poolStatus(), acquisitionTimeHistogram() ); } } diff --git a/driver/src/main/java/org/neo4j/driver/internal/metrics/InternalMetrics.java b/driver/src/main/java/org/neo4j/driver/internal/metrics/InternalMetrics.java index 245d212ce4..33c50e165d 100644 --- a/driver/src/main/java/org/neo4j/driver/internal/metrics/InternalMetrics.java +++ b/driver/src/main/java/org/neo4j/driver/internal/metrics/InternalMetrics.java @@ -87,6 +87,12 @@ public void beforeAcquiringOrCreating( BoltServerAddress serverAddress, PoolList poolMetrics( serverAddress ).beforeAcquiringOrCreating( listenerEvent ); } + @Override + public void afterAcquiringOrCreating( BoltServerAddress serverAddress ) + { + poolMetrics( serverAddress ).afterAcquiringOrCreating(); + } + @Override public void afterAcquiredOrCreated( BoltServerAddress serverAddress, PoolListenerEvent listenerEvent ) { diff --git a/driver/src/main/java/org/neo4j/driver/internal/metrics/MetricsListener.java b/driver/src/main/java/org/neo4j/driver/internal/metrics/MetricsListener.java index b1ae89e397..7e3c31c874 100644 --- a/driver/src/main/java/org/neo4j/driver/internal/metrics/MetricsListener.java +++ b/driver/src/main/java/org/neo4j/driver/internal/metrics/MetricsListener.java @@ -68,6 +68,12 @@ public interface MetricsListener */ void beforeAcquiringOrCreating( BoltServerAddress serverAddress, PoolListenerEvent acquireEvent ); + /** + * After acquiring or creating a new netty channel from pool regardless successfully or not. + * @param serverAddress the server the netty channel binds to + */ + void afterAcquiringOrCreating( BoltServerAddress serverAddress ); + /** * After acquiring or creating a new netty channel from pool successfully. * @param serverAddress the server the netty channel binds to diff --git a/driver/src/main/java/org/neo4j/driver/internal/metrics/spi/ConnectionPoolMetrics.java b/driver/src/main/java/org/neo4j/driver/internal/metrics/spi/ConnectionPoolMetrics.java index 1a5f5b93f7..0d3e4b7c90 100644 --- a/driver/src/main/java/org/neo4j/driver/internal/metrics/spi/ConnectionPoolMetrics.java +++ b/driver/src/main/java/org/neo4j/driver/internal/metrics/spi/ConnectionPoolMetrics.java @@ -31,30 +31,27 @@ public interface ConnectionPoolMetrics String uniqueName(); /** - * The status of the pool + * The status of the pool. * @return The status of the pool. */ PoolStatus poolStatus(); /** - * The amount of channels that are in-use (borrowed out of the pool). - * The number is changing up and down from time to time. - * @return The amount of channels that are in-use + * The amount of channels that are currently in-use (borrowed out of the pool). + * @return The amount of channels that are currently in-use */ int inUse(); /** - * The amount of channels that are idle (buffered inside the pool). - * The number is changing up and down from time to time. - * @return The amount of channels that are idle. + * The amount of channels that are currently idle (buffered inside the pool). + * @return The amount of channels that are currently idle. */ int idle(); /** - * The amount of channels that are waiting to be created. - * The amount is increased by one when the pool noticed a request to create a new connection. - * The amount is decreased by one when the pool noticed a new connection is created regardless successfully or not. - * The number is changing up and down from time to time. + * The amount of channels that are currently waiting to be created. + * The amount is increased by one when the pool noticed a request to create a new channel. + * The amount is decreased by one when the pool noticed a new channel is created successfully or failed to create. * @return The amount of channels that are waiting to be created. */ int creating(); @@ -78,7 +75,15 @@ public interface ConnectionPoolMetrics long closed(); /** - * An increasing-only number to record how many connections have been acquired from the pool. + * The current count of application requests to wait for acquiring a connection from the pool. + * The reason to wait could be waiting for creating a new channel, or waiting for a channel to be free by application when the pool is full. + * @return The current amount of application request to wait for acquiring a connection from the pool. + */ + int acquiring(); + + /** + * An increasing-only number to record how many connections have been acquired from the pool + * The connections acquired could hold either a newly created channel or a reused channel from the pool. * @return The amount of connections that have been acquired from the pool. */ long acquired(); @@ -86,13 +91,14 @@ public interface ConnectionPoolMetrics /** * An increasing-only number to record how many times that we've failed to acquire a connection from the pool within configured maximum acquisition timeout * set by {@link Config.ConfigBuilder#withConnectionAcquisitionTimeout(long, TimeUnit)}. + * The connection acquired could hold either a newly created channel or a reused channel from the pool. * @return The amount of failures to acquire a connection from the pool within maximum connection acquisition timeout. */ long timedOutToAcquire(); /** * An acquisition time histogram records how long it takes to acquire an connection from this pool. - * The connection acquired from the pool could either be a connection idling inside the pool or a connection created by the pool. + * The connection acquired from the pool could contain either a channel idling inside the pool or a channel created by the pool. * @return The acquisition time histogram. */ Histogram acquisitionTimeHistogram(); diff --git a/driver/src/main/java/org/neo4j/driver/internal/spi/ConnectionPool.java b/driver/src/main/java/org/neo4j/driver/internal/spi/ConnectionPool.java index 73c7f6d86b..2ffb40c402 100644 --- a/driver/src/main/java/org/neo4j/driver/internal/spi/ConnectionPool.java +++ b/driver/src/main/java/org/neo4j/driver/internal/spi/ConnectionPool.java @@ -35,5 +35,5 @@ public interface ConnectionPool CompletionStage close(); - boolean isOpen(); + boolean isOpen( BoltServerAddress address ); } diff --git a/driver/src/test/java/org/neo4j/driver/internal/util/FailingConnectionDriverFactory.java b/driver/src/test/java/org/neo4j/driver/internal/util/FailingConnectionDriverFactory.java index cdb4e27305..31dbd58aa3 100644 --- a/driver/src/test/java/org/neo4j/driver/internal/util/FailingConnectionDriverFactory.java +++ b/driver/src/test/java/org/neo4j/driver/internal/util/FailingConnectionDriverFactory.java @@ -95,9 +95,9 @@ public CompletionStage close() } @Override - public boolean isOpen() + public boolean isOpen( BoltServerAddress address ) { - return delegate.isOpen(); + return delegate.isOpen( address ); } } From 561d7f2db329f4945dfc00058d8ce40cc143c082 Mon Sep 17 00:00:00 2001 From: Zhen Date: Thu, 1 Mar 2018 16:27:01 +0100 Subject: [PATCH 3/4] Fix enum name --- .../internal/metrics/InternalConnectionPoolMetrics.java | 4 ++-- .../org/neo4j/driver/internal/metrics/spi/PoolStatus.java | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/driver/src/main/java/org/neo4j/driver/internal/metrics/InternalConnectionPoolMetrics.java b/driver/src/main/java/org/neo4j/driver/internal/metrics/InternalConnectionPoolMetrics.java index da6db67365..515c427bf2 100644 --- a/driver/src/main/java/org/neo4j/driver/internal/metrics/InternalConnectionPoolMetrics.java +++ b/driver/src/main/java/org/neo4j/driver/internal/metrics/InternalConnectionPoolMetrics.java @@ -126,11 +126,11 @@ public PoolStatus poolStatus() { if ( pool.isOpen( address ) ) { - return PoolStatus.Open; + return PoolStatus.OPEN; } else { - return PoolStatus.Closed; + return PoolStatus.CLOSED; } } diff --git a/driver/src/main/java/org/neo4j/driver/internal/metrics/spi/PoolStatus.java b/driver/src/main/java/org/neo4j/driver/internal/metrics/spi/PoolStatus.java index 9fce59bccd..2a32d9242d 100644 --- a/driver/src/main/java/org/neo4j/driver/internal/metrics/spi/PoolStatus.java +++ b/driver/src/main/java/org/neo4j/driver/internal/metrics/spi/PoolStatus.java @@ -20,8 +20,8 @@ public enum PoolStatus { - Open( 0 ), - Closed( 1 ); + OPEN( 0 ), + CLOSED( 1 ); private final int value; From c889fa1aac67b30e077af32836379f927e64332f Mon Sep 17 00:00:00 2001 From: Zhen Date: Thu, 1 Mar 2018 18:04:55 +0100 Subject: [PATCH 4/4] Removed two not used EventListeners Change to unmodified map to return pool and connection metrics to users --- .../internal/async/NettyConnection.java | 12 ++++----- .../async/pool/ConnectionPoolImpl.java | 2 +- .../internal/async/pool/NettyChannelPool.java | 4 +-- .../async/pool/NettyChannelTracker.java | 11 ++++---- .../ConnectionPoolMetricsListener.java | 6 ++--- .../metrics/InternalAbstractMetrics.java | 20 +++++--------- .../InternalConnectionPoolMetrics.java | 5 ++-- .../internal/metrics/InternalMetrics.java | 27 +++++++------------ .../internal/metrics/ListenerEvent.java | 9 ------- .../internal/metrics/MetricsListener.java | 17 +++++------- .../metrics/NanoTimeBasedListenerEvent.java | 5 +--- 11 files changed, 43 insertions(+), 75 deletions(-) diff --git a/driver/src/main/java/org/neo4j/driver/internal/async/NettyConnection.java b/driver/src/main/java/org/neo4j/driver/internal/async/NettyConnection.java index e1ce673b40..9860a9eb3b 100644 --- a/driver/src/main/java/org/neo4j/driver/internal/async/NettyConnection.java +++ b/driver/src/main/java/org/neo4j/driver/internal/async/NettyConnection.java @@ -34,7 +34,7 @@ import org.neo4j.driver.internal.messaging.PullAllMessage; import org.neo4j.driver.internal.messaging.ResetMessage; import org.neo4j.driver.internal.messaging.RunMessage; -import org.neo4j.driver.internal.metrics.ListenerEvent.ConnectionListenerEvent; +import org.neo4j.driver.internal.metrics.ListenerEvent; import org.neo4j.driver.internal.metrics.MetricsListener; import org.neo4j.driver.internal.spi.Connection; import org.neo4j.driver.internal.spi.ResponseHandler; @@ -57,7 +57,7 @@ public class NettyConnection implements Connection private final AtomicReference status = new AtomicReference<>( Status.OPEN ); private final MetricsListener metricsListener; - private final ConnectionListenerEvent inUseEvent; + private final ListenerEvent inUseEvent; public NettyConnection( Channel channel, ChannelPool channelPool, Clock clock, MetricsListener metricsListener ) { @@ -69,8 +69,8 @@ public NettyConnection( Channel channel, ChannelPool channelPool, Clock clock, M this.releaseFuture = new CompletableFuture<>(); this.clock = clock; this.metricsListener = metricsListener; - this.inUseEvent = metricsListener.createConnectionListenerEvent(); - metricsListener.afterAcquiredOrCreated( this.serverAddress, this.inUseEvent ); + this.inUseEvent = metricsListener.createListenerEvent(); + metricsListener.afterConnectionCreated( this.serverAddress, this.inUseEvent ); } @Override @@ -131,11 +131,11 @@ public CompletionStage release() { if ( status.compareAndSet( Status.OPEN, Status.RELEASED ) ) { - metricsListener.afterReleased( this.serverAddress, this.inUseEvent ); ChannelReleasingResetResponseHandler handler = new ChannelReleasingResetResponseHandler( channel, channelPool, messageDispatcher, clock, releaseFuture ); writeResetMessageIfNeeded( handler, false ); + metricsListener.afterConnectionReleased( this.serverAddress, this.inUseEvent ); } return releaseFuture; } @@ -145,11 +145,11 @@ public void terminateAndRelease( String reason ) { if ( status.compareAndSet( Status.OPEN, Status.TERMINATED ) ) { - metricsListener.afterReleased( this.serverAddress, this.inUseEvent ); setTerminationReason( channel, reason ); channel.close(); channelPool.release( channel ); releaseFuture.complete( null ); + metricsListener.afterConnectionReleased( this.serverAddress, this.inUseEvent ); } } diff --git a/driver/src/main/java/org/neo4j/driver/internal/async/pool/ConnectionPoolImpl.java b/driver/src/main/java/org/neo4j/driver/internal/async/pool/ConnectionPoolImpl.java index 692474bfe1..7dea354201 100644 --- a/driver/src/main/java/org/neo4j/driver/internal/async/pool/ConnectionPoolImpl.java +++ b/driver/src/main/java/org/neo4j/driver/internal/async/pool/ConnectionPoolImpl.java @@ -87,7 +87,7 @@ public CompletionStage acquire( BoltServerAddress address ) assertNotClosed(); ChannelPool pool = getOrCreatePool( address ); - ListenerEvent.PoolListenerEvent acquireEvent = metricsListener.createPoolListenerEvent(); + ListenerEvent acquireEvent = metricsListener.createListenerEvent(); metricsListener.beforeAcquiringOrCreating( address, acquireEvent ); Future connectionFuture = pool.acquire(); diff --git a/driver/src/main/java/org/neo4j/driver/internal/async/pool/NettyChannelPool.java b/driver/src/main/java/org/neo4j/driver/internal/async/pool/NettyChannelPool.java index 84520f5405..c7475d6f46 100644 --- a/driver/src/main/java/org/neo4j/driver/internal/async/pool/NettyChannelPool.java +++ b/driver/src/main/java/org/neo4j/driver/internal/async/pool/NettyChannelPool.java @@ -26,7 +26,7 @@ import org.neo4j.driver.internal.BoltServerAddress; import org.neo4j.driver.internal.async.ChannelConnector; -import org.neo4j.driver.internal.metrics.ListenerEvent.ConnectionListenerEvent; +import org.neo4j.driver.internal.metrics.ListenerEvent; import static java.util.Objects.requireNonNull; @@ -60,7 +60,7 @@ public NettyChannelPool( BoltServerAddress address, ChannelConnector connector, @Override protected ChannelFuture connectChannel( Bootstrap bootstrap ) { - ConnectionListenerEvent creatingEvent = handler.channelCreating( address ); + ListenerEvent creatingEvent = handler.channelCreating( address ); ChannelFuture channelFuture = connector.connect( address, bootstrap ); channelFuture.addListener( future -> { diff --git a/driver/src/main/java/org/neo4j/driver/internal/async/pool/NettyChannelTracker.java b/driver/src/main/java/org/neo4j/driver/internal/async/pool/NettyChannelTracker.java index a560c36343..c4ffaef821 100644 --- a/driver/src/main/java/org/neo4j/driver/internal/async/pool/NettyChannelTracker.java +++ b/driver/src/main/java/org/neo4j/driver/internal/async/pool/NettyChannelTracker.java @@ -26,7 +26,7 @@ import java.util.concurrent.atomic.AtomicInteger; import org.neo4j.driver.internal.BoltServerAddress; -import org.neo4j.driver.internal.metrics.ListenerEvent.ConnectionListenerEvent; +import org.neo4j.driver.internal.metrics.ListenerEvent; import org.neo4j.driver.internal.metrics.MetricsListener; import org.neo4j.driver.v1.Logger; import org.neo4j.driver.v1.Logging; @@ -65,20 +65,19 @@ public void channelAcquired( Channel channel ) @Override public void channelCreated( Channel channel ) { - throw new IllegalStateException( "A fatal error happened in this driver as this method should never be called. " + - "Contact the driver developer." ); + throw new IllegalStateException( "Untraceable channel created." ); } - public void channelCreated( Channel channel, ConnectionListenerEvent creatingEvent ) + public void channelCreated( Channel channel, ListenerEvent creatingEvent ) { log.debug( "Channel %s created", channel ); incrementInUse( channel ); metricsListener.afterCreated( serverAddress( channel ), creatingEvent ); } - public ConnectionListenerEvent channelCreating( BoltServerAddress address ) + public ListenerEvent channelCreating( BoltServerAddress address ) { - ConnectionListenerEvent creatingEvent = metricsListener.createConnectionListenerEvent(); + ListenerEvent creatingEvent = metricsListener.createListenerEvent(); metricsListener.beforeCreating( address, creatingEvent ); return creatingEvent; } diff --git a/driver/src/main/java/org/neo4j/driver/internal/metrics/ConnectionPoolMetricsListener.java b/driver/src/main/java/org/neo4j/driver/internal/metrics/ConnectionPoolMetricsListener.java index 9cc92a2051..91cac466ce 100644 --- a/driver/src/main/java/org/neo4j/driver/internal/metrics/ConnectionPoolMetricsListener.java +++ b/driver/src/main/java/org/neo4j/driver/internal/metrics/ConnectionPoolMetricsListener.java @@ -18,8 +18,6 @@ */ package org.neo4j.driver.internal.metrics; -import org.neo4j.driver.internal.metrics.ListenerEvent.PoolListenerEvent; - public interface ConnectionPoolMetricsListener { void beforeCreating(); @@ -30,11 +28,11 @@ public interface ConnectionPoolMetricsListener void afterClosed(); - void beforeAcquiringOrCreating( PoolListenerEvent listenerEvent ); + void beforeAcquiringOrCreating( ListenerEvent listenerEvent ); void afterAcquiringOrCreating(); - void afterAcquiredOrCreated( PoolListenerEvent listenerEvent ); + void afterAcquiredOrCreated( ListenerEvent listenerEvent ); void afterTimedOutToAcquireOrCreate(); } diff --git a/driver/src/main/java/org/neo4j/driver/internal/metrics/InternalAbstractMetrics.java b/driver/src/main/java/org/neo4j/driver/internal/metrics/InternalAbstractMetrics.java index 80a67b0df7..8a74df91de 100644 --- a/driver/src/main/java/org/neo4j/driver/internal/metrics/InternalAbstractMetrics.java +++ b/driver/src/main/java/org/neo4j/driver/internal/metrics/InternalAbstractMetrics.java @@ -33,13 +33,13 @@ public abstract class InternalAbstractMetrics implements Metrics, MetricsListene { @Override - public void beforeCreating( BoltServerAddress serverAddress, ListenerEvent.ConnectionListenerEvent creatingEvent ) + public void beforeCreating( BoltServerAddress serverAddress, ListenerEvent creatingEvent ) { } @Override - public void afterCreated( BoltServerAddress serverAddress, ListenerEvent.ConnectionListenerEvent creatingEvent ) + public void afterCreated( BoltServerAddress serverAddress, ListenerEvent creatingEvent ) { } @@ -63,7 +63,7 @@ public void afterTimedOutToAcquireOrCreate( BoltServerAddress serverAddress ) } @Override - public void beforeAcquiringOrCreating( BoltServerAddress serverAddress, ListenerEvent.PoolListenerEvent acquireEvent ) + public void beforeAcquiringOrCreating( BoltServerAddress serverAddress, ListenerEvent acquireEvent ) { } @@ -75,31 +75,25 @@ public void afterAcquiringOrCreating( BoltServerAddress serverAddress ) } @Override - public void afterAcquiredOrCreated( BoltServerAddress serverAddress, ListenerEvent.PoolListenerEvent acquireEvent ) + public void afterAcquiredOrCreated( BoltServerAddress serverAddress, ListenerEvent acquireEvent ) { } @Override - public void afterAcquiredOrCreated( BoltServerAddress serverAddress, ListenerEvent.ConnectionListenerEvent inUseEvent ) + public void afterConnectionCreated( BoltServerAddress serverAddress, ListenerEvent inUseEvent ) { } @Override - public void afterReleased( BoltServerAddress serverAddress, ListenerEvent.ConnectionListenerEvent inUseEvent ) + public void afterConnectionReleased( BoltServerAddress serverAddress, ListenerEvent inUseEvent ) { } @Override - public ListenerEvent.PoolListenerEvent createPoolListenerEvent() - { - return null; - } - - @Override - public ListenerEvent.ConnectionListenerEvent createConnectionListenerEvent() + public ListenerEvent createListenerEvent() { return null; } diff --git a/driver/src/main/java/org/neo4j/driver/internal/metrics/InternalConnectionPoolMetrics.java b/driver/src/main/java/org/neo4j/driver/internal/metrics/InternalConnectionPoolMetrics.java index 515c427bf2..207ef8f41b 100644 --- a/driver/src/main/java/org/neo4j/driver/internal/metrics/InternalConnectionPoolMetrics.java +++ b/driver/src/main/java/org/neo4j/driver/internal/metrics/InternalConnectionPoolMetrics.java @@ -25,7 +25,6 @@ import java.util.concurrent.atomic.AtomicLong; import org.neo4j.driver.internal.BoltServerAddress; -import org.neo4j.driver.internal.metrics.ListenerEvent.PoolListenerEvent; import org.neo4j.driver.internal.metrics.spi.ConnectionPoolMetrics; import org.neo4j.driver.internal.metrics.spi.Histogram; import org.neo4j.driver.internal.metrics.spi.PoolStatus; @@ -88,7 +87,7 @@ public void afterClosed() } @Override - public void beforeAcquiringOrCreating( PoolListenerEvent listenerEvent ) + public void beforeAcquiringOrCreating( ListenerEvent listenerEvent ) { listenerEvent.start(); acquiring.incrementAndGet(); @@ -101,7 +100,7 @@ public void afterAcquiringOrCreating() } @Override - public void afterAcquiredOrCreated( PoolListenerEvent listenerEvent ) + public void afterAcquiredOrCreated( ListenerEvent listenerEvent ) { long elapsed = listenerEvent.elapsed(); acquisitionTimeHistogram.recordValue( elapsed ); diff --git a/driver/src/main/java/org/neo4j/driver/internal/metrics/InternalMetrics.java b/driver/src/main/java/org/neo4j/driver/internal/metrics/InternalMetrics.java index 33c50e165d..46c67b4914 100644 --- a/driver/src/main/java/org/neo4j/driver/internal/metrics/InternalMetrics.java +++ b/driver/src/main/java/org/neo4j/driver/internal/metrics/InternalMetrics.java @@ -24,8 +24,6 @@ import org.neo4j.driver.internal.BoltServerAddress; import org.neo4j.driver.internal.async.pool.ConnectionPoolImpl; -import org.neo4j.driver.internal.metrics.ListenerEvent.ConnectionListenerEvent; -import org.neo4j.driver.internal.metrics.ListenerEvent.PoolListenerEvent; import org.neo4j.driver.internal.metrics.spi.ConnectionMetrics; import org.neo4j.driver.internal.metrics.spi.ConnectionPoolMetrics; import org.neo4j.driver.internal.spi.ConnectionPool; @@ -33,6 +31,7 @@ import org.neo4j.driver.v1.exceptions.ClientException; import static java.lang.String.format; +import static java.util.Collections.unmodifiableMap; public class InternalMetrics extends InternalAbstractMetrics { @@ -56,14 +55,14 @@ public void addMetrics( BoltServerAddress serverAddress, ConnectionPoolImpl pool } @Override - public void beforeCreating( BoltServerAddress serverAddress, ConnectionListenerEvent creatingEvent ) + public void beforeCreating( BoltServerAddress serverAddress, ListenerEvent creatingEvent ) { poolMetrics( serverAddress ).beforeCreating(); connectionMetrics( serverAddress ).beforeCreating( creatingEvent ); } @Override - public void afterCreated( BoltServerAddress serverAddress, ConnectionListenerEvent creatingEvent ) + public void afterCreated( BoltServerAddress serverAddress, ListenerEvent creatingEvent ) { poolMetrics( serverAddress ).afterCreated(); connectionMetrics( serverAddress ).afterCreated( creatingEvent ); @@ -82,7 +81,7 @@ public void afterClosed( BoltServerAddress serverAddress ) } @Override - public void beforeAcquiringOrCreating( BoltServerAddress serverAddress, PoolListenerEvent listenerEvent ) + public void beforeAcquiringOrCreating( BoltServerAddress serverAddress, ListenerEvent listenerEvent ) { poolMetrics( serverAddress ).beforeAcquiringOrCreating( listenerEvent ); } @@ -94,19 +93,19 @@ public void afterAcquiringOrCreating( BoltServerAddress serverAddress ) } @Override - public void afterAcquiredOrCreated( BoltServerAddress serverAddress, PoolListenerEvent listenerEvent ) + public void afterAcquiredOrCreated( BoltServerAddress serverAddress, ListenerEvent listenerEvent ) { poolMetrics( serverAddress ).afterAcquiredOrCreated( listenerEvent ); } @Override - public void afterAcquiredOrCreated( BoltServerAddress serverAddress, ConnectionListenerEvent inUseEvent ) + public void afterConnectionCreated( BoltServerAddress serverAddress, ListenerEvent inUseEvent ) { connectionMetrics( serverAddress ).acquiredOrCreated( inUseEvent ); } @Override - public void afterReleased( BoltServerAddress serverAddress, ConnectionListenerEvent inUseEvent ) + public void afterConnectionReleased( BoltServerAddress serverAddress, ListenerEvent inUseEvent ) { connectionMetrics( serverAddress ).released( inUseEvent ); } @@ -118,13 +117,7 @@ public void afterTimedOutToAcquireOrCreate( BoltServerAddress serverAddress ) } @Override - public PoolListenerEvent createPoolListenerEvent() - { - return new NanoTimeBasedListenerEvent(); - } - - @Override - public ConnectionListenerEvent createConnectionListenerEvent() + public ListenerEvent createListenerEvent() { return new NanoTimeBasedListenerEvent(); } @@ -132,13 +125,13 @@ public ConnectionListenerEvent createConnectionListenerEvent() @Override public Map connectionPoolMetrics() { - return this.connectionPoolMetrics; + return unmodifiableMap( this.connectionPoolMetrics ); } @Override public Map connectionMetrics() { - return this.connectionMetrics; + return unmodifiableMap( this.connectionMetrics ); } @Override diff --git a/driver/src/main/java/org/neo4j/driver/internal/metrics/ListenerEvent.java b/driver/src/main/java/org/neo4j/driver/internal/metrics/ListenerEvent.java index 833129df14..f2deeef50b 100644 --- a/driver/src/main/java/org/neo4j/driver/internal/metrics/ListenerEvent.java +++ b/driver/src/main/java/org/neo4j/driver/internal/metrics/ListenerEvent.java @@ -21,15 +21,6 @@ public interface ListenerEvent { void start(); - long elapsed(); - - interface PoolListenerEvent extends ListenerEvent - { - } - - interface ConnectionListenerEvent extends ListenerEvent - { - } } diff --git a/driver/src/main/java/org/neo4j/driver/internal/metrics/MetricsListener.java b/driver/src/main/java/org/neo4j/driver/internal/metrics/MetricsListener.java index 7e3c31c874..a7473bfaae 100644 --- a/driver/src/main/java/org/neo4j/driver/internal/metrics/MetricsListener.java +++ b/driver/src/main/java/org/neo4j/driver/internal/metrics/MetricsListener.java @@ -23,8 +23,6 @@ import org.neo4j.driver.internal.BoltServerAddress; import org.neo4j.driver.internal.async.NettyConnection; import org.neo4j.driver.internal.async.pool.ConnectionPoolImpl; -import org.neo4j.driver.internal.metrics.ListenerEvent.ConnectionListenerEvent; -import org.neo4j.driver.internal.metrics.ListenerEvent.PoolListenerEvent; import org.neo4j.driver.v1.Config; public interface MetricsListener @@ -34,13 +32,13 @@ public interface MetricsListener * @param serverAddress the server the netty channel binds to. * @param creatingEvent a connection listener event registered when a connection is creating. */ - void beforeCreating( BoltServerAddress serverAddress, ConnectionListenerEvent creatingEvent ); + void beforeCreating( BoltServerAddress serverAddress, ListenerEvent creatingEvent ); /** * After a netty channel is created successfully * @param serverAddress the server the netty channel binds to */ - void afterCreated( BoltServerAddress serverAddress, ConnectionListenerEvent creatingEvent ); + void afterCreated( BoltServerAddress serverAddress, ListenerEvent creatingEvent ); /** * After a netty channel is created with failure @@ -66,7 +64,7 @@ public interface MetricsListener * @param serverAddress the server the netty channel binds to * @param acquireEvent a pool listener event registered in pool for this acquire event */ - void beforeAcquiringOrCreating( BoltServerAddress serverAddress, PoolListenerEvent acquireEvent ); + void beforeAcquiringOrCreating( BoltServerAddress serverAddress, ListenerEvent acquireEvent ); /** * After acquiring or creating a new netty channel from pool regardless successfully or not. @@ -79,24 +77,23 @@ public interface MetricsListener * @param serverAddress the server the netty channel binds to * @param acquireEvent a pool listener event registered in pool for this acquire event */ - void afterAcquiredOrCreated( BoltServerAddress serverAddress, PoolListenerEvent acquireEvent ); + void afterAcquiredOrCreated( BoltServerAddress serverAddress, ListenerEvent acquireEvent ); /** * After acquiring or creating a new netty channel from pool successfully. * @param serverAddress the server the netty channel binds to * @param inUseEvent a connection listener registered with a {@link NettyConnection} when created */ - void afterAcquiredOrCreated( BoltServerAddress serverAddress, ConnectionListenerEvent inUseEvent ); + void afterConnectionCreated( BoltServerAddress serverAddress, ListenerEvent inUseEvent ); /** * After releasing a netty channel back to pool successfully * @param serverAddress the server the netty channel binds to * @param inUseEvent a connection listener registered with a {@link NettyConnection} when destroyed */ - void afterReleased( BoltServerAddress serverAddress, ConnectionListenerEvent inUseEvent ); + void afterConnectionReleased( BoltServerAddress serverAddress, ListenerEvent inUseEvent ); - PoolListenerEvent createPoolListenerEvent(); - ConnectionListenerEvent createConnectionListenerEvent(); + ListenerEvent createListenerEvent(); void addMetrics( BoltServerAddress address, ConnectionPoolImpl connectionPool ); } diff --git a/driver/src/main/java/org/neo4j/driver/internal/metrics/NanoTimeBasedListenerEvent.java b/driver/src/main/java/org/neo4j/driver/internal/metrics/NanoTimeBasedListenerEvent.java index 4310f18015..a2c315c4fd 100644 --- a/driver/src/main/java/org/neo4j/driver/internal/metrics/NanoTimeBasedListenerEvent.java +++ b/driver/src/main/java/org/neo4j/driver/internal/metrics/NanoTimeBasedListenerEvent.java @@ -19,10 +19,7 @@ package org.neo4j.driver.internal.metrics; -import org.neo4j.driver.internal.metrics.ListenerEvent.ConnectionListenerEvent; -import org.neo4j.driver.internal.metrics.ListenerEvent.PoolListenerEvent; - -public class NanoTimeBasedListenerEvent implements PoolListenerEvent, ConnectionListenerEvent +public class NanoTimeBasedListenerEvent implements ListenerEvent { private long startNanoTime;