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

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


The following commit(s) were added to refs/heads/feature/GEODE-5379 by this 
push:
     new 6a22a70  GEODE-5379: Do not reset affinityRetryCount after 
executeOnServer successfully to avoid stack overflow.
6a22a70 is described below

commit 6a22a704bfc56a97c15b2b9762f8080407e6d214
Author: eshu <[email protected]>
AuthorDate: Tue Jul 3 11:20:53 2018 -0700

    GEODE-5379: Do not reset affinityRetryCount after executeOnServer 
successfully to avoid stack overflow.
---
 .../cache/client/internal/OpExecutorImpl.java      |  6 +++-
 .../geode/cache/client/internal/TXFailoverOp.java  |  2 +-
 .../client/internal/OpExecutorImplJUnitTest.java   | 32 ++++++++++++++++++++++
 3 files changed, 38 insertions(+), 2 deletions(-)

diff --git 
a/geode-core/src/main/java/org/apache/geode/cache/client/internal/OpExecutorImpl.java
 
b/geode-core/src/main/java/org/apache/geode/cache/client/internal/OpExecutorImpl.java
index 4116dde..d8980a6 100644
--- 
a/geode-core/src/main/java/org/apache/geode/cache/client/internal/OpExecutorImpl.java
+++ 
b/geode-core/src/main/java/org/apache/geode/cache/client/internal/OpExecutorImpl.java
@@ -229,7 +229,6 @@ public class OpExecutorImpl implements ExecutablePool {
   private Object executeWithServerAffinity(ServerLocation loc, Op op) {
     try {
       Object retVal = executeOnServer(loc, op, true, false);
-      affinityRetryCount.set(0);
       return retVal;
     } catch (ServerConnectivityException e) {
       if (logger.isDebugEnabled()) {
@@ -295,6 +294,11 @@ public class OpExecutorImpl implements ExecutablePool {
     return this.affinityServerLocation.get();
   }
 
+  // for test only
+  protected int getAffinityRetryCount() {
+    return affinityRetryCount.get();
+  }
+
   public void setServerAffinityLocation(ServerLocation serverLocation) {
     assert this.affinityServerLocation.get() == null;
     this.affinityServerLocation.set(serverLocation);
diff --git 
a/geode-core/src/main/java/org/apache/geode/cache/client/internal/TXFailoverOp.java
 
b/geode-core/src/main/java/org/apache/geode/cache/client/internal/TXFailoverOp.java
index 90714c1..5786999 100644
--- 
a/geode-core/src/main/java/org/apache/geode/cache/client/internal/TXFailoverOp.java
+++ 
b/geode-core/src/main/java/org/apache/geode/cache/client/internal/TXFailoverOp.java
@@ -33,7 +33,7 @@ public class TXFailoverOp {
     // no instance
   }
 
-  private static class TXFailoverOpImpl extends AbstractOp {
+  protected static class TXFailoverOpImpl extends AbstractOp {
     int txId;
 
     protected TXFailoverOpImpl(int txId) {
diff --git 
a/geode-core/src/test/java/org/apache/geode/cache/client/internal/OpExecutorImplJUnitTest.java
 
b/geode-core/src/test/java/org/apache/geode/cache/client/internal/OpExecutorImplJUnitTest.java
index 5478292..3af8332 100644
--- 
a/geode-core/src/test/java/org/apache/geode/cache/client/internal/OpExecutorImplJUnitTest.java
+++ 
b/geode-core/src/test/java/org/apache/geode/cache/client/internal/OpExecutorImplJUnitTest.java
@@ -16,6 +16,11 @@ package org.apache.geode.cache.client.internal;
 
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.fail;
+import static org.mockito.Mockito.doReturn;
+import static org.mockito.Mockito.doThrow;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.spy;
+import static org.mockito.Mockito.when;
 
 import java.io.IOException;
 import java.io.InputStream;
@@ -42,6 +47,7 @@ import 
org.apache.geode.cache.client.internal.pooling.ConnectionManager;
 import org.apache.geode.distributed.DistributedMember;
 import org.apache.geode.distributed.internal.InternalDistributedSystem;
 import org.apache.geode.distributed.internal.ServerLocation;
+import org.apache.geode.internal.cache.tier.sockets.Message;
 import org.apache.geode.internal.cache.tier.sockets.ServerQueueStatus;
 import org.apache.geode.internal.logging.InternalLogWriter;
 import org.apache.geode.internal.logging.LocalLogWriter;
@@ -458,6 +464,32 @@ public class OpExecutorImplJUnitTest {
     assertEquals(0, returns);
   }
 
+  @Test
+  public void executeWithServerAffinityDoesNotResetAffinityRetryCount() {
+    OpExecutorImpl opExecutor =
+        spy(new OpExecutorImpl(manager, queueManager, endpointManager, 
riTracker, -1,
+            10, true, cancelCriterion, mock(PoolImpl.class)));
+    opExecutor.setupServerAffinity(true);
+
+    Op txSynchronizationOp = mock(TXSynchronizationOp.Impl.class);
+    ServerLocation serverLocation = mock(ServerLocation.class);
+    ServerConnectivityException serverConnectivityException =
+        mock(ServerConnectivityException.class);
+
+    doReturn(serverLocation).when(opExecutor).getNextOpServerLocation();
+    
doThrow(serverConnectivityException).when(opExecutor).executeOnServer(serverLocation,
+        txSynchronizationOp, true, false);
+    when(((AbstractOp) 
txSynchronizationOp).getMessage()).thenReturn(mock(Message.class));
+    opExecutor.execute(txSynchronizationOp);
+    assertEquals(1, opExecutor.getAffinityRetryCount());
+
+    Op txFailoverOp = mock(TXFailoverOp.TXFailoverOpImpl.class);
+    doReturn(new Object()).when(opExecutor).executeOnServer(serverLocation, 
txFailoverOp, true,
+        false);
+    opExecutor.execute(txFailoverOp);
+    assertEquals(1, opExecutor.getAffinityRetryCount());
+  }
+
   private class DummyManager implements ConnectionManager {
 
     protected int numServers = Integer.MAX_VALUE;

Reply via email to