You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@tomcat.apache.org by ma...@apache.org on 2013/06/18 09:55:07 UTC

svn commit: r1494055 - in /tomcat/tc7.0.x/trunk: ./ java/org/apache/catalina/tribes/tipis/AbstractReplicatedMap.java webapps/docs/changelog.xml

Author: markt
Date: Tue Jun 18 07:55:07 2013
New Revision: 1494055

URL: http://svn.apache.org/r1494055
Log:
Fix https://issues.apache.org/bugzilla/show_bug.cgi?id=55108
Small performance improvement
Patch provided by Adrian Nistor

Modified:
    tomcat/tc7.0.x/trunk/   (props changed)
    tomcat/tc7.0.x/trunk/java/org/apache/catalina/tribes/tipis/AbstractReplicatedMap.java
    tomcat/tc7.0.x/trunk/webapps/docs/changelog.xml

Propchange: tomcat/tc7.0.x/trunk/
------------------------------------------------------------------------------
  Merged /tomcat/trunk:r1494051

Modified: tomcat/tc7.0.x/trunk/java/org/apache/catalina/tribes/tipis/AbstractReplicatedMap.java
URL: http://svn.apache.org/viewvc/tomcat/tc7.0.x/trunk/java/org/apache/catalina/tribes/tipis/AbstractReplicatedMap.java?rev=1494055&r1=1494054&r2=1494055&view=diff
==============================================================================
--- tomcat/tc7.0.x/trunk/java/org/apache/catalina/tribes/tipis/AbstractReplicatedMap.java (original)
+++ tomcat/tc7.0.x/trunk/java/org/apache/catalina/tribes/tipis/AbstractReplicatedMap.java Tue Jun 18 07:55:07 2013
@@ -67,7 +67,7 @@ public abstract class AbstractReplicated
      * The load factor used when none specified in constructor.
      **/
     public static final float DEFAULT_LOAD_FACTOR = 0.75f;
-    
+
     /**
      * Used to identify the map
      */
@@ -78,8 +78,8 @@ public abstract class AbstractReplicated
 //              INSTANCE VARIABLES
 //------------------------------------------------------------------------------
     protected abstract int getStateMessageType();
-    
-    
+
+
     /**
      * Timeout for RPC messages, how long we will wait for a reply
      */
@@ -122,21 +122,21 @@ public abstract class AbstractReplicated
      * External class loaders if serialization and deserialization is to be performed successfully.
      */
     protected transient ClassLoader[] externalLoaders;
-    
+
     /**
      * The node we are currently backing up data to, this index will rotate
      * on a round robin basis
      */
     protected transient int currentNode = 0;
-    
+
     /**
      * Since the map keeps internal membership
      * this is the timeout for a ping message to be responded to
-     * If a remote map doesn't respond within this timeframe, 
+     * If a remote map doesn't respond within this timeframe,
      * its considered dead.
      */
     protected transient long accessTimeout = 5000;
-    
+
     /**
      * Readable string of the mapContextName value
      */
@@ -145,7 +145,7 @@ public abstract class AbstractReplicated
 //------------------------------------------------------------------------------
 //              map owner interface
 //------------------------------------------------------------------------------
-    
+
     public static interface MapOwner {
         // a typo, should have been "objectMadePrimary"
         public void objectMadePrimay(Object key, Object value);
@@ -165,16 +165,16 @@ public abstract class AbstractReplicated
      * @param cls - a list of classloaders to be used for deserialization of objects.
      */
     public AbstractReplicatedMap(MapOwner owner,
-                                 Channel channel, 
-                                 long timeout, 
-                                 String mapContextName, 
+                                 Channel channel,
+                                 long timeout,
+                                 String mapContextName,
                                  int initialCapacity,
                                  float loadFactor,
                                  int channelSendOptions,
                                  ClassLoader[] cls) {
         super(initialCapacity, loadFactor, 15);
         init(owner, channel, mapContextName, timeout, channelSendOptions, cls);
-        
+
     }
 
     /**
@@ -216,8 +216,8 @@ public abstract class AbstractReplicated
         this.channel.addChannelListener(this);
         //listen for membership notifications
         this.channel.addMembershipListener(this);
-        
-        
+
+
         try {
             //broadcast our map, this just notifies other members of our existence
             broadcast(MapMessage.MSG_INIT, true);
@@ -234,8 +234,8 @@ public abstract class AbstractReplicated
             throw new RuntimeException("Unable to start replicated map.",x);
         }
     }
-    
-    
+
+
     /**
      * Sends a ping out to all the members in the cluster, not just map members
      * that this map is alive.
@@ -244,19 +244,19 @@ public abstract class AbstractReplicated
      */
     protected void ping(long timeout) throws ChannelException {
         //send out a map membership message, only wait for the first reply
-        MapMessage msg = new MapMessage(this.mapContextName, 
+        MapMessage msg = new MapMessage(this.mapContextName,
                                         MapMessage.MSG_INIT,
-                                        false, 
-                                        null, 
-                                        null, 
-                                        null, 
+                                        false,
+                                        null,
+                                        null,
+                                        null,
                                         channel.getLocalMember(false),
                                         null);
         if ( channel.getMembers().length > 0 ) {
             try {
                 //send a ping, wait for all nodes to reply
-                Response[] resp = rpcChannel.send(channel.getMembers(), 
-                                                  msg, RpcChannel.ALL_REPLY, 
+                Response[] resp = rpcChannel.send(channel.getMembers(),
+                                                  msg, RpcChannel.ALL_REPLY,
                                                   (channelSendOptions),
                                                   (int) accessTimeout);
                 for (int i = 0; i < resp.length; i++) {
@@ -268,7 +268,7 @@ public abstract class AbstractReplicated
                 for (FaultyMember faultyMember : faultyMembers) {
                     memberDisappeared(faultyMember.getMember());
                 }
-            }            
+            }
         }
         //update our map of members, expire some if we didn't receive a ping back
         synchronized (mapMembers) {
@@ -276,7 +276,7 @@ public abstract class AbstractReplicated
             long now = System.currentTimeMillis();
             while ( it.hasNext() ) {
                 Map.Entry<Member,Long> entry = it.next();
-                long access = entry.getValue().longValue(); 
+                long access = entry.getValue().longValue();
                 if ( (now - access) > timeout ) {
                     it.remove();
                     memberDisappeared(entry.getKey());
@@ -297,7 +297,7 @@ public abstract class AbstractReplicated
             mapMembers.put(member, new Long(System.currentTimeMillis()));
         }
     }
-    
+
     /**
      * Helper method to broadcast a message to all members in a channel
      * @param msgtype int
@@ -349,12 +349,12 @@ public abstract class AbstractReplicated
         this.stateTransferred = false;
         this.externalLoaders = null;
     }
-    
+
     @Override
     public int hashCode() {
         return Arrays.hashCode(this.mapContextName);
     }
-    
+
     @Override
     public boolean equals(Object o) {
         if ( !(o instanceof AbstractReplicatedMap)) return false;
@@ -376,7 +376,7 @@ public abstract class AbstractReplicated
     public Member[] getMapMembers() {
         return getMapMembers(this.mapMembers);
     }
-    
+
     public Member[] getMapMembersExcl(Member[] exclude) {
         synchronized (mapMembers) {
             @SuppressWarnings("unchecked") // mapMembers has the correct type
@@ -407,11 +407,11 @@ public abstract class AbstractReplicated
             boolean isDirty = rentry != null && rentry.isDirty();
             boolean isAccess = rentry != null && rentry.isAccessReplicate();
             boolean repl = complete || isDirty || isAccess;
-            
+
             if (!repl) {
                 if ( log.isTraceEnabled() )
                     log.trace("Not replicating:"+key+", no change made");
-                
+
                 return;
             }
             //check to see if the message is diffable
@@ -432,7 +432,7 @@ public abstract class AbstractReplicated
                 } finally {
                     rentry.unlock();
                 }
-                
+
             }
             if (msg == null && complete) {
                 //construct a complete
@@ -520,7 +520,7 @@ public abstract class AbstractReplicated
             mapmsg.setPrimary(channel.getLocalMember(false));
             return mapmsg;
         }
-        
+
         //map start request
         if (mapmsg.getMsgType() == MapMessage.MSG_START) {
             mapmsg.setPrimary(channel.getLocalMember(false));
@@ -546,7 +546,7 @@ public abstract class AbstractReplicated
                     MapEntry entry = (MapEntry) super.get(e.getKey());
                     if ( entry != null && entry.isSerializable() ) {
                         boolean copy = (mapmsg.getMsgType() == MapMessage.MSG_STATE_COPY);
-                        MapMessage me = new MapMessage(mapContextName, 
+                        MapMessage me = new MapMessage(mapContextName,
                                                        copy?MapMessage.MSG_COPY:MapMessage.MSG_PROXY,
                             false, (Serializable) entry.getKey(), copy?(Serializable) entry.getValue():null, null, entry.getPrimary(),entry.getBackupNodes());
                         list.add(me);
@@ -554,7 +554,7 @@ public abstract class AbstractReplicated
                 }
                 mapmsg.setValue(list);
                 return mapmsg;
-                
+
             } //synchronized
         }
 
@@ -596,7 +596,7 @@ public abstract class AbstractReplicated
         if ( log.isTraceEnabled() ) {
             log.trace("Map["+mapname+"] received message:"+mapmsg);
         }
-        
+
         try {
             mapmsg.deserialize(getExternalLoaders());
         } catch (IOException x) {
@@ -606,7 +606,7 @@ public abstract class AbstractReplicated
             log.error("Unable to deserialize MapMessage.", x);
             return;
         }
-        if ( log.isTraceEnabled() ) 
+        if ( log.isTraceEnabled() )
             log.trace("Map message received from:"+sender.getName()+" msg:"+mapmsg);
         if (mapmsg.getMsgType() == MapMessage.MSG_START) {
             mapMemberAdded(mapmsg.getPrimary());
@@ -732,7 +732,7 @@ public abstract class AbstractReplicated
             } //synchronized
         }//end if
     }
-    
+
     public boolean inSet(Member m, Member[] set) {
         if ( set == null ) return false;
         boolean result = false;
@@ -745,7 +745,7 @@ public abstract class AbstractReplicated
         ArrayList<Member> result = new ArrayList<Member>();
         for (int i=0; i<set.length; i++ ) {
             boolean include = true;
-            for (int j=0; j<mbrs.length; j++ ) 
+            for (int j=0; j<mbrs.length && include; j++ )
                 if ( mbrs[j].equals(set[i]) ) include = false;
             if ( include ) result.add(set[i]);
         }
@@ -767,7 +767,7 @@ public abstract class AbstractReplicated
                 return; //the member was not part of our map.
             }
         }
-        
+
         Iterator<Map.Entry<?,?>> i = super.entrySet().iterator();
         while (i.hasNext()) {
             Map.Entry<?,?> e = i.next();
@@ -786,10 +786,10 @@ public abstract class AbstractReplicated
                 if (log.isDebugEnabled()) log.debug("[2] Primary disappeared");
                 entry.setPrimary(null);
             } //end if
-            
+
             if ( entry.isProxy() &&
-                 entry.getPrimary() == null && 
-                 entry.getBackupNodes()!=null && 
+                 entry.getPrimary() == null &&
+                 entry.getBackupNodes()!=null &&
                  entry.getBackupNodes().length == 1 &&
                  entry.getBackupNodes()[0].equals(member) ) {
                 //remove proxies that have no backup nor primaries
@@ -797,7 +797,7 @@ public abstract class AbstractReplicated
                 i.remove();
             } else if ( entry.getPrimary() == null &&
                         entry.isBackup() &&
-                        entry.getBackupNodes()!=null && 
+                        entry.getBackupNodes()!=null &&
                         entry.getBackupNodes().length == 1 &&
                         entry.getBackupNodes()[0].equals(channel.getLocalMember(false)) ) {
                 try {
@@ -808,7 +808,7 @@ public abstract class AbstractReplicated
                     Member[] backup = publishEntryInfo(entry.getKey(), entry.getValue());
                     entry.setBackupNodes(backup);
                     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);
                 }
@@ -836,7 +836,7 @@ public abstract class AbstractReplicated
     }
 
     protected abstract Member[] publishEntryInfo(Object key, Object value) throws ChannelException;
-    
+
     @Override
     public void heartbeat() {
         try {
@@ -846,13 +846,13 @@ public abstract class AbstractReplicated
         }
     }
 
-//------------------------------------------------------------------------------    
-//              METHODS TO OVERRIDE    
 //------------------------------------------------------------------------------
-  
+//              METHODS TO OVERRIDE
+//------------------------------------------------------------------------------
+
     /**
-     * Removes an object from this map, it will also remove it from 
-     * 
+     * Removes an object from this map, it will also remove it from
+     *
      * @param key Object
      * @return Object
      */
@@ -873,11 +873,11 @@ public abstract class AbstractReplicated
         }
         return entry!=null?entry.getValue():null;
     }
-    
+
     public MapEntry getInternal(Object key) {
         return (MapEntry)super.get(key);
     }
-    
+
     @Override
     public Object get(Object key) {
         MapEntry entry = (MapEntry)super.get(key);
@@ -919,7 +919,7 @@ public abstract class AbstractReplicated
                     }
                     if ( entry.getValue() != null && entry.getValue() instanceof ReplicatedMapEntry ) {
                         ReplicatedMapEntry val = (ReplicatedMapEntry)entry.getValue();
-                        val.setOwner(getMapOwner());   
+                        val.setOwner(getMapOwner());
                     }
                 }
                 entry.setPrimary(channel.getLocalMember(false));
@@ -935,9 +935,9 @@ public abstract class AbstractReplicated
         }
         if (log.isTraceEnabled()) log.trace("Requesting id:"+key+" result:"+entry.getValue());
         return entry.getValue();
-    }    
+    }
+
 
-    
     protected void printMap(String header) {
         try {
             System.out.println("\nDEBUG MAP:"+header);
@@ -960,7 +960,7 @@ public abstract class AbstractReplicated
             ignore.printStackTrace();
         }
     }
-    
+
     /**
          * Returns true if the key has an entry in the map.
          * The entry can be a proxy or a backup entry, invoking <code>get(key)</code>
@@ -972,20 +972,20 @@ public abstract class AbstractReplicated
         public boolean containsKey(Object key) {
             return super.containsKey(key);
         }
-    
+
         @Override
         public Object put(Object key, Object value) {
             return put(key,value,true);
         }
-    
+
         public Object put(Object key, Object value, boolean notify) {
             MapEntry entry = new MapEntry(key,value);
             entry.setBackup(false);
             entry.setProxy(false);
             entry.setPrimary(channel.getLocalMember(false));
-    
+
             Object old = null;
-    
+
             //make sure that any old values get removed
             if ( containsKey(key) ) old = remove(key);
             try {
@@ -999,8 +999,8 @@ public abstract class AbstractReplicated
             super.put(key,entry);
             return old;
         }
-    
-    
+
+
         /**
          * Copies all values from one map to this instance
          * @param m Map
@@ -1013,12 +1013,12 @@ public abstract class AbstractReplicated
                 put(entry.getKey(),entry.getValue());
             }
         }
-        
+
         @Override
         public void clear() {
             clear(true);
         }
-    
+
         public void clear(boolean notify) {
             if ( notify ) {
                 //only delete active keys
@@ -1029,7 +1029,7 @@ public abstract class AbstractReplicated
                 super.clear();
             }
         }
-    
+
         @Override
         public boolean containsValue(Object value) {
             if ( value == null ) {
@@ -1044,30 +1044,30 @@ public abstract class AbstractReplicated
                 return false;
             }//end if
         }
-    
+
         @Override
         public Object clone() {
             throw new UnsupportedOperationException("This operation is not valid on a replicated map");
         }
-    
+
         /**
          * Returns the entire contents of the map
-         * Map.Entry.getValue() will return a LazyReplicatedMap.MapEntry object containing all the information 
+         * Map.Entry.getValue() will return a LazyReplicatedMap.MapEntry object containing all the information
          * about the object.
          * @return Set
          */
         public Set entrySetFull() {
             return super.entrySet();
         }
-    
+
         public Set keySetFull() {
             return super.keySet();
         }
-    
+
         public int sizeFull() {
             return super.size();
         }
-    
+
         @Override
         public Set<MapEntry> entrySet() {
             LinkedHashSet<MapEntry> set = new LinkedHashSet<MapEntry>(super.size());
@@ -1082,7 +1082,7 @@ public abstract class AbstractReplicated
             }
             return Collections.unmodifiableSet(set);
         }
-    
+
         @Override
         public Set<Object> keySet() {
             //todo implement
@@ -1098,8 +1098,8 @@ public abstract class AbstractReplicated
             return Collections.unmodifiableSet(set);
 
         }
-    
-    
+
+
         @Override
         public int size() {
             //todo, implement a counter variable instead
@@ -1115,12 +1115,12 @@ public abstract class AbstractReplicated
             }
             return counter;
         }
-    
+
         @Override
         public boolean isEmpty() {
             return size()==0;
         }
-    
+
         @Override
         public Collection<Object> values() {
             ArrayList<Object> values = new ArrayList<Object>();
@@ -1132,7 +1132,7 @@ public abstract class AbstractReplicated
             }
             return Collections.unmodifiableCollection(values);
         }
-        
+
 
 //------------------------------------------------------------------------------
 //                Map Entry class
@@ -1148,21 +1148,21 @@ public abstract class AbstractReplicated
         public MapEntry(Object key, Object value) {
             setKey(key);
             setValue(value);
-            
+
         }
-        
+
         public boolean isKeySerializable() {
             return (key == null) || (key instanceof Serializable);
         }
-        
+
         public boolean isValueSerializable() {
             return (value==null) || (value instanceof Serializable);
         }
-        
+
         public boolean isSerializable() {
             return isKeySerializable() && isValueSerializable();
         }
-        
+
         public boolean isBackup() {
             return backup;
         }
@@ -1182,7 +1182,7 @@ public abstract class AbstractReplicated
         public boolean isActive() {
             return !proxy;
         }
-        
+
         public void setProxy(boolean proxy) {
             this.proxy = proxy;
         }
@@ -1199,11 +1199,11 @@ public abstract class AbstractReplicated
         public Member[] getBackupNodes() {
             return backupNodes;
         }
-        
+
         public void setPrimary(Member m) {
             primary = m;
         }
-        
+
         public Member getPrimary() {
             return primary;
         }
@@ -1224,7 +1224,7 @@ public abstract class AbstractReplicated
         public Object getKey() {
             return key;
         }
-        
+
         public Object setKey(Object key) {
             Object old = this.key;
             this.key = key;
@@ -1266,7 +1266,7 @@ public abstract class AbstractReplicated
                 value = XByteBuffer.deserialize(data, offset, length);
             }
         }
-        
+
         @Override
         public String toString() {
             StringBuilder buf = new StringBuilder("MapEntry[key:");
@@ -1308,7 +1308,7 @@ public abstract class AbstractReplicated
         private byte[] diffvalue;
         private Member[] nodes;
         private Member primary;
-        
+
         @Override
         public String toString() {
             StringBuilder buf = new StringBuilder("MapMessage[context=");
@@ -1321,7 +1321,7 @@ public abstract class AbstractReplicated
             buf.append(value);
             return buf.toString();
         }
-        
+
         public String getTypeDesc() {
             switch (msgtype) {
                 case MSG_BACKUP: return "MSG_BACKUP";
@@ -1359,7 +1359,7 @@ public abstract class AbstractReplicated
             setValue(value);
             setKey(key);
         }
-        
+
         public void deserialize(ClassLoader[] cls) throws IOException, ClassNotFoundException {
             key(cls);
             value(cls);
@@ -1389,11 +1389,11 @@ public abstract class AbstractReplicated
             keydata = null;
             return key;
         }
-        
+
         public byte[] getKeyData() {
             return keydata;
         }
-        
+
         public Serializable getValue() {
             try {
                 return value(null);
@@ -1410,7 +1410,7 @@ public abstract class AbstractReplicated
             valuedata = null;
             return value;
         }
-        
+
         public byte[] getValueData() {
             return valuedata;
         }
@@ -1426,7 +1426,7 @@ public abstract class AbstractReplicated
         public Member getPrimary() {
             return primary;
         }
-        
+
         private void setPrimary(Member m) {
             primary = m;
         }
@@ -1443,7 +1443,7 @@ public abstract class AbstractReplicated
                 throw new RuntimeException(x);
             }
         }
-        
+
         public void setKey(Serializable key) {
             try {
                 if (key != null) keydata = XByteBuffer.serialize(key);
@@ -1467,7 +1467,7 @@ public abstract class AbstractReplicated
             }
             return members;
         }
-        
+
         /**
          * @deprecated  Unused - will be removed in 8.0.x
          */
@@ -1483,8 +1483,8 @@ public abstract class AbstractReplicated
                 }
             }
         }
-        
-        
+
+
         /**
          * shallow clone
          * @return Object

Modified: tomcat/tc7.0.x/trunk/webapps/docs/changelog.xml
URL: http://svn.apache.org/viewvc/tomcat/tc7.0.x/trunk/webapps/docs/changelog.xml?rev=1494055&r1=1494054&r2=1494055&view=diff
==============================================================================
--- tomcat/tc7.0.x/trunk/webapps/docs/changelog.xml (original)
+++ tomcat/tc7.0.x/trunk/webapps/docs/changelog.xml Tue Jun 18 07:55:07 2013
@@ -70,8 +70,8 @@
         methods that does not include GET. (markt)
       </fix>
       <fix>
-        <bug>55110</bug> &amp; <bug>55110</bug>: Small performance improvements.
-        Patches provided by Adrian Nistor. (markt)
+        <bug>55108</bug>, <bug>55109</bug> &amp; <bug>55110</bug>: Small
+        performance improvements. Patches provided by Adrian Nistor. (markt)
       </fix>
     </changelog>
   </subsection>



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