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

     1  package client
     2  
     3  import (
     4  	"errors"
     5  	"fmt"
     6  	"io"
     7  	"io/ioutil"
     8  
     9  	"github.com/Cloud-Foundations/Dominator/lib/hash"
    10  	"github.com/Cloud-Foundations/Dominator/proto/objectserver"
    11  )
    12  
    13  func (objClient *ObjectClient) getObjects(hashes []hash.Hash) (
    14  	*ObjectsReader, error) {
    15  	client, err := objClient.getClient()
    16  	if err != nil {
    17  		return nil, err
    18  	}
    19  	conn, err := client.Call("ObjectServer.GetObjects")
    20  	if err != nil {
    21  		return nil, errors.New(fmt.Sprintf("Error calling: %s\n", err))
    22  	}
    23  	var request objectserver.GetObjectsRequest
    24  	var reply objectserver.GetObjectsResponse
    25  	request.Exclusive = objClient.exclusiveGet
    26  	request.Hashes = hashes
    27  	conn.Encode(request)
    28  	conn.Flush()
    29  	var objectsReader ObjectsReader
    30  	objectsReader.client = objClient
    31  	objectsReader.reader = conn
    32  	err = conn.Decode(&reply)
    33  	if err != nil {
    34  		return nil, err
    35  	}
    36  	if reply.ResponseString != "" {
    37  		return nil, errors.New(reply.ResponseString)
    38  	}
    39  	objectsReader.nextIndex = -1
    40  	objectsReader.sizes = reply.ObjectSizes
    41  	return &objectsReader, nil
    42  }
    43  
    44  func (or *ObjectsReader) close() error {
    45  	return or.reader.Close()
    46  }
    47  
    48  func (or *ObjectsReader) nextObject() (uint64, io.ReadCloser, error) {
    49  	or.nextIndex++
    50  	if or.nextIndex >= int64(len(or.sizes)) {
    51  		return 0, nil, errors.New("all objects have been consumed")
    52  	}
    53  	size := or.sizes[or.nextIndex]
    54  	return size,
    55  		ioutil.NopCloser(&io.LimitedReader{R: or.reader, N: int64(size)}), nil
    56  }