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 <[email protected]> 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 "[email protected]" <[email protected]>.
