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);
     }


Reply via email to