MCPcopy Index your code
hub / github.com/ByteStorage/FlyDB / ReadLogRecord

Method ReadLogRecord

engine/data/data_file.go:61–110  ·  view source on GitHub ↗

ReadLogRecord reads a log record from the data file based on the offset.

(offset int64)

Source from the content-addressed store, hash-verified

59
60// ReadLogRecord reads a log record from the data file based on the offset.
61func (df *DataFile) ReadLogRecord(offset int64) (*LogRecord, int64, error) {
62 fileSize, err := df.IoManager.Size()
63 if err != nil {
64 return nil, 0, err
65 }
66
67 var headerBytes int64 = maxLogRecordHeaderSize
68 if offset+maxLogRecordHeaderSize > fileSize {
69 headerBytes = fileSize - offset
70 }
71
72 // Read header information
73 headerBuf, err := df.readNBytes(headerBytes, offset)
74 if err != nil {
75 return nil, 0, err
76 }
77
78 header, headerSize := decodeLogRecordHeader(headerBuf)
79 // The following conditions indicate reaching the end of the file, directly return EOF
80 if header == nil {
81 return nil, 0, io.EOF
82 }
83 if header.crc == 0 && header.keySize == 0 && header.valueSize == 0 {
84 return nil, 0, io.EOF
85 }
86
87 // Retrieve the lengths of the key and value
88 keySize, valueSize := int64(header.keySize), int64(header.valueSize)
89 var recordSize = headerSize + keySize + valueSize
90
91 logRecord := &LogRecord{Type: header.recordType}
92
93 // Read the actual user-stored key/value data
94 if keySize > 0 || valueSize > 0 {
95 kvBuf, err := df.readNBytes(keySize+valueSize, headerSize+offset)
96 if err != nil {
97 return nil, 0, err
98 }
99 // Decode
100 logRecord.Key = kvBuf[:keySize]
101 logRecord.Value = kvBuf[keySize:]
102 }
103
104 // Verify CRC (check data integrity)
105 crc := getLogRecordCRC(logRecord, headerBuf[crc32.Size:headerSize])
106 if crc != header.crc {
107 return nil, 0, ErrInvalidCRC
108 }
109 return logRecord, recordSize, nil
110}
111
112func (df *DataFile) Write(buf []byte) error {
113 size, err := df.IoManager.Write(buf)

Callers 6

getValueByPositionMethod · 0.95
MergeMethod · 0.80
loadIndexFromHintFileMethod · 0.80

Calls 4

readNBytesMethod · 0.95
decodeLogRecordHeaderFunction · 0.85
getLogRecordCRCFunction · 0.85
SizeMethod · 0.65

Tested by 1