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 }