sashapolo commented on code in PR #6839:
URL: https://github.com/apache/ignite-3/pull/6839#discussion_r2480321729
##########
modules/raft/src/main/java/org/apache/ignite/internal/raft/storage/segstore/SegmentFileManager.java:
##########
@@ -429,6 +479,100 @@ private long maxPossibleEntrySize() {
return
segmentFile.buffer().position(segmentFilePointer.payloadOffset());
}
+ private WriteModeIndexMemTable recoverMemtable(SegmentFile segmentFile,
Path segmentFilePath) {
+ ByteBuffer buffer = segmentFile.buffer();
+
+ validateSegmentFileHeader(buffer, segmentFilePath);
+
+ var memtable = new IndexMemTable(stripes);
+
+ while (buffer.remaining() > SWITCH_SEGMENT_RECORD.length) {
+ int segmentFilePayloadOffset = buffer.position();
+
+ long groupId = buffer.getLong();
+
+ int payloadLength = buffer.getInt();
+
+ int endOfRecordPosition = buffer.position() + payloadLength +
HASH_SIZE_BYTES;
+
+ long index = VarlenEncoder.readLong(buffer);
+
+ memtable.appendSegmentFileOffset(groupId, index,
segmentFilePayloadOffset);
+
+ buffer.position(endOfRecordPosition);
+ }
+
+ return memtable;
+ }
+
+ /**
+ * Creates an index memtable from the given segment file. Unlike {@link
#recoverMemtable} which is expected to only be called on
+ * "complete" segment files (i.e. those that has experienced a rollover),
this method is expected to be called on the most recent,
+ * possibly incomplete segment file.
+ */
+ private WriteModeIndexMemTable recoverLatestMemtable(SegmentFile
segmentFile, Path segmentFilePath) {
+ ByteBuffer buffer = segmentFile.buffer();
+
+ validateSegmentFileHeader(buffer, segmentFilePath);
+
+ var memtable = new IndexMemTable(stripes);
+
+ while (buffer.remaining() > SWITCH_SEGMENT_RECORD.length) {
+ int segmentFilePayloadOffset = buffer.position();
+
+ long groupId = buffer.getLong();
+
+ int payloadLength = buffer.getInt();
+
+ int crcPosition = buffer.position() + payloadLength;
+
+ long index = VarlenEncoder.readLong(buffer);
+
+ int crc = buffer.getInt(crcPosition);
+
+ buffer.position(segmentFilePayloadOffset);
+
+ int expectedCrc = FastCrc.calcCrc(buffer, crcPosition -
segmentFilePayloadOffset);
+
+ // CRC violation signals the end of meaningful data in the segment
file.
+ if (crc != expectedCrc) {
+ break;
+ }
+
+ memtable.appendSegmentFileOffset(groupId, index,
segmentFilePayloadOffset);
+ }
+
+ return memtable;
+ }
+
+ private static void validateSegmentFileHeader(ByteBuffer buffer, Path
segmentFilePath) {
+ int magicNumber = buffer.getInt();
+
+ if (magicNumber != MAGIC_NUMBER) {
Review Comment:
Just a sanity check that the file type is correct
--
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
To unsubscribe, e-mail: [email protected]
For queries about this service, please contact Infrastructure at:
[email protected]