Index: oak-core/src/main/java/org/apache/jackrabbit/oak/stats/Clock.java =================================================================== --- oak-core/src/main/java/org/apache/jackrabbit/oak/stats/Clock.java (revision 1701573) +++ oak-core/src/main/java/org/apache/jackrabbit/oak/stats/Clock.java (working copy) @@ -19,6 +19,7 @@ import java.util.Date; import java.util.Random; import java.util.concurrent.ScheduledExecutorService; +import java.util.concurrent.ScheduledFuture; import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicLong; @@ -279,8 +280,10 @@ private volatile long time = ACCURATE.getTime(); + private final ScheduledFuture future; + public Fast(ScheduledExecutorService executor) { - executor.scheduleAtFixedRate(new Runnable() { + future = executor.scheduleAtFixedRate(new Runnable() { @Override public void run() { time = ACCURATE.getTime(); @@ -298,6 +301,9 @@ return "Clock.Fast"; } + public void dispose() { + future.cancel(false); + } } /** Index: oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/repository/RepositoryImpl.java =================================================================== --- oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/repository/RepositoryImpl.java (revision 1701573) +++ oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/repository/RepositoryImpl.java (working copy) @@ -100,7 +100,7 @@ private final SecurityProvider securityProvider; private final int observationQueueLength; private final CommitRateLimiter commitRateLimiter; - private final Clock clock; + private final Clock.Fast clock; private final DelegatingGCMonitor gcMonitor = new DelegatingGCMonitor(); private final Registration gcMonitorRegistration; @@ -318,6 +318,7 @@ public void shutdown() { statisticManager.dispose(); gcMonitorRegistration.unregister(); + clock.dispose(); closeExecutor(); if (contentRepository instanceof Closeable) { IOUtils.closeQuietly((Closeable) contentRepository);