private static void readTransactionLog(String logfilepath)
throws FileNotFoundException, IOException, EOFException
{
FileInputStream fis = new FileInputStream(logfilepath);
BinaryInputArchive logStream = BinaryInputArchive.getArchive(fis);
FileHeader fhdr = new FileHeader();
fhdr.deserialize(logStream, "fileheader");
if (fhdr.getMagic() != FileTxnLog.TXNLOG_MAGIC)
{
System.err.println("Invalid magic number for " + logfilepath);
System.exit(2);
}
if (bw != null)
{
bw.write("ZooKeeper Transactional Log File with dbid "
+ fhdr.getDbid() + " txnlog format version " + fhdr.getVersion());
bw.newLine();
} else
{
System.out.println("ZooKeeper Transactional Log File with dbid "
+ fhdr.getDbid() + " txnlog format version " + fhdr.getVersion());
}
int count = 0;
while (true)
{
long crcValue;
byte[] bytes;
try
{
crcValue = logStream.readLong("crcvalue");
bytes = logStream.readBuffer("txnEntry");
} catch (EOFException e)
{
if (bw != null)
{
bw.write("EOF reached after " + count + " txns.");
bw.newLine();
} else
{
System.out.println("EOF reached after " + count + " txns.");
}
break;
}
if (bytes.length == 0)
{
// Since we preallocate, we define EOF to be an
// empty transaction
if (bw != null)
{
bw.write("EOF reached after " + count + " txns.");
bw.newLine();
} else
{
System.out.println("EOF reached after " + count + " txns.");
}
return;
}
Checksum crc = new Adler32();
crc.update(bytes, 0, bytes.length);
if (crcValue != crc.getValue())
{
throw new IOException("CRC doesn't match " + crcValue + " vs "
+ crc.getValue());
}
InputArchive iab = BinaryInputArchive
.getArchive(new ByteArrayInputStream(bytes));
TxnHeader hdr = new TxnHeader();
Record txn = SerializeUtils.deserializeTxn(iab, hdr);
if (bw != null)
{
bw.write(formatTransaction(hdr, txn));
bw.newLine();
} else
{
System.out.println(formatTransaction(hdr, txn));
}
if (logStream.readByte("EOR") != 'B')
{
LOG.error("Last transaction was partial.");
throw new EOFException("Last transaction was partial.");
}
count++;