udt-java-commits Mailing List for UDT-Java (Page 2)
Status: Alpha
Brought to you by:
bschuller
You can subscribe to this list here.
2010 |
Jan
|
Feb
|
Mar
|
Apr
(17) |
May
(4) |
Jun
(1) |
Jul
|
Aug
(3) |
Sep
(7) |
Oct
|
Nov
(1) |
Dec
|
---|---|---|---|---|---|---|---|---|---|---|---|---|
2011 |
Jan
(1) |
Feb
(1) |
Mar
|
Apr
|
May
|
Jun
|
Jul
|
Aug
(10) |
Sep
|
Oct
(1) |
Nov
(1) |
Dec
(2) |
2012 |
Jan
|
Feb
(4) |
Mar
(1) |
Apr
|
May
(1) |
Jun
|
Jul
|
Aug
|
Sep
|
Oct
|
Nov
|
Dec
|
From: <bsc...@us...> - 2010-09-15 19:22:25
|
Revision: 49 http://udt-java.svn.sourceforge.net/udt-java/?rev=49&view=rev Author: bschuller Date: 2010-09-15 19:22:18 +0000 (Wed, 15 Sep 2010) Log Message: ----------- simpler way to implement a receive buffer Modified Paths: -------------- udt-java/trunk/src/main/java/udt/UDTInputStream.java udt-java/trunk/src/main/java/udt/UDTReceiver.java udt-java/trunk/src/main/java/udt/UDTSession.java udt-java/trunk/src/test/java/udt/TestUDTInputStream.java udt-java/trunk/src/test/java/udt/performance/TestUDTLargeData.java Added Paths: ----------- udt-java/trunk/src/main/java/udt/util/ReceiveBuffer.java udt-java/trunk/src/test/java/udt/util/ udt-java/trunk/src/test/java/udt/util/TestReceiveBuffer.java Modified: udt-java/trunk/src/main/java/udt/UDTInputStream.java =================================================================== --- udt-java/trunk/src/main/java/udt/UDTInputStream.java 2010-09-13 18:55:07 UTC (rev 48) +++ udt-java/trunk/src/main/java/udt/UDTInputStream.java 2010-09-15 19:22:18 UTC (rev 49) @@ -34,12 +34,10 @@ import java.io.IOException; import java.io.InputStream; -import java.util.concurrent.PriorityBlockingQueue; import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicBoolean; -import udt.util.SequenceNumber; -import udt.util.UDTStatistics; +import udt.util.ReceiveBuffer; /** * The UDTInputStream receives data blocks from the {@link UDTSocket} @@ -53,16 +51,8 @@ //the socket owning this inputstream private final UDTSocket socket; - //inbound application data, in-order, and ready for reading - //by the application - private final PriorityBlockingQueue<AppData>appData; + private final ReceiveBuffer receiveBuffer; - private final UDTStatistics statistics; - - //the highest sequence number read by the application, initialised - //to the initial sequence number minus one - private volatile long highestSequenceNumber=0; - //set to 'false' by the receiver when it gets a shutdown signal from the peer //see the noMoreData() method private final AtomicBoolean expectMoreData=new AtomicBoolean(true); @@ -74,28 +64,15 @@ /** * create a new {@link UDTInputStream} connected to the given socket * @param socket - the {@link UDTSocket} - * @param statistics - the {@link UDTStatistics} * @throws IOException */ - public UDTInputStream(UDTSocket socket, UDTStatistics statistics)throws IOException{ + public UDTInputStream(UDTSocket socket)throws IOException{ this.socket=socket; - this.statistics=statistics; - int capacity=socket!=null? 4*socket.getSession().getFlowWindowSize() : 64 ; - appData=new PriorityBlockingQueue<AppData>(capacity); - if(socket!=null){ - highestSequenceNumber=SequenceNumber.decrement(socket.getSession().getInitialSequenceNumber()); - } + int capacity=socket!=null? 2 * socket.getSession().getFlowWindowSize() : 128 ; + long initialSequenceNum=socket!=null?socket.getSession().getInitialSequenceNumber():1; + receiveBuffer=new ReceiveBuffer(capacity,initialSequenceNum); } - /** - * create a new {@link UDTInputStream} connected to the given socket - * @param socket - the {@link UDTSocket} - * @throws IOException - */ - public UDTInputStream(UDTSocket socket)throws IOException{ - this(socket, socket.getSession().getStatistics()); - } - private final byte[]single=new byte[1]; @Override @@ -143,7 +120,7 @@ if(read>0)return read; if(closed)return -1; - if(expectMoreData.get() || !appData.isEmpty())return 0; + if(expectMoreData.get() || !receiveBuffer.isEmpty())return 0; //no more data return -1; @@ -168,38 +145,19 @@ while(true){ try{ if(block){ - currentChunk=appData.poll(1, TimeUnit.MILLISECONDS); + currentChunk=receiveBuffer.poll(1, TimeUnit.MILLISECONDS); while (!closed && currentChunk==null){ - currentChunk=appData.poll(1000, TimeUnit.MILLISECONDS); + currentChunk=receiveBuffer.poll(1000, TimeUnit.MILLISECONDS); } } - else currentChunk=appData.poll(10, TimeUnit.MILLISECONDS); + else currentChunk=receiveBuffer.poll(10, TimeUnit.MILLISECONDS); }catch(InterruptedException ie){ IOException ex=new IOException(); ex.initCause(ie); throw ex; } - if(currentChunk!=null){ - //check if the data is in-order - long cmp=SequenceNumber.compare(currentChunk.sequenceNumber,highestSequenceNumber+1); - if(cmp==0){ - highestSequenceNumber=currentChunk.sequenceNumber; - return; - } - else if(cmp<0){ - //duplicate, drop it - currentChunk=null; - statistics.incNumberOfDuplicateDataPackets(); - } - else{ - //out of order data, put back into queue and exit - appData.offer(currentChunk); - currentChunk=null; - return; - } - } - else return; + return; } } @@ -209,8 +167,7 @@ * */ protected boolean haveNewData(long sequenceNumber,byte[]data)throws IOException{ - if(SequenceNumber.compare(sequenceNumber,highestSequenceNumber)<=0)return true; - return appData.offer(new AppData(sequenceNumber,data)); + return receiveBuffer.offer(new AppData(sequenceNumber,data)); } @Override @@ -232,6 +189,10 @@ this.blocking=block; } + public int getReceiveBufferSize(){ + return receiveBuffer.getSize(); + } + /** * notify the input stream that there is no more data * @throws IOException @@ -247,7 +208,7 @@ public static class AppData implements Comparable<AppData>{ final long sequenceNumber; final byte[] data; - AppData(long sequenceNumber, byte[]data){ + public AppData(long sequenceNumber, byte[]data){ this.sequenceNumber=sequenceNumber; this.data=data; } @@ -260,6 +221,10 @@ return sequenceNumber+"["+data.length+"]"; } + public long getSequenceNumber(){ + return sequenceNumber; + } + @Override public int hashCode() { final int prime = 31; Modified: udt-java/trunk/src/main/java/udt/UDTReceiver.java =================================================================== --- udt-java/trunk/src/main/java/udt/UDTReceiver.java 2010-09-13 18:55:07 UTC (rev 48) +++ udt-java/trunk/src/main/java/udt/UDTReceiver.java 2010-09-15 19:22:18 UTC (rev 49) @@ -388,12 +388,17 @@ //check whether to drop this packet // n++; - //if(dropRate>0 && n % dropRate == 0){ +// //if(dropRate>0 && n % dropRate == 0){ // if(n==666){ // logger.info("**** TESTING:::: DROPPING PACKET "+currentSequenceNumber+" FOR TESTING"); // return; // } - +// + boolean OK=session.getSocket().getInputStream().haveNewData(currentSequenceNumber,dp.getData()); + if(!OK){ + //need to drop packet... + return; + } long currentDataPacketArrivalTime = Util.getCurrentTime(); @@ -412,7 +417,6 @@ //store current time lastDataPacketArrivalTime=currentDataPacketArrivalTime; - session.getSocket().getInputStream().haveNewData(currentSequenceNumber,dp.getData()); //(6).number of detected lossed packet /*(6.a).if the number of the current data packet is greater than LSRN+1, Modified: udt-java/trunk/src/main/java/udt/UDTSession.java =================================================================== --- udt-java/trunk/src/main/java/udt/UDTSession.java 2010-09-13 18:55:07 UTC (rev 48) +++ udt-java/trunk/src/main/java/udt/UDTSession.java 2010-09-15 19:22:18 UTC (rev 49) @@ -74,7 +74,7 @@ * flow window size, i.e. how many data packets are * in-flight at a single time */ - protected int flowWindowSize=8192;//4*128; + protected int flowWindowSize=1024; /** * remote UDT entity (address and socket ID) Added: udt-java/trunk/src/main/java/udt/util/ReceiveBuffer.java =================================================================== --- udt-java/trunk/src/main/java/udt/util/ReceiveBuffer.java (rev 0) +++ udt-java/trunk/src/main/java/udt/util/ReceiveBuffer.java 2010-09-15 19:22:18 UTC (rev 49) @@ -0,0 +1,149 @@ +package udt.util; + +import java.util.concurrent.TimeUnit; +import java.util.concurrent.atomic.AtomicInteger; +import java.util.concurrent.locks.Condition; +import java.util.concurrent.locks.ReentrantLock; + +import udt.UDTInputStream.AppData; + +/** + * + * The receive buffer stores data chunks to be read by the application + * + * @author schuller + */ +public class ReceiveBuffer { + + private final AppData[]buffer; + + //the head of the buffer: contains the next chunk to be read by the application, + //i.e. the one with the lowest sequence number + private volatile int readPosition=0; + + //the lowest sequence number stored in this buffer + private final long initialSequenceNumber; + + //the highest sequence number already read by the application + private long highestReadSequenceNumber; + + //number of chunks + private final AtomicInteger numValidChunks=new AtomicInteger(0); + + //lock and condition for poll() with timeout + private final Condition notEmpty; + private final ReentrantLock lock; + + //the size of the buffer + private final int size; + + public ReceiveBuffer(int size, long initialSequenceNumber){ + this.size=size; + this.buffer=new AppData[size]; + this.initialSequenceNumber=initialSequenceNumber; + lock=new ReentrantLock(false); + notEmpty=lock.newCondition(); + highestReadSequenceNumber=SequenceNumber.decrement(initialSequenceNumber); + System.out.println("SIZE: "+size); + } + + public boolean offer(AppData data){ + if(numValidChunks.get()==size) { + return false; + } + lock.lock(); + try{ + long seq=data.getSequenceNumber(); + //if already have this chunk, discard it + if(SequenceNumber.compare(seq, initialSequenceNumber)<0)return true; + //else compute insert position + int offset=(int)SequenceNumber.seqOffset(initialSequenceNumber, seq); + int insert=offset% size; + buffer[insert]=data; + numValidChunks.incrementAndGet(); + return true; + }finally{ + lock.unlock(); + } + } + + /** + * return a data chunk, guaranteed to be in-order, waiting up to the + * specified wait time if necessary for a chunk to become available. + * + * @param timeout how long to wait before giving up, in units of + * <tt>unit</tt> + * @param unit a <tt>TimeUnit</tt> determining how to interpret the + * <tt>timeout</tt> parameter + * @return data chunk, or <tt>null</tt> if the + * specified waiting time elapses before an element is available + * @throws InterruptedException if interrupted while waiting + */ + public AppData poll(int timeout, TimeUnit units)throws InterruptedException{ + lock.lockInterruptibly(); + long nanos = units.toNanos(timeout); + + try { + for (;;) { + if (numValidChunks.get() != 0) { + return poll(); + } + if (nanos <= 0) + return null; + try { + nanos = notEmpty.awaitNanos(nanos); + } catch (InterruptedException ie) { + notEmpty.signal(); // propagate to non-interrupted thread + throw ie; + } + + } + } finally { + lock.unlock(); + } + } + + + /** + * return a data chunk, guaranteed to be in-order. + */ + public AppData poll(){ + if(numValidChunks.get()==0){ + return null; + } + AppData r=buffer[readPosition]; + if(r!=null){ + long thisSeq=r.getSequenceNumber(); + if(1==SequenceNumber.seqOffset(highestReadSequenceNumber,thisSeq)){ + increment(); + highestReadSequenceNumber=thisSeq; + } + else return null; + } + // else{ + // System.out.println("empty HEAD at pos="+readPosition); + // try{ + // Thread.sleep(1000); + // Thread.yield(); + // }catch(InterruptedException e){}; + // } + + return r; + } + + public int getSize(){ + return size; + } + + void increment(){ + buffer[readPosition]=null; + readPosition++; + if(readPosition==size)readPosition=0; + numValidChunks.decrementAndGet(); + } + + public boolean isEmpty(){ + return numValidChunks.get()==0; + } + +} Property changes on: udt-java/trunk/src/main/java/udt/util/ReceiveBuffer.java ___________________________________________________________________ Added: svn:mime-type + text/plain Modified: udt-java/trunk/src/test/java/udt/TestUDTInputStream.java =================================================================== --- udt-java/trunk/src/test/java/udt/TestUDTInputStream.java 2010-09-13 18:55:07 UTC (rev 48) +++ udt-java/trunk/src/test/java/udt/TestUDTInputStream.java 2010-09-15 19:22:18 UTC (rev 49) @@ -1,15 +1,17 @@ package udt; import java.security.MessageDigest; +import java.util.concurrent.Callable; +import java.util.concurrent.Executors; +import java.util.concurrent.Future; +import java.util.concurrent.ScheduledExecutorService; -import udt.util.UDTStatistics; import udt.util.Util; public class TestUDTInputStream extends UDTTestBase{ public void test1()throws Exception{ - UDTStatistics stat=new UDTStatistics("test"); - UDTInputStream is=new UDTInputStream(null, stat); + UDTInputStream is=new UDTInputStream(null); byte[] data1="this is ".getBytes(); byte[] data2="a test".getBytes(); byte[] data3=" string".getBytes(); @@ -24,8 +26,7 @@ } public void test2()throws Exception{ - UDTStatistics stat=new UDTStatistics("test"); - UDTInputStream is=new UDTInputStream(null, stat); + UDTInputStream is=new UDTInputStream(null); byte[] data1=getRandomData(65537); byte[] data2=getRandomData(1234); byte[] data3=getRandomData(3*1024*1024); @@ -40,8 +41,7 @@ } public void testInOrder()throws Exception{ - UDTStatistics stat=new UDTStatistics("test"); - UDTInputStream is=new UDTInputStream(null, stat); + UDTInputStream is=new UDTInputStream(null); is.setBlocking(false); byte[]data=getRandomData(10*1024*1024); @@ -58,8 +58,7 @@ } public void testRandomOrder()throws Exception{ - UDTStatistics stat=new UDTStatistics("test"); - UDTInputStream is=new UDTInputStream(null, stat); + UDTInputStream is=new UDTInputStream(null); is.setBlocking(false); byte[]data=getRandomData(100*1024); @@ -76,6 +75,50 @@ assertEquals(digest,readMD5); } + + + public void testLargeDataSetTwoThreads()throws Exception{ + final UDTInputStream is=new UDTInputStream(null); + is.setBlocking(false); + int n=100; + assertTrue("ERROR IN UNIT TEST : too many packets!",n<=is.getReceiveBufferSize()); + final byte[]data=getRandomData(n*1024); + final byte[][]blocks=makeChunks(n,data); + String digest=computeMD5(blocks); + + Runnable write=new Runnable(){ + public void run(){ + try{ + for(int i=0;i<blocks.length;i++){ + while(!is.haveNewData(i+1, blocks[i])){ + Thread.yield(); + Thread.sleep(100); + } + } + is.noMoreData(); + }catch(Exception e){ + e.printStackTrace(); + fail(); + } + } + }; + + Callable<String> reader=new Callable<String>(){ + public String call() throws Exception { + String md5=readAll(is,1024*999); + return md5; + } + }; + + ScheduledExecutorService es=Executors.newScheduledThreadPool(2); + es.execute(write); + Future<String> result=es.submit(reader); + String readMD5=result.get(); + + assertEquals(digest,readMD5); + es.shutdownNow(); + } + //read and discard data from the given input stream //returns the md5 digest of the data protected String readAll(UDTInputStream is, int bufsize,boolean sendNoMoreData)throws Exception{ Modified: udt-java/trunk/src/test/java/udt/performance/TestUDTLargeData.java =================================================================== --- udt-java/trunk/src/test/java/udt/performance/TestUDTLargeData.java 2010-09-13 18:55:07 UTC (rev 48) +++ udt-java/trunk/src/test/java/udt/performance/TestUDTLargeData.java 2010-09-15 19:22:18 UTC (rev 49) @@ -21,7 +21,7 @@ boolean running=false; //how many - int num_packets=50; + int num_packets=500; //how large is a single packet int size=1*1024*1024; Added: udt-java/trunk/src/test/java/udt/util/TestReceiveBuffer.java =================================================================== --- udt-java/trunk/src/test/java/udt/util/TestReceiveBuffer.java (rev 0) +++ udt-java/trunk/src/test/java/udt/util/TestReceiveBuffer.java 2010-09-15 19:22:18 UTC (rev 49) @@ -0,0 +1,142 @@ +package udt.util; + +import java.util.concurrent.Callable; +import java.util.concurrent.Executors; +import java.util.concurrent.Future; +import java.util.concurrent.ScheduledExecutorService; +import java.util.concurrent.TimeUnit; + +import junit.framework.TestCase; +import udt.UDTInputStream.AppData; + +public class TestReceiveBuffer extends TestCase{ + + public void testInOrder(){ + ReceiveBuffer b=new ReceiveBuffer(16,1); + byte[]test1="test1".getBytes(); + byte[]test2="test2".getBytes(); + byte[]test3="test3".getBytes(); + + b.offer(new AppData(1l,test1)); + b.offer(new AppData(2l,test2)); + b.offer(new AppData(3l,test3)); + + AppData a=b.poll(); + assertEquals(1l,a.getSequenceNumber()); + + a=b.poll(); + assertEquals(2l,a.getSequenceNumber()); + + a=b.poll(); + assertEquals(3l,a.getSequenceNumber()); + + assertNull(b.poll()); + } + + public void testOutOfOrder(){ + ReceiveBuffer b=new ReceiveBuffer(16,1); + byte[]test1="test1".getBytes(); + byte[]test2="test2".getBytes(); + byte[]test3="test3".getBytes(); + + b.offer(new AppData(3l,test3)); + b.offer(new AppData(2l,test2)); + b.offer(new AppData(1l,test1)); + + AppData a=b.poll(); + assertEquals(1l,a.getSequenceNumber()); + + a=b.poll(); + assertEquals(2l,a.getSequenceNumber()); + + a=b.poll(); + assertEquals(3l,a.getSequenceNumber()); + + assertNull(b.poll()); + } + + public void testInterleaved(){ + ReceiveBuffer b=new ReceiveBuffer(16,1); + byte[]test1="test1".getBytes(); + byte[]test2="test2".getBytes(); + byte[]test3="test3".getBytes(); + + b.offer(new AppData(3l,test3)); + + b.offer(new AppData(1l,test1)); + + AppData a=b.poll(); + assertEquals(1l,a.getSequenceNumber()); + + assertNull(b.poll()); + + b.offer(new AppData(2l,test2)); + + a=b.poll(); + assertEquals(2l,a.getSequenceNumber()); + + a=b.poll(); + assertEquals(3l,a.getSequenceNumber()); + } + + public void testOverflow(){ + ReceiveBuffer b=new ReceiveBuffer(4,1); + + for(int i=0; i<3; i++){ + b.offer(new AppData(i+1,"test".getBytes())); + } + for(int i=0; i<3; i++){ + assertEquals(i+1, b.poll().getSequenceNumber()); + } + + for(int i=0; i<3; i++){ + b.offer(new AppData(i+4,"test".getBytes())); + } + for(int i=0; i<3; i++){ + assertEquals(i+4, b.poll().getSequenceNumber()); + } + } + + + public void testTimedPoll()throws Exception{ + final ReceiveBuffer b=new ReceiveBuffer(4,1); + + Runnable write=new Runnable(){ + + public void run(){ + try{ + for(int i=0; i<5; i++){ + Thread.sleep(500); + b.offer(new AppData(i+1,"test".getBytes())); + } + }catch(Exception e){ + e.printStackTrace(); + fail(); + } + } + }; + + Callable<String> reader=new Callable<String>(){ + public String call() throws Exception { + for(int i=0; i<5; i++){ + AppData r=null; + do{ + try{ + r=b.poll(200, TimeUnit.MILLISECONDS); + }catch(InterruptedException ie){ + ie.printStackTrace(); + } + }while(r==null); + } + return "OK."; + } + }; + + ScheduledExecutorService es=Executors.newScheduledThreadPool(2); + es.execute(write); + Future<String>res=es.submit(reader); + res.get(); + es.shutdownNow(); + } + +} Property changes on: udt-java/trunk/src/test/java/udt/util/TestReceiveBuffer.java ___________________________________________________________________ Added: svn:mime-type + text/plain This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <bsc...@us...> - 2010-09-13 18:55:14
|
Revision: 48 http://udt-java.svn.sourceforge.net/udt-java/?rev=48&view=rev Author: bschuller Date: 2010-09-13 18:55:07 +0000 (Mon, 13 Sep 2010) Log Message: ----------- some refactoring Modified Paths: -------------- udt-java/trunk/src/main/java/udt/UDTPacket.java udt-java/trunk/src/main/java/udt/UDTReceiver.java udt-java/trunk/src/main/java/udt/packets/ControlPacket.java udt-java/trunk/src/main/java/udt/packets/DataPacket.java Added Paths: ----------- udt-java/trunk/src/test/java/udt/packets/ udt-java/trunk/src/test/java/udt/packets/DummyControlPacket.java udt-java/trunk/src/test/java/udt/packets/TestControlPacketType.java udt-java/trunk/src/test/java/udt/packets/TestDataPacket.java udt-java/trunk/src/test/java/udt/packets/TestPacketFactory.java Removed Paths: ------------- udt-java/trunk/src/test/java/udt/DummyControlPacket.java udt-java/trunk/src/test/java/udt/TestControlPacketType.java udt-java/trunk/src/test/java/udt/TestDataPacket.java udt-java/trunk/src/test/java/udt/TestPacketFactory.java Modified: udt-java/trunk/src/main/java/udt/UDTPacket.java =================================================================== --- udt-java/trunk/src/main/java/udt/UDTPacket.java 2010-09-01 13:58:45 UTC (rev 47) +++ udt-java/trunk/src/main/java/udt/UDTPacket.java 2010-09-13 18:55:07 UTC (rev 48) @@ -36,27 +36,21 @@ public long getMessageNumber(); + public void setMessageNumber(long messageNumber) ; - public void setTimeStamp(long timeStamp); + public long getTimeStamp(); - public void setDestinationID(long destinationID); + public long getDestinationID(); public boolean isControlPacket(); public int getControlPacketType(); - - /** - * header - * @return - */ - public byte[] getHeader(); - public byte[] getEncoded(); /** Modified: udt-java/trunk/src/main/java/udt/UDTReceiver.java =================================================================== --- udt-java/trunk/src/main/java/udt/UDTReceiver.java 2010-09-01 13:58:45 UTC (rev 47) +++ udt-java/trunk/src/main/java/udt/UDTReceiver.java 2010-09-13 18:55:07 UTC (rev 48) @@ -387,12 +387,12 @@ long currentSequenceNumber = dp.getPacketSequenceNumber(); //check whether to drop this packet - n++; +// n++; //if(dropRate>0 && n % dropRate == 0){ - //if(n==668){ - // logger.info("**** TESTING:::: DROPPING PACKET "+currentSequenceNumber+" FOR TESTING"); - // return; - //} +// if(n==666){ +// logger.info("**** TESTING:::: DROPPING PACKET "+currentSequenceNumber+" FOR TESTING"); +// return; +// } long currentDataPacketArrivalTime = Util.getCurrentTime(); Modified: udt-java/trunk/src/main/java/udt/packets/ControlPacket.java =================================================================== --- udt-java/trunk/src/main/java/udt/packets/ControlPacket.java 2010-09-01 13:58:45 UTC (rev 47) +++ udt-java/trunk/src/main/java/udt/packets/ControlPacket.java 2010-09-13 18:55:07 UTC (rev 48) @@ -32,9 +32,6 @@ package udt.packets; -import java.io.ByteArrayOutputStream; -import java.io.IOException; - import udt.UDTPacket; import udt.UDTSession; @@ -89,19 +86,13 @@ * return the header according to specification p.5 * @return */ - //TODO order?!?!? - public byte[] getHeader(){ -// //sequence number with highest bit set to "0" - try{ - ByteArrayOutputStream bos=new ByteArrayOutputStream(16); - bos.write(PacketUtil.encodeControlPacketType(controlPacketType)); - bos.write(PacketUtil.encode(getAdditionalInfo())); - bos.write(PacketUtil.encode(timeStamp)); - bos.write(PacketUtil.encode(destinationID)); - return bos.toByteArray(); - }catch(IOException ioe){/*can't happen*/ - return null; - } + byte[] getHeader(){ + byte[]res=new byte[16]; + System.arraycopy(PacketUtil.encodeControlPacketType(controlPacketType), 0, res, 0, 4); + System.arraycopy(PacketUtil.encode(getAdditionalInfo()), 0, res, 4, 4); + System.arraycopy(PacketUtil.encode(timeStamp), 0, res, 8, 4); + System.arraycopy(PacketUtil.encode(destinationID), 0, res, 12, 4); + return res; } /** Modified: udt-java/trunk/src/main/java/udt/packets/DataPacket.java =================================================================== --- udt-java/trunk/src/main/java/udt/packets/DataPacket.java 2010-09-01 13:58:45 UTC (rev 47) +++ udt-java/trunk/src/main/java/udt/packets/DataPacket.java 2010-09-13 18:55:07 UTC (rev 48) @@ -32,9 +32,6 @@ package udt.packets; -import java.io.ByteArrayOutputStream; -import java.io.IOException; - import udt.UDTPacket; import udt.UDTSession; @@ -115,8 +112,6 @@ return this.timeStamp; } - - public void setDestinationID(long destinationID) { this.destinationID=destinationID; } @@ -125,36 +120,16 @@ this.timeStamp=timeStamp; } - - /** - * return the header according to specification p.5 - * @return - */ - //TODO order? - public byte[] getHeader(){ - //sequence number with highest bit set to "0" - try{ - ByteArrayOutputStream bos=new ByteArrayOutputStream(16); - bos.write(PacketUtil.encode(packetSequenceNumber)); - bos.write(PacketUtil.encode(messageNumber)); - bos.write(PacketUtil.encode(timeStamp)); - bos.write(PacketUtil.encode(destinationID)); - return bos.toByteArray(); - - }catch(IOException ioe){/*can't happen*/ - return null; - } - } - - /** * complete header+data packet for transmission */ public byte[] getEncoded(){ - byte[] header=getHeader(); //header.length is 16 byte[] result=new byte[16+data.length]; - System.arraycopy(header, 0, result, 0, 16); + System.arraycopy(PacketUtil.encode(packetSequenceNumber), 0, result, 0, 4); + System.arraycopy(PacketUtil.encode(messageNumber), 0, result, 4, 4); + System.arraycopy(PacketUtil.encode(timeStamp), 0, result, 8, 4); + System.arraycopy(PacketUtil.encode(destinationID), 0, result, 12, 4); System.arraycopy(data, 0, result, 16, data.length); return result; } Deleted: udt-java/trunk/src/test/java/udt/DummyControlPacket.java =================================================================== --- udt-java/trunk/src/test/java/udt/DummyControlPacket.java 2010-09-01 13:58:45 UTC (rev 47) +++ udt-java/trunk/src/test/java/udt/DummyControlPacket.java 2010-09-13 18:55:07 UTC (rev 48) @@ -1,16 +0,0 @@ -package udt; - -import udt.packets.ControlPacket; - -public class DummyControlPacket extends ControlPacket{ - - public DummyControlPacket(){ - - } - - @Override - public byte[]encodeControlInformation(){ - //TODO Auto-generate method sub - return null; - } -} \ No newline at end of file Deleted: udt-java/trunk/src/test/java/udt/TestControlPacketType.java =================================================================== --- udt-java/trunk/src/test/java/udt/TestControlPacketType.java 2010-09-01 13:58:45 UTC (rev 47) +++ udt-java/trunk/src/test/java/udt/TestControlPacketType.java 2010-09-13 18:55:07 UTC (rev 48) @@ -1,34 +0,0 @@ -package udt; - -import udt.packets.ControlPacket; -import udt.packets.ControlPacket.ControlPacketType; -import junit.framework.TestCase; - -public class TestControlPacketType extends TestCase { - - public void testSequenceNumber1(){ - ControlPacket p=new DummyControlPacket(); - byte[]x=p.getHeader(); - byte highest=x[0]; - assertEquals(128, highest & 0x80); - } - - public void testControlPacketTypes(){ - ControlPacketType t=ControlPacketType.CONNECTION_HANDSHAKE; - assertEquals(0,t.ordinal()); - t=ControlPacketType.KEEP_ALIVE; - assertEquals(1,t.ordinal()); - t=ControlPacketType.ACK; - assertEquals(2,t.ordinal()); - t=ControlPacketType.NAK; - assertEquals(3,t.ordinal()); - t=ControlPacketType.SHUTDOWN; - assertEquals(5,t.ordinal()); - t=ControlPacketType.ACK2; - assertEquals(6,t.ordinal()); - t=ControlPacketType.MESSAGE_DROP_REQUEST; - assertEquals(7,t.ordinal()); - t=ControlPacketType.USER_DEFINED; - assertEquals(15,t.ordinal()); - } -} Deleted: udt-java/trunk/src/test/java/udt/TestDataPacket.java =================================================================== --- udt-java/trunk/src/test/java/udt/TestDataPacket.java 2010-09-01 13:58:45 UTC (rev 47) +++ udt-java/trunk/src/test/java/udt/TestDataPacket.java 2010-09-13 18:55:07 UTC (rev 48) @@ -1,97 +0,0 @@ -package udt; - -import junit.framework.TestCase; -import udt.packets.DataPacket; - -public class TestDataPacket extends TestCase { - - public void testSequenceNumber1(){ - DataPacket p=new DataPacket(); - p.setPacketSequenceNumber(1); - byte[]x=p.getHeader(); - byte highest=x[0]; - //check highest bit is "0" for DataPacket - assertEquals(0, highest & 128); - byte lowest=x[3]; - assertEquals(1, lowest); - } - - public void testEncoded(){ - DataPacket p=new DataPacket(); - p.setPacketSequenceNumber(1); - byte[] data="test".getBytes(); - p.setData(data); - byte[]encoded=p.getEncoded(); - int headerLength=p.getHeader().length; - assertEquals(data.length+headerLength,encoded.length); - byte[]encData=new byte[data.length]; - System.arraycopy(encoded, headerLength, encData, 0, data.length); - String s=new String(encData); - assertEquals("test", s); - System.out.println("String s = " + s); - } - - - public void testDecode1(){ - - DataPacket testPacket1=new DataPacket(); - testPacket1.setPacketSequenceNumber(127); - testPacket1.setDestinationID(1); - byte[] data1="Hallo".getBytes(); - testPacket1.setData(data1); - - //get the encoded data - byte[]encodedData=testPacket1.getEncoded(); - - int headerLength=testPacket1.getHeader().length; - assertEquals(data1.length+headerLength,encodedData.length); - - byte[]payload=new byte[data1.length]; - System.arraycopy(encodedData, headerLength, payload, 0, data1.length); - String s1=new String(payload); - assertEquals("Hallo", s1); - - System.out.println("String s1 = " + s1); - System.out.println("tesPacket1Length = "+ testPacket1.getLength()); - System.out.println("sequenceNumber1 = " + testPacket1.getPacketSequenceNumber()); - System.out.println("messageNumber 1= " + testPacket1.getMessageNumber()); - System.out.println("timeStamp1 = " + testPacket1.getTimeStamp()); - System.out.println("destinationID1 = " + testPacket1.getDestinationID()); - System.out.println("data1 = " + new String(testPacket1.getData())); - - - //create a new DataPacket from the encoded data - DataPacket testPacket2=new DataPacket(encodedData); - // and test - System.out.println("tesPacket2Length = "+ testPacket2.getLength()); - System.out.println("sequenceNumber2 = " + testPacket2.getPacketSequenceNumber()); - System.out.println("messageNumber2 = " + testPacket2.getMessageNumber()); - System.out.println("timeStamp2 = " + testPacket2.getTimeStamp()); - System.out.println("destinationID1 = " + testPacket1.getDestinationID()); - System.out.println("data2 = " + new String(testPacket2.getData())); - - assertEquals(127,testPacket2.getPacketSequenceNumber()); - - - } - - public void testEncodeDecode1(){ - DataPacket dp=new DataPacket(); - dp.setPacketSequenceNumber(127); - dp.setMessageNumber(268435457); - dp.setTimeStamp(128); - dp.setDestinationID(255); - dp.setData("test".getBytes()); - - byte[]encodedData1=dp.getEncoded(); - - DataPacket dp2=new DataPacket(encodedData1); - assertEquals(127,dp2.getPacketSequenceNumber()); - assertEquals(268435457,dp2.getMessageNumber()); - assertEquals(128,dp2.getTimeStamp()); - assertEquals(255,dp2.getDestinationID()); - assertEquals("test", new String(dp2.getData())); - } - - -} Deleted: udt-java/trunk/src/test/java/udt/TestPacketFactory.java =================================================================== --- udt-java/trunk/src/test/java/udt/TestPacketFactory.java 2010-09-01 13:58:45 UTC (rev 47) +++ udt-java/trunk/src/test/java/udt/TestPacketFactory.java 2010-09-13 18:55:07 UTC (rev 48) @@ -1,181 +0,0 @@ -package udt; - -import java.util.ArrayList; -import java.util.List; - -import junit.framework.TestCase; -import udt.packets.Acknowledgement; -import udt.packets.Acknowledgment2; -import udt.packets.ConnectionHandshake; -import udt.packets.DataPacket; -import udt.packets.MessageDropRequest; -import udt.packets.NegativeAcknowledgement; -import udt.packets.PacketFactory; -import udt.packets.Shutdown; - -public class TestPacketFactory extends TestCase { - - public void testData(){ - String test="sdjfsdjfldskjflds"; - - byte[]data=test.getBytes(); - data[0]=(byte)(data[0] & 0x7f); - UDTPacket p=PacketFactory.createPacket(data); - DataPacket recv=(DataPacket)p; - String t=new String(recv.getEncoded()); - assertTrue(p instanceof DataPacket); - assertEquals(test,t); - } - - - public void testConnectionHandshake(){ - ConnectionHandshake p1 = new ConnectionHandshake(); - p1.setMessageNumber(9876); - p1.setTimeStamp(3456); - p1.setDestinationID(1); - - p1.setConnectionType(1); - p1.setSocketType(1); - p1.setInitialSeqNo(321); - p1.setPacketSize(128); - p1.setMaxFlowWndSize(128); - p1.setSocketID(1); - p1.setUdtVersion(4); - - - byte[]p1_data=p1.getEncoded(); - - UDTPacket p=PacketFactory.createPacket(p1_data); - ConnectionHandshake p2=(ConnectionHandshake)p; - assertEquals(p1,p2); - - } - - public void testAcknowledgement(){ - Acknowledgement p1 = new Acknowledgement(); - p1.setAckSequenceNumber(1234); - p1.setMessageNumber(9876); - p1.setTimeStamp(3456); - p1.setDestinationID(1); - p1.setBufferSize(128); - p1.setEstimatedLinkCapacity(16); - p1.setAckNumber(9870); - p1.setPacketReceiveRate(1000); - p1.setRoundTripTime(1000); - p1.setRoundTripTimeVar(500); - - byte[]p1_data=p1.getEncoded(); - UDTPacket p=PacketFactory.createPacket(p1_data); - Acknowledgement p2=(Acknowledgement)p; - assertEquals(p1,p2); - } - - public void testAcknowledgementOfAcknowledgement(){ - Acknowledgment2 p1 = new Acknowledgment2(); - p1.setAckSequenceNumber(1230); - p1.setMessageNumber(9871); - p1.setTimeStamp(3451); - p1.setDestinationID(1); - - byte[]p1_data=p1.getEncoded(); - UDTPacket p=PacketFactory.createPacket(p1_data); - Acknowledgment2 p2=(Acknowledgment2)p; - assertEquals(p1,p2); - - - } - - public void testNegativeAcknowledgement(){ - NegativeAcknowledgement p1 = new NegativeAcknowledgement(); - p1.setMessageNumber(9872); - p1.setTimeStamp(3452); - p1.setDestinationID(2); - p1.addLossInfo(5); - p1.addLossInfo(6); - p1.addLossInfo(7, 10); - byte[]p1_data=p1.getEncoded(); - - UDTPacket p=PacketFactory.createPacket(p1_data); - NegativeAcknowledgement p2=(NegativeAcknowledgement)p; - assertEquals(p1,p2); - - assertEquals((Integer)5, (Integer)p2.getDecodedLossInfo().get(0)); - assertEquals(6, p2.getDecodedLossInfo().size()); - } - - public void testNegativeAcknowledgement2(){ - NegativeAcknowledgement p1 = new NegativeAcknowledgement(); - p1.setMessageNumber(9872); - p1.setTimeStamp(3452); - p1.setDestinationID(2); - List<Long>loss=new ArrayList<Long>(); - loss.add(5l); - loss.add(6l); - loss.add(7l); - loss.add(8l); - loss.add(9l); - loss.add(11l); - - p1.addLossInfo(loss); - byte[]p1_data=p1.getEncoded(); - - UDTPacket p=PacketFactory.createPacket(p1_data); - NegativeAcknowledgement p2=(NegativeAcknowledgement)p; - assertEquals(p1,p2); - - assertEquals((Integer)5, (Integer)p2.getDecodedLossInfo().get(0)); - assertEquals(6, p2.getDecodedLossInfo().size()); - } - - public void testNegativeAcknowledgement3(){ - NegativeAcknowledgement p1 = new NegativeAcknowledgement(); - p1.setMessageNumber(9872); - p1.setTimeStamp(3452); - p1.setDestinationID(2); - p1.addLossInfo(5); - p1.addLossInfo(6); - p1.addLossInfo(147, 226); - byte[]p1_data=p1.getEncoded(); - - UDTPacket p=PacketFactory.createPacket(p1_data); - NegativeAcknowledgement p2=(NegativeAcknowledgement)p; - assertEquals(p1,p2); - - - } - - public void testShutdown(){ - Shutdown p1 = new Shutdown(); - p1.setMessageNumber(9874); - p1.setTimeStamp(3453); - p1.setDestinationID(3); - - - byte[]p1_data=p1.getEncoded(); - - UDTPacket p=PacketFactory.createPacket(p1_data); - Shutdown p2=(Shutdown)p; - assertEquals(p1,p2); - } - - - - public void testMessageDropRequest(){ - MessageDropRequest p1=new MessageDropRequest(); - p1.setMessageNumber(9876); - p1.setTimeStamp(3456); - p1.setDestinationID(4); - - p1.setMsgFirstSeqNo(2); - p1.setMsgLastSeqNo(3); - - - byte[]p1_data=p1.getEncoded(); - - UDTPacket p=PacketFactory.createPacket(p1_data); - assertTrue(p instanceof MessageDropRequest); - MessageDropRequest p2=(MessageDropRequest)p; - assertEquals(p1,p2); - } - -} Copied: udt-java/trunk/src/test/java/udt/packets/DummyControlPacket.java (from rev 41, udt-java/trunk/src/test/java/udt/DummyControlPacket.java) =================================================================== --- udt-java/trunk/src/test/java/udt/packets/DummyControlPacket.java (rev 0) +++ udt-java/trunk/src/test/java/udt/packets/DummyControlPacket.java 2010-09-13 18:55:07 UTC (rev 48) @@ -0,0 +1,16 @@ +package udt.packets; + +import udt.packets.ControlPacket; + +public class DummyControlPacket extends ControlPacket{ + + public DummyControlPacket(){ + + } + + @Override + public byte[]encodeControlInformation(){ + //TODO Auto-generate method sub + return null; + } +} \ No newline at end of file Copied: udt-java/trunk/src/test/java/udt/packets/TestControlPacketType.java (from rev 46, udt-java/trunk/src/test/java/udt/TestControlPacketType.java) =================================================================== --- udt-java/trunk/src/test/java/udt/packets/TestControlPacketType.java (rev 0) +++ udt-java/trunk/src/test/java/udt/packets/TestControlPacketType.java 2010-09-13 18:55:07 UTC (rev 48) @@ -0,0 +1,34 @@ +package udt.packets; + +import udt.packets.ControlPacket; +import udt.packets.ControlPacket.ControlPacketType; +import junit.framework.TestCase; + +public class TestControlPacketType extends TestCase { + + public void testSequenceNumber1(){ + ControlPacket p=new DummyControlPacket(); + byte[]x=p.getHeader(); + byte highest=x[0]; + assertEquals(128, highest & 0x80); + } + + public void testControlPacketTypes(){ + ControlPacketType t=ControlPacketType.CONNECTION_HANDSHAKE; + assertEquals(0,t.ordinal()); + t=ControlPacketType.KEEP_ALIVE; + assertEquals(1,t.ordinal()); + t=ControlPacketType.ACK; + assertEquals(2,t.ordinal()); + t=ControlPacketType.NAK; + assertEquals(3,t.ordinal()); + t=ControlPacketType.SHUTDOWN; + assertEquals(5,t.ordinal()); + t=ControlPacketType.ACK2; + assertEquals(6,t.ordinal()); + t=ControlPacketType.MESSAGE_DROP_REQUEST; + assertEquals(7,t.ordinal()); + t=ControlPacketType.USER_DEFINED; + assertEquals(15,t.ordinal()); + } +} Copied: udt-java/trunk/src/test/java/udt/packets/TestDataPacket.java (from rev 41, udt-java/trunk/src/test/java/udt/TestDataPacket.java) =================================================================== --- udt-java/trunk/src/test/java/udt/packets/TestDataPacket.java (rev 0) +++ udt-java/trunk/src/test/java/udt/packets/TestDataPacket.java 2010-09-13 18:55:07 UTC (rev 48) @@ -0,0 +1,96 @@ +package udt.packets; + +import junit.framework.TestCase; +import udt.packets.DataPacket; + +public class TestDataPacket extends TestCase { + + public void testSequenceNumber1(){ + DataPacket p=new DataPacket(); + p.setPacketSequenceNumber(1); + p.setData(new byte[0]); + byte[]x=p.getEncoded(); + byte highest=x[0]; + //check highest bit is "0" for DataPacket + assertEquals(0, highest & 128); + byte lowest=x[3]; + assertEquals(1, lowest); + } + + public void testEncoded(){ + DataPacket p=new DataPacket(); + p.setPacketSequenceNumber(1); + byte[] data="test".getBytes(); + p.setData(data); + byte[]encoded=p.getEncoded(); + byte[]encData=new byte[data.length]; + System.arraycopy(encoded, 16, encData, 0, data.length); + String s=new String(encData); + assertEquals("test", s); + System.out.println("String s = " + s); + } + + + public void testDecode1(){ + + DataPacket testPacket1=new DataPacket(); + testPacket1.setPacketSequenceNumber(127); + testPacket1.setDestinationID(1); + byte[] data1="Hallo".getBytes(); + testPacket1.setData(data1); + + //get the encoded data + byte[]encodedData=testPacket1.getEncoded(); + + int headerLength=16; + assertEquals(data1.length+headerLength,encodedData.length); + + byte[]payload=new byte[data1.length]; + System.arraycopy(encodedData, headerLength, payload, 0, data1.length); + String s1=new String(payload); + assertEquals("Hallo", s1); + + System.out.println("String s1 = " + s1); + System.out.println("tesPacket1Length = "+ testPacket1.getLength()); + System.out.println("sequenceNumber1 = " + testPacket1.getPacketSequenceNumber()); + System.out.println("messageNumber 1= " + testPacket1.getMessageNumber()); + System.out.println("timeStamp1 = " + testPacket1.getTimeStamp()); + System.out.println("destinationID1 = " + testPacket1.getDestinationID()); + System.out.println("data1 = " + new String(testPacket1.getData())); + + + //create a new DataPacket from the encoded data + DataPacket testPacket2=new DataPacket(encodedData); + // and test + System.out.println("tesPacket2Length = "+ testPacket2.getLength()); + System.out.println("sequenceNumber2 = " + testPacket2.getPacketSequenceNumber()); + System.out.println("messageNumber2 = " + testPacket2.getMessageNumber()); + System.out.println("timeStamp2 = " + testPacket2.getTimeStamp()); + System.out.println("destinationID1 = " + testPacket1.getDestinationID()); + System.out.println("data2 = " + new String(testPacket2.getData())); + + assertEquals(127,testPacket2.getPacketSequenceNumber()); + + + } + + public void testEncodeDecode1(){ + DataPacket dp=new DataPacket(); + dp.setPacketSequenceNumber(127); + dp.setMessageNumber(268435457); + dp.setTimeStamp(128); + dp.setDestinationID(255); + dp.setData("test".getBytes()); + + byte[]encodedData1=dp.getEncoded(); + + DataPacket dp2=new DataPacket(encodedData1); + assertEquals(127,dp2.getPacketSequenceNumber()); + assertEquals(268435457,dp2.getMessageNumber()); + assertEquals(128,dp2.getTimeStamp()); + assertEquals(255,dp2.getDestinationID()); + assertEquals("test", new String(dp2.getData())); + } + + +} Copied: udt-java/trunk/src/test/java/udt/packets/TestPacketFactory.java (from rev 43, udt-java/trunk/src/test/java/udt/TestPacketFactory.java) =================================================================== --- udt-java/trunk/src/test/java/udt/packets/TestPacketFactory.java (rev 0) +++ udt-java/trunk/src/test/java/udt/packets/TestPacketFactory.java 2010-09-13 18:55:07 UTC (rev 48) @@ -0,0 +1,182 @@ +package udt.packets; + +import java.util.ArrayList; +import java.util.List; + +import junit.framework.TestCase; +import udt.UDTPacket; +import udt.packets.Acknowledgement; +import udt.packets.Acknowledgment2; +import udt.packets.ConnectionHandshake; +import udt.packets.DataPacket; +import udt.packets.MessageDropRequest; +import udt.packets.NegativeAcknowledgement; +import udt.packets.PacketFactory; +import udt.packets.Shutdown; + +public class TestPacketFactory extends TestCase { + + public void testData(){ + String test="sdjfsdjfldskjflds"; + + byte[]data=test.getBytes(); + data[0]=(byte)(data[0] & 0x7f); + UDTPacket p=PacketFactory.createPacket(data); + DataPacket recv=(DataPacket)p; + String t=new String(recv.getEncoded()); + assertTrue(p instanceof DataPacket); + assertEquals(test,t); + } + + + public void testConnectionHandshake(){ + ConnectionHandshake p1 = new ConnectionHandshake(); + p1.setMessageNumber(9876); + p1.setTimeStamp(3456); + p1.setDestinationID(1); + + p1.setConnectionType(1); + p1.setSocketType(1); + p1.setInitialSeqNo(321); + p1.setPacketSize(128); + p1.setMaxFlowWndSize(128); + p1.setSocketID(1); + p1.setUdtVersion(4); + + + byte[]p1_data=p1.getEncoded(); + + UDTPacket p=PacketFactory.createPacket(p1_data); + ConnectionHandshake p2=(ConnectionHandshake)p; + assertEquals(p1,p2); + + } + + public void testAcknowledgement(){ + Acknowledgement p1 = new Acknowledgement(); + p1.setAckSequenceNumber(1234); + p1.setMessageNumber(9876); + p1.setTimeStamp(3456); + p1.setDestinationID(1); + p1.setBufferSize(128); + p1.setEstimatedLinkCapacity(16); + p1.setAckNumber(9870); + p1.setPacketReceiveRate(1000); + p1.setRoundTripTime(1000); + p1.setRoundTripTimeVar(500); + + byte[]p1_data=p1.getEncoded(); + UDTPacket p=PacketFactory.createPacket(p1_data); + Acknowledgement p2=(Acknowledgement)p; + assertEquals(p1,p2); + } + + public void testAcknowledgementOfAcknowledgement(){ + Acknowledgment2 p1 = new Acknowledgment2(); + p1.setAckSequenceNumber(1230); + p1.setMessageNumber(9871); + p1.setTimeStamp(3451); + p1.setDestinationID(1); + + byte[]p1_data=p1.getEncoded(); + UDTPacket p=PacketFactory.createPacket(p1_data); + Acknowledgment2 p2=(Acknowledgment2)p; + assertEquals(p1,p2); + + + } + + public void testNegativeAcknowledgement(){ + NegativeAcknowledgement p1 = new NegativeAcknowledgement(); + p1.setMessageNumber(9872); + p1.setTimeStamp(3452); + p1.setDestinationID(2); + p1.addLossInfo(5); + p1.addLossInfo(6); + p1.addLossInfo(7, 10); + byte[]p1_data=p1.getEncoded(); + + UDTPacket p=PacketFactory.createPacket(p1_data); + NegativeAcknowledgement p2=(NegativeAcknowledgement)p; + assertEquals(p1,p2); + + assertEquals((Integer)5, (Integer)p2.getDecodedLossInfo().get(0)); + assertEquals(6, p2.getDecodedLossInfo().size()); + } + + public void testNegativeAcknowledgement2(){ + NegativeAcknowledgement p1 = new NegativeAcknowledgement(); + p1.setMessageNumber(9872); + p1.setTimeStamp(3452); + p1.setDestinationID(2); + List<Long>loss=new ArrayList<Long>(); + loss.add(5l); + loss.add(6l); + loss.add(7l); + loss.add(8l); + loss.add(9l); + loss.add(11l); + + p1.addLossInfo(loss); + byte[]p1_data=p1.getEncoded(); + + UDTPacket p=PacketFactory.createPacket(p1_data); + NegativeAcknowledgement p2=(NegativeAcknowledgement)p; + assertEquals(p1,p2); + + assertEquals((Integer)5, (Integer)p2.getDecodedLossInfo().get(0)); + assertEquals(6, p2.getDecodedLossInfo().size()); + } + + public void testNegativeAcknowledgement3(){ + NegativeAcknowledgement p1 = new NegativeAcknowledgement(); + p1.setMessageNumber(9872); + p1.setTimeStamp(3452); + p1.setDestinationID(2); + p1.addLossInfo(5); + p1.addLossInfo(6); + p1.addLossInfo(147, 226); + byte[]p1_data=p1.getEncoded(); + + UDTPacket p=PacketFactory.createPacket(p1_data); + NegativeAcknowledgement p2=(NegativeAcknowledgement)p; + assertEquals(p1,p2); + + + } + + public void testShutdown(){ + Shutdown p1 = new Shutdown(); + p1.setMessageNumber(9874); + p1.setTimeStamp(3453); + p1.setDestinationID(3); + + + byte[]p1_data=p1.getEncoded(); + + UDTPacket p=PacketFactory.createPacket(p1_data); + Shutdown p2=(Shutdown)p; + assertEquals(p1,p2); + } + + + + public void testMessageDropRequest(){ + MessageDropRequest p1=new MessageDropRequest(); + p1.setMessageNumber(9876); + p1.setTimeStamp(3456); + p1.setDestinationID(4); + + p1.setMsgFirstSeqNo(2); + p1.setMsgLastSeqNo(3); + + + byte[]p1_data=p1.getEncoded(); + + UDTPacket p=PacketFactory.createPacket(p1_data); + assertTrue(p instanceof MessageDropRequest); + MessageDropRequest p2=(MessageDropRequest)p; + assertEquals(p1,p2); + } + +} This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <bsc...@us...> - 2010-09-01 13:58:51
|
Revision: 47 http://udt-java.svn.sourceforge.net/udt-java/?rev=47&view=rev Author: bschuller Date: 2010-09-01 13:58:45 +0000 (Wed, 01 Sep 2010) Log Message: ----------- fix unit test Modified Paths: -------------- udt-java/trunk/src/main/java/udt/UDTInputStream.java Modified: udt-java/trunk/src/main/java/udt/UDTInputStream.java =================================================================== --- udt-java/trunk/src/main/java/udt/UDTInputStream.java 2010-09-01 13:08:22 UTC (rev 46) +++ udt-java/trunk/src/main/java/udt/UDTInputStream.java 2010-09-01 13:58:45 UTC (rev 47) @@ -61,7 +61,7 @@ //the highest sequence number read by the application, initialised //to the initial sequence number minus one - private volatile long highestSequenceNumber; + private volatile long highestSequenceNumber=0; //set to 'false' by the receiver when it gets a shutdown signal from the peer //see the noMoreData() method @@ -82,7 +82,9 @@ this.statistics=statistics; int capacity=socket!=null? 4*socket.getSession().getFlowWindowSize() : 64 ; appData=new PriorityBlockingQueue<AppData>(capacity); - highestSequenceNumber=SequenceNumber.decrement(socket.getSession().getInitialSequenceNumber()); + if(socket!=null){ + highestSequenceNumber=SequenceNumber.decrement(socket.getSession().getInitialSequenceNumber()); + } } /** This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <bsc...@us...> - 2010-09-01 13:08:28
|
Revision: 46 http://udt-java.svn.sourceforge.net/udt-java/?rev=46&view=rev Author: bschuller Date: 2010-09-01 13:08:22 +0000 (Wed, 01 Sep 2010) Log Message: ----------- fix failing tests Modified Paths: -------------- udt-java/trunk/src/test/java/udt/TestControlPacketType.java udt-java/trunk/src/test/java/udt/TestUdpEndpoint.java Removed Paths: ------------- udt-java/trunk/src/test/java/udt/TestControlPacket.java Deleted: udt-java/trunk/src/test/java/udt/TestControlPacket.java =================================================================== --- udt-java/trunk/src/test/java/udt/TestControlPacket.java 2010-09-01 12:51:29 UTC (rev 45) +++ udt-java/trunk/src/test/java/udt/TestControlPacket.java 2010-09-01 13:08:22 UTC (rev 46) @@ -1,39 +0,0 @@ -package udt; - -import udt.packets.ControlPacket; -import udt.packets.ControlPacket.ControlPacketType; -import junit.framework.TestCase; - -public class TestControlPacket extends TestCase { - - public void testSequenceNumber1(){ - ControlPacket p=new DummyControlPacket(); - byte[]x=p.getHeader(); - byte highest=x[0]; - //check highest bit is "1" for ControlPacket - System.out.println(String.valueOf(highest)); - assertEquals(128, highest & 0x80); - byte lowest=x[3]; - assertEquals(1, lowest); - } - - public void testControlPacketTyps(){ - ControlPacketType t=ControlPacketType.CONNECTION_HANDSHAKE; - assertEquals(0,t.ordinal()); - - t=ControlPacketType.KEEP_ALIVE; - assertEquals(1,t.ordinal()); - t=ControlPacketType.ACK; - assertEquals(2,t.ordinal()); - t=ControlPacketType.NAK; - assertEquals(3,t.ordinal()); - t=ControlPacketType.SHUTDOWN; - assertEquals(5,t.ordinal()); - t=ControlPacketType.ACK2; - assertEquals(6,t.ordinal()); - t=ControlPacketType.MESSAGE_DROP_REQUEST; - assertEquals(7,t.ordinal()); - t=ControlPacketType.USER_DEFINED; - assertEquals(15,t.ordinal()); - } -} Modified: udt-java/trunk/src/test/java/udt/TestControlPacketType.java =================================================================== --- udt-java/trunk/src/test/java/udt/TestControlPacketType.java 2010-09-01 12:51:29 UTC (rev 45) +++ udt-java/trunk/src/test/java/udt/TestControlPacketType.java 2010-09-01 13:08:22 UTC (rev 46) @@ -10,10 +10,7 @@ ControlPacket p=new DummyControlPacket(); byte[]x=p.getHeader(); byte highest=x[0]; - //check highest bit is "1" for ControlPacket assertEquals(128, highest & 0x80); - byte lowest=x[3]; - assertEquals(1, lowest); } public void testControlPacketTypes(){ Modified: udt-java/trunk/src/test/java/udt/TestUdpEndpoint.java =================================================================== --- udt-java/trunk/src/test/java/udt/TestUdpEndpoint.java 2010-09-01 12:51:29 UTC (rev 45) +++ udt-java/trunk/src/test/java/udt/TestUdpEndpoint.java 2010-09-01 13:08:22 UTC (rev 46) @@ -65,49 +65,9 @@ Thread.sleep(1000); } - public void testRendezvousConnect()throws Exception{ - final UDTClient c1=new UDTClient(InetAddress.getByName("localhost"),12345); - final UDTClient c2=new UDTClient(InetAddress.getByName("localhost"),34567); - final String testMsg="test!!"; + //no rendezvous yet... + public void x_testRendezvousConnect()throws Exception{ - Runnable r1=new Runnable(){ - public void run(){ - try{ - //connect first client to second one - c1.connect("localhost", 34567); - System.out.println("C1 connected"); - //send a message - c1.getOutputStream().write(testMsg.getBytes()); - c1.flush(); - //read a message back - byte[]buf=new byte[testMsg.length()]; - c1.getInputStream().read(buf); - String received=new String(buf); - assertEquals(testMsg, received); - - }catch(Exception ex){ - ex.printStackTrace(); - } - } - }; - Thread t1=new Thread(r1); - t1.start(); - - //connect second client to first one - c2.connect("localhost", 12345); - System.out.println("C2 connected."); - Thread.sleep(500); - byte[]buf=new byte[testMsg.length()]; - c2.getInputStream().read(buf); - String received=new String(buf); - assertEquals(testMsg, received); - //send a message back - c2.getOutputStream().write(testMsg.getBytes()); - c2.flush(); - - //stop endpoints - c1.getEndpoint().stop(); - c2.getEndpoint().stop(); } public void testBindToAnyPort()throws Exception{ This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <bsc...@us...> - 2010-09-01 12:51:36
|
Revision: 45 http://udt-java.svn.sourceforge.net/udt-java/?rev=45&view=rev Author: bschuller Date: 2010-09-01 12:51:29 +0000 (Wed, 01 Sep 2010) Log Message: ----------- send/recv file works with c++ version Modified Paths: -------------- udt-java/trunk/src/main/java/udt/ClientSession.java udt-java/trunk/src/main/java/udt/ServerSession.java udt-java/trunk/src/main/java/udt/UDPEndPoint.java udt-java/trunk/src/main/java/udt/UDTClient.java udt-java/trunk/src/main/java/udt/UDTSession.java udt-java/trunk/src/main/java/udt/packets/Acknowledgement.java udt-java/trunk/src/main/java/udt/packets/ConnectionHandshake.java udt-java/trunk/src/main/java/udt/packets/Destination.java udt-java/trunk/src/main/java/udt/util/ReceiveFile.java Modified: udt-java/trunk/src/main/java/udt/ClientSession.java =================================================================== --- udt-java/trunk/src/main/java/udt/ClientSession.java 2010-08-31 09:34:20 UTC (rev 44) +++ udt-java/trunk/src/main/java/udt/ClientSession.java 2010-09-01 12:51:29 UTC (rev 45) @@ -43,18 +43,15 @@ import udt.util.SequenceNumber; /** - * Keep state of a UDT connection. Once established, the - * session provides a valid {@link UDTSocket}. - * This can be used as client session in both client-server mode and rendezvous mode. - * - * + * Client side of a client-server UDT connection. + * Once established, the session provides a valid {@link UDTSocket}. */ public class ClientSession extends UDTSession { private static final Logger logger=Logger.getLogger(ClientSession.class.getName()); private UDPEndPoint endPoint; - + public ClientSession(UDPEndPoint endPoint, Destination dest)throws SocketException{ super("ClientSession localPort="+endPoint.getLocalPort(),dest); this.endPoint=endPoint; @@ -67,11 +64,11 @@ * @throws InterruptedException * @throws IOException */ - + public void connect() throws InterruptedException,IOException{ int n=0; - sendHandShake(); while(getState()!=ready){ + sendHandShake(); if(getState()==invalid)throw new IOException("Can't connect!"); n++; if(getState()!=ready)Thread.sleep(500); @@ -79,28 +76,48 @@ cc.init(); logger.info("Connected, "+n+" handshake packets sent"); } - + @Override public void received(UDTPacket packet, Destination peer) { - + lastPacket=packet; - - if (getState()!=ready && packet instanceof ConnectionHandshake) { - try{ - logger.info("Received connection handshake from "+peer); - //TODO validate parameters sent by peer - setState(ready); - long peerSocketID=((ConnectionHandshake)packet).getSocketID(); - destination.setSocketID(peerSocketID); - socket=new UDTSocket(endPoint,this); - }catch(Exception ex){ - logger.log(Level.WARNING,"Error creating socket",ex); - setState(invalid); + + if (packet instanceof ConnectionHandshake) { + ConnectionHandshake hs=(ConnectionHandshake)packet; + + logger.info("Received connection handshake from "+peer+"\n"+hs); + + if (getState()!=ready) { + if(hs.getConnectionType()==1){ + try{ + //TODO validate parameters sent by peer + long peerSocketID=hs.getSocketID(); + destination.setSocketID(peerSocketID); + sendConfirmation(hs); + }catch(Exception ex){ + logger.log(Level.WARNING,"Error creating socket",ex); + setState(invalid); + } + return; + } + else{ + try{ + //TODO validate parameters sent by peer + long peerSocketID=hs.getSocketID(); + destination.setSocketID(peerSocketID); + setState(ready); + socket=new UDTSocket(endPoint,this); + }catch(Exception ex){ + logger.log(Level.WARNING,"Error creating socket",ex); + setState(invalid); + } + return; + } } - return; } + if(getState() == ready) { - + if(packet instanceof Shutdown){ setState(shutdown); active=false; @@ -120,27 +137,41 @@ setState(invalid); } return; - } + } } //handshake for connect protected void sendHandShake()throws IOException{ ConnectionHandshake handshake = new ConnectionHandshake(); - handshake.setConnectionType(1); - handshake.setSocketType(1); + handshake.setConnectionType(ConnectionHandshake.CONNECTION_TYPE_REGULAR); + handshake.setSocketType(ConnectionHandshake.SOCKET_TYPE_DGRAM); long initialSequenceNo=SequenceNumber.random(); setInitialSequenceNumber(initialSequenceNo); handshake.setInitialSeqNo(initialSequenceNo); handshake.setPacketSize(getDatagramSize()); handshake.setSocketID(mySocketID); + handshake.setMaxFlowWndSize(flowWindowSize); handshake.setSession(this); logger.info("Sending "+handshake); endPoint.doSend(handshake); } - - + //2nd handshake for connect + protected void sendConfirmation(ConnectionHandshake hs)throws IOException{ + ConnectionHandshake handshake = new ConnectionHandshake(); + handshake.setConnectionType(-1); + handshake.setSocketType(ConnectionHandshake.SOCKET_TYPE_DGRAM); + handshake.setInitialSeqNo(hs.getInitialSeqNo()); + handshake.setPacketSize(hs.getPacketSize()); + handshake.setSocketID(mySocketID); + handshake.setMaxFlowWndSize(flowWindowSize); + handshake.setSession(this); + logger.info("Sending confirmation "+handshake); + endPoint.doSend(handshake); + } + + public UDTPacket getLastPkt(){ return lastPacket; } Modified: udt-java/trunk/src/main/java/udt/ServerSession.java =================================================================== --- udt-java/trunk/src/main/java/udt/ServerSession.java 2010-08-31 09:34:20 UTC (rev 44) +++ udt-java/trunk/src/main/java/udt/ServerSession.java 2010-09-01 12:51:29 UTC (rev 45) @@ -67,33 +67,37 @@ @Override public void received(UDTPacket packet, Destination peer){ lastPacket=packet; - if (getState()<=ready && packet instanceof ConnectionHandshake) { + + if(packet instanceof ConnectionHandshake) { ConnectionHandshake connectionHandshake=(ConnectionHandshake)packet; - destination.setSocketID(connectionHandshake.getSocketID()); - logger.info("Received "+connectionHandshake); - - if(getState()<=handshaking){ - setState(handshaking); - } - try{ - handleHandShake(connectionHandshake); - n_handshake++; + + if (getState()<=ready){ + destination.setSocketID(connectionHandshake.getSocketID()); + + if(getState()<=handshaking){ + setState(handshaking); + } try{ - setState(ready); - socket=new UDTSocket(endPoint, this); - cc.init(); - }catch(Exception uhe){ - //session is invalid - logger.log(Level.SEVERE,"",uhe); + handleHandShake(connectionHandshake); + n_handshake++; + try{ + setState(ready); + socket=new UDTSocket(endPoint, this); + cc.init(); + }catch(Exception uhe){ + //session is invalid + logger.log(Level.SEVERE,"",uhe); + setState(invalid); + } + }catch(IOException ex){ + //session invalid + logger.log(Level.WARNING,"Error processing ConnectionHandshake",ex); setState(invalid); } - }catch(IOException ex){ - //session invalid - logger.log(Level.WARNING,"Error processing ConnectionHandshake",ex); - setState(invalid); + return; } - return; + }else if(packet instanceof KeepAlive) { socket.getReceiver().resetEXPTimer(); active = true; Modified: udt-java/trunk/src/main/java/udt/UDPEndPoint.java =================================================================== --- udt-java/trunk/src/main/java/udt/UDPEndPoint.java 2010-08-31 09:34:20 UTC (rev 44) +++ udt-java/trunk/src/main/java/udt/UDPEndPoint.java 2010-09-01 12:51:29 UTC (rev 45) @@ -67,9 +67,6 @@ //active sessions keyed by socket ID private final Map<Long,UDTSession>sessions=new ConcurrentHashMap<Long, UDTSession>(); - //connecting sessions keyed by peer destination - private final Map<Destination,UDTSession>clientSessions=new ConcurrentHashMap<Destination, UDTSession>();; - //last received packet private UDTPacket lastPacket; @@ -82,7 +79,7 @@ //has the endpoint been stopped? private volatile boolean stopped=false; - public static final int DATAGRAM_SIZE=1200; + public static final int DATAGRAM_SIZE=1400; /** * create an endpoint on the given socket @@ -206,14 +203,6 @@ sessions.put(destinationID, session); } - public void addClientSession(Destination peer,UDTSession session){ - clientSessions.put(peer, session); - } - - public void removeClientSession(Destination peer){ - clientSessions.remove(peer); - } - public UDTSession getSession(Long destinationID){ return sessions.get(destinationID); } @@ -250,6 +239,8 @@ //MeanValue v=new MeanValue("receiver processing ",true, 256); + private int n=0; + private final Object lock=new Object(); protected void doReceive()throws IOException{ @@ -271,7 +262,8 @@ //handle connection handshake if(packet.isConnectionHandshake()){ synchronized(lock){ - UDTSession session=clientSessions.get(peer); + Long id=Long.valueOf(packet.getDestinationID()); + UDTSession session=sessions.get(id); if(session==null){ session=new ServerSession(dp,this); addSession(session.getSocketID(),session); @@ -299,7 +291,10 @@ lastDestID=dest; } if(session==null){ - logger.warning("Unknown session <"+packet.getDestinationID()+"> requested from <"+peer+"> packet type "+packet.getClass().getName()); + n++; + if(n%100==1){ + logger.warning("Unknown session <"+dest+"> requested from <"+peer+"> packet type "+packet.getClass().getName()); + } } else{ session.received(packet,peer); Modified: udt-java/trunk/src/main/java/udt/UDTClient.java =================================================================== --- udt-java/trunk/src/main/java/udt/UDTClient.java 2010-08-31 09:34:20 UTC (rev 44) +++ udt-java/trunk/src/main/java/udt/UDTClient.java 2010-09-01 12:51:29 UTC (rev 45) @@ -78,7 +78,6 @@ Destination destination=new Destination(address,port); //create client session... clientSession=new ClientSession(clientEndpoint,destination); - clientEndpoint.addClientSession(destination, clientSession); clientEndpoint.addSession(clientSession.getSocketID(), clientSession); clientEndpoint.start(); Modified: udt-java/trunk/src/main/java/udt/UDTSession.java =================================================================== --- udt-java/trunk/src/main/java/udt/UDTSession.java 2010-08-31 09:34:20 UTC (rev 44) +++ udt-java/trunk/src/main/java/udt/UDTSession.java 2010-09-01 12:51:29 UTC (rev 45) @@ -33,6 +33,7 @@ package udt; import java.net.DatagramPacket; +import java.util.Random; import java.util.concurrent.atomic.AtomicLong; import java.util.logging.Level; import java.util.logging.Logger; @@ -73,7 +74,7 @@ * flow window size, i.e. how many data packets are * in-flight at a single time */ - protected int flowWindowSize=4*128; + protected int flowWindowSize=8192;//4*128; /** * remote UDT entity (address and socket ID) @@ -104,7 +105,7 @@ protected final long mySocketID; - private final static AtomicLong nextSocketID=new AtomicLong(0); + private final static AtomicLong nextSocketID=new AtomicLong(20+new Random().nextInt(5000)); public UDTSession(String description, Destination destination){ statistics=new UDTStatistics(description); @@ -220,4 +221,14 @@ public DatagramPacket getDatagram(){ return dgPacket; } + + public String toString(){ + StringBuilder sb=new StringBuilder(); + sb.append(super.toString()); + sb.append(" ["); + sb.append("socketID=").append(this.mySocketID); + sb.append(" ]"); + return sb.toString(); + } + } Modified: udt-java/trunk/src/main/java/udt/packets/Acknowledgement.java =================================================================== --- udt-java/trunk/src/main/java/udt/packets/Acknowledgement.java 2010-08-31 09:34:20 UTC (rev 44) +++ udt-java/trunk/src/main/java/udt/packets/Acknowledgement.java 2010-09-01 12:51:29 UTC (rev 45) @@ -72,9 +72,9 @@ void decodeControlInformation(byte[] data){ ackNumber=PacketUtil.decode(data, 0); if(data.length>4){ - roundTripTime =PacketUtil.decode(data, 4); - roundTripTimeVariance = PacketUtil.decode(data, 8); - bufferSize = PacketUtil.decode(data, 12); + roundTripTime =PacketUtil.decode(data, 4); + roundTripTimeVariance = PacketUtil.decode(data, 8); + bufferSize = PacketUtil.decode(data, 12); } if(data.length>16){ pktArrivalSpeed = PacketUtil.decode(data, 16); Modified: udt-java/trunk/src/main/java/udt/packets/ConnectionHandshake.java =================================================================== --- udt-java/trunk/src/main/java/udt/packets/ConnectionHandshake.java 2010-08-31 09:34:20 UTC (rev 44) +++ udt-java/trunk/src/main/java/udt/packets/ConnectionHandshake.java 2010-09-01 12:51:29 UTC (rev 45) @@ -40,19 +40,25 @@ private long udtVersion=4; public static final long SOCKET_TYPE_STREAM=0; + public static final long SOCKET_TYPE_DGRAM=1; - private long socketType= SOCKET_TYPE_STREAM;//STREAM OR DGRAM + private long socketType= SOCKET_TYPE_DGRAM; //stream or dgram + private long initialSeqNo = 0; private long packetSize; private long maxFlowWndSize; - public static final long CONNECTION_TYPE_REGULAR=0; - public static final long CONNECTION_TYPE_RENDEZVOUS=1; - private long connectionType = 0;//regular or rendezvous mode + public static final long CONNECTION_TYPE_REGULAR=1; + public static final long CONNECTION_TYPE_RENDEZVOUS=0; + + private long connectionType = CONNECTION_TYPE_REGULAR;//regular or rendezvous mode + private long socketID; + private long cookie=0; + public ConnectionHandshake(){ this.controlPacketType=ControlPacketType.CONNECTION_HANDSHAKE.ordinal(); } @@ -75,6 +81,9 @@ maxFlowWndSize=PacketUtil.decode(data, 16); connectionType=PacketUtil.decode(data, 20); socketID=PacketUtil.decode(data, 24); + if(data.length>28){ + cookie=PacketUtil.decode(data, 28); + } } public long getUdtVersion() { @@ -176,16 +185,19 @@ public String toString(){ StringBuilder sb=new StringBuilder(); sb.append("ConnectionHandshake ["); + sb.append("connectionType=").append(connectionType); UDTSession session=getSession(); if(session!=null){ + sb.append(", "); sb.append(session.getDestination()); - sb.append(", "); } - sb.append("mySocketID=").append(socketID); + sb.append(", mySocketID=").append(socketID); sb.append(", initialSeqNo=").append(initialSeqNo); sb.append(", packetSize=").append(packetSize); sb.append(", maxFlowWndSize=").append(maxFlowWndSize); + sb.append(", socketType=").append(socketType); sb.append(", destSocketID=").append(destinationID); + if(cookie>0)sb.append(", cookie=").append(cookie); sb.append("]"); return sb.toString(); } Modified: udt-java/trunk/src/main/java/udt/packets/Destination.java =================================================================== --- udt-java/trunk/src/main/java/udt/packets/Destination.java 2010-08-31 09:34:20 UTC (rev 44) +++ udt-java/trunk/src/main/java/udt/packets/Destination.java 2010-09-01 12:51:29 UTC (rev 45) @@ -65,8 +65,8 @@ } public String toString(){ - return("Destination: "+address.getHostName()+" port="+port+" socketID="+socketID); - } + return("Destination ["+address.getHostName()+" port="+port+" socketID="+socketID)+"]"; + } @Override public int hashCode() { Modified: udt-java/trunk/src/main/java/udt/util/ReceiveFile.java =================================================================== --- udt-java/trunk/src/main/java/udt/util/ReceiveFile.java 2010-08-31 09:34:20 UTC (rev 44) +++ udt-java/trunk/src/main/java/udt/util/ReceiveFile.java 2010-09-01 12:51:29 UTC (rev 45) @@ -88,11 +88,10 @@ out.write(nameinfo); out.flush(); - //pause the sender to save some CPU time out.pauseOutput(); - //read size info (an 4-byte int) + //read size info (an 64 bit number) byte[]sizeInfo=new byte[8]; int total=0; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <bsc...@us...> - 2010-08-31 09:34:26
|
Revision: 44 http://udt-java.svn.sourceforge.net/udt-java/?rev=44&view=rev Author: bschuller Date: 2010-08-31 09:34:20 +0000 (Tue, 31 Aug 2010) Log Message: ----------- sendfile java WORKS with recvfile C++ (at least most of the time) Modified Paths: -------------- udt-java/trunk/src/main/java/udt/UDPEndPoint.java udt-java/trunk/src/main/java/udt/packets/Acknowledgement.java udt-java/trunk/src/main/java/udt/util/Application.java udt-java/trunk/src/main/java/udt/util/ReceiveFile.java udt-java/trunk/src/main/java/udt/util/SendFile.java udt-java/trunk/src/main/java/udt/util/Util.java Modified: udt-java/trunk/src/main/java/udt/UDPEndPoint.java =================================================================== --- udt-java/trunk/src/main/java/udt/UDPEndPoint.java 2010-08-30 21:17:15 UTC (rev 43) +++ udt-java/trunk/src/main/java/udt/UDPEndPoint.java 2010-08-31 09:34:20 UTC (rev 44) @@ -82,7 +82,7 @@ //has the endpoint been stopped? private volatile boolean stopped=false; - public static final int DATAGRAM_SIZE=1500; + public static final int DATAGRAM_SIZE=1200; /** * create an endpoint on the given socket Modified: udt-java/trunk/src/main/java/udt/packets/Acknowledgement.java =================================================================== --- udt-java/trunk/src/main/java/udt/packets/Acknowledgement.java 2010-08-30 21:17:15 UTC (rev 43) +++ udt-java/trunk/src/main/java/udt/packets/Acknowledgement.java 2010-08-31 09:34:20 UTC (rev 44) @@ -71,9 +71,11 @@ void decodeControlInformation(byte[] data){ ackNumber=PacketUtil.decode(data, 0); + if(data.length>4){ roundTripTime =PacketUtil.decode(data, 4); roundTripTimeVariance = PacketUtil.decode(data, 8); bufferSize = PacketUtil.decode(data, 12); + } if(data.length>16){ pktArrivalSpeed = PacketUtil.decode(data, 16); estimatedLinkCapacity = PacketUtil.decode(data, 20); Modified: udt-java/trunk/src/main/java/udt/util/Application.java =================================================================== --- udt-java/trunk/src/main/java/udt/util/Application.java 2010-08-30 21:17:15 UTC (rev 43) +++ udt-java/trunk/src/main/java/udt/util/Application.java 2010-08-31 09:34:20 UTC (rev 44) @@ -70,4 +70,11 @@ return new byte[]{m1,m2,m3,m4}; } + static byte[]encode64(long value){ + byte m4= (byte) (value>>24 ); + byte m3=(byte)(value>>16); + byte m2=(byte)(value>>8); + byte m1=(byte)(value); + return new byte[]{m1,m2,m3,m4,0,0,0,0}; + } } Modified: udt-java/trunk/src/main/java/udt/util/ReceiveFile.java =================================================================== --- udt-java/trunk/src/main/java/udt/util/ReceiveFile.java 2010-08-30 21:17:15 UTC (rev 43) +++ udt-java/trunk/src/main/java/udt/util/ReceiveFile.java 2010-08-31 09:34:20 UTC (rev 44) @@ -69,6 +69,7 @@ public void run(){ configure(); + verbose=true; try{ UDTReceiver.connectionExpiryDisabled=true; InetAddress myHost=localIP!=null?InetAddress.getByName(localIP):InetAddress.getLocalHost(); @@ -78,12 +79,14 @@ UDTOutputStream out=client.getOutputStream(); System.out.println("[ReceiveFile] Requesting file "+remoteFile); - //send name file info byte[]fName=remoteFile.getBytes(); - out.write(encode(fName.length)); - out.write(fName); + //send file name info + byte[]nameinfo=new byte[fName.length+4]; + System.arraycopy(encode(fName.length), 0, nameinfo, 0, 4); + System.arraycopy(fName, 0, nameinfo, 4, fName.length); + out.write(nameinfo); out.flush(); //pause the sender to save some CPU time @@ -99,7 +102,14 @@ total+=r; } long size=decode(sizeInfo, 0); - + if(verbose){ + StringBuilder sb=new StringBuilder(); + for(int i=0;i<sizeInfo.length;i++){ + sb.append(Integer.toString(sizeInfo[i])); + sb.append(" "); + } + System.out.println("[ReceiveFile] Size info: "+sb.toString()); + } File file=new File(new String(localFile)); System.out.println("[ReceiveFile] Write to local file <"+file.getAbsolutePath()+">"); FileOutputStream fos=new FileOutputStream(file); Modified: udt-java/trunk/src/main/java/udt/util/SendFile.java =================================================================== --- udt-java/trunk/src/main/java/udt/util/SendFile.java 2010-08-30 21:17:15 UTC (rev 43) +++ udt-java/trunk/src/main/java/udt/util/SendFile.java 2010-08-31 09:34:20 UTC (rev 44) @@ -168,8 +168,7 @@ long size=file.length(); System.out.println("[SendFile] File size: "+size); //send size info - out.write(encode(size)); - out.write(encode(0l)); + out.write(encode64(size)); out.flush(); long start=System.currentTimeMillis(); @@ -180,6 +179,7 @@ fis=new FileInputStream(file); Util.copy(fis, out, size, false); } + System.out.println("[SendFile] Finished sending data."); long end=System.currentTimeMillis(); System.out.println(socket.getSession().getStatistics().toString()); double rate=1000.0*size/1024/1024/(end-start); Modified: udt-java/trunk/src/main/java/udt/util/Util.java =================================================================== --- udt-java/trunk/src/main/java/udt/util/Util.java 2010-08-30 21:17:15 UTC (rev 43) +++ udt-java/trunk/src/main/java/udt/util/Util.java 2010-08-31 09:34:20 UTC (rev 44) @@ -136,7 +136,7 @@ read+=c; target.write(buf, 0, c); if(flush)target.flush(); - if(size>0 && read>=size)break; + if(read>=size && size>-1)break; } if(!flush)target.flush(); } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <bsc...@us...> - 2010-08-30 21:17:22
|
Revision: 43 http://udt-java.svn.sourceforge.net/udt-java/?rev=43&view=rev Author: bschuller Date: 2010-08-30 21:17:15 +0000 (Mon, 30 Aug 2010) Log Message: ----------- change packet encoding to be compatible with UDT v4 (C++ version); change send/recv file a bit. Does not quite work, but much better :) Modified Paths: -------------- udt-java/trunk/src/main/java/udt/ClientSession.java udt-java/trunk/src/main/java/udt/ServerSession.java udt-java/trunk/src/main/java/udt/UDPEndPoint.java udt-java/trunk/src/main/java/udt/UDTReceiver.java udt-java/trunk/src/main/java/udt/packets/Acknowledgement.java udt-java/trunk/src/main/java/udt/packets/Acknowledgment2.java udt-java/trunk/src/main/java/udt/packets/ConnectionHandshake.java udt-java/trunk/src/main/java/udt/packets/ControlPacket.java udt-java/trunk/src/main/java/udt/packets/DataPacket.java udt-java/trunk/src/main/java/udt/packets/PacketFactory.java udt-java/trunk/src/main/java/udt/packets/PacketUtil.java udt-java/trunk/src/main/java/udt/util/Application.java udt-java/trunk/src/main/java/udt/util/ReceiveFile.java udt-java/trunk/src/main/java/udt/util/SendFile.java udt-java/trunk/src/test/java/udt/TestControlPacket.java udt-java/trunk/src/test/java/udt/TestControlPacketType.java udt-java/trunk/src/test/java/udt/TestPacketFactory.java udt-java/trunk/src/test/java/udt/TestSendFileReceiveFile.java Modified: udt-java/trunk/src/main/java/udt/ClientSession.java =================================================================== --- udt-java/trunk/src/main/java/udt/ClientSession.java 2010-08-30 11:45:32 UTC (rev 42) +++ udt-java/trunk/src/main/java/udt/ClientSession.java 2010-08-30 21:17:15 UTC (rev 43) @@ -135,7 +135,7 @@ handshake.setPacketSize(getDatagramSize()); handshake.setSocketID(mySocketID); handshake.setSession(this); - logger.info("Handshake to "+this.getDestination()); + logger.info("Sending "+handshake); endPoint.doSend(handshake); } Modified: udt-java/trunk/src/main/java/udt/ServerSession.java =================================================================== --- udt-java/trunk/src/main/java/udt/ServerSession.java 2010-08-30 11:45:32 UTC (rev 42) +++ udt-java/trunk/src/main/java/udt/ServerSession.java 2010-08-30 21:17:15 UTC (rev 43) @@ -56,10 +56,10 @@ //last received packet (for testing purposes) private UDTPacket lastPacket; - public ServerSession(DatagramPacket dp,UDPEndPoint endPoint)throws SocketException,UnknownHostException{ + public ServerSession(DatagramPacket dp, UDPEndPoint endPoint)throws SocketException,UnknownHostException{ super("ServerSession localPort="+endPoint.getLocalPort()+" peer="+dp.getAddress()+":"+dp.getPort(),new Destination(dp.getAddress(),dp.getPort())); this.endPoint=endPoint; - logger.info("Created "+toString()+" talking to "+getDestination()); + logger.info("Created "+toString()+" talking to "+dp.getAddress()+":"+dp.getPort()); } int n_handshake=0; @@ -68,14 +68,16 @@ public void received(UDTPacket packet, Destination peer){ lastPacket=packet; if (getState()<=ready && packet instanceof ConnectionHandshake) { - logger.info("Received ConnectionHandshake from "+peer); ConnectionHandshake connectionHandshake=(ConnectionHandshake)packet; destination.setSocketID(connectionHandshake.getSocketID()); + + logger.info("Received "+connectionHandshake); + if(getState()<=handshaking){ setState(handshaking); } try{ - handleHandShake(connectionHandshake,peer); + handleHandShake(connectionHandshake); n_handshake++; try{ setState(ready); @@ -154,7 +156,7 @@ * @param peer * @throws IOException */ - protected void handleHandShake(ConnectionHandshake handshake,Destination peer)throws IOException{ + protected void handleHandShake(ConnectionHandshake handshake)throws IOException{ ConnectionHandshake responseHandshake = new ConnectionHandshake(); //compare the packet size and choose minimun long clientBufferSize=handshake.getPacketSize(); @@ -166,11 +168,13 @@ responseHandshake.setPacketSize(bufferSize); responseHandshake.setUdtVersion(4); responseHandshake.setInitialSeqNo(initialSequenceNumber); - responseHandshake.setConnectionType(1); + responseHandshake.setConnectionType(-1); + responseHandshake.setMaxFlowWndSize(handshake.getMaxFlowWndSize()); //tell peer what the socket ID on this side is responseHandshake.setSocketID(mySocketID); responseHandshake.setDestinationID(this.getDestination().getSocketID()); responseHandshake.setSession(this); + logger.info("Sending reply "+responseHandshake); endPoint.doSend(responseHandshake); } Modified: udt-java/trunk/src/main/java/udt/UDPEndPoint.java =================================================================== --- udt-java/trunk/src/main/java/udt/UDPEndPoint.java 2010-08-30 11:45:32 UTC (rev 42) +++ udt-java/trunk/src/main/java/udt/UDPEndPoint.java 2010-08-30 21:17:15 UTC (rev 43) @@ -50,7 +50,6 @@ import udt.packets.ConnectionHandshake; import udt.packets.Destination; import udt.packets.PacketFactory; -import udt.util.MeanValue; import udt.util.UDTThreadFactory; /** @@ -203,6 +202,7 @@ } public void addSession(Long destinationID,UDTSession session){ + logger.info("Storing session <"+destinationID+">"); sessions.put(destinationID, session); } @@ -248,17 +248,21 @@ private long lastDestID=-1; private UDTSession lastSession; - MeanValue v=new MeanValue("receiver processing ",true, 256); + //MeanValue v=new MeanValue("receiver processing ",true, 256); + private final Object lock=new Object(); + protected void doReceive()throws IOException{ while(!stopped){ try{ try{ - v.end(); + //v.end(); + //will block until a packet is received or timeout has expired dgSocket.receive(dp); - v.begin(); + //v.begin(); + Destination peer=new Destination(dp.getAddress(), dp.getPort()); int l=dp.getLength(); UDTPacket packet=PacketFactory.createPacket(dp.getData(),l); @@ -266,19 +270,21 @@ //handle connection handshake if(packet.isConnectionHandshake()){ - UDTSession session=clientSessions.get(peer); - if(session==null){ - session=new ServerSession(dp,this); - addSession(session.getSocketID(),session); - //TODO need to check peer to avoid duplicate server session - if(serverSocketMode){ - logger.fine("Pooling new request."); - sessionHandoff.put(session); - logger.fine("Request taken for processing."); + synchronized(lock){ + UDTSession session=clientSessions.get(peer); + if(session==null){ + session=new ServerSession(dp,this); + addSession(session.getSocketID(),session); + //TODO need to check peer to avoid duplicate server session + if(serverSocketMode){ + logger.fine("Pooling new request."); + sessionHandoff.put(session); + logger.fine("Request taken for processing."); + } } + peer.setSocketID(((ConnectionHandshake)packet).getSocketID()); + session.received(packet,peer); } - peer.setSocketID(((ConnectionHandshake)packet).getSocketID()); - session.received(packet,peer); } else{ //dispatch to existing session Modified: udt-java/trunk/src/main/java/udt/UDTReceiver.java =================================================================== --- udt-java/trunk/src/main/java/udt/UDTReceiver.java 2010-08-30 11:45:32 UTC (rev 42) +++ udt-java/trunk/src/main/java/udt/UDTReceiver.java 2010-08-30 21:17:15 UTC (rev 43) @@ -500,7 +500,7 @@ private Acknowledgement buildLightAcknowledgement(long ackNumber){ Acknowledgement acknowledgmentPkt = new Acknowledgement(); //the packet sequence number to which all the packets have been received - acknowledgmentPkt.setNexttoPrevPktSeqNO(ackNumber); + acknowledgmentPkt.setAckNumber(ackNumber); //assign this ack a unique increasing ACK sequence number acknowledgmentPkt.setAckSequenceNumber(++ackSequenceNumber); acknowledgmentPkt.setRoundTripTime(roundTripTime); Modified: udt-java/trunk/src/main/java/udt/packets/Acknowledgement.java =================================================================== --- udt-java/trunk/src/main/java/udt/packets/Acknowledgement.java 2010-08-30 11:45:32 UTC (rev 42) +++ udt-java/trunk/src/main/java/udt/packets/Acknowledgement.java 2010-08-30 21:17:15 UTC (rev 43) @@ -41,10 +41,13 @@ * receipt of packets */ public class Acknowledgement extends ControlPacket { - + + //the ack sequence number + private long ackSequenceNumber ; + //the packet sequence number to which all the previous packets have been received (excluding) private long ackNumber ; - + //round-trip time in microseconds(RTT) private long roundTripTime; // RTT variance @@ -55,13 +58,14 @@ private long pktArrivalSpeed; //estimated link capacity in number of packets per second private long estimatedLinkCapacity; - + public Acknowledgement(){ this.controlPacketType=ControlPacketType.ACK.ordinal(); } - - public Acknowledgement(byte[] controlInformation){ + + public Acknowledgement(long ackSeqNo, byte[] controlInformation){ this(); + this.ackSequenceNumber=ackSeqNo; decodeControlInformation(controlInformation); } @@ -70,10 +74,25 @@ roundTripTime =PacketUtil.decode(data, 4); roundTripTimeVariance = PacketUtil.decode(data, 8); bufferSize = PacketUtil.decode(data, 12); - pktArrivalSpeed = PacketUtil.decode(data, 16); - estimatedLinkCapacity = PacketUtil.decode(data, 20); + if(data.length>16){ + pktArrivalSpeed = PacketUtil.decode(data, 16); + estimatedLinkCapacity = PacketUtil.decode(data, 20); + } } + @Override + protected long getAdditionalInfo(){ + return ackSequenceNumber; + } + + public long getAckSequenceNumber() { + return ackSequenceNumber; + } + public void setAckSequenceNumber(long ackSequenceNumber) { + this.ackSequenceNumber = ackSequenceNumber; + } + + /** * get the ack number (the number up to which all packets have been received (excluding)) * @return @@ -81,15 +100,15 @@ public long getAckNumber() { return ackNumber; } - + /** * set the ack number (the number up to which all packets have been received (excluding)) - * @param nexttoPrevPktSeqNO + * @param ackNumber */ - public void setNexttoPrevPktSeqNO(long nexttoPrevPktSeqNO) { - ackNumber = nexttoPrevPktSeqNO; + public void setAckNumber(long ackNumber) { + this.ackNumber = ackNumber; } - + /** * get the round trip time (microseconds) * @return @@ -104,7 +123,7 @@ public void setRoundTripTime(long RoundTripTime) { roundTripTime = RoundTripTime; } - + /** * set the variance of the round trip time (in microseconds) * @param RoundTripTime @@ -112,35 +131,35 @@ public void setRoundTripTimeVar(long roundTripTimeVar) { roundTripTimeVariance = roundTripTimeVar; } - + public long getRoundTripTimeVar() { return roundTripTimeVariance; } - + public long getBufferSize() { return bufferSize; } - + public void setBufferSize(long bufferSiZe) { this.bufferSize = bufferSiZe; } - + public long getPacketReceiveRate() { return pktArrivalSpeed; } public void setPacketReceiveRate(long packetReceiveRate) { this.pktArrivalSpeed = packetReceiveRate; } - - + + public long getEstimatedLinkCapacity() { return estimatedLinkCapacity; } - + public void setEstimatedLinkCapacity(long estimatedLinkCapacity) { this.estimatedLinkCapacity = estimatedLinkCapacity; } - + @Override public byte[] encodeControlInformation(){ try { @@ -151,17 +170,17 @@ bos.write(PacketUtil.encode(bufferSize)); bos.write(PacketUtil.encode(pktArrivalSpeed)); bos.write(PacketUtil.encode(estimatedLinkCapacity)); - + return bos.toByteArray(); } catch (Exception e) { // can't happen return null; } - + } - + @Override public boolean equals(Object obj) { if (this == obj) @@ -185,9 +204,9 @@ return false; return true; } - - - - + + + + } Modified: udt-java/trunk/src/main/java/udt/packets/Acknowledgment2.java =================================================================== --- udt-java/trunk/src/main/java/udt/packets/Acknowledgment2.java 2010-08-30 11:45:32 UTC (rev 42) +++ udt-java/trunk/src/main/java/udt/packets/Acknowledgment2.java 2010-08-30 21:17:15 UTC (rev 43) @@ -39,28 +39,40 @@ */ public class Acknowledgment2 extends ControlPacket{ - public Acknowledgment2(){ - this.controlPacketType=ControlPacketType.ACK2.ordinal(); - } - - public Acknowledgment2(byte[]controlInformation){ - this(); - decode(controlInformation ); - } - - void decode(byte[]data){ - } - public boolean forSender(){ - return false; - } - - private static final byte[]empty=new byte[0]; - @Override - public byte[] encodeControlInformation(){ - return empty; - } + //the ack sequence number + private long ackSequenceNumber ; + + public Acknowledgment2(){ + this.controlPacketType=ControlPacketType.ACK2.ordinal(); } + public Acknowledgment2(long ackSeqNo,byte[]controlInformation){ + this(); + this.ackSequenceNumber=ackSeqNo; + decode(controlInformation ); + } + public long getAckSequenceNumber() { + return ackSequenceNumber; + } + public void setAckSequenceNumber(long ackSequenceNumber) { + this.ackSequenceNumber = ackSequenceNumber; + } + + void decode(byte[]data){ + } + public boolean forSender(){ + return false; + } + + private static final byte[]empty=new byte[0]; + @Override + public byte[] encodeControlInformation(){ + return empty; + } +} + + + Modified: udt-java/trunk/src/main/java/udt/packets/ConnectionHandshake.java =================================================================== --- udt-java/trunk/src/main/java/udt/packets/ConnectionHandshake.java 2010-08-30 11:45:32 UTC (rev 42) +++ udt-java/trunk/src/main/java/udt/packets/ConnectionHandshake.java 2010-08-30 21:17:15 UTC (rev 43) @@ -34,6 +34,8 @@ import java.io.ByteArrayOutputStream; +import udt.UDTSession; + public class ConnectionHandshake extends ControlPacket { private long udtVersion=4; @@ -57,7 +59,6 @@ public ConnectionHandshake(byte[]controlInformation){ this(); - //this.controlInformation=controlInformation; decode(controlInformation); } @@ -172,6 +173,23 @@ } + public String toString(){ + StringBuilder sb=new StringBuilder(); + sb.append("ConnectionHandshake ["); + UDTSession session=getSession(); + if(session!=null){ + sb.append(session.getDestination()); + sb.append(", "); + } + sb.append("mySocketID=").append(socketID); + sb.append(", initialSeqNo=").append(initialSeqNo); + sb.append(", packetSize=").append(packetSize); + sb.append(", maxFlowWndSize=").append(maxFlowWndSize); + sb.append(", destSocketID=").append(destinationID); + sb.append("]"); + return sb.toString(); + } + } Modified: udt-java/trunk/src/main/java/udt/packets/ControlPacket.java =================================================================== --- udt-java/trunk/src/main/java/udt/packets/ControlPacket.java 2010-08-30 11:45:32 UTC (rev 42) +++ udt-java/trunk/src/main/java/udt/packets/ControlPacket.java 2010-08-30 21:17:15 UTC (rev 43) @@ -42,9 +42,6 @@ protected int controlPacketType; - //used for ACK and ACK2 - protected long ackSequenceNumber; - protected long messageNumber; protected long timeStamp; @@ -63,14 +60,6 @@ return controlPacketType; } - public long getAckSequenceNumber() { - return ackSequenceNumber; - } - public void setAckSequenceNumber(long ackSequenceNumber) { - this.ackSequenceNumber = ackSequenceNumber; - } - - public long getMessageNumber() { return messageNumber; } @@ -105,8 +94,8 @@ // //sequence number with highest bit set to "0" try{ ByteArrayOutputStream bos=new ByteArrayOutputStream(16); - bos.write(PacketUtil.encodeHighesBitTypeAndSeqNumber(true, controlPacketType, ackSequenceNumber)); - bos.write(PacketUtil.encode(messageNumber)); + bos.write(PacketUtil.encodeControlPacketType(controlPacketType)); + bos.write(PacketUtil.encode(getAdditionalInfo())); bos.write(PacketUtil.encode(timeStamp)); bos.write(PacketUtil.encode(destinationID)); return bos.toByteArray(); @@ -114,6 +103,14 @@ return null; } } + + /** + * this method gets the "additional info" for this type of control packet + */ + protected long getAdditionalInfo(){ + return 0L; + } + /** * this method builds the control information @@ -149,16 +146,10 @@ if (getClass() != obj.getClass()) return false; ControlPacket other = (ControlPacket) obj; - if (ackSequenceNumber != other.ackSequenceNumber) - return false; if (controlPacketType != other.controlPacketType) return false; - //if (!Arrays.equals(controlInformation, other.controlInformation)) - // return false; if (destinationID != other.destinationID) return false; - if (messageNumber != other.messageNumber) - return false; if (timeStamp != other.timeStamp) return false; return true; Modified: udt-java/trunk/src/main/java/udt/packets/DataPacket.java =================================================================== --- udt-java/trunk/src/main/java/udt/packets/DataPacket.java 2010-08-30 11:45:32 UTC (rev 42) +++ udt-java/trunk/src/main/java/udt/packets/DataPacket.java 2010-08-30 21:17:15 UTC (rev 43) @@ -136,7 +136,7 @@ //sequence number with highest bit set to "0" try{ ByteArrayOutputStream bos=new ByteArrayOutputStream(16); - bos.write(PacketUtil.encodeSetHighest(false, packetSequenceNumber)); + bos.write(PacketUtil.encode(packetSequenceNumber)); bos.write(PacketUtil.encode(messageNumber)); bos.write(PacketUtil.encode(timeStamp)); bos.write(PacketUtil.encode(destinationID)); Modified: udt-java/trunk/src/main/java/udt/packets/PacketFactory.java =================================================================== --- udt-java/trunk/src/main/java/udt/packets/PacketFactory.java 2010-08-30 11:45:32 UTC (rev 42) +++ udt-java/trunk/src/main/java/udt/packets/PacketFactory.java 2010-08-30 21:17:15 UTC (rev 43) @@ -64,8 +64,7 @@ ControlPacket packet=null; int pktType=PacketUtil.decodeType(encodedData, 0); - long ackSeqNo =PacketUtil.decodeAckSeqNr(encodedData, 0); - long msgNr = PacketUtil.decode(encodedData, 4); + long additionalInfo = PacketUtil.decode(encodedData, 4); long timeStamp = PacketUtil.decode(encodedData,8) ; long destID = PacketUtil.decode(encodedData,12); byte[] controlInformation = new byte[length-16]; @@ -81,7 +80,7 @@ } //TYPE 0010:2 else if(ControlPacketType.ACK.ordinal()==pktType){ - packet=new Acknowledgement(controlInformation); + packet=new Acknowledgement(additionalInfo,controlInformation); } //TYPE 0011:3 else if(ControlPacketType.NAK.ordinal()==pktType){ @@ -93,7 +92,7 @@ } //TYPE 0110:6 else if(ControlPacketType.ACK2.ordinal()==pktType){ - packet=new Acknowledgment2(controlInformation); + packet=new Acknowledgment2(additionalInfo,controlInformation); } //TYPE 0111:7 else if(ControlPacketType.MESSAGE_DROP_REQUEST.ordinal()==pktType){ @@ -105,8 +104,6 @@ } if(packet!=null){ - packet.setAckSequenceNumber(ackSeqNo); - packet.setMessageNumber(msgNr); packet.setTimeStamp(timeStamp); packet.setDestinationID(destID); } Modified: udt-java/trunk/src/main/java/udt/packets/PacketUtil.java =================================================================== --- udt-java/trunk/src/main/java/udt/packets/PacketUtil.java 2010-08-30 11:45:32 UTC (rev 42) +++ udt-java/trunk/src/main/java/udt/packets/PacketUtil.java 2010-08-30 21:17:15 UTC (rev 43) @@ -57,60 +57,27 @@ return new byte[]{m4,m3,m2,m1}; } - - - public static byte[]encodeSetHighestAndType(boolean highest,int type,long value){ - byte m4; - byte m3; - if(highest){ - m4= (byte) (0x80 | type<<3); - m3= (byte) (0); - } - else{ - m4= (byte) (0x7f & value>>24 ); - m3=(byte)(value>>16); - } + + public static byte[]encodeControlPacketType(int type){ + byte m4=(byte) 0x80; - byte m2=(byte)(value>>8); - byte m1=(byte)(value); - return new byte[]{m4,m3,m2,m1}; + byte m3=(byte)type; + return new byte[]{m4,m3,0,0}; } - public static byte[]encodeHighesBitTypeAndSeqNumber(boolean highestBit,int type, long value){ - byte m4,m3; - if(highestBit){ - m4=(byte) (0x80 | type<<3); - m3=(byte)(0); - } - else{ - m4= (byte) (0); - m3=(byte)(0); - } - byte m2=(byte)(value>>8); - byte m1=(byte)(value); - return new byte[]{m4,m3,m2,m1}; - } - public static long decode(byte[]data, int start){ - long result = (data[start] & 0xFF)<<24 - |(data[start+1] & 0xFF)<<16 - |(data[start+2] & 0xFF)<<8 - |(data[start+3] & 0xFF); + long result = (data[start]&0xFF)<<24 + | (data[start+1]&0xFF)<<16 + | (data[start+2]&0xFF)<<8 + | (data[start+3]&0xFF); return result; } public static int decodeType(byte[]data, int start){ - int result = (data[start]&0x78)>>3; + int result = data[start+1]&0xFF; return result; } - - public static long decodeAckSeqNr(byte[]data, int start){ - long result = (data[start+2] & 0xFF)<<8 - |(data[start+3] & 0xFF); - return result; - } - } Modified: udt-java/trunk/src/main/java/udt/util/Application.java =================================================================== --- udt-java/trunk/src/main/java/udt/util/Application.java 2010-08-30 11:45:32 UTC (rev 42) +++ udt-java/trunk/src/main/java/udt/util/Application.java 2010-08-30 21:17:15 UTC (rev 43) @@ -51,4 +51,23 @@ } } + + + + static long decode(byte[]data, int start){ + long result = (data[start+3] & 0xFF)<<24 + |(data[start+2] & 0xFF)<<16 + |(data[start+1] & 0xFF)<<8 + |(data[start] & 0xFF); + return result; + } + + static byte[]encode(long value){ + byte m4= (byte) (value>>24 ); + byte m3=(byte)(value>>16); + byte m2=(byte)(value>>8); + byte m1=(byte)(value); + return new byte[]{m1,m2,m3,m4}; + } + } Modified: udt-java/trunk/src/main/java/udt/util/ReceiveFile.java =================================================================== --- udt-java/trunk/src/main/java/udt/util/ReceiveFile.java 2010-08-30 11:45:32 UTC (rev 42) +++ udt-java/trunk/src/main/java/udt/util/ReceiveFile.java 2010-08-30 21:17:15 UTC (rev 43) @@ -35,7 +35,6 @@ import java.io.File; import java.io.FileOutputStream; import java.net.InetAddress; -import java.nio.ByteBuffer; import java.text.NumberFormat; import udt.UDTClient; @@ -78,29 +77,29 @@ UDTInputStream in=client.getInputStream(); UDTOutputStream out=client.getOutputStream(); - byte[]readBuf=new byte[1024]; - ByteBuffer bb=ByteBuffer.wrap(readBuf); System.out.println("[ReceiveFile] Requesting file "+remoteFile); //send name file info byte[]fName=remoteFile.getBytes(); - bb.putInt(fName.length+1); - bb.put(fName); - bb.put((byte)0); + out.write(encode(fName.length)); + out.write(fName); - out.write(readBuf, 0, bb.position()); out.flush(); //pause the sender to save some CPU time out.pauseOutput(); //read size info (an 4-byte int) - byte[]sizeInfo=new byte[4]; + byte[]sizeInfo=new byte[8]; - while(in.read(sizeInfo)==0); + int total=0; + while(total<sizeInfo.length){ + int r=in.read(sizeInfo); + if(r<0)break; + total+=r; + } + long size=decode(sizeInfo, 0); - long size=ByteBuffer.wrap(sizeInfo).getInt(); - File file=new File(new String(localFile)); System.out.println("[ReceiveFile] Write to local file <"+file.getAbsolutePath()+">"); FileOutputStream fos=new FileOutputStream(file); Modified: udt-java/trunk/src/main/java/udt/util/SendFile.java =================================================================== --- udt-java/trunk/src/main/java/udt/util/SendFile.java 2010-08-30 11:45:32 UTC (rev 42) +++ udt-java/trunk/src/main/java/udt/util/SendFile.java 2010-08-30 21:17:15 UTC (rev 43) @@ -51,8 +51,8 @@ import udt.UDTReceiver; import udt.UDTServerSocket; import udt.UDTSocket; -import udt.packets.PacketUtil; + /** * helper application for sending a single file via UDT * Intended to be compatible with the C++ version in @@ -69,9 +69,9 @@ public SendFile(int serverPort){ this.serverPort=serverPort; - + } - + @Override public void configure(){ super.configure(); @@ -85,22 +85,23 @@ UDTServerSocket server=new UDTServerSocket(myHost,serverPort); while(true){ UDTSocket socket=server.accept(); + Thread.sleep(1000); threadPool.execute(new RequestRunner(socket)); } }catch(Exception ex){ throw new RuntimeException(ex); } } - + /** * main() method for invoking as a commandline application * @param args * @throws Exception */ public static void main(String[] fullArgs) throws Exception{ - + String[] args=parseOptions(fullArgs); - + int serverPort=65321; try{ serverPort=Integer.parseInt(args[0]); @@ -114,24 +115,24 @@ public static void usage(){ System.out.println("Usage: java -cp ... udt.util.SendFile <server_port> " + - "[--verbose] [--localPort=<port>] [--localIP=<ip>]"); + "[--verbose] [--localPort=<port>] [--localIP=<ip>]"); } public static class RequestRunner implements Runnable{ - + private final static Logger logger=Logger.getLogger(RequestRunner.class.getName()); - + private final UDTSocket socket; - + private final NumberFormat format=NumberFormat.getNumberInstance(); - + private final boolean memMapped; public RequestRunner(UDTSocket socket){ this.socket=socket; format.setMaximumFractionDigits(3); memMapped=false;//true; } - + public void run(){ try{ logger.info("Handling request from "+socket.getSession().getDestination()); @@ -144,8 +145,19 @@ while(in.read(readBuf)==0)Thread.sleep(100); //how many bytes to read for the file name - int length=bb.getInt(); - byte[]fileName=new byte[length-1]; + byte[]len=new byte[4]; + bb.get(len); + if(verbose){ + StringBuilder sb=new StringBuilder(); + for(int i=0;i<len.length;i++){ + sb.append(Integer.toString(len[i])); + sb.append(" "); + } + System.out.println("[SendFile] name length data: "+sb.toString()); + } + long length=decode(len, 0); + if(verbose)System.out.println("[SendFile] name length : "+length); + byte[]fileName=new byte[(int)length]; bb.get(fileName); File file=new File(new String(fileName)); @@ -156,7 +168,10 @@ long size=file.length(); System.out.println("[SendFile] File size: "+size); //send size info - out.write(PacketUtil.encode(size)); + out.write(encode(size)); + out.write(encode(0l)); + out.flush(); + long start=System.currentTimeMillis(); //and send the file if(memMapped){ @@ -183,8 +198,8 @@ } } } - - + + private static void copyFile(File file, OutputStream os)throws Exception{ FileChannel c=new RandomAccessFile(file,"r").getChannel(); MappedByteBuffer b=c.map(MapMode.READ_ONLY, 0, file.length()); @@ -199,5 +214,6 @@ } os.flush(); } - + + } Modified: udt-java/trunk/src/test/java/udt/TestControlPacket.java =================================================================== --- udt-java/trunk/src/test/java/udt/TestControlPacket.java 2010-08-30 11:45:32 UTC (rev 42) +++ udt-java/trunk/src/test/java/udt/TestControlPacket.java 2010-08-30 21:17:15 UTC (rev 43) @@ -8,7 +8,6 @@ public void testSequenceNumber1(){ ControlPacket p=new DummyControlPacket(); - p.setAckSequenceNumber(1); byte[]x=p.getHeader(); byte highest=x[0]; //check highest bit is "1" for ControlPacket Modified: udt-java/trunk/src/test/java/udt/TestControlPacketType.java =================================================================== --- udt-java/trunk/src/test/java/udt/TestControlPacketType.java 2010-08-30 11:45:32 UTC (rev 42) +++ udt-java/trunk/src/test/java/udt/TestControlPacketType.java 2010-08-30 21:17:15 UTC (rev 43) @@ -8,11 +8,9 @@ public void testSequenceNumber1(){ ControlPacket p=new DummyControlPacket(); - p.setAckSequenceNumber(1); byte[]x=p.getHeader(); byte highest=x[0]; //check highest bit is "1" for ControlPacket - assertEquals(128, highest & 0x80); byte lowest=x[3]; assertEquals(1, lowest); Modified: udt-java/trunk/src/test/java/udt/TestPacketFactory.java =================================================================== --- udt-java/trunk/src/test/java/udt/TestPacketFactory.java 2010-08-30 11:45:32 UTC (rev 42) +++ udt-java/trunk/src/test/java/udt/TestPacketFactory.java 2010-08-30 21:17:15 UTC (rev 43) @@ -16,26 +16,27 @@ public class TestPacketFactory extends TestCase { public void testData(){ - byte[]data="sdjfsdjfldskjflds".getBytes(); + String test="sdjfsdjfldskjflds"; + + byte[]data=test.getBytes(); data[0]=(byte)(data[0] & 0x7f); UDTPacket p=PacketFactory.createPacket(data); DataPacket recv=(DataPacket)p; String t=new String(recv.getEncoded()); assertTrue(p instanceof DataPacket); - assertEquals("sdjfsdjfldskjflds",t); + assertEquals(test,t); } public void testConnectionHandshake(){ ConnectionHandshake p1 = new ConnectionHandshake(); - p1.setAckSequenceNumber(1234); p1.setMessageNumber(9876); p1.setTimeStamp(3456); p1.setDestinationID(1); p1.setConnectionType(1); p1.setSocketType(1); - p1.setInitialSeqNo(1); + p1.setInitialSeqNo(321); p1.setPacketSize(128); p1.setMaxFlowWndSize(128); p1.setSocketID(1); @@ -58,7 +59,7 @@ p1.setDestinationID(1); p1.setBufferSize(128); p1.setEstimatedLinkCapacity(16); - p1.setNexttoPrevPktSeqNO(9870); + p1.setAckNumber(9870); p1.setPacketReceiveRate(1000); p1.setRoundTripTime(1000); p1.setRoundTripTimeVar(500); @@ -86,7 +87,6 @@ public void testNegativeAcknowledgement(){ NegativeAcknowledgement p1 = new NegativeAcknowledgement(); - p1.setAckSequenceNumber(1231); p1.setMessageNumber(9872); p1.setTimeStamp(3452); p1.setDestinationID(2); @@ -105,7 +105,6 @@ public void testNegativeAcknowledgement2(){ NegativeAcknowledgement p1 = new NegativeAcknowledgement(); - p1.setAckSequenceNumber(1231); p1.setMessageNumber(9872); p1.setTimeStamp(3452); p1.setDestinationID(2); @@ -130,7 +129,6 @@ public void testNegativeAcknowledgement3(){ NegativeAcknowledgement p1 = new NegativeAcknowledgement(); - p1.setAckSequenceNumber(1231); p1.setMessageNumber(9872); p1.setTimeStamp(3452); p1.setDestinationID(2); @@ -148,7 +146,6 @@ public void testShutdown(){ Shutdown p1 = new Shutdown(); - p1.setAckSequenceNumber(1233); p1.setMessageNumber(9874); p1.setTimeStamp(3453); p1.setDestinationID(3); @@ -165,7 +162,6 @@ public void testMessageDropRequest(){ MessageDropRequest p1=new MessageDropRequest(); - p1.setAckSequenceNumber(1234); p1.setMessageNumber(9876); p1.setTimeStamp(3456); p1.setDestinationID(4); Modified: udt-java/trunk/src/test/java/udt/TestSendFileReceiveFile.java =================================================================== --- udt-java/trunk/src/test/java/udt/TestSendFileReceiveFile.java 2010-08-30 11:45:32 UTC (rev 42) +++ udt-java/trunk/src/test/java/udt/TestSendFileReceiveFile.java 2010-08-30 21:17:15 UTC (rev 43) @@ -17,8 +17,8 @@ Thread.sleep(500); }while(!serverStarted); - //File f=new File("src/test/java/datafile"); - File f=new File("/tmp/100MB"); + File f=new File("src/test/java/datafile"); + //File f=new File("/tmp/100MB"); File tmp=File.createTempFile("udtest-", null); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <bsc...@us...> - 2010-08-30 11:45:39
|
Revision: 42 http://udt-java.svn.sourceforge.net/udt-java/?rev=42&view=rev Author: bschuller Date: 2010-08-30 11:45:32 +0000 (Mon, 30 Aug 2010) Log Message: ----------- use random initial sequence number Modified Paths: -------------- udt-java/trunk/src/main/java/udt/ClientSession.java udt-java/trunk/src/main/java/udt/ServerSession.java udt-java/trunk/src/main/java/udt/UDPEndPoint.java udt-java/trunk/src/main/java/udt/UDTInputStream.java udt-java/trunk/src/main/java/udt/UDTReceiver.java udt-java/trunk/src/main/java/udt/UDTSender.java udt-java/trunk/src/main/java/udt/UDTSocket.java udt-java/trunk/src/main/java/udt/util/MeanValue.java udt-java/trunk/src/main/java/udt/util/SendFile.java udt-java/trunk/src/test/java/udt/performance/TestUDTLargeData.java Added Paths: ----------- udt-java/trunk/src/main/java/udt/util/SequenceNumber.java Modified: udt-java/trunk/src/main/java/udt/ClientSession.java =================================================================== --- udt-java/trunk/src/main/java/udt/ClientSession.java 2010-06-18 06:35:25 UTC (rev 41) +++ udt-java/trunk/src/main/java/udt/ClientSession.java 2010-08-30 11:45:32 UTC (rev 42) @@ -40,6 +40,7 @@ import udt.packets.ConnectionHandshake; import udt.packets.Destination; import udt.packets.Shutdown; +import udt.util.SequenceNumber; /** * Keep state of a UDT connection. Once established, the @@ -87,6 +88,7 @@ if (getState()!=ready && packet instanceof ConnectionHandshake) { try{ logger.info("Received connection handshake from "+peer); + //TODO validate parameters sent by peer setState(ready); long peerSocketID=((ConnectionHandshake)packet).getSocketID(); destination.setSocketID(peerSocketID); @@ -127,7 +129,9 @@ ConnectionHandshake handshake = new ConnectionHandshake(); handshake.setConnectionType(1); handshake.setSocketType(1); - handshake.setInitialSeqNo(1); + long initialSequenceNo=SequenceNumber.random(); + setInitialSequenceNumber(initialSequenceNo); + handshake.setInitialSeqNo(initialSequenceNo); handshake.setPacketSize(getDatagramSize()); handshake.setSocketID(mySocketID); handshake.setSession(this); Modified: udt-java/trunk/src/main/java/udt/ServerSession.java =================================================================== --- udt-java/trunk/src/main/java/udt/ServerSession.java 2010-06-18 06:35:25 UTC (rev 41) +++ udt-java/trunk/src/main/java/udt/ServerSession.java 2010-08-30 11:45:32 UTC (rev 42) @@ -75,7 +75,7 @@ setState(handshaking); } try{ - sendResponseHandShake(connectionHandshake,peer); + handleHandShake(connectionHandshake,peer); n_handshake++; try{ setState(ready); @@ -144,17 +144,29 @@ return lastPacket; } - protected void sendResponseHandShake(ConnectionHandshake handshake,Destination peer)throws IOException{ + /** + * handle the connection handshake:<br/> + * <ul> + * <li>set initial sequence number</li> + * <li>send response handshake</li> + * </ul> + * @param handshake + * @param peer + * @throws IOException + */ + protected void handleHandShake(ConnectionHandshake handshake,Destination peer)throws IOException{ ConnectionHandshake responseHandshake = new ConnectionHandshake(); //compare the packet size and choose minimun long clientBufferSize=handshake.getPacketSize(); long myBufferSize=getDatagramSize(); long bufferSize=Math.min(clientBufferSize, myBufferSize); + long initialSequenceNumber=handshake.getInitialSeqNo(); + setInitialSequenceNumber(initialSequenceNumber); setDatagramSize((int)bufferSize); responseHandshake.setPacketSize(bufferSize); responseHandshake.setUdtVersion(4); - responseHandshake.setInitialSeqNo(getInitialSequenceNumber()); - responseHandshake.setConnectionType(-1); + responseHandshake.setInitialSeqNo(initialSequenceNumber); + responseHandshake.setConnectionType(1); //tell peer what the socket ID on this side is responseHandshake.setSocketID(mySocketID); responseHandshake.setDestinationID(this.getDestination().getSocketID()); Modified: udt-java/trunk/src/main/java/udt/UDPEndPoint.java =================================================================== --- udt-java/trunk/src/main/java/udt/UDPEndPoint.java 2010-06-18 06:35:25 UTC (rev 41) +++ udt-java/trunk/src/main/java/udt/UDPEndPoint.java 2010-08-30 11:45:32 UTC (rev 42) @@ -162,7 +162,7 @@ try{ doReceive(); }catch(Exception ex){ - ex.printStackTrace(); + logger.log(Level.WARNING,"",ex); } } }; @@ -248,14 +248,16 @@ private long lastDestID=-1; private UDTSession lastSession; - MeanValue v=new MeanValue("",false); + MeanValue v=new MeanValue("receiver processing ",true, 256); protected void doReceive()throws IOException{ while(!stopped){ try{ try{ + v.end(); //will block until a packet is received or timeout has expired dgSocket.receive(dp); + v.begin(); Destination peer=new Destination(dp.getAddress(), dp.getPort()); int l=dp.getLength(); Modified: udt-java/trunk/src/main/java/udt/UDTInputStream.java =================================================================== --- udt-java/trunk/src/main/java/udt/UDTInputStream.java 2010-06-18 06:35:25 UTC (rev 41) +++ udt-java/trunk/src/main/java/udt/UDTInputStream.java 2010-08-30 11:45:32 UTC (rev 42) @@ -38,6 +38,7 @@ import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicBoolean; +import udt.util.SequenceNumber; import udt.util.UDTStatistics; /** @@ -58,8 +59,9 @@ private final UDTStatistics statistics; - //the highest sequence number read by the application - private volatile long highestSequenceNumber=0; + //the highest sequence number read by the application, initialised + //to the initial sequence number minus one + private volatile long highestSequenceNumber; //set to 'false' by the receiver when it gets a shutdown signal from the peer //see the noMoreData() method @@ -80,6 +82,7 @@ this.statistics=statistics; int capacity=socket!=null? 4*socket.getSession().getFlowWindowSize() : 64 ; appData=new PriorityBlockingQueue<AppData>(capacity); + highestSequenceNumber=SequenceNumber.decrement(socket.getSession().getInitialSequenceNumber()); } /** @@ -177,11 +180,12 @@ } if(currentChunk!=null){ //check if the data is in-order - if(currentChunk.sequenceNumber==highestSequenceNumber+1){ - highestSequenceNumber++; + long cmp=SequenceNumber.compare(currentChunk.sequenceNumber,highestSequenceNumber+1); + if(cmp==0){ + highestSequenceNumber=currentChunk.sequenceNumber; return; } - else if(currentChunk.sequenceNumber<=highestSequenceNumber){ + else if(cmp<0){ //duplicate, drop it currentChunk=null; statistics.incNumberOfDuplicateDataPackets(); @@ -203,7 +207,7 @@ * */ protected boolean haveNewData(long sequenceNumber,byte[]data)throws IOException{ - if(sequenceNumber<=highestSequenceNumber)return true; + if(SequenceNumber.compare(sequenceNumber,highestSequenceNumber)<=0)return true; return appData.offer(new AppData(sequenceNumber,data)); } Modified: udt-java/trunk/src/main/java/udt/UDTReceiver.java =================================================================== --- udt-java/trunk/src/main/java/udt/UDTReceiver.java 2010-06-18 06:35:25 UTC (rev 41) +++ udt-java/trunk/src/main/java/udt/UDTReceiver.java 2010-08-30 11:45:32 UTC (rev 42) @@ -54,6 +54,7 @@ import udt.receiver.ReceiverLossList; import udt.receiver.ReceiverLossListEntry; import udt.util.MeanValue; +import udt.util.SequenceNumber; import udt.util.UDTStatistics; import udt.util.UDTThreadFactory; import udt.util.Util; @@ -417,10 +418,10 @@ /*(6.a).if the number of the current data packet is greater than LSRN+1, put all the sequence numbers between (but excluding) these two values into the receiver's loss list and send them to the sender in an NAK packet*/ - if(currentSequenceNumber>largestReceivedSeqNumber+1){ + if(SequenceNumber.compare(currentSequenceNumber,largestReceivedSeqNumber+1)>0){ sendNAK(currentSequenceNumber); } - else if(currentSequenceNumber<largestReceivedSeqNumber){ + else if(SequenceNumber.compare(currentSequenceNumber,largestReceivedSeqNumber)<0){ /*(6.b).if the sequence number is less than LRSN,remove it from * the receiver's loss list */ @@ -430,7 +431,7 @@ statistics.incNumberOfReceivedDataPackets(); //(7).Update the LRSN - if(currentSequenceNumber>largestReceivedSeqNumber){ + if(SequenceNumber.compare(currentSequenceNumber,largestReceivedSeqNumber)>0){ largestReceivedSeqNumber=currentSequenceNumber; } Modified: udt-java/trunk/src/main/java/udt/UDTSender.java =================================================================== --- udt-java/trunk/src/main/java/udt/UDTSender.java 2010-06-18 06:35:25 UTC (rev 41) +++ udt-java/trunk/src/main/java/udt/UDTSender.java 2010-08-30 11:45:32 UTC (rev 42) @@ -52,6 +52,7 @@ import udt.sender.SenderLossList; import udt.util.MeanThroughput; import udt.util.MeanValue; +import udt.util.SequenceNumber; import udt.util.UDTStatistics; import udt.util.UDTThreadFactory; import udt.util.Util; @@ -126,6 +127,7 @@ sendBuffer=new ConcurrentHashMap<Long, DataPacket>(session.getFlowWindowSize(),0.75f,2); sendQueue = new ArrayBlockingQueue<DataPacket>(1000); lastAckSequenceNumber=session.getInitialSequenceNumber(); + currentSequenceNumber=session.getInitialSequenceNumber()-1; waitForAckLatch.set(new CountDownLatch(1)); waitForSeqAckLatch.set(new CountDownLatch(1)); storeStatistics=Boolean.getBoolean("udt.sender.storeStatistics"); @@ -404,7 +406,7 @@ * The initial sequence number is "0" */ public long getNextSequenceNumber(){ - currentSequenceNumber++; + currentSequenceNumber=SequenceNumber.increment(currentSequenceNumber); return currentSequenceNumber; } @@ -426,12 +428,11 @@ } boolean haveAcknowledgementFor(long sequenceNumber){ - return sequenceNumber<=lastAckSequenceNumber; + return SequenceNumber.compare(sequenceNumber,lastAckSequenceNumber)<=0; } boolean isSentOut(long sequenceNumber){ - return largestSentSequenceNumber>=sequenceNumber; - + return SequenceNumber.compare(largestSentSequenceNumber,sequenceNumber)>=0; } boolean haveLostPackets(){ Modified: udt-java/trunk/src/main/java/udt/UDTSocket.java =================================================================== --- udt-java/trunk/src/main/java/udt/UDTSocket.java 2010-06-18 06:35:25 UTC (rev 41) +++ udt-java/trunk/src/main/java/udt/UDTSocket.java 2010-08-30 11:45:32 UTC (rev 42) @@ -204,7 +204,8 @@ sender.waitForAck(seqNo); } } - sender.pause(); + //TODO need to check if we can pause the sender... + //sender.pause(); } //writes and wait for ack Modified: udt-java/trunk/src/main/java/udt/util/MeanValue.java =================================================================== --- udt-java/trunk/src/main/java/udt/util/MeanValue.java 2010-06-18 06:35:25 UTC (rev 41) +++ udt-java/trunk/src/main/java/udt/util/MeanValue.java 2010-08-30 11:45:32 UTC (rev 42) @@ -4,7 +4,7 @@ import java.util.Locale; /** - * holds a floating mean value + * holds a floating mean timing value (measured in microseconds) */ public class MeanValue { @@ -45,7 +45,7 @@ n++; if(verbose && n % nValue == 0){ if(msg!=null)System.out.println(msg+" "+getFormattedMean()); - else System.out.println(getFormattedMean()); + else System.out.println(name+getFormattedMean()); } } Modified: udt-java/trunk/src/main/java/udt/util/SendFile.java =================================================================== --- udt-java/trunk/src/main/java/udt/util/SendFile.java 2010-06-18 06:35:25 UTC (rev 41) +++ udt-java/trunk/src/main/java/udt/util/SendFile.java 2010-08-30 11:45:32 UTC (rev 42) @@ -129,7 +129,7 @@ public RequestRunner(UDTSocket socket){ this.socket=socket; format.setMaximumFractionDigits(3); - memMapped=true; + memMapped=false;//true; } public void run(){ @@ -188,6 +188,7 @@ private static void copyFile(File file, OutputStream os)throws Exception{ FileChannel c=new RandomAccessFile(file,"r").getChannel(); MappedByteBuffer b=c.map(MapMode.READ_ONLY, 0, file.length()); + b.load(); byte[]buf=new byte[1024*1024]; int len=0; while(true){ Added: udt-java/trunk/src/main/java/udt/util/SequenceNumber.java =================================================================== --- udt-java/trunk/src/main/java/udt/util/SequenceNumber.java (rev 0) +++ udt-java/trunk/src/main/java/udt/util/SequenceNumber.java 2010-08-30 11:45:32 UTC (rev 42) @@ -0,0 +1,73 @@ +package udt.util; + +import java.util.Random; + + +/** + * Handle sequence numbers, taking the range of 0 - (2^31 - 1) into account<br/> + */ + +public class SequenceNumber { + + private final static int maxOffset=0x3FFFFFFF; + + private final static long maxSequenceNo=0x7FFFFFFF; + + + /** + * compare seq1 and seq2. Returns zero, if they are equal, a negative value if seq1 is smaller than + * seq2, and a positive value if seq1 is larger than seq2. + * + * @param seq1 + * @param seq2 + */ + public static long compare(long seq1, long seq2){ + return (Math.abs(seq1 - seq2) < maxOffset) ? (seq1 - seq2) : (seq2 - seq1); + } + + /** + * length from the first to the second sequence number, including both + */ + public static long length(long seq1, long seq2) + {return (seq1 <= seq2) ? (seq2 - seq1 + 1) : (seq2 - seq1 + maxSequenceNo + 2);} + + + /** + * compute the offset from seq2 to seq1 + * @param seq1 + * @param seq2 + */ + public static long seqOffset(long seq1, long seq2){ + if (Math.abs(seq1 - seq2) < maxOffset) + return seq2 - seq1; + + if (seq1 < seq2) + return seq2 - seq1 - maxSequenceNo - 1; + + return seq2 - seq1 + maxSequenceNo + 1; + } + + /** + * increment by one + * @param seq + */ + public static long increment(long seq){ + return (seq == maxSequenceNo) ? 0 : seq + 1; + } + + /** + * decrement by one + * @param seq + */ + public static long decrement(long seq){ + return (seq == 0) ? maxSequenceNo : seq - 1; + } + + /** + * generates a random number between 1 and 0x3FFFFFFF (inclusive) + */ + public static long random(){ + return 1+new Random().nextInt(maxOffset); + } + +} Property changes on: udt-java/trunk/src/main/java/udt/util/SequenceNumber.java ___________________________________________________________________ Added: svn:mime-type + text/plain Modified: udt-java/trunk/src/test/java/udt/performance/TestUDTLargeData.java =================================================================== --- udt-java/trunk/src/test/java/udt/performance/TestUDTLargeData.java 2010-06-18 06:35:25 UTC (rev 41) +++ udt-java/trunk/src/test/java/udt/performance/TestUDTLargeData.java 2010-08-30 11:45:32 UTC (rev 42) @@ -21,7 +21,7 @@ boolean running=false; //how many - int num_packets=500; + int num_packets=50; //how large is a single packet int size=1*1024*1024; @@ -40,6 +40,7 @@ private final NumberFormat format=NumberFormat.getNumberInstance(); protected void doTest()throws Exception{ + format.setMaximumFractionDigits(2); if(!running)runServer(); @@ -60,6 +61,7 @@ for(int i=0;i<num_packets;i++){ long block=System.currentTimeMillis(); client.send(data); + client.flush(); digest.update(data); double took=System.currentTimeMillis()-block; double arrival=client.getStatistics().getPacketArrivalRate(); @@ -83,7 +85,7 @@ System.out.println("Rate: "+format.format(mbytes)+" Mbytes/sec "+format.format(mbit)+" Mbit/sec"); System.out.println("Server received: "+total); - assertEquals(N,total); + // assertEquals(N,total); System.out.println("MD5 hash of data sent: "+md5_sent); System.out.println("MD5 hash of data received: "+md5_received); System.out.println(client.getStatistics()); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <bsc...@us...> - 2010-06-18 06:35:32
|
Revision: 41 http://udt-java.svn.sourceforge.net/udt-java/?rev=41&view=rev Author: bschuller Date: 2010-06-18 06:35:25 +0000 (Fri, 18 Jun 2010) Log Message: ----------- add another constructor to UDPEndpoint Modified Paths: -------------- udt-java/trunk/src/main/java/udt/UDPEndPoint.java udt-java/trunk/src/main/java/udt/UDTCongestionControl.java Modified: udt-java/trunk/src/main/java/udt/UDPEndPoint.java =================================================================== --- udt-java/trunk/src/main/java/udt/UDPEndPoint.java 2010-05-29 18:43:46 UTC (rev 40) +++ udt-java/trunk/src/main/java/udt/UDPEndPoint.java 2010-06-18 06:35:25 UTC (rev 41) @@ -66,17 +66,18 @@ private final DatagramSocket dgSocket; //active sessions keyed by socket ID - private final Map<Long,UDTSession>sessions; + private final Map<Long,UDTSession>sessions=new ConcurrentHashMap<Long, UDTSession>(); //connecting sessions keyed by peer destination - private final Map<Destination,UDTSession>clientSessions; + private final Map<Destination,UDTSession>clientSessions=new ConcurrentHashMap<Destination, UDTSession>();; //last received packet private UDTPacket lastPacket; //if the endpoint is configured for a server socket, //this queue is used to handoff new UDTSessions to the application - private final SynchronousQueue<UDTSession> sessionHandoff; + private final SynchronousQueue<UDTSession> sessionHandoff=new SynchronousQueue<UDTSession>(); + private boolean serverSocketMode=false; //has the endpoint been stopped? @@ -85,6 +86,16 @@ public static final int DATAGRAM_SIZE=1500; /** + * create an endpoint on the given socket + * + * @param socket - a UDP datagram socket + */ + public UDPEndPoint(DatagramSocket socket){ + this.dgSocket=socket; + port=dgSocket.getLocalPort(); + } + + /** * bind to any local port on the given host address * @param localAddress * @throws SocketException @@ -109,9 +120,7 @@ } if(localPort>0)this.port = localPort; else port=dgSocket.getLocalPort(); - sessions=new ConcurrentHashMap<Long, UDTSession>(); - clientSessions=new ConcurrentHashMap<Destination, UDTSession>(); - sessionHandoff=new SynchronousQueue<UDTSession>(); + //set a time out to avoid blocking in doReceive() dgSocket.setSoTimeout(100000); //buffer size Modified: udt-java/trunk/src/main/java/udt/UDTCongestionControl.java =================================================================== --- udt-java/trunk/src/main/java/udt/UDTCongestionControl.java 2010-05-29 18:43:46 UTC (rev 40) +++ udt-java/trunk/src/main/java/udt/UDTCongestionControl.java 2010-06-18 06:35:25 UTC (rev 41) @@ -72,7 +72,7 @@ * @see udt.CongestionControl#init() */ public void init() { - setAckInterval(10); + } /* (non-Javadoc) This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <bsc...@us...> - 2010-05-24 20:48:56
|
Revision: 38 http://udt-java.svn.sourceforge.net/udt-java/?rev=38&view=rev Author: bschuller Date: 2010-05-24 20:48:49 +0000 (Mon, 24 May 2010) Log Message: ----------- experiment with memory-mapped file Modified Paths: -------------- udt-java/trunk/src/main/java/udt/util/SendFile.java Modified: udt-java/trunk/src/main/java/udt/util/SendFile.java =================================================================== --- udt-java/trunk/src/main/java/udt/util/SendFile.java 2010-05-24 19:45:19 UTC (rev 37) +++ udt-java/trunk/src/main/java/udt/util/SendFile.java 2010-05-24 20:48:49 UTC (rev 38) @@ -34,8 +34,13 @@ import java.io.File; import java.io.FileInputStream; +import java.io.OutputStream; +import java.io.RandomAccessFile; import java.net.InetAddress; import java.nio.ByteBuffer; +import java.nio.MappedByteBuffer; +import java.nio.channels.FileChannel; +import java.nio.channels.FileChannel.MapMode; import java.text.NumberFormat; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; @@ -120,9 +125,11 @@ private final NumberFormat format=NumberFormat.getNumberInstance(); + private final boolean memMapped; public RequestRunner(UDTSocket socket){ this.socket=socket; format.setMaximumFractionDigits(3); + memMapped=true; } public void run(){ @@ -144,7 +151,7 @@ File file=new File(new String(fileName)); System.out.println("[SendFile] File requested: '"+file.getPath()+"'"); - FileInputStream fis=new FileInputStream(file); + FileInputStream fis=null; try{ long size=file.length(); System.out.println("[SendFile] File size: "+size); @@ -152,7 +159,12 @@ out.write(PacketUtil.encode(size)); long start=System.currentTimeMillis(); //and send the file - Util.copy(fis, out, size, false); + if(memMapped){ + copyFile(file,out); + }else{ + fis=new FileInputStream(file); + Util.copy(fis, out, size, false); + } long end=System.currentTimeMillis(); System.out.println(socket.getSession().getStatistics().toString()); double rate=1000.0*size/1024/1024/(end-start); @@ -162,7 +174,7 @@ } }finally{ socket.getSender().stop(); - fis.close(); + if(fis!=null)fis.close(); } logger.info("Finished request from "+socket.getSession().getDestination()); }catch(Exception ex){ @@ -173,4 +185,17 @@ } + private static void copyFile(File file, OutputStream os)throws Exception{ + FileChannel c=new RandomAccessFile(file,"r").getChannel(); + MappedByteBuffer b=c.map(MapMode.READ_ONLY, 0, file.length()); + byte[]buf=new byte[1024*1024]; + int len=0; + while(true){ + len=Math.min(buf.length, b.remaining()); + b.get(buf, 0, len); + os.write(buf, 0, len); + if(b.remaining()==0)break; + } + } + } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <bsc...@us...> - 2010-05-24 19:45:25
|
Revision: 37 http://udt-java.svn.sourceforge.net/udt-java/?rev=37&view=rev Author: bschuller Date: 2010-05-24 19:45:19 +0000 (Mon, 24 May 2010) Log Message: ----------- experiment with ack interval Modified Paths: -------------- udt-java/trunk/src/main/java/udt/UDTCongestionControl.java Modified: udt-java/trunk/src/main/java/udt/UDTCongestionControl.java =================================================================== --- udt-java/trunk/src/main/java/udt/UDTCongestionControl.java 2010-05-24 19:15:33 UTC (rev 36) +++ udt-java/trunk/src/main/java/udt/UDTCongestionControl.java 2010-05-24 19:45:19 UTC (rev 37) @@ -71,7 +71,8 @@ /* (non-Javadoc) * @see udt.CongestionControl#init() */ - public void init() { + public void init() { + setAckInterval(10); } /* (non-Javadoc) @@ -112,7 +113,7 @@ } public void setAckInterval(long ackInterval){ this.ackInterval=ackInterval; - if(session.getSocket().getReceiver()!=null){ + if(session.getSocket()!=null && session.getSocket().getReceiver()!=null){ session.getSocket().getReceiver().setAckInterval(ackInterval); } } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <bsc...@us...> - 2010-05-24 19:15:39
|
Revision: 36 http://udt-java.svn.sourceforge.net/udt-java/?rev=36&view=rev Author: bschuller Date: 2010-05-24 19:15:33 +0000 (Mon, 24 May 2010) Log Message: ----------- Modified Paths: -------------- udt-java/trunk/src/main/java/udt/UDTSender.java udt-java/trunk/src/main/java/udt/packets/DataPacket.java udt-java/trunk/src/main/java/udt/util/Util.java udt-java/trunk/src/test/java/udt/performance/TestUDTLargeData.java udt-java/trunk/src/test/java/udt/performance/UDPTest.java Modified: udt-java/trunk/src/main/java/udt/UDTSender.java =================================================================== --- udt-java/trunk/src/main/java/udt/UDTSender.java 2010-05-01 20:49:52 UTC (rev 35) +++ udt-java/trunk/src/main/java/udt/UDTSender.java 2010-05-24 19:15:33 UTC (rev 36) @@ -34,10 +34,10 @@ import java.io.IOException; import java.util.Map; +import java.util.concurrent.ArrayBlockingQueue; import java.util.concurrent.BlockingQueue; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.CountDownLatch; -import java.util.concurrent.LinkedBlockingQueue; import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicInteger; import java.util.concurrent.atomic.AtomicReference; @@ -124,7 +124,7 @@ statistics=session.getStatistics(); senderLossList=new SenderLossList(); sendBuffer=new ConcurrentHashMap<Long, DataPacket>(session.getFlowWindowSize(),0.75f,2); - sendQueue = new LinkedBlockingQueue<DataPacket>(1000); + sendQueue = new ArrayBlockingQueue<DataPacket>(1000); lastAckSequenceNumber=session.getInitialSequenceNumber(); waitForAckLatch.set(new CountDownLatch(1)); waitForSeqAckLatch.set(new CountDownLatch(1)); @@ -316,11 +316,11 @@ /** * sender algorithm */ + long iterationStart; public void senderAlgorithm()throws InterruptedException, IOException{ while(!paused){ - - long iterationStart=Util.getCurrentTime(); //last packet send time? - + iterationStart=Util.getCurrentTime(); + //if the sender's loss list is not empty if (!senderLossList.isEmpty()) { Long entry=senderLossList.getFirstEntry(); @@ -336,7 +336,7 @@ if(unAcknowledged<session.getCongestionControl().getCongestionWindowSize() && unAcknowledged<session.getFlowWindowSize()){ //check for application data - DataPacket dp=sendQueue.poll(); + DataPacket dp=sendQueue.poll(Util.SYN,TimeUnit.MICROSECONDS); if(dp!=null){ send(dp); largestSentSequenceNumber=dp.getPacketSequenceNumber(); @@ -345,7 +345,7 @@ statistics.incNumberOfMissingDataEvents(); } }else{ - //congestion window full, should we *really* wait for an ack?! + //congestion window full, wait for an ack if(unAcknowledged>=session.getCongestionControl().getCongestionWindowSize()){ statistics.incNumberOfCCWindowExceededEvents(); } @@ -355,7 +355,7 @@ //wait if(largestSentSequenceNumber % 16 !=0){ - double snd=session.getCongestionControl().getSendInterval(); + long snd=(long)session.getCongestionControl().getSendInterval(); long passed=Util.getCurrentTime()-iterationStart; int x=0; while(snd-passed>0){ @@ -376,13 +376,6 @@ * @param entry */ protected void handleResubmit(Long seqNumber){ - //long seqNumber=entry.getSequenceNumber(); - //TODO - //if the current seqNumber is 16n,check the timeOut in the - //loss list and send a message drop request. - //if((seqNumber%16)==0){ - //sendLossList.checkTimeOut(timeToLive); - //} try { //retransmit the packet and remove it from the list DataPacket pktToRetransmit = sendBuffer.get(seqNumber); Modified: udt-java/trunk/src/main/java/udt/packets/DataPacket.java =================================================================== --- udt-java/trunk/src/main/java/udt/packets/DataPacket.java 2010-05-01 20:49:52 UTC (rev 35) +++ udt-java/trunk/src/main/java/udt/packets/DataPacket.java 2010-05-24 19:15:33 UTC (rev 36) @@ -152,9 +152,10 @@ */ public byte[] getEncoded(){ byte[] header=getHeader(); - byte[] result=new byte[header.length+data.length]; - System.arraycopy(header, 0, result, 0, header.length); - System.arraycopy(data, 0, result, header.length, data.length); + //header.length is 16 + byte[] result=new byte[16+data.length]; + System.arraycopy(header, 0, result, 0, 16); + System.arraycopy(data, 0, result, 16, data.length); return result; } Modified: udt-java/trunk/src/main/java/udt/util/Util.java =================================================================== --- udt-java/trunk/src/main/java/udt/util/Util.java 2010-05-01 20:49:52 UTC (rev 35) +++ udt-java/trunk/src/main/java/udt/util/Util.java 2010-05-24 19:15:33 UTC (rev 36) @@ -55,11 +55,16 @@ return System.nanoTime()/1000; } + + public static final long SYN=10000; + + public static final double SYN_D=10000.0; + /** * get the SYN time in microseconds. The SYN time is 0.01 seconds = 10000 microseconds * @return */ - public static long getSYNTime(){ + public static final long getSYNTime(){ return 10000; } @@ -122,7 +127,7 @@ * @throws IOException */ public static void copy(InputStream source, OutputStream target, long size, boolean flush)throws IOException{ - byte[]buf=new byte[65536]; + byte[]buf=new byte[8*65536]; int c; long read=0; while(true){ Modified: udt-java/trunk/src/test/java/udt/performance/TestUDTLargeData.java =================================================================== --- udt-java/trunk/src/test/java/udt/performance/TestUDTLargeData.java 2010-05-01 20:49:52 UTC (rev 35) +++ udt-java/trunk/src/test/java/udt/performance/TestUDTLargeData.java 2010-05-24 19:15:33 UTC (rev 36) @@ -21,7 +21,7 @@ boolean running=false; //how many - int num_packets=50; + int num_packets=500; //how large is a single packet int size=1*1024*1024; Modified: udt-java/trunk/src/test/java/udt/performance/UDPTest.java =================================================================== --- udt-java/trunk/src/test/java/udt/performance/UDPTest.java 2010-05-01 20:49:52 UTC (rev 35) +++ udt-java/trunk/src/test/java/udt/performance/UDPTest.java 2010-05-24 19:15:33 UTC (rev 36) @@ -9,6 +9,7 @@ import junit.framework.TestCase; import udt.UDPEndPoint; +import udt.packets.DataPacket; import udt.util.MeanValue; /** @@ -16,7 +17,7 @@ */ public class UDPTest extends TestCase { - final int num_packets=10*1000; + final int num_packets=10*10*1000; final int packetSize=UDPEndPoint.DATAGRAM_SIZE; public void test1()throws Exception{ @@ -35,8 +36,14 @@ System.out.println("Sending "+num_packets+" data blocks of <"+packetSize+"> bytes"); MeanValue v=new MeanValue("Datagram send time",false); MeanValue v2=new MeanValue("Datagram send interval",false); + MeanValue v3=new MeanValue("Encoding time",false); + for(int i=0;i<num_packets;i++){ - dp.setData(data); + DataPacket p=new DataPacket(); + p.setData(data); + v3.begin(); + dp.setData(p.getEncoded()); + v3.end(); v2.end(); v.begin(); s.send(dp); @@ -52,6 +59,7 @@ System.out.println("Rate "+num_packets+" packets/sec"); System.out.println("Mean send time "+v.getFormattedMean()+" microsec"); System.out.println("Mean send interval "+v2.getFormattedMean()+" microsec"); + System.out.println("Datapacket encoding time "+v3.getFormattedMean()+" microsec"); System.out.println("Server received: "+total); } @@ -92,7 +100,7 @@ long start=System.currentTimeMillis(); while(true){ DatagramPacket dp=handoff.poll(); - total+=dp.getLength(); + if(dp!=null)total+=dp.getLength(); if(total==N)break; } long end=System.currentTimeMillis(); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <bsc...@us...> - 2010-05-01 20:49:58
|
Revision: 35 http://udt-java.svn.sourceforge.net/udt-java/?rev=35&view=rev Author: bschuller Date: 2010-05-01 20:49:52 +0000 (Sat, 01 May 2010) Log Message: ----------- nicer stats; stats switchable Modified Paths: -------------- udt-java/trunk/README udt-java/trunk/src/main/java/udt/UDTReceiver.java udt-java/trunk/src/main/java/udt/UDTSender.java udt-java/trunk/src/main/java/udt/UDTSocket.java udt-java/trunk/src/main/java/udt/util/MeanValue.java udt-java/trunk/src/main/java/udt/util/SendFile.java udt-java/trunk/src/main/java/udt/util/StatisticsHistoryEntry.java udt-java/trunk/src/main/java/udt/util/UDTStatistics.java udt-java/trunk/src/main/scripts/fufex-recv udt-java/trunk/src/main/scripts/fufex-send udt-java/trunk/src/main/scripts/receive-file udt-java/trunk/src/main/scripts/send-file udt-java/trunk/src/test/java/udt/performance/TestUDTLargeData.java Added Paths: ----------- udt-java/trunk/src/main/java/udt/util/MeanThroughput.java Modified: udt-java/trunk/README =================================================================== --- udt-java/trunk/README 2010-04-30 21:31:25 UTC (rev 34) +++ udt-java/trunk/README 2010-05-01 20:49:52 UTC (rev 35) @@ -3,13 +3,24 @@ # This is a native Java implementation of the UDT protocol. +The UDT protocol has been developed by Yunhong Gu and +Robert Grossmann from the University of Illinois, and provides +high-speed data transfer with configurable congestion control. +# +# Using UDT-Java +# +UDT-Java can be used as a library for developing your own +applications, and it can be used as-is as a commandline tool for +file transfer. + # -# Sample applications +# File transfer applications # -We provide "send-file" and "receive-file" scripts that work analogously to their C++ counterparts. +We provide "send-file" and "receive-file" scripts that work analogously +to their C++ counterparts. To start a file "server", @@ -19,17 +30,24 @@ bin/receive-file <server_host> <server_port> <remote_filename> <local_filename> +where the <server_host> can be a server name or a numerical IP address. # # Setting up a development environment using Eclipse # +If you want to work with the UDT-Java source code, you need to first +checkout the sourcecode from Sourceforge using Subversion: + + svn checkout http://udt-java.sourceforge.net/svnroot/udt-java/udt-java/trunk udt-java + You will need Apache Maven from http://maven.apache.org To generate Eclipse project files, + cd udt-java mvn eclipse:eclipse -Then, import the project into your workspace. +Then, open Eclipse and import the project into your workspace, using +"Import/Existing projects into workspace...". - \ No newline at end of file Modified: udt-java/trunk/src/main/java/udt/UDTReceiver.java =================================================================== --- udt-java/trunk/src/main/java/udt/UDTReceiver.java 2010-04-30 21:31:25 UTC (rev 34) +++ udt-java/trunk/src/main/java/udt/UDTReceiver.java 2010-05-01 20:49:52 UTC (rev 35) @@ -152,6 +152,8 @@ */ public static boolean connectionExpiryDisabled=false; + private final boolean storeStatistics; + /** * create a receiver with a valid {@link UDTSession} * @param session @@ -169,6 +171,7 @@ largestReceivedSeqNumber=session.getInitialSequenceNumber()-1; bufferSize=session.getReceiveBufferSize(); handoffQueue=new ArrayBlockingQueue<UDTPacket>(4*session.getFlowWindowSize()); + storeStatistics=Boolean.getBoolean("udt.receiver.storeStatistics"); initMetrics(); start(); } @@ -178,6 +181,7 @@ private MeanValue processTime; private MeanValue dataProcessTime; private void initMetrics(){ + if(!storeStatistics)return; dgReceiveInterval=new MeanValue("UDT receive interval"); statistics.addMetric(dgReceiveInterval); dataPacketInterval=new MeanValue("Data packet interval"); @@ -216,9 +220,9 @@ * packets are written by the endpoint */ protected void receive(UDTPacket p)throws IOException{ - dgReceiveInterval.end(); + if(storeStatistics)dgReceiveInterval.end(); handoffQueue.offer(p); - dgReceiveInterval.begin(); + if(storeStatistics)dgReceiveInterval.begin(); } /** @@ -261,9 +265,11 @@ if(needEXPReset){ nextEXP=Util.getCurrentTime()+expTimerInterval; } - processTime.begin(); + if(storeStatistics)processTime.begin(); + processUDTPacket(packet); - processTime.end(); + + if(storeStatistics)processTime.end(); } Thread.yield(); @@ -348,11 +354,15 @@ if(!p.isControlPacket()){ DataPacket dp=(DataPacket)p; - dataPacketInterval.end(); - dataProcessTime.begin(); + if(storeStatistics){ + dataPacketInterval.end(); + dataProcessTime.begin(); + } onDataPacketReceived(dp); - dataProcessTime.end(); - dataPacketInterval.begin(); + if(storeStatistics){ + dataProcessTime.end(); + dataPacketInterval.begin(); + } } else if (p.getControlPacketType()==ControlPacketType.ACK2.ordinal()){ Modified: udt-java/trunk/src/main/java/udt/UDTSender.java =================================================================== --- udt-java/trunk/src/main/java/udt/UDTSender.java 2010-04-30 21:31:25 UTC (rev 34) +++ udt-java/trunk/src/main/java/udt/UDTSender.java 2010-05-01 20:49:52 UTC (rev 35) @@ -50,6 +50,7 @@ import udt.packets.KeepAlive; import udt.packets.NegativeAcknowledgement; import udt.sender.SenderLossList; +import udt.util.MeanThroughput; import udt.util.MeanValue; import udt.util.UDTStatistics; import udt.util.UDTThreadFactory; @@ -114,6 +115,8 @@ //used by the sender to wait for an ACK of a certain sequence number private final AtomicReference<CountDownLatch> waitForSeqAckLatch=new AtomicReference<CountDownLatch>(); + private final boolean storeStatistics; + public UDTSender(UDTSession session,UDPEndPoint endpoint){ if(!session.isReady())throw new IllegalStateException("UDTSession is not ready."); this.endpoint= endpoint; @@ -125,17 +128,22 @@ lastAckSequenceNumber=session.getInitialSequenceNumber(); waitForAckLatch.set(new CountDownLatch(1)); waitForSeqAckLatch.set(new CountDownLatch(1)); + storeStatistics=Boolean.getBoolean("udt.sender.storeStatistics"); initMetrics(); doStart(); } private MeanValue dgSendTime; private MeanValue dgSendInterval; + private MeanThroughput throughput; private void initMetrics(){ + if(!storeStatistics)return; dgSendTime=new MeanValue("Datagram send time"); statistics.addMetric(dgSendTime); dgSendInterval=new MeanValue("Datagram send interval"); statistics.addMetric(dgSendInterval); + throughput=new MeanThroughput("Throughput", session.getDatagramSize()); + statistics.addMetric(throughput); } /** @@ -182,11 +190,17 @@ */ private void send(DataPacket p)throws IOException{ synchronized(sendLock){ - dgSendInterval.end(); - dgSendTime.begin(); + if(storeStatistics){ + dgSendInterval.end(); + dgSendTime.begin(); + } endpoint.doSend(p); - dgSendTime.end(); - dgSendInterval.begin(); + if(storeStatistics){ + dgSendTime.end(); + dgSendInterval.begin(); + throughput.end(); + throughput.begin(); + } sendBuffer.put(p.getPacketSequenceNumber(), p); unacknowledged.incrementAndGet(); } @@ -261,7 +275,7 @@ //send ACK2 packet to the receiver sendAck2(ackNumber); statistics.incNumberOfACKReceived(); - statistics.storeParameters(); + if(storeStatistics)statistics.storeParameters(); } /** @@ -275,8 +289,7 @@ session.getCongestionControl().onLoss(nak.getDecodedLossInfo()); session.getSocket().getReceiver().resetEXPTimer(); statistics.incNumberOfNAKReceived(); - statistics.storeParameters(); - + if(logger.isLoggable(Level.FINER)){ logger.finer("NAK for "+nak.getDecodedLossInfo().size()+" packets lost, " +"set send period to "+session.getCongestionControl().getSendInterval()); @@ -303,9 +316,7 @@ /** * sender algorithm */ - MeanValue v=new MeanValue("Wait for Ack time: "); public void senderAlgorithm()throws InterruptedException, IOException{ - statistics.addMetric(v); while(!paused){ long iterationStart=Util.getCurrentTime(); //last packet send time? @@ -338,9 +349,7 @@ if(unAcknowledged>=session.getCongestionControl().getCongestionWindowSize()){ statistics.incNumberOfCCWindowExceededEvents(); } - v.begin(); waitForAck(); - v.end(); } } @@ -356,6 +365,7 @@ x++; } passed=Util.getCurrentTime()-iterationStart; + if(stopped)return; } } } Modified: udt-java/trunk/src/main/java/udt/UDTSocket.java =================================================================== --- udt-java/trunk/src/main/java/udt/UDTSocket.java 2010-04-30 21:31:25 UTC (rev 34) +++ udt-java/trunk/src/main/java/udt/UDTSocket.java 2010-05-01 20:49:52 UTC (rev 35) @@ -204,6 +204,7 @@ sender.waitForAck(seqNo); } } + sender.pause(); } //writes and wait for ack Added: udt-java/trunk/src/main/java/udt/util/MeanThroughput.java =================================================================== --- udt-java/trunk/src/main/java/udt/util/MeanThroughput.java (rev 0) +++ udt-java/trunk/src/main/java/udt/util/MeanThroughput.java 2010-05-01 20:49:52 UTC (rev 35) @@ -0,0 +1,30 @@ +package udt.util; + + +/** + * holds a floating mean value + */ +public class MeanThroughput extends MeanValue{ + + private final double packetSize; + + public MeanThroughput(String name, int packetSize){ + this(name, false, 64, packetSize); + } + + public MeanThroughput(String name, boolean verbose, int packetSize){ + this(name, verbose, 64, packetSize); + } + + public MeanThroughput(String name, boolean verbose, int nValue, int packetSize){ + super(name,verbose,nValue); + this.packetSize=packetSize; + } + + @Override + public double getMean() { + return packetSize/super.getMean(); + } + + +} Property changes on: udt-java/trunk/src/main/java/udt/util/MeanThroughput.java ___________________________________________________________________ Added: svn:mime-type + text/plain Modified: udt-java/trunk/src/main/java/udt/util/MeanValue.java =================================================================== --- udt-java/trunk/src/main/java/udt/util/MeanValue.java 2010-04-30 21:31:25 UTC (rev 34) +++ udt-java/trunk/src/main/java/udt/util/MeanValue.java 2010-05-01 20:49:52 UTC (rev 35) @@ -1,6 +1,7 @@ package udt.util; import java.text.NumberFormat; +import java.util.Locale; /** * holds a floating mean value @@ -31,20 +32,20 @@ } public MeanValue(String name, boolean verbose, int nValue){ - format=NumberFormat.getNumberInstance(); + format=NumberFormat.getNumberInstance(Locale.ENGLISH); format.setMaximumFractionDigits(2); + format.setGroupingUsed(false); this.verbose=verbose; this.nValue=nValue; this.name=name; - begin(); } public void addValue(double value){ mean=(mean*n+value)/(n+1); n++; if(verbose && n % nValue == 0){ - if(msg!=null)System.out.print(msg+" "); - System.out.println(getFormattedMean()); + if(msg!=null)System.out.println(msg+" "+getFormattedMean()); + else System.out.println(getFormattedMean()); } } @@ -53,7 +54,7 @@ } public String getFormattedMean(){ - return format.format(mean); + return format.format(getMean()); } public void clear(){ @@ -66,7 +67,7 @@ } public void end(){ - addValue(Util.getCurrentTime()-start); + if(start>0)addValue(Util.getCurrentTime()-start); } public void end(String msg){ this.msg=msg; @@ -76,4 +77,8 @@ public String getName(){ return name; } + + public String toString(){ + return name; + } } Modified: udt-java/trunk/src/main/java/udt/util/SendFile.java =================================================================== --- udt-java/trunk/src/main/java/udt/util/SendFile.java 2010-04-30 21:31:25 UTC (rev 34) +++ udt-java/trunk/src/main/java/udt/util/SendFile.java 2010-05-01 20:49:52 UTC (rev 35) @@ -157,8 +157,11 @@ System.out.println(socket.getSession().getStatistics().toString()); double rate=1000.0*size/1024/1024/(end-start); System.out.println("[SendFile] Rate: "+format.format(rate)+" MBytes/sec. "+format.format(8*rate)+" MBit/sec."); - socket.getSession().getStatistics().writeParameterHistory(new File("udtstats-"+System.currentTimeMillis()+".csv")); + if(Boolean.getBoolean("udt.sender.storeStatistics")){ + socket.getSession().getStatistics().writeParameterHistory(new File("udtstats-"+System.currentTimeMillis()+".csv")); + } }finally{ + socket.getSender().stop(); fis.close(); } logger.info("Finished request from "+socket.getSession().getDestination()); Modified: udt-java/trunk/src/main/java/udt/util/StatisticsHistoryEntry.java =================================================================== --- udt-java/trunk/src/main/java/udt/util/StatisticsHistoryEntry.java 2010-04-30 21:31:25 UTC (rev 34) +++ udt-java/trunk/src/main/java/udt/util/StatisticsHistoryEntry.java 2010-05-01 20:49:52 UTC (rev 35) @@ -1,5 +1,7 @@ package udt.util; +import java.util.List; + public class StatisticsHistoryEntry { private final Object[] values; @@ -14,6 +16,26 @@ this.timestamp=time; } + public StatisticsHistoryEntry(boolean heading, long time, List<MeanValue>metrics){ + this.isHeading=heading; + this.timestamp=time; + int length=metrics.size(); + if(isHeading)length++; + Object[]metricValues=new Object[length]; + if(isHeading){ + metricValues[0]="time"; + for(int i=0;i<metrics.size();i++){ + metricValues[i+1]=metrics.get(i).getName(); + } + } + else{ + for(int i=0;i<metricValues.length;i++){ + metricValues[i]=metrics.get(i).getFormattedMean(); + } + } + this.values=metricValues; + } + public StatisticsHistoryEntry(Object ...values){ this(false,System.currentTimeMillis(),values); } @@ -26,12 +48,12 @@ if(!isHeading){ sb.append(timestamp); for(Object val: values){ - sb.append(",").append(String.valueOf(val)); + sb.append(" , ").append(String.valueOf(val)); } } else{ for(int i=0;i<values.length;i++){ - if(i>0)sb.append(","); + if(i>0)sb.append(" , "); sb.append(String.valueOf(values[i])); } } Modified: udt-java/trunk/src/main/java/udt/util/UDTStatistics.java =================================================================== --- udt-java/trunk/src/main/java/udt/util/UDTStatistics.java 2010-04-30 21:31:25 UTC (rev 34) +++ udt-java/trunk/src/main/java/udt/util/UDTStatistics.java 2010-05-01 20:49:52 UTC (rev 35) @@ -42,7 +42,6 @@ /** * This class is used to keep some statistics about a UDT connection. - * It also allows to compute a MD5 hash over the received data */ public class UDTStatistics { @@ -226,10 +225,10 @@ synchronized (statsHistory) { if(first){ first=false; - statsHistory.add(new StatisticsHistoryEntry(true,0,"time","packetRate","sendPeriod")); + statsHistory.add(new StatisticsHistoryEntry(true,0,metrics)); initialTime=System.currentTimeMillis(); } - statsHistory.add(new StatisticsHistoryEntry(false,System.currentTimeMillis()-initialTime,packetArrivalRate,sendPeriod)); + statsHistory.add(new StatisticsHistoryEntry(false,System.currentTimeMillis()-initialTime,metrics)); } } Modified: udt-java/trunk/src/main/scripts/fufex-recv =================================================================== --- udt-java/trunk/src/main/scripts/fufex-recv 2010-04-30 21:31:25 UTC (rev 34) +++ udt-java/trunk/src/main/scripts/fufex-recv 2010-05-01 20:49:52 UTC (rev 35) @@ -36,5 +36,5 @@ #memory for the VM MEM=-Xmx128m -$JAVA $MEM -cp $CP udt.unicore.FufexReceive $* +$JAVA $MEM $OPTS -cp $CP udt.unicore.FufexReceive $* Modified: udt-java/trunk/src/main/scripts/fufex-send =================================================================== --- udt-java/trunk/src/main/scripts/fufex-send 2010-04-30 21:31:25 UTC (rev 34) +++ udt-java/trunk/src/main/scripts/fufex-send 2010-05-01 20:49:52 UTC (rev 35) @@ -37,5 +37,5 @@ #memory for the VM MEM=-Xmx128m -$JAVA $MEM -cp $CP udt.unicore.FufexSend $* +$JAVA $MEM $OPTS -cp $CP udt.unicore.FufexSend $* Modified: udt-java/trunk/src/main/scripts/receive-file =================================================================== --- udt-java/trunk/src/main/scripts/receive-file 2010-04-30 21:31:25 UTC (rev 34) +++ udt-java/trunk/src/main/scripts/receive-file 2010-05-01 20:49:52 UTC (rev 35) @@ -1,6 +1,15 @@ #!/bin/sh # +# Start script for the UDT-Java send-file application +# Usage: receive-file <server-address> <server-port> <remote-file> <local-file> +# [--localIP=<local ip>] +# [--localPort=<local port>] +# [--verbose] +# +# + +# #Installation Directory # dir=`dirname $0` @@ -24,6 +33,12 @@ # #INST= +# +# Alternative CC class +# +#OPTS=$OPTS" -Dudt.congestioncontrol.class=udt.cc.SimpleTCP" + +#Java command to use JAVA=java #location of udt.jar @@ -32,5 +47,5 @@ #memory for the VM MEM=-Xmx128m -$JAVA $MEM -cp $CP udt.util.ReceiveFile $* +$JAVA $MEM $OPTS -cp $CP udt.util.ReceiveFile $* Modified: udt-java/trunk/src/main/scripts/send-file =================================================================== --- udt-java/trunk/src/main/scripts/send-file 2010-04-30 21:31:25 UTC (rev 34) +++ udt-java/trunk/src/main/scripts/send-file 2010-05-01 20:49:52 UTC (rev 35) @@ -1,6 +1,13 @@ #!/bin/sh # +# Start script for the UDT-Java send-file application +# Usage: send-file <server-port> +# [--localIP=<local ip>] +# [--verbose] +# + +# #Installation Directory # dir=`dirname $0` @@ -24,6 +31,19 @@ # #INST= +# +# Alternative CC class +# +#OPTS=$OPTS" -Dudt.congestioncontrol.class=udt.cc.SimpleTCP" + +# +# Collect and store some performance data (e.g. throughput) +# (data will be collected in memory and stored after send finishes +# to a udtstats-<NNNN>.csv file) +#OPTS=$OPTS" -Dudt.sender.storeStatistics=true" + + +#which Java command to use JAVA=java #location of udt.jar @@ -32,5 +52,5 @@ #memory for the VM MEM=-Xmx128m -$JAVA $MEM -cp $CP udt.util.SendFile $* +$JAVA $MEM $OPTS -cp $CP udt.util.SendFile $* Modified: udt-java/trunk/src/test/java/udt/performance/TestUDTLargeData.java =================================================================== --- udt-java/trunk/src/test/java/udt/performance/TestUDTLargeData.java 2010-04-30 21:31:25 UTC (rev 34) +++ udt-java/trunk/src/test/java/udt/performance/TestUDTLargeData.java 2010-05-01 20:49:52 UTC (rev 35) @@ -21,7 +21,7 @@ boolean running=false; //how many - int num_packets=500; + int num_packets=50; //how large is a single packet int size=1*1024*1024; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <bsc...@us...> - 2010-04-30 21:31:33
|
Revision: 34 http://udt-java.svn.sourceforge.net/udt-java/?rev=34&view=rev Author: bschuller Date: 2010-04-30 21:31:25 +0000 (Fri, 30 Apr 2010) Log Message: ----------- version number Modified Paths: -------------- udt-java/trunk/pom.xml Modified: udt-java/trunk/pom.xml =================================================================== --- udt-java/trunk/pom.xml 2010-04-30 19:09:25 UTC (rev 33) +++ udt-java/trunk/pom.xml 2010-04-30 21:31:25 UTC (rev 34) @@ -5,7 +5,7 @@ <artifactId>udt-java</artifactId> <packaging>jar</packaging> <name>UDT Java implementation</name> - <version>0.4-SNAPSHOT</version> + <version>0.5-SNAPSHOT</version> <url>http://sourceforge.net/projects/udt-java</url> <developers> <developer> This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <bsc...@us...> - 2010-04-30 19:09:31
|
Revision: 33 http://udt-java.svn.sourceforge.net/udt-java/?rev=33&view=rev Author: bschuller Date: 2010-04-30 19:09:25 +0000 (Fri, 30 Apr 2010) Log Message: ----------- bugfix in sender loss list Modified Paths: -------------- udt-java/trunk/src/main/java/udt/UDTReceiver.java udt-java/trunk/src/main/java/udt/UDTSender.java udt-java/trunk/src/main/java/udt/sender/SenderLossList.java udt-java/trunk/src/test/java/udt/TestList.java udt-java/trunk/src/test/java/udt/performance/TestUDTLargeData.java udt-java/trunk/src/test/java/udt/performance/TestUDTLargeDataCC1.java Modified: udt-java/trunk/src/main/java/udt/UDTReceiver.java =================================================================== --- udt-java/trunk/src/main/java/udt/UDTReceiver.java 2010-04-30 14:02:45 UTC (rev 32) +++ udt-java/trunk/src/main/java/udt/UDTReceiver.java 2010-04-30 19:09:25 UTC (rev 33) @@ -377,10 +377,11 @@ //check whether to drop this packet n++; - if(dropRate>0 && n % dropRate == 0){ - logger.info("**** TESTING:::: DROPPING PACKET "+currentSequenceNumber+" FOR TESTING"); - return; - } + //if(dropRate>0 && n % dropRate == 0){ + //if(n==668){ + // logger.info("**** TESTING:::: DROPPING PACKET "+currentSequenceNumber+" FOR TESTING"); + // return; + //} long currentDataPacketArrivalTime = Util.getCurrentTime(); Modified: udt-java/trunk/src/main/java/udt/UDTSender.java =================================================================== --- udt-java/trunk/src/main/java/udt/UDTSender.java 2010-04-30 14:02:45 UTC (rev 32) +++ udt-java/trunk/src/main/java/udt/UDTSender.java 2010-04-30 19:09:25 UTC (rev 33) @@ -91,13 +91,13 @@ private final AtomicInteger unacknowledged=new AtomicInteger(0); //for generating data packet sequence numbers - private long nextSequenceNumber=0; + private volatile long currentSequenceNumber=0; //the largest data packet sequence number that has actually been sent out private volatile long largestSentSequenceNumber=-1; //last acknowledge number, initialised to the initial sequence number - private long lastAckSequenceNumber; + private volatile long lastAckSequenceNumber; private volatile boolean started=false; @@ -269,8 +269,6 @@ * @param nak */ protected void onNAKPacketReceived(NegativeAcknowledgement nak){ - waitForAckLatch.get().countDown(); - for(Integer i: nak.getDecodedLossInfo()){ senderLossList.insert(Long.valueOf(i)); } @@ -283,7 +281,6 @@ logger.finer("NAK for "+nak.getDecodedLossInfo().size()+" packets lost, " +"set send period to "+session.getCongestionControl().getSendInterval()); } - return; } @@ -382,7 +379,7 @@ if(pktToRetransmit!=null){ endpoint.doSend(pktToRetransmit); statistics.incNumberOfRetransmittedDataPackets(); - } + } }catch (Exception e) { logger.log(Level.WARNING,"",e); } @@ -404,12 +401,12 @@ * The initial sequence number is "0" */ public long getNextSequenceNumber(){ - nextSequenceNumber++; - return nextSequenceNumber; + currentSequenceNumber++; + return currentSequenceNumber; } public long getCurrentSequenceNumber(){ - return nextSequenceNumber; + return currentSequenceNumber; } /** Modified: udt-java/trunk/src/main/java/udt/sender/SenderLossList.java =================================================================== --- udt-java/trunk/src/main/java/udt/sender/SenderLossList.java 2010-04-30 14:02:45 UTC (rev 32) +++ udt-java/trunk/src/main/java/udt/sender/SenderLossList.java 2010-04-30 19:09:25 UTC (rev 33) @@ -39,7 +39,7 @@ public class SenderLossList { private final LinkedList<Long>backingList; - + /** * create a new sender lost list */ @@ -48,17 +48,15 @@ } public void insert(Long obj){ - if(obj==null)System.out.println("!!!"); synchronized (backingList) { if(!backingList.contains(obj)){ - if(backingList.isEmpty())backingList.add(obj); - else{ - for(int i=0;i<backingList.size();i++){ - if(obj<backingList.getFirst()){ - backingList.add(i,obj); - } + for(int i=0;i<backingList.size();i++){ + if(obj<backingList.getFirst()){ + backingList.add(i,obj); + return; } } + backingList.add(obj); } } } @@ -76,7 +74,13 @@ return backingList.isEmpty(); } + public int size(){ + return backingList.size(); + } + public String toString(){ - return backingList.toString(); + synchronized (backingList) { + return backingList.toString(); + } } } Modified: udt-java/trunk/src/test/java/udt/TestList.java =================================================================== --- udt-java/trunk/src/test/java/udt/TestList.java 2010-04-30 14:02:45 UTC (rev 32) +++ udt-java/trunk/src/test/java/udt/TestList.java 2010-04-30 19:09:25 UTC (rev 33) @@ -85,6 +85,7 @@ l.insert(A); l.insert(B); l.insert(C); + assertEquals(3,l.size()); Long oldest=l.getFirstEntry(); assertEquals(C,oldest); } Modified: udt-java/trunk/src/test/java/udt/performance/TestUDTLargeData.java =================================================================== --- udt-java/trunk/src/test/java/udt/performance/TestUDTLargeData.java 2010-04-30 14:02:45 UTC (rev 32) +++ udt-java/trunk/src/test/java/udt/performance/TestUDTLargeData.java 2010-04-30 19:09:25 UTC (rev 33) @@ -21,7 +21,7 @@ boolean running=false; //how many - int num_packets=100; + int num_packets=500; //how large is a single packet int size=1*1024*1024; Modified: udt-java/trunk/src/test/java/udt/performance/TestUDTLargeDataCC1.java =================================================================== --- udt-java/trunk/src/test/java/udt/performance/TestUDTLargeDataCC1.java 2010-04-30 14:02:45 UTC (rev 32) +++ udt-java/trunk/src/test/java/udt/performance/TestUDTLargeDataCC1.java 2010-04-30 19:09:25 UTC (rev 33) @@ -13,7 +13,7 @@ boolean running=false; //how many - int num_packets=50; + int num_packets=100; //how large is a single packet int size=1*1024*1024; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <bsc...@us...> - 2010-04-30 14:02:52
|
Revision: 32 http://udt-java.svn.sourceforge.net/udt-java/?rev=32&view=rev Author: bschuller Date: 2010-04-30 14:02:45 +0000 (Fri, 30 Apr 2010) Log Message: ----------- Modified Paths: -------------- udt-java/trunk/src/main/java/udt/ClientSession.java udt-java/trunk/src/main/java/udt/CongestionControl.java udt-java/trunk/src/main/java/udt/ServerSession.java udt-java/trunk/src/main/java/udt/UDTCongestionControl.java udt-java/trunk/src/main/java/udt/UDTInputStream.java udt-java/trunk/src/main/java/udt/UDTReceiver.java udt-java/trunk/src/main/java/udt/UDTSender.java udt-java/trunk/src/main/java/udt/UDTSession.java udt-java/trunk/src/main/java/udt/sender/SenderLossList.java udt-java/trunk/src/main/java/udt/util/MeanValue.java udt-java/trunk/src/main/java/udt/util/UDTStatistics.java udt-java/trunk/src/main/java/udt/util/Util.java udt-java/trunk/src/test/java/udt/TestUDTInputStream.java udt-java/trunk/src/test/java/udt/TestUDTServerSocket.java udt-java/trunk/src/test/java/udt/UDTTestBase.java udt-java/trunk/src/test/java/udt/performance/TestUDTLargeData.java Added Paths: ----------- udt-java/trunk/src/main/java/udt/cc/ udt-java/trunk/src/main/java/udt/cc/SimpleTCP.java udt-java/trunk/src/test/java/udt/performance/TestUDTLargeDataCC1.java Modified: udt-java/trunk/src/main/java/udt/ClientSession.java =================================================================== --- udt-java/trunk/src/main/java/udt/ClientSession.java 2010-04-29 21:33:20 UTC (rev 31) +++ udt-java/trunk/src/main/java/udt/ClientSession.java 2010-04-30 14:02:45 UTC (rev 32) @@ -69,17 +69,15 @@ public void connect() throws InterruptedException,IOException{ int n=0; - sendHandShake(); - while(getState()!=ready){ if(getState()==invalid)throw new IOException("Can't connect!"); n++; if(getState()!=ready)Thread.sleep(500); } + cc.init(); logger.info("Connected, "+n+" handshake packets sent"); } - @Override public void received(UDTPacket packet, Destination peer) { Modified: udt-java/trunk/src/main/java/udt/CongestionControl.java =================================================================== --- udt-java/trunk/src/main/java/udt/CongestionControl.java 2010-04-29 21:33:20 UTC (rev 31) +++ udt-java/trunk/src/main/java/udt/CongestionControl.java 2010-04-30 14:02:45 UTC (rev 32) @@ -15,45 +15,63 @@ /** * set roundtrip time and associated variance + * @param rtt - round trip time in microseconds + * @param rttVar - round trip time variance in microseconds */ public abstract void setRTT(long rtt, long rttVar); /** * update packet arrival rate and link capacity with the * values received in an ACK packet - * @param rate - * @param linkCapacity + * @param rate - packet rate in packets per second + * @param linkCapacity - estimated link capacity in packets per second */ public abstract void updatePacketArrivalRate(long rate, long linkCapacity); + /** + * get the current value of the packet arrival + */ public long getPacketArrivalRate(); + /** + * get the current value of the estimated link capacity + */ public long getEstimatedLinkCapacity(); - /** - * Inter-packet interval in seconds - * @return + * get the current value of the inter-packet interval in microseconds */ public abstract double getSendInterval(); /** * get the congestion window size */ - public abstract long getCongestionWindowSize(); + public abstract double getCongestionWindowSize(); /** + * get the ACK interval. If larger than 0, the receiver should acknowledge + * every n'th packet + */ + public abstract long getAckInterval(); + + /** + * set the ACK interval. If larger than 0, the receiver should acknowledge + * every n'th packet + */ + public abstract void setAckInterval(long ackInterval); + + /** * Callback function to be called when an ACK packet is received. - * @param ackSeqno: the data sequence number acknowledged by this ACK. + * @param ackSeqno - the data sequence number acknowledged by this ACK. * see spec. page(16-17) */ public abstract void onACK(long ackSeqno); /** - * Callback function to be called when a loss report is received. - * @param lossInfo:list of sequence number of packets, in the format describled in packet.cpp. + * Callback function to be called when a loss report is received. + * @param lossInfo - list of sequence number of packets */ - public abstract void onNAK(List<Integer> lossInfo); + public abstract void onLoss(List<Integer> lossInfo); /** * Callback function to be called when a timeout event occurs @@ -62,13 +80,13 @@ /** * Callback function to be called when a data packet is sent. - * @param packetSeqNo: the data sequence number. + * @param packetSeqNo - the data packet sequence number */ public abstract void onPacketSend(long packetSeqNo); /** * Callback function to be called when a data packet is received. - * @param packetSeqNo: the data sequence number. + * @param packetSeqNo - the data packet sequence number. */ public abstract void onPacketReceive(long packetSeqNo); Modified: udt-java/trunk/src/main/java/udt/ServerSession.java =================================================================== --- udt-java/trunk/src/main/java/udt/ServerSession.java 2010-04-29 21:33:20 UTC (rev 31) +++ udt-java/trunk/src/main/java/udt/ServerSession.java 2010-04-30 14:02:45 UTC (rev 32) @@ -80,6 +80,7 @@ try{ setState(ready); socket=new UDTSocket(endPoint, this); + cc.init(); }catch(Exception uhe){ //session is invalid logger.log(Level.SEVERE,"",uhe); Modified: udt-java/trunk/src/main/java/udt/UDTCongestionControl.java =================================================================== --- udt-java/trunk/src/main/java/udt/UDTCongestionControl.java 2010-04-29 21:33:20 UTC (rev 31) +++ udt-java/trunk/src/main/java/udt/UDTCongestionControl.java 2010-04-30 14:02:45 UTC (rev 32) @@ -16,33 +16,30 @@ private static final Logger logger=Logger.getLogger(UDTCongestionControl.class.getName()); - private final UDTSession session; + protected final UDTSession session; - private final UDTStatistics statistics; + protected final UDTStatistics statistics; //round trip time in microseconds - private long roundTripTime=0; + protected long roundTripTime=0; //rate in packets per second - private long packetArrivalRate=0; + protected long packetArrivalRate=0; //link capacity in packets per second - private long estimatedLinkCapacity=0; + protected long estimatedLinkCapacity=0; // Packet sending period = packet send interval, in microseconds - private double packetSendingPeriod=1; + protected double packetSendingPeriod=1; // Congestion window size, in packets - private long congestionWindowSize=16; + protected double congestionWindowSize=16; - //last rate increase time (microsecond value) - long lastRateIncreaseTime=Util.getCurrentTime(); - /*if in slow start phase*/ - boolean slowStartPhase=true; + private boolean slowStartPhase=true; /*last ACKed seq no*/ - long lastAckSeqNumber=-1; + private long lastAckSeqNumber=-1; /*max packet seq. no. sent out when last decrease happened*/ private long lastDecreaseSeqNo; @@ -62,11 +59,13 @@ //this flag avoids immediate rate increase after a NAK private boolean loss=false; + //if larger than 0, the receiver should acknowledge every n'th packet + protected long ackInterval=-1; + public UDTCongestionControl(UDTSession session){ this.session=session; this.statistics=session.getStatistics(); lastDecreaseSeqNo=session.getInitialSequenceNumber()-1; - init(); } /* (non-Javadoc) @@ -108,11 +107,21 @@ return packetSendingPeriod; } + public long getAckInterval(){ + return ackInterval; + } + public void setAckInterval(long ackInterval){ + this.ackInterval=ackInterval; + if(session.getSocket().getReceiver()!=null){ + session.getSocket().getReceiver().setAckInterval(ackInterval); + } + } + /** * congestionWindowSize * @return */ - public long getCongestionWindowSize(){ + public double getCongestionWindowSize(){ return congestionWindowSize; } @@ -186,7 +195,7 @@ /* (non-Javadoc) * @see udt.CongestionControl#onNAK(java.util.List) */ - public void onNAK(List<Integer>lossInfo){ + public void onLoss(List<Integer>lossInfo){ loss=true; long firstBiggestlossSeqNo=lossInfo.get(0); nACKCount++; Modified: udt-java/trunk/src/main/java/udt/UDTInputStream.java =================================================================== --- udt-java/trunk/src/main/java/udt/UDTInputStream.java 2010-04-29 21:33:20 UTC (rev 31) +++ udt-java/trunk/src/main/java/udt/UDTInputStream.java 2010-04-30 14:02:45 UTC (rev 32) @@ -78,7 +78,8 @@ public UDTInputStream(UDTSocket socket, UDTStatistics statistics)throws IOException{ this.socket=socket; this.statistics=statistics; - appData=new PriorityBlockingQueue<AppData>(socket.getSession().getFlowWindowSize()); + int capacity=socket!=null? 4*socket.getSession().getFlowWindowSize() : 64 ; + appData=new PriorityBlockingQueue<AppData>(capacity); } /** @@ -178,7 +179,6 @@ //check if the data is in-order if(currentChunk.sequenceNumber==highestSequenceNumber+1){ highestSequenceNumber++; - //statistics.updateReadDataMD5(currentChunk.data); return; } else if(currentChunk.sequenceNumber<=highestSequenceNumber){ Modified: udt-java/trunk/src/main/java/udt/UDTReceiver.java =================================================================== --- udt-java/trunk/src/main/java/udt/UDTReceiver.java 2010-04-29 21:33:20 UTC (rev 31) +++ udt-java/trunk/src/main/java/udt/UDTReceiver.java 2010-04-30 14:02:45 UTC (rev 32) @@ -33,8 +33,8 @@ package udt; import java.io.IOException; import java.util.List; +import java.util.concurrent.ArrayBlockingQueue; import java.util.concurrent.BlockingQueue; -import java.util.concurrent.PriorityBlockingQueue; import java.util.concurrent.TimeUnit; import java.util.logging.Level; import java.util.logging.Logger; @@ -118,15 +118,15 @@ //to check the ACK, NAK, or EXP timer private long nextACK; //microseconds to next ACK event - private long ACK_INTERVAL=Util.getSYNTime(); + private long ackTimerInterval=Util.getSYNTime(); private long nextNAK; //microseconds to next NAK event - private long NAK_INTERVAL=Util.getSYNTime(); + private long nakTimerInterval=Util.getSYNTime(); private long nextEXP; //microseconds to next EXP event - private long EXP_INTERVAL=100*Util.getSYNTime(); + private long expTimerInterval=100*Util.getSYNTime(); //instant when the session was created (for expiry checking) private final long sessionUpSince; @@ -143,6 +143,9 @@ private volatile boolean stopped=false; + //(optional) ack interval (see CongestionControl interface) + private volatile long ackInterval=-1; + /** * if set to true connections will not expire, but will only be * closed by a Shutdown message @@ -165,10 +168,7 @@ packetPairWindow = new PacketPairWindow(16); largestReceivedSeqNumber=session.getInitialSequenceNumber()-1; bufferSize=session.getReceiveBufferSize(); - - //incoming packets are ordered by sequence number, with control packets having - //preference over data packets - handoffQueue=new PriorityBlockingQueue<UDTPacket>(session.getFlowWindowSize()); + handoffQueue=new ArrayBlockingQueue<UDTPacket>(4*session.getFlowWindowSize()); initMetrics(); start(); } @@ -194,9 +194,10 @@ Runnable r=new Runnable(){ public void run(){ try{ - nextACK=Util.getCurrentTime()+ACK_INTERVAL; - nextNAK=(long)(Util.getCurrentTime()+1.5*NAK_INTERVAL); - nextEXP=Util.getCurrentTime()+2*EXP_INTERVAL; + nextACK=Util.getCurrentTime()+ackTimerInterval; + nextNAK=(long)(Util.getCurrentTime()+1.5*nakTimerInterval); + nextEXP=Util.getCurrentTime()+2*expTimerInterval; + ackInterval=session.getCongestionControl().getAckInterval(); while(!stopped){ receiverAlgorithm(); } @@ -228,18 +229,18 @@ //check ACK timer long currentTime=Util.getCurrentTime(); if(nextACK<currentTime){ - nextACK=currentTime+ACK_INTERVAL; + nextACK=currentTime+ackTimerInterval; processACKEvent(true); } //check NAK timer if(nextNAK<currentTime){ - nextNAK=currentTime+NAK_INTERVAL; + nextNAK=currentTime+nakTimerInterval; processNAKEvent(); } //check EXP timer if(nextEXP<currentTime){ - nextEXP=currentTime+EXP_INTERVAL; + nextEXP=currentTime+expTimerInterval; processEXPEvent(); } //perform time-bounded UDP receive @@ -258,7 +259,7 @@ } } if(needEXPReset){ - nextEXP=Util.getCurrentTime()+EXP_INTERVAL; + nextEXP=Util.getCurrentTime()+expTimerInterval; } processTime.begin(); processUDTPacket(packet); @@ -367,11 +368,13 @@ //every nth packet will be discarded... for testing only of course public static int dropRate=0; + //number of received data packets private int n=0; protected void onDataPacketReceived(DataPacket dp)throws IOException{ long currentSequenceNumber = dp.getPacketSequenceNumber(); + //check whether to drop this packet n++; if(dropRate>0 && n % dropRate == 0){ @@ -379,6 +382,7 @@ return; } + long currentDataPacketArrivalTime = Util.getCurrentTime(); /*(4).if the seqNo of the current data packet is 16n+1,record the @@ -418,6 +422,11 @@ if(currentSequenceNumber>largestReceivedSeqNumber){ largestReceivedSeqNumber=currentSequenceNumber; } + + //(8) need to send an ACK? Some cc algorithms use this + if(ackInterval>0){ + if(n % ackInterval == 0)processACKEvent(false); + } } /** @@ -438,6 +447,7 @@ receiverLossList.insert(detectedLossSeqNumber); } endpoint.doSend(nAckPacket); + //logger.info("NAK for "+currentSequenceNumber); statistics.incNumberOfNAKSent(); } @@ -513,8 +523,8 @@ if(roundTripTime>0)roundTripTime = (roundTripTime*7 + rtt)/8; else roundTripTime = rtt; roundTripTimeVar = (roundTripTimeVar* 3 + Math.abs(roundTripTimeVar- rtt)) / 4; - ACK_INTERVAL=4*roundTripTime+roundTripTimeVar+Util.getSYNTime(); - NAK_INTERVAL=ACK_INTERVAL; + ackTimerInterval=4*roundTripTime+roundTripTimeVar+Util.getSYNTime(); + nakTimerInterval=ackTimerInterval; statistics.setRTT(roundTripTime, roundTripTimeVar); } } @@ -536,7 +546,7 @@ private volatile long ackSequenceNumber=0; protected void resetEXPTimer(){ - nextEXP=Util.getCurrentTime()+EXP_INTERVAL; + nextEXP=Util.getCurrentTime()+expTimerInterval; expCount=0; } @@ -544,6 +554,10 @@ expCount=0; } + public void setAckInterval(long ackInterval){ + this.ackInterval=ackInterval; + } + protected void onShutdown()throws IOException{ stop(); } Modified: udt-java/trunk/src/main/java/udt/UDTSender.java =================================================================== --- udt-java/trunk/src/main/java/udt/UDTSender.java 2010-04-29 21:33:20 UTC (rev 31) +++ udt-java/trunk/src/main/java/udt/UDTSender.java 2010-04-30 14:02:45 UTC (rev 32) @@ -246,7 +246,7 @@ long ackNumber=acknowledgement.getAckNumber(); cc.onACK(ackNumber); - statistics.setCongestionWindowSize(cc.getCongestionWindowSize()); + statistics.setCongestionWindowSize((long)cc.getCongestionWindowSize()); //need to remove all sequence numbers up the ack number from the sendBuffer boolean removed=false; for(long s=lastAckSequenceNumber;s<ackNumber;s++){ @@ -274,7 +274,7 @@ for(Integer i: nak.getDecodedLossInfo()){ senderLossList.insert(Long.valueOf(i)); } - session.getCongestionControl().onNAK(nak.getDecodedLossInfo()); + session.getCongestionControl().onLoss(nak.getDecodedLossInfo()); session.getSocket().getReceiver().resetEXPTimer(); statistics.incNumberOfNAKReceived(); statistics.storeParameters(); @@ -306,17 +306,16 @@ /** * sender algorithm */ - MeanValue v=new MeanValue("",true,128); + MeanValue v=new MeanValue("Wait for Ack time: "); public void senderAlgorithm()throws InterruptedException, IOException{ + statistics.addMetric(v); while(!paused){ long iterationStart=Util.getCurrentTime(); //last packet send time? //if the sender's loss list is not empty if (!senderLossList.isEmpty()) { - v.begin(); Long entry=senderLossList.getFirstEntry(); - v.end(); handleResubmit(entry); } @@ -327,7 +326,7 @@ int unAcknowledged=unacknowledged.get(); if(unAcknowledged<session.getCongestionControl().getCongestionWindowSize() - && unAcknowledged<session.getFlowWindowSize()){ + && unAcknowledged<session.getFlowWindowSize()){ //check for application data DataPacket dp=sendQueue.poll(); if(dp!=null){ @@ -342,7 +341,9 @@ if(unAcknowledged>=session.getCongestionControl().getCongestionWindowSize()){ statistics.incNumberOfCCWindowExceededEvents(); } + v.begin(); waitForAck(); + v.end(); } } @@ -455,7 +456,7 @@ */ public void waitForAck()throws InterruptedException{ waitForAckLatch.set(new CountDownLatch(1)); - waitForAckLatch.get().await(1000, TimeUnit.MILLISECONDS); + waitForAckLatch.get().await(2, TimeUnit.MILLISECONDS); } Modified: udt-java/trunk/src/main/java/udt/UDTSession.java =================================================================== --- udt-java/trunk/src/main/java/udt/UDTSession.java 2010-04-29 21:33:20 UTC (rev 31) +++ udt-java/trunk/src/main/java/udt/UDTSession.java 2010-04-30 14:02:45 UTC (rev 32) @@ -34,6 +34,7 @@ import java.net.DatagramPacket; import java.util.concurrent.atomic.AtomicLong; +import java.util.logging.Level; import java.util.logging.Logger; import udt.packets.Destination; @@ -72,7 +73,7 @@ * flow window size, i.e. how many data packets are * in-flight at a single time */ - protected int flowWindowSize=128; + protected int flowWindowSize=4*128; /** * remote UDT entity (address and socket ID) @@ -110,21 +111,23 @@ mySocketID=nextSocketID.incrementAndGet(); this.destination=destination; this.dgPacket=new DatagramPacket(new byte[0],0,destination.getAddress(),destination.getPort()); - //init configurable CC String clazzP=System.getProperty(CC_CLASS,UDTCongestionControl.class.getName()); Object ccObject=null; try{ Class<?>clazz=Class.forName(clazzP); ccObject=clazz.getDeclaredConstructor(UDTSession.class).newInstance(this); }catch(Exception e){ + logger.log(Level.WARNING,"Can't setup congestion control class <"+clazzP+">, using default.",e); ccObject=new UDTCongestionControl(this); } cc=(CongestionControl)ccObject; - System.out.println("using "+cc.getClass().getName()); + logger.info("Using "+cc.getClass().getName()); } + public abstract void received(UDTPacket packet, Destination peer); + public UDTSocket getSocket() { return socket; } Added: udt-java/trunk/src/main/java/udt/cc/SimpleTCP.java =================================================================== --- udt-java/trunk/src/main/java/udt/cc/SimpleTCP.java (rev 0) +++ udt-java/trunk/src/main/java/udt/cc/SimpleTCP.java 2010-04-30 14:02:45 UTC (rev 32) @@ -0,0 +1,36 @@ +package udt.cc; + +import java.util.List; + +import udt.UDTCongestionControl; +import udt.UDTSession; + +/** + * simple TCP CC algorithm from the paper + * "Optimizing UDP-based Protocol Implementations" by Y. Gu and R. Grossmann + */ +public class SimpleTCP extends UDTCongestionControl { + + public SimpleTCP(UDTSession session){ + super(session); + } + + @Override + public void init() { + packetSendingPeriod=0; + congestionWindowSize=2; + setAckInterval(2); + } + + @Override + public void onACK(long ackSeqno) { + congestionWindowSize += 1/congestionWindowSize; + } + + @Override + public void onLoss(List<Integer> lossInfo) { + congestionWindowSize *= 0.5; + } + + +} Property changes on: udt-java/trunk/src/main/java/udt/cc/SimpleTCP.java ___________________________________________________________________ Added: svn:mime-type + text/plain Modified: udt-java/trunk/src/main/java/udt/sender/SenderLossList.java =================================================================== --- udt-java/trunk/src/main/java/udt/sender/SenderLossList.java 2010-04-29 21:33:20 UTC (rev 31) +++ udt-java/trunk/src/main/java/udt/sender/SenderLossList.java 2010-04-30 14:02:45 UTC (rev 32) @@ -48,6 +48,7 @@ } public void insert(Long obj){ + if(obj==null)System.out.println("!!!"); synchronized (backingList) { if(!backingList.contains(obj)){ if(backingList.isEmpty())backingList.add(obj); @@ -62,17 +63,13 @@ } } - public void remove(long seqNo){ - synchronized (backingList) { - backingList.remove(seqNo); - } - } - /** * retrieves the loss list entry with the lowest sequence number */ public Long getFirstEntry(){ - return backingList.poll(); + synchronized(backingList){ + return backingList.poll(); + } } public boolean isEmpty(){ Modified: udt-java/trunk/src/main/java/udt/util/MeanValue.java =================================================================== --- udt-java/trunk/src/main/java/udt/util/MeanValue.java 2010-04-29 21:33:20 UTC (rev 31) +++ udt-java/trunk/src/main/java/udt/util/MeanValue.java 2010-04-30 14:02:45 UTC (rev 32) @@ -42,7 +42,7 @@ public void addValue(double value){ mean=(mean*n+value)/(n+1); n++; - if(verbose && n % nValue == 1){ + if(verbose && n % nValue == 0){ if(msg!=null)System.out.print(msg+" "); System.out.println(getFormattedMean()); } Modified: udt-java/trunk/src/main/java/udt/util/UDTStatistics.java =================================================================== --- udt-java/trunk/src/main/java/udt/util/UDTStatistics.java 2010-04-29 21:33:20 UTC (rev 31) +++ udt-java/trunk/src/main/java/udt/util/UDTStatistics.java 2010-04-30 14:02:45 UTC (rev 32) @@ -35,8 +35,6 @@ import java.io.File; import java.io.FileWriter; import java.io.IOException; -import java.security.MessageDigest; -import java.security.NoSuchAlgorithmException; import java.util.ArrayList; import java.util.Collections; import java.util.List; @@ -69,17 +67,10 @@ private volatile double sendPeriod; private volatile long congestionWindowSize; - private MessageDigest digest; - private final List<MeanValue>metrics=new ArrayList<MeanValue>(); public UDTStatistics(String componentDescription){ this.componentDescription=componentDescription; - try{ - digest=MessageDigest.getInstance("MD5"); - }catch(NoSuchAlgorithmException na){ - digest=null; - } } public int getNumberOfSentDataPackets() { @@ -170,14 +161,6 @@ this.congestionWindowSize = congestionWindowSize; } - public void updateReadDataMD5(byte[]data){ - digest.update(data); - } - - public String getDigest(){ - return hexString(digest); - } - public long getPacketArrivalRate(){ return packetArrivalRate; } @@ -268,15 +251,4 @@ } } - public static String hexString(MessageDigest digest){ - byte[] messageDigest = digest.digest(); - StringBuilder hexString = new StringBuilder(); - for (int i=0;i<messageDigest.length;i++) { - String hex = Integer.toHexString(0xFF & messageDigest[i]); - if(hex.length()==1)hexString.append('0'); - hexString.append(hex); - } - return hexString.toString(); - } - } Modified: udt-java/trunk/src/main/java/udt/util/Util.java =================================================================== --- udt-java/trunk/src/main/java/udt/util/Util.java 2010-04-29 21:33:20 UTC (rev 31) +++ udt-java/trunk/src/main/java/udt/util/Util.java 2010-04-30 14:02:45 UTC (rev 32) @@ -38,6 +38,7 @@ import java.io.OutputStream; import java.net.DatagramPacket; import java.net.InetAddress; +import java.security.MessageDigest; import udt.UDPEndPoint; @@ -149,5 +150,16 @@ p.setPort(clientPort); endpoint.sendRaw(p); } + + public static String hexString(MessageDigest digest){ + byte[] messageDigest = digest.digest(); + StringBuilder hexString = new StringBuilder(); + for (int i=0;i<messageDigest.length;i++) { + String hex = Integer.toHexString(0xFF & messageDigest[i]); + if(hex.length()==1)hexString.append('0'); + hexString.append(hex); + } + return hexString.toString(); + } } Modified: udt-java/trunk/src/test/java/udt/TestUDTInputStream.java =================================================================== --- udt-java/trunk/src/test/java/udt/TestUDTInputStream.java 2010-04-29 21:33:20 UTC (rev 31) +++ udt-java/trunk/src/test/java/udt/TestUDTInputStream.java 2010-04-30 14:02:45 UTC (rev 32) @@ -3,6 +3,7 @@ import java.security.MessageDigest; import udt.util.UDTStatistics; +import udt.util.Util; public class TestUDTInputStream extends UDTTestBase{ @@ -18,8 +19,8 @@ is.haveNewData(3, data3); is.noMoreData(); is.setBlocking(false); - readAll(is,8); - assertEquals(digest,stat.getDigest()); + String readMD5=readAll(is,8); + assertEquals(digest,readMD5); } public void test2()throws Exception{ @@ -34,8 +35,8 @@ is.haveNewData(2, data2); is.haveNewData(3, data3); is.noMoreData(); - readAll(is,5*1024*1024); - assertEquals(digest,stat.getDigest()); + String readMD5=readAll(is,5*1024*1024); + assertEquals(digest,readMD5); } public void testInOrder()throws Exception{ @@ -52,8 +53,8 @@ } is.noMoreData(); - readAll(is,1024*999); - assertEquals(digest,stat.getDigest()); + String readMD5 = readAll(is,1024*999); + assertEquals(digest,readMD5); } public void testRandomOrder()throws Exception{ @@ -70,9 +71,9 @@ for(int i : order){ is.haveNewData(i+1, blocks[i]); } - readAll(is,512,true); + String readMD5=readAll(is,512,true); - assertEquals(digest,stat.getDigest()); + assertEquals(digest,readMD5); } //read and discard data from the given input stream @@ -89,7 +90,7 @@ if(c>0)d.update(buf,0,c); } } - return UDTStatistics.hexString(d); + return Util.hexString(d); } } Modified: udt-java/trunk/src/test/java/udt/TestUDTServerSocket.java =================================================================== --- udt-java/trunk/src/test/java/udt/TestUDTServerSocket.java 2010-04-29 21:33:20 UTC (rev 31) +++ udt-java/trunk/src/test/java/udt/TestUDTServerSocket.java 2010-04-30 14:02:45 UTC (rev 32) @@ -6,7 +6,7 @@ import java.util.logging.Level; import java.util.logging.Logger; -import udt.util.UDTStatistics; +import udt.util.Util; public class TestUDTServerSocket extends UDTTestBase{ @@ -115,7 +115,7 @@ } System.out.println("Server thread exiting."); serverRunning=false; - md5_received=UDTStatistics.hexString(md5); + md5_received=Util.hexString(md5); serverSocket.shutDown(); System.out.println(s.getSession().getStatistics()); } Modified: udt-java/trunk/src/test/java/udt/UDTTestBase.java =================================================================== --- udt-java/trunk/src/test/java/udt/UDTTestBase.java 2010-04-29 21:33:20 UTC (rev 31) +++ udt-java/trunk/src/test/java/udt/UDTTestBase.java 2010-04-30 14:02:45 UTC (rev 32) @@ -5,7 +5,7 @@ import java.security.MessageDigest; import java.util.Random; -import udt.util.UDTStatistics; +import udt.util.Util; import junit.framework.TestCase; @@ -60,7 +60,7 @@ } public static String hexString(MessageDigest digest){ - return UDTStatistics.hexString(digest); + return Util.hexString(digest); } Modified: udt-java/trunk/src/test/java/udt/performance/TestUDTLargeData.java =================================================================== --- udt-java/trunk/src/test/java/udt/performance/TestUDTLargeData.java 2010-04-29 21:33:20 UTC (rev 31) +++ udt-java/trunk/src/test/java/udt/performance/TestUDTLargeData.java 2010-04-30 14:02:45 UTC (rev 32) @@ -14,6 +14,7 @@ import udt.UDTServerSocket; import udt.UDTSocket; import udt.UDTTestBase; +import udt.util.Util; public class TestUDTLargeData extends UDTTestBase{ @@ -87,7 +88,7 @@ System.out.println("MD5 hash of data received: "+md5_received); System.out.println(client.getStatistics()); - //assertEquals(md5_sent,md5_received); + assertEquals(md5_sent,md5_received); //store stat history to csv file client.getStatistics().writeParameterHistory(File.createTempFile("/udtstats-",".csv")); @@ -106,6 +107,7 @@ Runnable serverProcess=new Runnable(){ public void run(){ try{ + MessageDigest md5=MessageDigest.getInstance("MD5"); long start=System.currentTimeMillis(); UDTSocket s=serverSocket.accept(); assertNotNull(s); @@ -117,12 +119,13 @@ c=is.read(buf); if(c<0)break; else{ + md5.update(buf,0,c); total+=c; } } System.out.println("Server thread exiting, last received bytes: "+c); serverRunning=false; - md5_received=s.getSession().getStatistics().getDigest(); + md5_received=Util.hexString(md5); serverSocket.shutDown(); System.out.println(s.getSession().getStatistics()); } Added: udt-java/trunk/src/test/java/udt/performance/TestUDTLargeDataCC1.java =================================================================== --- udt-java/trunk/src/test/java/udt/performance/TestUDTLargeDataCC1.java (rev 0) +++ udt-java/trunk/src/test/java/udt/performance/TestUDTLargeDataCC1.java 2010-04-30 14:02:45 UTC (rev 32) @@ -0,0 +1,33 @@ +package udt.performance; + +import java.util.logging.Level; +import java.util.logging.Logger; + +import udt.UDTReceiver; +import udt.UDTSession; +import udt.cc.SimpleTCP; + +//uses different CC algorithm +public class TestUDTLargeDataCC1 extends TestUDTLargeData{ + + boolean running=false; + + //how many + int num_packets=50; + + //how large is a single packet + int size=1*1024*1024; + + int TIMEOUT=Integer.MAX_VALUE; + + int READ_BUFFERSIZE=1*1024*1024; + + public void test1()throws Exception{ + Logger.getLogger("udt").setLevel(Level.INFO); + UDTReceiver.dropRate=0; + System.setProperty(UDTSession.CC_CLASS, SimpleTCP.class.getName()); + TIMEOUT=Integer.MAX_VALUE; + doTest(); + } + +} Property changes on: udt-java/trunk/src/test/java/udt/performance/TestUDTLargeDataCC1.java ___________________________________________________________________ Added: svn:mime-type + text/plain This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <bsc...@us...> - 2010-04-29 21:33:27
|
Revision: 31 http://udt-java.svn.sourceforge.net/udt-java/?rev=31&view=rev Author: bschuller Date: 2010-04-29 21:33:20 +0000 (Thu, 29 Apr 2010) Log Message: ----------- simpler and faster ;) Modified Paths: -------------- udt-java/trunk/src/main/java/udt/ServerSession.java udt-java/trunk/src/main/java/udt/UDTOutputStream.java udt-java/trunk/src/main/java/udt/UDTSender.java udt-java/trunk/src/main/java/udt/packets/Acknowledgement.java udt-java/trunk/src/main/java/udt/packets/NegativeAcknowledgement.java udt-java/trunk/src/main/java/udt/sender/SenderLossList.java udt-java/trunk/src/main/java/udt/util/ReceiveFile.java udt-java/trunk/src/main/java/udt/util/SendFile.java udt-java/trunk/src/test/java/udt/TestList.java udt-java/trunk/src/test/java/udt/performance/TestUDTLargeData.java Removed Paths: ------------- udt-java/trunk/src/main/java/udt/sender/SenderListEntry.java udt-java/trunk/src/main/java/udt/sender/SenderLossListEntry.java udt-java/trunk/src/main/java/udt/sender/SentDataPacketsList.java udt-java/trunk/src/test/java/udt/NullCongestionControl.java Modified: udt-java/trunk/src/main/java/udt/ServerSession.java =================================================================== --- udt-java/trunk/src/main/java/udt/ServerSession.java 2010-04-29 15:26:39 UTC (rev 30) +++ udt-java/trunk/src/main/java/udt/ServerSession.java 2010-04-29 21:33:20 UTC (rev 31) @@ -43,7 +43,6 @@ import udt.packets.Destination; import udt.packets.KeepAlive; import udt.packets.Shutdown; -import udt.util.MeanValue; /** * server side session in client-server mode Modified: udt-java/trunk/src/main/java/udt/UDTOutputStream.java =================================================================== --- udt-java/trunk/src/main/java/udt/UDTOutputStream.java 2010-04-29 15:26:39 UTC (rev 30) +++ udt-java/trunk/src/main/java/udt/UDTOutputStream.java 2010-04-29 21:33:20 UTC (rev 31) @@ -36,8 +36,6 @@ /** * UDTOutputStream provides a UDT version of {@link OutputStream} - * - * */ public class UDTOutputStream extends OutputStream{ @@ -79,6 +77,19 @@ } /** + * This method signals the UDT sender that it can pause the + * sending thread. The UDT sender will resume when the next + * write() call is executed.<br/> + * For example, one can use this method on the receiving end + * of a file transfer, to save some CPU time which would otherwise + * be consumed by the sender thread. + */ + public void pauseOutput()throws IOException{ + socket.getSender().pause(); + } + + + /** * close this output stream */ @Override Modified: udt-java/trunk/src/main/java/udt/UDTSender.java =================================================================== --- udt-java/trunk/src/main/java/udt/UDTSender.java 2010-04-29 15:26:39 UTC (rev 30) +++ udt-java/trunk/src/main/java/udt/UDTSender.java 2010-04-29 21:33:20 UTC (rev 31) @@ -50,7 +50,6 @@ import udt.packets.KeepAlive; import udt.packets.NegativeAcknowledgement; import udt.sender.SenderLossList; -import udt.sender.SenderLossListEntry; import udt.util.MeanValue; import udt.util.UDTStatistics; import udt.util.UDTThreadFactory; @@ -72,13 +71,16 @@ private final UDTStatistics statistics; - //sendLossList store the sequence numbers of lost packets - //feed back by the receiver through NAK pakets + //senderLossList stores the sequence numbers of lost packets + //fed back by the receiver through NAK pakets private final SenderLossList senderLossList; + //sendBuffer stores the sent data packets and their sequence numbers private final Map<Long,DataPacket>sendBuffer; + //sendQueue contains the packets to send private final BlockingQueue<DataPacket>sendQueue; + //thread reading packets from send queue and sending them private Thread senderThread; @@ -101,10 +103,15 @@ private volatile boolean stopped=false; - private final CountDownLatch startLatch=new CountDownLatch(1); + private volatile boolean paused=false; + //used to signal that the sender should start to send + private volatile CountDownLatch startLatch=new CountDownLatch(1); + + //used by the sender to wait for an ACK private final AtomicReference<CountDownLatch> waitForAckLatch=new AtomicReference<CountDownLatch>(); + //used by the sender to wait for an ACK of a certain sequence number private final AtomicReference<CountDownLatch> waitForSeqAckLatch=new AtomicReference<CountDownLatch>(); public UDTSender(UDTSession session,UDPEndPoint endpoint){ @@ -145,9 +152,12 @@ Runnable r=new Runnable(){ public void run(){ try{ - //wait until explicitely started - startLatch.await(); - senderAlgorithm(); + while(!stopped){ + //wait until explicitely (re)started + startLatch.await(); + paused=false; + senderAlgorithm(); + } }catch(InterruptedException ie){ ie.printStackTrace(); } @@ -262,7 +272,7 @@ waitForAckLatch.get().countDown(); for(Integer i: nak.getDecodedLossInfo()){ - senderLossList.insert(new SenderLossListEntry(i)); + senderLossList.insert(Long.valueOf(i)); } session.getCongestionControl().onNAK(nak.getDecodedLossInfo()); session.getSocket().getReceiver().resetEXPTimer(); @@ -296,18 +306,18 @@ /** * sender algorithm */ - MeanValue v=new MeanValue("",true); + MeanValue v=new MeanValue("",true,128); public void senderAlgorithm()throws InterruptedException, IOException{ - while(!stopped){ + while(!paused){ long iterationStart=Util.getCurrentTime(); //last packet send time? //if the sender's loss list is not empty - SenderLossListEntry entry=senderLossList.getFirstEntry(); - if (entry!=null) { + if (!senderLossList.isEmpty()) { v.begin(); + Long entry=senderLossList.getFirstEntry(); + v.end(); handleResubmit(entry); - v.end(); } else @@ -338,7 +348,7 @@ //wait if(largestSentSequenceNumber % 16 !=0){ - double snd=100;//session.getCongestionControl().getSendInterval(); + double snd=session.getCongestionControl().getSendInterval(); long passed=Util.getCurrentTime()-iterationStart; int x=0; while(snd-passed>0){ @@ -357,8 +367,8 @@ * re-submits an entry from the sender loss list * @param entry */ - protected void handleResubmit(SenderLossListEntry entry){ - long seqNumber = entry.getSequenceNumber(); + protected void handleResubmit(Long seqNumber){ + //long seqNumber=entry.getSequenceNumber(); //TODO //if the current seqNumber is 16n,check the timeOut in the //loss list and send a message drop request. @@ -383,7 +393,7 @@ protected void putUnacknowledgedPacketsIntoLossList(){ synchronized (sendLock) { for(Long l: sendBuffer.keySet()){ - senderLossList.insert(new SenderLossListEntry(l)); + senderLossList.insert(l); } } } @@ -432,7 +442,7 @@ * * @throws InterruptedException */ - public synchronized void waitForAck(long sequenceNumber)throws InterruptedException{ + public void waitForAck(long sequenceNumber)throws InterruptedException{ while(!session.isShutdown() && !haveAcknowledgementFor(sequenceNumber)){ waitForSeqAckLatch.set(new CountDownLatch(1)); waitForSeqAckLatch.get().await(10, TimeUnit.MILLISECONDS); @@ -443,7 +453,7 @@ * wait for the next acknowledge * @throws InterruptedException */ - public synchronized void waitForAck()throws InterruptedException{ + public void waitForAck()throws InterruptedException{ waitForAckLatch.set(new CountDownLatch(1)); waitForAckLatch.get().await(1000, TimeUnit.MILLISECONDS); } @@ -452,4 +462,9 @@ public void stop(){ stopped=true; } + + public void pause(){ + startLatch=new CountDownLatch(1); + paused=true; + } } Modified: udt-java/trunk/src/main/java/udt/packets/Acknowledgement.java =================================================================== --- udt-java/trunk/src/main/java/udt/packets/Acknowledgement.java 2010-04-29 15:26:39 UTC (rev 30) +++ udt-java/trunk/src/main/java/udt/packets/Acknowledgement.java 2010-04-29 21:33:20 UTC (rev 31) @@ -33,7 +33,6 @@ package udt.packets; import java.io.ByteArrayOutputStream; -import udt.UDTPacket; import udt.UDTReceiver; import udt.UDTSender; Modified: udt-java/trunk/src/main/java/udt/packets/NegativeAcknowledgement.java =================================================================== --- udt-java/trunk/src/main/java/udt/packets/NegativeAcknowledgement.java 2010-04-29 15:26:39 UTC (rev 30) +++ udt-java/trunk/src/main/java/udt/packets/NegativeAcknowledgement.java 2010-04-29 21:33:20 UTC (rev 31) @@ -37,8 +37,6 @@ import java.util.ArrayList; import java.util.List; -import udt.packets.ControlPacket.ControlPacketType; - /** * NAK carries information about lost packets * Deleted: udt-java/trunk/src/main/java/udt/sender/SenderListEntry.java =================================================================== --- udt-java/trunk/src/main/java/udt/sender/SenderListEntry.java 2010-04-29 15:26:39 UTC (rev 30) +++ udt-java/trunk/src/main/java/udt/sender/SenderListEntry.java 2010-04-29 21:33:20 UTC (rev 31) @@ -1,69 +0,0 @@ -/********************************************************************************* - * Copyright (c) 2010 Forschungszentrum Juelich GmbH - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * (1) Redistributions of source code must retain the above copyright notice, - * this list of conditions and the disclaimer at the end. Redistributions in - * binary form must reproduce the above copyright notice, this list of - * conditions and the following disclaimer in the documentation and/or other - * materials provided with the distribution. - * - * (2) Neither the name of Forschungszentrum Juelich GmbH nor the names of its - * contributors may be used to endorse or promote products derived from this - * software without specific prior written permission. - * - * DISCLAIMER - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - *********************************************************************************/ - -package udt.sender; - -/** - * stores a data packet sequence number and the time it was sent - */ -public class SenderListEntry implements Comparable<SenderListEntry>{ - - private final long sequenceNumber; - //departure time - private final long sentTime; - - public SenderListEntry(long sequenceNumber, long sentTime){ - this.sequenceNumber= sequenceNumber; - this.sentTime= sentTime; - } - - public long getSequenceNumber() { - return sequenceNumber; - } - - public long getSentTime() { - return sentTime; - } - - public String toString(){ - return sequenceNumber+"[time="+sentTime+"]"; - } - - - //used to order the entries in order of increasing sequence numbers - public int compareTo(SenderListEntry o) { - return (int)(sequenceNumber-o.sequenceNumber); - } - - - -} Modified: udt-java/trunk/src/main/java/udt/sender/SenderLossList.java =================================================================== --- udt-java/trunk/src/main/java/udt/sender/SenderLossList.java 2010-04-29 15:26:39 UTC (rev 30) +++ udt-java/trunk/src/main/java/udt/sender/SenderLossList.java 2010-04-29 21:33:20 UTC (rev 31) @@ -31,37 +31,47 @@ *********************************************************************************/ package udt.sender; -import java.util.concurrent.PriorityBlockingQueue; +import java.util.LinkedList; /** * stores the sequence number of the lost packets in increasing order */ public class SenderLossList { - private final PriorityBlockingQueue<SenderLossListEntry>backingList; + private final LinkedList<Long>backingList; /** * create a new sender lost list */ public SenderLossList(){ - backingList = new PriorityBlockingQueue<SenderLossListEntry>(32); + backingList = new LinkedList<Long>(); } - public void insert(SenderLossListEntry obj){ + public void insert(Long obj){ synchronized (backingList) { - if(!backingList.contains(obj))backingList.add(obj); + if(!backingList.contains(obj)){ + if(backingList.isEmpty())backingList.add(obj); + else{ + for(int i=0;i<backingList.size();i++){ + if(obj<backingList.getFirst()){ + backingList.add(i,obj); + } + } + } + } } } public void remove(long seqNo){ - backingList.remove(new SenderLossListEntry(seqNo)); + synchronized (backingList) { + backingList.remove(seqNo); + } } /** - * retrieves the loss list entry with the lowest sequence number and removes - * it from the loss list + * retrieves the loss list entry with the lowest sequence number */ - public SenderLossListEntry getFirstEntry(){ + public Long getFirstEntry(){ return backingList.poll(); } @@ -69,10 +79,6 @@ return backingList.isEmpty(); } - public long size(){ - return backingList.size(); - } - public String toString(){ return backingList.toString(); } Deleted: udt-java/trunk/src/main/java/udt/sender/SenderLossListEntry.java =================================================================== --- udt-java/trunk/src/main/java/udt/sender/SenderLossListEntry.java 2010-04-29 15:26:39 UTC (rev 30) +++ udt-java/trunk/src/main/java/udt/sender/SenderLossListEntry.java 2010-04-29 21:33:20 UTC (rev 31) @@ -1,100 +0,0 @@ -/********************************************************************************* - * Copyright (c) 2010 Forschungszentrum Juelich GmbH - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * (1) Redistributions of source code must retain the above copyright notice, - * this list of conditions and the disclaimer at the end. Redistributions in - * binary form must reproduce the above copyright notice, this list of - * conditions and the following disclaimer in the documentation and/or other - * materials provided with the distribution. - * - * (2) Neither the name of Forschungszentrum Juelich GmbH nor the names of its - * contributors may be used to endorse or promote products derived from this - * software without specific prior written permission. - * - * DISCLAIMER - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - *********************************************************************************/ - -package udt.sender; - -import udt.util.Util; - -/** - * the sender loss list stores information about lost data packets on the - * sender side, ordered by increasing sequence number - * @see SenderLossListEntry - */ -public class SenderLossListEntry implements Comparable<SenderLossListEntry>{ - - private final long sequenceNumber ; - - //time when the loss list entry was created - private final long storageTime; - - public SenderLossListEntry(long sequenceNumber){ - if(sequenceNumber<0)throw new IllegalArgumentException(); - this.sequenceNumber = sequenceNumber; - storageTime=Util.getCurrentTime(); - } - - public long getSequenceNumber() { - return sequenceNumber; - } - - /** - * get the age of this loss sequence number - * @return - */ - public long getAge() { - return Util.getCurrentTime()-storageTime; - } - - /** - * used to order entries by increasing sequence number - */ - public int compareTo(SenderLossListEntry o) { - return (int)(sequenceNumber-o.sequenceNumber); - } - - @Override - public int hashCode() { - final int prime = 31; - int result = 1; - result = prime * result - + (int) (sequenceNumber ^ (sequenceNumber >>> 32)); - return result; - } - - @Override - public boolean equals(Object obj) { - if (this == obj) - return true; - if (obj == null) - return false; - if (getClass() != obj.getClass()) - return false; - SenderLossListEntry other = (SenderLossListEntry) obj; - if (sequenceNumber != other.sequenceNumber) - return false; - return true; - } - - public String toString(){ - return "lost-"+sequenceNumber; - } -} Deleted: udt-java/trunk/src/main/java/udt/sender/SentDataPacketsList.java =================================================================== --- udt-java/trunk/src/main/java/udt/sender/SentDataPacketsList.java 2010-04-29 15:26:39 UTC (rev 30) +++ udt-java/trunk/src/main/java/udt/sender/SentDataPacketsList.java 2010-04-29 21:33:20 UTC (rev 31) @@ -1,69 +0,0 @@ -/********************************************************************************* - * Copyright (c) 2010 Forschungszentrum Juelich GmbH - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * (1) Redistributions of source code must retain the above copyright notice, - * this list of conditions and the disclaimer at the end. Redistributions in - * binary form must reproduce the above copyright notice, this list of - * conditions and the following disclaimer in the documentation and/or other - * materials provided with the distribution. - * - * (2) Neither the name of Forschungszentrum Juelich GmbH nor the names of its - * contributors may be used to endorse or promote products derived from this - * software without specific prior written permission. - * - * DISCLAIMER - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - *********************************************************************************/ - -package udt.sender; -import java.util.Iterator; -import java.util.concurrent.PriorityBlockingQueue; - -/** - * stores the sequence numbers of the data packets sent out, and the time of sending. - * Entries are ordered in order of increasing sequence number - * @see SenderListEntry - */ -public class SentDataPacketsList { - - private final PriorityBlockingQueue<SenderListEntry>listOfSentPacketSeqNo; - - public SentDataPacketsList(){ - listOfSentPacketSeqNo = new PriorityBlockingQueue<SenderListEntry>(64); - } - - public void insert(SenderListEntry obj){ - listOfSentPacketSeqNo.add(obj); - } - - public void remove(long seqNo){ - Iterator<SenderListEntry>iterator=listOfSentPacketSeqNo.iterator(); - while(iterator.hasNext()){ - SenderListEntry e=iterator.next(); - if(e.getSequenceNumber()==seqNo){ - iterator.remove(); - return; - } - } - } - - public boolean isEmpty(){ - return listOfSentPacketSeqNo.isEmpty(); - } - -} Modified: udt-java/trunk/src/main/java/udt/util/ReceiveFile.java =================================================================== --- udt-java/trunk/src/main/java/udt/util/ReceiveFile.java 2010-04-29 15:26:39 UTC (rev 30) +++ udt-java/trunk/src/main/java/udt/util/ReceiveFile.java 2010-04-29 21:33:20 UTC (rev 31) @@ -89,7 +89,11 @@ bb.put((byte)0); out.write(readBuf, 0, bb.position()); + out.flush(); + //pause the sender to save some CPU time + out.pauseOutput(); + //read size info (an 4-byte int) byte[]sizeInfo=new byte[4]; @@ -146,7 +150,9 @@ } public static void usage(){ - System.out.println("Usage: java -cp .. udt.util.ReceiveFile <server_ip> <server_port> <remote_filename> <local_filename>"); + System.out.println("Usage: java -cp .. udt.util.ReceiveFile " + + "<server_ip> <server_port> <remote_filename> <local_filename> " + + "[--verbose] [--localPort=<port>] [--localIP=<ip>]"); } } Modified: udt-java/trunk/src/main/java/udt/util/SendFile.java =================================================================== --- udt-java/trunk/src/main/java/udt/util/SendFile.java 2010-04-29 15:26:39 UTC (rev 30) +++ udt-java/trunk/src/main/java/udt/util/SendFile.java 2010-04-29 21:33:20 UTC (rev 31) @@ -108,7 +108,8 @@ } public static void usage(){ - System.out.println("Usage: java -cp ... udt.util.SendFile <server_port>"); + System.out.println("Usage: java -cp ... udt.util.SendFile <server_port> " + + "[--verbose] [--localPort=<port>] [--localIP=<ip>]"); } public static class RequestRunner implements Runnable{ Deleted: udt-java/trunk/src/test/java/udt/NullCongestionControl.java =================================================================== --- udt-java/trunk/src/test/java/udt/NullCongestionControl.java 2010-04-29 15:26:39 UTC (rev 30) +++ udt-java/trunk/src/test/java/udt/NullCongestionControl.java 2010-04-29 21:33:20 UTC (rev 31) @@ -1,56 +0,0 @@ -package udt; - -import java.util.List; - -public class NullCongestionControl implements CongestionControl { - - private final UDTSession session; - - public NullCongestionControl(UDTSession session){ - this.session=session; - } - - public void close() { - } - - public long getCongestionWindowSize() { - return Long.MAX_VALUE; - } - - public double getSendInterval() { - return 0; - } - - public void init() { - } - - public void onACK(long ackSeqno) { - } - - public void onNAK(List<Integer> lossInfo) { - } - - public void onPacketReceive(long packetSeqNo) { - } - - public void onPacketSend(long packetSeqNo) { - } - - public void onTimeout() { - } - - public void updatePacketArrivalRate(long rate, long linkCapacity) { - } - - public void setRTT(long rtt, long rttVar) { - } - - public long getEstimatedLinkCapacity() { - return 0; - } - - public long getPacketArrivalRate() { - return 0; - } - -} Modified: udt-java/trunk/src/test/java/udt/TestList.java =================================================================== --- udt-java/trunk/src/test/java/udt/TestList.java 2010-04-29 15:26:39 UTC (rev 30) +++ udt-java/trunk/src/test/java/udt/TestList.java 2010-04-29 21:33:20 UTC (rev 31) @@ -10,7 +10,6 @@ import udt.receiver.PacketHistoryWindow; import udt.receiver.PacketPairWindow; import udt.sender.SenderLossList; -import udt.sender.SenderLossListEntry; import udt.util.CircularArray; /* @@ -79,14 +78,14 @@ } public void testSenderLossList1(){ - SenderLossListEntry A = new SenderLossListEntry(7); - SenderLossListEntry B = new SenderLossListEntry(8); - SenderLossListEntry C = new SenderLossListEntry(1); + Long A=7l; + Long B=8l; + Long C=1l; SenderLossList l=new SenderLossList(); l.insert(A); l.insert(B); l.insert(C); - SenderLossListEntry oldest=l.getFirstEntry(); + Long oldest=l.getFirstEntry(); assertEquals(C,oldest); } @@ -128,7 +127,6 @@ assertFalse(p.isControlPacket()); assertEquals(54,p.getPacketSequenceNumber()); - } } Modified: udt-java/trunk/src/test/java/udt/performance/TestUDTLargeData.java =================================================================== --- udt-java/trunk/src/test/java/udt/performance/TestUDTLargeData.java 2010-04-29 15:26:39 UTC (rev 30) +++ udt-java/trunk/src/test/java/udt/performance/TestUDTLargeData.java 2010-04-29 21:33:20 UTC (rev 31) @@ -20,7 +20,7 @@ boolean running=false; //how many - int num_packets=20; + int num_packets=100; //how large is a single packet int size=1*1024*1024; @@ -31,7 +31,6 @@ public void test1()throws Exception{ Logger.getLogger("udt").setLevel(Level.INFO); - //System.setProperty(UDTSession.CC_CLASS, NullCongestionControl.class.getName()); UDTReceiver.dropRate=0; TIMEOUT=Integer.MAX_VALUE; doTest(); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <bsc...@us...> - 2010-04-29 15:26:45
|
Revision: 30 http://udt-java.svn.sourceforge.net/udt-java/?rev=30&view=rev Author: bschuller Date: 2010-04-29 15:26:39 +0000 (Thu, 29 Apr 2010) Log Message: ----------- minor performance improvements; add metric code for easier measuring of performance Modified Paths: -------------- udt-java/trunk/src/main/java/udt/ClientSession.java udt-java/trunk/src/main/java/udt/ServerSession.java udt-java/trunk/src/main/java/udt/UDPEndPoint.java udt-java/trunk/src/main/java/udt/UDTCongestionControl.java udt-java/trunk/src/main/java/udt/UDTInputStream.java udt-java/trunk/src/main/java/udt/UDTPacket.java udt-java/trunk/src/main/java/udt/UDTReceiver.java udt-java/trunk/src/main/java/udt/UDTSender.java udt-java/trunk/src/main/java/udt/UDTSession.java udt-java/trunk/src/main/java/udt/packets/Acknowledgement.java udt-java/trunk/src/main/java/udt/packets/Acknowledgment2.java udt-java/trunk/src/main/java/udt/packets/ConnectionHandshake.java udt-java/trunk/src/main/java/udt/packets/ControlPacket.java udt-java/trunk/src/main/java/udt/packets/DataPacket.java udt-java/trunk/src/main/java/udt/packets/KeepAlive.java udt-java/trunk/src/main/java/udt/packets/MessageDropRequest.java udt-java/trunk/src/main/java/udt/packets/NegativeAcknowledgement.java udt-java/trunk/src/main/java/udt/packets/PacketFactory.java udt-java/trunk/src/main/java/udt/packets/Shutdown.java udt-java/trunk/src/main/java/udt/packets/UserDefined.java udt-java/trunk/src/main/java/udt/util/MeanValue.java udt-java/trunk/src/main/java/udt/util/ReceiveFile.java udt-java/trunk/src/main/java/udt/util/UDTStatistics.java udt-java/trunk/src/test/java/udt/performance/TestUDTLargeData.java udt-java/trunk/src/test/java/udt/performance/UDPTest.java Modified: udt-java/trunk/src/main/java/udt/ClientSession.java =================================================================== --- udt-java/trunk/src/main/java/udt/ClientSession.java 2010-04-29 09:27:13 UTC (rev 29) +++ udt-java/trunk/src/main/java/udt/ClientSession.java 2010-04-29 15:26:39 UTC (rev 30) @@ -80,6 +80,7 @@ logger.info("Connected, "+n+" handshake packets sent"); } + @Override public void received(UDTPacket packet, Destination peer) { @@ -99,6 +100,7 @@ return; } if(getState() == ready) { + if(packet instanceof Shutdown){ setState(shutdown); active=false; Modified: udt-java/trunk/src/main/java/udt/ServerSession.java =================================================================== --- udt-java/trunk/src/main/java/udt/ServerSession.java 2010-04-29 09:27:13 UTC (rev 29) +++ udt-java/trunk/src/main/java/udt/ServerSession.java 2010-04-29 15:26:39 UTC (rev 30) @@ -43,6 +43,7 @@ import udt.packets.Destination; import udt.packets.KeepAlive; import udt.packets.Shutdown; +import udt.util.MeanValue; /** * server side session in client-server mode @@ -67,7 +68,6 @@ @Override public void received(UDTPacket packet, Destination peer){ lastPacket=packet; - if (getState()<=ready && packet instanceof ConnectionHandshake) { logger.info("Received ConnectionHandshake from "+peer); ConnectionHandshake connectionHandshake=(ConnectionHandshake)packet; Modified: udt-java/trunk/src/main/java/udt/UDPEndPoint.java =================================================================== --- udt-java/trunk/src/main/java/udt/UDPEndPoint.java 2010-04-29 09:27:13 UTC (rev 29) +++ udt-java/trunk/src/main/java/udt/UDPEndPoint.java 2010-04-29 15:26:39 UTC (rev 30) @@ -83,7 +83,7 @@ private volatile boolean stopped=false; public static final int DATAGRAM_SIZE=1500; - + /** * bind to any local port on the given host address * @param localAddress @@ -113,9 +113,9 @@ clientSessions=new ConcurrentHashMap<Destination, UDTSession>(); sessionHandoff=new SynchronousQueue<UDTSession>(); //set a time out to avoid blocking in doReceive() - dgSocket.setSoTimeout(1000); + dgSocket.setSoTimeout(100000); //buffer size - dgSocket.setReceiveBufferSize(512*1024); + dgSocket.setReceiveBufferSize(128*1024); } /** @@ -151,9 +151,7 @@ Runnable receive=new Runnable(){ public void run(){ try{ - while(!stopped){ - doReceive(); - } + doReceive(); }catch(Exception ex){ ex.printStackTrace(); } @@ -240,65 +238,68 @@ */ private long lastDestID=-1; private UDTSession lastSession; - MeanValue v=new MeanValue(true,64); + + MeanValue v=new MeanValue("",false); + protected void doReceive()throws IOException{ - try{ + while(!stopped){ try{ - //will block until a packet is received or timeout has expired - dgSocket.receive(dp); - Destination peer=new Destination(dp.getAddress(), dp.getPort()); - int l=dp.getLength(); - UDTPacket packet=PacketFactory.createPacket(dp.getData(),l); - lastPacket=packet; + try{ + //will block until a packet is received or timeout has expired + dgSocket.receive(dp); + + Destination peer=new Destination(dp.getAddress(), dp.getPort()); + int l=dp.getLength(); + UDTPacket packet=PacketFactory.createPacket(dp.getData(),l); + lastPacket=packet; - //handle connection handshake - if(packet.isConnectionHandshake()){ - UDTSession session=clientSessions.get(peer); - - if(session==null){ - session=new ServerSession(dp,this); - addSession(session.getSocketID(),session); - //TODO need to check peer to avoid duplicate server session - if(serverSocketMode){ - logger.fine("Pooling new request."); - sessionHandoff.put(session); - logger.fine("Request taken for processing."); + //handle connection handshake + if(packet.isConnectionHandshake()){ + UDTSession session=clientSessions.get(peer); + if(session==null){ + session=new ServerSession(dp,this); + addSession(session.getSocketID(),session); + //TODO need to check peer to avoid duplicate server session + if(serverSocketMode){ + logger.fine("Pooling new request."); + sessionHandoff.put(session); + logger.fine("Request taken for processing."); + } } + peer.setSocketID(((ConnectionHandshake)packet).getSocketID()); + session.received(packet,peer); } - peer.setSocketID(((ConnectionHandshake)packet).getSocketID()); - session.received(packet,peer); - } - - else{ - //dispatch to existing session - long dest=packet.getDestinationID(); - UDTSession session; - if(dest==lastDestID){ - session=lastSession; - } else{ - session=sessions.get(dest); - lastSession=session; - lastDestID=dest; + //dispatch to existing session + long dest=packet.getDestinationID(); + UDTSession session; + if(dest==lastDestID){ + session=lastSession; + } + else{ + session=sessions.get(dest); + lastSession=session; + lastDestID=dest; + } + if(session==null){ + logger.warning("Unknown session <"+packet.getDestinationID()+"> requested from <"+peer+"> packet type "+packet.getClass().getName()); + } + else{ + session.received(packet,peer); + } } - if(session==null){ - logger.warning("Unknown session <"+packet.getDestinationID()+"> requested from <"+peer+"> packet type "+packet.getClass().getName()); - } - else{ - session.received(packet,peer); - } + }catch(SocketException ex){ + logger.log(Level.INFO, "SocketException: "+ex.getMessage()); + }catch(SocketTimeoutException ste){ + //can safely ignore... we will retry until the endpoint is stopped } - }catch(SocketException ex){ - logger.log(Level.INFO, "SocketException: "+ex.getMessage()); - }catch(SocketTimeoutException ste){ - //can safely ignore... we will retry until the endpoint is stopped + + }catch(Exception ex){ + logger.log(Level.WARNING, "Got: "+ex.getMessage(),ex); } - - }catch(Exception ex){ - logger.log(Level.WARNING, "Got: "+ex.getMessage(),ex); } } - + protected void doSend(UDTPacket packet)throws IOException{ byte[]data=packet.getEncoded(); DatagramPacket dgp = packet.getSession().getDatagram(); Modified: udt-java/trunk/src/main/java/udt/UDTCongestionControl.java =================================================================== --- udt-java/trunk/src/main/java/udt/UDTCongestionControl.java 2010-04-29 09:27:13 UTC (rev 29) +++ udt-java/trunk/src/main/java/udt/UDTCongestionControl.java 2010-04-29 15:26:39 UTC (rev 30) @@ -30,7 +30,7 @@ private long estimatedLinkCapacity=0; // Packet sending period = packet send interval, in microseconds - private double packetSendingPeriod=0; + private double packetSendingPeriod=1; // Congestion window size, in packets private long congestionWindowSize=16; @@ -229,9 +229,6 @@ lastDecreaseSeqNo= currentMaxSequenceNumber; } - //enforce upper limit on send period... - //packetSendingPeriod=Math.min(packetSendingPeriod, 2*roundTripTime); - statistics.setSendPeriod(packetSendingPeriod); return; } Modified: udt-java/trunk/src/main/java/udt/UDTInputStream.java =================================================================== --- udt-java/trunk/src/main/java/udt/UDTInputStream.java 2010-04-29 09:27:13 UTC (rev 29) +++ udt-java/trunk/src/main/java/udt/UDTInputStream.java 2010-04-29 15:26:39 UTC (rev 30) @@ -78,7 +78,7 @@ public UDTInputStream(UDTSocket socket, UDTStatistics statistics)throws IOException{ this.socket=socket; this.statistics=statistics; - appData=new PriorityBlockingQueue<AppData>(128); + appData=new PriorityBlockingQueue<AppData>(socket.getSession().getFlowWindowSize()); } /** @@ -178,7 +178,7 @@ //check if the data is in-order if(currentChunk.sequenceNumber==highestSequenceNumber+1){ highestSequenceNumber++; - statistics.updateReadDataMD5(currentChunk.data); + //statistics.updateReadDataMD5(currentChunk.data); return; } else if(currentChunk.sequenceNumber<=highestSequenceNumber){ Modified: udt-java/trunk/src/main/java/udt/UDTPacket.java =================================================================== --- udt-java/trunk/src/main/java/udt/UDTPacket.java 2010-04-29 09:27:13 UTC (rev 29) +++ udt-java/trunk/src/main/java/udt/UDTPacket.java 2010-04-29 15:26:39 UTC (rev 30) @@ -48,6 +48,8 @@ public boolean isControlPacket(); + public int getControlPacketType(); + /** * header * @return Modified: udt-java/trunk/src/main/java/udt/UDTReceiver.java =================================================================== --- udt-java/trunk/src/main/java/udt/UDTReceiver.java 2010-04-29 09:27:13 UTC (rev 29) +++ udt-java/trunk/src/main/java/udt/UDTReceiver.java 2010-04-29 15:26:39 UTC (rev 30) @@ -53,6 +53,7 @@ import udt.receiver.PacketPairWindow; import udt.receiver.ReceiverLossList; import udt.receiver.ReceiverLossListEntry; +import udt.util.MeanValue; import udt.util.UDTStatistics; import udt.util.UDTThreadFactory; import udt.util.Util; @@ -168,9 +169,26 @@ //incoming packets are ordered by sequence number, with control packets having //preference over data packets handoffQueue=new PriorityBlockingQueue<UDTPacket>(session.getFlowWindowSize()); + initMetrics(); start(); } + + private MeanValue dgReceiveInterval; + private MeanValue dataPacketInterval; + private MeanValue processTime; + private MeanValue dataProcessTime; + private void initMetrics(){ + dgReceiveInterval=new MeanValue("UDT receive interval"); + statistics.addMetric(dgReceiveInterval); + dataPacketInterval=new MeanValue("Data packet interval"); + statistics.addMetric(dataPacketInterval); + processTime=new MeanValue("UDT packet process time"); + statistics.addMetric(processTime); + dataProcessTime=new MeanValue("Data packet process time"); + statistics.addMetric(dataProcessTime); + } + //starts the sender algorithm private void start(){ Runnable r=new Runnable(){ @@ -197,7 +215,9 @@ * packets are written by the endpoint */ protected void receive(UDTPacket p)throws IOException{ + dgReceiveInterval.end(); handoffQueue.offer(p); + dgReceiveInterval.begin(); } /** @@ -222,7 +242,6 @@ nextEXP=currentTime+EXP_INTERVAL; processEXPEvent(); } - //perform time-bounded UDP receive UDTPacket packet=handoffQueue.poll(Util.getSYNTime(), TimeUnit.MICROSECONDS); if(packet!=null){ @@ -233,7 +252,7 @@ boolean needEXPReset=false; if(packet.isControlPacket()){ ControlPacket cp=(ControlPacket)packet; - int cpType=cp.getControlPaketType(); + int cpType=cp.getControlPacketType(); if(cpType==ControlPacketType.ACK.ordinal() || cpType==ControlPacketType.NAK.ordinal()){ needEXPReset=true; } @@ -241,7 +260,9 @@ if(needEXPReset){ nextEXP=Util.getCurrentTime()+EXP_INTERVAL; } + processTime.begin(); processUDTPacket(packet); + processTime.end(); } Thread.yield(); @@ -324,12 +345,16 @@ protected void processUDTPacket(UDTPacket p)throws IOException{ //(3).Check the packet type and process it according to this. - if(p instanceof DataPacket){ + if(!p.isControlPacket()){ DataPacket dp=(DataPacket)p; + dataPacketInterval.end(); + dataProcessTime.begin(); onDataPacketReceived(dp); + dataProcessTime.end(); + dataPacketInterval.begin(); } - else if (p instanceof Acknowledgment2){ + else if (p.getControlPacketType()==ControlPacketType.ACK2.ordinal()){ Acknowledgment2 ack2=(Acknowledgment2)p; onAck2PacketReceived(ack2); } Modified: udt-java/trunk/src/main/java/udt/UDTSender.java =================================================================== --- udt-java/trunk/src/main/java/udt/UDTSender.java 2010-04-29 09:27:13 UTC (rev 29) +++ udt-java/trunk/src/main/java/udt/UDTSender.java 2010-04-29 15:26:39 UTC (rev 30) @@ -51,6 +51,7 @@ import udt.packets.NegativeAcknowledgement; import udt.sender.SenderLossList; import udt.sender.SenderLossListEntry; +import udt.util.MeanValue; import udt.util.UDTStatistics; import udt.util.UDTThreadFactory; import udt.util.Util; @@ -117,9 +118,19 @@ lastAckSequenceNumber=session.getInitialSequenceNumber(); waitForAckLatch.set(new CountDownLatch(1)); waitForSeqAckLatch.set(new CountDownLatch(1)); + initMetrics(); doStart(); } + private MeanValue dgSendTime; + private MeanValue dgSendInterval; + private void initMetrics(){ + dgSendTime=new MeanValue("Datagram send time"); + statistics.addMetric(dgSendTime); + dgSendInterval=new MeanValue("Datagram send interval"); + statistics.addMetric(dgSendInterval); + } + /** * start the sender thread */ @@ -136,9 +147,7 @@ try{ //wait until explicitely started startLatch.await(); - while(!stopped){ - senderAlgorithm(); - } + senderAlgorithm(); }catch(InterruptedException ie){ ie.printStackTrace(); } @@ -163,7 +172,11 @@ */ private void send(DataPacket p)throws IOException{ synchronized(sendLock){ + dgSendInterval.end(); + dgSendTime.begin(); endpoint.doSend(p); + dgSendTime.end(); + dgSendInterval.begin(); sendBuffer.put(p.getPacketSequenceNumber(), p); unacknowledged.incrementAndGet(); } @@ -206,7 +219,7 @@ protected void onAcknowledge(Acknowledgement acknowledgement)throws IOException{ waitForAckLatch.get().countDown(); waitForSeqAckLatch.get().countDown(); - + CongestionControl cc=session.getCongestionControl(); long rtt=acknowledgement.getRoundTripTime(); if(rtt>0){ @@ -223,6 +236,7 @@ long ackNumber=acknowledgement.getAckNumber(); cc.onACK(ackNumber); + statistics.setCongestionWindowSize(cc.getCongestionWindowSize()); //need to remove all sequence numbers up the ack number from the sendBuffer boolean removed=false; for(long s=lastAckSequenceNumber;s<ackNumber;s++){ @@ -246,7 +260,7 @@ */ protected void onNAKPacketReceived(NegativeAcknowledgement nak){ waitForAckLatch.get().countDown(); - + for(Integer i: nak.getDecodedLossInfo()){ senderLossList.insert(new SenderLossListEntry(i)); } @@ -282,60 +296,61 @@ /** * sender algorithm */ + MeanValue v=new MeanValue("",true); public void senderAlgorithm()throws InterruptedException, IOException{ - long iterationStart=Util.getCurrentTime(); - - //if the sender's loss list is not empty - SenderLossListEntry entry=senderLossList.getFirstEntry(); - if (entry!=null) { - handleResubmit(entry); - } - - else - { - //if the number of unacknowledged data packets does not exceed the congestion - //and the flow window sizes, pack a new packet - int unAcknowledged=unacknowledged.get(); - - if(unAcknowledged<session.getCongestionControl().getCongestionWindowSize() - && unAcknowledged<session.getFlowWindowSize()){ - //check for application data - DataPacket dp=sendQueue.poll();//10*Util.getSYNTime(),TimeUnit.MICROSECONDS); - if(dp!=null){ - send(dp); - largestSentSequenceNumber=dp.getPacketSequenceNumber(); + while(!stopped){ + + long iterationStart=Util.getCurrentTime(); //last packet send time? + + //if the sender's loss list is not empty + SenderLossListEntry entry=senderLossList.getFirstEntry(); + if (entry!=null) { + v.begin(); + handleResubmit(entry); + v.end(); + } + + else + { + //if the number of unacknowledged data packets does not exceed the congestion + //and the flow window sizes, pack a new packet + int unAcknowledged=unacknowledged.get(); + + if(unAcknowledged<session.getCongestionControl().getCongestionWindowSize() + && unAcknowledged<session.getFlowWindowSize()){ + //check for application data + DataPacket dp=sendQueue.poll(); + if(dp!=null){ + send(dp); + largestSentSequenceNumber=dp.getPacketSequenceNumber(); + } + else{ + statistics.incNumberOfMissingDataEvents(); + } + }else{ + //congestion window full, should we *really* wait for an ack?! + if(unAcknowledged>=session.getCongestionControl().getCongestionWindowSize()){ + statistics.incNumberOfCCWindowExceededEvents(); + } + waitForAck(); } - else { - Thread.yield(); - return; - } - }else{ - //congestion window full, should we *really* wait for an ack?! - if(unAcknowledged>=session.getCongestionControl().getCongestionWindowSize()){ - statistics.incNumberOfCCWindowExceededEvents(); - } - Thread.sleep(1); - //waitForAck(); - return; } - } - - //wait - - double snd=session.getCongestionControl().getSendInterval(); - long passed=Util.getCurrentTime()-iterationStart; - int x=0; - while(snd-passed>0){ - if(x++==0)statistics.incNumberOfCCSlowDownEvents(); - //we cannot wait with microsecond precision - if(snd-passed>750)Thread.sleep(1); - else if((snd-passed)/snd > 0.9){ - return; + //wait + if(largestSentSequenceNumber % 16 !=0){ + double snd=100;//session.getCongestionControl().getSendInterval(); + long passed=Util.getCurrentTime()-iterationStart; + int x=0; + while(snd-passed>0){ + //can't wait with microsecond precision :( + if(x==0){ + statistics.incNumberOfCCSlowDownEvents(); + x++; + } + passed=Util.getCurrentTime()-iterationStart; + } } - passed=Util.getCurrentTime()-iterationStart; } - } /** @@ -361,7 +376,7 @@ logger.log(Level.WARNING,"",e); } } - + /** * for processing EXP event (see spec. p 13) */ Modified: udt-java/trunk/src/main/java/udt/UDTSession.java =================================================================== --- udt-java/trunk/src/main/java/udt/UDTSession.java 2010-04-29 09:27:13 UTC (rev 29) +++ udt-java/trunk/src/main/java/udt/UDTSession.java 2010-04-29 15:26:39 UTC (rev 30) @@ -72,7 +72,7 @@ * flow window size, i.e. how many data packets are * in-flight at a single time */ - protected int flowWindowSize=64; + protected int flowWindowSize=128; /** * remote UDT entity (address and socket ID) Modified: udt-java/trunk/src/main/java/udt/packets/Acknowledgement.java =================================================================== --- udt-java/trunk/src/main/java/udt/packets/Acknowledgement.java 2010-04-29 09:27:13 UTC (rev 29) +++ udt-java/trunk/src/main/java/udt/packets/Acknowledgement.java 2010-04-29 15:26:39 UTC (rev 30) @@ -33,6 +33,7 @@ package udt.packets; import java.io.ByteArrayOutputStream; +import udt.UDTPacket; import udt.UDTReceiver; import udt.UDTSender; @@ -57,14 +58,14 @@ private long estimatedLinkCapacity; public Acknowledgement(){ - this.contrlPktTyp=ControlPacketType.ACK.ordinal(); + this.controlPacketType=ControlPacketType.ACK.ordinal(); } public Acknowledgement(byte[] controlInformation){ this(); decodeControlInformation(controlInformation); } - + void decodeControlInformation(byte[] data){ ackNumber=PacketUtil.decode(data, 0); roundTripTime =PacketUtil.decode(data, 4); Modified: udt-java/trunk/src/main/java/udt/packets/Acknowledgment2.java =================================================================== --- udt-java/trunk/src/main/java/udt/packets/Acknowledgment2.java 2010-04-29 09:27:13 UTC (rev 29) +++ udt-java/trunk/src/main/java/udt/packets/Acknowledgment2.java 2010-04-29 15:26:39 UTC (rev 30) @@ -40,7 +40,7 @@ public class Acknowledgment2 extends ControlPacket{ public Acknowledgment2(){ - this.contrlPktTyp=ControlPacketType.ACK2.ordinal(); + this.controlPacketType=ControlPacketType.ACK2.ordinal(); } public Acknowledgment2(byte[]controlInformation){ Modified: udt-java/trunk/src/main/java/udt/packets/ConnectionHandshake.java =================================================================== --- udt-java/trunk/src/main/java/udt/packets/ConnectionHandshake.java 2010-04-29 09:27:13 UTC (rev 29) +++ udt-java/trunk/src/main/java/udt/packets/ConnectionHandshake.java 2010-04-29 15:26:39 UTC (rev 30) @@ -52,14 +52,13 @@ private long socketID; public ConnectionHandshake(){ - this.contrlPktTyp=ControlPacketType.CONNECTION_HANDSHAKE.ordinal(); + this.controlPacketType=ControlPacketType.CONNECTION_HANDSHAKE.ordinal(); } public ConnectionHandshake(byte[]controlInformation){ this(); //this.controlInformation=controlInformation; - decode(controlInformation ); - + decode(controlInformation); } //faster than instanceof... Modified: udt-java/trunk/src/main/java/udt/packets/ControlPacket.java =================================================================== --- udt-java/trunk/src/main/java/udt/packets/ControlPacket.java 2010-04-29 09:27:13 UTC (rev 29) +++ udt-java/trunk/src/main/java/udt/packets/ControlPacket.java 2010-04-29 15:26:39 UTC (rev 30) @@ -40,7 +40,7 @@ public abstract class ControlPacket implements UDTPacket{ - protected int contrlPktTyp; + protected int controlPacketType; //used for ACK and ACK2 protected long ackSequenceNumber; @@ -58,18 +58,11 @@ public ControlPacket(){ } - - - public int getControlPaketType() { - return contrlPktTyp; - } - - public void setControlPaketType(int packetTyp) { - this.contrlPktTyp = packetTyp; + public int getControlPacketType(){ + return controlPacketType; } - - + public long getAckSequenceNumber() { return ackSequenceNumber; } @@ -112,7 +105,7 @@ // //sequence number with highest bit set to "0" try{ ByteArrayOutputStream bos=new ByteArrayOutputStream(16); - bos.write(PacketUtil.encodeHighesBitTypeAndSeqNumber(true, contrlPktTyp, ackSequenceNumber)); + bos.write(PacketUtil.encodeHighesBitTypeAndSeqNumber(true, controlPacketType, ackSequenceNumber)); bos.write(PacketUtil.encode(messageNumber)); bos.write(PacketUtil.encode(timeStamp)); bos.write(PacketUtil.encode(destinationID)); @@ -158,7 +151,7 @@ ControlPacket other = (ControlPacket) obj; if (ackSequenceNumber != other.ackSequenceNumber) return false; - if (contrlPktTyp != other.contrlPktTyp) + if (controlPacketType != other.controlPacketType) return false; //if (!Arrays.equals(controlInformation, other.controlInformation)) // return false; Modified: udt-java/trunk/src/main/java/udt/packets/DataPacket.java =================================================================== --- udt-java/trunk/src/main/java/udt/packets/DataPacket.java 2010-04-29 09:27:13 UTC (rev 29) +++ udt-java/trunk/src/main/java/udt/packets/DataPacket.java 2010-04-29 15:26:39 UTC (rev 30) @@ -170,6 +170,10 @@ return false; } + public int getControlPacketType(){ + return -1; + } + public UDTSession getSession() { return session; } Modified: udt-java/trunk/src/main/java/udt/packets/KeepAlive.java =================================================================== --- udt-java/trunk/src/main/java/udt/packets/KeepAlive.java 2010-04-29 09:27:13 UTC (rev 29) +++ udt-java/trunk/src/main/java/udt/packets/KeepAlive.java 2010-04-29 15:26:39 UTC (rev 30) @@ -32,11 +32,10 @@ package udt.packets; - public class KeepAlive extends ControlPacket{ public KeepAlive(){ - this.contrlPktTyp=ControlPacketType.KEEP_ALIVE.ordinal(); + this.controlPacketType=ControlPacketType.KEEP_ALIVE.ordinal(); } @Override Modified: udt-java/trunk/src/main/java/udt/packets/MessageDropRequest.java =================================================================== --- udt-java/trunk/src/main/java/udt/packets/MessageDropRequest.java 2010-04-29 09:27:13 UTC (rev 29) +++ udt-java/trunk/src/main/java/udt/packets/MessageDropRequest.java 2010-04-29 15:26:39 UTC (rev 30) @@ -41,7 +41,7 @@ private long msgLastSeqNo; public MessageDropRequest(){ - this.contrlPktTyp=ControlPacketType.MESSAGE_DROP_REQUEST.ordinal(); + this.controlPacketType=ControlPacketType.MESSAGE_DROP_REQUEST.ordinal(); } public MessageDropRequest(byte[]controlInformation){ @@ -49,6 +49,7 @@ //this.controlInformation=controlInformation; decode(controlInformation ); } + void decode(byte[]data){ msgFirstSeqNo =PacketUtil.decode(data, 0); msgLastSeqNo =PacketUtil.decode(data, 4); Modified: udt-java/trunk/src/main/java/udt/packets/NegativeAcknowledgement.java =================================================================== --- udt-java/trunk/src/main/java/udt/packets/NegativeAcknowledgement.java 2010-04-29 09:27:13 UTC (rev 29) +++ udt-java/trunk/src/main/java/udt/packets/NegativeAcknowledgement.java 2010-04-29 15:26:39 UTC (rev 30) @@ -37,6 +37,8 @@ import java.util.ArrayList; import java.util.List; +import udt.packets.ControlPacket.ControlPacketType; + /** * NAK carries information about lost packets * @@ -51,14 +53,14 @@ ByteArrayOutputStream lossInfo=new ByteArrayOutputStream(); public NegativeAcknowledgement(){ - this.contrlPktTyp=ControlPacketType.NAK.ordinal(); + this.controlPacketType=ControlPacketType.NAK.ordinal(); } public NegativeAcknowledgement(byte[]controlInformation){ this(); lostSequenceNumbers=decode(controlInformation); } - + /** * decode the loss info * @param lossInfo Modified: udt-java/trunk/src/main/java/udt/packets/PacketFactory.java =================================================================== --- udt-java/trunk/src/main/java/udt/packets/PacketFactory.java 2010-04-29 09:27:13 UTC (rev 29) +++ udt-java/trunk/src/main/java/udt/packets/PacketFactory.java 2010-04-29 15:26:39 UTC (rev 30) @@ -105,7 +105,6 @@ } if(packet!=null){ - packet.setControlPaketType(pktType); packet.setAckSequenceNumber(ackSeqNo); packet.setMessageNumber(msgNr); packet.setTimeStamp(timeStamp); Modified: udt-java/trunk/src/main/java/udt/packets/Shutdown.java =================================================================== --- udt-java/trunk/src/main/java/udt/packets/Shutdown.java 2010-04-29 09:27:13 UTC (rev 29) +++ udt-java/trunk/src/main/java/udt/packets/Shutdown.java 2010-04-29 15:26:39 UTC (rev 30) @@ -34,10 +34,11 @@ package udt.packets; + public class Shutdown extends ControlPacket{ public Shutdown(){ - this.contrlPktTyp=ControlPacketType.SHUTDOWN.ordinal(); + this.controlPacketType=ControlPacketType.SHUTDOWN.ordinal(); } @Override Modified: udt-java/trunk/src/main/java/udt/packets/UserDefined.java =================================================================== --- udt-java/trunk/src/main/java/udt/packets/UserDefined.java 2010-04-29 09:27:13 UTC (rev 29) +++ udt-java/trunk/src/main/java/udt/packets/UserDefined.java 2010-04-29 15:26:39 UTC (rev 30) @@ -35,6 +35,10 @@ public class UserDefined extends ControlPacket{ + public UserDefined(){ + controlPacketType=ControlPacketType.USER_DEFINED.ordinal(); + } + //Explained by bits 4-15, //reserved for user defined Control Packet public UserDefined(byte[]controlInformation){ Modified: udt-java/trunk/src/main/java/udt/util/MeanValue.java =================================================================== --- udt-java/trunk/src/main/java/udt/util/MeanValue.java 2010-04-29 09:27:13 UTC (rev 29) +++ udt-java/trunk/src/main/java/udt/util/MeanValue.java 2010-04-29 15:26:39 UTC (rev 30) @@ -20,19 +20,22 @@ private String msg; - public MeanValue(){ - this(false, 64); + private final String name; + + public MeanValue(String name){ + this(name, false, 64); } - public MeanValue(boolean verbose){ - this(verbose, 64); + public MeanValue(String name, boolean verbose){ + this(name, verbose, 64); } - public MeanValue(boolean verbose, int nValue){ + public MeanValue(String name, boolean verbose, int nValue){ format=NumberFormat.getNumberInstance(); format.setMaximumFractionDigits(2); this.verbose=verbose; this.nValue=nValue; + this.name=name; begin(); } @@ -69,4 +72,8 @@ this.msg=msg; addValue(Util.getCurrentTime()-start); } + + public String getName(){ + return name; + } } Modified: udt-java/trunk/src/main/java/udt/util/ReceiveFile.java =================================================================== --- udt-java/trunk/src/main/java/udt/util/ReceiveFile.java 2010-04-29 09:27:13 UTC (rev 29) +++ udt-java/trunk/src/main/java/udt/util/ReceiveFile.java 2010-04-29 15:26:39 UTC (rev 30) @@ -36,6 +36,7 @@ import java.io.FileOutputStream; import java.net.InetAddress; import java.nio.ByteBuffer; +import java.text.NumberFormat; import udt.UDTClient; import udt.UDTInputStream; @@ -56,12 +57,15 @@ private final String serverHost; private final String remoteFile; private final String localFile; + private final NumberFormat format; public ReceiveFile(String serverHost, int serverPort, String remoteFile, String localFile){ this.serverHost=serverHost; this.serverPort=serverPort; this.remoteFile=remoteFile; this.localFile=localFile; + format=NumberFormat.getNumberInstance(); + format.setMaximumFractionDigits(3); } public void run(){ @@ -102,10 +106,9 @@ //and read the file data Util.copy(in, fos, size, false); long end = System.currentTimeMillis(); - long mb=size/(1024*1024); - double mbytes=1000*mb/(end-start); - double mbit=8*mbytes; - System.out.println("[ReceiveFile] Rate: "+(int)mbytes+" MBytes/sec. "+(int)mbit+" MBit/sec."); + double rate=1000.0*size/1024/1024/(end-start); + System.out.println("[ReceiveFile] Rate: "+format.format(rate)+" MBytes/sec. " + +format.format(8*rate)+" MBit/sec."); client.shutdown(); Modified: udt-java/trunk/src/main/java/udt/util/UDTStatistics.java =================================================================== --- udt-java/trunk/src/main/java/udt/util/UDTStatistics.java 2010-04-29 09:27:13 UTC (rev 29) +++ udt-java/trunk/src/main/java/udt/util/UDTStatistics.java 2010-04-29 15:26:39 UTC (rev 30) @@ -38,6 +38,7 @@ import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; import java.util.ArrayList; +import java.util.Collections; import java.util.List; import java.util.concurrent.atomic.AtomicInteger; @@ -50,6 +51,7 @@ private final AtomicInteger numberOfSentDataPackets=new AtomicInteger(0); private final AtomicInteger numberOfReceivedDataPackets=new AtomicInteger(0); private final AtomicInteger numberOfDuplicateDataPackets=new AtomicInteger(0); + private final AtomicInteger numberOfMissingDataEvents=new AtomicInteger(0); private final AtomicInteger numberOfNAKSent=new AtomicInteger(0); private final AtomicInteger numberOfNAKReceived=new AtomicInteger(0); private final AtomicInteger numberOfRetransmittedDataPackets=new AtomicInteger(0); @@ -65,9 +67,12 @@ private volatile long packetArrivalRate; private volatile long estimatedLinkCapacity; private volatile double sendPeriod; + private volatile long congestionWindowSize; private MessageDigest digest; - + + private final List<MeanValue>metrics=new ArrayList<MeanValue>(); + public UDTStatistics(String componentDescription){ this.componentDescription=componentDescription; try{ @@ -110,6 +115,9 @@ public void incNumberOfDuplicateDataPackets() { numberOfDuplicateDataPackets.incrementAndGet(); } + public void incNumberOfMissingDataEvents() { + numberOfMissingDataEvents.incrementAndGet(); + } public void incNumberOfNAKSent() { numberOfNAKSent.incrementAndGet(); } @@ -154,6 +162,14 @@ return sendPeriod; } + public long getCongestionWindowSize() { + return congestionWindowSize; + } + + public void setCongestionWindowSize(long congestionWindowSize) { + this.congestionWindowSize = congestionWindowSize; + } + public void updateReadDataMD5(byte[]data){ digest.update(data); } @@ -166,6 +182,22 @@ return packetArrivalRate; } + /** + * add a metric + * @param m - the metric to add + */ + public void addMetric(MeanValue m){ + metrics.add(m); + } + + /** + * get a read-only list containing all metrics + * @return + */ + public List<MeanValue>getMetrics(){ + return Collections.unmodifiableList(metrics); + } + public String toString(){ StringBuilder sb=new StringBuilder(); sb.append("Statistics for ").append(componentDescription).append("\n"); @@ -183,12 +215,20 @@ if(packetArrivalRate>0){ sb.append("Packet rate: ").append(packetArrivalRate).append("/sec., link capacity: ").append(estimatedLinkCapacity).append("/sec.\n"); } + if(numberOfMissingDataEvents.get()>0){ + sb.append("Sender without data events: ").append(numberOfMissingDataEvents.get()).append("\n"); + } if(numberOfCCSlowDownEvents.get()>0){ sb.append("CC rate slowdown events: ").append(numberOfCCSlowDownEvents.get()).append("\n"); } if(numberOfCCWindowExceededEvents.get()>0){ sb.append("CC window slowdown events: ").append(numberOfCCWindowExceededEvents.get()).append("\n"); } + sb.append("CC parameter SND: ").append((int)sendPeriod).append("\n"); + sb.append("CC parameter CWND: ").append(congestionWindowSize).append("\n"); + for(MeanValue v: metrics){ + sb.append(v.getName()).append(": ").append(v.getFormattedMean()).append("\n"); + } return sb.toString(); } Modified: udt-java/trunk/src/test/java/udt/performance/TestUDTLargeData.java =================================================================== --- udt-java/trunk/src/test/java/udt/performance/TestUDTLargeData.java 2010-04-29 09:27:13 UTC (rev 29) +++ udt-java/trunk/src/test/java/udt/performance/TestUDTLargeData.java 2010-04-29 15:26:39 UTC (rev 30) @@ -14,14 +14,13 @@ import udt.UDTServerSocket; import udt.UDTSocket; import udt.UDTTestBase; -import udt.util.UDTStatistics; public class TestUDTLargeData extends UDTTestBase{ boolean running=false; //how many - int num_packets=50; + int num_packets=20; //how large is a single packet int size=1*1024*1024; @@ -89,7 +88,7 @@ System.out.println("MD5 hash of data received: "+md5_received); System.out.println(client.getStatistics()); - assertEquals(md5_sent,md5_received); + //assertEquals(md5_sent,md5_received); //store stat history to csv file client.getStatistics().writeParameterHistory(File.createTempFile("/udtstats-",".csv")); @@ -102,7 +101,6 @@ volatile String md5_received=null; private void runServer()throws Exception{ - final MessageDigest md5=MessageDigest.getInstance("MD5"); final UDTServerSocket serverSocket=new UDTServerSocket(InetAddress.getByName("localhost"),65321); @@ -120,13 +118,12 @@ c=is.read(buf); if(c<0)break; else{ - md5.update(buf, 0, c); total+=c; } } System.out.println("Server thread exiting, last received bytes: "+c); serverRunning=false; - md5_received=UDTStatistics.hexString(md5); + md5_received=s.getSession().getStatistics().getDigest(); serverSocket.shutDown(); System.out.println(s.getSession().getStatistics()); } Modified: udt-java/trunk/src/test/java/udt/performance/UDPTest.java =================================================================== --- udt-java/trunk/src/test/java/udt/performance/UDPTest.java 2010-04-29 09:27:13 UTC (rev 29) +++ udt-java/trunk/src/test/java/udt/performance/UDPTest.java 2010-04-29 15:26:39 UTC (rev 30) @@ -4,6 +4,8 @@ import java.net.DatagramSocket; import java.net.InetAddress; import java.util.Random; +import java.util.concurrent.BlockingQueue; +import java.util.concurrent.SynchronousQueue; import junit.framework.TestCase; import udt.UDPEndPoint; @@ -19,9 +21,9 @@ public void test1()throws Exception{ runServer(); + runThirdThread(); //client socket DatagramSocket s=new DatagramSocket(12345); - //generate a test array with random content N=num_packets*packetSize; byte[]data=new byte[packetSize]; @@ -31,12 +33,15 @@ dp.setAddress(InetAddress.getByName("localhost")); dp.setPort(65321); System.out.println("Sending "+num_packets+" data blocks of <"+packetSize+"> bytes"); - MeanValue v=new MeanValue(); + MeanValue v=new MeanValue("Datagram send time",false); + MeanValue v2=new MeanValue("Datagram send interval",false); for(int i=0;i<num_packets;i++){ dp.setData(data); + v2.end(); v.begin(); s.send(dp); v.end(); + v2.begin(); } System.out.println("Finished sending."); while(serverRunning)Thread.sleep(10); @@ -46,6 +51,7 @@ System.out.println("Rate "+N/1000/(end-start)+" Mbytes/sec"); System.out.println("Rate "+num_packets+" packets/sec"); System.out.println("Mean send time "+v.getFormattedMean()+" microsec"); + System.out.println("Mean send interval "+v2.getFormattedMean()+" microsec"); System.out.println("Server received: "+total); } @@ -62,9 +68,30 @@ try{ byte[]buf=new byte[packetSize]; DatagramPacket dp=new DatagramPacket(buf,buf.length); + while(true){ + serverSocket.receive(dp); + handoff.offer(dp); + } + } + catch(Exception e){ + e.printStackTrace(); + } + serverRunning=false; + } + }; + Thread t=new Thread(serverProcess); + t.start(); + } + + private final BlockingQueue<DatagramPacket> handoff=new SynchronousQueue<DatagramPacket>(); + + private void runThirdThread()throws Exception{ + Runnable serverProcess=new Runnable(){ + public void run(){ + try{ long start=System.currentTimeMillis(); while(true){ - serverSocket.receive(dp); + DatagramPacket dp=handoff.poll(); total+=dp.getLength(); if(total==N)break; } @@ -80,5 +107,7 @@ }; Thread t=new Thread(serverProcess); t.start(); + } + } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <bsc...@us...> - 2010-04-29 09:27:20
|
Revision: 29 http://udt-java.svn.sourceforge.net/udt-java/?rev=29&view=rev Author: bschuller Date: 2010-04-29 09:27:13 +0000 (Thu, 29 Apr 2010) Log Message: ----------- fix concurrent modification exception Modified Paths: -------------- udt-java/trunk/src/main/java/udt/util/UDTStatistics.java Modified: udt-java/trunk/src/main/java/udt/util/UDTStatistics.java =================================================================== --- udt-java/trunk/src/main/java/udt/util/UDTStatistics.java 2010-04-28 14:51:57 UTC (rev 28) +++ udt-java/trunk/src/main/java/udt/util/UDTStatistics.java 2010-04-29 09:27:13 UTC (rev 29) @@ -199,13 +199,15 @@ * take a snapshot of relevant parameters for later storing to * file using {@link #writeParameterHistory(File)} */ - public synchronized void storeParameters(){ - if(first){ - first=false; - statsHistory.add(new StatisticsHistoryEntry(true,0,"time","packetRate","sendPeriod")); - initialTime=System.currentTimeMillis(); + public void storeParameters(){ + synchronized (statsHistory) { + if(first){ + first=false; + statsHistory.add(new StatisticsHistoryEntry(true,0,"time","packetRate","sendPeriod")); + initialTime=System.currentTimeMillis(); + } + statsHistory.add(new StatisticsHistoryEntry(false,System.currentTimeMillis()-initialTime,packetArrivalRate,sendPeriod)); } - statsHistory.add(new StatisticsHistoryEntry(false,System.currentTimeMillis()-initialTime,packetArrivalRate,sendPeriod)); } /** @@ -215,9 +217,11 @@ public void writeParameterHistory(File toFile)throws IOException{ FileWriter fos=new FileWriter(toFile); try{ - for(StatisticsHistoryEntry s: statsHistory){ - fos.write(s.toString()); - fos.write('\n'); + synchronized (statsHistory) { + for(StatisticsHistoryEntry s: statsHistory){ + fos.write(s.toString()); + fos.write('\n'); + } } }finally{ fos.close(); @@ -234,5 +238,5 @@ } return hexString.toString(); } - + } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <bsc...@us...> - 2010-04-28 14:52:04
|
Revision: 28 http://udt-java.svn.sourceforge.net/udt-java/?rev=28&view=rev Author: bschuller Date: 2010-04-28 14:51:57 +0000 (Wed, 28 Apr 2010) Log Message: ----------- some cleanup Modified Paths: -------------- udt-java/trunk/pom.xml udt-java/trunk/src/main/java/udt/UDPEndPoint.java udt-java/trunk/src/main/java/udt/UDTCongestionControl.java udt-java/trunk/src/main/java/udt/UDTInputStream.java udt-java/trunk/src/main/java/udt/UDTReceiver.java udt-java/trunk/src/main/java/udt/UDTSender.java udt-java/trunk/src/main/java/udt/UDTSession.java udt-java/trunk/src/main/java/udt/UDTSocket.java udt-java/trunk/src/main/java/udt/packets/Destination.java udt-java/trunk/src/main/java/udt/receiver/PacketHistoryWindow.java udt-java/trunk/src/main/java/udt/sender/SenderLossList.java udt-java/trunk/src/main/java/udt/sender/SenderLossListEntry.java udt-java/trunk/src/main/java/udt/util/MeanValue.java udt-java/trunk/src/main/java/udt/util/ReceiveFile.java udt-java/trunk/src/main/java/udt/util/SendFile.java udt-java/trunk/src/main/java/udt/util/Util.java udt-java/trunk/src/test/java/udt/TestList.java udt-java/trunk/src/test/java/udt/TestSendFileReceiveFile.java udt-java/trunk/src/test/java/udt/TestUDTServerSocket.java udt-java/trunk/src/test/java/udt/performance/TestUDTLargeData.java udt-java/trunk/src/test/java/udt/performance/UDPTest.java Removed Paths: ------------- udt-java/trunk/src/main/java/udt/util/FlowWindow.java Modified: udt-java/trunk/pom.xml =================================================================== --- udt-java/trunk/pom.xml 2010-04-26 06:36:47 UTC (rev 27) +++ udt-java/trunk/pom.xml 2010-04-28 14:51:57 UTC (rev 28) @@ -5,7 +5,7 @@ <artifactId>udt-java</artifactId> <packaging>jar</packaging> <name>UDT Java implementation</name> - <version>0.2-SNAPSHOT</version> + <version>0.4-SNAPSHOT</version> <url>http://sourceforge.net/projects/udt-java</url> <developers> <developer> Modified: udt-java/trunk/src/main/java/udt/UDPEndPoint.java =================================================================== --- udt-java/trunk/src/main/java/udt/UDPEndPoint.java 2010-04-26 06:36:47 UTC (rev 27) +++ udt-java/trunk/src/main/java/udt/UDPEndPoint.java 2010-04-28 14:51:57 UTC (rev 28) @@ -50,6 +50,7 @@ import udt.packets.ConnectionHandshake; import udt.packets.Destination; import udt.packets.PacketFactory; +import udt.util.MeanValue; import udt.util.UDTThreadFactory; /** @@ -82,7 +83,7 @@ private volatile boolean stopped=false; public static final int DATAGRAM_SIZE=1500; - + /** * bind to any local port on the given host address * @param localAddress @@ -113,6 +114,8 @@ sessionHandoff=new SynchronousQueue<UDTSession>(); //set a time out to avoid blocking in doReceive() dgSocket.setSoTimeout(1000); + //buffer size + dgSocket.setReceiveBufferSize(512*1024); } /** @@ -237,6 +240,7 @@ */ private long lastDestID=-1; private UDTSession lastSession; + MeanValue v=new MeanValue(true,64); protected void doReceive()throws IOException{ try{ try{ @@ -294,12 +298,11 @@ logger.log(Level.WARNING, "Got: "+ex.getMessage(),ex); } } - + protected void doSend(UDTPacket packet)throws IOException{ byte[]data=packet.getEncoded(); - Destination dest=packet.getSession().getDestination(); - DatagramPacket dgp = new DatagramPacket(data, data.length, - dest.getAddress() , dest.getPort()); + DatagramPacket dgp = packet.getSession().getDatagram(); + dgp.setData(data); dgSocket.send(dgp); } Modified: udt-java/trunk/src/main/java/udt/UDTCongestionControl.java =================================================================== --- udt-java/trunk/src/main/java/udt/UDTCongestionControl.java 2010-04-26 06:36:47 UTC (rev 27) +++ udt-java/trunk/src/main/java/udt/UDTCongestionControl.java 2010-04-28 14:51:57 UTC (rev 28) @@ -30,7 +30,7 @@ private long estimatedLinkCapacity=0; // Packet sending period = packet send interval, in microseconds - private double packetSendingPeriod=1; + private double packetSendingPeriod=0; // Congestion window size, in packets private long congestionWindowSize=16; @@ -228,7 +228,10 @@ // c. Record the current largest sent sequence number (LastDecSeq). lastDecreaseSeqNo= currentMaxSequenceNumber; } - + + //enforce upper limit on send period... + //packetSendingPeriod=Math.min(packetSendingPeriod, 2*roundTripTime); + statistics.setSendPeriod(packetSendingPeriod); return; } Modified: udt-java/trunk/src/main/java/udt/UDTInputStream.java =================================================================== --- udt-java/trunk/src/main/java/udt/UDTInputStream.java 2010-04-26 06:36:47 UTC (rev 27) +++ udt-java/trunk/src/main/java/udt/UDTInputStream.java 2010-04-28 14:51:57 UTC (rev 28) @@ -34,10 +34,10 @@ import java.io.IOException; import java.io.InputStream; +import java.util.concurrent.PriorityBlockingQueue; import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicBoolean; -import udt.util.FlowWindow; import udt.util.UDTStatistics; /** @@ -54,7 +54,7 @@ //inbound application data, in-order, and ready for reading //by the application - private final FlowWindow<AppData>appData; + private final PriorityBlockingQueue<AppData>appData; private final UDTStatistics statistics; @@ -78,13 +78,9 @@ public UDTInputStream(UDTSocket socket, UDTStatistics statistics)throws IOException{ this.socket=socket; this.statistics=statistics; - appData=new FlowWindow<AppData>(getFlowWindowSize()); + appData=new PriorityBlockingQueue<AppData>(128); } - private int getFlowWindowSize(){ - if(socket!=null)return 2*socket.getSession().getFlowWindowSize(); - else return 128; - } /** * create a new {@link UDTInputStream} connected to the given socket * @param socket - the {@link UDTSocket} @@ -172,6 +168,7 @@ } } else currentChunk=appData.poll(10, TimeUnit.MILLISECONDS); + }catch(InterruptedException ie){ IOException ex=new IOException(); ex.initCause(ie); Modified: udt-java/trunk/src/main/java/udt/UDTReceiver.java =================================================================== --- udt-java/trunk/src/main/java/udt/UDTReceiver.java 2010-04-26 06:36:47 UTC (rev 27) +++ udt-java/trunk/src/main/java/udt/UDTReceiver.java 2010-04-28 14:51:57 UTC (rev 28) @@ -167,9 +167,7 @@ //incoming packets are ordered by sequence number, with control packets having //preference over data packets - handoffQueue=//new ArrayBlockingQueue<UDTPacket>(session.getFlowWindowSize()); - new PriorityBlockingQueue<UDTPacket>(session.getFlowWindowSize()); - + handoffQueue=new PriorityBlockingQueue<UDTPacket>(session.getFlowWindowSize()); start(); } @@ -198,8 +196,6 @@ /* * packets are written by the endpoint */ - long i=0; - long mean=0; protected void receive(UDTPacket p)throws IOException{ handoffQueue.offer(p); } @@ -247,6 +243,7 @@ } processUDTPacket(packet); } + Thread.yield(); } @@ -326,6 +323,7 @@ protected void processUDTPacket(UDTPacket p)throws IOException{ //(3).Check the packet type and process it according to this. + if(p instanceof DataPacket){ DataPacket dp=(DataPacket)p; onDataPacketReceived(dp); @@ -340,8 +338,6 @@ onShutdown(); } - //other packet types? - } //every nth packet will be discarded... for testing only of course @@ -375,11 +371,8 @@ //store current time lastDataPacketArrivalTime=currentDataPacketArrivalTime; - if(!session.getSocket().getInputStream().haveNewData(currentSequenceNumber,dp.getData())){ - //no left space in application data buffer->drop this packet - return; - } - + session.getSocket().getInputStream().haveNewData(currentSequenceNumber,dp.getData()); + //(6).number of detected lossed packet /*(6.a).if the number of the current data packet is greater than LSRN+1, put all the sequence numbers between (but excluding) these two values @@ -387,13 +380,11 @@ if(currentSequenceNumber>largestReceivedSeqNumber+1){ sendNAK(currentSequenceNumber); } - else{ - if(currentSequenceNumber<largestReceivedSeqNumber){ + else if(currentSequenceNumber<largestReceivedSeqNumber){ /*(6.b).if the sequence number is less than LRSN,remove it from * the receiver's loss list */ receiverLossList.remove(currentSequenceNumber); - } } statistics.incNumberOfReceivedDataPackets(); @@ -422,6 +413,7 @@ receiverLossList.insert(detectedLossSeqNumber); } endpoint.doSend(nAckPacket); + statistics.incNumberOfNAKSent(); } protected void sendNAK(List<Long>sequenceNumbers)throws IOException{ @@ -447,7 +439,7 @@ estimateLinkCapacity=packetPairWindow.getEstimatedLinkCapacity(); acknowledgmentPkt.setEstimatedLinkCapacity(estimateLinkCapacity); //set the packet arrival rate - packetArrivalSpeed=(long)packetHistoryWindow.getPacketArrivalSpeed(); + packetArrivalSpeed=packetHistoryWindow.getPacketArrivalSpeed(); acknowledgmentPkt.setPacketReceiveRate(packetArrivalSpeed); endpoint.doSend(acknowledgmentPkt); Modified: udt-java/trunk/src/main/java/udt/UDTSender.java =================================================================== --- udt-java/trunk/src/main/java/udt/UDTSender.java 2010-04-26 06:36:47 UTC (rev 27) +++ udt-java/trunk/src/main/java/udt/UDTSender.java 2010-04-28 14:51:57 UTC (rev 28) @@ -96,36 +96,46 @@ //last acknowledge number, initialised to the initial sequence number private long lastAckSequenceNumber; - //size of the send queue - public final int sendQueueLength; + private volatile boolean started=false; private volatile boolean stopped=false; - private volatile AtomicReference<CountDownLatch> waitForAckLatch=new AtomicReference<CountDownLatch>(); + private final CountDownLatch startLatch=new CountDownLatch(1); - private volatile AtomicReference<CountDownLatch> waitForSeqAckLatch=new AtomicReference<CountDownLatch>(); + private final AtomicReference<CountDownLatch> waitForAckLatch=new AtomicReference<CountDownLatch>(); + private final AtomicReference<CountDownLatch> waitForSeqAckLatch=new AtomicReference<CountDownLatch>(); + public UDTSender(UDTSession session,UDPEndPoint endpoint){ if(!session.isReady())throw new IllegalStateException("UDTSession is not ready."); this.endpoint= endpoint; this.session=session; - statistics=session.getStatistics(); - sendQueueLength=64;//session.getFlowWindowSize(); senderLossList=new SenderLossList(); - sendBuffer=new ConcurrentHashMap<Long, DataPacket>(sendQueueLength,0.75f,2); - sendQueue = new LinkedBlockingQueue<DataPacket>(sendQueueLength); + sendBuffer=new ConcurrentHashMap<Long, DataPacket>(session.getFlowWindowSize(),0.75f,2); + sendQueue = new LinkedBlockingQueue<DataPacket>(1000); lastAckSequenceNumber=session.getInitialSequenceNumber(); waitForAckLatch.set(new CountDownLatch(1)); waitForSeqAckLatch.set(new CountDownLatch(1)); - start(); + doStart(); } + /** + * start the sender thread + */ + public void start(){ + logger.info("Starting sender for "+session); + startLatch.countDown(); + started=true; + } + //starts the sender algorithm - private void start(){ + private void doStart(){ Runnable r=new Runnable(){ public void run(){ try{ + //wait until explicitely started + startLatch.await(); while(!stopped){ senderAlgorithm(); } @@ -150,7 +160,7 @@ * @param data * @throws IOException * @throws InterruptedException - */ + */ private void send(DataPacket p)throws IOException{ synchronized(sendLock){ endpoint.doSend(p); @@ -161,15 +171,6 @@ } /** - * writes a data packet into the sendQueue - * @return <code>true</code>if the packet was added, <code>false</code> if the - * packet could not be added because the queue was full - */ - protected boolean sendUdtPacket(DataPacket p)throws IOException{ - return sendQueue.offer(p); - } - - /** * writes a data packet into the sendQueue, waiting at most for the specified time * if this is not possible due to a full send queue * @@ -183,6 +184,7 @@ * @throws InterruptedException */ protected boolean sendUdtPacket(DataPacket p, int timeout, TimeUnit units)throws IOException,InterruptedException{ + if(!started)start(); return sendQueue.offer(p,timeout,units); } @@ -244,7 +246,7 @@ */ protected void onNAKPacketReceived(NegativeAcknowledgement nak){ waitForAckLatch.get().countDown(); - + for(Integer i: nak.getDecodedLossInfo()){ senderLossList.insert(new SenderLossListEntry(i)); } @@ -252,12 +254,12 @@ session.getSocket().getReceiver().resetEXPTimer(); statistics.incNumberOfNAKReceived(); statistics.storeParameters(); - + if(logger.isLoggable(Level.FINER)){ logger.finer("NAK for "+nak.getDecodedLossInfo().size()+" packets lost, " - +"set send period to "+session.getCongestionControl().getSendInterval()); + +"set send period to "+session.getCongestionControl().getSendInterval()); } - + return; } @@ -282,56 +284,45 @@ */ public void senderAlgorithm()throws InterruptedException, IOException{ long iterationStart=Util.getCurrentTime(); + //if the sender's loss list is not empty SenderLossListEntry entry=senderLossList.getFirstEntry(); if (entry!=null) { - long seqNumber = entry.getSequenceNumber(); - //TODO - //if the current seqNumber is 16n,check the timeOut in the - //loss list and send a message drop request. - //if((seqNumber%16)==0){ - //sendLossList.checkTimeOut(timeToLive); - //} - try { - //retransmit the packet with the first entry in the list - //as sequence number and remove it from the list - DataPacket pktToRetransmit = sendBuffer.get(seqNumber); - if(pktToRetransmit!=null){ - endpoint.doSend(pktToRetransmit); - statistics.incNumberOfRetransmittedDataPackets(); - } - }catch (Exception e) { - logger.log(Level.WARNING,"",e); - } - // return; + handleResubmit(entry); } - - //if the number of unacknowledged data packets does not exceed the congestion - //and the flow window sizes, pack a new packet - int unAcknowledged=unacknowledged.get(); - if(unAcknowledged<session.getCongestionControl().getCongestionWindowSize() - && unAcknowledged<session.getFlowWindowSize()){ - - if(sendQueue.size()==0){ - //Thread.yield(); + else + { + //if the number of unacknowledged data packets does not exceed the congestion + //and the flow window sizes, pack a new packet + int unAcknowledged=unacknowledged.get(); + + if(unAcknowledged<session.getCongestionControl().getCongestionWindowSize() + && unAcknowledged<session.getFlowWindowSize()){ + //check for application data + DataPacket dp=sendQueue.poll();//10*Util.getSYNTime(),TimeUnit.MICROSECONDS); + if(dp!=null){ + send(dp); + largestSentSequenceNumber=dp.getPacketSequenceNumber(); + } + else { + Thread.yield(); + return; + } + }else{ + //congestion window full, should we *really* wait for an ack?! + if(unAcknowledged>=session.getCongestionControl().getCongestionWindowSize()){ + statistics.incNumberOfCCWindowExceededEvents(); + } + Thread.sleep(1); + //waitForAck(); return; } - DataPacket dp=sendQueue.poll(20,TimeUnit.MILLISECONDS); - if(dp!=null){ - send(dp); - largestSentSequenceNumber=dp.getPacketSequenceNumber(); - } - }else{ - //should we *really* wait for an ack?! - if(unAcknowledged>=session.getCongestionControl().getCongestionWindowSize()){ - statistics.incNumberOfCCWindowExceededEvents(); - } - Thread.sleep(1); - //waitForAck(); } //wait + + double snd=session.getCongestionControl().getSendInterval(); long passed=Util.getCurrentTime()-iterationStart; int x=0; @@ -339,17 +330,42 @@ if(x++==0)statistics.incNumberOfCCSlowDownEvents(); //we cannot wait with microsecond precision if(snd-passed>750)Thread.sleep(1); - else Thread.yield(); + else if((snd-passed)/snd > 0.9){ + return; + } passed=Util.getCurrentTime()-iterationStart; } - + } /** + * re-submits an entry from the sender loss list + * @param entry + */ + protected void handleResubmit(SenderLossListEntry entry){ + long seqNumber = entry.getSequenceNumber(); + //TODO + //if the current seqNumber is 16n,check the timeOut in the + //loss list and send a message drop request. + //if((seqNumber%16)==0){ + //sendLossList.checkTimeOut(timeToLive); + //} + try { + //retransmit the packet and remove it from the list + DataPacket pktToRetransmit = sendBuffer.get(seqNumber); + if(pktToRetransmit!=null){ + endpoint.doSend(pktToRetransmit); + statistics.incNumberOfRetransmittedDataPackets(); + } + }catch (Exception e) { + logger.log(Level.WARNING,"",e); + } + } + + /** * for processing EXP event (see spec. p 13) */ protected void putUnacknowledgedPacketsIntoLossList(){ - synchronized (sendLock) { for(Long l: sendBuffer.keySet()){ senderLossList.insert(new SenderLossListEntry(l)); @@ -391,7 +407,7 @@ return largestSentSequenceNumber>=sequenceNumber; } - + boolean haveLostPackets(){ return !senderLossList.isEmpty(); } Modified: udt-java/trunk/src/main/java/udt/UDTSession.java =================================================================== --- udt-java/trunk/src/main/java/udt/UDTSession.java 2010-04-26 06:36:47 UTC (rev 27) +++ udt-java/trunk/src/main/java/udt/UDTSession.java 2010-04-28 14:51:57 UTC (rev 28) @@ -32,6 +32,7 @@ package udt; +import java.net.DatagramPacket; import java.util.concurrent.atomic.AtomicLong; import java.util.logging.Logger; @@ -64,11 +65,14 @@ protected final CongestionControl cc; + //cache dgPacket (peer stays the same always) + private DatagramPacket dgPacket; + /** * flow window size, i.e. how many data packets are * in-flight at a single time */ - protected int flowWindowSize=1024; + protected int flowWindowSize=64; /** * remote UDT entity (address and socket ID) @@ -105,7 +109,7 @@ statistics=new UDTStatistics(description); mySocketID=nextSocketID.incrementAndGet(); this.destination=destination; - + this.dgPacket=new DatagramPacket(new byte[0],0,destination.getAddress(),destination.getPort()); //init configurable CC String clazzP=System.getProperty(CC_CLASS,UDTCongestionControl.class.getName()); Object ccObject=null; @@ -210,4 +214,7 @@ this.initialSequenceNumber=initialSequenceNumber; } + public DatagramPacket getDatagram(){ + return dgPacket; + } } Modified: udt-java/trunk/src/main/java/udt/UDTSocket.java =================================================================== --- udt-java/trunk/src/main/java/udt/UDTSocket.java 2010-04-26 06:36:47 UTC (rev 27) +++ udt-java/trunk/src/main/java/udt/UDTSocket.java 2010-04-28 14:51:57 UTC (rev 28) @@ -148,7 +148,7 @@ */ protected void doWrite(byte[]data, int offset, int length)throws IOException{ try{ - doWrite(data, offset, length, 5, TimeUnit.MILLISECONDS); + doWrite(data, offset, length, Integer.MAX_VALUE, TimeUnit.MILLISECONDS); }catch(InterruptedException ie){ IOException io=new IOException(); io.initCause(ie); @@ -163,14 +163,13 @@ * @param length * @param timeout * @param units - * @throws IOException + * @throws IOException - if data cannot be sent * @throws InterruptedException */ protected void doWrite(byte[]data, int offset, int length, int timeout, TimeUnit units)throws IOException,InterruptedException{ int chunksize=session.getDatagramSize()-24;//need some bytes for the header ByteBuffer bb=ByteBuffer.wrap(data,offset,length); long seqNo=0; - int i=0; while(bb.remaining()>0){ int len=Math.min(bb.remaining(),chunksize); byte[]chunk=new byte[len]; @@ -182,10 +181,9 @@ packet.setDestinationID(session.getDestination().getSocketID()); packet.setData(chunk); //put the packet into the send queue - while(!sender.sendUdtPacket(packet, timeout, units)){ - Thread.sleep(1); + if(!sender.sendUdtPacket(packet, timeout, units)){ + throw new IOException("Queue full"); } - i++; } if(length>0)active=true; } Modified: udt-java/trunk/src/main/java/udt/packets/Destination.java =================================================================== --- udt-java/trunk/src/main/java/udt/packets/Destination.java 2010-04-26 06:36:47 UTC (rev 27) +++ udt-java/trunk/src/main/java/udt/packets/Destination.java 2010-04-28 14:51:57 UTC (rev 28) @@ -33,7 +33,6 @@ package udt.packets; import java.net.InetAddress; -import java.net.UnknownHostException; public class Destination { @@ -49,7 +48,7 @@ this.port=port; } - public InetAddress getAddress()throws UnknownHostException{ + public InetAddress getAddress(){ return address; } Modified: udt-java/trunk/src/main/java/udt/receiver/PacketHistoryWindow.java =================================================================== --- udt-java/trunk/src/main/java/udt/receiver/PacketHistoryWindow.java 2010-04-26 06:36:47 UTC (rev 27) +++ udt-java/trunk/src/main/java/udt/receiver/PacketHistoryWindow.java 2010-04-28 14:51:57 UTC (rev 28) @@ -34,13 +34,8 @@ import udt.util.CircularArray; - - /** * A circular array that records the packet arrival times - * - * - * */ public class PacketHistoryWindow extends CircularArray<Long>{ @@ -57,7 +52,7 @@ * (see specification section 6.2, page 12) * @return the current value */ - public double getPacketArrivalSpeed(){ + public long getPacketArrivalSpeed(){ if(!haveOverflow)return 0; int num=max-1; double AI; @@ -94,7 +89,7 @@ else{ medianPacketArrivalSpeed=0; } - return medianPacketArrivalSpeed; + return (long)Math.ceil(medianPacketArrivalSpeed); } } Modified: udt-java/trunk/src/main/java/udt/sender/SenderLossList.java =================================================================== --- udt-java/trunk/src/main/java/udt/sender/SenderLossList.java 2010-04-26 06:36:47 UTC (rev 27) +++ udt-java/trunk/src/main/java/udt/sender/SenderLossList.java 2010-04-28 14:51:57 UTC (rev 28) @@ -72,4 +72,8 @@ public long size(){ return backingList.size(); } + + public String toString(){ + return backingList.toString(); + } } Modified: udt-java/trunk/src/main/java/udt/sender/SenderLossListEntry.java =================================================================== --- udt-java/trunk/src/main/java/udt/sender/SenderLossListEntry.java 2010-04-26 06:36:47 UTC (rev 27) +++ udt-java/trunk/src/main/java/udt/sender/SenderLossListEntry.java 2010-04-28 14:51:57 UTC (rev 28) @@ -95,6 +95,6 @@ } public String toString(){ - return "lossListEntry-"+sequenceNumber; + return "lost-"+sequenceNumber; } } Deleted: udt-java/trunk/src/main/java/udt/util/FlowWindow.java =================================================================== --- udt-java/trunk/src/main/java/udt/util/FlowWindow.java 2010-04-26 06:36:47 UTC (rev 27) +++ udt-java/trunk/src/main/java/udt/util/FlowWindow.java 2010-04-28 14:51:57 UTC (rev 28) @@ -1,87 +0,0 @@ -/********************************************************************************* - * Copyright (c) 2010 Forschungszentrum Juelich GmbH - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * (1) Redistributions of source code must retain the above copyright notice, - * this list of conditions and the disclaimer at the end. Redistributions in - * binary form must reproduce the above copyright notice, this list of - * conditions and the following disclaimer in the documentation and/or other - * materials provided with the distribution. - * - * (2) Neither the name of Forschungszentrum Juelich GmbH nor the names of its - * contributors may be used to endorse or promote products derived from this - * software without specific prior written permission. - * - * DISCLAIMER - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - *********************************************************************************/ - -package udt.util; - -import java.util.concurrent.PriorityBlockingQueue; - -/** - * bounded queue - * - */ -public class FlowWindow<E> extends PriorityBlockingQueue<E> { - - private static final long serialVersionUID=1l; - - private volatile int capacity; - - /** - * create a new flow window with the given size - * - * @param size - the initial size of the flow window - */ - public FlowWindow(int size){ - super(); - this.capacity=size; - } - - /** - * create a new flow window with the default size of 16 - */ - public FlowWindow(){ - this(16); - } - - public void setCapacity(int newSize){ - capacity=newSize; - } - - public int getCapacity(){ - return capacity; - } - - /** - * try to add an element to the queue, return false if it is not possible - */ - @Override - public boolean offer(E e) { - if(contains(e)){ - return true; - } - if(size()<capacity){ - return super.offer(e); - }else return false; - } - - - -} Modified: udt-java/trunk/src/main/java/udt/util/MeanValue.java =================================================================== --- udt-java/trunk/src/main/java/udt/util/MeanValue.java 2010-04-26 06:36:47 UTC (rev 27) +++ udt-java/trunk/src/main/java/udt/util/MeanValue.java 2010-04-28 14:51:57 UTC (rev 28) @@ -13,14 +13,36 @@ private final NumberFormat format; + private final boolean verbose; + private final long nValue; + private long start; + + private String msg; + public MeanValue(){ + this(false, 64); + } + + public MeanValue(boolean verbose){ + this(verbose, 64); + } + + public MeanValue(boolean verbose, int nValue){ format=NumberFormat.getNumberInstance(); format.setMaximumFractionDigits(2); + this.verbose=verbose; + this.nValue=nValue; + begin(); } + public void addValue(double value){ mean=(mean*n+value)/(n+1); n++; + if(verbose && n % nValue == 1){ + if(msg!=null)System.out.print(msg+" "); + System.out.println(getFormattedMean()); + } } public double getMean(){ @@ -35,4 +57,16 @@ mean=0; n=0; } + + public void begin(){ + start=Util.getCurrentTime(); + } + + public void end(){ + addValue(Util.getCurrentTime()-start); + } + public void end(String msg){ + this.msg=msg; + addValue(Util.getCurrentTime()-start); + } } Modified: udt-java/trunk/src/main/java/udt/util/ReceiveFile.java =================================================================== --- udt-java/trunk/src/main/java/udt/util/ReceiveFile.java 2010-04-26 06:36:47 UTC (rev 27) +++ udt-java/trunk/src/main/java/udt/util/ReceiveFile.java 2010-04-28 14:51:57 UTC (rev 28) @@ -108,6 +108,9 @@ System.out.println("[ReceiveFile] Rate: "+(int)mbytes+" MBytes/sec. "+(int)mbit+" MBit/sec."); client.shutdown(); + + if(verbose)System.out.println(client.getStatistics()); + }finally{ fos.close(); } Modified: udt-java/trunk/src/main/java/udt/util/SendFile.java =================================================================== --- udt-java/trunk/src/main/java/udt/util/SendFile.java 2010-04-26 06:36:47 UTC (rev 27) +++ udt-java/trunk/src/main/java/udt/util/SendFile.java 2010-04-28 14:51:57 UTC (rev 28) @@ -151,7 +151,7 @@ out.write(PacketUtil.encode(size)); long start=System.currentTimeMillis(); //and send the file - Util.copy(fis, out, size, true); + Util.copy(fis, out, size, false); long end=System.currentTimeMillis(); System.out.println(socket.getSession().getStatistics().toString()); double rate=1000.0*size/1024/1024/(end-start); Modified: udt-java/trunk/src/main/java/udt/util/Util.java =================================================================== --- udt-java/trunk/src/main/java/udt/util/Util.java 2010-04-26 06:36:47 UTC (rev 27) +++ udt-java/trunk/src/main/java/udt/util/Util.java 2010-04-28 14:51:57 UTC (rev 28) @@ -121,7 +121,7 @@ * @throws IOException */ public static void copy(InputStream source, OutputStream target, long size, boolean flush)throws IOException{ - byte[]buf=new byte[1*1024*1024]; + byte[]buf=new byte[65536]; int c; long read=0; while(true){ @@ -149,5 +149,5 @@ p.setPort(clientPort); endpoint.sendRaw(p); } - + } Modified: udt-java/trunk/src/test/java/udt/TestList.java =================================================================== --- udt-java/trunk/src/test/java/udt/TestList.java 2010-04-26 06:36:47 UTC (rev 27) +++ udt-java/trunk/src/test/java/udt/TestList.java 2010-04-28 14:51:57 UTC (rev 28) @@ -12,7 +12,6 @@ import udt.sender.SenderLossList; import udt.sender.SenderLossListEntry; import udt.util.CircularArray; -import udt.util.FlowWindow; /* * tests for the various list and queue classes @@ -33,27 +32,16 @@ c.add(11); System.out.println(c); } - - public void testFlowWindow(){ - FlowWindow<Long>f=new FlowWindow<Long>(5); - for(int i=0;i<5;i++){ - System.out.println(i); - assertTrue(f.add(Long.valueOf(i))); - } - assertFalse(f.add(0l)); - f.setCapacity(6); - assertTrue(f.add(0l)); - } - + public void testPacketHistoryWindow(){ PacketHistoryWindow packetHistoryWindow = new PacketHistoryWindow(16); - - for(int i=0;i<17;i++){ - packetHistoryWindow.add(i*5000l); + long offset=1000000; + for(int i=0;i<28;i++){ + packetHistoryWindow.add(offset+i*5000l); } //packets arrive every 5 ms, so packet arrival rate is 200/sec - assertEquals(200.0,packetHistoryWindow.getPacketArrivalSpeed()); + assertEquals(200,packetHistoryWindow.getPacketArrivalSpeed()); } @@ -109,6 +97,9 @@ d1.setPacketSequenceNumber(1); DataPacket d2=new DataPacket(); d2.setPacketSequenceNumber(2); + DataPacket d3=new DataPacket(); + d3.setPacketSequenceNumber(3); + q.offer(d3); q.offer(d2); q.offer(d1); q.offer(control); @@ -116,16 +107,28 @@ UDTPacket p1=q.poll(); assertTrue(p1.isControlPacket()); - UDTPacket p2=q.poll(); - assertFalse(p2.isControlPacket()); + UDTPacket p=q.poll(); + assertFalse(p.isControlPacket()); //check ordering by sequence number - assertEquals(1,p2.getPacketSequenceNumber()); + assertEquals(1,p.getPacketSequenceNumber()); - UDTPacket p3=q.poll(); - assertFalse(p3.isControlPacket()); - assertEquals(2,p3.getPacketSequenceNumber()); + DataPacket d=new DataPacket(); + d.setPacketSequenceNumber(54); + q.offer(d); + p=q.poll(); + assertFalse(p.isControlPacket()); + assertEquals(2,p.getPacketSequenceNumber()); + p=q.poll(); + assertFalse(p.isControlPacket()); + assertEquals(3,p.getPacketSequenceNumber()); + + p=q.poll(); + assertFalse(p.isControlPacket()); + assertEquals(54,p.getPacketSequenceNumber()); + + } } Modified: udt-java/trunk/src/test/java/udt/TestSendFileReceiveFile.java =================================================================== --- udt-java/trunk/src/test/java/udt/TestSendFileReceiveFile.java 2010-04-26 06:36:47 UTC (rev 27) +++ udt-java/trunk/src/test/java/udt/TestSendFileReceiveFile.java 2010-04-28 14:51:57 UTC (rev 28) @@ -17,7 +17,8 @@ Thread.sleep(500); }while(!serverStarted); - File f=new File("src/test/java/datafile"); + //File f=new File("src/test/java/datafile"); + File f=new File("/tmp/100MB"); File tmp=File.createTempFile("udtest-", null); Modified: udt-java/trunk/src/test/java/udt/TestUDTServerSocket.java =================================================================== --- udt-java/trunk/src/test/java/udt/TestUDTServerSocket.java 2010-04-26 06:36:47 UTC (rev 27) +++ udt-java/trunk/src/test/java/udt/TestUDTServerSocket.java 2010-04-28 14:51:57 UTC (rev 28) @@ -29,7 +29,6 @@ //set an artificial loss rate public void testWithLoss()throws Exception{ UDTReceiver.dropRate=3; - UDTReceiver.connectionExpiryDisabled=true; TIMEOUT=Integer.MAX_VALUE; num_packets=512; //set log level @@ -40,7 +39,6 @@ //send even more data public void testLargeDataSet()throws Exception{ UDTReceiver.dropRate=0; - UDTReceiver.connectionExpiryDisabled=true; TIMEOUT=Integer.MAX_VALUE; num_packets=3*1024; //set log level Modified: udt-java/trunk/src/test/java/udt/performance/TestUDTLargeData.java =================================================================== --- udt-java/trunk/src/test/java/udt/performance/TestUDTLargeData.java 2010-04-26 06:36:47 UTC (rev 27) +++ udt-java/trunk/src/test/java/udt/performance/TestUDTLargeData.java 2010-04-28 14:51:57 UTC (rev 28) @@ -21,7 +21,7 @@ boolean running=false; //how many - int num_packets=100; + int num_packets=50; //how large is a single packet int size=1*1024*1024; @@ -35,7 +35,6 @@ //System.setProperty(UDTSession.CC_CLASS, NullCongestionControl.class.getName()); UDTReceiver.dropRate=0; TIMEOUT=Integer.MAX_VALUE; - //UDTReceiver.connectionExpiryDisabled=true; doTest(); } @@ -56,12 +55,12 @@ MessageDigest digest=MessageDigest.getInstance("MD5"); while(!serverRunning)Thread.sleep(100); long start=System.currentTimeMillis(); - System.out.println("Sending <"+num_packets+"> packets of <"+size/1024/1024+"> Mbytes each"); + System.out.println("Sending <"+num_packets+"> packets of <"+format.format(size/1024.0/1024.0)+"> Mbytes each"); long end=0; if(serverRunning){ for(int i=0;i<num_packets;i++){ long block=System.currentTimeMillis(); - client.sendBlocking(data); + client.send(data); digest.update(data); double took=System.currentTimeMillis()-block; double arrival=client.getStatistics().getPacketArrivalRate(); @@ -71,6 +70,7 @@ + " snd: "+format.format(snd) +" rate: "+format.format(size/(1024*took))+ " MB/sec"); } + client.flush(); end=System.currentTimeMillis(); client.shutdown(); }else throw new IllegalStateException(); Modified: udt-java/trunk/src/test/java/udt/performance/UDPTest.java =================================================================== --- udt-java/trunk/src/test/java/udt/performance/UDPTest.java 2010-04-26 06:36:47 UTC (rev 27) +++ udt-java/trunk/src/test/java/udt/performance/UDPTest.java 2010-04-28 14:51:57 UTC (rev 28) @@ -7,13 +7,14 @@ import junit.framework.TestCase; import udt.UDPEndPoint; +import udt.util.MeanValue; /** * send some data over a UDP connection and measure performance */ public class UDPTest extends TestCase { - final int num_packets=5*1000; + final int num_packets=10*1000; final int packetSize=UDPEndPoint.DATAGRAM_SIZE; public void test1()throws Exception{ @@ -30,9 +31,12 @@ dp.setAddress(InetAddress.getByName("localhost")); dp.setPort(65321); System.out.println("Sending "+num_packets+" data blocks of <"+packetSize+"> bytes"); + MeanValue v=new MeanValue(); for(int i=0;i<num_packets;i++){ dp.setData(data); + v.begin(); s.send(dp); + v.end(); } System.out.println("Finished sending."); while(serverRunning)Thread.sleep(10); @@ -41,6 +45,7 @@ System.out.println("Done. Sending "+N/1024/1024+" Mbytes took "+(end-start)+" ms"); System.out.println("Rate "+N/1000/(end-start)+" Mbytes/sec"); System.out.println("Rate "+num_packets+" packets/sec"); + System.out.println("Mean send time "+v.getFormattedMean()+" microsec"); System.out.println("Server received: "+total); } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <bsc...@us...> - 2010-04-26 06:36:54
|
Revision: 27 http://udt-java.svn.sourceforge.net/udt-java/?rev=27&view=rev Author: bschuller Date: 2010-04-26 06:36:47 +0000 (Mon, 26 Apr 2010) Log Message: ----------- Modified Paths: -------------- udt-java/trunk/src/main/java/udt/UDTCongestionControl.java Modified: udt-java/trunk/src/main/java/udt/UDTCongestionControl.java =================================================================== --- udt-java/trunk/src/main/java/udt/UDTCongestionControl.java 2010-04-25 21:32:53 UTC (rev 26) +++ udt-java/trunk/src/main/java/udt/UDTCongestionControl.java 2010-04-26 06:36:47 UTC (rev 27) @@ -126,7 +126,6 @@ lastAckSeqNumber = ackSeqno; //but not beyond a maximum size if(congestionWindowSize>session.getFlowWindowSize()){ - System.out.println("slow start ends on ACK"); slowStartPhase=false; if(packetArrivalRate>0){ packetSendingPeriod=1000000.0/packetArrivalRate; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <bsc...@us...> - 2010-04-25 21:32:59
|
Revision: 26 http://udt-java.svn.sourceforge.net/udt-java/?rev=26&view=rev Author: bschuller Date: 2010-04-25 21:32:53 +0000 (Sun, 25 Apr 2010) Log Message: ----------- Modified Paths: -------------- udt-java/trunk/src/main/java/udt/util/ReceiveFile.java Modified: udt-java/trunk/src/main/java/udt/util/ReceiveFile.java =================================================================== --- udt-java/trunk/src/main/java/udt/util/ReceiveFile.java 2010-04-25 21:29:40 UTC (rev 25) +++ udt-java/trunk/src/main/java/udt/util/ReceiveFile.java 2010-04-25 21:32:53 UTC (rev 26) @@ -88,7 +88,9 @@ //read size info (an 4-byte int) byte[]sizeInfo=new byte[4]; - in.read(sizeInfo); + + while(in.read(sizeInfo)==0); + long size=ByteBuffer.wrap(sizeInfo).getInt(); File file=new File(new String(localFile)); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <bsc...@us...> - 2010-04-25 21:29:46
|
Revision: 25 http://udt-java.svn.sourceforge.net/udt-java/?rev=25&view=rev Author: bschuller Date: 2010-04-25 21:29:40 +0000 (Sun, 25 Apr 2010) Log Message: ----------- Modified Paths: -------------- udt-java/trunk/src/main/java/udt/UDTInputStream.java udt-java/trunk/src/main/java/udt/util/ReceiveFile.java udt-java/trunk/src/main/java/udt/util/SendFile.java udt-java/trunk/src/test/java/udt/TestSendFileReceiveFile.java Modified: udt-java/trunk/src/main/java/udt/UDTInputStream.java =================================================================== --- udt-java/trunk/src/main/java/udt/UDTInputStream.java 2010-04-25 20:32:22 UTC (rev 24) +++ udt-java/trunk/src/main/java/udt/UDTInputStream.java 2010-04-25 21:29:40 UTC (rev 25) @@ -118,7 +118,7 @@ public int read(byte[]target)throws IOException{ try{ int read=0; - updateCurrentChunk(); + updateCurrentChunk(false); while(currentChunk!=null){ byte[]data=currentChunk.data; int length=Math.min(target.length-read,data.length-offset); @@ -136,7 +136,7 @@ return read; } - updateCurrentChunk(); + updateCurrentChunk(blocking && read==0); } if(read>0)return read; @@ -160,12 +160,12 @@ * * @throws InterruptedException */ - private void updateCurrentChunk()throws IOException{ + private void updateCurrentChunk(boolean block)throws IOException{ if(currentChunk!=null)return; while(true){ try{ - if(blocking){ + if(block){ currentChunk=appData.poll(1, TimeUnit.MILLISECONDS); while (!closed && currentChunk==null){ currentChunk=appData.poll(1000, TimeUnit.MILLISECONDS); Modified: udt-java/trunk/src/main/java/udt/util/ReceiveFile.java =================================================================== --- udt-java/trunk/src/main/java/udt/util/ReceiveFile.java 2010-04-25 20:32:22 UTC (rev 24) +++ udt-java/trunk/src/main/java/udt/util/ReceiveFile.java 2010-04-25 21:29:40 UTC (rev 25) @@ -76,11 +76,13 @@ byte[]readBuf=new byte[1024]; ByteBuffer bb=ByteBuffer.wrap(readBuf); - + System.out.println("[ReceiveFile] Requesting file "+remoteFile); //send name file info byte[]fName=remoteFile.getBytes(); - bb.putInt(fName.length); + bb.putInt(fName.length+1); + bb.put(fName); + bb.put((byte)0); out.write(readBuf, 0, bb.position()); Modified: udt-java/trunk/src/main/java/udt/util/SendFile.java =================================================================== --- udt-java/trunk/src/main/java/udt/util/SendFile.java 2010-04-25 20:32:22 UTC (rev 24) +++ udt-java/trunk/src/main/java/udt/util/SendFile.java 2010-04-25 21:29:40 UTC (rev 25) @@ -132,8 +132,8 @@ byte[]readBuf=new byte[32768]; ByteBuffer bb=ByteBuffer.wrap(readBuf); - //read name file info - in.read(readBuf); + //read file name info + while(in.read(readBuf)==0)Thread.sleep(100); //how many bytes to read for the file name int length=bb.getInt(); Modified: udt-java/trunk/src/test/java/udt/TestSendFileReceiveFile.java =================================================================== --- udt-java/trunk/src/test/java/udt/TestSendFileReceiveFile.java 2010-04-25 20:32:22 UTC (rev 24) +++ udt-java/trunk/src/test/java/udt/TestSendFileReceiveFile.java 2010-04-25 21:29:40 UTC (rev 25) @@ -18,7 +18,6 @@ }while(!serverStarted); File f=new File("src/test/java/datafile"); - f=new File("/tmp/200MB"); File tmp=File.createTempFile("udtest-", null); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <bsc...@us...> - 2010-04-25 20:32:29
|
Revision: 24 http://udt-java.svn.sourceforge.net/udt-java/?rev=24&view=rev Author: bschuller Date: 2010-04-25 20:32:22 +0000 (Sun, 25 Apr 2010) Log Message: ----------- simpler InputStream; fix wrong value for EXP interval Modified Paths: -------------- udt-java/trunk/src/main/java/udt/UDTInputStream.java udt-java/trunk/src/main/java/udt/UDTReceiver.java udt-java/trunk/src/main/java/udt/UDTSender.java udt-java/trunk/src/main/java/udt/sender/SenderLossList.java udt-java/trunk/src/main/java/udt/sender/SenderLossListEntry.java udt-java/trunk/src/main/java/udt/util/UDTStatistics.java udt-java/trunk/src/test/java/udt/TestUDTInputStream.java udt-java/trunk/src/test/java/udt/UDTTestBase.java udt-java/trunk/src/test/java/udt/performance/TestUDTLargeData.java Added Paths: ----------- udt-java/trunk/src/main/java/udt/util/MeanValue.java Modified: udt-java/trunk/src/main/java/udt/UDTInputStream.java =================================================================== --- udt-java/trunk/src/main/java/udt/UDTInputStream.java 2010-04-22 10:06:54 UTC (rev 23) +++ udt-java/trunk/src/main/java/udt/UDTInputStream.java 2010-04-25 20:32:22 UTC (rev 24) @@ -34,7 +34,6 @@ import java.io.IOException; import java.io.InputStream; -import java.nio.ByteBuffer; import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicBoolean; @@ -66,13 +65,10 @@ //see the noMoreData() method private final AtomicBoolean expectMoreData=new AtomicBoolean(true); - - private final ByteBuffer buffer; - private volatile boolean closed=false; - + private volatile boolean blocking=true; - + /** * create a new {@link UDTInputStream} connected to the given socket * @param socket - the {@link UDTSocket} @@ -83,8 +79,6 @@ this.socket=socket; this.statistics=statistics; appData=new FlowWindow<AppData>(getFlowWindowSize()); - buffer=ByteBuffer.allocate(65536); - buffer.flip(); } private int getFlowWindowSize(){ @@ -107,7 +101,7 @@ int b=0; while(b==0) b=read(single); - + if(b>0){ return single[0]; } @@ -115,24 +109,39 @@ return b; } } - + private AppData currentChunk=null; + //offset into currentChunk int offset=0; + @Override public int read(byte[]target)throws IOException{ try{ - //empty the buffer first - int read=readFromBuffer(target, 0); - //if no more space left in target, exit now - if(read==target.length){ - return target.length; + int read=0; + updateCurrentChunk(); + while(currentChunk!=null){ + byte[]data=currentChunk.data; + int length=Math.min(target.length-read,data.length-offset); + System.arraycopy(data, offset, target, read, length); + read+=length; + offset+=length; + //check if chunk has been fully read + if(offset>=data.length){ + currentChunk=null; + offset=0; + } + + //if no more space left in target, exit now + if(read==target.length){ + return read; + } + + updateCurrentChunk(); } - //otherwise try to fill up the buffer - fillBuffer(); - read+=readFromBuffer(target, read); + if(read>0)return read; if(closed)return -1; - if(expectMoreData.get() || buffer.remaining()>0 || !appData.isEmpty())return 0; + if(expectMoreData.get() || !appData.isEmpty())return 0; //no more data return -1; @@ -143,20 +152,18 @@ } } - @Override - public int available()throws IOException{ - return buffer.remaining(); - } - /** - * write as much data into the ByteBuffer as possible<br/> + * Reads the next valid chunk of application data from the queue<br/> + * * In blocking mode,this method will block until data is available or the socket is closed, - * otherwise wait for at most 10 milliseconds. - * @returns <code>true</code> if data available + * otherwise it will wait for at most 10 milliseconds. + * * @throws InterruptedException */ - private boolean fillBuffer()throws IOException{ - if(currentChunk==null){ + private void updateCurrentChunk()throws IOException{ + if(currentChunk!=null)return; + + while(true){ try{ if(blocking){ currentChunk=appData.poll(1, TimeUnit.MILLISECONDS); @@ -170,51 +177,29 @@ ex.initCause(ie); throw ex; } - } - if(currentChunk!=null){ - //check if the data is in-order - if(currentChunk.sequenceNumber==highestSequenceNumber+1){ - highestSequenceNumber++; - statistics.updateReadDataMD5(currentChunk.data); + if(currentChunk!=null){ + //check if the data is in-order + if(currentChunk.sequenceNumber==highestSequenceNumber+1){ + highestSequenceNumber++; + statistics.updateReadDataMD5(currentChunk.data); + return; + } + else if(currentChunk.sequenceNumber<=highestSequenceNumber){ + //duplicate, drop it + currentChunk=null; + statistics.incNumberOfDuplicateDataPackets(); + } + else{ + //out of order data, put back into queue and exit + appData.offer(currentChunk); + currentChunk=null; + return; + } } - else if(currentChunk.sequenceNumber<=highestSequenceNumber){ - //duplicate, drop it - currentChunk=null; - statistics.incNumberOfDuplicateDataPackets(); - return false; - } - else{ - //out of order data, put back into queue - appData.offer(currentChunk); - currentChunk=null; - return false; - } - - //fill data into the buffer - buffer.compact(); - int len=Math.min(buffer.remaining(),currentChunk.data.length-offset); - buffer.put(currentChunk.data,offset,len); - buffer.flip(); - offset+=len; - //check if the chunk has been fully read - if(offset>=currentChunk.data.length){ - currentChunk=null; - offset=0; - } + else return; } - return true; } - //read data from the internal buffer into target at the specified offset - private int readFromBuffer(byte[] target, int offset){ - int available=buffer.remaining(); - int canRead=Math.min(available, target.length-offset); - if(canRead>0){ - buffer.get(target, offset, canRead); - } - return canRead; - } - /** * new application data * @param data @@ -231,7 +216,7 @@ closed=true; noMoreData(); } - + public UDTSocket getSocket(){ return socket; } @@ -243,7 +228,7 @@ public void setBlocking(boolean block){ this.blocking=block; } - + /** * notify the input stream that there is no more data * @throws IOException @@ -277,7 +262,7 @@ final int prime = 31; int result = 1; result = prime * result - + (int) (sequenceNumber ^ (sequenceNumber >>> 32)); + + (int) (sequenceNumber ^ (sequenceNumber >>> 32)); return result; } @@ -294,8 +279,8 @@ return false; return true; } - - + + } } Modified: udt-java/trunk/src/main/java/udt/UDTReceiver.java =================================================================== --- udt-java/trunk/src/main/java/udt/UDTReceiver.java 2010-04-22 10:06:54 UTC (rev 23) +++ udt-java/trunk/src/main/java/udt/UDTReceiver.java 2010-04-25 20:32:22 UTC (rev 24) @@ -125,7 +125,7 @@ private long nextEXP; //microseconds to next EXP event - private long EXP_INTERVAL=Util.getSYNTime(); + private long EXP_INTERVAL=100*Util.getSYNTime(); //instant when the session was created (for expiry checking) private final long sessionUpSince; @@ -348,7 +348,7 @@ public static int dropRate=0; //number of received data packets private int n=0; - + protected void onDataPacketReceived(DataPacket dp)throws IOException{ long currentSequenceNumber = dp.getPacketSequenceNumber(); //check whether to drop this packet @@ -367,9 +367,11 @@ long interval=currentDataPacketArrivalTime -lastDataPacketArrivalTime; packetPairWindow.add(interval); } + //(5).record the packet arrival time in the PKT History Window. packetHistoryWindow.add(currentDataPacketArrivalTime); + //store current time lastDataPacketArrivalTime=currentDataPacketArrivalTime; Modified: udt-java/trunk/src/main/java/udt/UDTSender.java =================================================================== --- udt-java/trunk/src/main/java/udt/UDTSender.java 2010-04-22 10:06:54 UTC (rev 23) +++ udt-java/trunk/src/main/java/udt/UDTSender.java 2010-04-25 20:32:22 UTC (rev 24) @@ -286,14 +286,12 @@ SenderLossListEntry entry=senderLossList.getFirstEntry(); if (entry!=null) { long seqNumber = entry.getSequenceNumber(); - //TODO //if the current seqNumber is 16n,check the timeOut in the //loss list and send a message drop request. //if((seqNumber%16)==0){ //sendLossList.checkTimeOut(timeToLive); //} - try { //retransmit the packet with the first entry in the list //as sequence number and remove it from the list @@ -301,8 +299,7 @@ if(pktToRetransmit!=null){ endpoint.doSend(pktToRetransmit); statistics.incNumberOfRetransmittedDataPackets(); - } - senderLossList.remove(seqNumber); + } }catch (Exception e) { logger.log(Level.WARNING,"",e); } @@ -352,6 +349,7 @@ * for processing EXP event (see spec. p 13) */ protected void putUnacknowledgedPacketsIntoLossList(){ + synchronized (sendLock) { for(Long l: sendBuffer.keySet()){ senderLossList.insert(new SenderLossListEntry(l)); Modified: udt-java/trunk/src/main/java/udt/sender/SenderLossList.java =================================================================== --- udt-java/trunk/src/main/java/udt/sender/SenderLossList.java 2010-04-22 10:06:54 UTC (rev 23) +++ udt-java/trunk/src/main/java/udt/sender/SenderLossList.java 2010-04-25 20:32:22 UTC (rev 24) @@ -58,7 +58,8 @@ } /** - * gets the loss list entry with the lowest sequence number + * retrieves the loss list entry with the lowest sequence number and removes + * it from the loss list */ public SenderLossListEntry getFirstEntry(){ return backingList.poll(); @@ -68,4 +69,7 @@ return backingList.isEmpty(); } + public long size(){ + return backingList.size(); + } } Modified: udt-java/trunk/src/main/java/udt/sender/SenderLossListEntry.java =================================================================== --- udt-java/trunk/src/main/java/udt/sender/SenderLossListEntry.java 2010-04-22 10:06:54 UTC (rev 23) +++ udt-java/trunk/src/main/java/udt/sender/SenderLossListEntry.java 2010-04-25 20:32:22 UTC (rev 24) @@ -94,4 +94,7 @@ return true; } + public String toString(){ + return "lossListEntry-"+sequenceNumber; + } } Added: udt-java/trunk/src/main/java/udt/util/MeanValue.java =================================================================== --- udt-java/trunk/src/main/java/udt/util/MeanValue.java (rev 0) +++ udt-java/trunk/src/main/java/udt/util/MeanValue.java 2010-04-25 20:32:22 UTC (rev 24) @@ -0,0 +1,38 @@ +package udt.util; + +import java.text.NumberFormat; + +/** + * holds a floating mean value + */ +public class MeanValue { + + private double mean=0; + + private int n=0; + + private final NumberFormat format; + + + public MeanValue(){ + format=NumberFormat.getNumberInstance(); + format.setMaximumFractionDigits(2); + } + public void addValue(double value){ + mean=(mean*n+value)/(n+1); + n++; + } + + public double getMean(){ + return mean; + } + + public String getFormattedMean(){ + return format.format(mean); + } + + public void clear(){ + mean=0; + n=0; + } +} Property changes on: udt-java/trunk/src/main/java/udt/util/MeanValue.java ___________________________________________________________________ Added: svn:mime-type + text/plain Modified: udt-java/trunk/src/main/java/udt/util/UDTStatistics.java =================================================================== --- udt-java/trunk/src/main/java/udt/util/UDTStatistics.java 2010-04-22 10:06:54 UTC (rev 23) +++ udt-java/trunk/src/main/java/udt/util/UDTStatistics.java 2010-04-25 20:32:22 UTC (rev 24) @@ -150,6 +150,10 @@ this.sendPeriod=sendPeriod; } + public double getSendPeriod(){ + return sendPeriod; + } + public void updateReadDataMD5(byte[]data){ digest.update(data); } Modified: udt-java/trunk/src/test/java/udt/TestUDTInputStream.java =================================================================== --- udt-java/trunk/src/test/java/udt/TestUDTInputStream.java 2010-04-22 10:06:54 UTC (rev 23) +++ udt-java/trunk/src/test/java/udt/TestUDTInputStream.java 2010-04-25 20:32:22 UTC (rev 24) @@ -13,30 +13,46 @@ byte[] data2="a test".getBytes(); byte[] data3=" string".getBytes(); String digest=computeMD5(data1,data2,data3); - is.haveNewData(0, data1); - is.haveNewData(1, data2); - is.haveNewData(2, data3); + is.haveNewData(1, data1); + is.haveNewData(2, data2); + is.haveNewData(3, data3); is.noMoreData(); is.setBlocking(false); readAll(is,8); assertEquals(digest,stat.getDigest()); } + public void test2()throws Exception{ + UDTStatistics stat=new UDTStatistics("test"); + UDTInputStream is=new UDTInputStream(null, stat); + byte[] data1=getRandomData(65537); + byte[] data2=getRandomData(1234); + byte[] data3=getRandomData(3*1024*1024); + String digest=computeMD5(data1,data2,data3); + is.setBlocking(false); + is.haveNewData(1, data1); + is.haveNewData(2, data2); + is.haveNewData(3, data3); + is.noMoreData(); + readAll(is,5*1024*1024); + assertEquals(digest,stat.getDigest()); + } + public void testInOrder()throws Exception{ UDTStatistics stat=new UDTStatistics("test"); UDTInputStream is=new UDTInputStream(null, stat); is.setBlocking(false); - byte[]data=getRandomData(10*1024); + byte[]data=getRandomData(10*1024*1024); byte[][]blocks=makeChunks(10,data); String digest=computeMD5(blocks); for(int i=0;i<10;i++){ - is.haveNewData(i, blocks[i]); + is.haveNewData(i+1, blocks[i]); } is.noMoreData(); - readAll(is,512); + readAll(is,1024*999); assertEquals(digest,stat.getDigest()); } @@ -52,7 +68,7 @@ byte[]order=new byte[]{9,7,5,3,1,2,0,4,6,8}; for(int i : order){ - is.haveNewData(i, blocks[i]); + is.haveNewData(i+1, blocks[i]); } readAll(is,512,true); @@ -70,7 +86,7 @@ is.noMoreData(); if(c==-1)break; else{ - d.update(buf,0,c); + if(c>0)d.update(buf,0,c); } } return UDTStatistics.hexString(d); Modified: udt-java/trunk/src/test/java/udt/UDTTestBase.java =================================================================== --- udt-java/trunk/src/test/java/udt/UDTTestBase.java 2010-04-22 10:06:54 UTC (rev 23) +++ udt-java/trunk/src/test/java/udt/UDTTestBase.java 2010-04-25 20:32:22 UTC (rev 24) @@ -5,6 +5,8 @@ import java.security.MessageDigest; import java.util.Random; +import udt.util.UDTStatistics; + import junit.framework.TestCase; /** @@ -58,14 +60,7 @@ } public static String hexString(MessageDigest digest){ - byte[] messageDigest = digest.digest(); - StringBuilder hexString = new StringBuilder(); - for (int i=0;i<messageDigest.length;i++) { - String hex = Integer.toHexString(0xFF & messageDigest[i]); - if(hex.length()==1)hexString.append('0'); - hexString.append(hex); - } - return hexString.toString(); + return UDTStatistics.hexString(digest); } Modified: udt-java/trunk/src/test/java/udt/performance/TestUDTLargeData.java =================================================================== --- udt-java/trunk/src/test/java/udt/performance/TestUDTLargeData.java 2010-04-22 10:06:54 UTC (rev 23) +++ udt-java/trunk/src/test/java/udt/performance/TestUDTLargeData.java 2010-04-25 20:32:22 UTC (rev 24) @@ -21,7 +21,7 @@ boolean running=false; //how many - int num_packets=200; + int num_packets=100; //how large is a single packet int size=1*1024*1024; @@ -64,7 +64,12 @@ client.sendBlocking(data); digest.update(data); double took=System.currentTimeMillis()-block; - System.out.println("Sent block <"+i+"> in "+took+" ms, rate: "+format.format(size/(1024*took))+ " Mbytes/sec"); + double arrival=client.getStatistics().getPacketArrivalRate(); + double snd=client.getStatistics().getSendPeriod(); + System.out.println("Sent block <"+i+"> in "+took+" ms, " + +" pktArr: "+arrival + + " snd: "+format.format(snd) + +" rate: "+format.format(size/(1024*took))+ " MB/sec"); } end=System.currentTimeMillis(); client.shutdown(); @@ -74,7 +79,7 @@ while(serverRunning)Thread.sleep(100); System.out.println("Done. Sending "+N/1024/1024+" Mbytes took "+(end-start)+" ms"); - double mbytes=N/(end-start)/1024; + double mbytes=N/(end-start)/1024.0; double mbit=8*mbytes; System.out.println("Rate: "+format.format(mbytes)+" Mbytes/sec "+format.format(mbit)+" Mbit/sec"); System.out.println("Server received: "+total); @@ -117,7 +122,6 @@ else{ md5.update(buf, 0, c); total+=c; - Thread.yield(); } } System.out.println("Server thread exiting, last received bytes: "+c); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <bsc...@us...> - 2010-04-22 10:07:00
|
Revision: 23 http://udt-java.svn.sourceforge.net/udt-java/?rev=23&view=rev Author: bschuller Date: 2010-04-22 10:06:54 +0000 (Thu, 22 Apr 2010) Log Message: ----------- Modified Paths: -------------- udt-java/trunk/README udt-java/trunk/src/main/java/udt/UDTCongestionControl.java udt-java/trunk/src/main/java/udt/UDTPacket.java udt-java/trunk/src/main/java/udt/UDTReceiver.java udt-java/trunk/src/main/java/udt/packets/ControlPacket.java udt-java/trunk/src/main/java/udt/packets/DataPacket.java udt-java/trunk/src/main/java/udt/receiver/AckHistoryWindow.java udt-java/trunk/src/main/java/udt/receiver/ReceiverLossList.java udt-java/trunk/src/main/java/udt/receiver/ReceiverLossListEntry.java udt-java/trunk/src/main/java/udt/sender/SenderLossList.java udt-java/trunk/src/main/java/udt/util/SendFile.java udt-java/trunk/src/main/java/udt/util/UDTStatistics.java udt-java/trunk/src/main/java/udt/util/Util.java udt-java/trunk/src/test/java/udt/TestList.java udt-java/trunk/src/test/java/udt/performance/TestUDTLargeData.java Modified: udt-java/trunk/README =================================================================== --- udt-java/trunk/README 2010-04-21 20:36:36 UTC (rev 22) +++ udt-java/trunk/README 2010-04-22 10:06:54 UTC (rev 23) @@ -17,7 +17,7 @@ To download a file from the server, - bin/receive_file <server_host> <server_port> <remote_filename> <local_filename> + bin/receive-file <server_host> <server_port> <remote_filename> <local_filename> # Modified: udt-java/trunk/src/main/java/udt/UDTCongestionControl.java =================================================================== --- udt-java/trunk/src/main/java/udt/UDTCongestionControl.java 2010-04-21 20:36:36 UTC (rev 22) +++ udt-java/trunk/src/main/java/udt/UDTCongestionControl.java 2010-04-22 10:06:54 UTC (rev 23) @@ -21,7 +21,7 @@ private final UDTStatistics statistics; //round trip time in microseconds - private long roundTripTime=2*Util.getSYNTime(); + private long roundTripTime=0; //rate in packets per second private long packetArrivalRate=0; @@ -124,7 +124,6 @@ if(slowStartPhase){ congestionWindowSize+=ackSeqno-lastAckSeqNumber; lastAckSeqNumber = ackSeqno; - //but not beyond a maximum size if(congestionWindowSize>session.getFlowWindowSize()){ System.out.println("slow start ends on ACK"); @@ -163,7 +162,6 @@ double factor=Util.getSYNTimeD()/(packetSendingPeriod*numOfIncreasingPacket+Util.getSYNTimeD()); packetSendingPeriod=factor*packetSendingPeriod; //packetSendingPeriod=0.995*packetSendingPeriod; - //System.out.println("dec snd factor "+factor+" to "+packetSendingPeriod); statistics.setSendPeriod(packetSendingPeriod); } @@ -173,7 +171,7 @@ //see spec page 16 private double computeNumOfIncreasingPacket (){ - //difference in link capacity and sending speed, in packets per second + //difference between link capacity and sending speed, in packets per second double remaining=estimatedLinkCapacity-1000000.0/packetSendingPeriod; if(remaining<=0){ Modified: udt-java/trunk/src/main/java/udt/UDTPacket.java =================================================================== --- udt-java/trunk/src/main/java/udt/UDTPacket.java 2010-04-21 20:36:36 UTC (rev 22) +++ udt-java/trunk/src/main/java/udt/UDTPacket.java 2010-04-22 10:06:54 UTC (rev 23) @@ -32,7 +32,7 @@ package udt; -public interface UDTPacket { +public interface UDTPacket extends Comparable<UDTPacket>{ public long getMessageNumber(); @@ -67,4 +67,7 @@ public boolean isConnectionHandshake(); public UDTSession getSession(); + + public long getPacketSequenceNumber(); + } Modified: udt-java/trunk/src/main/java/udt/UDTReceiver.java =================================================================== --- udt-java/trunk/src/main/java/udt/UDTReceiver.java 2010-04-21 20:36:36 UTC (rev 22) +++ udt-java/trunk/src/main/java/udt/UDTReceiver.java 2010-04-22 10:06:54 UTC (rev 23) @@ -33,8 +33,8 @@ package udt; import java.io.IOException; import java.util.List; -import java.util.concurrent.ArrayBlockingQueue; import java.util.concurrent.BlockingQueue; +import java.util.concurrent.PriorityBlockingQueue; import java.util.concurrent.TimeUnit; import java.util.logging.Level; import java.util.logging.Logger; @@ -110,7 +110,7 @@ long packetArrivalSpeed; //round trip time, calculated from ACK/ACK2 pairs - long roundTripTime=50*1000; + long roundTripTime=0; //round trip time variance long roundTripTimeVar=roundTripTime/2; @@ -135,8 +135,8 @@ //buffer size for storing data private final long bufferSize; - //stores packets to be sent - private final BlockingQueue<UDTPacket>handoffQueue=new ArrayBlockingQueue<UDTPacket>(32); + //stores received packets to be sent + private final BlockingQueue<UDTPacket>handoffQueue; private Thread receiverThread; @@ -162,10 +162,14 @@ packetHistoryWindow = new PacketHistoryWindow(16); receiverLossList = new ReceiverLossList(); packetPairWindow = new PacketPairWindow(16); - nextACK=Util.getCurrentTime()+ACK_INTERVAL; - nextNAK=(long)(Util.getCurrentTime()+1.5*NAK_INTERVAL); - nextEXP=Util.getCurrentTime()+2*EXP_INTERVAL; + largestReceivedSeqNumber=session.getInitialSequenceNumber()-1; bufferSize=session.getReceiveBufferSize(); + + //incoming packets are ordered by sequence number, with control packets having + //preference over data packets + handoffQueue=//new ArrayBlockingQueue<UDTPacket>(session.getFlowWindowSize()); + new PriorityBlockingQueue<UDTPacket>(session.getFlowWindowSize()); + start(); } @@ -174,6 +178,9 @@ Runnable r=new Runnable(){ public void run(){ try{ + nextACK=Util.getCurrentTime()+ACK_INTERVAL; + nextNAK=(long)(Util.getCurrentTime()+1.5*NAK_INTERVAL); + nextEXP=Util.getCurrentTime()+2*EXP_INTERVAL; while(!stopped){ receiverAlgorithm(); } @@ -191,6 +198,8 @@ /* * packets are written by the endpoint */ + long i=0; + long mean=0; protected void receive(UDTPacket p)throws IOException{ handoffQueue.offer(p); } @@ -416,7 +425,6 @@ protected void sendNAK(List<Long>sequenceNumbers)throws IOException{ if(sequenceNumbers.size()==0)return; NegativeAcknowledgement nAckPacket= new NegativeAcknowledgement(); - nAckPacket.addLossInfo(sequenceNumbers); nAckPacket.setSession(session); nAckPacket.setDestinationID(session.getDestination().getSocketID()); @@ -486,7 +494,6 @@ if(roundTripTime>0)roundTripTime = (roundTripTime*7 + rtt)/8; else roundTripTime = rtt; roundTripTimeVar = (roundTripTimeVar* 3 + Math.abs(roundTripTimeVar- rtt)) / 4; - ACK_INTERVAL=4*roundTripTime+roundTripTimeVar+Util.getSYNTime(); NAK_INTERVAL=ACK_INTERVAL; statistics.setRTT(roundTripTime, roundTripTimeVar); Modified: udt-java/trunk/src/main/java/udt/packets/ControlPacket.java =================================================================== --- udt-java/trunk/src/main/java/udt/packets/ControlPacket.java 2010-04-21 20:36:36 UTC (rev 22) +++ udt-java/trunk/src/main/java/udt/packets/ControlPacket.java 2010-04-22 10:06:54 UTC (rev 23) @@ -191,6 +191,14 @@ this.session = session; } + public long getPacketSequenceNumber(){ + return -1; + } + + public int compareTo(UDTPacket other){ + return (int)(getPacketSequenceNumber()-other.getPacketSequenceNumber()); + } + public static enum ControlPacketType { CONNECTION_HANDSHAKE, Modified: udt-java/trunk/src/main/java/udt/packets/DataPacket.java =================================================================== --- udt-java/trunk/src/main/java/udt/packets/DataPacket.java 2010-04-21 20:36:36 UTC (rev 22) +++ udt-java/trunk/src/main/java/udt/packets/DataPacket.java 2010-04-22 10:06:54 UTC (rev 23) @@ -38,7 +38,7 @@ import udt.UDTPacket; import udt.UDTSession; -public class DataPacket implements UDTPacket, Comparable<DataPacket>{ +public class DataPacket implements UDTPacket, Comparable<UDTPacket>{ private byte[] data ; private long packetSequenceNumber; @@ -178,9 +178,7 @@ this.session = session; } - //Compare data packets by their sequence number - public int compareTo(DataPacket other){ - return (int)(other.packetSequenceNumber-packetSequenceNumber); + public int compareTo(UDTPacket other){ + return (int)(getPacketSequenceNumber()-other.getPacketSequenceNumber()); } - } Modified: udt-java/trunk/src/main/java/udt/receiver/AckHistoryWindow.java =================================================================== --- udt-java/trunk/src/main/java/udt/receiver/AckHistoryWindow.java 2010-04-21 20:36:36 UTC (rev 22) +++ udt-java/trunk/src/main/java/udt/receiver/AckHistoryWindow.java 2010-04-22 10:06:54 UTC (rev 23) @@ -36,8 +36,6 @@ /** * a circular array of each sent Ack and the time it is sent out - * - * */ public class AckHistoryWindow extends CircularArray<AckHistoryEntry>{ @@ -47,20 +45,20 @@ /** * return the time for the given seq no, or <code>-1 </code> if not known - * @param seqNo + * @param ackNumber */ - public long getTime(long seqNo){ + public long getTime(long ackNumber){ for(AckHistoryEntry obj: circularArray){ - if(obj.getAckNumber()==seqNo){ + if(obj.getAckNumber()==ackNumber){ return obj.getSentTime(); } } return -1; } - public AckHistoryEntry getEntry(long seqNo){ + public AckHistoryEntry getEntry(long ackNumber){ for(AckHistoryEntry obj: circularArray){ - if(obj.getAckNumber()==seqNo){ + if(obj.getAckNumber()==ackNumber){ return obj; } } Modified: udt-java/trunk/src/main/java/udt/receiver/ReceiverLossList.java =================================================================== --- udt-java/trunk/src/main/java/udt/receiver/ReceiverLossList.java 2010-04-21 20:36:36 UTC (rev 22) +++ udt-java/trunk/src/main/java/udt/receiver/ReceiverLossList.java 2010-04-22 10:06:54 UTC (rev 23) @@ -49,7 +49,7 @@ private final PriorityBlockingQueue<ReceiverLossListEntry>backingList; public ReceiverLossList(){ - backingList = new PriorityBlockingQueue<ReceiverLossListEntry>(16); + backingList = new PriorityBlockingQueue<ReceiverLossListEntry>(32); } public void insert(ReceiverLossListEntry entry){ @@ -94,11 +94,10 @@ */ public List<Long>getFilteredSequenceNumbers(long RTT, boolean doFeedback){ List<Long>result=new ArrayList<Long>(); - long now=Util.getCurrentTime(); ReceiverLossListEntry[]sorted=backingList.toArray(new ReceiverLossListEntry[0]); Arrays.sort(sorted); for(ReceiverLossListEntry e: sorted){ - if( (now-e.getLastFeedbackTime())>e.getK()*RTT){ + if( (Util.getCurrentTime()-e.getLastFeedbackTime())>e.getK()*RTT){ result.add(e.getSequenceNumber()); if(doFeedback)e.feedback(); } Modified: udt-java/trunk/src/main/java/udt/receiver/ReceiverLossListEntry.java =================================================================== --- udt-java/trunk/src/main/java/udt/receiver/ReceiverLossListEntry.java 2010-04-21 20:36:36 UTC (rev 22) +++ udt-java/trunk/src/main/java/udt/receiver/ReceiverLossListEntry.java 2010-04-22 10:06:54 UTC (rev 23) @@ -39,7 +39,7 @@ */ public class ReceiverLossListEntry implements Comparable<ReceiverLossListEntry> { - private final long sequenceNumber ; + private final long sequenceNumber; private long lastFeedbacktime; private long k = 2; Modified: udt-java/trunk/src/main/java/udt/sender/SenderLossList.java =================================================================== --- udt-java/trunk/src/main/java/udt/sender/SenderLossList.java 2010-04-21 20:36:36 UTC (rev 22) +++ udt-java/trunk/src/main/java/udt/sender/SenderLossList.java 2010-04-22 10:06:54 UTC (rev 23) @@ -44,7 +44,7 @@ * create a new sender lost list */ public SenderLossList(){ - backingList = new PriorityBlockingQueue<SenderLossListEntry>(16); + backingList = new PriorityBlockingQueue<SenderLossListEntry>(32); } public void insert(SenderLossListEntry obj){ Modified: udt-java/trunk/src/main/java/udt/util/SendFile.java =================================================================== --- udt-java/trunk/src/main/java/udt/util/SendFile.java 2010-04-21 20:36:36 UTC (rev 22) +++ udt-java/trunk/src/main/java/udt/util/SendFile.java 2010-04-22 10:06:54 UTC (rev 23) @@ -36,6 +36,7 @@ import java.io.FileInputStream; import java.net.InetAddress; import java.nio.ByteBuffer; +import java.text.NumberFormat; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.logging.Logger; @@ -60,9 +61,10 @@ //TODO configure pool size private final ExecutorService threadPool=Executors.newFixedThreadPool(3); - + public SendFile(int serverPort){ this.serverPort=serverPort; + } @Override @@ -115,8 +117,11 @@ private final UDTSocket socket; + private final NumberFormat format=NumberFormat.getNumberInstance(); + public RequestRunner(UDTSocket socket){ this.socket=socket; + format.setMaximumFractionDigits(3); } public void run(){ @@ -149,7 +154,8 @@ Util.copy(fis, out, size, true); long end=System.currentTimeMillis(); System.out.println(socket.getSession().getStatistics().toString()); - System.out.println("[SendFile] Rate: "+1000*size/1024/1024/(end-start)+" MBytes/sec."); + double rate=1000.0*size/1024/1024/(end-start); + System.out.println("[SendFile] Rate: "+format.format(rate)+" MBytes/sec. "+format.format(8*rate)+" MBit/sec."); socket.getSession().getStatistics().writeParameterHistory(new File("udtstats-"+System.currentTimeMillis()+".csv")); }finally{ fis.close(); Modified: udt-java/trunk/src/main/java/udt/util/UDTStatistics.java =================================================================== --- udt-java/trunk/src/main/java/udt/util/UDTStatistics.java 2010-04-21 20:36:36 UTC (rev 22) +++ udt-java/trunk/src/main/java/udt/util/UDTStatistics.java 2010-04-22 10:06:54 UTC (rev 23) @@ -230,5 +230,5 @@ } return hexString.toString(); } - + } Modified: udt-java/trunk/src/main/java/udt/util/Util.java =================================================================== --- udt-java/trunk/src/main/java/udt/util/Util.java 2010-04-21 20:36:36 UTC (rev 22) +++ udt-java/trunk/src/main/java/udt/util/Util.java 2010-04-22 10:06:54 UTC (rev 23) @@ -149,5 +149,5 @@ p.setPort(clientPort); endpoint.sendRaw(p); } - + } Modified: udt-java/trunk/src/test/java/udt/TestList.java =================================================================== --- udt-java/trunk/src/test/java/udt/TestList.java 2010-04-21 20:36:36 UTC (rev 22) +++ udt-java/trunk/src/test/java/udt/TestList.java 2010-04-22 10:06:54 UTC (rev 23) @@ -1,5 +1,10 @@ package udt; +import java.util.concurrent.BlockingQueue; +import java.util.concurrent.PriorityBlockingQueue; + import junit.framework.TestCase; +import udt.packets.DataPacket; +import udt.packets.KeepAlive; import udt.receiver.AckHistoryEntry; import udt.receiver.AckHistoryWindow; import udt.receiver.PacketHistoryWindow; @@ -58,33 +63,23 @@ for(int i=0;i<values.length;i++){ p.add(values[i]); } - //assertEquals(10.0d, p.computeMedianTimeInterval()); + assertEquals(4.0d, p.computeMedianTimeInterval()); - System.out.println(p.toString()); - System.out.println("MedianTimeInterval: "+p.computeMedianTimeInterval()); + long[] arrivaltimes = {12, 12, 12, 12}; + PacketPairWindow p1=new PacketPairWindow(16); + for(int i=0;i<values.length;i++){ + p1.add(arrivaltimes[i]); + } + assertEquals(12.0d, p1.computeMedianTimeInterval()); - System.out.println(p.toString()); - System.out.println("MedianTimeInterval: "+p.computeMedianTimeInterval()); - - //assertEquals(10.0d, p.); - - //long[] arrivaltimes = {12, 12, 12, 12}; - //PacketPairWindow p1=new PacketPairWindow(16); - //for(int i=0;i<values.length;i++){ - // p1.insert(arrivaltimes[i]); - //} - //assertEquals(12.0d, p1.computeMedianTimeInterval()); - } public void testAckHistoryWindow(){ - AckHistoryEntry ackSeqNrA = new AckHistoryEntry( 0,1,1263465050); - + AckHistoryEntry ackSeqNrA = new AckHistoryEntry(0,1,1263465050); AckHistoryEntry ackSeqNrB = new AckHistoryEntry(1,2,1263465054); - AckHistoryEntry ackSeqNrC = new AckHistoryEntry(2,3,1263465058); AckHistoryWindow recvWindow = new AckHistoryWindow(3); @@ -92,10 +87,7 @@ recvWindow.add(ackSeqNrB); recvWindow.add(ackSeqNrC); AckHistoryEntry entryA = recvWindow.getEntry(1); - long storageTimeA = entryA.getSentTime(); - long storageTimeA_ =recvWindow.getTime(1); - System.out.println("storageTimeA bzw A_ "+storageTimeA+" "+storageTimeA_); - + assertEquals(1263465050, entryA.getSentTime()); } public void testSenderLossList1(){ @@ -110,4 +102,30 @@ assertEquals(C,oldest); } + public void testReceiverInputQueue(){ + BlockingQueue<UDTPacket> q=new PriorityBlockingQueue<UDTPacket>(5); + UDTPacket control = new KeepAlive(); + DataPacket d1=new DataPacket(); + d1.setPacketSequenceNumber(1); + DataPacket d2=new DataPacket(); + d2.setPacketSequenceNumber(2); + q.offer(d2); + q.offer(d1); + q.offer(control); + + UDTPacket p1=q.poll(); + assertTrue(p1.isControlPacket()); + + UDTPacket p2=q.poll(); + assertFalse(p2.isControlPacket()); + //check ordering by sequence number + assertEquals(1,p2.getPacketSequenceNumber()); + + UDTPacket p3=q.poll(); + assertFalse(p3.isControlPacket()); + assertEquals(2,p3.getPacketSequenceNumber()); + + + } + } Modified: udt-java/trunk/src/test/java/udt/performance/TestUDTLargeData.java =================================================================== --- udt-java/trunk/src/test/java/udt/performance/TestUDTLargeData.java 2010-04-21 20:36:36 UTC (rev 22) +++ udt-java/trunk/src/test/java/udt/performance/TestUDTLargeData.java 2010-04-22 10:06:54 UTC (rev 23) @@ -3,6 +3,7 @@ import java.io.File; import java.net.InetAddress; import java.security.MessageDigest; +import java.text.NumberFormat; import java.util.Random; import java.util.logging.Level; import java.util.logging.Logger; @@ -20,7 +21,7 @@ boolean running=false; //how many - int num_packets=100; + int num_packets=200; //how large is a single packet int size=1*1024*1024; @@ -38,7 +39,11 @@ doTest(); } + private final NumberFormat format=NumberFormat.getNumberInstance(); + protected void doTest()throws Exception{ + format.setMaximumFractionDigits(2); + if(!running)runServer(); UDTClient client=new UDTClient(InetAddress.getByName("localhost"),12345); client.connect("localhost", 65321); @@ -58,7 +63,8 @@ long block=System.currentTimeMillis(); client.sendBlocking(data); digest.update(data); - System.out.println("Sent block <"+i+"> in "+(System.currentTimeMillis()-block)+" ms"); + double took=System.currentTimeMillis()-block; + System.out.println("Sent block <"+i+"> in "+took+" ms, rate: "+format.format(size/(1024*took))+ " Mbytes/sec"); } end=System.currentTimeMillis(); client.shutdown(); @@ -70,7 +76,7 @@ System.out.println("Done. Sending "+N/1024/1024+" Mbytes took "+(end-start)+" ms"); double mbytes=N/(end-start)/1024; double mbit=8*mbytes; - System.out.println("Rate: "+(int)mbytes+" Mbytes/sec "+(int)mbit+" Mbit/sec"); + System.out.println("Rate: "+format.format(mbytes)+" Mbytes/sec "+format.format(mbit)+" Mbit/sec"); System.out.println("Server received: "+total); assertEquals(N,total); @@ -78,7 +84,7 @@ System.out.println("MD5 hash of data received: "+md5_received); System.out.println(client.getStatistics()); - //assertEquals(md5_sent,md5_received); + assertEquals(md5_sent,md5_received); //store stat history to csv file client.getStatistics().writeParameterHistory(File.createTempFile("/udtstats-",".csv")); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |