Author: fhanik Date: Fri Jul 7 08:38:14 2006 New Revision: 419910 URL: http://svn.apache.org/viewvc?rev=419910&view=rev Log: Larger package for multicast Throw an error if package is too large
Modified: tomcat/container/tc5.5.x/modules/groupcom/VERSION 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 tomcat/container/tc5.5.x/modules/groupcom/test/java/org/apache/catalina/tribes/test/transport/SocketTribesReceive.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=419910&r1=419909&r2=419910&view=diff ============================================================================== --- tomcat/container/tc5.5.x/modules/groupcom/VERSION (original) +++ tomcat/container/tc5.5.x/modules/groupcom/VERSION Fri Jul 7 08:38:14 2006 @@ -1,3 +1,6 @@ +0.9.4.9 + - max multicast packet is no roughly 64k instead of 8k + - tribes throws an illegal argument exception if the payload added is too large 0.9.4.8 - fix bug in the NIO sender, it should use flip instead of rewind 0.9.4.7 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=419910&r1=419909&r2=419910&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 Fri Jul 7 08:38:14 2006 @@ -44,6 +44,8 @@ { private static org.apache.commons.logging.Log log = org.apache.commons.logging.LogFactory.getLog( McastService.class ); + + protected static int MAX_PACKET_SIZE = 65535; /** * Internal flag used for the listen thread that listens to the multicasting socket. */ @@ -149,10 +151,10 @@ this.service = service; this.sendFrequency = sendFrequency; setupSocket(); - sendPacket = new DatagramPacket(new byte[8192],8192); + sendPacket = new DatagramPacket(new byte[MAX_PACKET_SIZE],MAX_PACKET_SIZE); sendPacket.setAddress(address); sendPacket.setPort(port); - receivePacket = new DatagramPacket(new byte[8192],8192); + receivePacket = new DatagramPacket(new byte[MAX_PACKET_SIZE],MAX_PACKET_SIZE); receivePacket.setAddress(address); receivePacket.setPort(port); membership = new Membership(member); @@ -272,11 +274,13 @@ public void receive() throws IOException { try { socket.receive(receivePacket); - byte[] data = new byte[receivePacket.getLength()]; - System.arraycopy(receivePacket.getData(), receivePacket.getOffset(), data, 0, data.length); - final MemberImpl m = MemberImpl.getMember(data); - if (log.isDebugEnabled()) - log.debug("Mcast receive ping from member " + m); + if(receivePacket.getLength() > MAX_PACKET_SIZE) { + log.error("Multicast packet received was too long, dropping package:"+receivePacket.getLength()); + } else { + byte[] data = new byte[receivePacket.getLength()]; + System.arraycopy(receivePacket.getData(), receivePacket.getOffset(), data, 0, data.length); + final MemberImpl m = MemberImpl.getMember(data); + if (log.isTraceEnabled()) log.trace("Mcast receive ping from member " + m); Thread t = null; if (Arrays.equals(m.getCommand(), Member.SHUTDOWN_PAYLOAD)) { if (log.isDebugEnabled()) log.debug("Member has shutdown:" + m); @@ -294,7 +298,8 @@ } }; } //end if - if ( t != null ) t.start(); + if ( t != null ) t.start(); + } } catch (SocketTimeoutException x ) { //do nothing, this is normal, we don't want to block forever //since the receive thread is the same 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=419910&r1=419909&r2=419910&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 Fri Jul 7 08:38:14 2006 @@ -244,6 +244,10 @@ * @return a member object. */ public static MemberImpl getMember(byte[] data, MemberImpl member) { + return getMember(data,0,data.length,member); + } + + public static MemberImpl getMember(byte[] data, int offset, int length, MemberImpl member) { //package looks like //alive - 8 bytes //port - 4 bytes @@ -256,7 +260,7 @@ //uniqueId - 16 bytes //payload length - 4bytes //payload - pl bytes - int pos = 0; + int pos = offset; byte[] alived = new byte[8]; System.arraycopy(data, pos, alived, 0, 8); @@ -303,8 +307,8 @@ member.domain = domain; member.command = command; - member.dataPkg = new byte[data.length]; - System.arraycopy(data,0,member.dataPkg,0,data.length); + member.dataPkg = new byte[length]; + System.arraycopy(data,offset,member.dataPkg,0,length); return member; } @@ -468,8 +472,13 @@ } public void setPayload(byte[] payload) { + byte[] oldpayload = this.payload; this.payload = payload!=null?payload:new byte[0]; - getData(true,true); + if ( this.getData(true,true).length > McastServiceImpl.MAX_PACKET_SIZE ) { + this.payload = oldpayload; + throw new IllegalArgumentException("Payload is to large for tribes to handle."); + } + } public void setCommand(byte[] command) { Modified: tomcat/container/tc5.5.x/modules/groupcom/test/java/org/apache/catalina/tribes/test/transport/SocketTribesReceive.java URL: http://svn.apache.org/viewvc/tomcat/container/tc5.5.x/modules/groupcom/test/java/org/apache/catalina/tribes/test/transport/SocketTribesReceive.java?rev=419910&r1=419909&r2=419910&view=diff ============================================================================== --- tomcat/container/tc5.5.x/modules/groupcom/test/java/org/apache/catalina/tribes/test/transport/SocketTribesReceive.java (original) +++ tomcat/container/tc5.5.x/modules/groupcom/test/java/org/apache/catalina/tribes/test/transport/SocketTribesReceive.java Fri Jul 7 08:38:14 2006 @@ -15,8 +15,8 @@ static boolean first = true; static int count = 0; static DecimalFormat df = new DecimalFormat("##.00"); - static BigDecimal total = new BigDecimal(0); - static BigDecimal bytes = new BigDecimal(32871); + static BigDecimal total = new BigDecimal((double)0); + static BigDecimal bytes = new BigDecimal((double)32871); public static void main(String[] args) throws Exception { --------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]