From 5a589974443b1dd99f2d6755d15ce3353febb3eb Mon Sep 17 00:00:00 2001 From: "Kenneth J. Shackleton" Date: Tue, 25 Jun 2024 08:13:17 +0100 Subject: [PATCH 1/4] Replace scheduleAtFixedRate when evicting with scheduleWithFixedDelay for single object pool. Signed-off-by: Kenneth J. Shackleton --- .../main/kotlin/com/bloomberg/selekt/pools/SingleObjectPool.kt | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/selekt-java/src/main/kotlin/com/bloomberg/selekt/pools/SingleObjectPool.kt b/selekt-java/src/main/kotlin/com/bloomberg/selekt/pools/SingleObjectPool.kt index eed41aaeaa..a2c278ab67 100644 --- a/selekt-java/src/main/kotlin/com/bloomberg/selekt/pools/SingleObjectPool.kt +++ b/selekt-java/src/main/kotlin/com/bloomberg/selekt/pools/SingleObjectPool.kt @@ -97,6 +97,7 @@ class SingleObjectPool>( } }?.let { factory.destroyObject(it) + attemptScheduleEviction() } @GuardedBy("mutex") @@ -118,7 +119,7 @@ class SingleObjectPool>( if (evictionIntervalMillis < 0L || isClosed) { return } - future = executor.scheduleAtFixedRate( + future = executor.scheduleWithFixedDelay( ::evict, evictionDelayMillis, evictionIntervalMillis, From 8d474063567a3ba373e2f9446e741b15527e83e2 Mon Sep 17 00:00:00 2001 From: "Kenneth J. Shackleton" Date: Tue, 25 Jun 2024 11:06:07 +0100 Subject: [PATCH 2/4] Update tests. Signed-off-by: Kenneth J. Shackleton --- .../com/bloomberg/selekt/pools/CommonObjectPool.kt | 2 +- .../com/bloomberg/selekt/pools/SingleObjectPoolTest.kt | 10 ++++------ 2 files changed, 5 insertions(+), 7 deletions(-) diff --git a/selekt-java/src/main/kotlin/com/bloomberg/selekt/pools/CommonObjectPool.kt b/selekt-java/src/main/kotlin/com/bloomberg/selekt/pools/CommonObjectPool.kt index f70b2eafc3..2403c14107 100644 --- a/selekt-java/src/main/kotlin/com/bloomberg/selekt/pools/CommonObjectPool.kt +++ b/selekt-java/src/main/kotlin/com/bloomberg/selekt/pools/CommonObjectPool.kt @@ -181,7 +181,7 @@ class CommonObjectPool>( if (future?.isCancelled == false || configuration.evictionIntervalMillis < 0L || isClosed.get()) { return } - future = executor.scheduleAtFixedRate( + future = executor.scheduleWithFixedDelay( ::evict, configuration.evictionDelayMillis, configuration.evictionIntervalMillis, diff --git a/selekt-java/src/test/kotlin/com/bloomberg/selekt/pools/SingleObjectPoolTest.kt b/selekt-java/src/test/kotlin/com/bloomberg/selekt/pools/SingleObjectPoolTest.kt index c97f6ce830..6a2d544f34 100644 --- a/selekt-java/src/test/kotlin/com/bloomberg/selekt/pools/SingleObjectPoolTest.kt +++ b/selekt-java/src/test/kotlin/com/bloomberg/selekt/pools/SingleObjectPoolTest.kt @@ -349,12 +349,12 @@ internal class SingleObjectPoolTest { @Test fun evictionFailsIfCancelled() { val executor = object : ScheduledExecutorService by this@SingleObjectPoolTest.executor { - override fun scheduleAtFixedRate( + override fun scheduleWithFixedDelay( command: Runnable, initialDelay: Long, - period: Long, + delay: Long, unit: TimeUnit - ) = this@SingleObjectPoolTest.executor.scheduleAtFixedRate(command, initialDelay, period, unit).apply { + ) = this@SingleObjectPoolTest.executor.scheduleAtFixedRate(command, initialDelay, delay, unit).apply { cancel(false) } } @@ -382,10 +382,8 @@ internal class SingleObjectPoolTest { @Test fun borrowAsClosingDoesNotScheduleEviction() { - @Suppress("JoinDeclarationAndAssignment") - lateinit var pool: SingleObjectPool val executor = mock() - pool = SingleObjectPool(object : IObjectFactory { + val pool = SingleObjectPool(object : IObjectFactory { override fun close() = Unit override fun destroyObject(obj: PooledObject) = Unit From 901b34ed31dc2d7408d867571ff2e6abc8c9ccf7 Mon Sep 17 00:00:00 2001 From: "Kenneth J. Shackleton" Date: Sun, 1 Sep 2024 14:54:49 +0100 Subject: [PATCH 3/4] Update tests. Signed-off-by: Kenneth J. Shackleton --- .../bloomberg/selekt/pools/CommonObjectPoolTest.kt | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/selekt-java/src/test/kotlin/com/bloomberg/selekt/pools/CommonObjectPoolTest.kt b/selekt-java/src/test/kotlin/com/bloomberg/selekt/pools/CommonObjectPoolTest.kt index 69a6b64ba0..5a9645ac08 100644 --- a/selekt-java/src/test/kotlin/com/bloomberg/selekt/pools/CommonObjectPoolTest.kt +++ b/selekt-java/src/test/kotlin/com/bloomberg/selekt/pools/CommonObjectPoolTest.kt @@ -360,17 +360,16 @@ internal class CommonObjectPoolTest { @Test fun interleavedBorrowSchedulesEvictionIfCancelled() { - @Suppress("JoinDeclarationAndAssignment") lateinit var pool: CommonObjectPool val executor = object : ScheduledExecutorService by this@CommonObjectPoolTest.executor { var count = 0 - override fun scheduleAtFixedRate( + override fun scheduleWithFixedDelay( command: Runnable, initialDelay: Long, - period: Long, + delay: Long, unit: TimeUnit - ) = this@CommonObjectPoolTest.executor.scheduleAtFixedRate(command, initialDelay, period, unit).also { + ) = this@CommonObjectPoolTest.executor.scheduleWithFixedDelay(command, initialDelay, delay, unit).also { if (count++ == 0) { it.cancel(false) } @@ -459,12 +458,12 @@ internal class CommonObjectPoolTest { @Test fun evictionFailsIfCancelled() { val executor = object : ScheduledExecutorService by this@CommonObjectPoolTest.executor { - override fun scheduleAtFixedRate( + override fun scheduleWithFixedDelay( command: Runnable, initialDelay: Long, - period: Long, + delay: Long, unit: TimeUnit - ) = this@CommonObjectPoolTest.executor.scheduleAtFixedRate(command, initialDelay, period, unit).apply { + ) = this@CommonObjectPoolTest.executor.scheduleWithFixedDelay(command, initialDelay, delay, unit).apply { cancel(false) } } From be4a69630f6115f8d501008a2fcecb739bbfee28 Mon Sep 17 00:00:00 2001 From: "Kenneth J. Shackleton" Date: Sun, 1 Sep 2024 15:25:08 +0100 Subject: [PATCH 4/4] Remove superfluous attempt to schedule eviction for the SingleObjectPool when the pool is now empty. Signed-off-by: Kenneth J. Shackleton --- .../main/kotlin/com/bloomberg/selekt/pools/SingleObjectPool.kt | 1 - 1 file changed, 1 deletion(-) diff --git a/selekt-java/src/main/kotlin/com/bloomberg/selekt/pools/SingleObjectPool.kt b/selekt-java/src/main/kotlin/com/bloomberg/selekt/pools/SingleObjectPool.kt index a2c278ab67..efbcc0a9a0 100644 --- a/selekt-java/src/main/kotlin/com/bloomberg/selekt/pools/SingleObjectPool.kt +++ b/selekt-java/src/main/kotlin/com/bloomberg/selekt/pools/SingleObjectPool.kt @@ -97,7 +97,6 @@ class SingleObjectPool>( } }?.let { factory.destroyObject(it) - attemptScheduleEviction() } @GuardedBy("mutex")