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/16 17:44:17 UTC

svn commit: r1714628 - /sling/trunk/bundles/extensions/discovery/impl/src/test/java/org/apache/sling/discovery/impl/common/heartbeat/HeartbeatTest.java

Author: stefanegli
Date: Mon Nov 16 16:44:17 2015
New Revision: 1714628

URL: http://svn.apache.org/viewvc?rev=1714628&view=rev
Log:
SLING-5302 : doing test-access to issueHeartbeat synchronized to avoid race-condition with newly re-occurring background-job triggered by triggerAsyncConnectorPing

Modified:
    sling/trunk/bundles/extensions/discovery/impl/src/test/java/org/apache/sling/discovery/impl/common/heartbeat/HeartbeatTest.java

Modified: sling/trunk/bundles/extensions/discovery/impl/src/test/java/org/apache/sling/discovery/impl/common/heartbeat/HeartbeatTest.java
URL: http://svn.apache.org/viewvc/sling/trunk/bundles/extensions/discovery/impl/src/test/java/org/apache/sling/discovery/impl/common/heartbeat/HeartbeatTest.java?rev=1714628&r1=1714627&r2=1714628&view=diff
==============================================================================
--- sling/trunk/bundles/extensions/discovery/impl/src/test/java/org/apache/sling/discovery/impl/common/heartbeat/HeartbeatTest.java (original)
+++ sling/trunk/bundles/extensions/discovery/impl/src/test/java/org/apache/sling/discovery/impl/common/heartbeat/HeartbeatTest.java Mon Nov 16 16:44:17 2015
@@ -55,6 +55,8 @@ import org.junit.Test;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import junitx.util.PrivateAccessor;
+
 public class HeartbeatTest {
     
     private final Logger logger = LoggerFactory.getLogger(this.getClass());
@@ -236,29 +238,39 @@ public class HeartbeatTest {
             logger.info("doTestPartitioning: --------------------------------");
             logger.info("doTestPartitioning: doing pinging with hhSlow now...");
             logger.info("doTestPartitioning: --------------------------------");
-            hhSlow.issueHeartbeat();
-            hhSlow.doCheckView();
+            synchronized(lock(hhSlow)) {
+                hhSlow.issueHeartbeat();
+                hhSlow.doCheckView();
+            }
             if (!scheduler) {
                 logger.info("doTestPartitioning: --------------------------------");
                 logger.info("doTestPartitioning: doing pinging with fastMachine1 now...");
                 logger.info("doTestPartitioning: --------------------------------");
-                fastMachine1.getHeartbeatHandler().issueHeartbeat();
-                fastMachine1.getHeartbeatHandler().doCheckView();
+                synchronized(lock(fastMachine1.getHeartbeatHandler())) {
+                    fastMachine1.getHeartbeatHandler().issueHeartbeat();
+                    fastMachine1.getHeartbeatHandler().doCheckView();
+                }
                 logger.info("doTestPartitioning: --------------------------------");
                 logger.info("doTestPartitioning: doing pinging with fastMachine2 now...");
                 logger.info("doTestPartitioning: --------------------------------");
-                fastMachine2.getHeartbeatHandler().issueHeartbeat();
-                fastMachine2.getHeartbeatHandler().doCheckView();
+                synchronized(lock(fastMachine2.getHeartbeatHandler())) {
+                    fastMachine2.getHeartbeatHandler().issueHeartbeat();
+                    fastMachine2.getHeartbeatHandler().doCheckView();
+                }
                 logger.info("doTestPartitioning: --------------------------------");
                 logger.info("doTestPartitioning: doing pinging with fastMachine3 now...");
                 logger.info("doTestPartitioning: --------------------------------");
-                fastMachine3.getHeartbeatHandler().issueHeartbeat();
-                fastMachine3.getHeartbeatHandler().doCheckView();
+                synchronized(lock(fastMachine3.getHeartbeatHandler())) {
+                    fastMachine3.getHeartbeatHandler().issueHeartbeat();
+                    fastMachine3.getHeartbeatHandler().doCheckView();
+                }
                 logger.info("doTestPartitioning: --------------------------------");
                 logger.info("doTestPartitioning: doing pinging with fastMachine4 now...");
                 logger.info("doTestPartitioning: --------------------------------");
-                fastMachine4.getHeartbeatHandler().issueHeartbeat();
-                fastMachine4.getHeartbeatHandler().doCheckView();
+                synchronized(lock(fastMachine4.getHeartbeatHandler())) {
+                    fastMachine4.getHeartbeatHandler().issueHeartbeat();
+                    fastMachine4.getHeartbeatHandler().doCheckView();
+                }
             }
             Thread.sleep(1000);
         }
@@ -290,14 +302,22 @@ public class HeartbeatTest {
         logger.info("doTestPartitioning: letting slowMachine NOT send any heartbeats for 12sec, only the fast ones do...");
         for(int i=0; i<12; i++) {
             if (!scheduler) {
-                fastMachine1.getHeartbeatHandler().issueHeartbeat();
-                fastMachine1.getHeartbeatHandler().doCheckView();
-                fastMachine2.getHeartbeatHandler().issueHeartbeat();
-                fastMachine2.getHeartbeatHandler().doCheckView();
-                fastMachine3.getHeartbeatHandler().issueHeartbeat();
-                fastMachine3.getHeartbeatHandler().doCheckView();
-                fastMachine4.getHeartbeatHandler().issueHeartbeat();
-                fastMachine4.getHeartbeatHandler().doCheckView();
+                synchronized(lock(fastMachine1.getHeartbeatHandler())) {
+                    fastMachine1.getHeartbeatHandler().issueHeartbeat();
+                    fastMachine1.getHeartbeatHandler().doCheckView();
+                }
+                synchronized(lock(fastMachine2.getHeartbeatHandler())) {
+                    fastMachine2.getHeartbeatHandler().issueHeartbeat();
+                    fastMachine2.getHeartbeatHandler().doCheckView();
+                }
+                synchronized(lock(fastMachine3.getHeartbeatHandler())) {
+                    fastMachine3.getHeartbeatHandler().issueHeartbeat();
+                    fastMachine3.getHeartbeatHandler().doCheckView();
+                }
+                synchronized(lock(fastMachine4.getHeartbeatHandler())) {
+                    fastMachine4.getHeartbeatHandler().issueHeartbeat();
+                    fastMachine4.getHeartbeatHandler().doCheckView();
+                }
             }
             Thread.sleep(1000);
         }
@@ -346,14 +366,22 @@ public class HeartbeatTest {
             // again, can't make any assertion on how many instances the slow non-current view contains...
             //assertEquals(5, slowTopo.getInstances().size());
             if (!scheduler) {
-                fastMachine1.getHeartbeatHandler().issueHeartbeat();
-                fastMachine1.getHeartbeatHandler().doCheckView();
-                fastMachine2.getHeartbeatHandler().issueHeartbeat();
-                fastMachine2.getHeartbeatHandler().doCheckView();
-                fastMachine3.getHeartbeatHandler().issueHeartbeat();
-                fastMachine3.getHeartbeatHandler().doCheckView();
-                fastMachine4.getHeartbeatHandler().issueHeartbeat();
-                fastMachine4.getHeartbeatHandler().doCheckView();
+                synchronized(lock(fastMachine1.getHeartbeatHandler())) {
+                    fastMachine1.getHeartbeatHandler().issueHeartbeat();
+                    fastMachine1.getHeartbeatHandler().doCheckView();
+                }
+                synchronized(lock(fastMachine2.getHeartbeatHandler())) {
+                    fastMachine2.getHeartbeatHandler().issueHeartbeat();
+                    fastMachine2.getHeartbeatHandler().doCheckView();
+                }
+                synchronized(lock(fastMachine3.getHeartbeatHandler())) {
+                    fastMachine3.getHeartbeatHandler().issueHeartbeat();
+                    fastMachine3.getHeartbeatHandler().doCheckView();
+                }
+                synchronized(lock(fastMachine4.getHeartbeatHandler())) {
+                    fastMachine4.getHeartbeatHandler().issueHeartbeat();
+                    fastMachine4.getHeartbeatHandler().doCheckView();
+                }
             }
         }
 
@@ -361,14 +389,22 @@ public class HeartbeatTest {
             hhSlow.issueHeartbeat();
             hhSlow.doCheckView();
             if (!scheduler) {
-                fastMachine1.getHeartbeatHandler().issueHeartbeat();
-                fastMachine1.getHeartbeatHandler().doCheckView();
-                fastMachine2.getHeartbeatHandler().issueHeartbeat();
-                fastMachine2.getHeartbeatHandler().doCheckView();
-                fastMachine3.getHeartbeatHandler().issueHeartbeat();
-                fastMachine3.getHeartbeatHandler().doCheckView();
-                fastMachine4.getHeartbeatHandler().issueHeartbeat();
-                fastMachine4.getHeartbeatHandler().doCheckView();
+                synchronized(lock(fastMachine1.getHeartbeatHandler())) {
+                    fastMachine1.getHeartbeatHandler().issueHeartbeat();
+                    fastMachine1.getHeartbeatHandler().doCheckView();
+                }
+                synchronized(lock(fastMachine2.getHeartbeatHandler())) {
+                    fastMachine2.getHeartbeatHandler().issueHeartbeat();
+                    fastMachine2.getHeartbeatHandler().doCheckView();
+                }
+                synchronized(lock(fastMachine3.getHeartbeatHandler())) {
+                    fastMachine3.getHeartbeatHandler().issueHeartbeat();
+                    fastMachine3.getHeartbeatHandler().doCheckView();
+                }
+                synchronized(lock(fastMachine4.getHeartbeatHandler())) {
+                    fastMachine4.getHeartbeatHandler().issueHeartbeat();
+                    fastMachine4.getHeartbeatHandler().doCheckView();
+                }
             }
             Thread.sleep(1000);
         }
@@ -449,10 +485,14 @@ public class HeartbeatTest {
         // make few rounds of heartbeats so that the two instances see each other
         logger.info("doTestSlowAndFastMachine: send a couple of heartbeats to connect the two..");
         for(int i=0; i<5; i++) {
-            hhSlow.issueHeartbeat();
-            hhSlow.doCheckView();
-            hhFast.issueHeartbeat();
-            hhFast.doCheckView();
+            synchronized(lock(hhSlow)) {
+                hhSlow.issueHeartbeat();
+                hhSlow.doCheckView();
+            }
+            synchronized(lock(hhFast)) {
+                hhFast.issueHeartbeat();
+                hhFast.doCheckView();
+            }
             Thread.sleep(100);
         }
         logger.info("doTestSlowAndFastMachine: now the two instances should be connected.");
@@ -467,12 +507,16 @@ public class HeartbeatTest {
         
         // now let the slow machine be slow while the fast one updates as expected
         logger.info("doTestSlowAndFastMachine: last heartbeat of slowMachine.");
-        hhSlow.issueHeartbeat();
+        synchronized(lock(hhSlow)) {
+            hhSlow.issueHeartbeat();
+        }
         logger.info("doTestSlowAndFastMachine: while the fastMachine still sends heartbeats...");
         for(int i=0; i<6; i++) {
             Thread.sleep(1500);
-            hhFast.issueHeartbeat();
-            hhFast.doCheckView();
+            synchronized(lock(hhFast)) {
+                hhFast.issueHeartbeat();
+                hhFast.doCheckView();
+            }
         }
         logger.info("doTestSlowAndFastMachine: now the fastMachine should have decoupled the slow one");
         fastMachine.dumpRepo();
@@ -494,7 +538,9 @@ public class HeartbeatTest {
         hhSlow.doCheckView();
         slowMachine.dumpRepo();
         logger.info("doTestSlowAndFastMachine: slowMachine is going to also do a heartbeat next");
-        hhSlow.issueHeartbeat();
+        synchronized(lock(hhSlow)) {
+            hhSlow.issueHeartbeat();
+        }
         assertEquals(TopologyEvent.Type.TOPOLOGY_CHANGED, fastListener.getLastEvent().getType());
         assertEquals(3, fastListener.getEventCount());
         assertEquals(TopologyEvent.Type.TOPOLOGY_CHANGING, slowListener.getLastEvent().getType());
@@ -512,10 +558,14 @@ public class HeartbeatTest {
         // make few rounds of heartbeats so that the two instances see each other again
         logger.info("doTestSlowAndFastMachine: now let both fast and slow issue heartbeats...");
         for(int i=0; i<4; i++) {
-            hhFast.issueHeartbeat();
-            hhFast.doCheckView();
-            hhSlow.issueHeartbeat();
-            hhSlow.doCheckView();
+            synchronized(lock(hhFast)) {
+                hhFast.issueHeartbeat();
+                hhFast.doCheckView();
+            }
+            synchronized(lock(hhSlow)) {
+                hhSlow.issueHeartbeat();
+                hhSlow.doCheckView();
+            }
             Thread.sleep(1000);
         }
         logger.info("doTestSlowAndFastMachine: by now the two should have joined");
@@ -532,6 +582,12 @@ public class HeartbeatTest {
         assertEquals(3, slowListener.getEventCount());
     }
     
+    private Object lock(HeartbeatHandler heartbeatHandler) throws NoSuchFieldException {
+        //TODO: refactor HeartbeatHandler to provide such a synchronized method
+        // rather having the test rely on this
+        return PrivateAccessor.getField(heartbeatHandler, "lock");
+    }
+
     /**
      * SLING-5027 : test to reproduce the voting loop
      * (and verify that it's fixed)