ben-manes commented on PR #2898: URL: https://github.com/apache/jackrabbit-oak/pull/2898#issuecomment-4456390263
not sure if it helps, but I have a list of [traces](https://github.com/ben-manes/caffeine/wiki/Simulator) where these are my [favorites](https://github.com/ben-manes/caffeine/wiki/Efficiency) as they show a variety of scenarios. I added a patch and examples if you want to play with it. <details><summary>jackrabbit.patch</summary> ```diff diff --git a/simulator/build.gradle.kts b/simulator/build.gradle.kts index 3083461cf..8c92fb767 100644 --- a/simulator/build.gradle.kts +++ b/simulator/build.gradle.kts @@ -26,6 +26,7 @@ dependencies { implementation(libs.ehcache3) implementation(libs.fastutil) implementation(libs.hazelcast) + implementation(libs.jackrabbit) implementation(libs.jfreechart) implementation(libs.fast.filter) implementation(libs.ascii.table) diff --git a/simulator/src/main/java/com/github/benmanes/caffeine/cache/simulator/policy/Registry.java b/simulator/src/main/java/com/github/benmanes/caffeine/cache/simulator/policy/Registry.java index 54d620e84..fe12a6a51 100644 --- a/simulator/src/main/java/com/github/benmanes/caffeine/cache/simulator/policy/Registry.java +++ b/simulator/src/main/java/com/github/benmanes/caffeine/cache/simulator/policy/Registry.java @@ -61,6 +61,7 @@ import com.github.benmanes.caffeine.cache.simulator.policy.product.Ehcache3Polic import com.github.benmanes.caffeine.cache.simulator.policy.product.ExpiringMapPolicy; import com.github.benmanes.caffeine.cache.simulator.policy.product.GuavaPolicy; import com.github.benmanes.caffeine.cache.simulator.policy.product.HazelcastPolicy; +import com.github.benmanes.caffeine.cache.simulator.policy.product.JackrabbitLirsPolicy; import com.github.benmanes.caffeine.cache.simulator.policy.product.TCachePolicy; import com.github.benmanes.caffeine.cache.simulator.policy.sampled.SampledPolicy; import com.github.benmanes.caffeine.cache.simulator.policy.sketch.WindowTinyLfuPolicy; @@ -232,6 +233,7 @@ public final class Registry { registerMany(TCachePolicy.class, TCachePolicy::policies); registerMany(CoherencePolicy.class, CoherencePolicy::policies); registerMany(HazelcastPolicy.class, HazelcastPolicy::policies); + register(JackrabbitLirsPolicy.class, JackrabbitLirsPolicy::new); registerMany(ExpiringMapPolicy.class, ExpiringMapPolicy::policies); } diff --git a/simulator/src/main/java/com/github/benmanes/caffeine/cache/simulator/policy/product/JackrabbitLirsPolicy.java b/simulator/src/main/java/com/github/benmanes/caffeine/cache/simulator/policy/product/JackrabbitLirsPolicy.java new file mode 100644 index 000000000..afb05f01c --- /dev/null +++ b/simulator/src/main/java/com/github/benmanes/caffeine/cache/simulator/policy/product/JackrabbitLirsPolicy.java @@ -0,0 +1,59 @@ +package com.github.benmanes.caffeine.cache.simulator.policy.product; + +import static com.github.benmanes.caffeine.cache.simulator.policy.Policy.Characteristic.WEIGHTED; +import static com.google.common.base.Preconditions.checkState; + +import java.util.Set; + +import org.apache.jackrabbit.oak.cache.CacheLIRS; + +import com.github.benmanes.caffeine.cache.simulator.BasicSettings; +import com.github.benmanes.caffeine.cache.simulator.policy.AccessEvent; +import com.github.benmanes.caffeine.cache.simulator.policy.Policy; +import com.github.benmanes.caffeine.cache.simulator.policy.Policy.PolicySpec; +import com.github.benmanes.caffeine.cache.simulator.policy.PolicyStats; +import com.typesafe.config.Config; + +@PolicySpec(name = "product.JackrabbitLirs", characteristics = WEIGHTED) +public final class JackrabbitLirsPolicy implements Policy { + private final CacheLIRS<Long, AccessEvent> cache; + private final PolicyStats policyStats; + + public JackrabbitLirsPolicy(Config config, Set<Characteristic> characteristics) { + var settings = new BasicSettings(config); + this.policyStats = new PolicyStats(name()); + var builder = CacheLIRS.<Long, AccessEvent>newBuilder() + .evictionCallback((_, _, _) -> policyStats.recordEviction()) + .recordStats(); + if (characteristics.contains(WEIGHTED)) { + builder.maximumWeight(settings.maximumSize()); + builder.weigher((Long _, AccessEvent value) -> value.weight()); + } else { + builder.maximumSize(settings.maximumSize()); + } + this.cache = builder.build(); + } + + @Override + public void record(AccessEvent event) { + Object value = cache.getUnchecked(event.longKey()); + if (value == null) { + cache.put(event.longKey(), event); + policyStats.recordMiss(); + } else { + policyStats.recordHit(); + } + } + + @Override + public PolicyStats stats() { + return policyStats; + } + + @Override + public void finished() { + var stats = cache.stats(); + checkState(policyStats.hitCount() == stats.hitCount()); + checkState(policyStats.missCount() == stats.missCount()); + } +} diff --git a/simulator/src/main/resources/reference.conf b/simulator/src/main/resources/reference.conf index 427efa526..fc854adcd 100644 --- a/simulator/src/main/resources/reference.conf +++ b/simulator/src/main/resources/reference.conf @@ -107,6 +107,7 @@ caffeine.simulator { product.Coherence, product.Hazelcast, product.ExpiringMap, + product.JackrabbitLirs, ] # The admission policy (opposite of eviction policy) ``` </details> <details><summary>SQL Database</summary> ```console ./gradlew simulator:simulate \ --maximumSize=1_000_000,2_000_000,3_000_000,4_000_000,5_000_000,6_000_000,7_000_000,8_000_000 \ -Dcaffeine.simulator.files.paths.0="arc:/Users/ben/Documents/traces/arc/DS1.lis.xz" \ -Dcaffeine.simulator.policies.0="product.JackrabbitLirs" \ -Dcaffeine.simulator.policies.1="product.Caffeine" \ -Dcaffeine.simulator.policies.2="product.Guava" \ -Dcaffeine.simulator.policies.3="irr.Lirs" \ -Dcaffeine.simulator.policies.4="opt.Clairvoyant" \ --title="Database" -PjvmArgs=-Xmx12g ``` <img width="1280" height="720" alt="hit_rate" src="https://github.com/user-attachments/assets/e415971d-bfa1-40e1-8a6f-a6816b794783" /> </details> <details><summary>Stress test</summary> ```console ./gradlew simulator:run -q \ -Dcaffeine.simulator.policies.0="product.JackrabbitLirs" \ -Dcaffeine.simulator.policies.1="product.Caffeine" \ -Dcaffeine.simulator.policies.2="product.Guava" \ -Dcaffeine.simulator.policies.3="irr.Lirs" \ -Dcaffeine.simulator.policies.4="opt.Clairvoyant" \ -Dcaffeine.simulator.files.paths.0="corda:trace_vaultservice_large.gz" \ -Dcaffeine.simulator.files.paths.1="lirs:loop.trace.gz" \ -Dcaffeine.simulator.files.paths.2="lirs:loop.trace.gz" \ -Dcaffeine.simulator.files.paths.3="lirs:loop.trace.gz" \ -Dcaffeine.simulator.files.paths.4="lirs:loop.trace.gz" \ -Dcaffeine.simulator.files.paths.5="lirs:loop.trace.gz" \ -Dcaffeine.simulator.files.paths.6="corda:trace_vaultservice_large.gz" ╔════════════════════════╤══════════╤═══════════╤═══════════╤═══════════╤═══════════╤════════════╤═══════════╤══════════╗ ║ Policy │ Hit Rate │ Miss Rate │ Hits │ Misses │ Requests │ Evictions │ Steps │ Time ║ ╠════════════════════════╪══════════╪═══════════╪═══════════╪═══════════╪═══════════╪════════════╪═══════════╪══════════╣ ║ irr.Lirs │ 20.16 % │ 79.84 % │ 1,264,261 │ 5,007,883 │ 6,272,144 │ 5,007,371 │ 8,782,107 │ 451.6 ms ║ ╟────────────────────────┼──────────┼───────────┼───────────┼───────────┼───────────┼────────────┼───────────┼──────────╢ ║ opt.Clairvoyant │ 40.30 % │ 59.70 % │ 2,527,704 │ 3,744,440 │ 6,272,144 │ 3,743,928 │ │ 1.7 s ║ ╟────────────────────────┼──────────┼───────────┼───────────┼───────────┼───────────┼────────────┼───────────┼──────────╢ ║ product.Caffeine │ 38.51 % │ 61.49 % │ 2,415,227 │ 3,856,917 │ 6,272,144 │ 3,856,405 │ │ 1.2 s ║ ╟────────────────────────┼──────────┼───────────┼───────────┼───────────┼───────────┼────────────┼───────────┼──────────╢ ║ product.Guava │ 19.90 % │ 80.10 % │ 1,248,214 │ 5,023,930 │ 6,272,144 │ 5,023,418 │ │ 1.1 s ║ ╟────────────────────────┼──────────┼───────────┼───────────┼───────────┼───────────┼────────────┼───────────┼──────────╢ ║ product.JackrabbitLirs │ 0.48 % │ 99.52 % │ 29,838 │ 6,242,306 │ 6,272,144 │ 12,483,264 │ │ 1.1 s ║ ╚════════════════════════╧══════════╧═══════════╧═══════════╧═══════════╧═══════════╧════════════╧═══════════╧══════════╝ ``` -- This is an automated message from the Apache Git Service. To respond to the message, please log on to GitHub and use the URL above to go to the specific comment. To unsubscribe, e-mail: [email protected] For queries about this service, please contact Infrastructure at: [email protected]
