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

     1  package memory
     2  
     3  import (
     4  	"bytes"
     5  	"errors"
     6  	"io"
     7  	"io/ioutil"
     8  
     9  	"github.com/Cloud-Foundations/Dominator/lib/hash"
    10  )
    11  
    12  func (objSrv *ObjectServer) getData(hashVal hash.Hash) ([]byte, error) {
    13  	objSrv.rwLock.RLock()
    14  	defer objSrv.rwLock.RUnlock()
    15  	if data, ok := objSrv.objectMap[hashVal]; !ok {
    16  		hashStr, _ := hashVal.MarshalText()
    17  		return nil, errors.New("missing object: " + string(hashStr))
    18  	} else {
    19  		return data, nil
    20  	}
    21  }
    22  
    23  func (objSrv *ObjectServer) getObject(hashVal hash.Hash) (
    24  	uint64, io.ReadCloser, error) {
    25  	if data, err := objSrv.getData(hashVal); err != nil {
    26  		return 0, nil, err
    27  	} else {
    28  		return uint64(len(data)), ioutil.NopCloser(bytes.NewReader(data)), nil
    29  	}
    30  }
    31  
    32  func (objSrv *ObjectServer) getObjects(hashes []hash.Hash) (
    33  	*ObjectsReader, error) {
    34  	objectsReader := ObjectsReader{
    35  		objectServer: objSrv,
    36  		hashes:       hashes,
    37  		nextIndex:    -1,
    38  		sizes:        make([]uint64, 0, len(hashes)),
    39  	}
    40  	for _, hashVal := range hashes {
    41  		data, err := objSrv.getData(hashVal)
    42  		if err != nil {
    43  			return nil, err
    44  		}
    45  		objectsReader.sizes = append(objectsReader.sizes, uint64(len(data)))
    46  	}
    47  	return &objectsReader, nil
    48  }
    49  
    50  func (or *ObjectsReader) nextObject() (uint64, io.ReadCloser, error) {
    51  	or.nextIndex++
    52  	if or.nextIndex >= int64(len(or.hashes)) {
    53  		return 0, nil, errors.New("all objects have been consumed")
    54  	}
    55  	return or.objectServer.getObject(or.hashes[or.nextIndex])
    56  }