You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@sling.apache.org by cz...@apache.org on 2020/10/16 13:20:01 UTC

[sling-org-apache-sling-resourceresolver] branch master updated: SLING-9782 : Failure in loading vanity paths due to query limit being reached

This is an automated email from the ASF dual-hosted git repository.

cziegeler pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/sling-org-apache-sling-resourceresolver.git


The following commit(s) were added to refs/heads/master by this push:
     new 62e751e  SLING-9782 : Failure in loading vanity paths due to query limit being reached
62e751e is described below

commit 62e751ed14b8df53bf141b6ca2fe869b724ce044
Author: Carsten Ziegeler <cz...@apache.org>
AuthorDate: Fri Oct 16 15:19:33 2020 +0200

    SLING-9782 : Failure in loading vanity paths due to query limit being reached
---
 .../impl/ResourceResolverImpl.java                 |  7 ++-
 .../resourceresolver/impl/mapping/MapEntries.java  | 59 +++++++++++++++++-----
 .../impl/mapping/MapEntriesHandler.java            | 21 ++++++++
 .../impl/mapping/ResourceMapperImpl.java           |  6 +--
 4 files changed, 73 insertions(+), 20 deletions(-)

diff --git a/src/main/java/org/apache/sling/resourceresolver/impl/ResourceResolverImpl.java b/src/main/java/org/apache/sling/resourceresolver/impl/ResourceResolverImpl.java
index 2fddf65..2e47747 100644
--- a/src/main/java/org/apache/sling/resourceresolver/impl/ResourceResolverImpl.java
+++ b/src/main/java/org/apache/sling/resourceresolver/impl/ResourceResolverImpl.java
@@ -625,7 +625,7 @@ public class ResourceResolverImpl extends SlingAdaptable implements ResourceReso
         
         if ( type == ResourceMapper.class )
             return (AdapterType) new ResourceMapperImpl(this, factory.getResourceDecoratorTracker(), factory.getMapEntries(), 
-                    factory.isOptimizeAliasResolutionEnabled(), factory.getNamespaceMangler());
+                    factory.getNamespaceMangler());
         
         final AdapterType result = this.control.adaptTo(this.context, type);
         if ( result != null ) {
@@ -811,7 +811,7 @@ public class ResourceResolverImpl extends SlingAdaptable implements ResourceReso
 
         // we do not have a child with the exact name, so we look for
         // a child, whose alias matches the childName
-        if (factory.isOptimizeAliasResolutionEnabled()){
+        if (factory.getMapEntries().isOptimizeAliasResolutionEnabled()){
             logger.debug("getChildInternal: Optimize Alias Resolution is Enabled");
             //optimization made in SLING-2521
             final Map<String, String> aliases = factory.getMapEntries().getAliasMap(parent.getPath());
@@ -830,6 +830,9 @@ public class ResourceResolverImpl extends SlingAdaptable implements ResourceReso
                 }
             }
         } else {
+            if ( this.factory.isOptimizeAliasResolutionEnabled() ) {
+                this.factory.getMapEntries().logDisableAliasOptimization();
+            } 
             logger.debug("getChildInternal: Optimize Alias Resolution is Disabled");
             final Iterator<Resource> children = listChildren(parent);
             while (children.hasNext()) {
diff --git a/src/main/java/org/apache/sling/resourceresolver/impl/mapping/MapEntries.java b/src/main/java/org/apache/sling/resourceresolver/impl/mapping/MapEntries.java
index debc99d..b382756 100644
--- a/src/main/java/org/apache/sling/resourceresolver/impl/mapping/MapEntries.java
+++ b/src/main/java/org/apache/sling/resourceresolver/impl/mapping/MapEntries.java
@@ -146,6 +146,8 @@ public class MapEntries implements
 
     private final StringInterpolationProvider stringInterpolationProvider;
 
+    private final boolean useOptimizeAliasResolution;
+
     public MapEntries(final MapConfigurationProvider factory, final BundleContext bundleContext, final EventAdmin eventAdmin, final StringInterpolationProvider stringInterpolationProvider)
         throws LoginException, IOException {
 
@@ -159,7 +161,7 @@ public class MapEntries implements
         this.aliasMap = Collections.<String, Map<String, String>>emptyMap();
         this.stringInterpolationProvider = stringInterpolationProvider;
 
-        doInit();
+        this.useOptimizeAliasResolution = doInit();
 
         final Dictionary<String, Object> props = new Hashtable<>(); // NOSONAR - required by OSGi APIs
         final String[] paths = new String[factory.getObservationPaths().length];
@@ -182,32 +184,40 @@ public class MapEntries implements
      * ReentrantLock. Does nothing if the resource resolver has already been
      * null-ed.
      */
-    protected void doInit() {
+    protected boolean doInit() {
 
         this.initializing.lock();
         try {
             final ResourceResolver resolver = this.resolver;
             final MapConfigurationProvider factory = this.factory;
             if (resolver == null || factory == null) {
-                return;
+                return this.factory.isOptimizeAliasResolutionEnabled();
             }
 
-            final Map<String, List<MapEntry>> newResolveMapsMap = new ConcurrentHashMap<>();
+            boolean result = this.factory.isOptimizeAliasResolutionEnabled();
 
             //optimization made in SLING-2521
-            if (this.factory.isOptimizeAliasResolutionEnabled()) {
-                final Map<String, Map<String, String>> aliasMap = this.loadAliases(resolver);
-                this.aliasMap = aliasMap;
+            if (result) {
+                try {
+                    final Map<String, Map<String, String>> loadedMap = this.loadAliases(resolver);
+                    this.aliasMap = loadedMap;
+    
+                } catch (final Exception e) {
+
+                    logDisableAliasOptimization(e);
+
+                    // disable optimize alias resolution
+                    result = false;
+                }
             }
 
-            this.resolveMapsMap = newResolveMapsMap;
+            this.resolveMapsMap = new ConcurrentHashMap<>();
 
             doUpdateConfiguration();
 
             sendChangeEvent();
-        } catch (final Exception e) {
 
-            log.warn("doInit: Unexpected problem during initialization", e);
+            return result;
 
         } finally {
 
@@ -269,7 +279,7 @@ public class MapEntries implements
             final Resource resource = this.resolver != null ? resolver.getResource(path) : null;
             if (resource != null) {
                 boolean changed = doAddVanity(resource);
-                if (this.factory.isOptimizeAliasResolutionEnabled() && resource.getValueMap().containsKey(ResourceResolverImpl.PROP_ALIAS)) {
+                if (this.useOptimizeAliasResolution && resource.getValueMap().containsKey(ResourceResolverImpl.PROP_ALIAS)) {
                     changed |= doAddAlias(resource);
                 }
                 return changed;
@@ -283,7 +293,7 @@ public class MapEntries implements
 
     private boolean updateResource(final String path, final AtomicBoolean resolverRefreshed) {
         final boolean isValidVanityPath =  this.isValidVanityPath(path);
-        if ( this.factory.isOptimizeAliasResolutionEnabled() || isValidVanityPath) {
+        if ( this.useOptimizeAliasResolution || isValidVanityPath) {
             this.initializing.lock();
 
             try {
@@ -303,7 +313,7 @@ public class MapEntries implements
                         }
                         changed |= doAddVanity(contentRsrc != null ? contentRsrc : resource);
                     }
-                    if (this.factory.isOptimizeAliasResolutionEnabled()) {
+                    if (this.useOptimizeAliasResolution) {
                         changed |= doUpdateAlias(resource);
                     }
 
@@ -327,7 +337,7 @@ public class MapEntries implements
                 changed |= removeVanityPath(target);
             }
         }
-        if (this.factory.isOptimizeAliasResolutionEnabled()) {
+        if (this.useOptimizeAliasResolution) {
             for (final String contentPath : this.aliasMap.keySet()) {
                 if (path.startsWith(contentPath + "/") || path.equals(contentPath)
                         || contentPath.startsWith(actualContentPathPrefix)) {
@@ -618,6 +628,10 @@ public class MapEntries implements
         return mapMaps;
     }
 
+    public boolean isOptimizeAliasResolutionEnabled() {
+        return this.useOptimizeAliasResolution;
+    }
+    
     @Override
     public Map<String, String> getAliasMap(final String parentPath) {
         return aliasMap.get(parentPath);
@@ -1374,6 +1388,23 @@ public class MapEntries implements
         }
     }
 
+    private final AtomicLong logCounter = new AtomicLong(0);
+
+    @Override
+    public void logDisableAliasOptimization() {
+        this.logDisableAliasOptimization(null);
+    }
+
+    private void logDisableAliasOptimization(final Exception e) {
+        if ( e != null ) {
+            log.error("Unexpected problem during initialization of optimize alias resolution. Therefore disabling optimize alias resolution. Please fix the problem.", e);
+        } else {
+            if ( logCounter.incrementAndGet() % 1000 == 0 ) {
+                log.error("A problem occured during initialization of optimize alias resolution. Optimize alias resolution is disabled. Check the logs for the reported problem.", e);
+            }
+        }
+
+    }
     private final class MapEntryIterator implements Iterator<MapEntry> {
 
         private final Map<String, List<MapEntry>> resolveMapsMap;
diff --git a/src/main/java/org/apache/sling/resourceresolver/impl/mapping/MapEntriesHandler.java b/src/main/java/org/apache/sling/resourceresolver/impl/mapping/MapEntriesHandler.java
index 0087075..ae754c0 100644
--- a/src/main/java/org/apache/sling/resourceresolver/impl/mapping/MapEntriesHandler.java
+++ b/src/main/java/org/apache/sling/resourceresolver/impl/mapping/MapEntriesHandler.java
@@ -67,9 +67,30 @@ public interface MapEntriesHandler {
         public Map<String, List<String>> getVanityPathMappings() {
             return Collections.emptyMap();
         }
+
+		@Override
+		public boolean isOptimizeAliasResolutionEnabled() {
+			return false;
+        }
+        
+		@Override
+        public void logDisableAliasOptimization() {
+            // nothing to do
+        }
     };
 
     /**
+     * Whether alias resolution optimization is enabled.
+     * If it is enabled {@link #getAliasMap(String)} can be used.
+     */
+    boolean isOptimizeAliasResolutionEnabled();
+    
+    /**
+     * Log an error if alias optimization should be used but is currently disabled
+     */
+    void logDisableAliasOptimization();
+
+    /**
      * Returns all alias entries that for children of the specified <tt>parentPath</tt>
      * 
      * <p>The returned map has resource names as keys and aliases as values.</p>
diff --git a/src/main/java/org/apache/sling/resourceresolver/impl/mapping/ResourceMapperImpl.java b/src/main/java/org/apache/sling/resourceresolver/impl/mapping/ResourceMapperImpl.java
index bc47c26..b44789d 100644
--- a/src/main/java/org/apache/sling/resourceresolver/impl/mapping/ResourceMapperImpl.java
+++ b/src/main/java/org/apache/sling/resourceresolver/impl/mapping/ResourceMapperImpl.java
@@ -51,16 +51,14 @@ public class ResourceMapperImpl implements ResourceMapper {
     private final ResourceResolverImpl resolver;
     private final ResourceDecoratorTracker resourceDecorator;
     private final MapEntriesHandler mapEntries;
-    private final boolean optimizedAliasResolutionEnabled;
     private final Object namespaceMangler;
     
 
     public ResourceMapperImpl(ResourceResolverImpl resolver, ResourceDecoratorTracker resourceDecorator, 
-            MapEntriesHandler mapEntries, boolean optimizedAliasResolutionEnabled, Object namespaceMangler) {
+            MapEntriesHandler mapEntries, Object namespaceMangler) {
         this.resolver = resolver;
         this.resourceDecorator = resourceDecorator;
         this.mapEntries = mapEntries;
-        this.optimizedAliasResolutionEnabled = optimizedAliasResolutionEnabled;
         this.namespaceMangler = namespaceMangler;
     }
 
@@ -226,7 +224,7 @@ public class ResourceMapperImpl implements ResourceMapper {
     }
     
     private List<String> readAliases(String path, Resource current) {
-        if (optimizedAliasResolutionEnabled) {
+        if (this.mapEntries.isOptimizeAliasResolutionEnabled()) {
             logger.debug("map: Optimize Alias Resolution is Enabled");
             String parentPath = ResourceUtil.getParent(path);