Author: mduerig Date: Wed Jul 9 09:55:46 2014 New Revision: 1609072 URL: http://svn.apache.org/r1609072 Log: OAK-1890: Merged revision 1605292
Modified: jackrabbit/oak/branches/1.0/ (props changed) jackrabbit/oak/branches/1.0/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/repository/RepositoryImpl.java Propchange: jackrabbit/oak/branches/1.0/ ------------------------------------------------------------------------------ Merged /jackrabbit/oak/trunk:r1605292 Modified: jackrabbit/oak/branches/1.0/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/repository/RepositoryImpl.java URL: http://svn.apache.org/viewvc/jackrabbit/oak/branches/1.0/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/repository/RepositoryImpl.java?rev=1609072&r1=1609071&r2=1609072&view=diff ============================================================================== --- jackrabbit/oak/branches/1.0/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/repository/RepositoryImpl.java (original) +++ jackrabbit/oak/branches/1.0/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/repository/RepositoryImpl.java Wed Jul 9 09:55:46 2014 @@ -23,8 +23,10 @@ import static java.util.Collections.sing import java.util.Collections; import java.util.Map; import java.util.concurrent.Callable; -import java.util.concurrent.Executors; +import java.util.concurrent.ScheduledFuture; +import java.util.concurrent.ScheduledThreadPoolExecutor; import java.util.concurrent.TimeUnit; + import javax.annotation.CheckForNull; import javax.annotation.Nonnull; import javax.annotation.Nullable; @@ -111,7 +113,8 @@ public class RepositoryImpl implements J private final ThreadLocal<Long> threadSaveCount = new ThreadLocal<Long>(); private final ListeningScheduledExecutorService scheduledExecutor = - MoreExecutors.listeningDecorator(Executors.newSingleThreadScheduledExecutor()); + createListeningScheduledExecutorService(); + private final StatisticManager statisticManager; public RepositoryImpl(@Nonnull ContentRepository contentRepository, @@ -335,7 +338,40 @@ public class RepositoryImpl implements J return descriptors; } -//------------------------------------------------------------< private >--- + //------------------------------------------------------------< private >--- + + private static ListeningScheduledExecutorService createListeningScheduledExecutorService() { + return MoreExecutors.listeningDecorator(new ScheduledThreadPoolExecutor(1) { + // purge the list of schedule tasks before scheduling a new task in order + // to reduce memory consumption in the face of many cancelled tasks. See OAK-1890. + + @Override + public <V> ScheduledFuture<V> schedule(Callable<V> callable, long delay, TimeUnit unit) { + purge(); + return super.schedule(callable, delay, unit); + } + + @Override + public ScheduledFuture<?> schedule(Runnable command, long delay, TimeUnit unit) { + purge(); + return super.schedule(command, delay, unit); + } + + @Override + public ScheduledFuture<?> scheduleAtFixedRate(Runnable command, long initialDelay, + long period, TimeUnit unit) { + purge(); + return super.scheduleAtFixedRate(command, initialDelay, period, unit); + } + + @Override + public ScheduledFuture<?> scheduleWithFixedDelay(Runnable command, long initialDelay, + long delay, TimeUnit unit) { + purge(); + return super.scheduleWithFixedDelay(command, initialDelay, delay, unit); + } + }); + } private static Long getRefreshInterval(Credentials credentials) { if (credentials instanceof SimpleCredentials) {