You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@sling.apache.org by ro...@apache.org on 2017/11/07 09:27:39 UTC
[sling-org-apache-sling-discovery-oak] 04/12: SLING-4603 :
introducing configuration for syncToken enabling/disabling - plus using the
ConsistencyServiceChain - plus more details when PROPERTIES_CHANGED
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 <st...@apache.org>
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
"commits@sling.apache.org" <co...@sling.apache.org>.