This is an automated email from the ASF dual-hosted git repository. rombert pushed a commit to annotated tag org.apache.sling.discovery.oak-1.0.0 in repository https://gitbox.apache.org/repos/asf/sling-org-apache-sling-discovery-oak.git
commit f030cb5310da31f788938e75e3583300e8605c2e Author: Stefan Egli <[email protected]> AuthorDate: Thu Oct 22 15:38:13 2015 +0000 SLING-4603 : introducing configuration for syncToken enabling/disabling - plus using the ConsistencyServiceChain - plus more details when PROPERTIES_CHANGED git-svn-id: https://svn.apache.org/repos/asf/sling/trunk/bundles/extensions/discovery/oak@1710041 13f79535-47bb-0310-9956-ffa450edef68 --- .../org/apache/sling/discovery/oak/Config.java | 20 ++++++++++++ .../sling/discovery/oak/OakDiscoveryService.java | 24 +++++++++++--- .../discovery/oak/TopologyWebConsolePlugin.java | 38 ++++++++++++++++++---- .../oak/its/setup/OakVirtualInstanceBuilder.java | 28 ++++++++++++---- 4 files changed, 92 insertions(+), 18 deletions(-) diff --git a/src/main/java/org/apache/sling/discovery/oak/Config.java b/src/main/java/org/apache/sling/discovery/oak/Config.java index d2eaa4a..9b8cd11 100644 --- a/src/main/java/org/apache/sling/discovery/oak/Config.java +++ b/src/main/java/org/apache/sling/discovery/oak/Config.java @@ -73,6 +73,15 @@ public class Config implements BaseConfig, DiscoveryLiteConfig { public static final String DISCOVERY_LITE_CHECK_INTERVAL_KEY = "discoveryLiteCheckInterval"; protected long discoveryLiteCheckInterval = DEFAULT_DISCOVERY_LITE_CHECK_INTERVAL; + /** + * If set to true a syncToken will be used on top of waiting for + * deactivating instances to be fully processed. + * If set to false, only deactivating instances will be waited for + * to be fully processed. + */ + @Property(boolValue=true) + private static final String SYNC_TOKEN_ENABLED = "enableSyncToken"; + /** Configure the time (in seconds) which must be passed at minimum between sending TOPOLOGY_CHANGING/_CHANGED (avoid flooding). */ public static final int DEFAULT_MIN_EVENT_DELAY = 3; @Property(intValue=DEFAULT_MIN_EVENT_DELAY) @@ -194,6 +203,12 @@ public class Config implements BaseConfig, DiscoveryLiteConfig { /** the maximum backoff factor to be used for stable connectors **/ private int backoffStableFactor = DEFAULT_BACKOFF_STABLE_FACTOR; + /** + * Whether, on top of waiting for deactivating instances, + * a syncToken should also be used + */ + private boolean syncTokenEnabled; + @Activate protected void activate(final Map<String, Object> properties) { logger.debug("activate: config activated."); @@ -295,6 +310,7 @@ public class Config implements BaseConfig, DiscoveryLiteConfig { hmacEnabled = PropertiesUtil.toBoolean(properties.get(HMAC_ENABLED), true); encryptionEnabled = PropertiesUtil.toBoolean(properties.get(ENCRYPTION_ENABLED), false); + syncTokenEnabled = PropertiesUtil.toBoolean(properties.get(SYNC_TOKEN_ENABLED), true); sharedKey = PropertiesUtil.toString(properties.get(SHARED_KEY), null); keyInterval = PropertiesUtil.toLong(SHARED_KEY_INTERVAL, DEFAULT_SHARED_KEY_INTERVAL); @@ -467,4 +483,8 @@ public class Config implements BaseConfig, DiscoveryLiteConfig { // TODO: currently hard coded return 1000; } + + public boolean getSyncTokenEnabled() { + return syncTokenEnabled; + } } diff --git a/src/main/java/org/apache/sling/discovery/oak/OakDiscoveryService.java b/src/main/java/org/apache/sling/discovery/oak/OakDiscoveryService.java index 084fe50..1a5c8d3 100644 --- a/src/main/java/org/apache/sling/discovery/oak/OakDiscoveryService.java +++ b/src/main/java/org/apache/sling/discovery/oak/OakDiscoveryService.java @@ -60,8 +60,11 @@ import org.apache.sling.discovery.commons.providers.DefaultClusterView; import org.apache.sling.discovery.commons.providers.DefaultInstanceDescription; import org.apache.sling.discovery.commons.providers.ViewStateManager; import org.apache.sling.discovery.commons.providers.base.ViewStateManagerFactory; +import org.apache.sling.discovery.commons.providers.spi.ConsistencyService; +import org.apache.sling.discovery.commons.providers.spi.base.ConsistencyServiceChain; import org.apache.sling.discovery.commons.providers.spi.base.IdMapService; -import org.apache.sling.discovery.commons.providers.spi.base.OakSyncTokenConsistencyService; +import org.apache.sling.discovery.commons.providers.spi.base.OakBacklogConsistencyService; +import org.apache.sling.discovery.commons.providers.spi.base.SyncTokenConsistencyService; import org.apache.sling.discovery.commons.providers.util.PropertyNameHelper; import org.apache.sling.discovery.commons.providers.util.ResourceHelper; import org.apache.sling.discovery.oak.pinger.OakViewChecker; @@ -129,7 +132,10 @@ public class OakDiscoveryService extends BaseDiscoveryService { private IdMapService idMapService; @Reference - private OakSyncTokenConsistencyService consistencyService; + private OakBacklogConsistencyService oakBacklogConsistencyService; + + @Reference + private SyncTokenConsistencyService syncTokenConsistencyService; /** the slingId of the local instance **/ private String slingId; @@ -150,7 +156,8 @@ public class OakDiscoveryService extends BaseDiscoveryService { OakViewChecker connectorPinger, Scheduler scheduler, IdMapService idMapService, - OakSyncTokenConsistencyService consistencyService, + OakBacklogConsistencyService oakBacklogConsistencyService, + SyncTokenConsistencyService syncTokenConsistencyService, ResourceResolverFactory factory) { OakDiscoveryService discoService = new OakDiscoveryService(); discoService.settingsService = settingsService; @@ -161,7 +168,8 @@ public class OakDiscoveryService extends BaseDiscoveryService { discoService.oakViewChecker = connectorPinger; discoService.scheduler = scheduler; discoService.idMapService = idMapService; - discoService.consistencyService = consistencyService; + discoService.oakBacklogConsistencyService = oakBacklogConsistencyService; + discoService.syncTokenConsistencyService = syncTokenConsistencyService; discoService.resourceResolverFactory = factory; return discoService; } @@ -201,7 +209,13 @@ public class OakDiscoveryService extends BaseDiscoveryService { slingId = settingsService.getSlingId(); - //TODO: this should fail as bind can now run into viewStateManager==null + ConsistencyService consistencyService; + if (config.getSyncTokenEnabled()) { + consistencyService = new ConsistencyServiceChain(oakBacklogConsistencyService, syncTokenConsistencyService); + } else { + consistencyService = oakBacklogConsistencyService; + + } viewStateManager = ViewStateManagerFactory.newViewStateManager(viewStateManagerLock, consistencyService); if (config.getMinEventDelay()>0) { diff --git a/src/main/java/org/apache/sling/discovery/oak/TopologyWebConsolePlugin.java b/src/main/java/org/apache/sling/discovery/oak/TopologyWebConsolePlugin.java index acc75aa..97d8fa6 100644 --- a/src/main/java/org/apache/sling/discovery/oak/TopologyWebConsolePlugin.java +++ b/src/main/java/org/apache/sling/discovery/oak/TopologyWebConsolePlugin.java @@ -63,8 +63,10 @@ import org.apache.sling.discovery.base.connectors.announcement.AnnouncementRegis import org.apache.sling.discovery.base.connectors.announcement.CachedAnnouncement; import org.apache.sling.discovery.base.connectors.ping.ConnectorRegistry; import org.apache.sling.discovery.base.connectors.ping.TopologyConnectorClientInformation; +import org.apache.sling.discovery.commons.InstancesDiff; +import org.apache.sling.discovery.commons.InstancesDiff.InstanceCollection; import org.apache.sling.discovery.commons.providers.spi.base.DiscoveryLiteDescriptor; -import org.apache.sling.discovery.commons.providers.spi.base.OakSyncTokenConsistencyService; +import org.apache.sling.discovery.commons.providers.spi.base.OakBacklogConsistencyService; import org.osgi.framework.BundleContext; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -112,7 +114,7 @@ public class TopologyWebConsolePlugin extends AbstractWebConsolePlugin implement protected ResourceResolverFactory resourceResolverFactory; @Reference - private OakSyncTokenConsistencyService consistencyService; + private OakBacklogConsistencyService consistencyService; private TopologyView currentView; @@ -588,9 +590,33 @@ public class TopologyWebConsolePlugin extends AbstractWebConsolePlugin implement if (event.getType() == Type.PROPERTIES_CHANGED) { this.currentView = event.getNewView(); + StringBuilder sb = new StringBuilder(); + InstancesDiff instanceDiff = new InstancesDiff(event.getOldView(), event.getNewView()); + + // there shouldn't be any instances added, but for paranoia reason: + Collection<InstanceDescription> added = instanceDiff.added().get(); + if (!added.isEmpty()) { + sb.append("instances were added:"); + for (InstanceDescription instance : added) { + sb.append(" "); + sb.append(instance.getSlingId()); + } + sb.append("."); + } + + // there shouldn't be any instances removed as well, but again for paranoia reason: + Collection<InstanceDescription> removed = instanceDiff.removed().get(); + if (!removed.isEmpty()) { + sb.append("instances were removed:"); + for (InstanceDescription instance : added) { + sb.append(" "); + sb.append(instance.getSlingId()); + } + sb.append("."); + } + Set<InstanceDescription> newInstances = event.getNewView() .getInstances(); - StringBuilder sb = new StringBuilder(); for (Iterator<InstanceDescription> it = newInstances.iterator(); it .hasNext();) { final InstanceDescription newInstanceDescription = it.next(); @@ -601,8 +627,8 @@ public class TopologyWebConsolePlugin extends AbstractWebConsolePlugin implement + newInstanceDescription + " in oldview.. event=" + event); - addEventLog(event.getType(), event.getType().toString()+" (new instance "+newInstanceDescription.getSlingId()+" not found in old view)"); - return; + sb.append("did not find instance in old view: " + newInstanceDescription.getSlingId() + "."); + continue; } Map<String, String> oldProps = oldInstanceDescription @@ -616,7 +642,7 @@ public class TopologyWebConsolePlugin extends AbstractWebConsolePlugin implement } sb.append("on instance " + newInstanceDescription.getSlingId() + (newInstanceDescription.isLeader() ? " [isLeader]" : "") - + ": " + diff); + + ": " + diff + ". "); } } diff --git a/src/test/java/org/apache/sling/discovery/oak/its/setup/OakVirtualInstanceBuilder.java b/src/test/java/org/apache/sling/discovery/oak/its/setup/OakVirtualInstanceBuilder.java index 2080c0e..b25d2ff 100644 --- a/src/test/java/org/apache/sling/discovery/oak/its/setup/OakVirtualInstanceBuilder.java +++ b/src/test/java/org/apache/sling/discovery/oak/its/setup/OakVirtualInstanceBuilder.java @@ -33,8 +33,9 @@ import org.apache.sling.discovery.base.its.setup.VirtualInstance; import org.apache.sling.discovery.base.its.setup.VirtualInstanceBuilder; import org.apache.sling.discovery.base.its.setup.mock.MockFactory; import org.apache.sling.discovery.commons.providers.spi.base.IdMapService; -import org.apache.sling.discovery.commons.providers.spi.base.OakSyncTokenConsistencyService; +import org.apache.sling.discovery.commons.providers.spi.base.OakBacklogConsistencyService; import org.apache.sling.discovery.commons.providers.spi.base.RepositoryTestHelper; +import org.apache.sling.discovery.commons.providers.spi.base.SyncTokenConsistencyService; import org.apache.sling.discovery.oak.OakDiscoveryService; import org.apache.sling.discovery.oak.cluster.OakClusterViewService; import org.apache.sling.discovery.oak.pinger.OakViewChecker; @@ -53,7 +54,8 @@ public class OakVirtualInstanceBuilder extends VirtualInstanceBuilder { private IdMapService idMapService; private OakViewChecker oakViewChecker; private SimulatedLeaseCollection leaseCollection; - private OakSyncTokenConsistencyService consistencyService; + private OakBacklogConsistencyService consistencyService; + private SyncTokenConsistencyService syncTokenConsistencyService; @Override public VirtualInstanceBuilder createNewRepository() throws Exception { @@ -187,15 +189,26 @@ public class OakVirtualInstanceBuilder extends VirtualInstanceBuilder { return OakViewChecker.testConstructor(getSlingSettingsService(), getResourceResolverFactory(), getConnectorRegistry(), getAnnouncementRegistry(), getScheduler(), getConfig()); } - private OakSyncTokenConsistencyService getConsistencyService() throws Exception { + private OakBacklogConsistencyService getOakBacklogConsistencyService() throws Exception { if (consistencyService == null) { - consistencyService = createConsistencyService(); + consistencyService = createOakBacklogConsistencyService(); } return consistencyService; } - private OakSyncTokenConsistencyService createConsistencyService() { - return OakSyncTokenConsistencyService.testConstructorAndActivate(getConfig(), getIdMapService(), getSlingSettingsService(), getResourceResolverFactory()); + private OakBacklogConsistencyService createOakBacklogConsistencyService() { + return OakBacklogConsistencyService.testConstructorAndActivate(getConfig(), getIdMapService(), getSlingSettingsService(), getResourceResolverFactory()); + } + + private SyncTokenConsistencyService getSyncTokenConsistencyService() throws Exception { + if (syncTokenConsistencyService == null) { + syncTokenConsistencyService = createSyncTokenConsistencyService(); + } + return syncTokenConsistencyService; + } + + private SyncTokenConsistencyService createSyncTokenConsistencyService() { + return SyncTokenConsistencyService.testConstructorAndActivate(getConfig(), getResourceResolverFactory(), getSlingSettingsService()); } @Override @@ -209,7 +222,8 @@ public class OakVirtualInstanceBuilder extends VirtualInstanceBuilder { getOakViewChecker(), getScheduler(), getIdMapService(), - getConsistencyService(), + getOakBacklogConsistencyService(), + getSyncTokenConsistencyService(), getResourceResolverFactory()); } -- To stop receiving notification emails like this one, please contact "[email protected]" <[email protected]>.
