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