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  }