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  }