Author: stefanegli
Date: Thu Nov  5 14:27:43 2015
New Revision: 1712784

URL: http://svn.apache.org/viewvc?rev=1712784&view=rev
Log:
SLING-5258 : ensure a new establishedView (with different syncTokenId) always 
triggers a TOPOLOGY_CHANGED - the EstablishedClsuterView therefore now properly 
sets the syncTokenId using the votingId - that will, thanks to SLING-5256 then 
achieves the desired result

Added:
    
sling/trunk/bundles/extensions/discovery/impl/src/test/java/org/apache/sling/discovery/impl/DiscoveryServiceImplTest.java
      - copied, changed from r1712529, 
sling/trunk/bundles/extensions/discovery/impl/src/test/java/org/apache/sling/discovery/impl/cluster/DiscoveryServiceImplTest.java
Removed:
    
sling/trunk/bundles/extensions/discovery/impl/src/test/java/org/apache/sling/discovery/impl/cluster/DiscoveryServiceImplTest.java
Modified:
    
sling/trunk/bundles/extensions/discovery/impl/src/main/java/org/apache/sling/discovery/impl/common/resource/EstablishedClusterView.java

Modified: 
sling/trunk/bundles/extensions/discovery/impl/src/main/java/org/apache/sling/discovery/impl/common/resource/EstablishedClusterView.java
URL: 
http://svn.apache.org/viewvc/sling/trunk/bundles/extensions/discovery/impl/src/main/java/org/apache/sling/discovery/impl/common/resource/EstablishedClusterView.java?rev=1712784&r1=1712783&r2=1712784&view=diff
==============================================================================
--- 
sling/trunk/bundles/extensions/discovery/impl/src/main/java/org/apache/sling/discovery/impl/common/resource/EstablishedClusterView.java
 (original)
+++ 
sling/trunk/bundles/extensions/discovery/impl/src/main/java/org/apache/sling/discovery/impl/common/resource/EstablishedClusterView.java
 Thu Nov  5 14:27:43 2015
@@ -50,7 +50,7 @@ public class EstablishedClusterView exte
     /** Construct a new established cluster view **/
     public EstablishedClusterView(final Config config, final View view,
             final String localId) {
-        super(view.getViewId(), null /* localClusterSyncTokenId not supported 
*/);
+        super(view.getViewId(), view.getResource().getName());
 
         final Resource viewRes = view.getResource();
         if (viewRes == null) {

Copied: 
sling/trunk/bundles/extensions/discovery/impl/src/test/java/org/apache/sling/discovery/impl/DiscoveryServiceImplTest.java
 (from r1712529, 
sling/trunk/bundles/extensions/discovery/impl/src/test/java/org/apache/sling/discovery/impl/cluster/DiscoveryServiceImplTest.java)
URL: 
http://svn.apache.org/viewvc/sling/trunk/bundles/extensions/discovery/impl/src/test/java/org/apache/sling/discovery/impl/DiscoveryServiceImplTest.java?p2=sling/trunk/bundles/extensions/discovery/impl/src/test/java/org/apache/sling/discovery/impl/DiscoveryServiceImplTest.java&p1=sling/trunk/bundles/extensions/discovery/impl/src/test/java/org/apache/sling/discovery/impl/cluster/DiscoveryServiceImplTest.java&r1=1712529&r2=1712784&rev=1712784&view=diff
==============================================================================
--- 
sling/trunk/bundles/extensions/discovery/impl/src/test/java/org/apache/sling/discovery/impl/cluster/DiscoveryServiceImplTest.java
 (original)
+++ 
sling/trunk/bundles/extensions/discovery/impl/src/test/java/org/apache/sling/discovery/impl/DiscoveryServiceImplTest.java
 Thu Nov  5 14:27:43 2015
@@ -16,17 +16,102 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.sling.discovery.impl.cluster;
+package org.apache.sling.discovery.impl;
 
+import static org.junit.Assert.assertEquals;
+
+import org.apache.sling.api.resource.ResourceResolver;
+import org.apache.sling.api.resource.ResourceResolverFactory;
 import org.apache.sling.discovery.base.its.AbstractDiscoveryServiceTest;
+import org.apache.sling.discovery.base.its.setup.VirtualInstance;
 import org.apache.sling.discovery.base.its.setup.VirtualInstanceBuilder;
+import org.apache.sling.discovery.commons.providers.base.DummyListener;
+import org.apache.sling.discovery.impl.DiscoveryServiceImpl;
+import org.apache.sling.discovery.impl.common.heartbeat.HeartbeatHandler;
 import org.apache.sling.discovery.impl.setup.FullJR2VirtualInstanceBuilder;
+import org.junit.Test;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 public class DiscoveryServiceImplTest extends AbstractDiscoveryServiceTest {
 
+    private final Logger logger = LoggerFactory.getLogger(this.getClass());
+
     @Override
     public VirtualInstanceBuilder newBuilder() {
         return new FullJR2VirtualInstanceBuilder();
     }
 
+    @Test
+    public void testLocalClusterSyncTokenIdChange() throws Exception {
+        logger.info("testLocalClusterSyncTokenIdChange: start");
+        logger.info("testLocalClusterSyncTokenIdChange: creating 
instance1...");
+        FullJR2VirtualInstanceBuilder builder1 = 
+                (FullJR2VirtualInstanceBuilder) new 
FullJR2VirtualInstanceBuilder()
+                .setDebugName("instance1")
+                .newRepository("/var/testLocalClusterSyncTokenIdChange/", true)
+                .setConnectorPingInterval(999)
+                .setConnectorPingTimeout(999)
+                .setMinEventDelay(0);
+        VirtualInstance instance1 = builder1.build();
+        logger.info("testLocalClusterSyncTokenIdChange: creating 
instance2...");
+        FullJR2VirtualInstanceBuilder builder2 = 
+                (FullJR2VirtualInstanceBuilder) new 
FullJR2VirtualInstanceBuilder()
+                .setDebugName("instance2")
+                .useRepositoryOf(instance1)
+                .setConnectorPingInterval(999)
+                .setConnectorPingTimeout(999)
+                .setMinEventDelay(0);
+        VirtualInstance instance2 = builder2.build();
+        
+        logger.info("testLocalClusterSyncTokenIdChange: registering 
listener...");
+        DummyListener listener = new DummyListener();
+        DiscoveryServiceImpl discoveryService = (DiscoveryServiceImpl) 
instance1.getDiscoveryService();
+        discoveryService.bindTopologyEventListener(listener);
+        
+        assertEquals(0, 
discoveryService.getViewStateManager().waitForAsyncEvents(2000));
+        assertEquals(0, listener.countEvents());
+        
+        logger.info("testLocalClusterSyncTokenIdChange: doing some 
heartbeating...");
+        instance1.heartbeatsAndCheckView();
+        instance2.heartbeatsAndCheckView();
+        Thread.sleep(1000);
+        instance1.heartbeatsAndCheckView();
+        instance2.heartbeatsAndCheckView();
+        Thread.sleep(1000);
+
+        logger.info("testLocalClusterSyncTokenIdChange: expecting to have 
received the INIT...");
+        assertEquals(0, 
discoveryService.getViewStateManager().waitForAsyncEvents(2000));
+        assertEquals(1, listener.countEvents());
+        
+        ResourceResolverFactory factory = 
instance1.getResourceResolverFactory();
+        ResourceResolver resolver = 
factory.getAdministrativeResourceResolver(null);
+        
+        instance1.heartbeatsAndCheckView();
+        instance2.heartbeatsAndCheckView();
+        Thread.sleep(1000);
+
+        logger.info("testLocalClusterSyncTokenIdChange: after another 
heartbeat nothing more should have been triggered...");
+        assertEquals(0, 
discoveryService.getViewStateManager().waitForAsyncEvents(2000));
+        assertEquals(1, listener.countEvents());
+        
+        // simulate a change in the establishedView's viewId - which can be
+        // achieved by triggering a revoting - which should result with the
+        // same view cos the instances have not changed
+        HeartbeatHandler heartbeatHandler = (HeartbeatHandler) 
instance1.getViewChecker();
+        logger.info("testLocalClusterSyncTokenIdChange: forcing a new voting 
to start...");
+        heartbeatHandler.startNewVoting();
+        
+        logger.info("testLocalClusterSyncTokenIdChange: doing some heartbeats 
to finish the voting...");
+        instance1.heartbeatsAndCheckView();
+        instance2.heartbeatsAndCheckView();
+        Thread.sleep(1000);
+        instance1.heartbeatsAndCheckView();
+        instance2.heartbeatsAndCheckView();
+        Thread.sleep(1000);
+
+        logger.info("testLocalClusterSyncTokenIdChange: now we should have 
gotten a CHANGING/CHANGED pair additionally...");
+        assertEquals(0, 
discoveryService.getViewStateManager().waitForAsyncEvents(2000));
+        assertEquals(3, listener.countEvents());
+    }
 }


Reply via email to