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 }