You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@plc4x.apache.org by jf...@apache.org on 2022/01/30 16:46:26 UTC

[plc4x] 01/01: Possible fix for a race condition which lead a test to fail with some probability.

This is an automated email from the ASF dual-hosted git repository.

jfeinauer pushed a commit to branch bugfix/fix-failing-test-cached-driver
in repository https://gitbox.apache.org/repos/asf/plc4x.git

commit 4d02ceeed6ebe13fb43b1631a16bd184bcae8138
Author: julian <j....@pragmaticminds.de>
AuthorDate: Sun Jan 30 17:46:16 2022 +0100

    Possible fix for a race condition which lead a test to fail with some probability.
---
 .../plc4x/java/utils/connectionpool2/CachedDriverManager.java     | 6 +++---
 .../plc4x/java/utils/connectionpool2/CachedDriverManagerIT.java   | 8 ++++++--
 2 files changed, 9 insertions(+), 5 deletions(-)

diff --git a/plc4j/tools/connection-cache/src/main/java/org/apache/plc4x/java/utils/connectionpool2/CachedDriverManager.java b/plc4j/tools/connection-cache/src/main/java/org/apache/plc4x/java/utils/connectionpool2/CachedDriverManager.java
index a291795..134495f 100644
--- a/plc4j/tools/connection-cache/src/main/java/org/apache/plc4x/java/utils/connectionpool2/CachedDriverManager.java
+++ b/plc4j/tools/connection-cache/src/main/java/org/apache/plc4x/java/utils/connectionpool2/CachedDriverManager.java
@@ -156,6 +156,7 @@ public class CachedDriverManager extends PlcDriverManager implements CachedDrive
         if (!this.url.equals(url)) {
             throw new IllegalArgumentException("This Cached Driver Manager only supports the Connection " + url);
         }
+        CompletableFuture<PlcConnection> future;
         synchronized (this) {
             logger.trace("current queue size before check {}", queue.size());
             if (queue.isEmpty() && isConnectionAvailable()) {
@@ -169,9 +170,8 @@ public class CachedDriverManager extends PlcDriverManager implements CachedDrive
                 } catch (Exception ignore) {
                 }
             }
-        }
-        CompletableFuture<PlcConnection> future = new CompletableFuture<>();
-        synchronized (this) {
+
+            future = new CompletableFuture<>();
             logger.trace("current queue size before add {}", queue.size());
             queue.add(future);
         }
diff --git a/plc4j/tools/connection-cache/src/test/java/org/apache/plc4x/java/utils/connectionpool2/CachedDriverManagerIT.java b/plc4j/tools/connection-cache/src/test/java/org/apache/plc4x/java/utils/connectionpool2/CachedDriverManagerIT.java
index 81ce694..308fb11 100644
--- a/plc4j/tools/connection-cache/src/test/java/org/apache/plc4x/java/utils/connectionpool2/CachedDriverManagerIT.java
+++ b/plc4j/tools/connection-cache/src/test/java/org/apache/plc4x/java/utils/connectionpool2/CachedDriverManagerIT.java
@@ -31,6 +31,7 @@ import java.util.concurrent.TimeUnit;
 import java.util.concurrent.atomic.AtomicInteger;
 
 import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertTrue;
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.when;
 
@@ -49,7 +50,7 @@ class CachedDriverManagerIT {
         MockConnection plcMockConnection = mock(MockConnection.class);
         when(mock.create()).thenReturn(plcMockConnection);
 
-        CachedDriverManager driverManager = new CachedDriverManager("", mock, 100_000);
+        CachedDriverManager driverManager = new CachedDriverManager("", mock, 10_000);
 
         AtomicInteger errorCounter = new AtomicInteger(0);
         AtomicInteger successCounter = new AtomicInteger(0);
@@ -68,7 +69,10 @@ class CachedDriverManagerIT {
 
         executorService.shutdown();
 
-        executorService.awaitTermination(50, TimeUnit.SECONDS);
+        boolean forced = executorService.awaitTermination(50, TimeUnit.SECONDS);
+
+        // If this is false, a thread was still hanging => something failed
+        assertTrue(forced);
 
         assertEquals(100, successCounter.get());
         assertEquals(0, errorCounter.get());