in cassandra-four-zero/src/main/java/org/apache/cassandra/db/commitlog/SeekableCommitLogSegmentReader.java [141:178]
private int readSyncMarker(CommitLogDescriptor descriptor, int offset, RandomAccessReader reader) throws IOException
{
if (offset > reader.length() - CommitLogSegment.SYNC_MARKER_SIZE)
{
// There was no room in the segment to write a final header. No data could be present here.
return -1;
}
long current = reader.getFilePointer();
if (offset != current)
{
long timeNanos = System.nanoTime();
reader.seek(offset);
logger.info("Seek to position", "from", current, "to", offset, "timeNanos", System.nanoTime() - timeNanos);
}
CRC32 crc = new CRC32();
FBUtilities.updateChecksumInt(crc, (int) (descriptor.id & 0xFFFFFFFFL));
FBUtilities.updateChecksumInt(crc, (int) (descriptor.id >>> 32));
FBUtilities.updateChecksumInt(crc, (int) reader.getPosition());
int end = reader.readInt();
long fileCRC = reader.readInt() & 0xFFFFFFFFL;
if (crc.getValue() != fileCRC)
{
if (end != 0 || fileCRC != 0)
{
String message = String.format("Encountered bad header at position %d of commit log %s, with invalid CRC. "
+ "The end of segment marker should be zero.", offset, reader.getPath());
throw new CommitLogSegmentReader.SegmentReadException(message, true);
}
return -1;
}
else if (end < offset || reader.length() < end)
{
String message = String.format("Encountered bad header at position %d of commit log %s, with bad position but valid CRC",
offset, reader.getPath());
throw new CommitLogSegmentReader.SegmentReadException(message, false);
}
return end;
}