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) {


Reply via email to