github.com/Cloud-Foundations/Dominator@v0.3.4/lib/image/getMissingObjects.go (about) 1 package image 2 3 import ( 4 "errors" 5 "time" 6 7 "github.com/Cloud-Foundations/Dominator/lib/format" 8 "github.com/Cloud-Foundations/Dominator/lib/hash" 9 "github.com/Cloud-Foundations/Dominator/lib/log" 10 "github.com/Cloud-Foundations/Dominator/lib/objectserver" 11 ) 12 13 func (image *Image) getMissingObjects(objectServer objectserver.ObjectServer, 14 objectsGetter objectserver.ObjectsGetter, logger log.DebugLogger) error { 15 missingObjects, err := image.ListMissingObjects(objectServer) 16 if err != nil { 17 return err 18 } 19 if len(missingObjects) < 1 { 20 return nil 21 } 22 var numObjects uint64 23 image.ForEachObject(func(hashVal hash.Hash) error { 24 numObjects++ 25 return nil 26 }) 27 logger.Printf("downloading %d of %d objects\n", 28 len(missingObjects), numObjects) 29 startTime := time.Now() 30 objectsReader, err := objectsGetter.GetObjects(missingObjects) 31 if err != nil { 32 return errors.New("error downloading objects: " + err.Error()) 33 } 34 defer objectsReader.Close() 35 var totalBytes uint64 36 for _, hash := range missingObjects { 37 length, reader, err := objectsReader.NextObject() 38 if err != nil { 39 return err 40 } 41 _, _, err = objectServer.AddObject(reader, length, &hash) 42 reader.Close() 43 if err != nil { 44 return err 45 } 46 totalBytes += length 47 } 48 timeTaken := time.Since(startTime) 49 logger.Printf("downloaded %d objects, %s in %s (%s/s)\n", 50 len(missingObjects), format.FormatBytes(totalBytes), 51 format.Duration(timeTaken), 52 format.FormatBytes(uint64(float64(totalBytes)/timeTaken.Seconds()))) 53 return nil 54 }