ARTEMIS-1204 Fix getSize() on a closed JDBC File
This commit is contained in:
parent
6314b17667
commit
e7c426c5e1
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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();
|
||||
|
||||
|
|
Loading…
Reference in New Issue