Repository: activemq-artemis Updated Branches: refs/heads/1.x 3388f68fe -> 0767e13f1
ARTEMIS-1810 JDBCSequentialFileFactoryDriver should check <=0 read length (cherry picked from commit 3d30a98b23ae6bd17db8c44efaae2955f308d13e) Project: http://git-wip-us.apache.org/repos/asf/activemq-artemis/repo Commit: http://git-wip-us.apache.org/repos/asf/activemq-artemis/commit/0767e13f Tree: http://git-wip-us.apache.org/repos/asf/activemq-artemis/tree/0767e13f Diff: http://git-wip-us.apache.org/repos/asf/activemq-artemis/diff/0767e13f Branch: refs/heads/1.x Commit: 0767e13f11777323b7fb416716701d25bb0ecd26 Parents: 3388f68 Author: Francesco Nigro <[email protected]> Authored: Mon Apr 16 13:20:22 2018 +0200 Committer: Francesco Nigro <[email protected]> Committed: Wed Apr 18 17:27:21 2018 +0200 ---------------------------------------------------------------------- .../file/JDBCSequentialFileFactoryDriver.java | 22 +++++-- .../file/JDBCSequentialFileFactoryTest.java | 60 ++++++++++++++++++++ 2 files changed, 76 insertions(+), 6 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/0767e13f/artemis-jdbc-store/src/main/java/org/apache/activemq/artemis/jdbc/store/file/JDBCSequentialFileFactoryDriver.java ---------------------------------------------------------------------- diff --git a/artemis-jdbc-store/src/main/java/org/apache/activemq/artemis/jdbc/store/file/JDBCSequentialFileFactoryDriver.java b/artemis-jdbc-store/src/main/java/org/apache/activemq/artemis/jdbc/store/file/JDBCSequentialFileFactoryDriver.java index fdd7c76..14ad25e 100644 --- a/artemis-jdbc-store/src/main/java/org/apache/activemq/artemis/jdbc/store/file/JDBCSequentialFileFactoryDriver.java +++ b/artemis-jdbc-store/src/main/java/org/apache/activemq/artemis/jdbc/store/file/JDBCSequentialFileFactoryDriver.java @@ -294,17 +294,27 @@ public class JDBCSequentialFileFactoryDriver extends AbstractJDBCDriver { if (rs.next()) { final Blob blob = rs.getBlob(1); if (blob != null) { - readLength = (int) calculateReadLength(blob.length(), bytes.remaining(), file.position()); - byte[] data = blob.getBytes(file.position() + 1, readLength); - bytes.put(data); + final long blobLength = blob.length(); + final int bytesRemaining = bytes.remaining(); + final long filePosition = file.position(); + readLength = (int) calculateReadLength(blobLength, bytesRemaining, filePosition); + if (logger.isDebugEnabled()) { + logger.debugf("trying read %d bytes: blobLength = %d bytesRemaining = %d filePosition = %d", + readLength, blobLength, bytesRemaining, filePosition); + } + if (readLength < 0) { + readLength = -1; + } else if (readLength > 0) { + byte[] data = blob.getBytes(file.position() + 1, readLength); + bytes.put(data); + } } } connection.commit(); return readLength; - } catch (Throwable e) { - throw e; - } finally { + } catch (SQLException e) { connection.rollback(); + throw e; } } } http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/0767e13f/artemis-jdbc-store/src/test/java/org/apache/activemq/artemis/jdbc/file/JDBCSequentialFileFactoryTest.java ---------------------------------------------------------------------- diff --git a/artemis-jdbc-store/src/test/java/org/apache/activemq/artemis/jdbc/file/JDBCSequentialFileFactoryTest.java b/artemis-jdbc-store/src/test/java/org/apache/activemq/artemis/jdbc/file/JDBCSequentialFileFactoryTest.java index d763709..d567f84 100644 --- a/artemis-jdbc-store/src/test/java/org/apache/activemq/artemis/jdbc/file/JDBCSequentialFileFactoryTest.java +++ b/artemis-jdbc-store/src/test/java/org/apache/activemq/artemis/jdbc/file/JDBCSequentialFileFactoryTest.java @@ -97,6 +97,66 @@ public class JDBCSequentialFileFactoryTest { } @Test + public void testReadZeroBytesOnEmptyFile() throws Exception { + JDBCSequentialFile file = (JDBCSequentialFile) factory.createSequentialFile("test.txt"); + file.open(); + try { + final ByteBuffer readBuffer = ByteBuffer.allocate(0); + final int bytes = file.read(readBuffer); + assertEquals(0, bytes); + } finally { + file.close(); + } + } + + @Test + public void testReadZeroBytesOnNotEmptyFile() throws Exception { + final int fileLength = 8; + JDBCSequentialFile file = (JDBCSequentialFile) factory.createSequentialFile("test.txt"); + file.open(); + try { + file.writeDirect(ByteBuffer.allocate(fileLength), true); + assertEquals(fileLength, file.size()); + final ByteBuffer readBuffer = ByteBuffer.allocate(0); + final int bytes = file.read(readBuffer); + assertEquals(0, bytes); + } finally { + file.close(); + } + } + + @Test + public void testReadOutOfBoundsOnEmptyFile() throws Exception { + JDBCSequentialFile file = (JDBCSequentialFile) factory.createSequentialFile("test.txt"); + file.open(); + try { + final ByteBuffer readBuffer = ByteBuffer.allocate(1); + file.position(1); + final int bytes = file.read(readBuffer); + assertTrue("bytes read should be < 0", bytes < 0); + } finally { + file.close(); + } + } + + @Test + public void testReadOutOfBoundsOnNotEmptyFile() throws Exception { + final int fileLength = 8; + JDBCSequentialFile file = (JDBCSequentialFile) factory.createSequentialFile("test.txt"); + file.open(); + try { + file.writeDirect(ByteBuffer.allocate(fileLength), true); + assertEquals(fileLength, file.size()); + file.position(fileLength + 1); + final ByteBuffer readBuffer = ByteBuffer.allocate(fileLength); + final int bytes = file.read(readBuffer); + assertTrue("bytes read should be < 0", bytes < 0); + } finally { + file.close(); + } + } + + @Test public void testCreateFiles() throws Exception { int noFiles = 100; List<SequentialFile> files = new LinkedList<>();
