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