github.com/nutsdb/nutsdb@v1.0.4/file_manager.go (about) 1 package nutsdb 2 3 import ( 4 "github.com/xujiajun/mmap-go" 5 ) 6 7 // fileManager holds the fd cache and file-related operations go through the manager to obtain the file processing object 8 type fileManager struct { 9 rwMode RWMode 10 fdm *fdManager 11 segmentSize int64 12 } 13 14 // newFileManager will create a newFileManager object 15 func newFileManager(rwMode RWMode, maxFdNums int, cleanThreshold float64, segmentSize int64) (fm *fileManager) { 16 fm = &fileManager{ 17 rwMode: rwMode, 18 fdm: newFdm(maxFdNums, cleanThreshold), 19 segmentSize: segmentSize, 20 } 21 return fm 22 } 23 24 // getDataFile will return a DataFile Object 25 func (fm *fileManager) getDataFile(path string, capacity int64) (datafile *DataFile, err error) { 26 if capacity <= 0 { 27 return nil, ErrCapacity 28 } 29 30 var rwManager RWManager 31 32 if fm.rwMode == FileIO { 33 rwManager, err = fm.getFileRWManager(path, capacity, fm.segmentSize) 34 if err != nil { 35 return nil, err 36 } 37 } 38 39 if fm.rwMode == MMap { 40 rwManager, err = fm.getMMapRWManager(path, capacity, fm.segmentSize) 41 if err != nil { 42 return nil, err 43 } 44 } 45 46 return NewDataFile(path, rwManager), nil 47 } 48 49 // getFileRWManager will return a FileIORWManager Object 50 func (fm *fileManager) getFileRWManager(path string, capacity int64, segmentSize int64) (*FileIORWManager, error) { 51 fd, err := fm.fdm.getFd(path) 52 if err != nil { 53 return nil, err 54 } 55 err = Truncate(path, capacity, fd) 56 if err != nil { 57 return nil, err 58 } 59 60 return &FileIORWManager{fd: fd, path: path, fdm: fm.fdm, segmentSize: segmentSize}, nil 61 } 62 63 // getMMapRWManager will return a MMapRWManager Object 64 func (fm *fileManager) getMMapRWManager(path string, capacity int64, segmentSize int64) (*MMapRWManager, error) { 65 fd, err := fm.fdm.getFd(path) 66 if err != nil { 67 return nil, err 68 } 69 70 err = Truncate(path, capacity, fd) 71 if err != nil { 72 return nil, err 73 } 74 75 m, err := mmap.Map(fd, mmap.RDWR, 0) 76 if err != nil { 77 return nil, err 78 } 79 80 return &MMapRWManager{m: m, path: path, fdm: fm.fdm, segmentSize: segmentSize}, nil 81 } 82 83 // close will close fdm resource 84 func (fm *fileManager) close() error { 85 err := fm.fdm.close() 86 return err 87 }