Author: stefanegli Date: Wed Oct 21 15:37:35 2015 New Revision: 1709866 URL: http://svn.apache.org/viewvc?rev=1709866&view=rev Log: SLING-5094 / SLING-4603 related : cancel ongoing sync explicitly in order to avoid dangerous CHANGED event when changes happen during sync
Modified: sling/trunk/bundles/extensions/discovery/commons/src/main/java/org/apache/sling/discovery/commons/providers/base/ViewStateManagerImpl.java sling/trunk/bundles/extensions/discovery/commons/src/main/java/org/apache/sling/discovery/commons/providers/spi/ConsistencyService.java sling/trunk/bundles/extensions/discovery/commons/src/main/java/org/apache/sling/discovery/commons/providers/spi/base/BaseSyncTokenConsistencyService.java sling/trunk/bundles/extensions/discovery/commons/src/test/java/org/apache/sling/discovery/commons/providers/base/ClusterTest.java sling/trunk/bundles/extensions/discovery/commons/src/test/java/org/apache/sling/discovery/commons/providers/base/TestMinEventDelayHandler.java sling/trunk/bundles/extensions/discovery/commons/src/test/java/org/apache/sling/discovery/commons/providers/base/TestViewStateManager.java sling/trunk/bundles/extensions/discovery/impl/src/main/java/org/apache/sling/discovery/impl/DiscoveryServiceImpl.java Modified: sling/trunk/bundles/extensions/discovery/commons/src/main/java/org/apache/sling/discovery/commons/providers/base/ViewStateManagerImpl.java URL: http://svn.apache.org/viewvc/sling/trunk/bundles/extensions/discovery/commons/src/main/java/org/apache/sling/discovery/commons/providers/base/ViewStateManagerImpl.java?rev=1709866&r1=1709865&r2=1709866&view=diff ============================================================================== --- sling/trunk/bundles/extensions/discovery/commons/src/main/java/org/apache/sling/discovery/commons/providers/base/ViewStateManagerImpl.java (original) +++ sling/trunk/bundles/extensions/discovery/commons/src/main/java/org/apache/sling/discovery/commons/providers/base/ViewStateManagerImpl.java Wed Oct 21 15:37:35 2015 @@ -414,6 +414,12 @@ public class ViewStateManagerImpl implem 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)) { Modified: sling/trunk/bundles/extensions/discovery/commons/src/main/java/org/apache/sling/discovery/commons/providers/spi/ConsistencyService.java URL: http://svn.apache.org/viewvc/sling/trunk/bundles/extensions/discovery/commons/src/main/java/org/apache/sling/discovery/commons/providers/spi/ConsistencyService.java?rev=1709866&r1=1709865&r2=1709866&view=diff ============================================================================== --- sling/trunk/bundles/extensions/discovery/commons/src/main/java/org/apache/sling/discovery/commons/providers/spi/ConsistencyService.java (original) +++ sling/trunk/bundles/extensions/discovery/commons/src/main/java/org/apache/sling/discovery/commons/providers/spi/ConsistencyService.java Wed Oct 21 15:37:35 2015 @@ -81,4 +81,6 @@ public interface ConsistencyService { */ void sync(BaseTopologyView view, Runnable callback); + void cancelSync(); + } Modified: sling/trunk/bundles/extensions/discovery/commons/src/main/java/org/apache/sling/discovery/commons/providers/spi/base/BaseSyncTokenConsistencyService.java URL: http://svn.apache.org/viewvc/sling/trunk/bundles/extensions/discovery/commons/src/main/java/org/apache/sling/discovery/commons/providers/spi/base/BaseSyncTokenConsistencyService.java?rev=1709866&r1=1709865&r2=1709866&view=diff ============================================================================== --- sling/trunk/bundles/extensions/discovery/commons/src/main/java/org/apache/sling/discovery/commons/providers/spi/base/BaseSyncTokenConsistencyService.java (original) +++ sling/trunk/bundles/extensions/discovery/commons/src/main/java/org/apache/sling/discovery/commons/providers/spi/base/BaseSyncTokenConsistencyService.java Wed Oct 21 15:37:35 2015 @@ -52,6 +52,11 @@ public abstract class BaseSyncTokenConsi } @Override + public void cancelSync() { + cancelPreviousBackgroundCheck(); + } + + @Override public void sync(BaseTopologyView view, Runnable callback) { // cancel the previous background-check if it's still running cancelPreviousBackgroundCheck(); Modified: sling/trunk/bundles/extensions/discovery/commons/src/test/java/org/apache/sling/discovery/commons/providers/base/ClusterTest.java URL: http://svn.apache.org/viewvc/sling/trunk/bundles/extensions/discovery/commons/src/test/java/org/apache/sling/discovery/commons/providers/base/ClusterTest.java?rev=1709866&r1=1709865&r2=1709866&view=diff ============================================================================== --- sling/trunk/bundles/extensions/discovery/commons/src/test/java/org/apache/sling/discovery/commons/providers/base/ClusterTest.java (original) +++ sling/trunk/bundles/extensions/discovery/commons/src/test/java/org/apache/sling/discovery/commons/providers/base/ClusterTest.java Wed Oct 21 15:37:35 2015 @@ -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; Modified: sling/trunk/bundles/extensions/discovery/commons/src/test/java/org/apache/sling/discovery/commons/providers/base/TestMinEventDelayHandler.java URL: http://svn.apache.org/viewvc/sling/trunk/bundles/extensions/discovery/commons/src/test/java/org/apache/sling/discovery/commons/providers/base/TestMinEventDelayHandler.java?rev=1709866&r1=1709865&r2=1709866&view=diff ============================================================================== --- sling/trunk/bundles/extensions/discovery/commons/src/test/java/org/apache/sling/discovery/commons/providers/base/TestMinEventDelayHandler.java (original) +++ sling/trunk/bundles/extensions/discovery/commons/src/test/java/org/apache/sling/discovery/commons/providers/base/TestMinEventDelayHandler.java Wed Oct 21 15:37:35 2015 @@ -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 Modified: sling/trunk/bundles/extensions/discovery/commons/src/test/java/org/apache/sling/discovery/commons/providers/base/TestViewStateManager.java URL: http://svn.apache.org/viewvc/sling/trunk/bundles/extensions/discovery/commons/src/test/java/org/apache/sling/discovery/commons/providers/base/TestViewStateManager.java?rev=1709866&r1=1709865&r2=1709866&view=diff ============================================================================== --- sling/trunk/bundles/extensions/discovery/commons/src/test/java/org/apache/sling/discovery/commons/providers/base/TestViewStateManager.java (original) +++ sling/trunk/bundles/extensions/discovery/commons/src/test/java/org/apache/sling/discovery/commons/providers/base/TestViewStateManager.java Wed Oct 21 15:37:35 2015 @@ -22,6 +22,8 @@ import static org.junit.Assert.assertEqu 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.common 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 Modified: sling/trunk/bundles/extensions/discovery/impl/src/main/java/org/apache/sling/discovery/impl/DiscoveryServiceImpl.java URL: http://svn.apache.org/viewvc/sling/trunk/bundles/extensions/discovery/impl/src/main/java/org/apache/sling/discovery/impl/DiscoveryServiceImpl.java?rev=1709866&r1=1709865&r2=1709866&view=diff ============================================================================== --- sling/trunk/bundles/extensions/discovery/impl/src/main/java/org/apache/sling/discovery/impl/DiscoveryServiceImpl.java (original) +++ sling/trunk/bundles/extensions/discovery/impl/src/main/java/org/apache/sling/discovery/impl/DiscoveryServiceImpl.java Wed Oct 21 15:37:35 2015 @@ -168,6 +168,11 @@ public class DiscoveryServiceImpl extend logger.debug("sync: no syncToken applicable"); callback.run(); } + + @Override + public void cancelSync() { + // cancelling not applicable + } }; viewStateManager = ViewStateManagerFactory.newViewStateManager(viewStateManagerLock, consistencyService); }