You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@sling.apache.org by ro...@apache.org on 2017/11/07 09:26:22 UTC

[sling-org-apache-sling-discovery-commons] 19/38: SLING-5094 / SLING-4603 related : cancel ongoing sync explicitly in order to avoid dangerous CHANGED event when changes happen during sync

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

rombert pushed a commit to annotated tag org.apache.sling.discovery.commons-1.0.0
in repository https://gitbox.apache.org/repos/asf/sling-org-apache-sling-discovery-commons.git

commit 8b4c590b7c709fb77757f20022ff69e9eba10e38
Author: Stefan Egli <st...@apache.org>
AuthorDate: Wed Oct 21 15:37:35 2015 +0000

    SLING-5094 / SLING-4603 related : cancel ongoing sync explicitly in order to avoid dangerous CHANGED event when changes happen during sync
    
    git-svn-id: https://svn.apache.org/repos/asf/sling/trunk/bundles/extensions/discovery/commons@1709866 13f79535-47bb-0310-9956-ffa450edef68
---
 .../providers/base/ViewStateManagerImpl.java       |  6 +++
 .../commons/providers/spi/ConsistencyService.java  |  2 +
 .../spi/base/BaseSyncTokenConsistencyService.java  |  5 ++
 .../commons/providers/base/ClusterTest.java        |  5 ++
 .../providers/base/TestMinEventDelayHandler.java   |  5 ++
 .../providers/base/TestViewStateManager.java       | 57 +++++++++++++++++++++-
 6 files changed, 79 insertions(+), 1 deletion(-)

diff --git a/src/main/java/org/apache/sling/discovery/commons/providers/base/ViewStateManagerImpl.java b/src/main/java/org/apache/sling/discovery/commons/providers/base/ViewStateManagerImpl.java
index f2c3525..70fa33f 100644
--- a/src/main/java/org/apache/sling/discovery/commons/providers/base/ViewStateManagerImpl.java
+++ b/src/main/java/org/apache/sling/discovery/commons/providers/base/ViewStateManagerImpl.java
@@ -414,6 +414,12 @@ public class ViewStateManagerImpl implements ViewStateManager {
         if (!localInstance.isLocal()) {
             throw new IllegalStateException("newView's local instance is not isLocal - very unexpected - hence cannot be current");
         }
+        
+        // cancel any potentially ongoing sync
+        if (consistencyService != null) {
+            consistencyService.cancelSync();
+        }
+        
         logger.debug("handleNewView: newView is current, so trying with minEventDelayHandler...");
         if (minEventDelayHandler!=null) {
             if (minEventDelayHandler.handlesNewView(newView)) {
diff --git a/src/main/java/org/apache/sling/discovery/commons/providers/spi/ConsistencyService.java b/src/main/java/org/apache/sling/discovery/commons/providers/spi/ConsistencyService.java
index 4678657..0aec6a8 100644
--- a/src/main/java/org/apache/sling/discovery/commons/providers/spi/ConsistencyService.java
+++ b/src/main/java/org/apache/sling/discovery/commons/providers/spi/ConsistencyService.java
@@ -81,4 +81,6 @@ public interface ConsistencyService {
      */
     void sync(BaseTopologyView view, Runnable callback);
     
+    void cancelSync();
+    
 }
diff --git a/src/main/java/org/apache/sling/discovery/commons/providers/spi/base/BaseSyncTokenConsistencyService.java b/src/main/java/org/apache/sling/discovery/commons/providers/spi/base/BaseSyncTokenConsistencyService.java
index f37b7a2..fd53e82 100644
--- a/src/main/java/org/apache/sling/discovery/commons/providers/spi/base/BaseSyncTokenConsistencyService.java
+++ b/src/main/java/org/apache/sling/discovery/commons/providers/spi/base/BaseSyncTokenConsistencyService.java
@@ -52,6 +52,11 @@ public abstract class BaseSyncTokenConsistencyService extends AbstractServiceWit
     }
     
     @Override
+    public void cancelSync() {
+        cancelPreviousBackgroundCheck();
+    }
+    
+    @Override
     public void sync(BaseTopologyView view, Runnable callback) {
         // cancel the previous background-check if it's still running
         cancelPreviousBackgroundCheck();
diff --git a/src/test/java/org/apache/sling/discovery/commons/providers/base/ClusterTest.java b/src/test/java/org/apache/sling/discovery/commons/providers/base/ClusterTest.java
index 7b921dc..2bf3705 100644
--- a/src/test/java/org/apache/sling/discovery/commons/providers/base/ClusterTest.java
+++ b/src/test/java/org/apache/sling/discovery/commons/providers/base/ClusterTest.java
@@ -64,6 +64,11 @@ public class ClusterTest {
             public void sync(BaseTopologyView view, Runnable callback) {
                 callback.run();
             }
+            
+            @Override
+            public void cancelSync() {
+                // nothing to cancel, we're auto-run
+            }
         });
         mgrList.add(mgr);
         return mgr;
diff --git a/src/test/java/org/apache/sling/discovery/commons/providers/base/TestMinEventDelayHandler.java b/src/test/java/org/apache/sling/discovery/commons/providers/base/TestMinEventDelayHandler.java
index 84ec22f..d28b912 100644
--- a/src/test/java/org/apache/sling/discovery/commons/providers/base/TestMinEventDelayHandler.java
+++ b/src/test/java/org/apache/sling/discovery/commons/providers/base/TestMinEventDelayHandler.java
@@ -61,6 +61,11 @@ public class TestMinEventDelayHandler {
             public void sync(BaseTopologyView view, Runnable callback) {
                 callback.run();
             }
+            
+            @Override
+            public void cancelSync() {
+                // nothing to cancel, we're auto-run
+            }
         });
         defaultRandom = new Random(1234123412); // I want randomness yes, but deterministic, for some methods at least
         
diff --git a/src/test/java/org/apache/sling/discovery/commons/providers/base/TestViewStateManager.java b/src/test/java/org/apache/sling/discovery/commons/providers/base/TestViewStateManager.java
index df90dfc..13d586d 100644
--- a/src/test/java/org/apache/sling/discovery/commons/providers/base/TestViewStateManager.java
+++ b/src/test/java/org/apache/sling/discovery/commons/providers/base/TestViewStateManager.java
@@ -22,6 +22,8 @@ import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertTrue;
 
+import java.util.LinkedList;
+import java.util.List;
 import java.util.Random;
 import java.util.UUID;
 import java.util.concurrent.Semaphore;
@@ -36,7 +38,6 @@ import org.apache.sling.discovery.commons.providers.DefaultClusterView;
 import org.apache.sling.discovery.commons.providers.DefaultInstanceDescription;
 import org.apache.sling.discovery.commons.providers.DummyTopologyView;
 import org.apache.sling.discovery.commons.providers.EventHelper;
-import org.apache.sling.discovery.commons.providers.base.ViewStateManagerImpl;
 import org.apache.sling.discovery.commons.providers.spi.ConsistencyService;
 import org.junit.After;
 import org.junit.Before;
@@ -72,6 +73,11 @@ public class TestViewStateManager {
             }
         }
         
+        @Override
+        public void cancelSync() {
+            // TODO not implemented yet
+        }
+        
     }
     
     private ViewStateManagerImpl mgr;
@@ -85,6 +91,11 @@ public class TestViewStateManager {
             public void sync(BaseTopologyView view, Runnable callback) {
                 callback.run();
             }
+            
+            @Override
+            public void cancelSync() {
+                // nothing to cancel, we're auto-run
+            }
         });
         defaultRandom = new Random(1234123412); // I want randomness yes, but deterministic, for some methods at least
     }
@@ -206,6 +217,50 @@ public class TestViewStateManager {
     }
     
     @Test
+    public void testCancelSync() throws Exception {
+        final List<Runnable> syncCallbacks = new LinkedList<Runnable>();
+        mgr = new ViewStateManagerImpl(new ReentrantLock(), new ConsistencyService() {
+            
+            public void sync(BaseTopologyView view, Runnable callback) {
+                synchronized(syncCallbacks) {
+                    syncCallbacks.add(callback);
+                }
+            }
+            
+            @Override
+            public void cancelSync() {
+                synchronized(syncCallbacks) {
+                    syncCallbacks.clear();
+                }
+            }
+        });
+        mgr.handleActivated();
+        final DummyListener listener = new DummyListener();
+        mgr.bind(listener);
+        mgr.handleChanging();
+        final BaseTopologyView view = new DummyTopologyView().addInstance();
+        mgr.handleNewView(view);
+        assertTrue(mgr.waitForAsyncEvents(1000));
+        TestHelper.assertNoEvents(listener);
+        synchronized(syncCallbacks) {
+            assertEquals(1, syncCallbacks.size());
+        }
+        String id1 = UUID.randomUUID().toString();
+        String id2 = UUID.randomUUID().toString();
+        final BaseTopologyView view2 = TestHelper.newView(true, id1, id1, id1, id2); 
+        mgr.handleNewView(view2);
+        assertTrue(mgr.waitForAsyncEvents(1000));
+        TestHelper.assertNoEvents(listener);
+        synchronized(syncCallbacks) {
+            assertEquals(1, syncCallbacks.size());
+            syncCallbacks.get(0).run();
+            syncCallbacks.clear();
+        }
+        assertTrue(mgr.waitForAsyncEvents(1000));
+        assertEvents(listener, EventHelper.newInitEvent(view2));
+    }
+    
+    @Test
     public void testActivateBindChangingChanged() throws Exception {
         final DummyListener listener = new DummyListener();
         // first activate

-- 
To stop receiving notification emails like this one, please contact
"commits@sling.apache.org" <co...@sling.apache.org>.