diff --git a/common/source/java/ch/systemsx/cisd/common/collections/RecordBasedQueuePersister.java b/common/source/java/ch/systemsx/cisd/common/collections/RecordBasedQueuePersister.java index 663f8831bd8eea4f4bcfa5acd8b8d0f32499661c..035118c0df1d97f39236c865a3493978f1bee0b0 100644 --- a/common/source/java/ch/systemsx/cisd/common/collections/RecordBasedQueuePersister.java +++ b/common/source/java/ch/systemsx/cisd/common/collections/RecordBasedQueuePersister.java @@ -143,7 +143,7 @@ public class RecordBasedQueuePersister<E> implements IQueuePersister<E> try { this.randomAccessFile = new RandomAccessFile(queueFile, "rw"); - if (randomAccessFile.length() == 0) + if (randomAccessFile.length() < HEADER_LENGTH) { this.recordSize = initialRecordSize; writeFullHeader(randomAccessFile, firstRecord, lastRecord, initialRecordSize); diff --git a/common/sourceTest/java/ch/systemsx/cisd/common/collections/RecordBasedQueuePersisterTest.java b/common/sourceTest/java/ch/systemsx/cisd/common/collections/RecordBasedQueuePersisterTest.java index af8a22216d1e182f57fae14a362df25d4e4bdf98..c320907f186d131e3452ac0d0c53b92619bd854a 100644 --- a/common/sourceTest/java/ch/systemsx/cisd/common/collections/RecordBasedQueuePersisterTest.java +++ b/common/sourceTest/java/ch/systemsx/cisd/common/collections/RecordBasedQueuePersisterTest.java @@ -17,6 +17,7 @@ package ch.systemsx.cisd.common.collections; import java.io.File; +import java.io.RandomAccessFile; import java.util.concurrent.ArrayBlockingQueue; import org.testng.AssertJUnit; @@ -58,7 +59,7 @@ public class RecordBasedQueuePersisterTest extends AssertJUnit public void testPersist() { String element = - "a string with more characters then " + "a string with more characters than " + "RecordBasedQueuePersister.DEFAULT_INITIAL_RECORD_SIZE"; assertEquals(true, element.length() > RecordBasedQueuePersister.DEFAULT_INITIAL_RECORD_SIZE); queue.add(element); @@ -100,4 +101,29 @@ public class RecordBasedQueuePersisterTest extends AssertJUnit assertEquals("", queue.poll()); assertEquals("foo", queue.poll()); } + + @Test + public void testQueueFileSizeLessThanHeaderSize() throws Exception + { + assertEquals("Couldn't delete " + TMP, true, FileUtilities.deleteRecursively(TMP)); + TMP.mkdirs(); + queue = new ArrayBlockingQueue<String>(10); + + // write a data shorter than header size + RandomAccessFile tooShortRaf = new RandomAccessFile(QUEUE_FILE, "rw"); + tooShortRaf.writeInt(1); + tooShortRaf.close(); + + persister = new RecordBasedQueuePersister<String>(queue, QUEUE_FILE); + + queue.add("test"); + persister.persist(); + persister.close(); + queue.clear(); + persister = new RecordBasedQueuePersister<String>(queue, QUEUE_FILE); + + assertEquals(1, queue.size()); + assertEquals("test", queue.poll()); + } + }