You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@sling.apache.org by st...@apache.org on 2015/11/18 13:12:21 UTC

svn commit: r1714984 - in /sling/trunk/bundles/extensions/discovery: commons/src/main/java/org/apache/sling/discovery/commons/providers/base/ commons/src/test/java/org/apache/sling/discovery/commons/providers/base/ impl/src/main/java/org/apache/sling/d...

Author: stefanegli
Date: Wed Nov 18 12:12:21 2015
New Revision: 1714984

URL: http://svn.apache.org/viewvc?rev=1714984&view=rev
Log:
SLING-5310: adding cancelDelaying to MinEventDelayHandler - plus added a testReactivate test method which checks the scenario described in this ticket. Plus also added somewhat more logging to the HeartbeatHandler to help debugging should something similar reoccur

Modified:
    sling/trunk/bundles/extensions/discovery/commons/src/main/java/org/apache/sling/discovery/commons/providers/base/MinEventDelayHandler.java
    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/test/java/org/apache/sling/discovery/commons/providers/base/TestMinEventDelayHandler.java
    sling/trunk/bundles/extensions/discovery/impl/src/main/java/org/apache/sling/discovery/impl/common/heartbeat/HeartbeatHandler.java

Modified: sling/trunk/bundles/extensions/discovery/commons/src/main/java/org/apache/sling/discovery/commons/providers/base/MinEventDelayHandler.java
URL: http://svn.apache.org/viewvc/sling/trunk/bundles/extensions/discovery/commons/src/main/java/org/apache/sling/discovery/commons/providers/base/MinEventDelayHandler.java?rev=1714984&r1=1714983&r2=1714984&view=diff
==============================================================================
--- sling/trunk/bundles/extensions/discovery/commons/src/main/java/org/apache/sling/discovery/commons/providers/base/MinEventDelayHandler.java (original)
+++ sling/trunk/bundles/extensions/discovery/commons/src/main/java/org/apache/sling/discovery/commons/providers/base/MinEventDelayHandler.java Wed Nov 18 12:12:21 2015
@@ -49,6 +49,8 @@ class MinEventDelayHandler {
 
     private Lock lock;
     
+    private volatile int cancelCnt = 0;
+    
     MinEventDelayHandler(ViewStateManagerImpl viewStateManager, Lock lock,
             DiscoveryService discoveryService, Scheduler scheduler,
             long minEventDelaySecs) {
@@ -117,11 +119,17 @@ class MinEventDelayHandler {
     }
     
     private boolean triggerAsyncDelaying(BaseTopologyView newView) {
+        final int validCancelCnt = cancelCnt;
         final boolean triggered = runAfter(minEventDelaySecs /*seconds*/ , new Runnable() {
     
             public void run() {
                 lock.lock();
                 try{
+                    if (cancelCnt!=validCancelCnt) {
+                        logger.info("asyncDelay.run: got cancelled (validCancelCnt="+validCancelCnt+", cancelCnt="+cancelCnt+"), quitting.");
+                        return;
+                    }
+                    
                     // unlock the CHANGED event for any subsequent call to handleTopologyChanged()
                     isDelaying = false;
 
@@ -192,4 +200,10 @@ class MinEventDelayHandler {
         return isDelaying;
     }
 
+    public void cancelDelaying() {
+        logger.info("cancelDelaying: flagging cancelCnt as invalid: "+cancelCnt);
+        cancelCnt++;
+        isDelaying = false;
+    }
+
 }

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=1714984&r1=1714983&r2=1714984&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 Nov 18 12:12:21 2015
@@ -336,6 +336,10 @@ public class ViewStateManagerImpl implem
             if (consistencyService!=null) {
                 consistencyService.cancelSync();
             }
+            
+            if (minEventDelayHandler!=null) {
+                minEventDelayHandler.cancelDelaying();
+            }
             logger.trace("handleDeactivated: setting isChanging to false");
             isChanging = false;
             

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=1714984&r1=1714983&r2=1714984&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 Nov 18 12:12:21 2015
@@ -20,7 +20,9 @@ package org.apache.sling.discovery.commo
 
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNotNull;
 
+import java.lang.reflect.Field;
 import java.util.Random;
 import java.util.UUID;
 import java.util.concurrent.locks.ReentrantLock;
@@ -86,11 +88,82 @@ public class TestMinEventDelayHandler {
         discoveryLogger.setLevel(logLevel);
     }
     
+    
+    @Test
+    public void testReactivate() throws Exception {
+        logger.info("testReactivate: start");
+        // install a minEventDelayHandler with a longer delay of 2sec
+        mgr.installMinEventDelayHandler(sds, scheduler, 2);
+
+        final DummyListener listener = new DummyListener();
+        logger.info("testReactivate: calling handleActivated");
+        mgr.bind(listener);
+        mgr.handleActivated();
+        TestHelper.assertNoEvents(listener);
+        final DummyTopologyView view1 = new DummyTopologyView().addInstance();
+        final DummyTopologyView view2 = DummyTopologyView.clone(view1).addInstance(UUID.randomUUID().toString(), 
+                (DefaultClusterView) view1.getLocalInstance().getClusterView(), false, false);
+        final DummyTopologyView view3 = DummyTopologyView.clone(view1).addInstance(UUID.randomUUID().toString(), 
+                (DefaultClusterView) view1.getLocalInstance().getClusterView(), false, false);
+        logger.info("testReactivate: calling handleNewView...");
+        mgr.handleNewView(view1);
+        logger.info("testReactivate: asserting init event");
+        TestHelper.assertEvents(mgr, listener, EventHelper.newInitEvent(view1));
+        logger.info("testReactivate: calling handleChanging...");
+        mgr.handleChanging();
+        TestHelper.assertEvents(mgr, listener, EventHelper.newChangingEvent(view1));
+        logger.info("testReactivate: calling handleNewView 2nd time...");
+        mgr.handleNewView(view2);
+        TestHelper.assertNoEvents(listener);
+        // make sure the MinEventDelayHandler finds a topology when coming back from the delaying, so:
+        sds.setTopoology(view2);
+        logger.info("testReactivate: waiting for async events to have been processed - max 4sec");
+        assertEquals(0, mgr.waitForAsyncEvents(4000));
+        logger.info("testReactivate: asserting CHANGED event");
+        TestHelper.assertEvents(mgr, listener, EventHelper.newChangedEvent(view1, view2));
+        
+        // now do the above again, but this time do a handleDeactivated before receiving another changed event
+        logger.info("testReactivate: calling handleChanging...");
+        mgr.handleChanging();
+        TestHelper.assertEvents(mgr, listener, EventHelper.newChangingEvent(view2));
+        logger.info("testReactivate: calling handleNewView 2nd time...");
+        mgr.handleNewView(view3);
+        TestHelper.assertNoEvents(listener);
+        // make sure the MinEventDelayHandler finds a topology when coming back from the delaying, so:
+        sds.setTopoology(view3);
+        
+        logger.info("testReactivate: doing handleDeactivated");
+        final AsyncEventSender asyncEventSender = mgr.getAsyncEventSender();
+        Field field = mgr.getClass().getDeclaredField("minEventDelayHandler");
+        field.setAccessible(true);
+        MinEventDelayHandler minEventDelayHandler = (MinEventDelayHandler) field.get(mgr);
+        assertNotNull(minEventDelayHandler);
+        
+        // marking view3 as not current
+        view3.setNotCurrent();
+        sds.setTopoology(view3);
+        
+        mgr.handleDeactivated();
+        TestHelper.assertNoEvents(listener);
+        
+        logger.info("testReactivate: now waiting 5 sec to make sure the MinEventDelayHandler would be finished");
+        TestHelper.assertNoEvents(listener);
+        Thread.sleep(5000);
+        logger.info("testReactivate: after those 5 sec there should however still not be any new event");
+        TestHelper.assertNoEvents(listener);
+
+        int cnt = asyncEventSender.getInFlightEventCnt();
+        if (minEventDelayHandler!=null && minEventDelayHandler.isDelaying()) {
+            cnt++;
+        }
+        assertEquals(0, cnt);
+    }
+
     private void assertNoEvents(DummyListener listener) {
         assertEquals(0, listener.countEvents());
     }
 
-    @Test @Ignore
+    @Test
     public void testNormalDelaying() throws Exception {
         final DummyListener listener = new DummyListener();
         // first activate
@@ -115,7 +188,7 @@ public class TestMinEventDelayHandler {
         }
     }
 
-    @Test @Ignore
+    @Test
     public void testFailedDelaying() throws Exception {
         scheduler.failMode();
         final DummyListener listener = new DummyListener();

Modified: sling/trunk/bundles/extensions/discovery/impl/src/main/java/org/apache/sling/discovery/impl/common/heartbeat/HeartbeatHandler.java
URL: http://svn.apache.org/viewvc/sling/trunk/bundles/extensions/discovery/impl/src/main/java/org/apache/sling/discovery/impl/common/heartbeat/HeartbeatHandler.java?rev=1714984&r1=1714983&r2=1714984&view=diff
==============================================================================
--- sling/trunk/bundles/extensions/discovery/impl/src/main/java/org/apache/sling/discovery/impl/common/heartbeat/HeartbeatHandler.java (original)
+++ sling/trunk/bundles/extensions/discovery/impl/src/main/java/org/apache/sling/discovery/impl/common/heartbeat/HeartbeatHandler.java Wed Nov 18 12:12:21 2015
@@ -471,7 +471,9 @@ public class HeartbeatHandler extends Ba
                 }
                 resetLeaderElectionId = false;
             }
+            logger.debug("issueClusterLocalHeartbeat: committing cluster-local heartbeat to repository for {}", slingId);
             resourceResolver.commit();
+            logger.debug("issueClusterLocalHeartbeat: committed cluster-local heartbeat to repository for {}", slingId);
 
             // SLING-2892: only in success case: remember the last heartbeat value written
             lastHeartbeatWritten = currentTime;