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;