Author: kfujino
Date: Wed Jun 17 08:27:05 2015
New Revision: 1685937

URL: http://svn.apache.org/r1685937
Log:
When failed to replication, rather than all member is handled as a failed 
member, exclude the failure members from backup members.

Modified:
    
tomcat/tc8.0.x/trunk/java/org/apache/catalina/tribes/tipis/LocalStrings.properties
    
tomcat/tc8.0.x/trunk/java/org/apache/catalina/tribes/tipis/ReplicatedMap.java
    tomcat/tc8.0.x/trunk/webapps/docs/changelog.xml

Modified: 
tomcat/tc8.0.x/trunk/java/org/apache/catalina/tribes/tipis/LocalStrings.properties
URL: 
http://svn.apache.org/viewvc/tomcat/tc8.0.x/trunk/java/org/apache/catalina/tribes/tipis/LocalStrings.properties?rev=1685937&r1=1685936&r2=1685937&view=diff
==============================================================================
--- 
tomcat/tc8.0.x/trunk/java/org/apache/catalina/tribes/tipis/LocalStrings.properties
 (original)
+++ 
tomcat/tc8.0.x/trunk/java/org/apache/catalina/tribes/tipis/LocalStrings.properties
 Wed Jun 17 08:27:05 2015
@@ -40,4 +40,5 @@ lazyReplicatedMap.unableReplicate.backup
 lazyReplicatedMap.unableReplicate.proxy=Unable to replicate proxy key:{0} to 
backup:{1}. Reason:{2}
 replicatedMap.member.disappeared=Member[{0}] disappeared. Related map entries 
will be relocated to the new node.
 replicatedMap.unable.relocate=Unable to relocate[{0}] to a new backup node
-replicatedMap.relocate.complete=Relocation of map entries was complete in {0} 
ms.
\ No newline at end of file
+replicatedMap.relocate.complete=Relocation of map entries was complete in {0} 
ms.
+replicatedMap.unableReplicate.completely=Unable to replicate backup key:{0}. 
Success nodes:{1}. Failed nodes:{2}.
\ No newline at end of file

Modified: 
tomcat/tc8.0.x/trunk/java/org/apache/catalina/tribes/tipis/ReplicatedMap.java
URL: 
http://svn.apache.org/viewvc/tomcat/tc8.0.x/trunk/java/org/apache/catalina/tribes/tipis/ReplicatedMap.java?rev=1685937&r1=1685936&r2=1685937&view=diff
==============================================================================
--- 
tomcat/tc8.0.x/trunk/java/org/apache/catalina/tribes/tipis/ReplicatedMap.java 
(original)
+++ 
tomcat/tc8.0.x/trunk/java/org/apache/catalina/tribes/tipis/ReplicatedMap.java 
Wed Jun 17 08:27:05 2015
@@ -17,12 +17,16 @@
 package org.apache.catalina.tribes.tipis;
 
 import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.Iterator;
 import java.util.Map;
 
 import org.apache.catalina.tribes.Channel;
 import org.apache.catalina.tribes.ChannelException;
+import org.apache.catalina.tribes.ChannelException.FaultyMember;
 import org.apache.catalina.tribes.Member;
+import org.apache.catalina.tribes.RemoteProcessException;
 import org.apache.juli.logging.Log;
 import org.apache.juli.logging.LogFactory;
 
@@ -131,12 +135,35 @@ public class ReplicatedMap<K,V> extends
 
         if (backup == null || backup.length == 0) return null;
 
-        //publish the data out to all nodes
-        MapMessage msg = new MapMessage(getMapContextName(), 
MapMessage.MSG_COPY, false,
-                                        (Serializable) key, (Serializable) 
value, null,channel.getLocalMember(false), backup);
-
-        getChannel().send(getMapMembers(), msg, getChannelSendOptions());
-
+        try {
+            
+            //publish the data out to all nodes
+            MapMessage msg = new MapMessage(getMapContextName(), 
MapMessage.MSG_COPY, false,
+                    (Serializable) key, (Serializable) value, 
null,channel.getLocalMember(false), backup);
+
+            getChannel().send(getMapMembers(), msg, getChannelSendOptions());
+        } catch (ChannelException e) {
+            FaultyMember[] faultyMembers = e.getFaultyMembers();
+            if (faultyMembers.length == 0) throw e;
+            ArrayList<Member> faulty = new ArrayList<>();
+            for (FaultyMember faultyMember : faultyMembers) {
+                if (!(faultyMember.getCause() instanceof 
RemoteProcessException)) {
+                    faulty.add(faultyMember.getMember());
+                }
+            }
+            Member[] realFaultyMembers = faulty.toArray(new 
Member[faulty.size()]);
+            if (realFaultyMembers.length != 0) {
+                backup = excludeFromSet(realFaultyMembers, backup);
+                if (backup.length == 0) {
+                    throw e;
+                } else {
+                    if (log.isWarnEnabled()) {
+                        
log.warn(sm.getString("replicatedMap.unableReplicate.completely", key,
+                                Arrays.toString(backup), 
Arrays.toString(realFaultyMembers)), e);
+                    }
+                }
+            }
+        }
         return backup;
     }
 

Modified: tomcat/tc8.0.x/trunk/webapps/docs/changelog.xml
URL: 
http://svn.apache.org/viewvc/tomcat/tc8.0.x/trunk/webapps/docs/changelog.xml?rev=1685937&r1=1685936&r2=1685937&view=diff
==============================================================================
--- tomcat/tc8.0.x/trunk/webapps/docs/changelog.xml (original)
+++ tomcat/tc8.0.x/trunk/webapps/docs/changelog.xml Wed Jun 17 08:27:05 2015
@@ -172,6 +172,11 @@
         Ensure that the nodes that the data has been successfully replicated 
are
         set to the backup node. (kfujino)
       </fix>
+      <fix>
+        When failed to replication, rather than all member is handled as a
+        failed member, exclude the failure members from backup members.
+        (kfujino)
+      </fix>
     </changelog>
   </subsection>
   <subsection name="Other">



---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscr...@tomcat.apache.org
For additional commands, e-mail: dev-h...@tomcat.apache.org

Reply via email to