From be3d3bd29ea41ee1e6da38cd3b449f7a6cea13f0 Mon Sep 17 00:00:00 2001 From: kaloyane <kaloyane> Date: Mon, 23 May 2011 15:24:18 +0000 Subject: [PATCH] LMS=2255: queue persister should not break if the queue file is shorter than header size SVN: 21444 --- .../RecordBasedQueuePersister.java | 2 +- .../RecordBasedQueuePersisterTest.java | 28 ++++++++++++++++++- 2 files changed, 28 insertions(+), 2 deletions(-) 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 663f8831bd8..035118c0df1 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 af8a22216d1..c320907f186 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()); + } + } -- GitLab