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]

Reply via email to