You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@sling.apache.org by re...@apache.org on 2025/01/14 12:34:44 UTC

(sling-org-apache-sling-resourceresolver) branch SLING-12615 updated: Resource Resolver: refactor MapEntries - extract vanity path handling - vanityCounter

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

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


The following commit(s) were added to refs/heads/SLING-12615 by this push:
     new 562276a  Resource Resolver: refactor MapEntries - extract vanity path handling - vanityCounter
562276a is described below

commit 562276abd9814639e18b428fb38c6a80588fff94
Author: Julian Reschke <re...@apache.org>
AuthorDate: Tue Jan 14 13:34:35 2025 +0100

    Resource Resolver: refactor MapEntries - extract vanity path handling - vanityCounter
---
 .../resourceresolver/impl/mapping/MapEntries.java  |  16 ++-
 .../impl/mapping/VanityPathHandler.java            |  12 +++
 .../impl/mapping/MapEntriesTest.java               | 108 ++++++++++-----------
 3 files changed, 69 insertions(+), 67 deletions(-)

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 39b860a..55b9151 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
@@ -152,7 +152,6 @@ public class MapEntries implements
 
     private final ReentrantLock initializing = new ReentrantLock();
 
-    private final AtomicLong vanityCounter;
     private final AtomicLong vanityResourcesOnStartup;
     private final AtomicLong vanityPathLookups;
     private final AtomicLong vanityPathBloomNegatives;
@@ -188,7 +187,6 @@ public class MapEntries implements
 
         this.registration = registerResourceChangeListener(bundleContext);
 
-        this.vanityCounter = new AtomicLong(0);
         this.vanityResourcesOnStartup = new AtomicLong(0);
         this.vanityPathLookups = new AtomicLong(0);
         this.vanityPathBloomNegatives = new AtomicLong(0);
@@ -200,7 +198,7 @@ public class MapEntries implements
 
         this.metrics = metrics;
         if (metrics.isPresent()) {
-            this.metrics.get().setNumberOfVanityPathsSupplier(vanityCounter::get);
+            this.metrics.get().setNumberOfVanityPathsSupplier(vanityPathHandler::getTotalCount);
             this.metrics.get().setNumberOfResourcesWithVanityPathsOnStartupSupplier(vanityResourcesOnStartup::get);
             this.metrics.get().setNumberOfVanityPathLookupsSupplier(vanityPathLookups::get);
             this.metrics.get().setNumberOfVanityPathBloomNegativesSupplier(vanityPathBloomNegatives::get);
@@ -570,7 +568,7 @@ public class MapEntries implements
     private boolean doAddVanity(final Resource resource) {
         log.debug("doAddVanity getting {}", resource.getPath());
 
-        boolean updateTheCache = isAllVanityPathEntriesCached() || vanityCounter.longValue() < this.factory.getMaxCachedVanityPathEntries();
+        boolean updateTheCache = isAllVanityPathEntriesCached() || vanityPathHandler.getTotalCount() < this.factory.getMaxCachedVanityPathEntries();
         return null != loadVanityPath(resource, resolveMapsMap, vanityTargets, updateTheCache);
     }
 
@@ -593,8 +591,8 @@ public class MapEntries implements
                     this.resolveMapsMap.remove(s);
                 }
             }
-            if (vanityCounter.longValue() > 0) {
-                vanityCounter.addAndGet(-2);
+            if (vanityPathHandler.getTotalCount() > 0) {
+                vanityPathHandler.addToTotalCountAndGet(-2);
             }
             return true;
         }
@@ -985,7 +983,7 @@ public class MapEntries implements
                 }
                 if ( isValid ) {
                     totalValid += 1;
-                    if (this.vanityPathsProcessed.get() && (this.factory.isMaxCachedVanityPathEntriesStartup() || vanityCounter.longValue() < this.factory.getMaxCachedVanityPathEntries())) {
+                    if (this.vanityPathsProcessed.get() && (this.factory.isMaxCachedVanityPathEntriesStartup() || vanityPathHandler.getTotalCount() < this.factory.getMaxCachedVanityPathEntries())) {
                         loadVanityPath(resource, resolveMapsMap, vanityTargets, true);
                         entryMap = resolveMapsMap;
                     } else {
@@ -1358,7 +1356,7 @@ public class MapEntries implements
             if (Stream.of(this.factory.getObservationPaths()).anyMatch(path -> path.matches(resourcePath))) {
                 countInScope += 1;
                 final boolean addToCache = isAllVanityPathEntriesCached()
-                        || vanityCounter.longValue() < this.factory.getMaxCachedVanityPathEntries();
+                        || vanityPathHandler.getTotalCount() < this.factory.getMaxCachedVanityPathEntries();
                 loadVanityPath(resource, resolveMapsMap, targetPaths, addToCache);
             }
         }
@@ -1449,7 +1447,7 @@ public class MapEntries implements
                         this.updateTargetPaths(targetPaths, redirect, checkPath);
                         //increment only if the instance variable
                         if (entryMap == resolveMapsMap) {
-                            vanityCounter.addAndGet(2);
+                            vanityPathHandler.addToTotalCountAndGet(2);
                         }
 
                         this.vanityPathHandler.cacheWillProbablyContain(checkPath);
diff --git a/src/main/java/org/apache/sling/resourceresolver/impl/mapping/VanityPathHandler.java b/src/main/java/org/apache/sling/resourceresolver/impl/mapping/VanityPathHandler.java
index 5284102..fc94ae9 100644
--- a/src/main/java/org/apache/sling/resourceresolver/impl/mapping/VanityPathHandler.java
+++ b/src/main/java/org/apache/sling/resourceresolver/impl/mapping/VanityPathHandler.java
@@ -22,6 +22,7 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 import java.util.Objects;
+import java.util.concurrent.atomic.AtomicLong;
 
 /**
  * Handles loading and caching of vanity paths.
@@ -39,6 +40,8 @@ public class VanityPathHandler {
 
     private static final String JCR_SYSTEM_PREFIX = "/jcr:system/";
 
+    private final AtomicLong vanityCounter;
+
     /**
      * @param factory {@link MapConfigurationProvider}
      */
@@ -46,6 +49,7 @@ public class VanityPathHandler {
         this.factory = factory;
         this.bloomFilter = BloomFilterUtils.createFilter(VANITY_BLOOM_FILTER_MAX_ENTRIES,
                 this.factory.getVanityBloomFilterMaxBytes());
+        this.vanityCounter = new AtomicLong(0);
     }
 
     /**
@@ -87,4 +91,12 @@ public class VanityPathHandler {
     void cacheWillProbablyContain(String path) {
         BloomFilterUtils.add(this.bloomFilter, path);
     }
+
+    long getTotalCount() {
+        return vanityCounter.get();
+    }
+
+    long addToTotalCountAndGet(long delta) {
+        return vanityCounter.addAndGet(delta);
+    }
  }
diff --git a/src/test/java/org/apache/sling/resourceresolver/impl/mapping/MapEntriesTest.java b/src/test/java/org/apache/sling/resourceresolver/impl/mapping/MapEntriesTest.java
index 0526c16..f0e4185 100644
--- a/src/test/java/org/apache/sling/resourceresolver/impl/mapping/MapEntriesTest.java
+++ b/src/test/java/org/apache/sling/resourceresolver/impl/mapping/MapEntriesTest.java
@@ -654,10 +654,10 @@ public class MapEntriesTest extends AbstractMappingMapEntriesTest {
         entries = mapEntries.getResolveMaps();
         assertEquals(2, entries.size());
 
-        Field vanityCounter = MapEntries.class.getDeclaredField("vanityCounter");
-        vanityCounter.setAccessible(true);
-        AtomicLong counter = (AtomicLong) vanityCounter.get(mapEntries);
-        assertEquals(2, counter.longValue());
+        Field vanityPathHandlerField = MapEntries.class.getDeclaredField("vanityPathHandler");
+        vanityPathHandlerField.setAccessible(true);
+        VanityPathHandler vph = (VanityPathHandler) vanityPathHandlerField.get(mapEntries);
+        assertEquals(2, vph.getTotalCount());
 
         //bad vanity
         Resource badVanityPath = mock(Resource.class, "badVanityPath");
@@ -691,8 +691,7 @@ public class MapEntriesTest extends AbstractMappingMapEntriesTest {
         entries = mapEntries.getResolveMaps();
         assertEquals(4, entries.size());
 
-        counter = (AtomicLong) vanityCounter.get(mapEntries);
-        assertEquals(4, counter.longValue());
+        assertEquals(4, vph.getTotalCount());
 
         vanityTargets = (Map<String, List<String>>) field.get(mapEntries);
         assertEquals(2, vanityTargets.size());
@@ -727,10 +726,10 @@ public class MapEntriesTest extends AbstractMappingMapEntriesTest {
         entries = mapEntries.getResolveMaps();
         assertEquals(2, entries.size());
 
-        Field vanityCounter = MapEntries.class.getDeclaredField("vanityCounter");
-        vanityCounter.setAccessible(true);
-        AtomicLong counter = (AtomicLong) vanityCounter.get(mapEntries);
-        assertEquals(2, counter.longValue());
+        Field vanityPathHandlerField = MapEntries.class.getDeclaredField("vanityPathHandler");
+        vanityPathHandlerField.setAccessible(true);
+        VanityPathHandler vph = (VanityPathHandler) vanityPathHandlerField.get(mapEntries);
+        assertEquals(2, vph.getTotalCount());
 
         //bad vanity
         Resource badVanityPath = mock(Resource.class, "badVanityPath");
@@ -741,7 +740,6 @@ public class MapEntriesTest extends AbstractMappingMapEntriesTest {
 
         addResource.invoke(mapEntries, "/badVanityPath", new AtomicBoolean());
 
-
         assertEquals(2, entries.size());
 
         vanityTargets = (Map<String, List<String>>) field.get(mapEntries);
@@ -764,8 +762,7 @@ public class MapEntriesTest extends AbstractMappingMapEntriesTest {
         entries = mapEntries.getResolveMaps();
         assertEquals(4, entries.size());
 
-        counter = (AtomicLong) vanityCounter.get(mapEntries);
-        assertEquals(4, counter.longValue());
+        assertEquals(4, vph.getTotalCount());
 
         vanityTargets = (Map<String, List<String>>) field.get(mapEntries);
         assertEquals(2, vanityTargets.size());
@@ -881,10 +878,10 @@ public class MapEntriesTest extends AbstractMappingMapEntriesTest {
 
         addResource.invoke(mapEntries, "/justVanityPath", new AtomicBoolean());
 
-        Field vanityCounter = MapEntries.class.getDeclaredField("vanityCounter");
-        vanityCounter.setAccessible(true);
-        AtomicLong counter = (AtomicLong) vanityCounter.get(mapEntries);
-        assertEquals(2, counter.longValue());
+        Field vanityPathHandlerField = MapEntries.class.getDeclaredField("vanityPathHandler");
+        vanityPathHandlerField.setAccessible(true);
+        VanityPathHandler vph = (VanityPathHandler) vanityPathHandlerField.get(mapEntries);
+        assertEquals(2, vph.getTotalCount());
         assertEquals(2, resolveMapsMap.size());
         assertEquals(1, vanityTargets.size());
         assertNotNull(resolveMapsMap.get("/target/justVanityPath"));
@@ -894,8 +891,7 @@ public class MapEntriesTest extends AbstractMappingMapEntriesTest {
         //remove vanity path
         method1.invoke(mapEntries, "/justVanityPath");
 
-        counter = (AtomicLong) vanityCounter.get(mapEntries);
-        assertEquals(0, counter.longValue());
+        assertEquals(0, vph.getTotalCount());
 
         assertEquals(1, resolveMapsMap.size());
         assertEquals(0, vanityTargets.size());
@@ -1912,10 +1908,10 @@ public class MapEntriesTest extends AbstractMappingMapEntriesTest {
         method.setAccessible(true);
         method.invoke(mapEntries, "/notExisting");
 
-        Field vanityCounter = MapEntries.class.getDeclaredField("vanityCounter");
-        vanityCounter.setAccessible(true);
-        AtomicLong counter = (AtomicLong) vanityCounter.get(mapEntries);
-        assertEquals(0, counter.longValue());
+        Field vanityPathHandlerField = MapEntries.class.getDeclaredField("vanityPathHandler");
+        vanityPathHandlerField.setAccessible(true);
+        VanityPathHandler vph = (VanityPathHandler) vanityPathHandlerField.get(mapEntries);
+        assertEquals(0, vph.getTotalCount());
     }
 
     @Test
@@ -1947,10 +1943,10 @@ public class MapEntriesTest extends AbstractMappingMapEntriesTest {
         method.setAccessible(true);
         method.invoke(mapEntries, "/target/justVanityPath");
 
-        Field vanityCounter = MapEntries.class.getDeclaredField("vanityCounter");
-        vanityCounter.setAccessible(true);
-        AtomicLong counter = (AtomicLong) vanityCounter.get(mapEntries);
-        assertEquals(2, counter.longValue());
+        Field vanityPathHandlerField = MapEntries.class.getDeclaredField("vanityPathHandler");
+        vanityPathHandlerField.setAccessible(true);
+        VanityPathHandler vph = (VanityPathHandler) vanityPathHandlerField.get(mapEntries);
+        assertEquals(2, vph.getTotalCount());
 
         final Resource justVanityPath2 = mock(Resource.class, "justVanityPath2");
         when(resourceResolver.getResource("/justVanityPath2")).thenReturn(justVanityPath2);
@@ -1972,8 +1968,7 @@ public class MapEntriesTest extends AbstractMappingMapEntriesTest {
 
         method.invoke(mapEntries, "/target/justVanityPath");
 
-        counter = (AtomicLong) vanityCounter.get(mapEntries);
-        assertEquals(4, counter.longValue());
+        assertEquals(4, vph.getTotalCount());
     }
 
     @Test
@@ -2006,10 +2001,10 @@ public class MapEntriesTest extends AbstractMappingMapEntriesTest {
         method.setAccessible(true);
         method.invoke(mapEntries, "/target/justVanityPath");
 
-        Field vanityCounter = MapEntries.class.getDeclaredField("vanityCounter");
-        vanityCounter.setAccessible(true);
-        AtomicLong counter = (AtomicLong) vanityCounter.get(mapEntries);
-        assertEquals(0, counter.longValue());
+        Field vanityPathHandlerField = MapEntries.class.getDeclaredField("vanityPathHandler");
+        vanityPathHandlerField.setAccessible(true);
+        VanityPathHandler vph = (VanityPathHandler) vanityPathHandlerField.get(mapEntries);
+        assertEquals(0, vph.getTotalCount());
     }
 
     @Test
@@ -2041,10 +2036,10 @@ public class MapEntriesTest extends AbstractMappingMapEntriesTest {
         method.setAccessible(true);
         method.invoke(mapEntries, "/content/mypage/en-us-{132");
 
-        Field vanityCounter = MapEntries.class.getDeclaredField("vanityCounter");
-        vanityCounter.setAccessible(true);
-        AtomicLong counter = (AtomicLong) vanityCounter.get(mapEntries);
-        assertEquals(0, counter.longValue());
+        Field vanityPathHandlerField = MapEntries.class.getDeclaredField("vanityPathHandler");
+        vanityPathHandlerField.setAccessible(true);
+        VanityPathHandler vph = (VanityPathHandler) vanityPathHandlerField.get(mapEntries);
+        assertEquals(0, vph.getTotalCount());
     }
 
     @Test
@@ -2076,10 +2071,10 @@ public class MapEntriesTest extends AbstractMappingMapEntriesTest {
         method.setAccessible(true);
         method.invoke(mapEntries, "/target/justVanityPath");
 
-        Field vanityCounter = MapEntries.class.getDeclaredField("vanityCounter");
-        vanityCounter.setAccessible(true);
-        AtomicLong counter = (AtomicLong) vanityCounter.get(mapEntries);
-        assertEquals(2, counter.longValue());
+        Field vanityPathHandlerField = MapEntries.class.getDeclaredField("vanityPathHandler");
+        vanityPathHandlerField.setAccessible(true);
+        VanityPathHandler vph = (VanityPathHandler) vanityPathHandlerField.get(mapEntries);
+        assertEquals(2, vph.getTotalCount());
 
         final Resource justVanityPath2 = mock(Resource.class, "justVanityPath2");
         when(resourceResolver.getResource("/justVanityPath2")).thenReturn(justVanityPath2);
@@ -2101,8 +2096,7 @@ public class MapEntriesTest extends AbstractMappingMapEntriesTest {
 
         method.invoke(mapEntries, "/target/justVanityPath");
 
-        counter = (AtomicLong) vanityCounter.get(mapEntries);
-        assertEquals(2, counter.longValue());
+        assertEquals(2, vph.getTotalCount());
     }
 
     @Test
@@ -2132,10 +2126,10 @@ public class MapEntriesTest extends AbstractMappingMapEntriesTest {
         method.setAccessible(true);
         method.invoke(mapEntries, resourceResolver);
 
-        Field vanityCounter = MapEntries.class.getDeclaredField("vanityCounter");
-        vanityCounter.setAccessible(true);
-        AtomicLong counter = (AtomicLong) vanityCounter.get(mapEntries);
-        assertEquals(2, counter.longValue());
+        Field vanityPathHandlerField = MapEntries.class.getDeclaredField("vanityPathHandler");
+        vanityPathHandlerField.setAccessible(true);
+        VanityPathHandler vph = (VanityPathHandler) vanityPathHandlerField.get(mapEntries);
+        assertEquals(2, vph.getTotalCount());
     }
 
     @Test
@@ -2164,10 +2158,10 @@ public class MapEntriesTest extends AbstractMappingMapEntriesTest {
         method.setAccessible(true);
         method.invoke(mapEntries, resourceResolver);
 
-        Field vanityCounter = MapEntries.class.getDeclaredField("vanityCounter");
-        vanityCounter.setAccessible(true);
-        AtomicLong counter = (AtomicLong) vanityCounter.get(mapEntries);
-        assertEquals(2, counter.longValue());
+        Field vanityPathHandlerField = MapEntries.class.getDeclaredField("vanityPathHandler");
+        vanityPathHandlerField.setAccessible(true);
+        VanityPathHandler vph = (VanityPathHandler) vanityPathHandlerField.get(mapEntries);
+        assertEquals(2, vph.getTotalCount());
     }
 
     @Test
@@ -2213,19 +2207,17 @@ public class MapEntriesTest extends AbstractMappingMapEntriesTest {
         entries = mapEntries.getResolveMaps();
         assertEquals(2, entries.size());
 
-        Field vanityCounter =
-                MapEntries.class.getDeclaredField("vanityCounter");
-        vanityCounter.setAccessible(true);
-        AtomicLong counter = (AtomicLong) vanityCounter.get(mapEntries);
-        assertEquals(2, counter.longValue());
+        Field vanityPathHandlerField = MapEntries.class.getDeclaredField("vanityPathHandler");
+        vanityPathHandlerField.setAccessible(true);
+        VanityPathHandler vph = (VanityPathHandler) vanityPathHandlerField.get(mapEntries);
+        assertEquals(2, vph.getTotalCount());
 
         method.invoke(mapEntries, "/target/justVanityPath");
 
         entries = mapEntries.getResolveMaps();
         assertEquals(2, entries.size());
 
-        counter = (AtomicLong) vanityCounter.get(mapEntries);
-        assertEquals(2, counter.longValue());
+        assertEquals(2, vph.getTotalCount());
     }
 
     @Test