MCPcopy
hub / github.com/lindb/lindb / newMMapStoreReader

Function newMMapStoreReader

kv/table/reader.go:75–119  ·  view source on GitHub ↗

newMMapStoreReader creates mmap store file reader.

(path, fileName string)

Source from the content-addressed store, hash-verified

73
74// newMMapStoreReader creates mmap store file reader.
75func newMMapStoreReader(path, fileName string) (r Reader, err error) {
76 f, err := openFileFn(path)
77 if err != nil {
78 return nil, err
79 }
80 data, err := mapFunc(f)
81 defer func() {
82 if err != nil && len(data) > 0 {
83 defer func() {
84 _ = f.Close()
85 }()
86 // if init err and map data exist, need unmap it
87 if e := unmapFunc(f, data); e != nil {
88 metrics.TableReadStatistics.UnMMapFailures.Incr()
89 tableLogger.Warn("unmap error when new store reader fail",
90 logger.String("path", path), logger.Error(err))
91 } else {
92 metrics.TableReadStatistics.UnMMaps.Incr()
93 }
94 }
95 }()
96 if err != nil {
97 metrics.TableReadStatistics.MMapFailures.Incr()
98 return nil, err
99 }
100 metrics.TableReadStatistics.MMaps.Incr()
101
102 if len(data) < sstFileFooterSize {
103 err = fmt.Errorf("length of sstfile:%s length is too short", path)
104 return nil, err
105 }
106 reader := &storeMMapReader{
107 path: path,
108 fileName: fileName,
109 f: f,
110 fullBlock: data,
111 keys: roaring.New(),
112 }
113
114 if err := reader.initialize(); err != nil {
115 return nil, err
116 }
117
118 return reader, nil
119}
120
121// initialize store reader, reads index block(keys,offset etc.), then caches it.
122func (r *storeMMapReader) initialize() error {

Callers 2

TestReader_FailFunction · 0.85

Calls 5

initializeMethod · 0.95
CloseMethod · 0.65
IncrMethod · 0.45
StringMethod · 0.45
ErrorMethod · 0.45

Tested by 2

TestReader_FailFunction · 0.68