newMMapStoreReader creates mmap store file reader.
(path, fileName string)
| 73 | |
| 74 | // newMMapStoreReader creates mmap store file reader. |
| 75 | func 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. |
| 122 | func (r *storeMMapReader) initialize() error { |