Author: fhanik
Date: Wed Apr 25 09:16:37 2007
New Revision: 532400

URL: http://svn.apache.org/viewvc?view=rev&rev=532400
Log:
Fix error handling when a single failure occurs

Modified:
    tomcat/tc6.0.x/trunk/java/org/apache/catalina/tribes/ChannelException.java
    
tomcat/tc6.0.x/trunk/java/org/apache/catalina/tribes/transport/nio/ParallelNioSender.java

Modified: 
tomcat/tc6.0.x/trunk/java/org/apache/catalina/tribes/ChannelException.java
URL: 
http://svn.apache.org/viewvc/tomcat/tc6.0.x/trunk/java/org/apache/catalina/tribes/ChannelException.java?view=diff&rev=532400&r1=532399&r2=532400
==============================================================================
--- tomcat/tc6.0.x/trunk/java/org/apache/catalina/tribes/ChannelException.java 
(original)
+++ tomcat/tc6.0.x/trunk/java/org/apache/catalina/tribes/ChannelException.java 
Wed Apr 25 09:16:37 2007
@@ -31,6 +31,10 @@
  */
 
 public class ChannelException extends Exception {
+    /**
+     * Empty list to avoid reinstatiating lists
+     */
+    protected static final FaultyMember[] EMPTY_LIST = new FaultyMember[0];
     /*
      * Holds a list of faulty members
      */
@@ -96,27 +100,30 @@
      * @param mbr Member
      * @param x Exception
      */
-    public void addFaultyMember(Member mbr, Exception x ) {
-        addFaultyMember(new FaultyMember(mbr,x));
+    public boolean addFaultyMember(Member mbr, Exception x ) {
+        return addFaultyMember(new FaultyMember(mbr,x));
     }
     
     /**
      * Adds a list of faulty members
      * @param mbrs FaultyMember[]
      */
-    public void addFaultyMember(FaultyMember[] mbrs) {
+    public int addFaultyMember(FaultyMember[] mbrs) {
+        int result = 0;
         for (int i=0; mbrs!=null && i<mbrs.length; i++ ) {
-            addFaultyMember(mbrs[i]);
+            if ( addFaultyMember(mbrs[i]) ) result++;
         }
+        return result;
     }
 
     /**
      * Adds a faulty member
      * @param mbr FaultyMember
      */
-    public void addFaultyMember(FaultyMember mbr) {
+    public boolean addFaultyMember(FaultyMember mbr) {
         if ( this.faultyMembers==null ) this.faultyMembers = new ArrayList();
-        faultyMembers.add(mbr);
+        if ( !faultyMembers.contains(mbr) ) return faultyMembers.add(mbr);
+        else return false;
     }
     
     /**
@@ -124,7 +131,7 @@
      * @return FaultyMember[]
      */
     public FaultyMember[] getFaultyMembers() {
-        if ( this.faultyMembers==null ) return new FaultyMember[0];
+        if ( this.faultyMembers==null ) return EMPTY_LIST;
         return (FaultyMember[])faultyMembers.toArray(new 
FaultyMember[faultyMembers.size()]);
     }
     
@@ -156,6 +163,15 @@
         
         public String toString() {
             return "FaultyMember:"+member.toString();
+        }
+        
+        public int hashCode() {
+            return (member!=null)?member.hashCode():0;
+        }
+        
+        public boolean equals(Object o) {
+            if (member==null || (!(o instanceof FaultyMember)) || 
(((FaultyMember)o).member==null)) return false;
+            return member.equals(((FaultyMember)o).member);
         }
     }
 

Modified: 
tomcat/tc6.0.x/trunk/java/org/apache/catalina/tribes/transport/nio/ParallelNioSender.java
URL: 
http://svn.apache.org/viewvc/tomcat/tc6.0.x/trunk/java/org/apache/catalina/tribes/transport/nio/ParallelNioSender.java?view=diff&rev=532400&r1=532399&r2=532400
==============================================================================
--- 
tomcat/tc6.0.x/trunk/java/org/apache/catalina/tribes/transport/nio/ParallelNioSender.java
 (original)
+++ 
tomcat/tc6.0.x/trunk/java/org/apache/catalina/tribes/transport/nio/ParallelNioSender.java
 Wed Apr 25 09:16:37 2007
@@ -77,12 +77,15 @@
                 try {
                     remaining -= doLoop(selectTimeout, 
getMaxRetryAttempts(),waitForAck,msg);
                 } catch (Exception x ) {
+                    int faulty = (cx == null)?0:cx.getFaultyMembers().length;
                     if ( cx == null ) {
                         if ( x instanceof ChannelException ) cx = 
(ChannelException)x;
                         else cx = new ChannelException("Parallel NIO send 
failed.", x);
                     } else {
                         if (x instanceof ChannelException) cx.addFaultyMember( 
( (ChannelException) x).getFaultyMembers());
                     }
+                    //count down the remaining on an error
+                    if (faulty<cx.getFaultyMembers().length) remaining -= 
(cx.getFaultyMembers().length-faulty);
                 }
                 //bail out if all remaining senders are failing
                 if ( cx != null && cx.getFaultyMembers().length == remaining ) 
throw cx;
@@ -90,10 +93,14 @@
             }
             if ( remaining > 0 ) {
                 //timeout has occured
-                cx = new ChannelException("Operation has timed 
out("+getTimeout()+" ms.).");
+                ChannelException cxtimeout = new ChannelException("Operation 
has timed out("+getTimeout()+" ms.).");
+                if ( cx==null ) cx = new ChannelException("Operation has timed 
out("+getTimeout()+" ms.).");
                 for (int i=0; i<senders.length; i++ ) {
-                    if (!senders[i].isComplete() ) 
cx.addFaultyMember(senders[i].getDestination(),null);
+                    if (!senders[i].isComplete() ) 
cx.addFaultyMember(senders[i].getDestination(),cxtimeout);
                 }
+                throw cx;
+            } else if ( cx != null ) {
+                //there was an error
                 throw cx;
             }
         } catch (Exception x ) {



---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to