Index: oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/SegmentCache.java IDEA additional info: Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP <+>UTF-8 =================================================================== --- oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/SegmentCache.java (date 1509987984000) +++ oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/SegmentCache.java (date 1510180561000) @@ -101,13 +101,12 @@ } /** Unconditionally put an item in the cache */ - private Segment put(@Nonnull SegmentId id, @Nonnull Segment segment) { + private void put(@Nonnull SegmentId id, @Nonnull Segment segment) { // Call loaded *before* putting the segment into the cache as the latter // might cause it to get evicted right away again. id.loaded(segment); cache.put(id, segment); stats.currentWeight.addAndGet(weigher.weigh(id, segment)); - return segment; } /** @@ -131,13 +130,18 @@ // Load data segment and put it in the cache try { - long t0 = System.nanoTime(); - Segment segment = loader.call(); - stats.loadSuccessCount.incrementAndGet(); - stats.loadTime.addAndGet(System.nanoTime() - t0); - stats.missCount.incrementAndGet(); - - return put(id, segment); + Segment segment = cache.getIfPresent(id); + if (segment == null) { + long t0 = System.nanoTime(); + segment = loader.call(); + stats.loadSuccessCount.incrementAndGet(); + stats.loadTime.addAndGet(System.nanoTime() - t0); + stats.missCount.incrementAndGet(); + put(id, segment); + } else { + stats.hitCount.incrementAndGet(); + } + return segment; } catch (Exception e) { stats.loadExceptionCount.incrementAndGet(); throw new ExecutionException(e);