Author: fhanik Date: Thu May 18 09:07:47 2006 New Revision: 407578 URL: http://svn.apache.org/viewvc?rev=407578&view=rev Log: Added in a bytepool, to cache byte[] for faster access This pool can still be tuned, but as is, its already performing quite well. Pool is compatible with 1.4 as the pool will no-pool
Added: tomcat/container/tc5.5.x/modules/groupcom/src/share/org/apache/catalina/tribes/io/BytePool.java tomcat/container/tc5.5.x/modules/groupcom/src/share/org/apache/catalina/tribes/io/BytePool15Impl.java Modified: tomcat/container/tc5.5.x/modules/groupcom/src/share/org/apache/catalina/tribes/group/interceptors/ThroughputInterceptor.java tomcat/container/tc5.5.x/modules/groupcom/src/share/org/apache/catalina/tribes/io/ChannelData.java tomcat/container/tc5.5.x/modules/groupcom/src/share/org/apache/catalina/tribes/io/XByteBuffer.java tomcat/container/tc5.5.x/modules/groupcom/src/share/org/apache/catalina/tribes/membership/MemberImpl.java tomcat/container/tc5.5.x/modules/groupcom/test/java/org/apache/catalina/tribes/demos/ChannelCreator.java Modified: tomcat/container/tc5.5.x/modules/groupcom/src/share/org/apache/catalina/tribes/group/interceptors/ThroughputInterceptor.java URL: http://svn.apache.org/viewvc/tomcat/container/tc5.5.x/modules/groupcom/src/share/org/apache/catalina/tribes/group/interceptors/ThroughputInterceptor.java?rev=407578&r1=407577&r2=407578&view=diff ============================================================================== --- tomcat/container/tc5.5.x/modules/groupcom/src/share/org/apache/catalina/tribes/group/interceptors/ThroughputInterceptor.java (original) +++ tomcat/container/tc5.5.x/modules/groupcom/src/share/org/apache/catalina/tribes/group/interceptors/ThroughputInterceptor.java Thu May 18 09:07:47 2006 @@ -23,6 +23,7 @@ import org.apache.catalina.tribes.io.ChannelData; import org.apache.catalina.tribes.io.XByteBuffer; import java.text.DecimalFormat; +import org.apache.catalina.tribes.membership.MemberImpl; @@ -41,9 +42,10 @@ long msgRxCnt = 1; int interval = 10000; DecimalFormat df = new DecimalFormat("##.00"); + int addrlength = 0; public void sendMessage(Member[] destination, ChannelMessage msg, InterceptorPayload payload) throws ChannelException { - long bytes = XByteBuffer.getDataPackageLength(((ChannelData)msg).getDataPackage().length); + long bytes = XByteBuffer.getDataPackageLength(((ChannelData)msg).getDataPackageLength(addrlength)); long start = System.currentTimeMillis(); super.sendMessage(destination,msg,payload); long stop = System.currentTimeMillis(); @@ -73,6 +75,11 @@ buf.append(" messages\n\tReceived:"); buf.append(df.format(mbRx)).append(" MB]\n"); System.out.println(buf); + } + + public void start(int svc) throws ChannelException{ + super.start(svc); + addrlength = ((MemberImpl)getLocalMember(true)).getData().length; } public void setInterval(int interval) { Added: tomcat/container/tc5.5.x/modules/groupcom/src/share/org/apache/catalina/tribes/io/BytePool.java URL: http://svn.apache.org/viewvc/tomcat/container/tc5.5.x/modules/groupcom/src/share/org/apache/catalina/tribes/io/BytePool.java?rev=407578&view=auto ============================================================================== --- tomcat/container/tc5.5.x/modules/groupcom/src/share/org/apache/catalina/tribes/io/BytePool.java (added) +++ tomcat/container/tc5.5.x/modules/groupcom/src/share/org/apache/catalina/tribes/io/BytePool.java Thu May 18 09:07:47 2006 @@ -0,0 +1,93 @@ +/* + * Copyright 1999,2004-2006 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.io; + +import org.apache.commons.logging.LogFactory; + +import org.apache.commons.logging.Log; + +/** + * + * @author Filip Hanik + * + * @version 1.0 + */ +public class BytePool { + protected static Log log = LogFactory.getLog(BytePool.class); + + public static int DEFAULT_POOL_SIZE = 100*1024*1024; //100MB + + + + protected static BytePool instance = null; + protected BytePoolAPI pool = null; + + private BytePool(BytePoolAPI pool) { + this.pool = pool; + } + + public byte[] getArray(int minSize) { + if ( pool != null ) return pool.getArray(minSize); + else return new byte[minSize]; + } + + public byte[] getFixedArray(int size) { + if ( pool != null ) return pool.getFixedArray(size); + else return new byte[size]; + } + + public void returnArray(byte[] array) { + if ( pool != null ) pool.returnArray(array); + } + + public void clear() { + if ( pool != null ) pool.clear(); + } + + + public static BytePool getBytePool() { + if ( (instance == null) ) { + synchronized (BytePool.class) { + if ( instance == null ) { + BytePoolAPI pool = null; + try { + Class clazz = Class.forName("org.apache.catalina.tribes.io.BytePool15Impl"); + pool = (BytePoolAPI)clazz.newInstance(); + pool.setMaxSize(DEFAULT_POOL_SIZE); + } catch ( Exception x ) { + log.warn("Unable to initilize BytePool, not pooling byte[] objects.",x); + } + instance = new BytePool(pool); + + }//end if + }//sync + }//end if + return instance; + } + + + public static interface BytePoolAPI { + public void setMaxSize(int bytes); + + public byte[] getArray(int minSize); + + public byte[] getFixedArray(int size); + + public void returnArray(byte[] array); + + public void clear(); + } +} \ No newline at end of file Added: tomcat/container/tc5.5.x/modules/groupcom/src/share/org/apache/catalina/tribes/io/BytePool15Impl.java URL: http://svn.apache.org/viewvc/tomcat/container/tc5.5.x/modules/groupcom/src/share/org/apache/catalina/tribes/io/BytePool15Impl.java?rev=407578&view=auto ============================================================================== --- tomcat/container/tc5.5.x/modules/groupcom/src/share/org/apache/catalina/tribes/io/BytePool15Impl.java (added) +++ tomcat/container/tc5.5.x/modules/groupcom/src/share/org/apache/catalina/tribes/io/BytePool15Impl.java Thu May 18 09:07:47 2006 @@ -0,0 +1,65 @@ +/* + * Copyright 1999,2004-2006 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.io; + +import java.util.concurrent.ConcurrentLinkedQueue; +import java.util.concurrent.atomic.AtomicInteger; + +/** + * + * @author Filip Hanik + * @version 1.0 + */ +class BytePool15Impl implements BytePool.BytePoolAPI { + protected int maxSize; + protected AtomicInteger size = new AtomicInteger(0); + protected ConcurrentLinkedQueue queue = new ConcurrentLinkedQueue(); + + public void setMaxSize(int bytes) { + this.maxSize = bytes; + } + + + public byte[] getArray(int minSize) { + byte[] array = (byte[])queue.poll(); + if ( array != null ) size.addAndGet(-array.length); + if ( array == null || array.length <= minSize ) array = new byte[minSize]; + return array; + } + + public byte[] getFixedArray(int size) { + byte[] array = getArray(size); + if ( array.length != size ) array = new byte[size]; + return array; + } + + public void returnArray(byte[] array) { + if ( (size.get() + array.length) <= maxSize ) { + size.addAndGet(array.length); + queue.offer(array); + } + } + + public void clear() { + queue.clear(); + size.set(0); + } + + public int getMaxSize() { + return maxSize; + } + +} \ No newline at end of file Modified: tomcat/container/tc5.5.x/modules/groupcom/src/share/org/apache/catalina/tribes/io/ChannelData.java URL: http://svn.apache.org/viewvc/tomcat/container/tc5.5.x/modules/groupcom/src/share/org/apache/catalina/tribes/io/ChannelData.java?rev=407578&r1=407577&r2=407578&view=diff ============================================================================== --- tomcat/container/tc5.5.x/modules/groupcom/src/share/org/apache/catalina/tribes/io/ChannelData.java (original) +++ tomcat/container/tc5.5.x/modules/groupcom/src/share/org/apache/catalina/tribes/io/ChannelData.java Thu May 18 09:07:47 2006 @@ -164,22 +164,27 @@ setUniqueId(data); } - - /** - * Serializes the ChannelData object into a byte[] array - * @return byte[] - */ - public byte[] getDataPackage() { - byte[] addr = ((MemberImpl)address).getData(false); + public int getDataPackageLength(int addrlength) { int length = 4 + //options 8 + //timestamp off=4 4 + //unique id length off=12 uniqueId.length+ //id data off=12+uniqueId.length 4 + //addr length off=12+uniqueId.length+4 - addr.length+ //member data off=12+uniqueId.length+4+add.length + addrlength+ //member data off=12+uniqueId.length+4+add.length 4 + //message length off=12+uniqueId.length+4+add.length+4 message.getLength(); + return length; + + } + + /** + * Serializes the ChannelData object into a byte[] array + * @return byte[] + */ + public byte[] getDataPackage() { + byte[] addr = ((MemberImpl)address).getData(false); + int length = getDataPackageLength(addr.length); byte[] data = new byte[length]; int offset = 0; XByteBuffer.toBytes(options,data,offset); Modified: tomcat/container/tc5.5.x/modules/groupcom/src/share/org/apache/catalina/tribes/io/XByteBuffer.java URL: http://svn.apache.org/viewvc/tomcat/container/tc5.5.x/modules/groupcom/src/share/org/apache/catalina/tribes/io/XByteBuffer.java?rev=407578&r1=407577&r2=407578&view=diff ============================================================================== --- tomcat/container/tc5.5.x/modules/groupcom/src/share/org/apache/catalina/tribes/io/XByteBuffer.java (original) +++ tomcat/container/tc5.5.x/modules/groupcom/src/share/org/apache/catalina/tribes/io/XByteBuffer.java Thu May 18 09:07:47 2006 @@ -91,9 +91,11 @@ /** * Constructs a new XByteBuffer * @param size - the initial size of the byte buffer + * @todo use a pool of byte[] for performance */ public XByteBuffer(int size, boolean discard) { - buf = new byte[size]; + //buf = new byte[size]; + buf = BytePool.getBytePool().getArray(size); this.discard = discard; } @@ -103,7 +105,8 @@ public XByteBuffer(byte[] data, int size,boolean discard) { int length = Math.max(data.length,size); - buf = new byte[length]; + //buf = new byte[length]; + buf = BytePool.getBytePool().getArray(length); System.arraycopy(data,0,buf,0,data.length); bufSize = data.length; this.discard = discard; @@ -127,7 +130,8 @@ * Returns the bytes in the buffer, in its exact length */ public byte[] getBytes() { - byte[] b = new byte[bufSize]; + //byte[] b = new byte[bufSize]; + byte[] b = BytePool.getBytePool().getFixedArray(bufSize); System.arraycopy(buf,0,b,0,bufSize); return b; } @@ -235,7 +239,8 @@ public void expand(int newcount) { //don't change the allocation strategy - byte newbuf[] = new byte[Math.max(buf.length << 1, newcount)]; + //byte newbuf[] = new byte[Math.max(buf.length << 1, newcount)]; + byte newbuf[] = BytePool.getBytePool().getArray(Math.max(buf.length << 1, newcount)); System.arraycopy(buf, 0, newbuf, 0, bufSize); buf = newbuf; } @@ -306,7 +311,8 @@ int psize = countPackages(true); if (psize == 0) throw new java.lang.IllegalStateException("No package exists in XByteBuffer"); int size = toInt(buf, START_DATA.length); - byte[] data = new byte[size]; + //byte[] data = new byte[size]; + byte[] data = BytePool.getBytePool().getFixedArray(size); System.arraycopy(buf, START_DATA.length + 4, data, 0, size); if (clearFromBuffer) { int totalsize = START_DATA.length + 4 + size + END_DATA.length; @@ -346,7 +352,8 @@ public static byte[] createDataPackage(byte[] data) { int length = getDataPackageLength(data.length); - byte[] result = new byte[length]; + //byte[] result = new byte[length]; + byte[] result = BytePool.getBytePool().getFixedArray(length); return createDataPackage(data,0,data.length,result,0); } 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=407578&r1=407577&r2=407578&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 May 18 09:07:47 2006 @@ -24,6 +24,7 @@ import org.apache.catalina.tribes.Member; import org.apache.catalina.tribes.io.XByteBuffer; import org.apache.catalina.tribes.transport.SenderState; +import org.apache.catalina.tribes.io.BytePool; /** * A <b>membership</b> implementation using simple multicast. @@ -184,7 +185,8 @@ byte[] addr = host; long alive=System.currentTimeMillis()-getServiceStartTime(); byte hl = (byte)addr.length; - byte[] data = new byte[8+4+1+addr.length+16+4+payload.length]; + //byte[] data = new byte[8+4+1+addr.length+16+4+payload.length]; + byte[] data = BytePool.getBytePool().getFixedArray(8+4+1+addr.length+16+4+payload.length); int pos = 0; //alive data XByteBuffer.toBytes((long)alive,data,0); @@ -256,6 +258,7 @@ member.payload = payload; member.dataPkg = new byte[data.length]; + //member.dataPkg = BytePool.getBytePool().getFixedArray(data.length); System.arraycopy(data,0,member.dataPkg,0,data.length); return member; @@ -406,7 +409,8 @@ public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException { int length = in.readInt(); - byte[] message = new byte[length]; + //byte[] message = new byte[length]; + byte[] message = BytePool.getBytePool().getFixedArray(length); in.read(message); getMember(message,this); Modified: tomcat/container/tc5.5.x/modules/groupcom/test/java/org/apache/catalina/tribes/demos/ChannelCreator.java URL: http://svn.apache.org/viewvc/tomcat/container/tc5.5.x/modules/groupcom/test/java/org/apache/catalina/tribes/demos/ChannelCreator.java?rev=407578&r1=407577&r2=407578&view=diff ============================================================================== --- tomcat/container/tc5.5.x/modules/groupcom/test/java/org/apache/catalina/tribes/demos/ChannelCreator.java (original) +++ tomcat/container/tc5.5.x/modules/groupcom/test/java/org/apache/catalina/tribes/demos/ChannelCreator.java Thu May 18 09:07:47 2006 @@ -30,6 +30,7 @@ import org.apache.catalina.tribes.transport.ReceiverBase; import org.apache.catalina.tribes.transport.ReplicationTransmitter; import org.apache.catalina.tribes.group.interceptors.ThroughputInterceptor; +import org.apache.catalina.tribes.group.interceptors.MessageDispatch15Interceptor; /** * <p>Title: </p> @@ -204,7 +205,7 @@ } if ( async ) { - MessageDispatchInterceptor mi = new MessageDispatchInterceptor(); + MessageDispatchInterceptor mi = new MessageDispatch15Interceptor(); mi.setMaxQueueSize(asyncsize); channel.addInterceptor(mi); System.out.println("Added MessageDispatchInterceptor"); --------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]