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);