Author: fhanik Date: Wed Mar 22 07:14:44 2006 New Revision: 387872 URL: http://svn.apache.org/viewcvs?rev=387872&view=rev Log: ok, we finally got control of it, fully working now
Modified: tomcat/container/tc5.5.x/modules/groupcom/src/share/org/apache/catalina/tribes/io/ReplicationStream.java tomcat/container/tc5.5.x/modules/groupcom/src/share/org/apache/catalina/tribes/io/XByteBuffer.java tomcat/container/tc5.5.x/modules/groupcom/src/share/org/apache/catalina/tribes/tipis/AbstractReplicatedMap.java tomcat/container/tc5.5.x/modules/groupcom/src/share/org/apache/catalina/tribes/tipis/LazyReplicatedMap.java tomcat/container/tc5.5.x/modules/groupcom/src/share/org/apache/catalina/tribes/tipis/ReplicatedMap.java tomcat/container/tc5.5.x/modules/ha/src/share/org/apache/catalina/ha/session/BackupManager.java tomcat/container/tc5.5.x/modules/ha/src/share/org/apache/catalina/ha/session/ClusterManagerBase.java tomcat/container/tc5.5.x/modules/ha/src/share/org/apache/catalina/ha/session/DeltaSession.java Modified: tomcat/container/tc5.5.x/modules/groupcom/src/share/org/apache/catalina/tribes/io/ReplicationStream.java URL: http://svn.apache.org/viewcvs/tomcat/container/tc5.5.x/modules/groupcom/src/share/org/apache/catalina/tribes/io/ReplicationStream.java?rev=387872&r1=387871&r2=387872&view=diff ============================================================================== --- tomcat/container/tc5.5.x/modules/groupcom/src/share/org/apache/catalina/tribes/io/ReplicationStream.java (original) +++ tomcat/container/tc5.5.x/modules/groupcom/src/share/org/apache/catalina/tribes/io/ReplicationStream.java Wed Mar 22 07:14:44 2006 @@ -17,11 +17,10 @@ package org.apache.catalina.tribes.io; -import java.io.InputStream; import java.io.IOException; +import java.io.InputStream; import java.io.ObjectInputStream; import java.io.ObjectStreamClass; -import java.util.HashMap; /** * Custom subclass of <code>ObjectInputStream</code> that loads from the Modified: tomcat/container/tc5.5.x/modules/groupcom/src/share/org/apache/catalina/tribes/io/XByteBuffer.java URL: http://svn.apache.org/viewcvs/tomcat/container/tc5.5.x/modules/groupcom/src/share/org/apache/catalina/tribes/io/XByteBuffer.java?rev=387872&r1=387871&r2=387872&view=diff ============================================================================== --- tomcat/container/tc5.5.x/modules/groupcom/src/share/org/apache/catalina/tribes/io/XByteBuffer.java (original) +++ tomcat/container/tc5.5.x/modules/groupcom/src/share/org/apache/catalina/tribes/io/XByteBuffer.java Wed Mar 22 07:14:44 2006 @@ -518,12 +518,18 @@ return deserialize(data,0,data.length); } - public static Serializable deserialize(byte[] data, int offset, int length) - throws IOException, ClassNotFoundException, ClassCastException { + public static Serializable deserialize(byte[] data, int offset, int length) + throws IOException, ClassNotFoundException, ClassCastException { + return deserialize(data,offset,length,new ClassLoader[] {XByteBuffer.class.getClassLoader()}); + } + + public static Serializable deserialize(byte[] data, int offset, int length, ClassLoader[] cls) + throws IOException, ClassNotFoundException, ClassCastException { Object message = null; + if ( cls == null ) cls = new ClassLoader[] {XByteBuffer.class.getClassLoader()}; if (data != null) { InputStream instream = new ByteArrayInputStream(data,offset,length); - ReplicationStream stream = new ReplicationStream(instream,new ClassLoader[] {XByteBuffer.class.getClassLoader()}); + ReplicationStream stream = new ReplicationStream(instream,cls); message = stream.readObject(); instream.close(); } Modified: tomcat/container/tc5.5.x/modules/groupcom/src/share/org/apache/catalina/tribes/tipis/AbstractReplicatedMap.java URL: http://svn.apache.org/viewcvs/tomcat/container/tc5.5.x/modules/groupcom/src/share/org/apache/catalina/tribes/tipis/AbstractReplicatedMap.java?rev=387872&r1=387871&r2=387872&view=diff ============================================================================== --- tomcat/container/tc5.5.x/modules/groupcom/src/share/org/apache/catalina/tribes/tipis/AbstractReplicatedMap.java (original) +++ tomcat/container/tc5.5.x/modules/groupcom/src/share/org/apache/catalina/tribes/tipis/AbstractReplicatedMap.java Wed Mar 22 07:14:44 2006 @@ -20,7 +20,6 @@ import java.io.IOException; import java.io.ObjectInput; import java.io.ObjectOutput; -import java.io.ObjectOutputStream; import java.io.Serializable; import java.io.UnsupportedEncodingException; import java.util.ArrayList; @@ -34,7 +33,6 @@ import org.apache.catalina.tribes.ChannelListener; import org.apache.catalina.tribes.Member; import org.apache.catalina.tribes.MembershipListener; -import org.apache.catalina.tribes.io.DirectByteArrayOutputStream; import org.apache.catalina.tribes.io.XByteBuffer; import org.apache.catalina.tribes.mcast.MemberImpl; import org.apache.commons.logging.Log; @@ -81,7 +79,9 @@ private transient Object stateMutex = new Object(); private transient ArrayList mapMembers = new ArrayList(); private transient int channelSendOptions = Channel.SEND_OPTIONS_DEFAULT; - private transient MapOwner mapOwner; + private transient Object mapOwner; + private transient ClassLoader[] externalLoaders; + //------------------------------------------------------------------------------ // CONSTRUCTORS @@ -95,7 +95,7 @@ * @param initialCapacity int - the size of this map, see HashMap * @param loadFactor float - load factor, see HashMap */ - public AbstractReplicatedMap(MapOwner owner, + public AbstractReplicatedMap(Object owner, Channel channel, long timeout, String mapContextName, @@ -111,7 +111,7 @@ return new Member[] {m}; } - private void init(MapOwner owner, Channel channel, String mapContextName, long timeout, int channelSendOptions) { + private void init(Object owner, Channel channel, String mapContextName, long timeout, int channelSendOptions) { this.mapOwner = owner; this.channelSendOptions = channelSendOptions; @@ -131,22 +131,29 @@ this.channel.addChannelListener(this); this.channel.addMembershipListener(this); + broadcast(MapMessage.MSG_START,true); + + //transfer state from another map + transferState(); + } + + private void broadcast(int msgtype, boolean rpc) { try { //send out a map membership message, only wait for the first reply - MapMessage msg = new MapMessage(this.mapContextName, MapMessage.MSG_START, + MapMessage msg = new MapMessage(this.mapContextName, msgtype, false, null, null, null, wrap(channel.getLocalMember(false))); - Response[] resp = rpcChannel.send(channel.getMembers(), msg, rpcChannel.FIRST_REPLY, channelSendOptions, timeout); - for (int i = 0; i < resp.length; i++) { - mapMemberAdded(resp[i].getSource()); - messageReceived(resp[i].getMessage(), resp[i].getSource()); + if ( rpc) { + Response[] resp = rpcChannel.send(channel.getMembers(), msg, rpcChannel.FIRST_REPLY, channelSendOptions,rpcTimeout); + for (int i = 0; i < resp.length; i++) { + mapMemberAdded(resp[i].getSource()); + messageReceived(resp[i].getMessage(), resp[i].getSource()); + } + } else { + channel.send(channel.getMembers(),msg,channelSendOptions); } } catch (ChannelException x) { log.warn("Unable to send map start message."); } - - //transfer state from another map - transferState(); - printMap(); } public void breakdown() { @@ -154,16 +161,7 @@ } public void finalize() { - try { - //send a map membership stop message - MapMessage msg = new MapMessage(this.mapContextName, MapMessage.MSG_STOP, - false, null, null, null, wrap(channel.getLocalMember(false))); - if (channel != null) channel.send(channel.getMembers(), msg,channel.SEND_OPTIONS_DEFAULT); - - } catch (ChannelException x) { - log.warn("Unable to send stop message.", x); - } - + broadcast(MapMessage.MSG_STOP,false); //cleanup if (this.rpcChannel != null) { this.rpcChannel.breakdown(); @@ -177,9 +175,10 @@ this.mapMembers.clear(); super.clear(); this.stateTransferred = false; + this.externalLoaders = null; } - //------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ // GROUP COM INTERFACES //------------------------------------------------------------------------------ public Member[] getMapMembers() { @@ -270,22 +269,29 @@ msg = (MapMessage) resp[0].getMessage(); ArrayList list = (ArrayList) msg.getValue(); for (int i = 0; i < list.size(); i++) { - MapMessage m = (MapMessage) list.get(i); - - //make sure we don't store that actual object as primary or backup - MapEntry local = (MapEntry)super.get(m.getKey()); - if (local != null && (!local.isProxy())) continue; - - //store the object - if (m.getValue()!=null && m.getValue() instanceof ReplicatedMapEntry ) { - ((ReplicatedMapEntry)m.getValue()).setOwner(getMapOwner()); - } - MapEntry entry = new MapEntry(m.getKey(), m.getValue()); - entry.setBackup(false); - entry.setProxy(true); - entry.setBackupNodes(m.getBackupNodes()); - super.put(entry.getKey(), entry); - } + messageReceived((Serializable)list.get(i),resp[0].getSource()); +// MapMessage m = (MapMessage) list.get(i); +// try { +// m.deserialize(getExternalLoaders()); +// //make sure we don't store that actual object as primary or backup +// MapEntry local = (MapEntry)super.get(m.getKey()); +// if (local != null && (!local.isProxy())) continue; +// +// //store the object +// if (m.getValue()!=null && m.getValue() instanceof ReplicatedMapEntry ) { +// ((ReplicatedMapEntry)m.getValue()).setOwner(getMapOwner()); +// } +// MapEntry entry = new MapEntry(m.getKey(), m.getValue()); +// entry.setBackup(false); +// entry.setProxy(true); +// entry.setBackupNodes(m.getBackupNodes()); +// super.put(entry.getKey(), entry); +// } catch (IOException x) { +// log.error("Unable to deserialize MapMessage.", x); +// } catch (ClassNotFoundException x) { +// log.error("Unable to deserialize MapMessage.", x); +// } + }//for } } } catch (ChannelException x) { @@ -312,7 +318,6 @@ //backup request if (mapmsg.getMsgType() == mapmsg.MSG_RETRIEVE_BACKUP) { - System.out.println("Received a retrieve request for id:"+mapmsg.getKey()); MapEntry entry = (MapEntry)super.get(mapmsg.getKey()); if (entry == null)return null; mapmsg.setValue( (Serializable) entry.getValue()); @@ -352,18 +357,29 @@ if (! (msg instanceof MapMessage))return; MapMessage mapmsg = (MapMessage) msg; - if (mapmsg.getMsgType() == MapMessage.MSG_START) { - mapMemberAdded(mapmsg.getBackupNodes()[0]); + try { + mapmsg.deserialize(getExternalLoaders()); + if (mapmsg.getMsgType() == MapMessage.MSG_START) { + mapMemberAdded(mapmsg.getBackupNodes()[0]); + } + } catch (IOException x ) { + log.error("Unable to deserialize MapMessage.",x); + } catch (ClassNotFoundException x ) { + log.error("Unable to deserialize MapMessage.",x); } } public void messageReceived(Serializable msg, Member sender) { - //todo implement all the messages that we can receive - //messages we can receive are MSG_PROXY, MSG_BACKUP - if (! (msg instanceof MapMessage))return; + if (! (msg instanceof MapMessage)) return; MapMessage mapmsg = (MapMessage) msg; - + try { + mapmsg.deserialize(getExternalLoaders()); + } catch (IOException x) { + log.error("Unable to deserialize MapMessage.", x); + } catch (ClassNotFoundException x) { + log.error("Unable to deserialize MapMessage.", x); + } if (mapmsg.getMsgType() == MapMessage.MSG_START) { mapMemberAdded(mapmsg.getBackupNodes()[0]); } @@ -385,7 +401,6 @@ } if (mapmsg.getMsgType() == MapMessage.MSG_BACKUP) { - System.out.println("Received a backup request for id:"+mapmsg.getKey()); MapEntry entry = (MapEntry)super.get(mapmsg.getKey()); if (entry == null) { entry = new MapEntry(mapmsg.getKey(), mapmsg.getValue()); @@ -424,7 +439,6 @@ } //end if super.put(entry.getKey(), entry); } //end if - printMap(); } public boolean accept(Serializable msg, Member sender) { @@ -435,15 +449,11 @@ } public void mapMemberAdded(Member member) { - System.out.println("Received Member added:"+member.getName()); if ( member.equals(getChannel().getLocalMember(false)) ) return; - System.out.println("Received Member added2:"+member.getName()); //select a backup node if we don't have one synchronized (mapMembers) { if (!mapMembers.contains(member) ) mapMembers.add(member); } - System.out.println("Received Member added3:"+member.getName()); - printMap(); synchronized (stateMutex) { Iterator i = super.entrySet().iterator(); while (i.hasNext()) { @@ -514,9 +524,10 @@ // METHODS TO OVERRIDE //------------------------------------------------------------------------------ - protected void printMap() { + protected void printMap(String header) { try { - System.out.println("\nMap["+((Object)this).toString()+"; " + new String(mapContextName, chset) + ", Map Size:" + super.size()); + System.out.println("\nDEBUG MAP:"+header); + System.out.println("Map["+((Object)this).toString()+"; " + new String(mapContextName, chset) + ", Map Size:" + super.size()); Member[] mbrs = getMapMembers(); for ( int i=0; i<mbrs.length;i++ ) { System.out.println("Mbr["+(i+1)+"="+mbrs[i].getName()); @@ -535,17 +546,6 @@ } //------------------------------------------------------------------------------ -// Map Owner - serialization/deserialization -//------------------------------------------------------------------------------ - public static interface MapOwner { - - public byte[] serialize(Object mapObject) throws IOException; - - public Serializable deserialize(byte[] data) throws ClassNotFoundException,IOException; - - } - -//------------------------------------------------------------------------------ // Map Entry class //------------------------------------------------------------------------------ public static class MapEntry implements Map.Entry { @@ -672,6 +672,8 @@ private boolean diff; private Serializable key; private Serializable value; + private byte[] valuedata; + private byte[] keydata; private byte[] diffvalue; private Member[] nodes; @@ -688,6 +690,11 @@ this.diffvalue = diffvalue; this.nodes = nodes; } + + public void deserialize(ClassLoader[] cls) throws IOException, ClassNotFoundException { + key(cls); + value(cls); + } public int getMsgType() { return msgtype; @@ -698,12 +705,44 @@ } public Serializable getKey() { - return key; + try { + return key(null); + } catch ( Exception x ) { + log.error("Deserialization error of the MapMessage.key",x); + return null; + } } + public Serializable key(ClassLoader[] cls) throws IOException, ClassNotFoundException { + if ( key!=null ) return key; + if ( keydata == null || keydata.length == 0 ) return null; + key = XByteBuffer.deserialize(keydata,0,keydata.length,cls); + return key; + } + + public byte[] getKeyData() { + return keydata; + } + public Serializable getValue() { + try { + return value(null); + } catch ( Exception x ) { + log.error("Deserialization error of the MapMessage.value",x); + return null; + } + } + + public Serializable value(ClassLoader[] cls) throws IOException, ClassNotFoundException { + if ( value!=null ) return value; + if ( valuedata == null || valuedata.length == 0 ) return null; + value = XByteBuffer.deserialize(valuedata,0,valuedata.length,cls); return value; } + + public byte[] getValueData() { + return valuedata; + } public byte[] getDiffValue() { return diffvalue; @@ -735,6 +774,12 @@ } return members; } + + protected byte[] readBytes(ObjectInput in) throws IOException { + byte[] data = new byte[in.readInt()]; + in.read(data); + return data; + } public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException { mapId = new byte[in.readInt()]; @@ -744,27 +789,26 @@ case MSG_BACKUP: case MSG_STATE: { diff = in.readBoolean(); - key = (Serializable) in.readObject(); + keydata = readBytes(in); if (diff) { - diffvalue = new byte[in.readInt()]; - in.read(diffvalue); + diffvalue = readBytes(in); } else { - value = (Serializable) in.readObject(); + valuedata = readBytes(in); } //endif nodes = readMembers(in); break; } case MSG_RETRIEVE_BACKUP: { - key = (Serializable) in.readObject(); - value = (Serializable) in.readObject(); + keydata = readBytes(in); + valuedata = readBytes(in); break; } case MSG_REMOVE: { - key = (Serializable) in.readObject(); + keydata = readBytes(in); break; } case MSG_PROXY: { - key = (Serializable) in.readObject(); + keydata = readBytes(in); this.nodes = readMembers(in); break; } @@ -772,8 +816,7 @@ case MSG_STOP: { nodes = readMembers(in); break; - } - + } } //switch } //readExternal @@ -789,6 +832,16 @@ } } + protected void writeBytes(ObjectOutput out, byte[] data) throws IOException { + out.writeInt(data.length); + out.write(data); + } + + protected void writeObject(ObjectOutput out, Serializable o) throws IOException { + byte[] data = XByteBuffer.serialize(o); + writeBytes(out,data); + } + public void writeExternal(ObjectOutput out) throws IOException { out.writeInt(mapId.length); out.write(mapId); @@ -797,27 +850,27 @@ case MSG_BACKUP: case MSG_STATE: { out.writeBoolean(diff); - out.writeObject(key); + writeObject(out,key); if (diff) { out.writeInt(diffvalue.length); out.write(diffvalue); } else { - out.writeObject(value); + writeObject(out,value); } //endif writeMembers(out,nodes); break; } case MSG_RETRIEVE_BACKUP: { - out.writeObject(key); - out.writeObject(value); + writeObject(out,key); + writeObject(out,value); break; } case MSG_REMOVE: { - out.writeObject(key); + writeObject(out,key); break; } case MSG_PROXY: { - out.writeObject(key); + writeObject(out,key); writeMembers(out,nodes); break; } @@ -834,7 +887,10 @@ * @return Object */ public Object clone() { - return new MapMessage(this.mapId, this.msgtype, this.diff, this.key, this.value, this.diffvalue, this.nodes); + MapMessage msg = new MapMessage(this.mapId, this.msgtype, this.diff, this.key, this.value, this.diffvalue, this.nodes); + msg.keydata = this.keydata; + msg.valuedata = this.valuedata; + return msg; } } //MapMessage @@ -867,8 +923,16 @@ return mapOwner; } - public void setMapOwner(MapOwner mapOwner) { + public ClassLoader[] getExternalLoaders() { + return externalLoaders; + } + + public void setMapOwner(Object mapOwner) { this.mapOwner = mapOwner; + } + + public void setExternalLoaders(ClassLoader[] externalLoaders) { + this.externalLoaders = externalLoaders; } } Modified: tomcat/container/tc5.5.x/modules/groupcom/src/share/org/apache/catalina/tribes/tipis/LazyReplicatedMap.java URL: http://svn.apache.org/viewcvs/tomcat/container/tc5.5.x/modules/groupcom/src/share/org/apache/catalina/tribes/tipis/LazyReplicatedMap.java?rev=387872&r1=387871&r2=387872&view=diff ============================================================================== --- tomcat/container/tc5.5.x/modules/groupcom/src/share/org/apache/catalina/tribes/tipis/LazyReplicatedMap.java (original) +++ tomcat/container/tc5.5.x/modules/groupcom/src/share/org/apache/catalina/tribes/tipis/LazyReplicatedMap.java Wed Mar 22 07:14:44 2006 @@ -29,7 +29,6 @@ import org.apache.catalina.tribes.ChannelListener; import org.apache.catalina.tribes.Member; import org.apache.catalina.tribes.MembershipListener; -import org.apache.catalina.tribes.tipis.AbstractReplicatedMap.MapOwner; /** * A smart implementation of a stateful replicated map. uses primary/secondary backup strategy. @@ -85,7 +84,7 @@ * @param initialCapacity int - the size of this map, see HashMap * @param loadFactor float - load factor, see HashMap */ - public LazyReplicatedMap(MapOwner owner, Channel channel, long timeout, String mapContextName, int initialCapacity, float loadFactor) { + public LazyReplicatedMap(Object owner, Channel channel, long timeout, String mapContextName, int initialCapacity, float loadFactor) { super(owner,channel,timeout,mapContextName,initialCapacity,loadFactor, Channel.SEND_OPTIONS_DEFAULT); } @@ -96,7 +95,7 @@ * @param mapContextName String - unique name for this map, to allow multiple maps per channel * @param initialCapacity int - the size of this map, see HashMap */ - public LazyReplicatedMap(MapOwner owner, Channel channel, long timeout, String mapContextName, int initialCapacity) { + public LazyReplicatedMap(Object owner, Channel channel, long timeout, String mapContextName, int initialCapacity) { super(owner, channel,timeout,mapContextName,initialCapacity, LazyReplicatedMap.DEFAULT_LOAD_FACTOR, Channel.SEND_OPTIONS_DEFAULT); } @@ -106,7 +105,7 @@ * @param timeout long - timeout for RPC messags * @param mapContextName String - unique name for this map, to allow multiple maps per channel */ - public LazyReplicatedMap(MapOwner owner, Channel channel, long timeout, String mapContextName) { + public LazyReplicatedMap(Object owner, Channel channel, long timeout, String mapContextName) { super(owner, channel,timeout,mapContextName, LazyReplicatedMap.DEFAULT_INITIAL_CAPACITY,LazyReplicatedMap.DEFAULT_LOAD_FACTOR,Channel.SEND_OPTIONS_DEFAULT); } @@ -143,19 +142,15 @@ } public Object get(Object key) { - System.out.println("Getting session id:"+key); - printMap(); MapEntry entry = (MapEntry)super.get(key); 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 - System.out.println("Retrieving from remote session id:"+key); 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()); @@ -228,7 +223,6 @@ log.error("Unable to replicate out data for a LazyReplicatedMap.put operation", x); } super.put(key,entry); - printMap(); return old; } Modified: tomcat/container/tc5.5.x/modules/groupcom/src/share/org/apache/catalina/tribes/tipis/ReplicatedMap.java URL: http://svn.apache.org/viewcvs/tomcat/container/tc5.5.x/modules/groupcom/src/share/org/apache/catalina/tribes/tipis/ReplicatedMap.java?rev=387872&r1=387871&r2=387872&view=diff ============================================================================== --- tomcat/container/tc5.5.x/modules/groupcom/src/share/org/apache/catalina/tribes/tipis/ReplicatedMap.java (original) +++ tomcat/container/tc5.5.x/modules/groupcom/src/share/org/apache/catalina/tribes/tipis/ReplicatedMap.java Wed Mar 22 07:14:44 2006 @@ -29,7 +29,6 @@ import org.apache.catalina.tribes.ChannelListener; import org.apache.catalina.tribes.Member; import org.apache.catalina.tribes.MembershipListener; -import org.apache.catalina.tribes.tipis.AbstractReplicatedMap.MapOwner; /** * All-to-all replication for a hash map implementation. Each node in the cluster will carry an identical @@ -67,7 +66,7 @@ * @param initialCapacity int - the size of this map, see HashMap * @param loadFactor float - load factor, see HashMap */ - public ReplicatedMap(MapOwner owner, Channel channel, long timeout, String mapContextName, int initialCapacity,float loadFactor) { + public ReplicatedMap(Object owner, Channel channel, long timeout, String mapContextName, int initialCapacity,float loadFactor) { super(owner,channel, timeout, mapContextName, initialCapacity, loadFactor, Channel.SEND_OPTIONS_DEFAULT); } @@ -78,7 +77,7 @@ * @param mapContextName String - unique name for this map, to allow multiple maps per channel * @param initialCapacity int - the size of this map, see HashMap */ - public ReplicatedMap(MapOwner owner, Channel channel, long timeout, String mapContextName, int initialCapacity) { + public ReplicatedMap(Object owner, Channel channel, long timeout, String mapContextName, int initialCapacity) { super(owner,channel, timeout, mapContextName, initialCapacity, AbstractReplicatedMap.DEFAULT_LOAD_FACTOR,Channel.SEND_OPTIONS_DEFAULT); } @@ -88,7 +87,7 @@ * @param timeout long - timeout for RPC messags * @param mapContextName String - unique name for this map, to allow multiple maps per channel */ - public ReplicatedMap(MapOwner owner, Channel channel, long timeout, String mapContextName) { + public ReplicatedMap(Object owner, Channel channel, long timeout, String mapContextName) { super(owner, channel, timeout, mapContextName,AbstractReplicatedMap.DEFAULT_INITIAL_CAPACITY, AbstractReplicatedMap.DEFAULT_LOAD_FACTOR, Channel.SEND_OPTIONS_DEFAULT); } Modified: tomcat/container/tc5.5.x/modules/ha/src/share/org/apache/catalina/ha/session/BackupManager.java URL: http://svn.apache.org/viewcvs/tomcat/container/tc5.5.x/modules/ha/src/share/org/apache/catalina/ha/session/BackupManager.java?rev=387872&r1=387871&r2=387872&view=diff ============================================================================== --- tomcat/container/tc5.5.x/modules/ha/src/share/org/apache/catalina/ha/session/BackupManager.java (original) +++ tomcat/container/tc5.5.x/modules/ha/src/share/org/apache/catalina/ha/session/BackupManager.java Wed Mar 22 07:14:44 2006 @@ -133,6 +133,19 @@ public Session createEmptySession() { return new DeltaSession(this); } + + public ClassLoader[] getClassLoaders() { + Loader loader = null; + ClassLoader classLoader = null; + if (container != null) loader = container.getLoader(); + if (loader != null) classLoader = loader.getClassLoader(); + else classLoader = Thread.currentThread().getContextClassLoader(); + if ( classLoader == Thread.currentThread().getContextClassLoader() ) { + return new ClassLoader[] {classLoader}; + } else { + return new ClassLoader[] {classLoader,Thread.currentThread().getContextClassLoader()}; + } + } /** * Open Stream and use correct ClassLoader (Container) Switch @@ -147,24 +160,8 @@ } public ReplicationStream getReplicationStream(byte[] data, int offset, int length) throws IOException { - ByteArrayInputStream fis =null; - ReplicationStream ois = null; - Loader loader = null; - ClassLoader classLoader = null; - //fix to be able to run the DeltaManager - //stand alone without a container. - //use the Threads context class loader - if (container != null) loader = container.getLoader(); - if (loader != null) classLoader = loader.getClassLoader(); - else classLoader = Thread.currentThread().getContextClassLoader(); - //end fix - fis = new ByteArrayInputStream(data, offset, length); - if ( classLoader == Thread.currentThread().getContextClassLoader() ) { - ois = new ReplicationStream(fis, new ClassLoader[] {classLoader}); - } else { - ois = new ReplicationStream(fis, new ClassLoader[] {classLoader,Thread.currentThread().getContextClassLoader()}); - } - return ois; + ByteArrayInputStream fis = new ByteArrayInputStream(data, offset, length); + return new ReplicationStream(fis, getClassLoaders()); } @@ -186,16 +183,15 @@ */ public void start() throws LifecycleException { if ( this.started ) return; - - - //start the javagroups channel try { CatalinaCluster catclust = (CatalinaCluster)cluster; catclust.addManager(getName(), this); - this.sessions = new LazyReplicatedMap(this, - catclust.getChannel(), - DEFAULT_REPL_TIMEOUT, - getMapName()); + LazyReplicatedMap map = new LazyReplicatedMap(this, + catclust.getChannel(), + DEFAULT_REPL_TIMEOUT, + getMapName()); + map.setExternalLoaders(getClassLoaders()); + this.sessions = map; super.start(); } catch ( Exception x ) { log.error("Unable to start BackupManager",x); Modified: tomcat/container/tc5.5.x/modules/ha/src/share/org/apache/catalina/ha/session/ClusterManagerBase.java URL: http://svn.apache.org/viewcvs/tomcat/container/tc5.5.x/modules/ha/src/share/org/apache/catalina/ha/session/ClusterManagerBase.java?rev=387872&r1=387871&r2=387872&view=diff ============================================================================== --- tomcat/container/tc5.5.x/modules/ha/src/share/org/apache/catalina/ha/session/ClusterManagerBase.java (original) +++ tomcat/container/tc5.5.x/modules/ha/src/share/org/apache/catalina/ha/session/ClusterManagerBase.java Wed Mar 22 07:14:44 2006 @@ -32,6 +32,20 @@ */ public abstract class ClusterManagerBase extends ManagerBase implements Lifecycle, PropertyChangeListener, ClusterManager{ + + public ClassLoader[] getClassLoaders() { + Loader loader = null; + ClassLoader classLoader = null; + if (container != null) loader = container.getLoader(); + if (loader != null) classLoader = loader.getClassLoader(); + else classLoader = Thread.currentThread().getContextClassLoader(); + if ( classLoader == Thread.currentThread().getContextClassLoader() ) { + return new ClassLoader[] {classLoader}; + } else { + return new ClassLoader[] {classLoader,Thread.currentThread().getContextClassLoader()}; + } + } + /** * Open Stream and use correct ClassLoader (Container) Switch * ThreadClassLoader @@ -45,27 +59,9 @@ } public ReplicationStream getReplicationStream(byte[] data, int offset, int length) throws IOException { - ByteArrayInputStream fis =null; - ReplicationStream ois = null; - Loader loader = null; - ClassLoader classLoader = null; - //fix to be able to run the DeltaManager - //stand alone without a container. - //use the Threads context class loader - if (container != null) - loader = container.getLoader(); - if (loader != null) - classLoader = loader.getClassLoader(); - else - classLoader = Thread.currentThread().getContextClassLoader(); - //end fix - fis = new ByteArrayInputStream(data,offset,length); - if ( classLoader == Thread.currentThread().getContextClassLoader() ) { - ois = new ReplicationStream(fis, new ClassLoader[] {classLoader}); - } else { - ois = new ReplicationStream(fis, new ClassLoader[] {classLoader,Thread.currentThread().getContextClassLoader()}); - } - return ois; + ByteArrayInputStream fis = new ByteArrayInputStream(data, offset, length); + return new ReplicationStream(fis, getClassLoaders()); } + } Modified: tomcat/container/tc5.5.x/modules/ha/src/share/org/apache/catalina/ha/session/DeltaSession.java URL: http://svn.apache.org/viewcvs/tomcat/container/tc5.5.x/modules/ha/src/share/org/apache/catalina/ha/session/DeltaSession.java?rev=387872&r1=387871&r2=387872&view=diff ============================================================================== --- tomcat/container/tc5.5.x/modules/ha/src/share/org/apache/catalina/ha/session/DeltaSession.java (original) +++ tomcat/container/tc5.5.x/modules/ha/src/share/org/apache/catalina/ha/session/DeltaSession.java Wed Mar 22 07:14:44 2006 @@ -336,7 +336,6 @@ public void setOwner(Object owner) { if ( owner instanceof ClusterManager && getManager()==null) { - System.out.println("Setting owner for session:"+getIdInternal()+" to:"+owner); ClusterManager cm = (ClusterManager)owner; this.setManager(cm); this.setValid(true); --------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]