ObjectOutputStream oos = null;
try
{
m_compactionJournal.truncate();
m_compactionJournal.writeData(new Binary(JOURNAL_VERSION));
OutputStream ostream = m_compactionJournal.getOutputStream();
oos = new ObjectOutputStream(ostream);
int nPreservedCount = 0;
int nDiscardedCount = 0;
RecordIterator itr = new RecordIterator(m_journal);
while (itr.hasNext())
{
GenericJournalRecord currentRec = (GenericJournalRecord)itr.next();
Xid currentXid = currentRec.getXid();
if (m_activeXids.contains(currentXid) || m_indoubtXids.contains(currentXid))
{
nPreservedCount++;
oos.writeObject(currentRec);
}
else
{
nDiscardedCount++;
}
}
itr.close();
//Finish writing new journal, ensuring that records have been written to disk
oos.writeObject(null);
oos.flush();
//Swap the journal pointer on-disk
writeActiveJournalPointer((m_compactionJournalFile.getName().equals(JOURNAL_FILE1_NAME)) ? (byte)1 : (byte)2);
//Clears the old journal (must be done *after* swapping journal pointer on-disk)
m_journal.writeData(new Binary(JOURNAL_VERSION));
if (s_logger.isDebugEnabled())
{
s_logger.debug("Compaction done: " + nDiscardedCount + " records discarded, " + nPreservedCount + " preserved.");
}