github.com/cloud-foundations/dominator@v0.0.0-20221004181915-6e4fee580046/lib/objectserver/filesystem/check.go (about) 1 package filesystem 2 3 import ( 4 "errors" 5 "fmt" 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) checkObjects(hashes []hash.Hash) ([]uint64, error) { 14 sizesList := make([]uint64, len(hashes)) 15 for index, hash := range hashes { 16 var err error 17 sizesList[index], err = objSrv.checkObject(hash) 18 if err != nil { 19 return nil, err 20 } 21 } 22 return sizesList, nil 23 } 24 25 func (objSrv *ObjectServer) checkObject(hash hash.Hash) (uint64, error) { 26 objSrv.rwLock.RLock() 27 size, ok := objSrv.sizesMap[hash] 28 objSrv.rwLock.RUnlock() 29 if ok { 30 return size, nil 31 } 32 filename := path.Join(objSrv.baseDir, objectcache.HashToFilename(hash)) 33 fi, err := os.Lstat(filename) 34 if err != nil { 35 return 0, nil 36 } 37 if fi.Mode().IsRegular() { 38 if fi.Size() < 1 { 39 return 0, errors.New(fmt.Sprintf("zero length file: %s", filename)) 40 } 41 size := uint64(fi.Size()) 42 objSrv.rwLock.Lock() 43 objSrv.sizesMap[hash] = size 44 objSrv.rwLock.Unlock() 45 return size, nil 46 } 47 return 0, nil 48 }