[jboss-cvs] JBossAS SVN: r112506 - in projects/jboss-jca/branches/Branch_1_0/core/src/main/java/org/jboss/jca/core/connectionmanager/pool: idle and 2 other directories.

jboss-cvs-commits at lists.jboss.org jboss-cvs-commits at lists.jboss.org
Tue Dec 6 11:36:29 EST 2011


Author: jesper.pedersen
Date: 2011-12-06 11:36:29 -0500 (Tue, 06 Dec 2011)
New Revision: 112506

Added:
   projects/jboss-jca/branches/Branch_1_0/core/src/main/java/org/jboss/jca/core/connectionmanager/pool/validator/SecurityActions.java
Modified:
   projects/jboss-jca/branches/Branch_1_0/core/src/main/java/org/jboss/jca/core/connectionmanager/pool/AbstractPool.java
   projects/jboss-jca/branches/Branch_1_0/core/src/main/java/org/jboss/jca/core/connectionmanager/pool/idle/IdleRemover.java
   projects/jboss-jca/branches/Branch_1_0/core/src/main/java/org/jboss/jca/core/connectionmanager/pool/idle/SecurityActions.java
   projects/jboss-jca/branches/Branch_1_0/core/src/main/java/org/jboss/jca/core/connectionmanager/pool/mcp/ArrayBlockingQueueManagedConnectionPool.java
   projects/jboss-jca/branches/Branch_1_0/core/src/main/java/org/jboss/jca/core/connectionmanager/pool/mcp/SemaphoreArrayListManagedConnectionPool.java
   projects/jboss-jca/branches/Branch_1_0/core/src/main/java/org/jboss/jca/core/connectionmanager/pool/validator/ConnectionValidator.java
Log:
[JBJCA-712] Incorrect shutdown order

Modified: projects/jboss-jca/branches/Branch_1_0/core/src/main/java/org/jboss/jca/core/connectionmanager/pool/AbstractPool.java
===================================================================
--- projects/jboss-jca/branches/Branch_1_0/core/src/main/java/org/jboss/jca/core/connectionmanager/pool/AbstractPool.java	2011-12-06 16:34:43 UTC (rev 112505)
+++ projects/jboss-jca/branches/Branch_1_0/core/src/main/java/org/jboss/jca/core/connectionmanager/pool/AbstractPool.java	2011-12-06 16:36:29 UTC (rev 112506)
@@ -583,7 +583,14 @@
    {
       log.debug(poolName + ": shutdown");
 
-      flush(true);
+      Iterator<ManagedConnectionPool> it = mcpPools.values().iterator();
+      while (it.hasNext())
+      {
+         ManagedConnectionPool mcp = it.next();
+         mcp.shutdown();
+      }
+
+      mcpPools.clear();
    }
 
    /**

Modified: projects/jboss-jca/branches/Branch_1_0/core/src/main/java/org/jboss/jca/core/connectionmanager/pool/idle/IdleRemover.java
===================================================================
--- projects/jboss-jca/branches/Branch_1_0/core/src/main/java/org/jboss/jca/core/connectionmanager/pool/idle/IdleRemover.java	2011-12-06 16:34:43 UTC (rev 112505)
+++ projects/jboss-jca/branches/Branch_1_0/core/src/main/java/org/jboss/jca/core/connectionmanager/pool/idle/IdleRemover.java	2011-12-06 16:36:29 UTC (rev 112506)
@@ -29,6 +29,7 @@
 import java.util.concurrent.Executors;
 import java.util.concurrent.ThreadFactory;
 import java.util.concurrent.TimeUnit;
+import java.util.concurrent.atomic.AtomicBoolean;
 import java.util.concurrent.locks.Condition;
 import java.util.concurrent.locks.Lock;
 import java.util.concurrent.locks.ReentrantLock;
@@ -47,7 +48,7 @@
    private static CoreLogger logger = Logger.getMessageLogger(CoreLogger.class, IdleRemover.class.getName());
    
    /**Validator thread name*/
-   private static final String VALIDATOR_THREAD_NAME = "JBossConnectionValidator";
+   private static final String THREAD_NAME = "IdleRemover";
    
    /**Singleton instance*/
    private static final IdleRemover INSTANCE = new IdleRemover();
@@ -65,6 +66,9 @@
    /** The next - important initialization! */
    private long next = Long.MAX_VALUE;
    
+   /** Shutdown */
+   private AtomicBoolean shutdown = new AtomicBoolean(false);
+
    /**Lock for condition*/
    private Lock lock = new ReentrantLock(true);
    
@@ -76,8 +80,8 @@
     */
    private IdleRemover()
    {
-      this.executorService = Executors.newSingleThreadExecutor(new ValidatorThreadFactory());
-      this.executorService.execute(new JBossConnectionValidator());
+      this.executorService = Executors.newSingleThreadExecutor(new IdleRemoverThreadFactory());
+      this.executorService.execute(new IdleConnectionsRemover());
    }
    
    /**
@@ -87,6 +91,8 @@
     */
    public static void registerPool(IdleConnectionRemovalSupport mcp, long interval)
    {
+      logger.debugf("Register pool: %s (interval=%s)", mcp, interval);
+
       INSTANCE.internalRegisterPool(mcp, interval);
    }
    
@@ -96,8 +102,23 @@
     */
    public static void unregisterPool(IdleConnectionRemovalSupport mcp)
    {
+      logger.debugf("Unregister pool: %s", mcp);
+
       INSTANCE.internalUnregisterPool(mcp);
    }
+
+   /**
+    * Shutdown
+    */
+   public static void shutdown()
+   {
+      INSTANCE.shutdown.set(true);
+
+      INSTANCE.executorService.shutdownNow();
+      INSTANCE.executorService = null;
+
+      INSTANCE.registeredPools.clear();
+   }
    
    private void internalRegisterPool(IdleConnectionRemovalSupport mcp, long interval)
    {
@@ -121,7 +142,6 @@
                }               
                
                this.condition.signal();
-               
             }
          }         
       } 
@@ -147,32 +167,16 @@
    }
          
    /**
-    * Wait for background thread.
-    */
-   public static void waitForBackgroundThread()
-   {
-      try
-      {
-         INSTANCE.lock.lock();
-         
-      }
-      finally
-      {
-         INSTANCE.lock.unlock();  
-      }
-   }
-   
-   /**
     * Thread factory.
     */
-   private static class ValidatorThreadFactory implements ThreadFactory
+   private static class IdleRemoverThreadFactory implements ThreadFactory
    {
       /**
        * {@inheritDoc}
        */
       public Thread newThread(Runnable r)
       {
-         Thread thread = new Thread(r, IdleRemover.VALIDATOR_THREAD_NAME);
+         Thread thread = new Thread(r, IdleRemover.THREAD_NAME);
          thread.setDaemon(true);
          
          return thread;
@@ -180,15 +184,14 @@
    }
    
    /**
-    * JBossConnectionValidator.
-    *
+    * IdleConnectionsRemover
     */
-   private class JBossConnectionValidator implements Runnable
+   private class IdleConnectionsRemover implements Runnable
    {
       /**
        * Constructor
        */
-      public JBossConnectionValidator()
+      public IdleConnectionsRemover()
       {
       }
 
@@ -197,13 +200,14 @@
        */
       public void run()
       {
+         final ClassLoader oldTccl = SecurityActions.getThreadContextClassLoader();
          SecurityActions.setThreadContextClassLoader(IdleRemover.class.getClassLoader());
          
          try
          {
             lock.lock();
             
-            while (true)
+            while (!shutdown.get())
             {
                boolean result = INSTANCE.condition.await(INSTANCE.interval, TimeUnit.MILLISECONDS);
 
@@ -227,14 +231,12 @@
                if (next < 0)
                {
                   next = Long.MAX_VALUE;  
-               }              
+               }
             }            
          }
          catch (InterruptedException e)
          {
             logger.returningConnectionValidatorInterrupted();
-            
-            return;  
          }
          catch (RuntimeException e)
          {
@@ -247,7 +249,8 @@
          finally
          {
             lock.unlock();  
-         }         
-      }      
+            SecurityActions.setThreadContextClassLoader(oldTccl);
+         }
+      }
    }
 }

Modified: projects/jboss-jca/branches/Branch_1_0/core/src/main/java/org/jboss/jca/core/connectionmanager/pool/idle/SecurityActions.java
===================================================================
--- projects/jboss-jca/branches/Branch_1_0/core/src/main/java/org/jboss/jca/core/connectionmanager/pool/idle/SecurityActions.java	2011-12-06 16:34:43 UTC (rev 112505)
+++ projects/jboss-jca/branches/Branch_1_0/core/src/main/java/org/jboss/jca/core/connectionmanager/pool/idle/SecurityActions.java	2011-12-06 16:36:29 UTC (rev 112506)
@@ -33,6 +33,28 @@
 class SecurityActions
 {
    /**
+    * Get the context classloader.
+    * @return The classloader
+    */
+   public static ClassLoader getThreadContextClassLoader()
+   {
+      if (System.getSecurityManager() == null)
+      {
+         return Thread.currentThread().getContextClassLoader();
+      }
+      else
+      {
+         return AccessController.doPrivileged(new PrivilegedAction<ClassLoader>()
+         {
+            public ClassLoader run()
+            {
+               return Thread.currentThread().getContextClassLoader();
+            }
+         });
+      }
+   }
+
+   /**
     * Set the context classloader.
     * @param cl classloader
     */

Modified: projects/jboss-jca/branches/Branch_1_0/core/src/main/java/org/jboss/jca/core/connectionmanager/pool/mcp/ArrayBlockingQueueManagedConnectionPool.java
===================================================================
--- projects/jboss-jca/branches/Branch_1_0/core/src/main/java/org/jboss/jca/core/connectionmanager/pool/mcp/ArrayBlockingQueueManagedConnectionPool.java	2011-12-06 16:34:43 UTC (rev 112505)
+++ projects/jboss-jca/branches/Branch_1_0/core/src/main/java/org/jboss/jca/core/connectionmanager/pool/mcp/ArrayBlockingQueueManagedConnectionPool.java	2011-12-06 16:36:29 UTC (rev 112506)
@@ -601,7 +601,7 @@
       shutdown.set(true);
       IdleRemover.unregisterPool(this);
       ConnectionValidator.unregisterPool(this);
-      flush();
+      flush(true);
    }
 
    /**

Modified: projects/jboss-jca/branches/Branch_1_0/core/src/main/java/org/jboss/jca/core/connectionmanager/pool/mcp/SemaphoreArrayListManagedConnectionPool.java
===================================================================
--- projects/jboss-jca/branches/Branch_1_0/core/src/main/java/org/jboss/jca/core/connectionmanager/pool/mcp/SemaphoreArrayListManagedConnectionPool.java	2011-12-06 16:34:43 UTC (rev 112505)
+++ projects/jboss-jca/branches/Branch_1_0/core/src/main/java/org/jboss/jca/core/connectionmanager/pool/mcp/SemaphoreArrayListManagedConnectionPool.java	2011-12-06 16:36:29 UTC (rev 112506)
@@ -641,7 +641,7 @@
       shutdown.set(true);
       IdleRemover.unregisterPool(this);
       ConnectionValidator.unregisterPool(this);
-      flush();
+      flush(true);
    }
 
    /**

Modified: projects/jboss-jca/branches/Branch_1_0/core/src/main/java/org/jboss/jca/core/connectionmanager/pool/validator/ConnectionValidator.java
===================================================================
--- projects/jboss-jca/branches/Branch_1_0/core/src/main/java/org/jboss/jca/core/connectionmanager/pool/validator/ConnectionValidator.java	2011-12-06 16:34:43 UTC (rev 112505)
+++ projects/jboss-jca/branches/Branch_1_0/core/src/main/java/org/jboss/jca/core/connectionmanager/pool/validator/ConnectionValidator.java	2011-12-06 16:36:29 UTC (rev 112506)
@@ -25,13 +25,12 @@
 import org.jboss.jca.core.CoreLogger;
 import org.jboss.jca.core.connectionmanager.pool.mcp.ManagedConnectionPool;
 
-import java.security.AccessController;
-import java.security.PrivilegedAction;
 import java.util.concurrent.CopyOnWriteArrayList;
 import java.util.concurrent.ExecutorService;
 import java.util.concurrent.Executors;
 import java.util.concurrent.ThreadFactory;
 import java.util.concurrent.TimeUnit;
+import java.util.concurrent.atomic.AtomicBoolean;
 import java.util.concurrent.locks.Condition;
 import java.util.concurrent.locks.Lock;
 import java.util.concurrent.locks.ReentrantLock;
@@ -50,7 +49,7 @@
    private static CoreLogger logger = Logger.getMessageLogger(CoreLogger.class, ConnectionValidator.class.getName());
    
    /**Validator thread name*/
-   private static final String VALIDATOR_THREAD_NAME = "JBossConnectionValidator";
+   private static final String THREAD_NAME = "ConnectionValidator";
    
    /**Registered internal pool instances*/
    private CopyOnWriteArrayList<ManagedConnectionPool> registeredPools = 
@@ -65,17 +64,18 @@
    /** The interval */
    private long interval = Long.MAX_VALUE;
 
-   /** The next */
- //important initialization!
+   /** The next - important initialization */
    private long next = Long.MAX_VALUE;
    
+   /** Shutdown */
+   private AtomicBoolean shutdown = new AtomicBoolean(false);
+
    /**Lock for condition*/
    private Lock lock = new ReentrantLock(true);
    
    /**Condition*/
    private Condition condition = lock.newCondition();
    
-   
    /**
     * Private constructor.
     */
@@ -92,6 +92,8 @@
     */
    public static void registerPool(ManagedConnectionPool mcp, long interval)
    {
+      logger.debugf("Register pool: %s (interval=%s)", mcp, interval);
+
       instance.internalRegisterPool(mcp, interval);
    }
    
@@ -101,9 +103,24 @@
     */
    public static void unregisterPool(ManagedConnectionPool mcp)
    {
+      logger.debugf("Unregister pool: %s", mcp);
+
       instance.internalUnregisterPool(mcp);
    }
    
+   /**
+    * Shutdown
+    */
+   public static void shutdown()
+   {
+      instance.shutdown.set(true);
+
+      instance.executorService.shutdownNow();
+      instance.executorService = null;
+
+      instance.registeredPools.clear();
+   }
+   
    private void internalRegisterPool(ManagedConnectionPool mcp, long interval)
    {
       try
@@ -151,71 +168,8 @@
          interval = Long.MAX_VALUE;
       }
    }
-   
+
    /**
-    * Setup context class loader.
-    */
-   private void setupContextClassLoader()
-   {
-      // Could be null if loaded from system classloader
-      final ClassLoader cl = ConnectionValidator.class.getClassLoader();
-      if (cl == null)
-      {
-         return;  
-      }
-      
-      SecurityManager sm = System.getSecurityManager();
-      
-      if (sm == null)
-      {
-         Thread.currentThread().setContextClassLoader(cl);
-         
-         return;
-      }
-      
-      AccessController.doPrivileged(new ClassLoaderAction(cl));
- 
-   }
-   
-   /**
-    * Priviledge action. 
-    */
-   private static class ClassLoaderAction implements PrivilegedAction<Object>
-   {
-      private ClassLoader classLoader;
-      
-      public ClassLoaderAction(ClassLoader cl)
-      {
-         this.classLoader = cl;
-      }
-      
-      public Object run()
-      {
-         Thread.currentThread().setContextClassLoader(classLoader);
-         
-         return null;
-      }
-      
-   }
-   
-   /**
-    * Wait for background thread.
-    */
-   public static void waitForBackgroundThread()
-   {
-      try
-      {
-         instance.lock.lock();
-         
-      }
-      finally
-      {
-         instance.lock.unlock();  
-      }
-   }
-   
-   
-   /**
     * Thread factory.
     */
    private static class ValidatorThreadFactory implements ThreadFactory
@@ -225,7 +179,7 @@
        */
       public Thread newThread(Runnable r)
       {
-         Thread thread = new Thread(r, ConnectionValidator.VALIDATOR_THREAD_NAME);
+         Thread thread = new Thread(r, ConnectionValidator.THREAD_NAME);
          thread.setDaemon(true);
          
          return thread;
@@ -238,19 +192,19 @@
     */
    private class JBossConnectionValidator implements Runnable
    {
-      
       /**
        * {@inheritDoc}
        */
       public void run()
       {
-         setupContextClassLoader();
+         final ClassLoader oldTccl = SecurityActions.getThreadContextClassLoader();
+         SecurityActions.setThreadContextClassLoader(ConnectionValidator.class.getClassLoader());
          
          try
          {
             lock.lock();
             
-            while (true)
+            while (!shutdown.get())
             {
                boolean result = instance.condition.await(instance.interval, TimeUnit.MILLISECONDS);
                
@@ -280,8 +234,6 @@
          catch (InterruptedException e)
          {
             logger.returningConnectionValidatorInterrupted();
-            
-            return;  
          }
          catch (RuntimeException e)
          {
@@ -294,7 +246,8 @@
          finally
          {
             lock.unlock();  
-         }         
-      }      
+            SecurityActions.setThreadContextClassLoader(oldTccl);
+         }
+      }
    }
 }

Added: projects/jboss-jca/branches/Branch_1_0/core/src/main/java/org/jboss/jca/core/connectionmanager/pool/validator/SecurityActions.java
===================================================================
--- projects/jboss-jca/branches/Branch_1_0/core/src/main/java/org/jboss/jca/core/connectionmanager/pool/validator/SecurityActions.java	                        (rev 0)
+++ projects/jboss-jca/branches/Branch_1_0/core/src/main/java/org/jboss/jca/core/connectionmanager/pool/validator/SecurityActions.java	2011-12-06 16:36:29 UTC (rev 112506)
@@ -0,0 +1,83 @@
+/*
+ * JBoss, Home of Professional Open Source.
+ * Copyright 2008, Red Hat Middleware LLC, and individual contributors
+ * as indicated by the @author tags. See the copyright.txt file in the
+ * distribution for a full listing of individual contributors. 
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+
+package org.jboss.jca.core.connectionmanager.pool.validator;
+
+import java.security.AccessController;
+import java.security.PrivilegedAction;
+
+/**
+ * Privileged Blocks
+ * 
+ * @author <a href="mailto:jesper.pedersen at jboss.org">Jesper Pedersen</a>
+ */
+class SecurityActions
+{
+   /**
+    * Get the context classloader.
+    * @return The classloader
+    */
+   public static ClassLoader getThreadContextClassLoader()
+   {
+      if (System.getSecurityManager() == null)
+      {
+         return Thread.currentThread().getContextClassLoader();
+      }
+      else
+      {
+         return AccessController.doPrivileged(new PrivilegedAction<ClassLoader>()
+         {
+            public ClassLoader run()
+            {
+               return Thread.currentThread().getContextClassLoader();
+            }
+         });
+      }
+   }
+
+   /**
+    * Set the context classloader.
+    * @param cl classloader
+    */
+   public static void setThreadContextClassLoader(final ClassLoader cl)
+   {
+      if (cl == null)
+         return;
+
+      if (System.getSecurityManager() == null)
+      {
+         Thread.currentThread().setContextClassLoader(cl);
+      }
+      else
+      {
+         AccessController.doPrivileged(new PrivilegedAction<Object>()
+         {
+            public Object run()
+            {
+               Thread.currentThread().setContextClassLoader(cl);
+
+               return null;
+            }
+         });
+      }
+   }
+}



More information about the jboss-cvs-commits mailing list