You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@sling.apache.org by GitBox <gi...@apache.org> on 2018/04/25 15:33:40 UTC
[GitHub] rombert commented on issue #5: SLING-7544 - improving optimized alias lookup to not block during int…
rombert commented on issue #5: SLING-7544 - improving optimized alias lookup to not block during int…
URL: https://github.com/apache/sling-org-apache-sling-resourceresolver/pull/5#issuecomment-384330807
@DominikSuess - I think we can solve the concurrency issue with the following patch:
```
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 6cc51e7..03ddab4 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
@@ -25,7 +25,6 @@ import java.io.FileOutputStream;
import java.io.IOException;
import java.net.MalformedURLException;
import java.net.URL;
-import java.text.ParseException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
@@ -50,7 +49,6 @@ import java.util.concurrent.atomic.AtomicBoolean;
import java.util.concurrent.atomic.AtomicLong;
import java.util.concurrent.locks.ReentrantLock;
-import javax.jcr.query.InvalidQueryException;
import javax.servlet.http.HttpServletResponse;
import org.apache.sling.api.SlingConstants;
@@ -134,8 +132,6 @@ public class MapEntries implements
private Map <String,List <String>> vanityTargets;
private volatile Map<String, Map<String, String>> aliasMap;
-
- private volatile boolean isAliasMapInitialized = false;
private final ReentrantLock initializing = new ReentrantLock();
@@ -162,7 +158,7 @@ public class MapEntries implements
this.resolveMapsMap = Collections.singletonMap(GLOBAL_LIST_KEY, (List<MapEntry>)Collections.EMPTY_LIST);
this.mapMaps = Collections.<MapEntry> emptyList();
this.vanityTargets = Collections.<String,List <String>>emptyMap();
- this.aliasMap = Collections.<String, Map<String, String>>emptyMap();
+ this.aliasMap = Collections.emptyMap();
doInit();
@@ -199,13 +195,12 @@ public class MapEntries implements
final Map<String, List<MapEntry>> newResolveMapsMap = new ConcurrentHashMap<>();
- isAliasMapInitialized = false;
+ aliasMap = Collections.emptyMap();
//optimization made in SLING-2521
if (this.factory.isOptimizeAliasResolutionEnabled()) {
aliasTraversal = new Thread(new Runnable(){
public void run() {
aliasMap = loadAliases(resolver);
- isAliasMapInitialized = true;
}
});
aliasTraversal.start();
@@ -656,7 +651,12 @@ public class MapEntries implements
@Override
public boolean isAliasMapInitialized() {
- return isAliasMapInitialized;
+ // since loading the aliases is equivalent to replacing the empty map
+ // with another instance, and the reference is volatile, it's safe
+ // to equate initialization being done with the empty map being replaced
+ // note that it's not provably safe to check the map size, as we might
+ // enter the scenario where there are no aliases
+ return aliasMap != Collections.<String,Map<String,String>> emptyMap();
}
/**
```
Feel free to apply this to your PR, but also make sure to check the rest of the review comments.
----------------------------------------------------------------
This is an automated message from the Apache Git Service.
To respond to the message, please log on GitHub and use the
URL above to go to the specific comment.
For queries about this service, please contact Infrastructure at:
users@infra.apache.org
With regards,
Apache Git Services