ARTEMIS-135 - Fix on journal load

https://issues.apache.org/jira/browse/ARTEMIS-135

This is importing a recent fix from the journal on the old version.
If a crash happened between the create file and the fill of the file the
file wouldn't be loaded and the server wouldn't start until you removed the offending file
This commit is contained in:
Tomas Hofman 2015-06-10 20:27:55 -04:00 committed by Clebert Suconic
parent 6738e81f4c
commit 72354ee38f
3 changed files with 39 additions and 7 deletions

View File

@ -375,18 +375,25 @@ public class JournalImpl extends JournalBase implements TestableJournal, Journal
{
SequentialFile file = fileFactory.createSequentialFile(fileName, filesRepository.getMaxAIO());
file.open(1, false);
try
if (file.size() >= SIZE_HEADER)
{
file.open(1, false);
JournalFileImpl jrnFile = readFileHeader(file);
try
{
JournalFileImpl jrnFile = readFileHeader(file);
orderedFiles.add(jrnFile);
orderedFiles.add(jrnFile);
}
finally
{
file.close();
}
}
finally
else
{
file.close();
ActiveMQJournalLogger.LOGGER.ignoringShortFile(fileName);
file.delete();
}
}

View File

@ -269,4 +269,8 @@ public interface ActiveMQJournalLogger extends BasicLogger
@Message(id = 144006, value = "IOError code {0}, {1}", format = Message.Format.MESSAGE_FORMAT)
void ioError(final int errorCode, final String errorMessage);
@LogMessage(level = Logger.Level.WARN)
@Message(id = 144007, value = "Ignoring journal file {0}: file is shorter then minimum header size. This file is being removed.", format = Message.Format.MESSAGE_FORMAT)
void ignoringShortFile(String fileName);
}

View File

@ -18,6 +18,7 @@ package org.apache.activemq.artemis.tests.unit.core.journal.impl;
import java.nio.ByteBuffer;
import java.util.List;
import java.io.File;
import org.apache.activemq.artemis.api.core.ActiveMQException;
import org.apache.activemq.artemis.api.core.ActiveMQIOErrorException;
@ -3222,6 +3223,26 @@ public abstract class JournalImplTestUnit extends JournalImplTestBase
}
@Test
public void testLoadTruncatedFile() throws Exception
{
setup(2, 2 * 1024, true);
createJournal();
startJournal();
String testDir = getTestDir();
new File(testDir + File.separator + filePrefix + "-1." + fileExtension).createNewFile();
try
{
load();
}
catch (Exception e)
{
Assert.fail("Unexpected exception: " + e.toString());
}
}
protected abstract int getAlignment();
}