Author: dblevins
Date: Fri Jun  4 23:08:37 2010
New Revision: 951612

URL: http://svn.apache.org/viewvc?rev=951612&view=rev
Log:
svn merge -r 951610:951611 
https://svn.apache.org/repos/asf/openejb/trunk/openejb3

http://svn.apache.org/viewvc?rev=951611&view=rev
------------------------------------------------------------------------
r951611 | dblevins | 2010-06-04 16:07:20 -0700 (Fri, 04 Jun 2010) | 3 lines

OPENEJB-1292: Client Failover on connection pool timeout
OPENEJB-1293: Conditional Client Failover based on container or bean thrown 
Exception types

------------------------------------------------------------------------

Added:
    
openejb/branches/openejb-3.1.x/server/openejb-client/src/main/java/org/apache/openejb/client/RetryException.java
      - copied unchanged from r951611, 
openejb/trunk/openejb3/server/openejb-client/src/main/java/org/apache/openejb/client/RetryException.java
    
openejb/branches/openejb-3.1.x/server/openejb-ejbd/src/test/java/org/apache/openejb/server/ejbd/FullPoolFailoverTest.java
      - copied unchanged from r951611, 
openejb/trunk/openejb3/server/openejb-ejbd/src/test/java/org/apache/openejb/server/ejbd/FullPoolFailoverTest.java
Modified:
    openejb/branches/openejb-3.1.x/   (props changed)
    
openejb/branches/openejb-3.1.x/container/openejb-core/src/main/java/org/apache/openejb/util/CountingLatch.java
    
openejb/branches/openejb-3.1.x/container/openejb-core/src/test/java/org/apache/openejb/config/BusinessInterfacesTest.java
   (props changed)
    
openejb/branches/openejb-3.1.x/examples/alternate-descriptors/src/main/resources/META-INF/test.ejb-jar.xml
   (props changed)
    
openejb/branches/openejb-3.1.x/server/openejb-client/src/main/java/org/apache/openejb/client/Client.java
    
openejb/branches/openejb-3.1.x/server/openejb-client/src/main/java/org/apache/openejb/client/ConnectionPoolTimeoutException.java
    
openejb/branches/openejb-3.1.x/server/openejb-client/src/main/java/org/apache/openejb/client/SocketConnectionFactory.java
    
openejb/branches/openejb-3.1.x/server/openejb-ejbd/src/main/java/org/apache/openejb/server/ejbd/KeepAliveServer.java

Propchange: openejb/branches/openejb-3.1.x/
------------------------------------------------------------------------------
--- svn:mergeinfo (original)
+++ svn:mergeinfo Fri Jun  4 23:08:37 2010
@@ -1,2 +1,2 @@
 /openejb/branches/openejb-3.1.1:779593
-/openejb/trunk/openejb3:943472,943862,943965,944757,945989,946399,946485,946489,946705,946792,946814,946861,946863-946864,947010,947017,947042,948022,948241,948243,948548,949014,949233,950391,950801
+/openejb/trunk/openejb3:943472,943862,943965,944757,945989,946399,946485,946489,946705,946792,946814,946861,946863-946864,947010,947017,947042,948022,948241,948243,948548,949014,949233,950391,950801,951611

Modified: 
openejb/branches/openejb-3.1.x/container/openejb-core/src/main/java/org/apache/openejb/util/CountingLatch.java
URL: 
http://svn.apache.org/viewvc/openejb/branches/openejb-3.1.x/container/openejb-core/src/main/java/org/apache/openejb/util/CountingLatch.java?rev=951612&r1=951611&r2=951612&view=diff
==============================================================================
--- 
openejb/branches/openejb-3.1.x/container/openejb-core/src/main/java/org/apache/openejb/util/CountingLatch.java
 (original)
+++ 
openejb/branches/openejb-3.1.x/container/openejb-core/src/main/java/org/apache/openejb/util/CountingLatch.java
 Fri Jun  4 23:08:37 2010
@@ -16,11 +16,7 @@
  */
 package org.apache.openejb.util;
 
-import java.util.concurrent.locks.Lock;
-import java.util.concurrent.locks.ReentrantLock;
-import java.util.concurrent.locks.Condition;
 import java.util.concurrent.locks.AbstractQueuedSynchronizer;
-import java.util.concurrent.atomic.AtomicInteger;
 import java.util.concurrent.TimeUnit;
 
 /**
@@ -30,8 +26,12 @@ public class CountingLatch {
 
      private final Sync sync;
 
-     public CountingLatch() {
-         this.sync = new Sync();
+    public CountingLatch() {
+        this(0);
+    }
+
+    public CountingLatch(int count) {
+         this.sync = new Sync(count);
      }
 
     public void await() throws InterruptedException {
@@ -55,8 +55,8 @@ public class CountingLatch {
      }
 
      private static final class Sync extends AbstractQueuedSynchronizer {
-         private Sync() {
-             setState(0);
+         private Sync(int count) {
+             setState(count);
          }
 
          public boolean tryReleaseShared(int releases) {

Propchange: 
openejb/branches/openejb-3.1.x/container/openejb-core/src/test/java/org/apache/openejb/config/BusinessInterfacesTest.java
------------------------------------------------------------------------------
--- svn:mergeinfo (original)
+++ svn:mergeinfo Fri Jun  4 23:08:37 2010
@@ -1,2 +1,2 @@
 
/openejb/branches/openejb-3.1.1/container/openejb-core/src/test/java/org/apache/openejb/config/UberInterfaceTest.java:779593
-/openejb/trunk/openejb3/container/openejb-core/src/test/java/org/apache/openejb/config/BusinessInterfacesTest.java:943472,943862,943965,944757,945989,946399,946485,946489,946705,946792,946814,946861,946863-946864,947010,947017,947042,948022,948241,948243,948548,949014,949233,950391,950801
+/openejb/trunk/openejb3/container/openejb-core/src/test/java/org/apache/openejb/config/BusinessInterfacesTest.java:943472,943862,943965,944757,945989,946399,946485,946489,946705,946792,946814,946861,946863-946864,947010,947017,947042,948022,948241,948243,948548,949014,949233,950391,950801,951611

Propchange: 
openejb/branches/openejb-3.1.x/examples/alternate-descriptors/src/main/resources/META-INF/test.ejb-jar.xml
------------------------------------------------------------------------------
--- svn:mergeinfo (original)
+++ svn:mergeinfo Fri Jun  4 23:08:37 2010
@@ -1,2 +1,2 @@
 
/openejb/branches/openejb-3.1.1/examples/alternate-descriptors/src/main/resources/META-INF/ejb-jar.xml:779593
-/openejb/trunk/openejb3/examples/alternate-descriptors/src/main/resources/META-INF/test.ejb-jar.xml:943472,943862,943965,944757,945989,946399,946485,946489,946705,946792,946814,946861,946863-946864,947010,947017,947042,948022,948241,948243,948548,949014,949233,950391,950801
+/openejb/trunk/openejb3/examples/alternate-descriptors/src/main/resources/META-INF/test.ejb-jar.xml:943472,943862,943965,944757,945989,946399,946485,946489,946705,946792,946814,946861,946863-946864,947010,947017,947042,948022,948241,948243,948548,949014,949233,950391,950801,951611

Modified: 
openejb/branches/openejb-3.1.x/server/openejb-client/src/main/java/org/apache/openejb/client/Client.java
URL: 
http://svn.apache.org/viewvc/openejb/branches/openejb-3.1.x/server/openejb-client/src/main/java/org/apache/openejb/client/Client.java?rev=951612&r1=951611&r2=951612&view=diff
==============================================================================
--- 
openejb/branches/openejb-3.1.x/server/openejb-client/src/main/java/org/apache/openejb/client/Client.java
 (original)
+++ 
openejb/branches/openejb-3.1.x/server/openejb-client/src/main/java/org/apache/openejb/client/Client.java
 Fri Jun  4 23:08:37 2010
@@ -18,6 +18,7 @@ package org.apache.openejb.client;
 
 import static org.apache.openejb.client.Exceptions.newIOException;
 
+import javax.ejb.ConcurrentAccessTimeoutException;
 import java.io.EOFException;
 import java.io.IOException;
 import java.io.InputStream;
@@ -29,7 +30,9 @@ import java.rmi.RemoteException;
 import java.util.Map;
 import java.util.Set;
 import java.util.HashSet;
+import java.util.List;
 import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.CopyOnWriteArrayList;
 import java.util.logging.Level;
 import java.util.logging.Logger;
 import java.net.URI;
@@ -41,14 +44,23 @@ public class Client {
 
     private static final ProtocolMetaData PROTOCOL_VERSION = new 
ProtocolMetaData("3.1");
 
+    private List<Class<? extends Throwable>> retryConditions = new 
CopyOnWriteArrayList();
     private static Client client = new Client();
     private boolean retry = false;
 
     public Client() {
-        String retryValue = System.getProperty("openejb.client.requestretry", 
retry + "");
+        String retryValue = System.getProperty("openejb.client.requestretry", 
getRetry() + "");
         retry = new Boolean(retryValue);
     }
 
+    public static boolean addRetryCondition(Class<? extends Throwable> 
throwable) {
+        return client.retryConditions.add(throwable);
+    }
+
+    public static boolean removeRetryCondition(Class<? extends Throwable> 
throwable) {
+        return client.retryConditions.remove(throwable);
+    }
+
     // This lame hook point if only of testing
     public static void setClient(Client client) {
         Client.client = client;
@@ -249,18 +261,32 @@ public class Client {
                 throw new RemoteException("Error reading response from server 
(" + protocolMetaData.getSpec() + ") : " + e.getMessage(), e);
             }
 
+            if (retryConditions.size() > 0) {
+                if (res instanceof EJBResponse) {
+                    EJBResponse ejbResponse = (EJBResponse) res;
+                    if (ejbResponse.getResult() instanceof ThrowableArtifact) {
+                        ThrowableArtifact artifact = (ThrowableArtifact) 
ejbResponse.getResult();
+                        if 
(retryConditions.contains(artifact.getThrowable().getClass())) {
+                            throw new RetryException(res);
+                        }
+                    }
+                }
+            }
         } catch (RemoteException e) {
             throw e;
         } catch (IOException e){
             Set<URI> failed = getFailed();
             failed.add(conn.getURI());
             conn.discard();
-            if (retry){
+            if (e instanceof RetryException || getRetry()){
                 try {
                     processRequest(req, res, server);
                 } catch (RemoteFailoverException re) {
                     throw re;
                 } catch (RemoteException re) {
+                    if (e instanceof RetryException) {
+                        return ((RetryException) e).getResponse();
+                    }
                     throw new RemoteFailoverException("Cannot complete 
request.  Retry attempted on " + failed.size() + " servers", e);
                 }
             }
@@ -304,4 +330,7 @@ public class Client {
         return cluster;
     }
 
+    private boolean getRetry() {
+        return retry = new 
Boolean(System.getProperty("openejb.client.requestretry", retry + ""));
+    }
 }

Modified: 
openejb/branches/openejb-3.1.x/server/openejb-client/src/main/java/org/apache/openejb/client/ConnectionPoolTimeoutException.java
URL: 
http://svn.apache.org/viewvc/openejb/branches/openejb-3.1.x/server/openejb-client/src/main/java/org/apache/openejb/client/ConnectionPoolTimeoutException.java?rev=951612&r1=951611&r2=951612&view=diff
==============================================================================
--- 
openejb/branches/openejb-3.1.x/server/openejb-client/src/main/java/org/apache/openejb/client/ConnectionPoolTimeoutException.java
 (original)
+++ 
openejb/branches/openejb-3.1.x/server/openejb-client/src/main/java/org/apache/openejb/client/ConnectionPoolTimeoutException.java
 Fri Jun  4 23:08:37 2010
@@ -16,12 +16,12 @@
  */
 package org.apache.openejb.client;
 
-import javax.ejb.ConcurrentAccessException;
+import java.io.IOException;
 
 /**
  * @version $Rev$ $Date$
  */
-public class ConnectionPoolTimeoutException extends ConcurrentAccessException {
+public class ConnectionPoolTimeoutException extends IOException {
     public ConnectionPoolTimeoutException() {
     }
 

Modified: 
openejb/branches/openejb-3.1.x/server/openejb-client/src/main/java/org/apache/openejb/client/SocketConnectionFactory.java
URL: 
http://svn.apache.org/viewvc/openejb/branches/openejb-3.1.x/server/openejb-client/src/main/java/org/apache/openejb/client/SocketConnectionFactory.java?rev=951612&r1=951611&r2=951612&view=diff
==============================================================================
--- 
openejb/branches/openejb-3.1.x/server/openejb-client/src/main/java/org/apache/openejb/client/SocketConnectionFactory.java
 (original)
+++ 
openejb/branches/openejb-3.1.x/server/openejb-client/src/main/java/org/apache/openejb/client/SocketConnectionFactory.java
 Fri Jun  4 23:08:37 2010
@@ -139,7 +139,7 @@ public class SocketConnectionFactory imp
     private Pool getPool(URI uri) {
         Pool pool = connections.get(uri);
         if (pool == null) {
-            pool = new Pool(getSize(), getTimeout());
+            pool = new Pool(uri, getSize(), getTimeout());
             connections.put(uri, pool);
         }
         return pool;
@@ -287,14 +287,16 @@ public class SocketConnectionFactory imp
         }
     }
 
-    public static class Pool {
+    private static class Pool {
         private final Semaphore semaphore;
         private final Stack<SocketConnection> pool;
         private final long timeout;
         private final TimeUnit timeUnit;
         private final int size;
+        private final URI uri;
 
-        public Pool(int size, long timeout) {
+        private Pool(URI uri, int size, long timeout) {
+            this.uri = uri;
             this.size = size;
             this.semaphore = new Semaphore(size);
             this.pool = new Stack<SocketConnection>();
@@ -307,7 +309,7 @@ public class SocketConnectionFactory imp
             }
         }
 
-        public SocketConnection get() {
+        public SocketConnection get() throws IOException{
             try {
                 if (semaphore.tryAcquire(timeout, timeUnit)) {
                     return pool.pop();
@@ -323,5 +325,14 @@ public class SocketConnectionFactory imp
             pool.push(connection);
             semaphore.release();
         }
+
+        @Override
+        public String toString() {
+            return "Pool{" +
+                    "size=" + size +
+                    ", available=" + semaphore.availablePermits() +
+                    ", uri=" + uri +
+                    '}';
+        }
     }
 }

Modified: 
openejb/branches/openejb-3.1.x/server/openejb-ejbd/src/main/java/org/apache/openejb/server/ejbd/KeepAliveServer.java
URL: 
http://svn.apache.org/viewvc/openejb/branches/openejb-3.1.x/server/openejb-ejbd/src/main/java/org/apache/openejb/server/ejbd/KeepAliveServer.java?rev=951612&r1=951611&r2=951612&view=diff
==============================================================================
--- 
openejb/branches/openejb-3.1.x/server/openejb-ejbd/src/main/java/org/apache/openejb/server/ejbd/KeepAliveServer.java
 (original)
+++ 
openejb/branches/openejb-3.1.x/server/openejb-ejbd/src/main/java/org/apache/openejb/server/ejbd/KeepAliveServer.java
 Fri Jun  4 23:08:37 2010
@@ -132,7 +132,7 @@ public class KeepAliveServer implements 
                         session.usage.unlock();
                     }
                 } else {
-                    logger.info("Allowing graceful shutdown of " + 
session.socket.getInetAddress());
+                    logger.debug("Allowing graceful shutdown of " + 
session.socket.getInetAddress());
                 }
             }
         }


Reply via email to