Author: fhanik
Date: Fri Aug 10 12:39:17 2007
New Revision: 564727

URL: http://svn.apache.org/viewvc?view=rev&rev=564727
Log:
fix state synchronization problems

Modified:
    
tomcat/trunk/java/org/apache/catalina/tribes/tipis/AbstractReplicatedMap.java
    tomcat/trunk/test/org/apache/catalina/tribes/demos/MapDemo.java

Modified: 
tomcat/trunk/java/org/apache/catalina/tribes/tipis/AbstractReplicatedMap.java
URL: 
http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/tribes/tipis/AbstractReplicatedMap.java?view=diff&rev=564727&r1=564726&r2=564727
==============================================================================
--- 
tomcat/trunk/java/org/apache/catalina/tribes/tipis/AbstractReplicatedMap.java 
(original)
+++ 
tomcat/trunk/java/org/apache/catalina/tribes/tipis/AbstractReplicatedMap.java 
Fri Aug 10 12:39:17 2007
@@ -247,7 +247,7 @@
                                         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 @@
     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 @@
 
         //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 @@
             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 @@
                     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 @@
                  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);

Modified: tomcat/trunk/test/org/apache/catalina/tribes/demos/MapDemo.java
URL: 
http://svn.apache.org/viewvc/tomcat/trunk/test/org/apache/catalina/tribes/demos/MapDemo.java?view=diff&rev=564727&r1=564726&r2=564727
==============================================================================
--- tomcat/trunk/test/org/apache/catalina/tribes/demos/MapDemo.java (original)
+++ tomcat/trunk/test/org/apache/catalina/tribes/demos/MapDemo.java Fri Aug 10 
12:39:17 2007
@@ -49,6 +49,7 @@
 import org.apache.catalina.tribes.util.UUIDGenerator;
 import org.apache.catalina.tribes.util.Arrays;
 import java.util.Set;
+import java.util.Random;
 
 /**
  * <p>Title: </p>
@@ -164,6 +165,7 @@
             
             
             String[] columnNames = {
+                                   "Rownum",
                                    "Key",
                                    "Value",
                                    "Primary Node",
@@ -197,13 +199,14 @@
                 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 @@
             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 @@
             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 @@
             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;



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

Reply via email to