package com.alimama.mdrill.editlog.read;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import com.alimama.mdrill.editlog.defined.HdfsConstants;
public class FSEditLogValidate {
private static final Log LOG = LogFactory.getLog(FSEditLogValidate.class);
public static class EditLogValidation {
private final long endTxId;
private final boolean hasCorruptHeader;
public EditLogValidation( long endTxId,
boolean hasCorruptHeader) {
this.endTxId = endTxId;
this.hasCorruptHeader = hasCorruptHeader;
}
public long getEndTxId() { return endTxId; }
public boolean hasCorruptHeader() { return hasCorruptHeader; }
}
public static EditLogValidation validateEditLog(EditLogInputStream in) {
long lastTxId = HdfsConstants.INVALID_TXID;
long numValid = 0;
FSEditLogOp op = null;
while (true) {
try {
if ((op = in.readOp()) == null) {
break;
}
} catch (Throwable t) {
LOG.warn("Caught exception after reading " + numValid +
" ops from " + in + " while determining its valid length." +
"Position was " , t);
break;
}
if (lastTxId == HdfsConstants.INVALID_TXID
|| op.getTransactionId() > lastTxId) {
lastTxId = op.getTransactionId();
}
numValid++;
}
return new EditLogValidation(lastTxId, false);
}
}