Modified: sling/trunk/bundles/extensions/discovery/commons/src/main/java/org/apache/sling/discovery/commons/providers/spi/base/SyncTokenService.java URL: http://svn.apache.org/viewvc/sling/trunk/bundles/extensions/discovery/commons/src/main/java/org/apache/sling/discovery/commons/providers/spi/base/SyncTokenService.java?rev=1769802&r1=1769801&r2=1769802&view=diff ============================================================================== --- sling/trunk/bundles/extensions/discovery/commons/src/main/java/org/apache/sling/discovery/commons/providers/spi/base/SyncTokenService.java (original) +++ sling/trunk/bundles/extensions/discovery/commons/src/main/java/org/apache/sling/discovery/commons/providers/spi/base/SyncTokenService.java Tue Nov 15 12:38:35 2016 @@ -68,7 +68,7 @@ public class SyncTokenService extends Ab service.activate(); return service; } - + public static SyncTokenService testConstructor( DiscoveryLiteConfig commonsConfig, ResourceResolverFactory resourceResolverFactory, @@ -94,20 +94,20 @@ public class SyncTokenService extends Ab this.slingId = settingsService.getSlingId(); logger.info("activate: activated with slingId="+slingId); } - + public void setConsistencyHistory(ClusterSyncHistory consistencyHistory) { this.clusterSyncHistory = consistencyHistory; } - + public ClusterSyncHistory getClusterSyncHistory() { return clusterSyncHistory; } - + /** Get or create a ResourceResolver **/ protected ResourceResolver getResourceResolver() throws LoginException { - return resourceResolverFactory.getAdministrativeResourceResolver(null); + return resourceResolverFactory.getServiceResourceResolver(null); } - + @Override public void cancelSync() { cancelPreviousBackgroundCheck(); @@ -124,9 +124,9 @@ public class SyncTokenService extends Ab } protected void syncToken(final BaseTopologyView view, final Runnable callback) { - + startBackgroundCheck("SyncTokenService", new BackgroundCheck() { - + @Override public boolean check() { // 1) first storing my syncToken @@ -134,12 +134,12 @@ public class SyncTokenService extends Ab if (!storeMySyncToken(localClusterSyncTokenId)) { // if anything goes wrong above, then this will mean for the others // that they will have to wait until the timeout hits - + // so to try to avoid this, retry storing my sync token later: clusterSyncHistory.addHistoryEntry(view, "storing my syncToken ("+localClusterSyncTokenId+")"); return false; } - + // 2) then check if all others have done the same already return seenAllSyncTokens(view); } @@ -200,7 +200,7 @@ public class SyncTokenService extends Ab Resource resource = ResourceHelper.getOrCreateResource(resourceResolver, getSyncTokenPath()); ValueMap syncTokens = resource.adaptTo(ValueMap.class); String syncToken = view.getLocalClusterSyncTokenId(); - + boolean success = true; StringBuffer historyEntry = new StringBuffer(); for (InstanceDescription instance : view.getLocalInstance().getClusterView().getInstances()) { @@ -232,7 +232,7 @@ public class SyncTokenService extends Ab } else { clusterSyncHistory.addHistoryEntry(view, "seen all syncTokens"); } - + resourceResolver.commit(); logger.info("seenAllSyncTokens: seen all syncTokens!"); return true; @@ -249,5 +249,5 @@ public class SyncTokenService extends Ab } } } - + }
Modified: sling/trunk/bundles/extensions/discovery/commons/src/test/java/org/apache/sling/discovery/commons/providers/base/TestHelper.java URL: http://svn.apache.org/viewvc/sling/trunk/bundles/extensions/discovery/commons/src/test/java/org/apache/sling/discovery/commons/providers/base/TestHelper.java?rev=1769802&r1=1769801&r2=1769802&view=diff ============================================================================== --- sling/trunk/bundles/extensions/discovery/commons/src/test/java/org/apache/sling/discovery/commons/providers/base/TestHelper.java (original) +++ sling/trunk/bundles/extensions/discovery/commons/src/test/java/org/apache/sling/discovery/commons/providers/base/TestHelper.java Tue Nov 15 12:38:35 2016 @@ -19,7 +19,6 @@ package org.apache.sling.discovery.commons.providers.base; import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertTrue; import static org.junit.Assert.assertNull; import static org.junit.Assert.fail; @@ -33,7 +32,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.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -78,7 +76,7 @@ public class TestHelper { if (!mgr.getAsyncEventSender().hasInFlightEvent()) { return; } - + // sleep outside of synchronized to keep test-influence // to a minimum try { @@ -96,7 +94,7 @@ public class TestHelper { } /** does couple loops randomly calling handleChanging() (or not) and then handleNewView(). - * Note: random is passed to allow customizing and not hardcoding this method to a particular random + * Note: random is passed to allow customizing and not hardcoding this method to a particular random * @throws InterruptedException **/ public static void randomEventLoop(ViewStateManagerImpl mgr, DummyDiscoveryService sds, int loopSize, int delayInMillis, final Random random, DummyListener... listeners) throws InterruptedException { for(int i=0; i<loopSize; i++) { 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=1769802&r1=1769801&r2=1769802&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 Tue Nov 15 12:38:35 2016 @@ -28,7 +28,7 @@ import java.util.UUID; import java.util.concurrent.locks.ReentrantLock; import org.apache.log4j.Level; -import org.apache.log4j.LogManager; +import org.apache.log4j.spi.RootLogger; import org.apache.sling.commons.testing.junit.categories.Slow; import org.apache.sling.discovery.commons.providers.BaseTopologyView; import org.apache.sling.discovery.commons.providers.DefaultClusterView; @@ -38,7 +38,6 @@ import org.apache.sling.discovery.common import org.apache.sling.discovery.commons.providers.spi.ClusterSyncService; import org.junit.After; import org.junit.Before; -import org.junit.Ignore; import org.junit.Test; import org.junit.experimental.categories.Category; import org.slf4j.Logger; @@ -49,9 +48,9 @@ public class TestMinEventDelayHandler { private final Logger logger = LoggerFactory.getLogger(this.getClass()); private ViewStateManagerImpl mgr; - + private Random defaultRandom; - + private DummyDiscoveryService sds; private Level logLevel; @@ -61,11 +60,12 @@ public class TestMinEventDelayHandler { @Before public void setup() throws Exception { mgr = new ViewStateManagerImpl(new ReentrantLock(), new ClusterSyncService() { - + + @Override public void sync(BaseTopologyView view, Runnable callback) { callback.run(); } - + @Override public void cancelSync() { // nothing to cancel, we're auto-run @@ -77,7 +77,7 @@ public class TestMinEventDelayHandler { sds = new DummyDiscoveryService(); mgr.installMinEventDelayHandler(sds, scheduler, 1); - final org.apache.log4j.Logger discoveryLogger = LogManager.getRootLogger().getLogger("org.apache.sling.discovery"); + final org.apache.log4j.Logger discoveryLogger = RootLogger.getLogger("org.apache.sling.discovery"); logLevel = discoveryLogger.getLevel(); discoveryLogger.setLevel(Level.INFO); // changed from Level.DEBUG } @@ -86,7 +86,7 @@ public class TestMinEventDelayHandler { public void teardown() throws Exception { mgr = null; defaultRandom= null; - final org.apache.log4j.Logger discoveryLogger = LogManager.getRootLogger().getLogger("org.apache.sling.discovery"); + final org.apache.log4j.Logger discoveryLogger = RootLogger.getLogger("org.apache.sling.discovery"); discoveryLogger.setLevel(logLevel); } @@ -103,9 +103,9 @@ public class TestMinEventDelayHandler { mgr.handleActivated(); TestHelper.assertNoEvents(listener); final DummyTopologyView view1 = new DummyTopologyView().addInstance(); - final DummyTopologyView view2 = DummyTopologyView.clone(view1).addInstance(UUID.randomUUID().toString(), + 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(), + final DummyTopologyView view3 = DummyTopologyView.clone(view1).addInstance(UUID.randomUUID().toString(), (DefaultClusterView) view1.getLocalInstance().getClusterView(), false, false); logger.info("testReactivate: calling handleNewView..."); mgr.handleNewView(view1); @@ -125,7 +125,7 @@ public class TestMinEventDelayHandler { assertEquals(0, mgr.waitForAsyncEvents(2000)); 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(); @@ -135,21 +135,21 @@ public class TestMinEventDelayHandler { 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); @@ -214,7 +214,7 @@ public class TestMinEventDelayHandler { Thread.sleep(1000); } } - + @Test public void testLongMinDelay() throws Exception { mgr.installMinEventDelayHandler(sds, scheduler, 5); 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=1769802&r1=1769801&r2=1769802&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 Tue Nov 15 12:38:35 2016 @@ -31,8 +31,7 @@ import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; import org.apache.log4j.Level; -import org.apache.log4j.LogManager; -import org.apache.sling.commons.testing.junit.categories.Slow; +import org.apache.log4j.spi.RootLogger; import org.apache.sling.discovery.ClusterView; import org.apache.sling.discovery.DiscoveryService; import org.apache.sling.discovery.InstanceDescription; @@ -47,7 +46,6 @@ import org.apache.sling.discovery.common import org.junit.After; import org.junit.Before; import org.junit.Test; -import org.junit.experimental.categories.Category; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -64,7 +62,8 @@ public class TestViewStateManager { this.lock = lock; this.semaphore = semaphore; } - + + @Override public void sync(BaseTopologyView view, Runnable callback) { try { lock.unlock(); @@ -97,22 +96,23 @@ public class TestViewStateManager { @Before public void setup() throws Exception { mgr = new ViewStateManagerImpl(new ReentrantLock(), new ClusterSyncService() { - + + @Override 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 - final org.apache.log4j.Logger discoveryLogger = LogManager.getRootLogger().getLogger("org.apache.sling.discovery"); + final org.apache.log4j.Logger discoveryLogger = RootLogger.getLogger("org.apache.sling.discovery"); logLevel = discoveryLogger.getLevel(); discoveryLogger.setLevel(Level.INFO); } - + @After public void teardown() throws Exception { if (mgr != null) { @@ -121,7 +121,7 @@ public class TestViewStateManager { } mgr = null; defaultRandom= null; - final org.apache.log4j.Logger discoveryLogger = LogManager.getRootLogger().getLogger("org.apache.sling.discovery"); + final org.apache.log4j.Logger discoveryLogger = RootLogger.getLogger("org.apache.sling.discovery"); discoveryLogger.setLevel(logLevel); } @@ -172,7 +172,7 @@ public class TestViewStateManager { mgr.bind(listener); // we should be generous and allow duplicate registration assertTrue(mgr.unbind(listener)); assertFalse(mgr.unbind(listener)); - + mgr.handleActivated(); assertFalse(mgr.unbind(listener)); mgr.bind(listener); @@ -180,7 +180,7 @@ public class TestViewStateManager { assertTrue(mgr.unbind(listener)); assertFalse(mgr.unbind(listener)); } - + @Test public void testBindActivateChangingChanged() throws Exception { final DummyListener listener = new DummyListener(); @@ -195,7 +195,7 @@ public class TestViewStateManager { assertEvents(listener, EventHelper.newInitEvent(view)); randomEventLoop(defaultRandom, listener); } - + @Test public void testBindChangingActivateChanged() throws Exception { final DummyListener listener = new DummyListener(); @@ -210,7 +210,7 @@ public class TestViewStateManager { assertEvents(listener, EventHelper.newInitEvent(view)); randomEventLoop(defaultRandom, listener); } - + @Test public void testBindChangingChangedActivate() throws Exception { final DummyListener listener = new DummyListener(); @@ -225,7 +225,7 @@ public class TestViewStateManager { assertEvents(listener, EventHelper.newInitEvent(view)); randomEventLoop(defaultRandom, listener); } - + @Test public void testBindChangingChangedChangingActivate() throws Exception { final DummyListener listener = new DummyListener(); @@ -245,7 +245,7 @@ public class TestViewStateManager { assertEvents(listener, EventHelper.newInitEvent(view2)); randomEventLoop(defaultRandom, listener); } - + @Test public void testBindChangedChangingActivate() throws Exception { final DummyListener listener = new DummyListener(); @@ -263,18 +263,19 @@ public class TestViewStateManager { assertEvents(listener, EventHelper.newInitEvent(view2)); randomEventLoop(defaultRandom, listener); } - + @Test public void testCancelSync() throws Exception { final List<Runnable> syncCallbacks = new LinkedList<Runnable>(); mgr = new ViewStateManagerImpl(new ReentrantLock(), new ClusterSyncService() { - + + @Override public void sync(BaseTopologyView view, Runnable callback) { synchronized(syncCallbacks) { syncCallbacks.add(callback); } } - + @Override public void cancelSync() { synchronized(syncCallbacks) { @@ -295,7 +296,7 @@ public class TestViewStateManager { } String id1 = UUID.randomUUID().toString(); String id2 = UUID.randomUUID().toString(); - final BaseTopologyView view2 = TestHelper.newView(true, id1, id1, id1, id2); + final BaseTopologyView view2 = TestHelper.newView(true, id1, id1, id1, id2); mgr.handleNewView(view2); assertEquals(0, mgr.waitForAsyncEvents(1000)); TestHelper.assertNoEvents(listener); @@ -307,7 +308,7 @@ public class TestViewStateManager { assertEquals(0, mgr.waitForAsyncEvents(1000)); assertEvents(listener, EventHelper.newInitEvent(view2)); } - + @Test public void testActivateBindChangingChanged() throws Exception { final DummyListener listener = new DummyListener(); @@ -332,7 +333,7 @@ public class TestViewStateManager { mgr.bind(listener); mgr.handleChanging(); DummyTopologyView oldView = new DummyTopologyView().addInstance(); - DefaultInstanceDescription localInstance = + DefaultInstanceDescription localInstance = (DefaultInstanceDescription) oldView.getLocalInstance(); localInstance.setProperty("foo", "bar1"); mgr.handleNewView(oldView); @@ -381,12 +382,12 @@ public class TestViewStateManager { assertEvents(listener, EventHelper.newInitEvent(view)); randomEventLoop(defaultRandom, listener); } - + @Test public void testBindActivateBindChangingChanged() throws Exception { final DummyListener listener1 = new DummyListener(); final DummyListener listener2 = new DummyListener(); - + mgr.bind(listener1); TestHelper.assertNoEvents(listener1); mgr.handleActivated(); @@ -401,7 +402,7 @@ public class TestViewStateManager { mgr.handleNewView(view); assertEvents(listener1, EventHelper.newInitEvent(view)); assertEvents(listener2, EventHelper.newInitEvent(view)); - + randomEventLoop(defaultRandom, listener1, listener2); } @@ -409,7 +410,7 @@ public class TestViewStateManager { public void testBindActivateChangingBindChanged() throws Exception { final DummyListener listener1 = new DummyListener(); final DummyListener listener2 = new DummyListener(); - + mgr.bind(listener1); TestHelper.assertNoEvents(listener1); mgr.handleActivated(); @@ -426,7 +427,7 @@ public class TestViewStateManager { randomEventLoop(defaultRandom, listener1, listener2); } - + @Test public void testActivateBindChangingDuplicateHandleNewView() throws Exception { final DummyListener listener = new DummyListener(); @@ -440,7 +441,7 @@ public class TestViewStateManager { TestHelper.assertNoEvents(listener); randomEventLoop(defaultRandom, listener); } - + @Test public void testActivateBindChangingChangedBindDuplicateHandleNewView() throws Exception { final DummyListener listener1 = new DummyListener(); @@ -450,7 +451,7 @@ public class TestViewStateManager { final DummyTopologyView view = new DummyTopologyView().addInstance(); mgr.handleNewView(view); assertEvents(listener1, EventHelper.newInitEvent(view)); - + final DummyListener listener2 = new DummyListener(); mgr.bind(listener2); mgr.handleNewView(DummyTopologyView.clone(view)); @@ -458,7 +459,7 @@ public class TestViewStateManager { assertEvents(listener2, EventHelper.newInitEvent(view)); randomEventLoop(defaultRandom, listener1, listener2); } - + @Test public void testActivateChangedBindDuplicateHandleNewView() throws Exception { final DummyListener listener = new DummyListener(); @@ -473,7 +474,7 @@ public class TestViewStateManager { TestHelper.assertNoEvents(listener); randomEventLoop(defaultRandom, listener); } - + @Test public void testBindActivateChangedChanged() throws Exception { final DummyListener listener = new DummyListener(); @@ -491,7 +492,7 @@ public class TestViewStateManager { assertEvents(listener, EventHelper.newChangingEvent(view1), EventHelper.newChangedEvent(view1, view2)); randomEventLoop(defaultRandom, listener); } - + @Test public void testBindActivateChangedDeactivateChangingActivateChanged() throws Exception { final DummyListener listener = new DummyListener(); @@ -560,11 +561,11 @@ public class TestViewStateManager { mgr.handleNewView(view2); assertEvents(listener, EventHelper.newInitEvent(view2)); } - + @Test public void testClusterSyncService_noConcurrency() throws Exception { - final org.apache.log4j.Logger commonsLogger = LogManager.getRootLogger().getLogger("org.apache.sling.discovery.commons.providers"); - final org.apache.log4j.Level logLevel = commonsLogger.getLevel(); + final org.apache.log4j.Logger commonsLogger = RootLogger.getLogger("org.apache.sling.discovery.commons.providers"); +// final org.apache.log4j.Level logLevel = commonsLogger.getLevel(); commonsLogger.setLevel(Level.INFO); // change here to DEBUG in case of issues with this test final Semaphore serviceSemaphore = new Semaphore(0); final ReentrantLock lock = new ReentrantLock(); @@ -584,10 +585,11 @@ public class TestViewStateManager { .addInstance(slingId2, cluster, false, false); async(new Runnable() { + @Override public void run() { mgr.handleNewView(view1); } - + }); Thread.sleep(1000); TestHelper.assertNoEvents(listener); @@ -600,10 +602,11 @@ public class TestViewStateManager { view2.removeInstance(slingId2); async(new Runnable() { + @Override public void run() { mgr.handleNewView(view2); } - + }); logger.debug("run: waiting for 1sec"); Thread.sleep(1000); @@ -624,7 +627,7 @@ public class TestViewStateManager { @Test public void testOnlyDiffersInProperties() throws Exception { - final org.apache.log4j.Logger discoveryLogger = LogManager.getRootLogger().getLogger("org.apache.sling.discovery"); + final org.apache.log4j.Logger discoveryLogger = RootLogger.getLogger("org.apache.sling.discovery"); discoveryLogger.setLevel(Level.INFO); // changed from Level.DEBUG logger.info("testOnlyDiffersInProperties: start"); final String slingId1 = UUID.randomUUID().toString(); @@ -639,7 +642,7 @@ public class TestViewStateManager { final DummyTopologyView view2 = DummyTopologyView.clone(view1).removeInstance(slingId2); final DummyTopologyView view3 = DummyTopologyView.clone(view1).removeInstance(slingId2).removeInstance(slingId3); DummyTopologyView view1Cloned = DummyTopologyView.clone(view1); - + logger.info("testOnlyDiffersInProperties: handleNewView(view1)"); mgr.handleNewView(view1); logger.info("testOnlyDiffersInProperties: handleActivated()"); @@ -671,7 +674,7 @@ public class TestViewStateManager { i4_1.setProperty("a", "b"); logger.info("testOnlyDiffersInProperties: onlyDiffersInProperties(view4)"); assertTrue(mgr.onlyDiffersInProperties(view4)); - + DefaultInstanceDescription i5_1 = (DefaultInstanceDescription) view5.getInstance(slingId1); i5_1.setProperty("a", "b"); logger.info("testOnlyDiffersInProperties: onlyDiffersInProperties(view5)"); @@ -701,7 +704,7 @@ public class TestViewStateManager { view6.setId(originalId); logger.info("testOnlyDiffersInProperties: onlyDiffersInProperties(view6) [5]"); assertTrue(mgr.onlyDiffersInProperties(view6)); - + // hack: we're modifying the view *in the ViewStateManagerImpl* here!!: view4.setId(null); Modified: sling/trunk/bundles/extensions/discovery/commons/src/test/java/org/apache/sling/discovery/commons/providers/spi/base/DescriptorHelper.java URL: http://svn.apache.org/viewvc/sling/trunk/bundles/extensions/discovery/commons/src/test/java/org/apache/sling/discovery/commons/providers/spi/base/DescriptorHelper.java?rev=1769802&r1=1769801&r2=1769802&view=diff ============================================================================== --- sling/trunk/bundles/extensions/discovery/commons/src/test/java/org/apache/sling/discovery/commons/providers/spi/base/DescriptorHelper.java (original) +++ sling/trunk/bundles/extensions/discovery/commons/src/test/java/org/apache/sling/discovery/commons/providers/spi/base/DescriptorHelper.java Tue Nov 15 12:38:35 2016 @@ -30,24 +30,23 @@ import org.apache.jackrabbit.commons.Sim import org.apache.jackrabbit.oak.util.GenericDescriptors; import org.apache.sling.api.resource.ResourceResolver; import org.apache.sling.api.resource.ResourceResolverFactory; -import org.apache.sling.discovery.commons.providers.spi.base.DiscoveryLiteDescriptor; public class DescriptorHelper { public static void setDiscoveryLiteDescriptor(ResourceResolverFactory factory, DiscoveryLiteDescriptorBuilder builder) throws Exception { setDescriptor(factory, DiscoveryLiteDescriptor.OAK_DISCOVERYLITE_CLUSTERVIEW, builder.asJson()); } - + public static void setDescriptor(ResourceResolverFactory factory, String key, String value) throws Exception { - ResourceResolver resourceResolver = factory.getAdministrativeResourceResolver(null); + ResourceResolver resourceResolver = factory.getServiceResourceResolver(null); try{ Session session = resourceResolver.adaptTo(Session.class); if (session == null) { return; } Repository repo = session.getRepository(); - + //<hack> // Method setDescriptorMethod = repo.getClass(). // getDeclaredMethod("setDescriptor", String.class, String.class); @@ -67,7 +66,7 @@ public class DescriptorHelper { descriptors.put(key, valueFactory.createValue(value), true, true); } //</hack> - + //<verify-hack> assertEquals(value, repo.getDescriptor(key)); //</verify-hack> Modified: sling/trunk/bundles/extensions/discovery/commons/src/test/java/org/apache/sling/discovery/commons/providers/spi/base/MockedResourceResolver.java URL: http://svn.apache.org/viewvc/sling/trunk/bundles/extensions/discovery/commons/src/test/java/org/apache/sling/discovery/commons/providers/spi/base/MockedResourceResolver.java?rev=1769802&r1=1769801&r2=1769802&view=diff ============================================================================== --- sling/trunk/bundles/extensions/discovery/commons/src/test/java/org/apache/sling/discovery/commons/providers/spi/base/MockedResourceResolver.java (original) +++ sling/trunk/bundles/extensions/discovery/commons/src/test/java/org/apache/sling/discovery/commons/providers/spi/base/MockedResourceResolver.java Tue Nov 15 12:38:35 2016 @@ -96,6 +96,7 @@ public class MockedResourceResolver impl } + @Override @SuppressWarnings("unchecked") public <AdapterType> AdapterType adaptTo(Class<AdapterType> type) { if (type.equals(Session.class)) { @@ -110,27 +111,33 @@ public class MockedResourceResolver impl throw new UnsupportedOperationException("Not implemented"); } + @Override public Resource resolve(HttpServletRequest request, String absPath) { throw new UnsupportedOperationException("Not implemented"); } + @Override public Resource resolve(String absPath) { throw new UnsupportedOperationException("Not implemented"); } + @Override @Deprecated public Resource resolve(HttpServletRequest request) { throw new UnsupportedOperationException("Not implemented"); } + @Override public String map(String resourcePath) { throw new UnsupportedOperationException("Not implemented"); } + @Override public String map(HttpServletRequest request, String resourcePath) { throw new UnsupportedOperationException("Not implemented"); } + @Override public Resource getResource(String path) { Session session; try { @@ -144,6 +151,7 @@ public class MockedResourceResolver impl return new MockedResource(this, path, "nt:unstructured"); } + @Override public Resource getResource(Resource base, String path) { if (base.getPath().equals("/")) { return getResource("/" + path); @@ -152,20 +160,24 @@ public class MockedResourceResolver impl } } + @Override public String[] getSearchPath() { throw new UnsupportedOperationException("Not implemented"); } + @Override public Iterator<Resource> listChildren(Resource parent) { try { Node node = parent.adaptTo(Node.class); final NodeIterator nodes = node.getNodes(); return new Iterator<Resource>() { + @Override public void remove() { throw new UnsupportedOperationException(); } + @Override public Resource next() { Node next = nodes.nextNode(); try { @@ -177,6 +189,7 @@ public class MockedResourceResolver impl } } + @Override public boolean hasNext() { return nodes.hasNext(); } @@ -186,28 +199,34 @@ public class MockedResourceResolver impl } } + @Override public Iterable<Resource> getChildren(Resource parent) { throw new UnsupportedOperationException("Not implemented"); } + @Override public Iterator<Resource> findResources(String query, String language) { throw new UnsupportedOperationException("Not implemented"); } + @Override public Iterator<Map<String, Object>> queryResources(String query, String language) { throw new UnsupportedOperationException("Not implemented"); } + @Override public ResourceResolver clone(Map<String, Object> authenticationInfo) throws LoginException { throw new UnsupportedOperationException("Not implemented"); } + @Override public boolean isLive() { throw new UnsupportedOperationException("Not implemented"); } + @Override public void close() { Iterator<MockedResource> it = resources.iterator(); while (it.hasNext()) { @@ -226,18 +245,22 @@ public class MockedResourceResolver impl resources.add(mockedResource); } + @Override public String getUserID() { throw new UnsupportedOperationException("Not implemented"); } + @Override public Iterator<String> getAttributeNames() { throw new UnsupportedOperationException("Not implemented"); } + @Override public Object getAttribute(String name) { throw new UnsupportedOperationException("Not implemented"); } + @Override public void delete(Resource resource) throws PersistenceException { if (resources.contains(resource)) { resources.remove(resource); @@ -252,6 +275,7 @@ public class MockedResourceResolver impl } } + @Override public Resource create(Resource parent, String name, Map<String, Object> properties) throws PersistenceException { final Node parentNode = parent.adaptTo(Node.class); @@ -286,6 +310,7 @@ public class MockedResourceResolver impl } } + @Override public void revert() { try { this.session.refresh(false); @@ -294,6 +319,7 @@ public class MockedResourceResolver impl } } + @Override public void commit() throws PersistenceException { try { this.session.save(); @@ -302,37 +328,43 @@ public class MockedResourceResolver impl } } + @Override public boolean hasChanges() { throw new UnsupportedOperationException("Not implemented"); } + @Override public String getParentResourceType(Resource resource) { // TODO Auto-generated method stub return null; } + @Override public String getParentResourceType(String resourceType) { // TODO Auto-generated method stub return null; } + @Override public boolean isResourceType(Resource resource, String resourceType) { // TODO Auto-generated method stub return false; } + @Override public void refresh() { // TODO Auto-generated method stub } @Override - public Resource getParent(Resource child) { - throw new UnsupportedOperationException("Not implemented"); + public boolean hasChildren(Resource arg0) { + Iterable<Resource> iter = this.getChildren(arg0); + return iter.iterator().hasNext(); } @Override - public boolean hasChildren(Resource resource) { + public Resource getParent(Resource child) { throw new UnsupportedOperationException("Not implemented"); } Modified: sling/trunk/bundles/extensions/discovery/commons/src/test/java/org/apache/sling/discovery/commons/providers/spi/base/RepositoryTestHelper.java URL: http://svn.apache.org/viewvc/sling/trunk/bundles/extensions/discovery/commons/src/test/java/org/apache/sling/discovery/commons/providers/spi/base/RepositoryTestHelper.java?rev=1769802&r1=1769801&r2=1769802&view=diff ============================================================================== --- sling/trunk/bundles/extensions/discovery/commons/src/test/java/org/apache/sling/discovery/commons/providers/spi/base/RepositoryTestHelper.java (original) +++ sling/trunk/bundles/extensions/discovery/commons/src/test/java/org/apache/sling/discovery/commons/providers/spi/base/RepositoryTestHelper.java Tue Nov 15 12:38:35 2016 @@ -64,10 +64,10 @@ import org.slf4j.LoggerFactory; public class RepositoryTestHelper { private final static Logger logger = LoggerFactory.getLogger(RepositoryTestHelper.class); - + public static void dumpRepo(ResourceResolverFactory resourceResolverFactory) throws Exception { Session session = resourceResolverFactory - .getAdministrativeResourceResolver(null).adaptTo(Session.class); + .getServiceResourceResolver(null).adaptTo(Session.class); logger.info("dumpRepo: ====== START ====="); logger.info("dumpRepo: repo = " + session.getRepository()); @@ -78,7 +78,7 @@ public class RepositoryTestHelper { session.logout(); } - + public static void dump(Node node) throws RepositoryException { if (node.getPath().equals("/jcr:system") || node.getPath().equals("/rep:policy")) { @@ -153,7 +153,7 @@ public class RepositoryTestHelper { public static Repository createOakRepository() { return createOakRepository(new MemoryNodeStore()); } - + public static Repository createOakRepository(NodeStore nodeStore) { DefaultWhiteboard whiteboard = new DefaultWhiteboard(); final Oak oak = new Oak(nodeStore) @@ -191,7 +191,7 @@ public class RepositoryTestHelper { // .withAsyncIndexing() .with(whiteboard) ; - + // if (commitRateLimiter != null) { // oak.with(commitRateLimiter); // } @@ -229,14 +229,16 @@ public class RepositoryTestHelper { context.checking(new Expectations() { { allowing(resourceResolverFactory) - .getAdministrativeResourceResolver(null); + .getServiceResourceResolver(null); will(new Action() { + @Override public Object invoke(Invocation invocation) throws Throwable { return new MockedResourceResolver(repositoryOrNull); } + @Override public void describeTo(Description arg0) { arg0.appendText("whateva - im going to create a new mockedresourceresolver"); } Modified: sling/trunk/bundles/extensions/discovery/impl/pom.xml URL: http://svn.apache.org/viewvc/sling/trunk/bundles/extensions/discovery/impl/pom.xml?rev=1769802&r1=1769801&r2=1769802&view=diff ============================================================================== --- sling/trunk/bundles/extensions/discovery/impl/pom.xml (original) +++ sling/trunk/bundles/extensions/discovery/impl/pom.xml Tue Nov 15 12:38:35 2016 @@ -153,7 +153,7 @@ <dependency> <groupId>org.apache.sling</groupId> <artifactId>org.apache.sling.discovery.commons</artifactId> - <version>1.0.4</version> + <version>1.0.17-SNAPSHOT</version> <scope>provided</scope> </dependency> <!-- besides including discovery.commons' normal jar above, @@ -162,7 +162,7 @@ <dependency> <groupId>org.apache.sling</groupId> <artifactId>org.apache.sling.discovery.commons</artifactId> - <version>1.0.4</version> + <version>1.0.17-SNAPSHOT</version> <scope>test</scope> <type>test-jar</type> </dependency> @@ -185,7 +185,7 @@ <dependency> <groupId>org.apache.sling</groupId> <artifactId>org.apache.sling.api</artifactId> - <version>2.4.0</version> + <version>2.5.0</version> <scope>provided</scope> </dependency> <dependency> 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=1769802&r1=1769801&r2=1769802&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 Tue Nov 15 12:38:35 2016 @@ -103,7 +103,7 @@ public class DiscoveryServiceImpl extend logger.debug("sync: no syncToken applicable"); callback.run(); } - + @Override public void cancelSync() { // cancelling not applicable @@ -115,7 +115,7 @@ public class DiscoveryServiceImpl extend @Reference(cardinality = ReferenceCardinality.OPTIONAL_MULTIPLE, policy = ReferencePolicy.DYNAMIC, referenceInterface = TopologyEventListener.class) private TopologyEventListener[] eventListeners = new TopologyEventListener[0]; - + /** * All property providers. */ @@ -151,7 +151,7 @@ public class DiscoveryServiceImpl extend @Reference private Config config; - + @Reference private SyncTokenService syncTokenService; @@ -162,15 +162,16 @@ public class DiscoveryServiceImpl extend private ViewStateManager viewStateManager; - private final ReentrantLock viewStateManagerLock = new ReentrantLock(); - + private final ReentrantLock viewStateManagerLock = new ReentrantLock(); + private final List<TopologyEventListener> pendingListeners = new LinkedList<TopologyEventListener>(); private TopologyEventListener changePropagationListener = new TopologyEventListener() { + @Override public void handleTopologyEvent(TopologyEvent event) { HeartbeatHandler handler = heartbeatHandler; - if (activated && handler != null + if (activated && handler != null && (event.getType() == Type.TOPOLOGY_CHANGED || event.getType() == Type.PROPERTIES_CHANGED)) { logger.info("changePropagationListener.handleTopologyEvent: topology changed - propagate through connectors"); handler.triggerAsyncConnectorPing(); @@ -179,8 +180,8 @@ public class DiscoveryServiceImpl extend }; /** for testing only **/ - public static BaseDiscoveryService testConstructor(ResourceResolverFactory resourceResolverFactory, - AnnouncementRegistry announcementRegistry, + public static BaseDiscoveryService testConstructor(ResourceResolverFactory resourceResolverFactory, + AnnouncementRegistry announcementRegistry, ConnectorRegistry connectorRegistry, ClusterViewServiceImpl clusterViewService, HeartbeatHandler heartbeatHandler, @@ -225,11 +226,12 @@ public class DiscoveryServiceImpl extend logger.warn("registerMBean: Unable to register DiscoveryServiceImpl MBean", t); } } - + + @Override protected void handleIsolatedFromTopology() { if (heartbeatHandler!=null) { // SLING-5030 part 2: when we detect being isolated we should - // step at the end of the leader-election queue and + // step at the end of the leader-election queue and // that can be achieved by resetting the leaderElectionId // (which will in turn take effect on the next round of // voting, or also double-checked when the local instance votes) @@ -244,7 +246,7 @@ public class DiscoveryServiceImpl extend } } } - + /** * Activate this service */ @@ -287,7 +289,7 @@ public class DiscoveryServiceImpl extend // the first TOPOLOGY_INIT and afterwards DefaultClusterView isolatedCluster = new DefaultClusterView(isolatedClusterId); Map<String, String> emptyProperties = new HashMap<String, String>(); - DefaultInstanceDescription isolatedInstance = + DefaultInstanceDescription isolatedInstance = new DefaultInstanceDescription(isolatedCluster, true, true, slingId, emptyProperties); Collection<InstanceDescription> col = new ArrayList<InstanceDescription>(); col.add(isolatedInstance); @@ -327,7 +329,7 @@ public class DiscoveryServiceImpl extend viewStateManager.bind(listener); } pendingListeners.clear(); - + viewStateManager.bind(changePropagationListener); } finally { if (viewStateManagerLock!=null) { @@ -349,8 +351,8 @@ public class DiscoveryServiceImpl extend } } } - - registerMBean(bundleContext); + + registerMBean(bundleContext); logger.debug("DiscoveryServiceImpl activated."); } @@ -367,7 +369,7 @@ public class DiscoveryServiceImpl extend viewStateManager.unbind(changePropagationListener); viewStateManager.handleDeactivated(); } - + activated = false; } finally { if (viewStateManagerLock!=null) { @@ -512,7 +514,7 @@ public class DiscoveryServiceImpl extend ResourceResolver resourceResolver = null; try { resourceResolver = resourceResolverFactory - .getAdministrativeResourceResolver(null); + .getServiceResourceResolver(null); Resource myInstance = ResourceHelper .getOrCreateResource( @@ -642,6 +644,7 @@ public class DiscoveryServiceImpl extend /** * @see java.lang.Comparable#compareTo(java.lang.Object) */ + @Override public int compareTo(final ProviderInfo o) { // Sort by rank in ascending order. if (this.ranking < o.ranking) { @@ -666,10 +669,10 @@ public class DiscoveryServiceImpl extend return provider.hashCode(); } } - - /** + + /** * only checks for local clusterView changes. - * thus eg avoids doing synchronized with annotationregistry + * thus eg avoids doing synchronized with annotationregistry **/ public void checkForLocalClusterViewChange() { viewStateManagerLock.lock(); @@ -772,20 +775,22 @@ public class DiscoveryServiceImpl extend activated = false; } } - + + @Override protected ClusterViewService getClusterViewService() { return clusterViewService; } - + public ClusterViewServiceImpl getClusterViewServiceImpl() { return clusterViewService; } + @Override protected AnnouncementRegistry getAnnouncementRegistry() { return announcementRegistry; } - /** for testing only + /** for testing only * @return */ protected ViewStateManager getViewStateManager() { return viewStateManager; Modified: sling/trunk/bundles/extensions/discovery/impl/src/main/java/org/apache/sling/discovery/impl/TopologyWebConsolePlugin.java URL: http://svn.apache.org/viewvc/sling/trunk/bundles/extensions/discovery/impl/src/main/java/org/apache/sling/discovery/impl/TopologyWebConsolePlugin.java?rev=1769802&r1=1769801&r2=1769802&view=diff ============================================================================== --- sling/trunk/bundles/extensions/discovery/impl/src/main/java/org/apache/sling/discovery/impl/TopologyWebConsolePlugin.java (original) +++ sling/trunk/bundles/extensions/discovery/impl/src/main/java/org/apache/sling/discovery/impl/TopologyWebConsolePlugin.java Tue Nov 15 12:38:35 2016 @@ -44,7 +44,6 @@ import org.apache.felix.scr.annotations. import org.apache.felix.scr.annotations.Properties; import org.apache.felix.scr.annotations.Property; import org.apache.felix.scr.annotations.Reference; -import org.apache.felix.scr.annotations.ReferenceCardinality; import org.apache.felix.scr.annotations.Service; import org.apache.felix.webconsole.AbstractWebConsolePlugin; import org.apache.felix.webconsole.WebConsoleConstants; @@ -175,6 +174,7 @@ public class TopologyWebConsolePlugin ex tv.findInstances(new InstanceFilter() { + @Override public boolean accept(InstanceDescription instance) { String slingId = instance.getSlingId(); if (logger.isDebugEnabled()) { @@ -483,7 +483,7 @@ public class TopologyWebConsolePlugin ex pw.println("</tbody>"); pw.println("</table>"); } - + private String beautifiedDueTime(long secondsDue) { if (secondsDue<-1) { return "overdue"; @@ -569,6 +569,7 @@ public class TopologyWebConsolePlugin ex /** * keep a truncated history of the log events for information purpose (to be shown in the webconsole) */ + @Override public void handleTopologyEvent(final TopologyEvent event) { if (event.getType() == Type.PROPERTIES_CHANGED) { this.currentView = event.getNewView(); @@ -600,7 +601,7 @@ public class TopologyWebConsolePlugin ex sb.append(", "); } sb.append("on instance " - + newInstanceDescription.getSlingId() + (newInstanceDescription.isLeader() ? " [isLeader]" : "") + + newInstanceDescription.getSlingId() + (newInstanceDescription.isLeader() ? " [isLeader]" : "") + ": " + diff); } } @@ -669,7 +670,7 @@ public class TopologyWebConsolePlugin ex } } } - + addEventLog( event.getType(), "old view: " + shortViewInfo(event.getOldView()) @@ -688,6 +689,7 @@ public class TopologyWebConsolePlugin ex Set<InstanceDescription> foundInstances = view .findInstances(new InstanceFilter() { + @Override public boolean accept(InstanceDescription instance) { return instance.getSlingId().equals(slingId); } @@ -920,7 +922,7 @@ public class TopologyWebConsolePlugin ex } pw.println(); pw.println(); - + } /** Modified: sling/trunk/bundles/extensions/discovery/impl/src/main/java/org/apache/sling/discovery/impl/cluster/ClusterViewServiceImpl.java URL: http://svn.apache.org/viewvc/sling/trunk/bundles/extensions/discovery/impl/src/main/java/org/apache/sling/discovery/impl/cluster/ClusterViewServiceImpl.java?rev=1769802&r1=1769801&r2=1769802&view=diff ============================================================================== --- sling/trunk/bundles/extensions/discovery/impl/src/main/java/org/apache/sling/discovery/impl/cluster/ClusterViewServiceImpl.java (original) +++ sling/trunk/bundles/extensions/discovery/impl/src/main/java/org/apache/sling/discovery/impl/cluster/ClusterViewServiceImpl.java Tue Nov 15 12:38:35 2016 @@ -69,13 +69,14 @@ public class ClusterViewServiceImpl impl return service; } + @Override public String getSlingId() { if (settingsService==null) { return null; } return settingsService.getSlingId(); } - + public void invalidateEstablishedViewId(String establishedViewId) { if (establishedViewId != null && (failedEstablishedViewId == null || @@ -85,6 +86,7 @@ public class ClusterViewServiceImpl impl failedEstablishedViewId = establishedViewId; } + @Override public LocalClusterView getLocalClusterView() throws UndefinedClusterViewException { if (resourceResolverFactory==null) { logger.warn("getClusterView: no resourceResolverFactory set at the moment."); @@ -94,7 +96,7 @@ public class ClusterViewServiceImpl impl ResourceResolver resourceResolver = null; try { resourceResolver = resourceResolverFactory - .getAdministrativeResourceResolver(null); + .getServiceResourceResolver(null); View view = ViewHelper.getEstablishedView(resourceResolver, config); if (view == null) { @@ -102,11 +104,11 @@ public class ClusterViewServiceImpl impl throw new UndefinedClusterViewException(Reason.NO_ESTABLISHED_VIEW, "no established view at the moment"); } - + if (failedEstablishedViewId != null && failedEstablishedViewId.equals(view.getResource().getName())) { // SLING-5195 : the heartbeat-handler-self-check has declared the currently - // established view as invalid - hence we should now treat this as + // established view as invalid - hence we should now treat this as // undefined clusterview logger.debug("getClusterView: current establishedView is marked as invalid: "+failedEstablishedViewId); throw new UndefinedClusterViewException(Reason.NO_ESTABLISHED_VIEW, @@ -115,7 +117,7 @@ public class ClusterViewServiceImpl impl EstablishedClusterView clusterViewImpl = new EstablishedClusterView( config, view, getSlingId()); - + InstanceDescription local = clusterViewImpl.getLocalInstance(); if (local != null) { return clusterViewImpl; @@ -124,7 +126,7 @@ public class ClusterViewServiceImpl impl + "This is normal at startup. At other times is pseudo-network-partitioning is an indicator for repository/network-delays or clocks-out-of-sync (SLING-3432). " + "(increasing the heartbeatTimeout can help as a workaround too) " + "The local instance will stay in TOPOLOGY_CHANGING or pre _INIT mode until a new vote was successful."); - throw new UndefinedClusterViewException(Reason.ISOLATED_FROM_TOPOLOGY, + throw new UndefinedClusterViewException(Reason.ISOLATED_FROM_TOPOLOGY, "established view does not include local instance - isolated"); } } catch (UndefinedClusterViewException e) { Modified: sling/trunk/bundles/extensions/discovery/impl/src/main/java/org/apache/sling/discovery/impl/cluster/voting/VotingHandler.java URL: http://svn.apache.org/viewvc/sling/trunk/bundles/extensions/discovery/impl/src/main/java/org/apache/sling/discovery/impl/cluster/voting/VotingHandler.java?rev=1769802&r1=1769801&r2=1769802&view=diff ============================================================================== --- sling/trunk/bundles/extensions/discovery/impl/src/main/java/org/apache/sling/discovery/impl/cluster/voting/VotingHandler.java (original) +++ sling/trunk/bundles/extensions/discovery/impl/src/main/java/org/apache/sling/discovery/impl/cluster/voting/VotingHandler.java Tue Nov 15 12:38:35 2016 @@ -62,7 +62,7 @@ import org.slf4j.LoggerFactory; @Component(immediate = true) @Service(value = {VotingHandler.class}) public class VotingHandler implements EventHandler { - + public static enum VotingDetail { PROMOTED, WINNING, @@ -71,9 +71,10 @@ public class VotingHandler implements Ev UNCHANGED, TIMEDOUT } - + private final static Comparator<VotingView> VOTING_COMPARATOR = new Comparator<VotingView>() { + @Override public int compare(VotingView o1, VotingView o2) { if (o1 == o2) { return 0; @@ -88,7 +89,7 @@ public class VotingHandler implements Ev return (o1.getVotingId().compareTo(o2.getVotingId())); } }; - + /** the name used for the period job with the scheduler **/ protected String NAME = "discovery.impl.analyzeVotings.runner."; @@ -114,7 +115,7 @@ public class VotingHandler implements Ev private volatile boolean activated; private ComponentContext context; - + private ServiceRegistration eventHandlerRegistration; /** for testing only **/ @@ -137,7 +138,7 @@ public class VotingHandler implements Ev activated = false; logger.info("deactivate: deactivated slingId: {}, this: {}", slingId, this); } - + @Activate protected void activate(final ComponentContext context) { slingId = slingSettingsService.getSlingId(); @@ -145,8 +146,8 @@ public class VotingHandler implements Ev + "." + slingId); this.context = context; activated = true; - - // once activated, register the eventHandler so that we can + + // once activated, register the eventHandler so that we can // start receiving and processing votings... registerEventHandler(); logger.info("activated: activated ("+slingId+")"); @@ -179,6 +180,7 @@ public class VotingHandler implements Ev /** * handle repository changes and react to ongoing votings */ + @Override public void handleEvent(final Event event) { if (!activated) { return; @@ -198,7 +200,7 @@ public class VotingHandler implements Ev ResourceResolver resourceResolver = null; try { resourceResolver = resolverFactory - .getAdministrativeResourceResolver(null); + .getServiceResourceResolver(null); } catch (LoginException e) { logger.error( "handleEvent: could not log in administratively: " + e, e); @@ -252,14 +254,14 @@ public class VotingHandler implements Ev } // SLING-3406: committing resourceResolver/session here, while we're in the synchronized resourceResolver.commit(); - + // for test verification result.put(winningVote, VotingDetail.PROMOTED); return result; } else { logger.info("analyzeVotings: there is a winning vote. No need to vote any further. Expecting it to get promoted to established: " + winningVote); - + result.put(winningVote, VotingDetail.WINNING); return result; } @@ -317,7 +319,7 @@ public class VotingHandler implements Ev continue; } if (yesVote != null) { - // as soon as I found the one I should vote yes for, + // as soon as I found the one I should vote yes for, // vote no for the rest if (!votedNo) { logger.info("analyzeVotings: already voted yes, so voting no for: "+voting); @@ -351,7 +353,7 @@ public class VotingHandler implements Ev logger.debug("analyzeVotings: result: my yes vote was for: " + yesVote); return result; } - + public void cleanupTimedoutVotings(final ResourceResolver resourceResolver) { List<VotingView> timedoutVotings = VotingHelper .listTimedoutVotings(resourceResolver, @@ -410,7 +412,7 @@ public class VotingHandler implements Ev previousViewsResource = ResourceHelper .getOrCreateResource( resourceResolver, - config.getPreviousViewPath()); + config.getPreviousViewPath()); } // step 2: retire the existing established view. @@ -427,7 +429,7 @@ public class VotingHandler implements Ev logger.debug("promote: moving the old established view to previous views: " + retiredView.getPath()); } - ResourceHelper.moveResource(retiredView, + ResourceHelper.moveResource(retiredView, previousViewsResource.getPath() + "/" + retiredView.getName()); } else { 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=1769802&r1=1769801&r2=1769802&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 Tue Nov 15 12:38:35 2016 @@ -99,13 +99,13 @@ public class HeartbeatHandler extends Ba /** whether or not to reset the leaderElectionId at next heartbeat time **/ private volatile boolean resetLeaderElectionId = false; - /** SLING-5030 : upon resetLeaderElectionId() a newLeaderElectionId is calculated + /** SLING-5030 : upon resetLeaderElectionId() a newLeaderElectionId is calculated * and passed on to the VotingHandler - but the actual storing under ./clusterInstances * is only done on heartbeats - this field is used to temporarily store the new * leaderElectionId that the next heartbeat then stores */ private volatile String newLeaderElectionId; - + /** SLING-2892: remember first heartbeat written to repository by this instance **/ private long firstHeartbeatWritten = -1; @@ -123,10 +123,10 @@ public class HeartbeatHandler extends Ba /** for testing only **/ public static HeartbeatHandler testConstructor( SlingSettingsService slingSettingsService, - ResourceResolverFactory factory, - AnnouncementRegistry announcementRegistry, + ResourceResolverFactory factory, + AnnouncementRegistry announcementRegistry, ConnectorRegistry connectorRegistry, - Config config, + Config config, Scheduler scheduler, VotingHandler votingHandler) { HeartbeatHandler handler = new HeartbeatHandler(); @@ -139,37 +139,37 @@ public class HeartbeatHandler extends Ba handler.votingHandler = votingHandler; return handler; } - + @Override protected AnnouncementRegistry getAnnouncementRegistry() { return announcementRegistry; } - + @Override protected BaseConfig getConnectorConfig() { return config; } - + @Override protected ConnectorRegistry getConnectorRegistry() { return connectorRegistry; } - + @Override protected ResourceResolverFactory getResourceResolverFactory() { return resourceResolverFactory; } - + @Override protected Scheduler getScheduler() { return scheduler; } - + @Override protected SlingSettingsService getSlingSettingsService() { return slingSettingsService; } - + @Override protected void doActivate() { // on activate the resetLeaderElectionId is set to true to ensure that @@ -186,7 +186,7 @@ public class HeartbeatHandler extends Ba logger.info("doActivate: activated with runtimeId: {}, slingId: {}", runtimeId, slingId); } - + @Override protected void deactivate() { super.deactivate(); @@ -195,7 +195,7 @@ public class HeartbeatHandler extends Ba periodicCheckJob = null; } } - + /** * The initialize method is called by the DiscoveryServiceImpl.activate * as we require the discoveryService (and the discoveryService has @@ -232,7 +232,7 @@ public class HeartbeatHandler extends Ba } // SLING-5195 - to account for repository delays, the writing of heartbeats and voting - // should be done independently of getting the current clusterView and + // should be done independently of getting the current clusterView and // potentially sending a topology event. // so this second part is now done (additionally) in a 2nd runner here: try { @@ -263,7 +263,7 @@ public class HeartbeatHandler extends Ba + " => maxMillisSinceHb=" + maxMillisSinceHb + "). Flagging us as (still) changing"); // mark the current establishedView as faulty invalidateCurrentEstablishedView(); - + // then tell the listeners immediately // note that just calling handleTopologyChanging alone - without the above invalidate - // won't be sufficient, because that would only affect the listeners, not the @@ -278,7 +278,7 @@ public class HeartbeatHandler extends Ba discoveryService.checkForLocalClusterViewChange(); logger.debug("checkForLocalClusterViewChange/.run: check for topology change done."); } - + }); } catch (Exception e) { logger.error("activate: Could not start heartbeat runner: " + e, e); @@ -291,7 +291,7 @@ public class HeartbeatHandler extends Ba logger.error("getResourceResolver: resourceResolverFactory is null!"); return null; } - return resourceResolverFactory.getAdministrativeResourceResolver(null); + return resourceResolverFactory.getServiceResourceResolver(null); } /** Calcualte the local cluster instance path **/ @@ -300,7 +300,7 @@ public class HeartbeatHandler extends Ba } /** - * Hook that will cause a reset of the leaderElectionId + * Hook that will cause a reset of the leaderElectionId * on next invocation of issueClusterLocalHeartbeat. * @return true if the leaderElectionId was reset - false if that was not * necessary as that happened earlier already and it has not propagated @@ -345,12 +345,14 @@ public class HeartbeatHandler extends Ba * and then a remote heartbeat (to all the topology connectors * which announce this part of the topology to others) */ + @Override protected void issueHeartbeat() { updateProperties(); issueClusterLocalHeartbeat(); issueConnectorPings(); } + @Override protected void updateProperties() { if (discoveryServiceImpl == null) { logger.debug("updateProperties: discoveryService is null"); @@ -358,7 +360,7 @@ public class HeartbeatHandler extends Ba discoveryServiceImpl.updateProperties(); } } - + /** Issue a cluster local heartbeat (into the repository) **/ protected void issueClusterLocalHeartbeat() { if (logger.isDebugEnabled()) { @@ -454,7 +456,7 @@ public class HeartbeatHandler extends Ba resourceMap.put(PROPERTY_ID_SLING_HOME_PATH, slingHomePath); final String endpointsAsString = getEndpointsAsString(); resourceMap.put(PROPERTY_ID_ENDPOINTS, endpointsAsString); - logger.info("issueClusterLocalHeartbeat: storing my runtimeId: {}, endpoints: {} and sling home path: {}", + logger.info("issueClusterLocalHeartbeat: storing my runtimeId: {}, endpoints: {} and sling home path: {}", new Object[]{runtimeId, endpointsAsString, slingHomePath}); } if (resetLeaderElectionId || !resourceMap.containsKey("leaderElectionId")) { @@ -533,6 +535,7 @@ public class HeartbeatHandler extends Ba /** Check whether the established view matches the reality, ie matches the * heartbeats */ + @Override protected void doCheckView() { super.doCheckView(); @@ -580,12 +583,12 @@ public class HeartbeatHandler extends Ba if (winningVoting != null || (numOpenNonWinningVotes > 0)) { // then there are votings pending and I shall wait for them to // settle - + // but first: make sure we sent the TOPOLOGY_CHANGING logger.info("doCheckViewWith: there are pending votings, marking topology as changing..."); invalidateCurrentEstablishedView(); discoveryServiceImpl.handleTopologyChanging(); - + if (logger.isDebugEnabled()) { logger.debug("doCheckViewWith: " + numOpenNonWinningVotes @@ -629,7 +632,7 @@ public class HeartbeatHandler extends Ba establishedViewMatches = mismatchDetails == null; } } - + if (establishedViewMatches) { // that's the normal case. the established view matches what we're // seeing. @@ -637,18 +640,18 @@ public class HeartbeatHandler extends Ba logger.debug("doCheckViewWith: no pending nor winning votes. view is fine. we're all happy."); return; } - + // immediately send a TOPOLOGY_CHANGING - could already be sent, but just to be sure logger.info("doCheckViewWith: no matching established view, marking topology as changing"); invalidateCurrentEstablishedView(); discoveryServiceImpl.handleTopologyChanging(); - + List<VotingView> myYesVotes = VotingHelper.getYesVotingsOf(resourceResolver, config, slingId); if (myYesVotes != null && myYesVotes.size() > 0) { logger.info("doCheckViewWith: I have voted yes (" + myYesVotes.size() + "x)- the vote was not yet promoted but expecting it to be soon. Not voting again in the meantime. My yes vote was for: "+myYesVotes); return; } - + if (logger.isDebugEnabled()) { logger.debug("doCheckViewWith: no pending nor winning votes. But: view does not match established or no established yet. Initiating a new voting"); Iterator<String> it = liveInstances.iterator(); @@ -673,7 +676,7 @@ public class HeartbeatHandler extends Ba VotingView.newVoting(resourceResolver, config, votingId, slingId, liveInstances); } - + /** * Mark the current establishedView as invalid - requiring it to be * replaced with a new one, be it by another instance or this one, @@ -689,7 +692,7 @@ public class HeartbeatHandler extends Ba failedEstablishedViewId = lastEstablishedViewId; discoveryServiceImpl.getClusterViewServiceImpl().invalidateEstablishedViewId(lastEstablishedViewId); } - + /** * Management function to trigger the otherwise algorithm-dependent * start of a new voting. @@ -720,5 +723,5 @@ public class HeartbeatHandler extends Ba } } } - + } Modified: sling/trunk/bundles/extensions/discovery/impl/src/test/java/org/apache/sling/discovery/impl/DiscoveryServiceImplTest.java URL: http://svn.apache.org/viewvc/sling/trunk/bundles/extensions/discovery/impl/src/test/java/org/apache/sling/discovery/impl/DiscoveryServiceImplTest.java?rev=1769802&r1=1769801&r2=1769802&view=diff ============================================================================== --- sling/trunk/bundles/extensions/discovery/impl/src/test/java/org/apache/sling/discovery/impl/DiscoveryServiceImplTest.java (original) +++ sling/trunk/bundles/extensions/discovery/impl/src/test/java/org/apache/sling/discovery/impl/DiscoveryServiceImplTest.java Tue Nov 15 12:38:35 2016 @@ -26,7 +26,6 @@ import org.apache.sling.discovery.base.i 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; @@ -46,7 +45,7 @@ public class DiscoveryServiceImplTest ex public void testLocalClusterSyncTokenIdChange() throws Exception { logger.info("testLocalClusterSyncTokenIdChange: start"); logger.info("testLocalClusterSyncTokenIdChange: creating instance1..."); - FullJR2VirtualInstanceBuilder builder1 = + FullJR2VirtualInstanceBuilder builder1 = (FullJR2VirtualInstanceBuilder) new FullJR2VirtualInstanceBuilder() .setDebugName("instance1") .newRepository("/var/testLocalClusterSyncTokenIdChange/", true) @@ -55,7 +54,7 @@ public class DiscoveryServiceImplTest ex .setMinEventDelay(0); VirtualInstance instance1 = builder1.build(); logger.info("testLocalClusterSyncTokenIdChange: creating instance2..."); - FullJR2VirtualInstanceBuilder builder2 = + FullJR2VirtualInstanceBuilder builder2 = (FullJR2VirtualInstanceBuilder) new FullJR2VirtualInstanceBuilder() .setDebugName("instance2") .useRepositoryOf(instance1) @@ -63,15 +62,15 @@ public class DiscoveryServiceImplTest ex .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(); @@ -83,10 +82,10 @@ public class DiscoveryServiceImplTest ex 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); - + ResourceResolver resolver = factory.getServiceResourceResolver(null); + instance1.heartbeatsAndCheckView(); instance2.heartbeatsAndCheckView(); Thread.sleep(1000); @@ -94,14 +93,14 @@ public class DiscoveryServiceImplTest ex 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(); Modified: sling/trunk/bundles/extensions/discovery/impl/src/test/java/org/apache/sling/discovery/impl/cluster/RepositoryDelaysTest.java URL: http://svn.apache.org/viewvc/sling/trunk/bundles/extensions/discovery/impl/src/test/java/org/apache/sling/discovery/impl/cluster/RepositoryDelaysTest.java?rev=1769802&r1=1769801&r2=1769802&view=diff ============================================================================== --- sling/trunk/bundles/extensions/discovery/impl/src/test/java/org/apache/sling/discovery/impl/cluster/RepositoryDelaysTest.java (original) +++ sling/trunk/bundles/extensions/discovery/impl/src/test/java/org/apache/sling/discovery/impl/cluster/RepositoryDelaysTest.java Tue Nov 15 12:38:35 2016 @@ -23,7 +23,7 @@ import static org.junit.Assert.assertFal import static org.junit.Assert.assertTrue; import org.apache.log4j.Level; -import org.apache.log4j.LogManager; +import org.apache.log4j.spi.RootLogger; import org.apache.sling.discovery.TopologyView; import org.apache.sling.commons.testing.junit.categories.Slow; import org.apache.sling.discovery.TopologyEvent.Type; @@ -56,14 +56,14 @@ public class RepositoryDelaysTest { @Before public void setUp() throws Exception { - final org.apache.log4j.Logger discoveryLogger = LogManager.getRootLogger().getLogger("org.apache.sling.discovery"); + final org.apache.log4j.Logger discoveryLogger = RootLogger.getLogger("org.apache.sling.discovery"); logLevel = discoveryLogger.getLevel(); - discoveryLogger.setLevel(Level.TRACE); + discoveryLogger.setLevel(Level.TRACE); } - + @After public void teartDown() throws Throwable { - final org.apache.log4j.Logger discoveryLogger = LogManager.getRootLogger().getLogger("org.apache.sling.discovery"); + final org.apache.log4j.Logger discoveryLogger = RootLogger.getLogger("org.apache.sling.discovery"); discoveryLogger.setLevel(logLevel); if (instance1!=null) { instance1.stopViewChecker(); @@ -76,7 +76,7 @@ public class RepositoryDelaysTest { instance2 = null; } } - + /** * SLING-5195 : simulate slow session.saves that block * the calling thread for non-trivial amounts of time, @@ -102,7 +102,7 @@ public class RepositoryDelaysTest { .setConnectorPingInterval(1) .setConnectorPingTimeout(3) .build(); - + instance1.setDelay("pre.commit", 12000); instance1.startViewChecker(1); instance2.startViewChecker(1); @@ -113,34 +113,34 @@ public class RepositoryDelaysTest { // should be init but alone TopologyView t1 = instance1.getDiscoveryService().getTopology(); assertFalse(t1.isCurrent()); - + TopologyView t2 = instance2.getDiscoveryService().getTopology(); assertTrue(t2.isCurrent()); assertEquals(1, t2.getInstances().size()); - + instance1.setDelay("pre.commit", -1); Thread.sleep(3000); TopologyView t1b = instance1.getDiscoveryService().getTopology(); assertTrue(t1b.isCurrent()); assertEquals(2, t1b.getInstances().size()); - + TopologyView t2b = instance2.getDiscoveryService().getTopology(); assertTrue(t2b.isCurrent()); assertEquals(2, t2b.getInstances().size()); - + instance1.setDelay("pre.commit", 59876); instance2.setDelay("pre.commit", 60000); logger.info("<main> both instances marked as delaying 1min - but with new background checks we should go changing within 3sec"); Thread.sleep(8000); - + TopologyView t1c = instance1.getDiscoveryService().getTopology(); assertFalse(t1c.isCurrent()); - + TopologyView t2c = instance2.getDiscoveryService().getTopology(); assertFalse(t2c.isCurrent()); } - + /** * Tests whether the not-current view returned by getTopology() * matches what listeners get in TOPOLOGY_CHANGING - it should @@ -148,7 +148,7 @@ public class RepositoryDelaysTest { */ @Test public void testOldView() throws Throwable { - final org.apache.log4j.Logger discoveryLogger = LogManager.getRootLogger().getLogger("org.apache.sling.discovery"); + final org.apache.log4j.Logger discoveryLogger = RootLogger.getLogger("org.apache.sling.discovery"); discoveryLogger.setLevel(Level.INFO); // info should do FullJR2VirtualInstanceBuilder builder = newBuilder(); builder.setDebugName("firstInstanceA") @@ -178,7 +178,7 @@ public class RepositoryDelaysTest { t1 = instance1.getDiscoveryService().getTopology(); assertTrue(t1.isCurrent()); // current it should now be assertEquals(1, t1.getInstances().size()); // and it must contain the local instance - + logger.info("testOldView: creating instance2"); l1.addExpected(Type.TOPOLOGY_CHANGING); FullJR2VirtualInstanceBuilder builder2 = newBuilder(); @@ -188,7 +188,7 @@ public class RepositoryDelaysTest { .setMinEventDelay(3); instance2 = builder2.fullBuild(); instance2.stopVoting(); - + logger.info("testOldView: instance2 created, now issuing one heartbeat with instance2 first, so that instance1 can take note of it"); instance2.heartbeatsAndCheckView(); logger.info("testOldView: now instance1 is also doing a heartbeat and should see that a new instance is there"); @@ -203,7 +203,7 @@ public class RepositoryDelaysTest { t1 = instance1.getDiscoveryService().getTopology(); assertFalse(t1.isCurrent()); // current it should not be assertEquals(1, t1.getInstances().size()); // but it should still contain the local instance from before - + l1.addExpected(Type.TOPOLOGY_CHANGED); logger.info("testOldView: now issuing 3 rounds of heartbeats/checks and expecting a TOPOLOGY_CHANGED then"); @@ -218,17 +218,17 @@ public class RepositoryDelaysTest { instance2.heartbeatsAndCheckView(); instance1.heartbeatsAndCheckView(); Thread.sleep(1200); - + assertEquals(3, l1.getEvents().size()); // INIT, CHANGING and CHANGED assertEquals(0, l1.getRemainingExpectedCount()); // no remaining expected assertEquals(0, l1.getUnexpectedCount()); // and no unexpected t1 = instance1.getDiscoveryService().getTopology(); assertTrue(t1.isCurrent()); // and we should be current again assertEquals(2, t1.getInstances().size()); // and contain both instances now - + // timeout is set to 3sec, so we now do heartbeats for 4sec with only instance1 // to let instance2 crash - + // force instance1 to no longer analyze the votings // since stopVoting() only deactivates the listener, we also // have to set votingHandler of heartbeatHandler to null @@ -245,5 +245,5 @@ public class RepositoryDelaysTest { assertFalse(t1.isCurrent()); // we should still be !current assertEquals(2, t1.getInstances().size()); // and contain both instances } - + }
