github.com/cloud-foundations/dominator@v0.0.0-20221004181915-6e4fee580046/lib/objectserver/filesystem/check.go (about)

     1  package filesystem
     2  
     3  import (
     4  	"errors"
     5  	"fmt"
     6  	"os"
     7  	"path"
     8  
     9  	"github.com/Cloud-Foundations/Dominator/lib/hash"
    10  	"github.com/Cloud-Foundations/Dominator/lib/objectcache"
    11  )
    12  
    13  func (objSrv *ObjectServer) checkObjects(hashes []hash.Hash) ([]uint64, error) {
    14  	sizesList := make([]uint64, len(hashes))
    15  	for index, hash := range hashes {
    16  		var err error
    17  		sizesList[index], err = objSrv.checkObject(hash)
    18  		if err != nil {
    19  			return nil, err
    20  		}
    21  	}
    22  	return sizesList, nil
    23  }
    24  
    25  func (objSrv *ObjectServer) checkObject(hash hash.Hash) (uint64, error) {
    26  	objSrv.rwLock.RLock()
    27  	size, ok := objSrv.sizesMap[hash]
    28  	objSrv.rwLock.RUnlock()
    29  	if ok {
    30  		return size, nil
    31  	}
    32  	filename := path.Join(objSrv.baseDir, objectcache.HashToFilename(hash))
    33  	fi, err := os.Lstat(filename)
    34  	if err != nil {
    35  		return 0, nil
    36  	}
    37  	if fi.Mode().IsRegular() {
    38  		if fi.Size() < 1 {
    39  			return 0, errors.New(fmt.Sprintf("zero length file: %s", filename))
    40  		}
    41  		size := uint64(fi.Size())
    42  		objSrv.rwLock.Lock()
    43  		objSrv.sizesMap[hash] = size
    44  		objSrv.rwLock.Unlock()
    45  		return size, nil
    46  	}
    47  	return 0, nil
    48  }