Author: stefanegli Date: Mon Jun 22 12:37:19 2015 New Revision: 1686851 URL: http://svn.apache.org/r1686851 Log: SLING-4385 : TopologyEventTest was failing due to listeners of earlier LargeTopologyWithHubTest test still having events enqueued, thus causing a backlog of events, thus the tests own listener would not be served within reasonable amount of time, thus the voting would not conclude. Fixed by making sure a test Instance, when stopped, actually stops handling any subsequent events. This should help avoid any event backlogs. Could also fix other intermittent test failures
Modified: sling/trunk/bundles/extensions/discovery/impl/src/test/java/org/apache/sling/discovery/impl/setup/Instance.java Modified: sling/trunk/bundles/extensions/discovery/impl/src/test/java/org/apache/sling/discovery/impl/setup/Instance.java URL: http://svn.apache.org/viewvc/sling/trunk/bundles/extensions/discovery/impl/src/test/java/org/apache/sling/discovery/impl/setup/Instance.java?rev=1686851&r1=1686850&r2=1686851&view=diff ============================================================================== --- sling/trunk/bundles/extensions/discovery/impl/src/test/java/org/apache/sling/discovery/impl/setup/Instance.java (original) +++ sling/trunk/bundles/extensions/discovery/impl/src/test/java/org/apache/sling/discovery/impl/setup/Instance.java Mon Jun 22 12:37:19 2015 @@ -214,7 +214,7 @@ public class Instance { private MyConfig config; - private EventListener observationListener; + private MyEventListener observationListener; private ObservationManager observationManager; @@ -258,6 +258,63 @@ public class Instance { throws Exception { this("/var/discovery/impl/", debugName, resourceResolverFactory, resetRepo, 20, 20, 1, UUID.randomUUID().toString(), false); } + + private class MyEventListener implements EventListener { + + volatile boolean stopped = false; + private final String slingId; + + public MyEventListener(String slingId) { + this.slingId = slingId; + } + + public void stop() { + logger.debug("stop: stopping listener for slingId: "+slingId); + stopped = true; + } + + public void onEvent(EventIterator events) { + if (stopped) { + logger.info("onEvent: listener: "+slingId+" getting late events even though stopped: "+events.hasNext()); + return; + } + try { + while (!stopped && events.hasNext()) { + Event event = events.nextEvent(); + Properties properties = new Properties(); + String topic; + if (event.getType() == Event.NODE_ADDED) { + topic = SlingConstants.TOPIC_RESOURCE_ADDED; + } else if (event.getType() == Event.NODE_MOVED) { + topic = SlingConstants.TOPIC_RESOURCE_CHANGED; + } else if (event.getType() == Event.NODE_REMOVED) { + topic = SlingConstants.TOPIC_RESOURCE_REMOVED; + } else { + topic = SlingConstants.TOPIC_RESOURCE_CHANGED; + } + try { + properties.put("path", event.getPath()); + org.osgi.service.event.Event osgiEvent = new org.osgi.service.event.Event( + topic, properties); + votingHandler.handleEvent(osgiEvent); + } catch (RepositoryException e) { + logger.warn("RepositoryException: " + e, e); + } + } + if (stopped) { + logger.info("onEvent: listener stopped: "+slingId+", pending events: "+events.hasNext()); + } + } catch (Throwable th) { + try { + dumpRepo(); + } catch (Exception e) { + e.printStackTrace(); + } + logger.error( + "Throwable occurred in onEvent: " + th, th); + } + } + } private Instance(String discoveryResourcePath, String debugName, ResourceResolverFactory resourceResolverFactory, boolean resetRepo, @@ -312,44 +369,7 @@ public class Instance { observationManager = session.getWorkspace() .getObservationManager(); - observationListener = - new EventListener() { - - public void onEvent(EventIterator events) { - try { - while (events.hasNext()) { - Event event = events.nextEvent(); - Properties properties = new Properties(); - String topic; - if (event.getType() == Event.NODE_ADDED) { - topic = SlingConstants.TOPIC_RESOURCE_ADDED; - } else if (event.getType() == Event.NODE_MOVED) { - topic = SlingConstants.TOPIC_RESOURCE_CHANGED; - } else if (event.getType() == Event.NODE_REMOVED) { - topic = SlingConstants.TOPIC_RESOURCE_REMOVED; - } else { - topic = SlingConstants.TOPIC_RESOURCE_CHANGED; - } - try { - properties.put("path", event.getPath()); - org.osgi.service.event.Event osgiEvent = new org.osgi.service.event.Event( - topic, properties); - votingHandler.handleEvent(osgiEvent); - } catch (RepositoryException e) { - logger.warn("RepositoryException: " + e, e); - } - } - } catch (Throwable th) { - try { - dumpRepo(); - } catch (Exception e) { - e.printStackTrace(); - } - logger.error( - "Throwable occurred in onEvent: " + th, th); - } - } - }; + observationListener = new MyEventListener(slingId); observationManager.addEventListener( observationListener , Event.NODE_ADDED | Event.NODE_REMOVED | Event.NODE_MOVED @@ -629,6 +649,9 @@ public class Instance { } else { logger.warn("stop: could not remove listener for slingId="+slingId+", debugName="+debugName+", observationManager="+observationManager+", observationListener="+observationListener); } + if (observationListener!=null) { + observationListener.stop(); + } if (resourceResolver != null) { resourceResolver.close();