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>.