ARTEMIS-1204 Fix getSize() on a closed JDBC File

This commit is contained in:
Martyn Taylor 2017-06-02 14:50:37 +01:00
parent 6314b17667
commit e7c426c5e1
2 changed files with 44 additions and 10 deletions

View File

@ -45,7 +45,7 @@ public class JDBCSequentialFile implements SequentialFile {
private boolean isOpen = false;
private boolean isCreated = false;
private boolean isLoaded = false;
private long id = -1;
@ -88,7 +88,7 @@ public class JDBCSequentialFile implements SequentialFile {
@Override
public boolean exists() {
if (isCreated) return true;
if (isLoaded) return true;
try {
return fileFactory.listFiles(extension).contains(filename);
} catch (Exception e) {
@ -100,12 +100,16 @@ public class JDBCSequentialFile implements SequentialFile {
@Override
public void open() throws Exception {
load();
isOpen = true;
}
private void load() {
try {
if (!isOpen) {
synchronized (writeLock) {
synchronized (writeLock) {
if (!isLoaded) {
dbDriver.openFile(this);
isCreated = true;
isOpen = true;
isLoaded = true;
}
}
} catch (SQLException e) {
@ -141,10 +145,9 @@ public class JDBCSequentialFile implements SequentialFile {
@Override
public void delete() throws IOException, InterruptedException, ActiveMQException {
try {
if (isCreated) {
synchronized (writeLock) {
dbDriver.deleteFile(this);
}
synchronized (writeLock) {
load();
dbDriver.deleteFile(this);
}
} catch (SQLException e) {
fileFactory.onIOError(e, "Error deleting JDBC file.", this);
@ -298,6 +301,7 @@ public class JDBCSequentialFile implements SequentialFile {
@Override
public long size() throws Exception {
load();
return writePosition;
}

View File

@ -186,6 +186,36 @@ public class JDBCSequentialFileFactoryTest {
assertEquals(bufferSize, file.size());
}
/**
* Using a real file system users are not required to call file.open() in order to read the file size. The file
* descriptor has enough information. However, with JDBC we do require that some information is loaded in order to
* get the underlying BLOB. This tests ensures that file.size() returns the correct value, without the user calling
* file.open() with JDBCSequentialFile.
*
* @throws Exception
*/
@Test
public void testGetFileSizeWorksWhenNotOpen() throws Exception {
// Create test file with some data.
int testFileSize = 1024;
String fileName = "testFile.txt";
SequentialFile file = factory.createSequentialFile(fileName);
file.open();
// Write some data to the file
ActiveMQBuffer buffer = ActiveMQBuffers.wrappedBuffer(new byte[1024]);
file.write(buffer, true);
file.close();
try {
// Create a new pointer to the test file and ensure file.size() returns the correct value.
SequentialFile file2 = factory.createSequentialFile(fileName);
assertEquals(testFileSize, file2.size());
} catch (Throwable t) {
t.printStackTrace();
}
}
private void checkData(JDBCSequentialFile file, ActiveMQBuffer expectedData) throws SQLException {
expectedData.resetReaderIndex();