Author: markt
Date: Tue Sep 15 21:10:30 2015
New Revision: 1703290

URL: http://svn.apache.org/r1703290
Log:
Follow-up to r1703177.
Ensure that members never contains an intermediate result of the sorting 
process.

Modified:
    tomcat/trunk/java/org/apache/catalina/tribes/membership/Membership.java

Modified: 
tomcat/trunk/java/org/apache/catalina/tribes/membership/Membership.java
URL: 
http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/tribes/membership/Membership.java?rev=1703290&r1=1703289&r2=1703290&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/catalina/tribes/membership/Membership.java 
(original)
+++ tomcat/trunk/java/org/apache/catalina/tribes/membership/Membership.java Tue 
Sep 15 21:10:30 2015
@@ -66,7 +66,7 @@ public class Membership implements Clone
             final HashMap<Member, MbrEntry> tmpclone = (HashMap<Member, 
MbrEntry>) map.clone();
             clone.map = tmpclone;
             clone.members = new Member[members.length];
-            System.arraycopy(members,0,clone.members,0,members.length);
+            System.arraycopy(members, 0, clone.members, 0, members.length);
             return clone;
         }
     }
@@ -134,7 +134,12 @@ public class Membership implements Clone
                     
updateMember.setMemberAliveTime(member.getMemberAliveTime());
                     updateMember.setPayload(member.getPayload());
                     updateMember.setCommand(member.getCommand());
-                    Arrays.sort(members, memberComparator);
+                    // Re-order. Can't sort in place since a call to
+                    // getMembers() may then receive an intermediate result.
+                    Member[] newMembers = new Member[members.length];
+                    System.arraycopy(members, 0, newMembers, 0, 
members.length);
+                    Arrays.sort(newMembers, memberComparator);
+                    members = newMembers;
                 }
             }
             entry.accessed();
@@ -155,12 +160,10 @@ public class Membership implements Clone
             if (!map.containsKey(member) ) {
                 map.put(member, entry);
                 Member results[] = new Member[members.length + 1];
-                for (int i = 0; i < members.length; i++) {
-                    results[i] = members[i];
-                }
+                System.arraycopy(members, 0, results, 0, members.length);
                 results[members.length] = member;
+                Arrays.sort(results, memberComparator);
                 members = results;
-                Arrays.sort(members, memberComparator);
             }
         }
         return entry;
@@ -247,15 +250,13 @@ public class Membership implements Clone
         Member[] members = this.members;
         if (members.length > 0) {
             Member result = null;
-            for (int i = 0; i < members.length && result == null; i++) {
+            for (int i = 0; i < members.length; i++) {
                 if (members[i].equals(mbr)) {
-                    result = members[i];
+                    return result;
                 }
             }
-            return result;
-        } else {
-            return null;
         }
+        return null;
     }
 
     public boolean contains(Member mbr) {



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

Reply via email to