You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@tomcat.apache.org by fh...@apache.org on 2006/06/29 10:33:32 UTC

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/

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


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/

Posted by Rainer Jung <ra...@kippdata.de>.
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


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/

Posted by Filip Hanik - Dev Lists <de...@hanik.com>.
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
>
>


-- 


Filip Hanik

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


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/

Posted by Jean-frederic Clere <jf...@gmail.com>.
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