MCPcopy Create free account
hub / github.com/nutsdb/nutsdb / readEntry

Method readEntry

recovery_reader.go:38–94  ·  view source on GitHub ↗

readEntry will read an Entry from disk.

(off int64)

Source from the content-addressed store, hash-verified

36
37// readEntry will read an Entry from disk.
38func (fr *fileRecovery) readEntry(off int64) (e *core.Entry, err error) {
39 var size int64 = core.MaxEntryHeaderSize
40 // Since core.MaxEntryHeaderSize may be larger than the actual Header, it needs to be calculated
41 if off+size > fr.size {
42 size = fr.size - off
43 }
44
45 buf := make([]byte, size)
46 _, err = fr.fd.Seek(off, 0)
47 if err != nil {
48 return nil, err
49 }
50
51 _, err = fr.fd.Read(buf)
52 if err != nil {
53 return nil, err
54 }
55
56 e = new(core.Entry)
57 headerSize, err := e.ParseMeta(buf)
58 if err != nil {
59 return nil, err
60 }
61
62 if e.IsZero() {
63 return nil, nil
64 }
65
66 headerBuf := buf[:headerSize]
67 remainingBuf := buf[headerSize:]
68
69 payloadSize := e.Meta.PayloadSize()
70 dataBuf := make([]byte, payloadSize)
71 excessSize := size - headerSize
72
73 if payloadSize <= excessSize {
74 copy(dataBuf, remainingBuf[:payloadSize])
75 } else {
76 copy(dataBuf, remainingBuf)
77 _, err := fr.fd.Read(dataBuf[excessSize:])
78 if err != nil {
79 return nil, err
80 }
81 }
82
83 err = e.ParsePayload(dataBuf)
84 if err != nil {
85 return nil, err
86 }
87
88 crc := e.GetCrc(headerBuf)
89 if crc != e.Meta.Crc {
90 return nil, ErrCrc
91 }
92
93 return e, nil
94}
95

Callers 5

Test_readEntryFunction · 0.80
rewriteFileMethod · 0.80
mergeLegacyMethod · 0.80
parseDataFilesMethod · 0.80

Calls 7

SeekMethod · 0.80
ReadMethod · 0.80
ParseMetaMethod · 0.80
IsZeroMethod · 0.80
PayloadSizeMethod · 0.80
ParsePayloadMethod · 0.80
GetCrcMethod · 0.80

Tested by 1

Test_readEntryFunction · 0.64