You are viewing a plain text version of this content. The canonical link for it is here.
Posted to oak-commits@jackrabbit.apache.org by md...@apache.org on 2014/07/09 12:33:26 UTC

svn commit: r1609085 - in /jackrabbit/oak/branches/1.0: ./ oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/repository/RepositoryImpl.java

Author: mduerig
Date: Wed Jul  9 10:33:25 2014
New Revision: 1609085

URL: http://svn.apache.org/r1609085
Log:
OAK-1890: Merged revision 1609064

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:r1609064

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=1609085&r1=1609084&r2=1609085&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 10:33:25 2014
@@ -19,10 +19,12 @@ package org.apache.jackrabbit.oak.jcr.re
 import static com.google.common.base.Preconditions.checkNotNull;
 import static java.util.Collections.emptyMap;
 import static java.util.Collections.singletonMap;
+import static org.apache.jackrabbit.oak.spi.whiteboard.WhiteboardUtils.registerMBean;
 
 import java.util.Collections;
 import java.util.Map;
 import java.util.concurrent.Callable;
+import java.util.concurrent.ScheduledExecutorService;
 import java.util.concurrent.ScheduledFuture;
 import java.util.concurrent.ScheduledThreadPoolExecutor;
 import java.util.concurrent.TimeUnit;
@@ -39,11 +41,6 @@ import javax.jcr.Value;
 import javax.security.auth.login.LoginException;
 
 import com.google.common.collect.ImmutableMap;
-import com.google.common.util.concurrent.FutureCallback;
-import com.google.common.util.concurrent.Futures;
-import com.google.common.util.concurrent.ListenableScheduledFuture;
-import com.google.common.util.concurrent.ListeningScheduledExecutorService;
-import com.google.common.util.concurrent.MoreExecutors;
 import org.apache.jackrabbit.api.JackrabbitRepository;
 import org.apache.jackrabbit.api.security.authentication.token.TokenCredentials;
 import org.apache.jackrabbit.commons.SimpleValueFactory;
@@ -58,7 +55,6 @@ import org.apache.jackrabbit.oak.plugins
 import org.apache.jackrabbit.oak.spi.security.SecurityProvider;
 import org.apache.jackrabbit.oak.spi.whiteboard.Registration;
 import org.apache.jackrabbit.oak.spi.whiteboard.Whiteboard;
-import org.apache.jackrabbit.oak.spi.whiteboard.WhiteboardUtils;
 import org.apache.jackrabbit.oak.stats.Clock;
 import org.apache.jackrabbit.oak.stats.StatisticManager;
 import org.apache.jackrabbit.oak.util.GenericDescriptors;
@@ -112,7 +108,7 @@ public class RepositoryImpl implements J
      */
     private final ThreadLocal<Long> threadSaveCount = new ThreadLocal<Long>();
 
-    private final ListeningScheduledExecutorService scheduledExecutor =
+    private final ScheduledExecutorService scheduledExecutor =
             createListeningScheduledExecutorService();
 
     private final StatisticManager statisticManager;
@@ -274,25 +270,14 @@ public class RepositoryImpl implements J
                 threadSaveCount, statisticManager, clock) {
             // Defer session MBean registration to avoid cluttering the
             // JMX name space with short lived sessions
-            ListenableScheduledFuture<Registration> registration = scheduledExecutor.schedule(
-                    new RegistrationCallable(getSessionStats(), whiteboard), 1, TimeUnit.MINUTES);
+            RegistrationTask registrationTask = new RegistrationTask(getSessionStats(), whiteboard);
+            ScheduledFuture<?> scheduledTask = scheduledExecutor.schedule(registrationTask, 1, TimeUnit.MINUTES);
 
             @Override
             public void logout() {
-                // Cancel session MBean registration and unregister MBean
-                // if registration succeed before the cancellation
-                registration.cancel(false);
-                Futures.addCallback(registration, new FutureCallback<Registration>() {
-                    @Override
-                    public void onSuccess(Registration registration) {
-                        registration.unregister();
-                    }
-
-                    @Override
-                    public void onFailure(Throwable t) {
-                    }
-                });
-
+                // Cancel session MBean registration
+                registrationTask.cancel();
+                scheduledTask.cancel(false);
                 super.logout();
             }
         };
@@ -340,8 +325,8 @@ public class RepositoryImpl implements J
 
     //------------------------------------------------------------< private >---
 
-    private static ListeningScheduledExecutorService createListeningScheduledExecutorService() {
-        return MoreExecutors.listeningDecorator(new ScheduledThreadPoolExecutor(1) {
+    private static ScheduledExecutorService createListeningScheduledExecutorService() {
+        return 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.
 
@@ -370,7 +355,7 @@ public class RepositoryImpl implements J
                 purge();
                 return super.scheduleWithFixedDelay(command, initialDelay, delay, unit);
             }
-        });
+        };
     }
 
     private static Long getRefreshInterval(Credentials credentials) {
@@ -462,19 +447,31 @@ public class RepositoryImpl implements J
         }
     }
 
-    private static class RegistrationCallable implements Callable<Registration> {
+    static class RegistrationTask implements Runnable {
         private final SessionStats sessionStats;
         private final Whiteboard whiteboard;
+        private boolean cancelled;
+        private Registration completed;
 
-        public RegistrationCallable(SessionStats sessionStats, Whiteboard whiteboard) {
+        public RegistrationTask(SessionStats sessionStats, Whiteboard whiteboard) {
             this.sessionStats = sessionStats;
             this.whiteboard = whiteboard;
         }
 
         @Override
-        public Registration call() throws Exception {
-            return WhiteboardUtils.registerMBean(whiteboard, SessionMBean.class,
-                    sessionStats, SessionMBean.TYPE, sessionStats.toString());
+        public synchronized void run() {
+            if (!cancelled) {
+                completed = registerMBean(whiteboard, SessionMBean.class, sessionStats,
+                        SessionMBean.TYPE, sessionStats.toString());
+            }
+        }
+        
+        public synchronized void cancel() {
+            cancelled = true;
+            if (completed != null) {
+                completed.unregister();
+                completed = null;
+            }
         }
     }
 }