From 2815d8a251fa12c3c35fc6863c3b1ec77460f06b Mon Sep 17 00:00:00 2001 From: fhanik Date: Tue, 10 Oct 2006 21:50:43 +0000 Subject: [PATCH] Fixes and improvements git-svn-id: https://svn.apache.org/repos/asf/tomcat/tc6.0.x/trunk@462592 13f79535-47bb-0310-9956-ffa450edef68 --- .../apache/catalina/ha/tcp/SimpleTcpCluster.java | 3 +- .../tribes/membership/McastServiceImpl.java | 1 + .../tribes/tipis/AbstractReplicatedMap.java | 103 +++++++++++---------- 3 files changed, 58 insertions(+), 49 deletions(-) diff --git a/java/org/apache/catalina/ha/tcp/SimpleTcpCluster.java b/java/org/apache/catalina/ha/tcp/SimpleTcpCluster.java index 71037f76a..753c91bb5 100644 --- a/java/org/apache/catalina/ha/tcp/SimpleTcpCluster.java +++ b/java/org/apache/catalina/ha/tcp/SimpleTcpCluster.java @@ -555,12 +555,13 @@ public class SimpleTcpCluster */ public String getManagerName(String name, Manager manager) { String clusterName = name ; + if ( clusterName == null ) clusterName = manager.getContainer().getName(); if(getContainer() instanceof Engine) { Container context = manager.getContainer() ; if(context != null && context instanceof Context) { Container host = ((Context)context).getParent(); if(host != null && host instanceof Host) - clusterName = host.getName() + name ; + clusterName = host.getName() +"#" + name ; } } return clusterName; diff --git a/java/org/apache/catalina/tribes/membership/McastServiceImpl.java b/java/org/apache/catalina/tribes/membership/McastServiceImpl.java index cbab1eedd..12134fc0d 100644 --- a/java/org/apache/catalina/tribes/membership/McastServiceImpl.java +++ b/java/org/apache/catalina/tribes/membership/McastServiceImpl.java @@ -163,6 +163,7 @@ public class McastServiceImpl protected void setupSocket() throws IOException { if (mcastBindAddress != null) socket = new MulticastSocket(new InetSocketAddress(mcastBindAddress, port)); else socket = new MulticastSocket(port); + socket.setLoopbackMode(false); //hint that we don't need loop back messages if (mcastBindAddress != null) { if(log.isInfoEnabled()) log.info("Setting multihome multicast interface to:" +mcastBindAddress); diff --git a/java/org/apache/catalina/tribes/tipis/AbstractReplicatedMap.java b/java/org/apache/catalina/tribes/tipis/AbstractReplicatedMap.java index 227f94558..47ee646d7 100644 --- a/java/org/apache/catalina/tribes/tipis/AbstractReplicatedMap.java +++ b/java/org/apache/catalina/tribes/tipis/AbstractReplicatedMap.java @@ -45,6 +45,7 @@ import org.apache.catalina.tribes.membership.MemberImpl; import org.apache.catalina.tribes.util.Arrays; import org.apache.juli.logging.Log; import org.apache.juli.logging.LogFactory; +import java.util.ConcurrentModificationException; /** * @@ -760,57 +761,63 @@ public abstract class AbstractReplicatedMap extends LinkedHashMap implements Rpc } public Object get(Object key) { - MapEntry entry = (MapEntry)super.get(key); - if (log.isTraceEnabled()) log.trace("Requesting id:"+key+" entry:"+entry); - if ( entry == null ) return null; - if ( !entry.isPrimary() ) { - //if the message is not primary, we need to retrieve the latest value - try { - Member[] backup = null; - MapMessage msg = null; - if ( !entry.isBackup() ) { - //make sure we don't retrieve from ourselves - msg = new MapMessage(getMapContextName(), MapMessage.MSG_RETRIEVE_BACKUP, false, - (Serializable) key, null, null, null); - Response[] resp = getRpcChannel().send(entry.getBackupNodes(),msg, this.getRpcChannel().FIRST_REPLY, Channel.SEND_OPTIONS_DEFAULT, getRpcTimeout()); - if (resp == null || resp.length == 0) { - //no responses - log.warn("Unable to retrieve remote object for key:" + key); - return null; - } - msg = (MapMessage) resp[0].getMessage(); - msg.deserialize(getExternalLoaders()); - backup = entry.getBackupNodes(); - if ( entry.getValue() instanceof ReplicatedMapEntry ) { - ReplicatedMapEntry val = (ReplicatedMapEntry)entry.getValue(); - val.setOwner(getMapOwner()); - } - if ( msg.getValue()!=null ) entry.setValue(msg.getValue()); + MapEntry entry = (MapEntry)super.get(key); + if (log.isTraceEnabled()) log.trace("Requesting id:"+key+" entry:"+entry); + if ( entry == null ) return null; + if ( !entry.isPrimary() ) { + //if the message is not primary, we need to retrieve the latest value + try { + Member[] backup = null; + MapMessage msg = null; + if ( !entry.isBackup() ) { + //make sure we don't retrieve from ourselves + msg = new MapMessage(getMapContextName(), MapMessage.MSG_RETRIEVE_BACKUP, false, + (Serializable) key, null, null, null); + Response[] resp = getRpcChannel().send(entry.getBackupNodes(),msg, this.getRpcChannel().FIRST_REPLY, Channel.SEND_OPTIONS_DEFAULT, getRpcTimeout()); + if (resp == null || resp.length == 0) { + //no responses + log.warn("Unable to retrieve remote object for key:" + key); + return null; } - if (entry.isBackup()) { - //select a new backup node - backup = publishEntryInfo(key, entry.getValue()); - } else if ( entry.isProxy() ) { - //invalidate the previous primary - msg = new MapMessage(getMapContextName(),MapMessage.MSG_PROXY,false,(Serializable)key,null,null,backup); - Member[] dest = getMapMembersExcl(backup); - if ( dest!=null && dest.length >0) { - getChannel().send(dest, msg, getChannelSendOptions()); - } + msg = (MapMessage) resp[0].getMessage(); + msg.deserialize(getExternalLoaders()); + backup = entry.getBackupNodes(); + if ( entry.getValue() instanceof ReplicatedMapEntry ) { + ReplicatedMapEntry val = (ReplicatedMapEntry)entry.getValue(); + val.setOwner(getMapOwner()); } - - entry.setBackupNodes(backup); - entry.setBackup(false); - entry.setProxy(false); - - - } catch (Exception x) { - log.error("Unable to replicate out data for a LazyReplicatedMap.get operation", x); - return null; + if ( msg.getValue()!=null ) entry.setValue(msg.getValue()); } + if (entry.isBackup()) { + //select a new backup node + backup = publishEntryInfo(key, entry.getValue()); + } else if ( entry.isProxy() ) { + //invalidate the previous primary + msg = new MapMessage(getMapContextName(),MapMessage.MSG_PROXY,false,(Serializable)key,null,null,backup); + Member[] dest = getMapMembersExcl(backup); + if ( dest!=null && dest.length >0) { + getChannel().send(dest, msg, getChannelSendOptions()); + } + } + + entry.setBackupNodes(backup); + entry.setBackup(false); + entry.setProxy(false); + + + } catch (Exception x) { + log.error("Unable to replicate out data for a LazyReplicatedMap.get operation", x); + return null; } - if (log.isTraceEnabled()) log.trace("Requesting id:"+key+" result:"+entry.getValue()); - return entry.getValue(); + } + if (log.isTraceEnabled()) log.trace("Requesting id:"+key+" result:"+entry.getValue()); + if ( entry.getValue() != null && entry.getValue() instanceof ReplicatedMapEntry ) { + ReplicatedMapEntry val = (ReplicatedMapEntry)entry.getValue(); + //hack, somehow this is not being set above + val.setOwner(getMapOwner()); + + } + return entry.getValue(); } @@ -950,7 +957,7 @@ public abstract class AbstractReplicatedMap extends LinkedHashMap implements Rpc //todo, implement a counter variable instead //only count active members in this node int counter = 0; - Iterator it = super.entrySet().iterator(); + Iterator it = Collections.unmodifiableSet(super.entrySet()).iterator(); while (it.hasNext() ) { Map.Entry e = (Map.Entry) it.next(); if ( e != null ) { -- 2.11.0