You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@tomcat.apache.org by Rainer Jung <ra...@kippdata.de> on 2006/06/29 12:38:32 UTC
Re: svn commit: r417959 - in /tomcat/container/tc5.5.x/modules/groupcom:
./ src/share/org/apache/catalina/tribes/ src/share/org/apache/catalina/tribes/group/interceptors/
src/share/org/apache/catalina/tribes/membership/
Maybe this
http://www.apache.org/dev/svn-eol-style.txt
will help?
Filip Hanik - Dev Lists schrieb:
> gee, this is the second time this happened to me.
> my IDE is set to preserve line endings, do I need to setup some
> subversion property?
>
> Filip
>
>
> Jean-frederic Clere wrote:
>> Hi,
>>
>> Try to prevent CR/LF conversion when you commit... Hard to find what
>> was changed in MemberImpl.java :-(
>>
>> Cheers
>>
>> Jean-Frederic
>>
>> fhanik@apache.org wrote:
>>
>>> Author: fhanik
>>> Date: Thu Jun 29 01:33:29 2006
>>> New Revision: 417959
>>>
>>> URL: http://svn.apache.org/viewvc?rev=417959&view=rev
>>> Log:
>>> Added Member.getCommand, so that we don't have to piggyback on
>>> application payload to transfer internal tribes commands
>>>
>>> Modified:
>>> tomcat/container/tc5.5.x/modules/groupcom/VERSION
>>>
>>> tomcat/container/tc5.5.x/modules/groupcom/src/share/org/apache/catalina/tribes/Member.java
>>>
>>>
>>> tomcat/container/tc5.5.x/modules/groupcom/src/share/org/apache/catalina/tribes/group/interceptors/TcpFailureDetector.java
>>>
>>>
>>> tomcat/container/tc5.5.x/modules/groupcom/src/share/org/apache/catalina/tribes/membership/McastServiceImpl.java
>>>
>>>
>>> tomcat/container/tc5.5.x/modules/groupcom/src/share/org/apache/catalina/tribes/membership/MemberImpl.java
>>>
>>>
>>> Modified: tomcat/container/tc5.5.x/modules/groupcom/VERSION
>>> URL:
>>> http://svn.apache.org/viewvc/tomcat/container/tc5.5.x/modules/groupcom/VERSION?rev=417959&r1=417958&r2=417959&view=diff
>>>
>>> ==============================================================================
>>>
>>> --- tomcat/container/tc5.5.x/modules/groupcom/VERSION (original)
>>> +++ tomcat/container/tc5.5.x/modules/groupcom/VERSION Thu Jun 29
>>> 01:33:29 2006
>>> @@ -1,3 +1,5 @@
>>> +0.9.3.3
>>> + - Added Member.getCommand, to separate out internal tribes logic
>>> from application payload
>>> 0.9.3.2
>>> - MemberImpl.toString has a limit on the size it prints out
>>> 0.9.3.1
>>>
>>> Modified:
>>> tomcat/container/tc5.5.x/modules/groupcom/src/share/org/apache/catalina/tribes/Member.java
>>>
>>> URL:
>>> http://svn.apache.org/viewvc/tomcat/container/tc5.5.x/modules/groupcom/src/share/org/apache/catalina/tribes/Member.java?rev=417959&r1=417958&r2=417959&view=diff
>>>
>>> ==============================================================================
>>>
>>> ---
>>> tomcat/container/tc5.5.x/modules/groupcom/src/share/org/apache/catalina/tribes/Member.java
>>> (original)
>>> +++
>>> tomcat/container/tc5.5.x/modules/groupcom/src/share/org/apache/catalina/tribes/Member.java
>>> Thu Jun 29 01:33:29 2006
>>> @@ -95,4 +95,9 @@
>>> */
>>> public byte[] getPayload();
>>> + /**
>>> + * returns the command associated with this member
>>> + * @return byte[]
>>> + */
>>> + public byte[] getCommand();
>>> }
>>>
>>> Modified:
>>> tomcat/container/tc5.5.x/modules/groupcom/src/share/org/apache/catalina/tribes/group/interceptors/TcpFailureDetector.java
>>>
>>> URL:
>>> http://svn.apache.org/viewvc/tomcat/container/tc5.5.x/modules/groupcom/src/share/org/apache/catalina/tribes/group/interceptors/TcpFailureDetector.java?rev=417959&r1=417958&r2=417959&view=diff
>>>
>>> ==============================================================================
>>>
>>> ---
>>> tomcat/container/tc5.5.x/modules/groupcom/src/share/org/apache/catalina/tribes/group/interceptors/TcpFailureDetector.java
>>> (original)
>>> +++
>>> tomcat/container/tc5.5.x/modules/groupcom/src/share/org/apache/catalina/tribes/group/interceptors/TcpFailureDetector.java
>>> Thu Jun 29 01:33:29 2006
>>> @@ -135,7 +135,7 @@
>>> public void memberDisappeared(Member member) {
>>> if ( membership == null ) setupMembership();
>>> boolean notify = false;
>>> - boolean shutdown =
>>> Arrays.equals(member.getPayload(),Member.SHUTDOWN_PAYLOAD);
>>> + boolean shutdown =
>>> Arrays.equals(member.getCommand(),Member.SHUTDOWN_PAYLOAD);
>>> if ( !shutdown ) log.info("Received
>>> memberDisappeared["+member+"] message. Will verify.");
>>> synchronized (membership) {
>>> //check to see if the member really is gone
>>> @@ -245,7 +245,7 @@
>>> long readTimeout, long
>>> conTimeout,
>>> int optionFlag) {
>>> //could be a shutdown notification
>>> - if ( Arrays.equals(mbr.getPayload(),Member.SHUTDOWN_PAYLOAD)
>>> ) return false;
>>> + if ( Arrays.equals(mbr.getCommand(),Member.SHUTDOWN_PAYLOAD)
>>> ) return false;
>>> Socket socket = new Socket(); try {
>>>
>>> Modified:
>>> tomcat/container/tc5.5.x/modules/groupcom/src/share/org/apache/catalina/tribes/membership/McastServiceImpl.java
>>>
>>> URL:
>>> http://svn.apache.org/viewvc/tomcat/container/tc5.5.x/modules/groupcom/src/share/org/apache/catalina/tribes/membership/McastServiceImpl.java?rev=417959&r1=417958&r2=417959&view=diff
>>>
>>> ==============================================================================
>>>
>>> ---
>>> tomcat/container/tc5.5.x/modules/groupcom/src/share/org/apache/catalina/tribes/membership/McastServiceImpl.java
>>> (original)
>>> +++
>>> tomcat/container/tc5.5.x/modules/groupcom/src/share/org/apache/catalina/tribes/membership/McastServiceImpl.java
>>> Thu Jun 29 01:33:29 2006
>>> @@ -255,12 +255,10 @@
>>> //we're shutting down, send a shutdown message and close the
>>> socket
>>> if ( startLevel == 0 ) {
>>> //send a stop message
>>> - byte[] payload = member.getPayload();
>>> - member.setPayload(Member.SHUTDOWN_PAYLOAD);
>>> + member.setCommand(Member.SHUTDOWN_PAYLOAD);
>>> member.getData(true, true);
>>> send(false);
>>> //restore payload
>>> - member.setPayload(payload);
>>> member.getData(true, true);
>>> //leave mcast group
>>> try {socket.leaveGroup(address);}catch ( Exception ignore){}
>>> @@ -282,7 +280,7 @@
>>> if (log.isDebugEnabled())
>>> log.debug("Mcast receive ping from member " + m);
>>> Thread t = null;
>>> - if (Arrays.equals(m.getPayload(),
>>> Member.SHUTDOWN_PAYLOAD)) {
>>> + if (Arrays.equals(m.getCommand(),
>>> Member.SHUTDOWN_PAYLOAD)) {
>>> if (log.isDebugEnabled()) log.debug("Member has
>>> shutdown:" + m);
>>> membership.removeMember(m);
>>> t = new Thread() {
>>>
>>> Modified:
>>> tomcat/container/tc5.5.x/modules/groupcom/src/share/org/apache/catalina/tribes/membership/MemberImpl.java
>>>
>>> URL:
>>> http://svn.apache.org/viewvc/tomcat/container/tc5.5.x/modules/groupcom/src/share/org/apache/catalina/tribes/membership/MemberImpl.java?rev=417959&r1=417958&r2=417959&view=diff
>>>
>>> ==============================================================================
>>>
>>> ---
>>> tomcat/container/tc5.5.x/modules/groupcom/src/share/org/apache/catalina/tribes/membership/MemberImpl.java
>>> (original)
>>> +++
>>> tomcat/container/tc5.5.x/modules/groupcom/src/share/org/apache/catalina/tribes/membership/MemberImpl.java
>>> Thu Jun 29 01:33:29 2006
>>> @@ -1,433 +1,462 @@
>>> -/*
>>> - * Copyright 1999,2004-2005 The Apache Software Foundation.
>>> - * - * Licensed under the Apache License, Version 2.0 (the "License");
>>> - * you may not use this file except in compliance with the License.
>>> - * You may obtain a copy of the License at
>>> - * - * http://www.apache.org/licenses/LICENSE-2.0
>>> - * - * Unless required by applicable law or agreed to in writing,
>>> software
>>> - * distributed under the License is distributed on an "AS IS" BASIS,
>>> - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
>>> implied.
>>> - * See the License for the specific language governing permissions and
>>> - * limitations under the License.
>>> - */
>>> -
>>> -package org.apache.catalina.tribes.membership;
>>> -
>>> -import java.io.IOException;
>>> -import java.io.ObjectInput;
>>> -import java.io.ObjectOutput;
>>> -import java.util.Arrays;
>>> -
>>> -import org.apache.catalina.tribes.Member;
>>> -import org.apache.catalina.tribes.io.XByteBuffer;
>>> -import org.apache.catalina.tribes.transport.SenderState;
>>> -
>>> -/**
>>> - * A <b>membership</b> implementation using simple multicast.
>>> - * This is the representation of a multicast member.
>>> - * Carries the host, and port of the this or other cluster nodes.
>>> - *
>>> - * @author Filip Hanik
>>> - * @version $Revision: 304032 $, $Date: 2005-07-27 10:11:55 -0500
>>> (Wed, 27 Jul 2005) $
>>> - */
>>> -public class MemberImpl implements Member, java.io.Externalizable {
>>> -
>>> - /**
>>> - * Public properties specific to this implementation
>>> - */
>>> - public static final transient String TCP_LISTEN_PORT =
>>> "tcpListenPort";
>>> - public static final transient String TCP_LISTEN_HOST =
>>> "tcpListenHost";
>>> - public static final transient String MEMBER_NAME = "memberName";
>>> - - /**
>>> - * The listen host for this member
>>> - */
>>> - protected byte[] host;
>>> - protected transient String hostname;
>>> - /**
>>> - * The tcp listen port for this member
>>> - */
>>> - protected int port;
>>> -
>>> - /**
>>> - * Counter for how many broadcast messages have been sent from
>>> this member
>>> - */
>>> - protected int msgCount = 0;
>>> - /**
>>> - * The number of milliseconds since this members was
>>> - * created, is kept track of using the start time
>>> - */
>>> - protected long memberAliveTime = 0;
>>> - - /**
>>> - * For the local member only
>>> - */
>>> - protected transient long serviceStartTime;
>>> - - /**
>>> - * To avoid serialization over and over again, once the local
>>> dataPkg
>>> - * has been set, we use that to transmit data
>>> - */
>>> - protected transient byte[] dataPkg = null;
>>> -
>>> - /**
>>> - * Unique session Id for this member
>>> - */
>>> - protected byte[] uniqueId = new byte[16];
>>> - - /**
>>> - * Custom payload that an app framework can broadcast
>>> - * Also used to transport stop command.
>>> - */
>>> - protected byte[] payload = new byte[0];
>>> -
>>> - /**
>>> - * Empty constructor for serialization
>>> - */
>>> - public MemberImpl() {
>>> - - }
>>> -
>>> - /**
>>> - * Construct a new member object
>>> - * @param name - the name of this member, cluster unique
>>> - * @param domain - the cluster domain name of this member
>>> - * @param host - the tcp listen host
>>> - * @param port - the tcp listen port
>>> - */
>>> - public MemberImpl(String host,
>>> - int port,
>>> - long aliveTime) throws IOException {
>>> - setHostname(host);
>>> - this.port = port;
>>> - this.memberAliveTime=aliveTime;
>>> - }
>>> - - public MemberImpl(String host,
>>> - int port,
>>> - long aliveTime,
>>> - byte[] payload) throws IOException {
>>> - this(host,port,aliveTime);
>>> - setPayload(payload);
>>> - }
>>> - - public boolean isReady() {
>>> - return SenderState.getSenderState(this).isReady();
>>> - }
>>> - public boolean isSuspect() {
>>> - return SenderState.getSenderState(this).isSuspect();
>>> - }
>>> - public boolean isFailing() {
>>> - return SenderState.getSenderState(this).isFailing();
>>> - }
>>> -
>>> - /**
>>> - * Increment the message count.
>>> - */
>>> - protected void inc() {
>>> - msgCount++;
>>> - }
>>> -
>>> - /**
>>> - * Create a data package to send over the wire representing this
>>> member.
>>> - * This is faster than serialization.
>>> - * @return - the bytes for this member deserialized
>>> - * @throws Exception
>>> - */
>>> - public byte[] getData() {
>>> - return getData(true);
>>> - }
>>> - /**
>>> - * Highly optimized version of serializing a member into a byte
>>> array
>>> - * Returns a cached byte[] reference, do not modify this data
>>> - * @param getalive boolean
>>> - * @return byte[]
>>> - */
>>> - public byte[] getData(boolean getalive) {
>>> - return getData(getalive,false);
>>> - }
>>> - - - public int getDataLength() {
>>> - return 8+4+1+host.length+16+4+payload.length;
>>> - }
>>> - - /**
>>> - * - * @param getalive boolean - calculate memberAlive time
>>> - * @param reset boolean - reset the cached data package, and
>>> create a new one
>>> - * @return byte[]
>>> - */
>>> - public byte[] getData(boolean getalive, boolean reset) {
>>> - if ( reset ) dataPkg = null;
>>> - //look in cache first
>>> - if ( dataPkg!=null ) {
>>> - if ( getalive ) {
>>> - //you'd be surprised, but System.currentTimeMillis
>>> - //shows up on the profiler
>>> - long
>>> alive=System.currentTimeMillis()-getServiceStartTime();
>>> - XByteBuffer.toBytes( (long) alive, dataPkg, 0);
>>> - }
>>> - return dataPkg;
>>> - }
>>> - - //package looks like
>>> - //alive - 8 bytes
>>> - //port - 4 bytes
>>> - //host length - 1 byte
>>> - //host - hl bytes
>>> - //dlen - 4 bytes
>>> - //domain - dlen bytes
>>> - //uniqueId - 16 bytes
>>> - //payload length - 4 bytes
>>> - //payload plen bytes
>>> - byte[] addr = host;
>>> - long alive=System.currentTimeMillis()-getServiceStartTime();
>>> - byte hl = (byte)addr.length;
>>> - byte[] data = new byte[getDataLength()];
>>> - int pos = 0;
>>> - //alive data
>>> - XByteBuffer.toBytes((long)alive,data,0);
>>> - pos += 8;
>>> - //port
>>> - XByteBuffer.toBytes(port,data,pos);
>>> - pos += 4;
>>> - //host length
>>> - data[pos++] = hl;
>>> - //host
>>> - System.arraycopy(addr,0,data,pos,addr.length);
>>> - pos+=addr.length;
>>> - //unique Id
>>> - System.arraycopy(uniqueId,0,data,pos,uniqueId.length);
>>> - pos+=uniqueId.length;
>>> - //payload
>>> - XByteBuffer.toBytes(payload.length,data,pos);
>>> - pos+=4;
>>> - System.arraycopy(payload,0,data,pos,payload.length);
>>> - pos+=payload.length;
>>> -
>>> - //create local data
>>> - dataPkg = data;
>>> - return data;
>>> - }
>>> - /**
>>> - * Deserializes a member from data sent over the wire
>>> - * @param data - the bytes received
>>> - * @return a member object.
>>> - */
>>> - public static MemberImpl getMember(byte[] data, MemberImpl
>>> member) {
>>> - //package looks like
>>> - //alive - 8 bytes
>>> - //port - 4 bytes
>>> - //host length - 1 byte
>>> - //host - hl bytes
>>> - //uniqueId - 16 bytes
>>> - //payload length - 4bytes
>>> - //payload - pl bytes
>>> - int pos = 0;
>>> -
>>> - byte[] alived = new byte[8];
>>> - System.arraycopy(data, pos, alived, 0, 8);
>>> - pos+=8;
>>> - byte[] portd = new byte[4];
>>> - System.arraycopy(data, pos, portd, 0, 4);
>>> - pos+=4;
>>> - - byte hl = data[pos++];
>>> - byte[] addr = new byte[hl];
>>> - System.arraycopy(data, pos, addr, 0, hl);
>>> - pos+=hl;
>>> - - byte[] uniqueId = new byte[16];
>>> - System.arraycopy(data, pos, uniqueId, 0, 16);
>>> - pos+=16;
>>> - - int pl = XByteBuffer.toInt(data,pos);
>>> - pos+=4;
>>> - - byte[] payload = new byte[pl];
>>> - System.arraycopy(data, pos, payload, 0, payload.length);
>>> - pos+=payload.length;
>>> - - member.setHost(addr);
>>> - member.setPort(XByteBuffer.toInt(portd, 0));
>>> - member.setMemberAliveTime(XByteBuffer.toLong(alived, 0));
>>> - member.setUniqueId(uniqueId);
>>> - member.payload = payload;
>>> - - member.dataPkg = new byte[data.length];
>>> - System.arraycopy(data,0,member.dataPkg,0,data.length);
>>> - - return member;
>>> - }
>>> -
>>> - public static MemberImpl getMember(byte[] data) {
>>> - return getMember(data,new MemberImpl());
>>> - }
>>> -
>>> - /**
>>> - * Return the name of this object
>>> - * @return a unique name to the cluster
>>> - */
>>> - public String getName() {
>>> - return "tcp://"+getHostname()+":"+getPort();
>>> - }
>>> - - /**
>>> - * Return the listen port of this member
>>> - * @return - tcp listen port
>>> - */
>>> - public int getPort() {
>>> - return this.port;
>>> - }
>>> -
>>> - /**
>>> - * Return the TCP listen host for this member
>>> - * @return IP address or host name
>>> - */
>>> - public byte[] getHost() {
>>> - return host;
>>> - }
>>> - - public String getHostname() {
>>> - if ( this.hostname != null ) return hostname;
>>> - else {
>>> - try {
>>> - this.hostname =
>>> java.net.InetAddress.getByAddress(host).getHostName();
>>> - return this.hostname;
>>> - }catch ( IOException x ) {
>>> - throw new RuntimeException("Unable to parse
>>> hostname.",x);
>>> - }
>>> - }
>>> - }
>>> -
>>> - /**
>>> - * Contains information on how long this member has been online.
>>> - * The result is the number of milli seconds this member has been
>>> - * broadcasting its membership to the cluster.
>>> - * @return nr of milliseconds since this member started.
>>> - */
>>> - public long getMemberAliveTime() {
>>> - return memberAliveTime;
>>> - }
>>> -
>>> - public long getServiceStartTime() {
>
>>> - return serviceStartTime;
>>> - }
>>> -
>>> - public byte[] getUniqueId() {
>>> - return uniqueId;
>>> - }
>>> -
>>> - public byte[] getPayload() {
>>> - return payload;
>>> - }
>>> -
>>> - public void setMemberAliveTime(long time) {
>>> - memberAliveTime=time;
>>> - }
>>> -
>>> -
>>> -
>>> - /**
>>> - * String representation of this object
>>> - */
>>> - public String toString() {
>>> - StringBuffer buf = new
>>> StringBuffer("org.apache.catalina.tribes.membership.MemberImpl[");
>>> - buf.append(getName()).append(",");
>>> - buf.append(getHostname()).append(",");
>>> - buf.append(port).append(", alive=");
>>> - buf.append(memberAliveTime).append(",");
>>> - buf.append("id=").append(bToS(this.uniqueId)).append(", ");
>>> -
>>> buf.append("payload=").append(bToS(this.payload,5)).append(", ");
>>> - buf.append("]");
>>> - return buf.toString();
>>> - }
>>> - public static String bToS(byte[] data) {
>>> - return bToS(data,data.length);
>>> - }
>>> - public static String bToS(byte[] data, int max) {
>>> - StringBuffer buf = new StringBuffer(4*16);
>>> - buf.append("{");
>>> - for (int i=0; data!=null && i<data.length; i++ ) {
>>> - buf.append(String.valueOf(data[i])).append(" ");
>>> - if ( i==max ) {
>>> - buf.append("...");
>>> - break;
>>> - }
>>> - }
>>> - buf.append("}");
>>> - return buf.toString();
>>> - }
>>> -
>>> - /**
>>> - * @see java.lang.Object#hashCode()
>>> - * @return The hash code
>>> - */
>>> - public int hashCode() {
>>> - return getHost()[0]+getHost()[1]+getHost()[2]+getHost()[3];
>>> - }
>>> -
>>> - /**
>>> - * Returns true if the param o is a McastMember with the same name
>>> - * @param o
>>> - */
>>> - public boolean equals(Object o) {
>>> - if ( o instanceof MemberImpl ) {
>>> - return
>>> Arrays.equals(this.getHost(),((MemberImpl)o).getHost()) &&
>>> - this.getPort() == ((MemberImpl)o).getPort() &&
>>> -
>>> Arrays.equals(this.getUniqueId(),((MemberImpl)o).getUniqueId());
>>> - }
>>> - else
>>> - return false;
>>> - }
>>> - - public void setHost(byte[] host) {
>>> - this.host = host;
>>> - }
>>> - - public void setHostname(String host) throws IOException {
>>> - hostname = host;
>>> - this.host = java.net.InetAddress.getByName(host).getAddress();
>>> - }
>>> - - public void setMsgCount(int msgCount) {
>>> - this.msgCount = msgCount;
>>> - }
>>> -
>>> - public void setPort(int port) {
>>> - this.port = port;
>>> - this.dataPkg = null;
>>> - }
>>> -
>>> - public void setServiceStartTime(long serviceStartTime) {
>>> - this.serviceStartTime = serviceStartTime;
>>> - }
>>> -
>>> - public void setUniqueId(byte[] uniqueId) {
>>> - this.uniqueId = uniqueId;
>>> - }
>>> -
>>> - public void setPayload(byte[] payload) {
>>> - this.payload = payload;
>>> - getData(true,true);
>>> - }
>>> -
>>> - public void readExternal(ObjectInput in) throws IOException,
>>> ClassNotFoundException {
>>> - int length = in.readInt();
>>> - byte[] message = new byte[length];
>>> - in.read(message);
>>> - getMember(message,this);
>>> - - }
>>> -
>>> - public void writeExternal(ObjectOutput out) throws IOException {
>>> - byte[] data = this.getData();
>>> - out.writeInt(data.length);
>>> - out.write(data);
>>> - }
>>> - -}
>>> +/*
>>> + * Copyright 1999,2004-2005 The Apache Software Foundation.
>>> + * + * Licensed under the Apache License, Version 2.0 (the "License");
>>> + * you may not use this file except in compliance with the License.
>>> + * You may obtain a copy of the License at
>>> + * + * http://www.apache.org/licenses/LICENSE-2.0
>>> + * + * Unless required by applicable law or agreed to in writing,
>>> software
>>> + * distributed under the License is distributed on an "AS IS" BASIS,
>>> + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
>>> implied.
>>> + * See the License for the specific language governing permissions and
>>> + * limitations under the License.
>>> + */
>>> +
>>> +package org.apache.catalina.tribes.membership;
>>> +
>>> +import java.io.IOException;
>>> +import java.io.ObjectInput;
>>> +import java.io.ObjectOutput;
>>> +import java.util.Arrays;
>>> +
>>> +import org.apache.catalina.tribes.Member;
>>> +import org.apache.catalina.tribes.io.XByteBuffer;
>>> +import org.apache.catalina.tribes.transport.SenderState;
>>> +
>>> +/**
>>> + * A <b>membership</b> implementation using simple multicast.
>>> + * This is the representation of a multicast member.
>>> + * Carries the host, and port of the this or other cluster nodes.
>>> + *
>>> + * @author Filip Hanik
>>> + * @version $Revision: 304032 $, $Date: 2005-07-27 10:11:55 -0500
>>> (Wed, 27 Jul 2005) $
>>> + */
>>> +public class MemberImpl implements Member, java.io.Externalizable {
>>> +
>>> + /**
>>> + * Public properties specific to this implementation
>>> + */
>>> + public static final transient String TCP_LISTEN_PORT =
>>> "tcpListenPort";
>>> + public static final transient String TCP_LISTEN_HOST =
>>> "tcpListenHost";
>>> + public static final transient String MEMBER_NAME = "memberName";
>>> + + /**
>>> + * The listen host for this member
>>> + */
>>> + protected byte[] host;
>>> + protected transient String hostname;
>>> + /**
>>> + * The tcp listen port for this member
>>> + */
>>> + protected int port;
>>> +
>>> + /**
>>> + * Counter for how many broadcast messages have been sent from
>>> this member
>>> + */
>>> + protected int msgCount = 0;
>>> + /**
>>> + * The number of milliseconds since this members was
>>> + * created, is kept track of using the start time
>>> + */
>>> + protected long memberAliveTime = 0;
>>> + + /**
>>> + * For the local member only
>>> + */
>>> + protected transient long serviceStartTime;
>>> + + /**
>>> + * To avoid serialization over and over again, once the local
>>> dataPkg
>>> + * has been set, we use that to transmit data
>>> + */
>>> + protected transient byte[] dataPkg = null;
>>> +
>>> + /**
>>> + * Unique session Id for this member
>>> + */
>>> + protected byte[] uniqueId = new byte[16];
>>> + + /**
>>> + * Custom payload that an app framework can broadcast
>>> + * Also used to transport stop command.
>>> + */
>>> + protected byte[] payload = new byte[0];
>>> + + /**
>>> + * Command, so that the custom payload doesn't have to be used
>>> + * This is for internal tribes use, such as SHUTDOWN_COMMAND
>>> + */
>>> + protected byte[] command = new byte[0];
>>> +
>>> + /**
>>> + * Empty constructor for serialization
>>> + */
>>> + public MemberImpl() {
>>> + + }
>>> +
>>> + /**
>>> + * Construct a new member object
>>> + * @param name - the name of this member, cluster unique
>>> + * @param domain - the cluster domain name of this member
>>> + * @param host - the tcp listen host
>>> + * @param port - the tcp listen port
>>> + */
>>> + public MemberImpl(String host,
>>> + int port,
>>> + long aliveTime) throws IOException {
>>> + setHostname(host);
>>> + this.port = port;
>>> + this.memberAliveTime=aliveTime;
>>> + }
>>> + + public MemberImpl(String host,
>>> + int port,
>>> + long aliveTime,
>>> + byte[] payload) throws IOException {
>>> + this(host,port,aliveTime);
>>> + setPayload(payload);
>>> + }
>>> + + public boolean isReady() {
>>> + return SenderState.getSenderState(this).isReady();
>>> + }
>>> + public boolean isSuspect() {
>>> + return SenderState.getSenderState(this).isSuspect();
>>> + }
>>> + public boolean isFailing() {
>>> + return SenderState.getSenderState(this).isFailing();
>>> + }
>>> +
>>> + /**
>>> + * Increment the message count.
>>> + */
>>> + protected void inc() {
>>> + msgCount++;
>>> + }
>>> +
>>> + /**
>>> + * Create a data package to send over the wire representing this
>>> member.
>>> + * This is faster than serialization.
>>> + * @return - the bytes for this member deserialized
>>> + * @throws Exception
>>> + */
>>> + public byte[] getData() {
>>> + return getData(true);
>>> + }
>>> + /**
>>> + * Highly optimized version of serializing a member into a byte
>>> array
>>> + * Returns a cached byte[] reference, do not modify this data
>>> + * @param getalive boolean
>>> + * @return byte[]
>>> + */
>>> + public byte[] getData(boolean getalive) {
>>> + return getData(getalive,false);
>>> + }
>>> + + + public int getDataLength() {
>>> + return 8+4+1+host.length+4+command.length+16+4+payload.length;
>>> + }
>>> + + /**
>>> + * + * @param getalive boolean - calculate memberAlive time
>>> + * @param reset boolean - reset the cached data package, and
>>> create a new one
>>> + * @return byte[]
>>> + */
>>> + public byte[] getData(boolean getalive, boolean reset) {
>>> + if ( reset ) dataPkg = null;
>>> + //look in cache first
>>> + if ( dataPkg!=null ) {
>>> + if ( getalive ) {
>>> + //you'd be surprised, but System.currentTimeMillis
>>> + //shows up on the profiler
>>> + long
>>> alive=System.currentTimeMillis()-getServiceStartTime();
>>> + XByteBuffer.toBytes( (long) alive, dataPkg, 0);
>>> + }
>>> + return dataPkg;
>>> + }
>>> + + //package looks like
>>> + //alive - 8 bytes
>>> + //port - 4 bytes
>>> + //host length - 1 byte
>>> + //host - hl bytes
>>> + //clen - 4 bytes
>>> + //command - clen bytes
>>> + //uniqueId - 16 bytes
>>> + //payload length - 4 bytes
>>> + //payload plen bytes
>>> + byte[] addr = host;
>>> + long alive=System.currentTimeMillis()-getServiceStartTime();
>>> + byte hl = (byte)addr.length;
>>> + byte[] data = new byte[getDataLength()];
>>> + int pos = 0;
>>> + //alive data
>>> + XByteBuffer.toBytes((long)alive,data,0);
>>> + pos += 8;
>>> + //port
>>> + XByteBuffer.toBytes(port,data,pos);
>>> + pos += 4;
>>> + //host length
>>> + data[pos++] = hl;
>>> + //host
>>> + System.arraycopy(addr,0,data,pos,addr.length);
>>> + pos+=addr.length;
>>> + //clen - 4 bytes
>>> + XByteBuffer.toBytes(command.length,data,pos);
>>> + pos+=4;
>>> + //command - clen bytes
>>> + System.arraycopy(command,0,data,pos,command.length);
>>> + pos+=command.length;
>>> + //unique Id
>>> + System.arraycopy(uniqueId,0,data,pos,uniqueId.length);
>>> + pos+=uniqueId.length;
>>> + //payload
>>> + XByteBuffer.toBytes(payload.length,data,pos);
>>> + pos+=4;
>>> + System.arraycopy(payload,0,data,pos,payload.length);
>>> + pos+=payload.length;
>>> +
>>> + //create local data
>>> + dataPkg = data;
>>> + return data;
>>> + }
>>> + /**
>>> + * Deserializes a member from data sent over the wire
>>> + * @param data - the bytes received
>>> + * @return a member object.
>>> + */
>>> + public static MemberImpl getMember(byte[] data, MemberImpl
>>> member) {
>>> + //package looks like
>>> + //alive - 8 bytes
>>> + //port - 4 bytes
>>> + //host length - 1 byte
>>> + //host - hl bytes
>>> + //command length - 4 bytes
>>> + //command clen bytes
>>> + //uniqueId - 16 bytes
>>> + //payload length - 4bytes
>>> + //payload - pl bytes
>>> + int pos = 0;
>>> +
>>> + byte[] alived = new byte[8];
>>> + System.arraycopy(data, pos, alived, 0, 8);
>>> + pos+=8;
>>> + byte[] portd = new byte[4];
>>> + System.arraycopy(data, pos, portd, 0, 4);
>>> + pos+=4;
>>> + + byte hl = data[pos++];
>>> + byte[] addr = new byte[hl];
>>> + System.arraycopy(data, pos, addr, 0, hl);
>>> + pos+=hl;
>>> +
>>> + int cl = XByteBuffer.toInt(data,pos);
>>> + pos+=4;
>>> +
>>> + byte[] command = new byte[cl];
>>> + System.arraycopy(data, pos, command, 0, command.length);
>>> + pos+=command.length;
>>> +
>>> + byte[] uniqueId = new byte[16];
>>> + System.arraycopy(data, pos, uniqueId, 0, 16);
>>> + pos+=16;
>>> + + int pl = XByteBuffer.toInt(data,pos);
>>> + pos+=4;
>>> + + byte[] payload = new byte[pl];
>>> + System.arraycopy(data, pos, payload, 0, payload.length);
>>> + pos+=payload.length;
>>> + + member.setHost(addr);
>>> + member.setPort(XByteBuffer.toInt(portd, 0));
>>> + member.setMemberAliveTime(XByteBuffer.toLong(alived, 0));
>>> + member.setUniqueId(uniqueId);
>>> + member.payload = payload;
>>> + + member.dataPkg = new byte[data.length];
>>> + System.arraycopy(data,0,member.dataPkg,0,data.length);
>>> + + return member;
>>> + }
>>> +
>>> + public static MemberImpl getMember(byte[] data) {
>>> + return getMember(data,new MemberImpl());
>>> + }
>>> +
>>> + /**
>>> + * Return the name of this object
>>> + * @return a unique name to the cluster
>>> + */
>>> + public String getName() {
>>> + return "tcp://"+getHostname()+":"+getPort();
>>> + }
>>> + + /**
>>> + * Return the listen port of this member
>>> + * @return - tcp listen port
>>> + */
>>> + public int getPort() {
>>> + return this.port;
>>> + }
>>> +
>>> + /**
>>> + * Return the TCP listen host for this member
>>> + * @return IP address or host name
>>> + */
>>> + public byte[] getHost() {
>>> + return host;
>>> + }
>>> + + public String getHostname() {
>>> + if ( this.hostname != null ) return hostname;
>>> + else {
>>> + try {
>>> + this.hostname =
>>> java.net.InetAddress.getByAddress(host).getHostName();
>>> + return this.hostname;
>>> + }catch ( IOException x ) {
>>> + throw new RuntimeException("Unable to parse
>>> hostname.",x);
>>> + }
>>> + }
>>> + }
>>> +
>>> + /**
>>> + * Contains information on how long this member has been online.
>>> + * The result is the number of milli seconds this member has been
>>> + * broadcasting its membership to the cluster.
>>> + * @return nr of milliseconds since this member started.
>>> + */
>>> + public long getMemberAliveTime() {
>>> + return memberAliveTime;
>>> + }
>>> +
>>> + public long getServiceStartTime() {
>>> + return serviceStartTime;
>>> + }
>>> +
>>> + public byte[] getUniqueId() {
>>> + return uniqueId;
>>> + }
>>> +
>>> + public byte[] getPayload() {
>>> + return payload;
>>> + }
>>> +
>>> + public byte[] getCommand() {
>>> + return command;
>>> + }
>>> +
>>> + public void setMemberAliveTime(long time) {
>>> + memberAliveTime=time;
>>> + }
>>> +
>>> +
>>> +
>>> + /**
>>> + * String representation of this object
>>> + */
>>> + public String toString() {
>>> + StringBuffer buf = new
>>> StringBuffer("org.apache.catalina.tribes.membership.MemberImpl[");
>>> + buf.append(getName()).append(",");
>>> + buf.append(getHostname()).append(",");
>>> + buf.append(port).append(", alive=");
>>> + buf.append(memberAliveTime).append(",");
>>> + buf.append("id=").append(bToS(this.uniqueId)).append(", ");
>>> +
>>> buf.append("payload=").append(bToS(this.payload,5)).append(", ");
>>> + buf.append("]");
>>> + return buf.toString();
>>> + }
>>> + public static String bToS(byte[] data) {
>>> + return bToS(data,data.length);
>>> + }
>>> + public static String bToS(byte[] data, int max) {
>>> + StringBuffer buf = new StringBuffer(4*16);
>>> + buf.append("{");
>>> + for (int i=0; data!=null && i<data.length; i++ ) {
>>> + buf.append(String.valueOf(data[i])).append(" ");
>>> + if ( i==max ) {
>>> + buf.append("...");
>>> + break;
>>> + }
>>> + }
>>> + buf.append("}");
>>> + return buf.toString();
>>> + }
>>> +
>>> + /**
>>> + * @see java.lang.Object#hashCode()
>>> + * @return The hash code
>>> + */
>>> + public int hashCode() {
>>> + return getHost()[0]+getHost()[1]+getHost()[2]+getHost()[3];
>>> + }
>>> +
>>> + /**
>>> + * Returns true if the param o is a McastMember with the same name
>>> + * @param o
>>> + */
>>> + public boolean equals(Object o) {
>>> + if ( o instanceof MemberImpl ) {
>>> + return
>>> Arrays.equals(this.getHost(),((MemberImpl)o).getHost()) &&
>>> + this.getPort() == ((MemberImpl)o).getPort() &&
>>> +
>>> Arrays.equals(this.getUniqueId(),((MemberImpl)o).getUniqueId());
>>> + }
>>> + else
>>> + return false;
>>> + }
>>> + + public void setHost(byte[] host) {
>>> + this.host = host;
>>> + }
>>> + + public void setHostname(String host) throws IOException {
>>> + hostname = host;
>>> + this.host = java.net.InetAddress.getByName(host).getAddress();
>>> + }
>>> + + public void setMsgCount(int msgCount) {
>>> + this.msgCount = msgCount;
>>> + }
>>> +
>>> + public void setPort(int port) {
>>> + this.port = port;
>>> + this.dataPkg = null;
>>> + }
>>> +
>>> + public void setServiceStartTime(long serviceStartTime) {
>>> + this.serviceStartTime = serviceStartTime;
>>> + }
>>> +
>>> + public void setUniqueId(byte[] uniqueId) {
>>> + this.uniqueId = uniqueId;
>>> + }
>>> +
>>> + public void setPayload(byte[] payload) {
>>> + this.payload = payload;
>>> + getData(true,true);
>>> + }
>>> +
>>> + public void setCommand(byte[] command) {
>>> + this.command = command!=null?command:new byte[0];
>>> + }
>>> +
>>> + public void readExternal(ObjectInput in) throws IOException,
>>> ClassNotFoundException {
>>> + int length = in.readInt();
>>> + byte[] message = new byte[length];
>>> + in.read(message);
>>> + getMember(message,this);
>>> + + }
>>> +
>>> + public void writeExternal(ObjectOutput out) throws IOException {
>>> + byte[] data = this.getData();
>>> + out.writeInt(data.length);
>>> + out.write(data);
>>> + }
>>> + +}
>>>
>>>
>>>
>>> ---------------------------------------------------------------------
>>> To unsubscribe, e-mail: dev-unsubscribe@tomcat.apache.org
>>> For additional commands, e-mail: dev-help@tomcat.apache.org
>>>
>>>
>>>
>>>
>>
>>
>> ---------------------------------------------------------------------
>> To unsubscribe, e-mail: dev-unsubscribe@tomcat.apache.org
>> For additional commands, e-mail: dev-help@tomcat.apache.org
>>
>>
>
>
---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@tomcat.apache.org
For additional commands, e-mail: dev-help@tomcat.apache.org