This is an automated email from the ASF dual-hosted git repository. reschke pushed a commit to branch SLING-12648 in repository https://gitbox.apache.org/repos/asf/sling-org-apache-sling-resourceresolver.git
commit 430684253330994bf9ca228e56ac349926b64ef8 Author: Julian Reschke <[email protected]> AuthorDate: Tue Feb 4 16:08:04 2025 +0100 SLING-12648: MapEntries: factor out vanity path handling - move metrics --- .../resourceresolver/impl/mapping/MapEntries.java | 42 +++++------ .../impl/mapping/VanityPathMapEntriesTest.java | 81 ++++++---------------- 2 files changed, 41 insertions(+), 82 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 7198f74..98da578 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 @@ -150,12 +150,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; - private final AtomicLong vanityPathBloomFalsePositives; - private AtomicBoolean vanityPathsProcessed = new AtomicBoolean(false); private final StringInterpolationProvider stringInterpolationProvider; @@ -189,22 +183,16 @@ 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); - this.vanityPathBloomFalsePositives = new AtomicLong(0); - this.vph = new VanityPathHandler(this.factory); this.vph.initializeVanityPaths(); this.metrics = metrics; if (metrics.isPresent()) { - this.metrics.get().setNumberOfVanityPathsSupplier(vanityCounter::get); - this.metrics.get().setNumberOfResourcesWithVanityPathsOnStartupSupplier(vanityResourcesOnStartup::get); - this.metrics.get().setNumberOfVanityPathLookupsSupplier(vanityPathLookups::get); - this.metrics.get().setNumberOfVanityPathBloomNegativesSupplier(vanityPathBloomNegatives::get); - this.metrics.get().setNumberOfVanityPathBloomFalsePositivesSupplier(vanityPathBloomFalsePositives::get); + this.metrics.get().setNumberOfVanityPathsSupplier(vph.vanityCounter::get); + this.metrics.get().setNumberOfResourcesWithVanityPathsOnStartupSupplier(vph.vanityResourcesOnStartup::get); + this.metrics.get().setNumberOfVanityPathLookupsSupplier(vph.vanityPathLookups::get); + this.metrics.get().setNumberOfVanityPathBloomNegativesSupplier(vph.vanityPathBloomNegatives::get); + this.metrics.get().setNumberOfVanityPathBloomFalsePositivesSupplier(vph.vanityPathBloomFalsePositives::get); this.metrics.get().setNumberOfResourcesWithAliasedChildrenSupplier(() -> (long) aliasMapsMap.size()); this.metrics.get().setNumberOfResourcesWithAliasesOnStartupSupplier(aliasResourcesOnStartup::get); this.metrics.get().setNumberOfDetectedConflictingAliasesSupplier(detectedConflictingAliases::get); @@ -1212,6 +1200,12 @@ public class MapEntries implements private static final int VANITY_BLOOM_FILTER_MAX_ENTRIES = 10000000; + private final AtomicLong vanityCounter = new AtomicLong(0); + private final AtomicLong vanityResourcesOnStartup = new AtomicLong(0);; + private final AtomicLong vanityPathLookups = new AtomicLong(0);; + private final AtomicLong vanityPathBloomNegatives = new AtomicLong(0);; + private final AtomicLong vanityPathBloomFalsePositives = new AtomicLong(0);; + private final MapConfigurationProvider factory; private byte[] vanityBloomFilter; @@ -1381,12 +1375,12 @@ public class MapEntries implements if (initFinished) { // total number of lookups after init (and when cache not complete) - long current = MapEntries.this.vanityPathLookups.incrementAndGet(); + long current = this.vanityPathLookups.incrementAndGet(); if (current >= Long.MAX_VALUE - 100000) { // reset counters when we get close the limit - MapEntries.this.vanityPathLookups.set(1); - MapEntries.this.vanityPathBloomNegatives.set(0); - MapEntries.this.vanityPathBloomFalsePositives.set(0); + this.vanityPathLookups.set(1); + this.vanityPathBloomNegatives.set(0); + this.vanityPathBloomFalsePositives.set(0); log.info("Vanity Path metrics reset to 0"); } @@ -1396,7 +1390,7 @@ public class MapEntries implements if (!probablyPresent) { // filtered by Bloom filter - MapEntries.this.vanityPathBloomNegatives.incrementAndGet(); + this.vanityPathBloomNegatives.incrementAndGet(); } } @@ -1425,7 +1419,7 @@ public class MapEntries implements } if (mapEntries == null && probablyPresent) { // Bloom filter had a false positive - MapEntries.this.vanityPathBloomFalsePositives.incrementAndGet(); + this.vanityPathBloomFalsePositives.incrementAndGet(); } } @@ -1571,7 +1565,7 @@ public class MapEntries implements } } - MapEntries.this.vanityResourcesOnStartup.set(count); + this.vanityResourcesOnStartup.set(count); return targetPaths; } diff --git a/src/test/java/org/apache/sling/resourceresolver/impl/mapping/VanityPathMapEntriesTest.java b/src/test/java/org/apache/sling/resourceresolver/impl/mapping/VanityPathMapEntriesTest.java index 738efa7..3e1261a 100644 --- a/src/test/java/org/apache/sling/resourceresolver/impl/mapping/VanityPathMapEntriesTest.java +++ b/src/test/java/org/apache/sling/resourceresolver/impl/mapping/VanityPathMapEntriesTest.java @@ -178,6 +178,12 @@ public class VanityPathMapEntriesTest extends AbstractMappingMapEntriesTest { waitForBgInit(); } + private static AtomicLong getVanityCounter(MapEntries mapEntries) throws NoSuchFieldException, IllegalAccessException { + Field vanityCounter = MapEntries.VanityPathHandler.class.getDeclaredField("vanityCounter"); + vanityCounter.setAccessible(true); + return (AtomicLong) vanityCounter.get(mapEntries.vph); + } + @Override @After public void tearDown() { @@ -569,10 +575,7 @@ public class VanityPathMapEntriesTest 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()); + assertEquals(2, getVanityCounter(mapEntries).longValue()); //bad vanity Resource badVanityPath = mock(Resource.class, "badVanityPath"); @@ -606,8 +609,7 @@ public class VanityPathMapEntriesTest extends AbstractMappingMapEntriesTest { entries = mapEntries.getResolveMaps(); assertEquals(4, entries.size()); - counter = (AtomicLong) vanityCounter.get(mapEntries); - assertEquals(4, counter.longValue()); + assertEquals(4, getVanityCounter(mapEntries).longValue()); vanityTargets = (Map<String, List<String>>) field.get(mapEntries); assertEquals(2, vanityTargets.size()); @@ -642,10 +644,7 @@ public class VanityPathMapEntriesTest 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()); + assertEquals(2, getVanityCounter(mapEntries).longValue()); //bad vanity Resource badVanityPath = mock(Resource.class, "badVanityPath"); @@ -679,8 +678,7 @@ public class VanityPathMapEntriesTest extends AbstractMappingMapEntriesTest { entries = mapEntries.getResolveMaps(); assertEquals(4, entries.size()); - counter = (AtomicLong) vanityCounter.get(mapEntries); - assertEquals(4, counter.longValue()); + assertEquals(4, getVanityCounter(mapEntries).longValue()); vanityTargets = (Map<String, List<String>>) field.get(mapEntries); assertEquals(2, vanityTargets.size()); @@ -796,10 +794,7 @@ public class VanityPathMapEntriesTest 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()); + assertEquals(2, getVanityCounter(mapEntries).longValue()); assertEquals(2, resolveMapsMap.size()); assertEquals(1, vanityTargets.size()); assertNotNull(resolveMapsMap.get("/target/justVanityPath")); @@ -809,8 +804,7 @@ public class VanityPathMapEntriesTest extends AbstractMappingMapEntriesTest { //remove vanity path method1.invoke(mapEntries.vph, "/justVanityPath"); - counter = (AtomicLong) vanityCounter.get(mapEntries); - assertEquals(0, counter.longValue()); + assertEquals(0, getVanityCounter(mapEntries).longValue()); assertEquals(1, resolveMapsMap.size()); assertEquals(0, vanityTargets.size()); @@ -933,10 +927,7 @@ public class VanityPathMapEntriesTest extends AbstractMappingMapEntriesTest { method.setAccessible(true); method.invoke(mapEntries.vph, "/notExisting"); - Field vanityCounter = MapEntries.class.getDeclaredField("vanityCounter"); - vanityCounter.setAccessible(true); - AtomicLong counter = (AtomicLong) vanityCounter.get(mapEntries); - assertEquals(0, counter.longValue()); + assertEquals(0, getVanityCounter(mapEntries).longValue()); } @Test @@ -963,10 +954,7 @@ public class VanityPathMapEntriesTest extends AbstractMappingMapEntriesTest { method.setAccessible(true); method.invoke(mapEntries.vph, "/target/justVanityPath"); - Field vanityCounter = MapEntries.class.getDeclaredField("vanityCounter"); - vanityCounter.setAccessible(true); - AtomicLong counter = (AtomicLong) vanityCounter.get(mapEntries); - assertEquals(this.isMaxCachedVanityPathEntriesStartup ? 2 : 0, counter.longValue()); + assertEquals(this.isMaxCachedVanityPathEntriesStartup ? 2 : 0, getVanityCounter(mapEntries).longValue()); final Resource justVanityPath2 = mock(Resource.class, "justVanityPath2"); when(resourceResolver.getResource("/justVanityPath2")).thenReturn(justVanityPath2); @@ -984,8 +972,7 @@ public class VanityPathMapEntriesTest extends AbstractMappingMapEntriesTest { method.invoke(mapEntries.vph, "/target/justVanityPath"); - counter = (AtomicLong) vanityCounter.get(mapEntries); - assertEquals(this.isMaxCachedVanityPathEntriesStartup ? 4 : 0, counter.longValue()); + assertEquals(this.isMaxCachedVanityPathEntriesStartup ? 4 : 0, getVanityCounter(mapEntries).longValue()); } @Test @@ -1014,10 +1001,7 @@ public class VanityPathMapEntriesTest extends AbstractMappingMapEntriesTest { method.setAccessible(true); method.invoke(mapEntries.vph, "/target/justVanityPath"); - Field vanityCounter = MapEntries.class.getDeclaredField("vanityCounter"); - vanityCounter.setAccessible(true); - AtomicLong counter = (AtomicLong) vanityCounter.get(mapEntries); - assertEquals(0, counter.longValue()); + assertEquals(0, getVanityCounter(mapEntries).longValue()); } @Test @@ -1045,10 +1029,7 @@ public class VanityPathMapEntriesTest extends AbstractMappingMapEntriesTest { method.setAccessible(true); method.invoke(mapEntries.vph, "/content/mypage/en-us-{132"); - Field vanityCounter = MapEntries.class.getDeclaredField("vanityCounter"); - vanityCounter.setAccessible(true); - AtomicLong counter = (AtomicLong) vanityCounter.get(mapEntries); - assertEquals(0, counter.longValue()); + assertEquals(0, getVanityCounter(mapEntries).longValue()); } @Test @@ -1076,10 +1057,7 @@ public class VanityPathMapEntriesTest extends AbstractMappingMapEntriesTest { method.setAccessible(true); method.invoke(mapEntries.vph, "/target/justVanityPath"); - Field vanityCounter = MapEntries.class.getDeclaredField("vanityCounter"); - vanityCounter.setAccessible(true); - AtomicLong counter = (AtomicLong) vanityCounter.get(mapEntries); - assertEquals(2, counter.longValue()); + assertEquals(2, getVanityCounter(mapEntries).longValue()); final Resource justVanityPath2 = mock(Resource.class, "justVanityPath2"); when(resourceResolver.getResource("/justVanityPath2")).thenReturn(justVanityPath2); @@ -1096,9 +1074,7 @@ public class VanityPathMapEntriesTest extends AbstractMappingMapEntriesTest { }); method.invoke(mapEntries.vph, "/target/justVanityPath"); - - counter = (AtomicLong) vanityCounter.get(mapEntries); - assertEquals(2, counter.longValue()); + assertEquals(2, getVanityCounter(mapEntries).longValue()); } @Test @@ -1124,10 +1100,7 @@ public class VanityPathMapEntriesTest extends AbstractMappingMapEntriesTest { method.setAccessible(true); method.invoke(mapEntries.vph, resourceResolver); - Field vanityCounter = MapEntries.class.getDeclaredField("vanityCounter"); - vanityCounter.setAccessible(true); - AtomicLong counter = (AtomicLong) vanityCounter.get(mapEntries); - assertEquals(2, counter.longValue()); + assertEquals(2, getVanityCounter(mapEntries).longValue()); } @Test @@ -1152,10 +1125,7 @@ public class VanityPathMapEntriesTest extends AbstractMappingMapEntriesTest { method.setAccessible(true); method.invoke(mapEntries.vph, resourceResolver); - Field vanityCounter = MapEntries.class.getDeclaredField("vanityCounter"); - vanityCounter.setAccessible(true); - AtomicLong counter = (AtomicLong) vanityCounter.get(mapEntries); - assertEquals(2, counter.longValue()); + assertEquals(2, getVanityCounter(mapEntries).longValue()); } @Test @@ -1197,19 +1167,14 @@ public class VanityPathMapEntriesTest extends AbstractMappingMapEntriesTest { entries = mapEntries.getResolveMaps(); assertEquals(expected, entries.size()); - Field vanityCounter = - MapEntries.class.getDeclaredField("vanityCounter"); - vanityCounter.setAccessible(true); - AtomicLong counter = (AtomicLong) vanityCounter.get(mapEntries); - assertEquals(expected, counter.longValue()); + assertEquals(expected, getVanityCounter(mapEntries).longValue()); method.invoke(mapEntries.vph, "/target/justVanityPath"); entries = mapEntries.getResolveMaps(); assertEquals(expected, entries.size()); - counter = (AtomicLong) vanityCounter.get(mapEntries); - assertEquals(expected, counter.longValue()); + assertEquals(expected, getVanityCounter(mapEntries).longValue()); } @Test
