diff --git oak-run/pom.xml oak-run/pom.xml index 7168a9e1c3..604ff9d31a 100644 --- oak-run/pom.xml +++ oak-run/pom.xml @@ -35,12 +35,13 @@ 2.4.7 - 47000000 + 48200000 diff --git oak-segment-tar/pom.xml oak-segment-tar/pom.xml index 9f6c704246..932b3527b2 100644 --- oak-segment-tar/pom.xml +++ oak-segment-tar/pom.xml @@ -171,6 +171,11 @@ commons-io provided + + org.apache.commons + commons-math3 + provided + com.google.guava guava diff --git oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/scheduler/LockBasedScheduler.java oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/scheduler/LockBasedScheduler.java index ee09a3f125..340718cac5 100644 --- oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/scheduler/LockBasedScheduler.java +++ oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/scheduler/LockBasedScheduler.java @@ -19,6 +19,7 @@ package org.apache.jackrabbit.oak.segment.scheduler; import static com.google.common.base.Preconditions.checkArgument; import static com.google.common.base.Preconditions.checkNotNull; import static java.lang.Thread.currentThread; +import static java.util.concurrent.TimeUnit.NANOSECONDS; import static org.apache.jackrabbit.oak.api.Type.LONG; import java.io.Closeable; @@ -32,6 +33,7 @@ import java.util.concurrent.atomic.AtomicReference; import javax.annotation.Nonnull; +import org.apache.commons.math3.stat.descriptive.SynchronizedDescriptiveStatistics; import org.apache.jackrabbit.oak.api.CommitFailedException; import org.apache.jackrabbit.oak.api.PropertyState; import org.apache.jackrabbit.oak.segment.Revisions; @@ -135,6 +137,9 @@ public class LockBasedScheduler implements Scheduler { protected final AtomicReference head; private final SegmentNodeStoreStats stats; + + private final SynchronizedDescriptiveStatistics commitTimeStats = new SynchronizedDescriptiveStatistics(100); + public LockBasedScheduler(LockBasedSchedulerBuilder builder) { if (COMMIT_FAIR_LOCK) { @@ -150,12 +155,17 @@ public class LockBasedScheduler implements Scheduler { @Override public NodeState getHeadNodeState() { - if (commitSemaphore.tryAcquire()) { - try { - refreshHead(true); - } finally { - commitSemaphore.release(); - } + long delay = (long) commitTimeStats.getPercentile(50); + try { + if (commitSemaphore.tryAcquire(delay, NANOSECONDS)) { + try { + refreshHead(true); + } finally { + commitSemaphore.release(); + } + } + } catch (InterruptedException e) { + currentThread().interrupt(); } return head.get(); } @@ -210,6 +220,7 @@ public class LockBasedScheduler implements Scheduler { long afterCommitTime = System.nanoTime(); stats.committedAfter(afterCommitTime - beforeCommitTime); + commitTimeStats.addValue(afterCommitTime - beforeCommitTime); stats.onCommit(); return merged;