You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@geode.apache.org by zh...@apache.org on 2020/11/14 01:58:20 UTC

[geode] 01/01: GEODE-8706: getConnection should get readLock to sync with destroyConnection

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

zhouxj pushed a commit to branch feature/GEODE-8706
in repository https://gitbox.apache.org/repos/asf/geode.git

commit 903be88a43d058e379dbd8a77e9f254065ab8968
Author: zhouxh <gz...@pivotal.io>
AuthorDate: Fri Nov 13 17:55:17 2020 -0800

    GEODE-8706: getConnection should get readLock to sync with destroyConnection
---
 .../wan/GatewaySenderEventRemoteDispatcher.java    | 41 ++++++++++++++--------
 ...atewaySenderEventRemoteDispatcherJUnitTest.java |  1 +
 2 files changed, 27 insertions(+), 15 deletions(-)

diff --git a/geode-wan/src/main/java/org/apache/geode/internal/cache/wan/GatewaySenderEventRemoteDispatcher.java b/geode-wan/src/main/java/org/apache/geode/internal/cache/wan/GatewaySenderEventRemoteDispatcher.java
index 8717674..ecdc297 100644
--- a/geode-wan/src/main/java/org/apache/geode/internal/cache/wan/GatewaySenderEventRemoteDispatcher.java
+++ b/geode-wan/src/main/java/org/apache/geode/internal/cache/wan/GatewaySenderEventRemoteDispatcher.java
@@ -25,6 +25,7 @@ import org.apache.logging.log4j.Logger;
 
 import org.apache.geode.CancelException;
 import org.apache.geode.GemFireIOException;
+import org.apache.geode.annotations.VisibleForTesting;
 import org.apache.geode.cache.RegionDestroyedException;
 import org.apache.geode.cache.client.ServerConnectivityException;
 import org.apache.geode.cache.client.ServerOperationException;
@@ -280,6 +281,11 @@ public class GatewaySenderEventRemoteDispatcher implements GatewaySenderEventDis
     }
   }
 
+  @VisibleForTesting
+  ReentrantReadWriteLock getConnectionLifeCycleLock() {
+    return this.connectionLifeCycleLock;
+  }
+
   /**
    * Acquires or adds a new <code>Connection</code> to the corresponding <code>Gateway</code>
    *
@@ -294,23 +300,28 @@ public class GatewaySenderEventRemoteDispatcher implements GatewaySenderEventDis
     // IF the connection is null
     // OR the connection's ServerLocation doesn't match with the one stored in sender
     // THEN initialize the connection
-    if (!this.sender.isParallel()) {
-      if (this.connection == null || this.connection.isDestroyed()
-          || this.connection.getServer() == null
-          || !this.connection.getServer().equals(this.sender.getServerLocation())) {
-        if (logger.isDebugEnabled()) {
-          logger.debug(
-              "Initializing new connection as serverLocation of old connection is : {} and the serverLocation to connect is {}",
-              ((this.connection == null) ? "null" : this.connection.getServer()),
-              this.sender.getServerLocation());
+    getConnectionLifeCycleLock().readLock().lock();
+    try {
+      if (!this.sender.isParallel()) {
+        if (this.connection == null || this.connection.isDestroyed()
+            || this.connection.getServer() == null
+            || !this.connection.getServer().equals(this.sender.getServerLocation())) {
+          if (logger.isDebugEnabled()) {
+            logger.debug(
+                "Initializing new connection as serverLocation of old connection is : {} and the serverLocation to connect is {}",
+                ((this.connection == null) ? "null" : this.connection.getServer()),
+                this.sender.getServerLocation());
+          }
+          // Initialize the connection
+          initializeConnection();
+        }
+      } else {
+        if (this.connection == null || this.connection.isDestroyed()) {
+          initializeConnection();
         }
-        // Initialize the connection
-        initializeConnection();
-      }
-    } else {
-      if (this.connection == null || this.connection.isDestroyed()) {
-        initializeConnection();
       }
+    } finally {
+      getConnectionLifeCycleLock().readLock().unlock();
     }
 
     // Here we might wait on a connection to another server if I was secondary
diff --git a/geode-wan/src/test/java/org/apache/geode/internal/cache/wan/GatewaySenderEventRemoteDispatcherJUnitTest.java b/geode-wan/src/test/java/org/apache/geode/internal/cache/wan/GatewaySenderEventRemoteDispatcherJUnitTest.java
index d0360d1..7cfe1f5 100644
--- a/geode-wan/src/test/java/org/apache/geode/internal/cache/wan/GatewaySenderEventRemoteDispatcherJUnitTest.java
+++ b/geode-wan/src/test/java/org/apache/geode/internal/cache/wan/GatewaySenderEventRemoteDispatcherJUnitTest.java
@@ -75,5 +75,6 @@ public class GatewaySenderEventRemoteDispatcherJUnitTest {
     doNothing().when(dispatcher).initializeConnection();
     Connection newConnection = dispatcher.getConnection(true);
     verify(dispatcher, times(1)).initializeConnection();
+    verify(dispatcher, times(2)).getConnectionLifeCycleLock();
   }
 }