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

     1  package filesystem
     2  
     3  import (
     4  	"errors"
     5  	"io"
     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) getObjects(hashes []hash.Hash) (
    14  	*ObjectsReader, error) {
    15  	objectsReader := ObjectsReader{
    16  		objectServer: objSrv,
    17  		hashes:       hashes,
    18  		nextIndex:    -1,
    19  		sizes:        make([]uint64, 0, len(hashes)),
    20  	}
    21  	for _, hashVal := range hashes {
    22  		size, err := objSrv.checkObject(hashVal)
    23  		if err != nil {
    24  			return nil, err
    25  		}
    26  		if size < 1 {
    27  			hashStr, _ := hashVal.MarshalText()
    28  			return nil, errors.New("missing object: " + string(hashStr))
    29  		}
    30  		objectsReader.sizes = append(objectsReader.sizes, size)
    31  	}
    32  
    33  	return &objectsReader, nil
    34  }
    35  
    36  func (or *ObjectsReader) nextObject() (uint64, io.ReadCloser, error) {
    37  	or.nextIndex++
    38  	if or.nextIndex >= int64(len(or.hashes)) {
    39  		return 0, nil, errors.New("all objects have been consumed")
    40  	}
    41  	filename := path.Join(or.objectServer.baseDir,
    42  		objectcache.HashToFilename(or.hashes[or.nextIndex]))
    43  	file, err := os.Open(filename)
    44  	if err != nil {
    45  		return 0, nil, err
    46  	}
    47  	fi, err := file.Stat()
    48  	if err != nil {
    49  		file.Close()
    50  		return 0, nil, err
    51  	}
    52  	return uint64(fi.Size()), file, nil
    53  }