Repository: thrift Updated Branches: refs/heads/master 988b3e9bd -> de3e17ad3
THRIFT-3854 add a way in java to clear TFramedTransport read buffers Client: Java Patch: Chris Lockfort <clockf...@palantir.com> This closes #1164 This closes #1081 Project: http://git-wip-us.apache.org/repos/asf/thrift/repo Commit: http://git-wip-us.apache.org/repos/asf/thrift/commit/de3e17ad Tree: http://git-wip-us.apache.org/repos/asf/thrift/tree/de3e17ad Diff: http://git-wip-us.apache.org/repos/asf/thrift/diff/de3e17ad Branch: refs/heads/master Commit: de3e17ad39a57163a42ab89d559356f4cee27c4a Parents: 988b3e9 Author: James E. King, III <jk...@apache.org> Authored: Fri Jan 27 23:36:31 2017 -0500 Committer: James E. King, III <jk...@apache.org> Committed: Fri Jan 27 23:36:31 2017 -0500 ---------------------------------------------------------------------- .../thrift/transport/TFastFramedTransport.java | 8 +++++- .../thrift/transport/TFramedTransport.java | 15 ++++++----- .../transport/TestTFastFramedTransport.java | 6 +++-- .../thrift/transport/TestTFramedTransport.java | 28 ++++++++++++++++++++ 4 files changed, 48 insertions(+), 9 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/thrift/blob/de3e17ad/lib/java/src/org/apache/thrift/transport/TFastFramedTransport.java ---------------------------------------------------------------------- diff --git a/lib/java/src/org/apache/thrift/transport/TFastFramedTransport.java b/lib/java/src/org/apache/thrift/transport/TFastFramedTransport.java index 0398ca7..d265600 100644 --- a/lib/java/src/org/apache/thrift/transport/TFastFramedTransport.java +++ b/lib/java/src/org/apache/thrift/transport/TFastFramedTransport.java @@ -65,7 +65,8 @@ public class TFastFramedTransport extends TTransport { private final TTransport underlying; private final AutoExpandingBufferWriteTransport writeBuffer; - private final AutoExpandingBufferReadTransport readBuffer; + private AutoExpandingBufferReadTransport readBuffer; + private final int initialBufferCapacity; private final byte[] i32buf = new byte[4]; private final int maxLength; @@ -104,6 +105,7 @@ public class TFastFramedTransport extends TTransport { public TFastFramedTransport(TTransport underlying, int initialBufferCapacity, int maxLength) { this.underlying = underlying; this.maxLength = maxLength; + this.initialBufferCapacity = initialBufferCapacity; writeBuffer = new AutoExpandingBufferWriteTransport(initialBufferCapacity, 1.5); readBuffer = new AutoExpandingBufferReadTransport(initialBufferCapacity, 1.5); } @@ -164,6 +166,10 @@ public class TFastFramedTransport extends TTransport { readBuffer.consumeBuffer(len); } + public void clear() { + readBuffer = new AutoExpandingBufferReadTransport(initialBufferCapacity, 1.5); + } + @Override public void flush() throws TTransportException { int length = writeBuffer.getPos(); http://git-wip-us.apache.org/repos/asf/thrift/blob/de3e17ad/lib/java/src/org/apache/thrift/transport/TFramedTransport.java ---------------------------------------------------------------------- diff --git a/lib/java/src/org/apache/thrift/transport/TFramedTransport.java b/lib/java/src/org/apache/thrift/transport/TFramedTransport.java index f7d220c..fa531ef 100644 --- a/lib/java/src/org/apache/thrift/transport/TFramedTransport.java +++ b/lib/java/src/org/apache/thrift/transport/TFramedTransport.java @@ -45,7 +45,8 @@ public class TFramedTransport extends TTransport { /** * Buffer for input */ - private TMemoryInputTransport readBuffer_ = new TMemoryInputTransport(new byte[0]); + private final TMemoryInputTransport readBuffer_ = + new TMemoryInputTransport(new byte[0]); public static class Factory extends TTransportFactory { private int maxLength_; @@ -90,11 +91,9 @@ public class TFramedTransport extends TTransport { } public int read(byte[] buf, int off, int len) throws TTransportException { - if (readBuffer_ != null) { - int got = readBuffer_.read(buf, off, len); - if (got > 0) { - return got; - } + int got = readBuffer_.read(buf, off, len); + if (got > 0) { + return got; } // Read another frame of data @@ -123,6 +122,10 @@ public class TFramedTransport extends TTransport { readBuffer_.consumeBuffer(len); } + public void clear() { + readBuffer_.clear(); + } + private final byte[] i32buf = new byte[4]; private void readFrame() throws TTransportException { http://git-wip-us.apache.org/repos/asf/thrift/blob/de3e17ad/lib/java/test/org/apache/thrift/transport/TestTFastFramedTransport.java ---------------------------------------------------------------------- diff --git a/lib/java/test/org/apache/thrift/transport/TestTFastFramedTransport.java b/lib/java/test/org/apache/thrift/transport/TestTFastFramedTransport.java index 11fbdf4..06ee206 100644 --- a/lib/java/test/org/apache/thrift/transport/TestTFastFramedTransport.java +++ b/lib/java/test/org/apache/thrift/transport/TestTFastFramedTransport.java @@ -19,13 +19,15 @@ package org.apache.thrift.transport; public class TestTFastFramedTransport extends TestTFramedTransport { + protected final static int INITIAL_CAPACITY = 50; + @Override protected TTransport getTransport(TTransport underlying) { - return new TFastFramedTransport(underlying, 50, 10 * 1024 * 1024); + return new TFastFramedTransport(underlying, INITIAL_CAPACITY, 10 * 1024 * 1024); } @Override protected TTransport getTransport(TTransport underlying, int maxLength) { - return new TFastFramedTransport(underlying, 50, maxLength); + return new TFastFramedTransport(underlying, INITIAL_CAPACITY, maxLength); } } http://git-wip-us.apache.org/repos/asf/thrift/blob/de3e17ad/lib/java/test/org/apache/thrift/transport/TestTFramedTransport.java ---------------------------------------------------------------------- diff --git a/lib/java/test/org/apache/thrift/transport/TestTFramedTransport.java b/lib/java/test/org/apache/thrift/transport/TestTFramedTransport.java index 6cebd3c..7e889d6 100644 --- a/lib/java/test/org/apache/thrift/transport/TestTFramedTransport.java +++ b/lib/java/test/org/apache/thrift/transport/TestTFramedTransport.java @@ -183,4 +183,32 @@ public class TestTFramedTransport extends TestCase { assertEquals(65, trans.getBytesRemainingInBuffer()); assertEquals(10, trans.getBufferPosition()); } + + public void testClear() throws IOException, TTransportException { + ByteArrayOutputStream baos = new ByteArrayOutputStream(); + DataOutputStream dos = new DataOutputStream(baos); + dos.writeInt(220); + dos.write(byteSequence(0, 219)); + + TMemoryBuffer membuf = new TMemoryBuffer(0); + membuf.write(baos.toByteArray()); + + ReadCountingTransport countTrans = new ReadCountingTransport(membuf); + TTransport trans = getTransport(countTrans); + + byte[] readBuf = new byte[220]; + trans.read(readBuf, 0, 220); + assertTrue(Arrays.equals(readBuf, byteSequence(0,219))); + + assertTrue(trans instanceof TFramedTransport || trans instanceof TFastFramedTransport); + if (trans instanceof TFramedTransport) { + assertTrue(trans.getBuffer() != null && trans.getBuffer().length > 0); + ((TFramedTransport) trans).clear(); + assertTrue(trans.getBuffer() == null); + } else if (trans instanceof TFastFramedTransport) { + assertTrue(trans.getBuffer().length > TestTFastFramedTransport.INITIAL_CAPACITY); + ((TFastFramedTransport) trans).clear(); + assertTrue(trans.getBuffer().length == TestTFastFramedTransport.INITIAL_CAPACITY); + } + } }