From 980de9ebfa319a026f5567d43573de649d8fc341 Mon Sep 17 00:00:00 2001 From: fhanik Date: Fri, 10 Aug 2007 19:41:34 +0000 Subject: [PATCH] backport from trunk rev 564727 git-svn-id: https://svn.apache.org/repos/asf/tomcat/tc6.0.x/trunk@564728 13f79535-47bb-0310-9956-ffa450edef68 --- .../tribes/tipis/AbstractReplicatedMap.java | 17 +++-- test/org/apache/catalina/tribes/demos/MapDemo.java | 89 +++++++++++++++++++--- 2 files changed, 88 insertions(+), 18 deletions(-) diff --git a/java/org/apache/catalina/tribes/tipis/AbstractReplicatedMap.java b/java/org/apache/catalina/tribes/tipis/AbstractReplicatedMap.java index f8ba082bd..cf4564d1b 100644 --- a/java/org/apache/catalina/tribes/tipis/AbstractReplicatedMap.java +++ b/java/org/apache/catalina/tribes/tipis/AbstractReplicatedMap.java @@ -247,7 +247,7 @@ public abstract class AbstractReplicatedMap extends ConcurrentHashMap implements null, null, channel.getLocalMember(false), - new Member[0]); + null); if ( channel.getMembers().length > 0 ) { //send a ping, wait for all nodes to reply Response[] resp = rpcChannel.send(channel.getMembers(), @@ -295,7 +295,7 @@ public abstract class AbstractReplicatedMap extends ConcurrentHashMap implements protected void broadcast(int msgtype, boolean rpc) throws ChannelException { //send out a map membership message, only wait for the first reply MapMessage msg = new MapMessage(this.mapContextName, msgtype, - false, null, null, null, channel.getLocalMember(false), new Member[0]); + false, null, null, null, channel.getLocalMember(false), null); if ( rpc) { Response[] resp = rpcChannel.send(channel.getMembers(), msg, rpcChannel.FIRST_REPLY, (channelSendOptions),rpcTimeout); for (int i = 0; i < resp.length; i++) { @@ -484,13 +484,13 @@ public abstract class AbstractReplicatedMap extends ConcurrentHashMap implements //map init request if (mapmsg.getMsgType() == mapmsg.MSG_INIT) { - mapmsg.setBackUpNodes(wrap(channel.getLocalMember(false))); + mapmsg.setPrimary(channel.getLocalMember(false)); return mapmsg; } //map start request if (mapmsg.getMsgType() == mapmsg.MSG_START) { - mapmsg.setBackUpNodes(wrap(channel.getLocalMember(false))); + mapmsg.setPrimary(channel.getLocalMember(false)); mapMemberAdded(sender); return mapmsg; } @@ -720,6 +720,7 @@ public abstract class AbstractReplicatedMap extends ConcurrentHashMap implements Map.Entry e = (Map.Entry) i.next(); MapEntry entry = (MapEntry) super.get(e.getKey()); if (entry.isPrimary() && inSet(member,entry.getBackupNodes())) { + System.out.println("[1] Primary choosing a new backup"); try { Member[] backup = publishEntryInfo(entry.getKey(), entry.getValue()); entry.setBackupNodes(backup); @@ -728,6 +729,7 @@ public abstract class AbstractReplicatedMap extends ConcurrentHashMap implements log.error("Unable to relocate[" + entry.getKey() + "] to a new backup node", x); } } else if (member.equals(entry.getPrimary())) { + System.out.println("[2] Primary disappeared"); entry.setPrimary(null); } //end if @@ -737,18 +739,21 @@ public abstract class AbstractReplicatedMap extends ConcurrentHashMap implements entry.getBackupNodes().length == 1 && entry.getBackupNodes()[0].equals(member) ) { //remove proxies that have no backup nor primaries + System.out.println("[3] Removing orphaned proxy"); i.remove(); - } else if ( entry.isBackup() && + } else if ( entry.getPrimary() == null && + entry.isBackup() && entry.getBackupNodes()!=null && entry.getBackupNodes().length == 1 && entry.getBackupNodes()[0].equals(channel.getLocalMember(false)) ) { try { + System.out.println("[4] Backup becoming primary"); entry.setPrimary(channel.getLocalMember(false)); entry.setBackup(false); entry.setProxy(false); Member[] backup = publishEntryInfo(entry.getKey(), entry.getValue()); entry.setBackupNodes(backup); - mapOwner.objectMadePrimay(entry.getKey(),entry.getValue()); + if ( mapOwner!=null ) mapOwner.objectMadePrimay(entry.getKey(),entry.getValue()); } catch (ChannelException x) { log.error("Unable to relocate[" + entry.getKey() + "] to a new backup node", x); diff --git a/test/org/apache/catalina/tribes/demos/MapDemo.java b/test/org/apache/catalina/tribes/demos/MapDemo.java index 305f2a561..ff55ecee5 100644 --- a/test/org/apache/catalina/tribes/demos/MapDemo.java +++ b/test/org/apache/catalina/tribes/demos/MapDemo.java @@ -49,6 +49,7 @@ import javax.swing.table.TableColumn; import org.apache.catalina.tribes.util.UUIDGenerator; import org.apache.catalina.tribes.util.Arrays; import java.util.Set; +import java.util.Random; /** *

Title:

@@ -164,6 +165,7 @@ public class MapDemo implements ChannelListener, MembershipListener{ String[] columnNames = { + "Rownum", "Key", "Value", "Primary Node", @@ -197,13 +199,14 @@ public class MapDemo implements ChannelListener, MembershipListener{ String key = (String)keys [row-1]; LazyReplicatedMap.MapEntry entry = map.getInternal(key); switch (col) { - case 0: return entry.getKey(); - case 1: return entry.getValue(); - case 2: return entry.getPrimary()!=null?entry.getPrimary().getName():"null"; - case 3: return getMemberNames(entry.getBackupNodes()); - case 4: return new Boolean(entry.isPrimary()); - case 5: return new Boolean(entry.isProxy()); - case 6: return new Boolean(entry.isBackup()); + case 0: return String.valueOf(row); + case 1: return entry.getKey(); + case 2: return entry.getValue(); + case 3: return entry.getPrimary()!=null?entry.getPrimary().getName():"null"; + case 4: return getMemberNames(entry.getBackupNodes()); + case 5: return new Boolean(entry.isPrimary()); + case 6: return new Boolean(entry.isProxy()); + case 7: return new Boolean(entry.isBackup()); default: return ""; } @@ -330,8 +333,8 @@ public class MapDemo implements ChannelListener, MembershipListener{ if ( "random".equals(e.getActionCommand()) ) { Thread t = new Thread() { public void run() { - for (int i = 0; i < 100; i++) { - String key = Arrays.toString(UUIDGenerator.randomUUID(false)); + for (int i = 0; i < 5; i++) { + String key = random(5,0,0,true,true,null); map.put(key, new StringBuffer(key)); dataModel.fireTableDataChanged(); table.paint(table.getGraphics()); @@ -353,6 +356,68 @@ public class MapDemo implements ChannelListener, MembershipListener{ dataModel.getValueAt(-1,-1); } + public static Random random = new Random(System.currentTimeMillis()); + public static String random(int count, int start, int end, boolean letters, boolean numbers, + char[] chars ) { + if (count == 0) { + return ""; + } else if (count < 0) { + throw new IllegalArgumentException("Requested random string length " + count + " is less than 0."); + } + if ((start == 0) && (end == 0)) { + end = 'z' + 1; + start = ' '; + if (!letters && !numbers) { + start = 0; + end = Integer.MAX_VALUE; + } + } + + char[] buffer = new char[count]; + int gap = end - start; + + while (count-- != 0) { + char ch; + if (chars == null) { + ch = (char) (random.nextInt(gap) + start); + } else { + ch = chars[random.nextInt(gap) + start]; + } + if ((letters && Character.isLetter(ch)) + || (numbers && Character.isDigit(ch)) + || (!letters && !numbers)) + { + if(ch >= 56320 && ch <= 57343) { + if(count == 0) { + count++; + } else { + // low surrogate, insert high surrogate after putting it in + buffer[count] = ch; + count--; + buffer[count] = (char) (55296 + random.nextInt(128)); + } + } else if(ch >= 55296 && ch <= 56191) { + if(count == 0) { + count++; + } else { + // high surrogate, insert low surrogate before putting it in + buffer[count] = (char) (56320 + random.nextInt(128)); + count--; + buffer[count] = ch; + } + } else if(ch >= 56192 && ch <= 56319) { + // private high surrogate, no effing clue, so skip it + count++; + } else { + buffer[count] = ch; + } + } else { + count++; + } + } + return new String(buffer); + } + private void printDebugData(JTable table) { int numRows = table.getRowCount(); int numCols = table.getColumnCount(); @@ -410,9 +475,9 @@ public class MapDemo implements ChannelListener, MembershipListener{ cell.setBackground(Color.WHITE); if ( row > 0 ) { Color color = null; - boolean primary = ( (Boolean) table.getValueAt(row, 4)).booleanValue(); - boolean proxy = ( (Boolean) table.getValueAt(row, 5)).booleanValue(); - boolean backup = ( (Boolean) table.getValueAt(row, 6)).booleanValue(); + boolean primary = ( (Boolean) table.getValueAt(row, 5)).booleanValue(); + boolean proxy = ( (Boolean) table.getValueAt(row, 6)).booleanValue(); + boolean backup = ( (Boolean) table.getValueAt(row, 7)).booleanValue(); if (primary) color = Color.GREEN; else if (proxy) color = Color.RED; else if (backup) color = Color.BLUE; -- 2.11.0