You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@curator.apache.org by ra...@apache.org on 2017/05/28 15:40:32 UTC

[1/5] curator git commit: CURATOR-106: Ensure background operations happen in the background thread to avoid stack overflows when retrying guaranteed operations

Repository: curator
Updated Branches:
  refs/heads/CURATOR-106 [created] ec4d74a78


CURATOR-106: Ensure background operations happen in the background thread to avoid stack overflows when retrying guaranteed operations


Project: http://git-wip-us.apache.org/repos/asf/curator/repo
Commit: http://git-wip-us.apache.org/repos/asf/curator/commit/757e45f6
Tree: http://git-wip-us.apache.org/repos/asf/curator/tree/757e45f6
Diff: http://git-wip-us.apache.org/repos/asf/curator/diff/757e45f6

Branch: refs/heads/CURATOR-106
Commit: 757e45f6d9ff6a471642616daf0668d8a64c4324
Parents: 302661a
Author: Stig Rohde Døssing <sd...@it-minds.dk>
Authored: Fri Apr 21 22:03:27 2017 +0200
Committer: Stig Rohde Døssing <sd...@it-minds.dk>
Committed: Fri Apr 21 23:18:58 2017 +0200

----------------------------------------------------------------------
 curator-framework/pom.xml                       |  6 +++
 .../framework/imps/CuratorFrameworkImpl.java    |  2 +-
 .../framework/imps/TestFrameworkBackground.java | 42 ++++++++++++++++++++
 .../nodes/TestPersistentEphemeralNode.java      |  4 ++
 4 files changed, 53 insertions(+), 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/curator/blob/757e45f6/curator-framework/pom.xml
----------------------------------------------------------------------
diff --git a/curator-framework/pom.xml b/curator-framework/pom.xml
index 9080308..2860658 100644
--- a/curator-framework/pom.xml
+++ b/curator-framework/pom.xml
@@ -67,6 +67,12 @@
             <artifactId>slf4j-log4j12</artifactId>
             <scope>test</scope>
         </dependency>
+        
+        <dependency>
+            <groupId>org.mockito</groupId>
+            <artifactId>mockito-core</artifactId>
+            <scope>test</scope>
+        </dependency>
     </dependencies>
 
 </project>

http://git-wip-us.apache.org/repos/asf/curator/blob/757e45f6/curator-framework/src/main/java/org/apache/curator/framework/imps/CuratorFrameworkImpl.java
----------------------------------------------------------------------
diff --git a/curator-framework/src/main/java/org/apache/curator/framework/imps/CuratorFrameworkImpl.java b/curator-framework/src/main/java/org/apache/curator/framework/imps/CuratorFrameworkImpl.java
index 6aa9f66..545b7a4 100644
--- a/curator-framework/src/main/java/org/apache/curator/framework/imps/CuratorFrameworkImpl.java
+++ b/curator-framework/src/main/java/org/apache/curator/framework/imps/CuratorFrameworkImpl.java
@@ -504,7 +504,7 @@ public class CuratorFrameworkImpl implements CuratorFramework
         boolean isInitialExecution = (event == null);
         if ( isInitialExecution )
         {
-            performBackgroundOperation(operationAndData);
+            queueOperation(operationAndData);
             return;
         }
 

http://git-wip-us.apache.org/repos/asf/curator/blob/757e45f6/curator-framework/src/test/java/org/apache/curator/framework/imps/TestFrameworkBackground.java
----------------------------------------------------------------------
diff --git a/curator-framework/src/test/java/org/apache/curator/framework/imps/TestFrameworkBackground.java b/curator-framework/src/test/java/org/apache/curator/framework/imps/TestFrameworkBackground.java
index 8e21929..50cb006 100644
--- a/curator-framework/src/test/java/org/apache/curator/framework/imps/TestFrameworkBackground.java
+++ b/curator-framework/src/test/java/org/apache/curator/framework/imps/TestFrameworkBackground.java
@@ -40,9 +40,13 @@ import org.testng.annotations.Test;
 import java.util.Arrays;
 import java.util.List;
 import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.TimeUnit;
 import java.util.concurrent.atomic.AtomicBoolean;
 import java.util.concurrent.atomic.AtomicLong;
 import java.util.concurrent.atomic.AtomicReference;
+import org.mockito.Mockito;
+import org.mockito.invocation.InvocationOnMock;
+import org.mockito.stubbing.Answer;
 
 public class TestFrameworkBackground extends BaseClassForTests
 {
@@ -328,6 +332,44 @@ public class TestFrameworkBackground extends BaseClassForTests
             CloseableUtils.closeQuietly(client);
         }
     }
+    
+    /**
+     * CURATOR-106: Background operations must always run in the background to avoid potential stack overflows when doing guaranteed operations
+     */
+    @Test
+    public void testBackgroundOperationsAreExecutedInTheBackground() throws Exception {
+        Timing timing = new Timing();
+        CuratorFramework client = CuratorFrameworkFactory.newClient(server.getConnectString(), timing.session(), timing.connection(), new RetryOneTime(1));
+        try
+        {
+            client.start();
+            client.blockUntilConnected(30, TimeUnit.SECONDS);
+            
+            final CountDownLatch latch = new CountDownLatch(1);
+            final AtomicReference<Thread> backgroundThread = new AtomicReference<Thread>();
+            
+            OperationAndData<Void> operation = (OperationAndData<Void>)Mockito.mock(OperationAndData.class);
+            Mockito.doAnswer(new Answer() {
+                @Override
+                public Void answer(InvocationOnMock invocation) throws Throwable {
+                    backgroundThread.set(Thread.currentThread());
+                    latch.countDown();
+                    return null;
+                }
+            }).when(operation).callPerformBackgroundOperation();
+            
+            ((CuratorFrameworkImpl)client).processBackgroundOperation(operation, null);
+
+            latch.await();
+
+            Assert.assertNotNull(backgroundThread.get());
+            Assert.assertNotEquals(Thread.currentThread(), backgroundThread.get());
+        }
+        finally
+        {
+            CloseableUtils.closeQuietly(client);
+        }
+    }
 
 
 }

http://git-wip-us.apache.org/repos/asf/curator/blob/757e45f6/curator-recipes/src/test/java/org/apache/curator/framework/recipes/nodes/TestPersistentEphemeralNode.java
----------------------------------------------------------------------
diff --git a/curator-recipes/src/test/java/org/apache/curator/framework/recipes/nodes/TestPersistentEphemeralNode.java b/curator-recipes/src/test/java/org/apache/curator/framework/recipes/nodes/TestPersistentEphemeralNode.java
index ef8a45a..4855876 100644
--- a/curator-recipes/src/test/java/org/apache/curator/framework/recipes/nodes/TestPersistentEphemeralNode.java
+++ b/curator-recipes/src/test/java/org/apache/curator/framework/recipes/nodes/TestPersistentEphemeralNode.java
@@ -633,7 +633,11 @@ public class TestPersistentEphemeralNode extends BaseClassForTests
             node.waitForInitialCreate(timing.forWaiting().seconds(), TimeUnit.SECONDS);
             assertTrue(Arrays.equals(curator.getData().forPath(node.getActualPath()), initialData));
 
+            Trigger dataChangedTrigger = Trigger.dataChanged();
+            curator.getData().usingWatcher(dataChangedTrigger).forPath(node.getActualPath());
+            
             node.setData(updatedData);
+            assertTrue(dataChangedTrigger.firedWithin(timing.forWaiting().seconds(), TimeUnit.SECONDS));
             assertTrue(Arrays.equals(curator.getData().forPath(node.getActualPath()), updatedData));
 
             server.restart();


[5/5] curator git commit: Closes #215

Posted by ra...@apache.org.
Closes #215


Project: http://git-wip-us.apache.org/repos/asf/curator/repo
Commit: http://git-wip-us.apache.org/repos/asf/curator/commit/ec4d74a7
Tree: http://git-wip-us.apache.org/repos/asf/curator/tree/ec4d74a7
Diff: http://git-wip-us.apache.org/repos/asf/curator/diff/ec4d74a7

Branch: refs/heads/CURATOR-106
Commit: ec4d74a78ab76b81bfb58c7ca77a583397b4609a
Parents: 7971a3d
Author: randgalt <ra...@apache.org>
Authored: Sun May 28 10:40:12 2017 -0500
Committer: randgalt <ra...@apache.org>
Committed: Sun May 28 10:40:12 2017 -0500

----------------------------------------------------------------------

----------------------------------------------------------------------



[2/5] curator git commit: CURATOR-106: Fix TestNamespaceFacade using empty connect strings

Posted by ra...@apache.org.
CURATOR-106: Fix TestNamespaceFacade using empty connect strings


Project: http://git-wip-us.apache.org/repos/asf/curator/repo
Commit: http://git-wip-us.apache.org/repos/asf/curator/commit/de823f60
Tree: http://git-wip-us.apache.org/repos/asf/curator/tree/de823f60
Diff: http://git-wip-us.apache.org/repos/asf/curator/diff/de823f60

Branch: refs/heads/CURATOR-106
Commit: de823f600162cc27a23325ec97894b454b790b62
Parents: 757e45f
Author: Stig Rohde Døssing <sd...@it-minds.dk>
Authored: Fri Apr 21 22:03:58 2017 +0200
Committer: Stig Rohde Døssing <sd...@it-minds.dk>
Committed: Fri Apr 21 23:18:59 2017 +0200

----------------------------------------------------------------------
 .../org/apache/curator/framework/imps/TestNamespaceFacade.java   | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/curator/blob/de823f60/curator-framework/src/test/java/org/apache/curator/framework/imps/TestNamespaceFacade.java
----------------------------------------------------------------------
diff --git a/curator-framework/src/test/java/org/apache/curator/framework/imps/TestNamespaceFacade.java b/curator-framework/src/test/java/org/apache/curator/framework/imps/TestNamespaceFacade.java
index 9357d00..265b3ea 100644
--- a/curator-framework/src/test/java/org/apache/curator/framework/imps/TestNamespaceFacade.java
+++ b/curator-framework/src/test/java/org/apache/curator/framework/imps/TestNamespaceFacade.java
@@ -53,7 +53,7 @@ public class TestNamespaceFacade extends BaseClassForTests
     public void     testGetNamespace() throws Exception
     {
         CuratorFramework    client = CuratorFrameworkFactory.newClient(server.getConnectString(), new RetryOneTime(1));
-        CuratorFramework    client2 = CuratorFrameworkFactory.builder().namespace("snafu").retryPolicy(new RetryOneTime(1)).connectString("").build();
+        CuratorFramework    client2 = CuratorFrameworkFactory.builder().namespace("snafu").retryPolicy(new RetryOneTime(1)).connectString(server.getConnectString()).build();
         try
         {
             client.start();
@@ -232,7 +232,7 @@ public class TestNamespaceFacade extends BaseClassForTests
 
     @Test
     public void testUnfixForEmptyNamespace() {
-        CuratorFramework client = CuratorFrameworkFactory.builder().namespace("").retryPolicy(new RetryOneTime(1)).connectString("").build();
+        CuratorFramework client = CuratorFrameworkFactory.builder().namespace("").retryPolicy(new RetryOneTime(1)).connectString(server.getConnectString()).build();
         CuratorFrameworkImpl clientImpl = (CuratorFrameworkImpl) client;
 
         Assert.assertEquals(clientImpl.unfixForNamespace("/foo/bar"), "/foo/bar");


[4/5] curator git commit: Merge branch 'CURATOR-106' of github.com:srdo/curator into CURATOR-106

Posted by ra...@apache.org.
Merge branch 'CURATOR-106' of github.com:srdo/curator into CURATOR-106


Project: http://git-wip-us.apache.org/repos/asf/curator/repo
Commit: http://git-wip-us.apache.org/repos/asf/curator/commit/7971a3da
Tree: http://git-wip-us.apache.org/repos/asf/curator/tree/7971a3da
Diff: http://git-wip-us.apache.org/repos/asf/curator/diff/7971a3da

Branch: refs/heads/CURATOR-106
Commit: 7971a3da4149cea1194bf33dda491241e53b9beb
Parents: ff02a7c 51d7396
Author: randgalt <ra...@apache.org>
Authored: Sun May 28 10:28:58 2017 -0500
Committer: randgalt <ra...@apache.org>
Committed: Sun May 28 10:28:58 2017 -0500

----------------------------------------------------------------------
 curator-framework/pom.xml                       |  6 +++
 .../framework/imps/CuratorFrameworkImpl.java    | 35 +++++-----------
 .../framework/imps/TestFrameworkBackground.java | 42 ++++++++++++++++++++
 .../framework/imps/TestNamespaceFacade.java     |  4 +-
 .../nodes/TestPersistentEphemeralNode.java      |  4 ++
 5 files changed, 65 insertions(+), 26 deletions(-)
----------------------------------------------------------------------



[3/5] curator git commit: CURATOR-106: Simplify CuratorFrameworkImpl.processBackgroundOperation a bit

Posted by ra...@apache.org.
CURATOR-106: Simplify CuratorFrameworkImpl.processBackgroundOperation a bit


Project: http://git-wip-us.apache.org/repos/asf/curator/repo
Commit: http://git-wip-us.apache.org/repos/asf/curator/commit/51d73964
Tree: http://git-wip-us.apache.org/repos/asf/curator/tree/51d73964
Diff: http://git-wip-us.apache.org/repos/asf/curator/diff/51d73964

Branch: refs/heads/CURATOR-106
Commit: 51d73964ef9e41a200571beb4724741b8765913f
Parents: de823f6
Author: Stig Rohde Døssing <st...@gmail.com>
Authored: Sat Apr 22 16:00:06 2017 +0200
Committer: Stig Rohde Døssing <st...@gmail.com>
Committed: Sat Apr 22 16:00:06 2017 +0200

----------------------------------------------------------------------
 .../framework/imps/CuratorFrameworkImpl.java    | 33 ++++++--------------
 1 file changed, 10 insertions(+), 23 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/curator/blob/51d73964/curator-framework/src/main/java/org/apache/curator/framework/imps/CuratorFrameworkImpl.java
----------------------------------------------------------------------
diff --git a/curator-framework/src/main/java/org/apache/curator/framework/imps/CuratorFrameworkImpl.java b/curator-framework/src/main/java/org/apache/curator/framework/imps/CuratorFrameworkImpl.java
index 545b7a4..1ad974c 100644
--- a/curator-framework/src/main/java/org/apache/curator/framework/imps/CuratorFrameworkImpl.java
+++ b/curator-framework/src/main/java/org/apache/curator/framework/imps/CuratorFrameworkImpl.java
@@ -502,35 +502,22 @@ public class CuratorFrameworkImpl implements CuratorFramework
     <DATA_TYPE> void processBackgroundOperation(OperationAndData<DATA_TYPE> operationAndData, CuratorEvent event)
     {
         boolean isInitialExecution = (event == null);
-        if ( isInitialExecution )
-        {
+        if (isInitialExecution) {
             queueOperation(operationAndData);
             return;
         }
-
-        boolean doQueueOperation = false;
-        do
-        {
-            if ( RetryLoop.shouldRetry(event.getResultCode()) )
-            {
-                doQueueOperation = checkBackgroundRetry(operationAndData, event);
-                break;
-            }
-
-            if ( operationAndData.getCallback() != null )
-            {
-                sendToBackgroundCallback(operationAndData, event);
-                break;
-            }
-
-            processEvent(event);
+        
+        if(RetryLoop.shouldRetry(event.getResultCode()) && checkBackgroundRetry(operationAndData, event)) {
+            queueOperation(operationAndData);
+            return;
         }
-        while ( false );
 
-        if ( doQueueOperation )
-        {
-            queueOperation(operationAndData);
+        if (operationAndData.getCallback() != null) {
+            sendToBackgroundCallback(operationAndData, event);
+            return;
         }
+
+        processEvent(event);
     }
 
     <DATA_TYPE> void queueOperation(OperationAndData<DATA_TYPE> operationAndData)