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 }