github.com/Cloud-Foundations/Dominator@v0.3.4/objectserver/rpcd/lib/addObjects.go (about)

     1  package lib
     2  
     3  import (
     4  	"fmt"
     5  	"io"
     6  	"time"
     7  
     8  	"github.com/Cloud-Foundations/Dominator/lib/errors"
     9  	"github.com/Cloud-Foundations/Dominator/lib/format"
    10  	"github.com/Cloud-Foundations/Dominator/lib/log"
    11  	"github.com/Cloud-Foundations/Dominator/lib/srpc"
    12  	"github.com/Cloud-Foundations/Dominator/proto/objectserver"
    13  )
    14  
    15  func addObjects(conn *srpc.Conn, decoder srpc.Decoder, encoder srpc.Encoder,
    16  	adder ObjectAdder, logger log.Logger) error {
    17  	defer conn.Flush()
    18  	logger.Printf("AddObjects(%s) starting\n", conn.RemoteAddr())
    19  	numAdded := 0
    20  	numObj := 0
    21  	startTime := time.Now()
    22  	var bytesAdded, bytesReceived uint64
    23  	for {
    24  		var request objectserver.AddObjectRequest
    25  		var response objectserver.AddObjectResponse
    26  		if err := decoder.Decode(&request); err != nil {
    27  			if err == io.EOF || err == io.ErrUnexpectedEOF {
    28  				break
    29  			}
    30  			return fmt.Errorf("error decoding after %d objects: %s",
    31  				numObj, err)
    32  		}
    33  		if request.Length < 1 {
    34  			break
    35  		}
    36  		var err error
    37  		response.Hash, response.Added, err =
    38  			adder.AddObject(conn, request.Length, request.ExpectedHash)
    39  		response.ErrorString = errors.ErrorToString(err)
    40  		if err := encoder.Encode(response); err != nil {
    41  			return errors.New("error encoding: " + err.Error())
    42  		}
    43  		numObj++
    44  		if response.ErrorString != "" {
    45  			logger.Printf(
    46  				"AddObjects(): failed, %d of %d so far are new objects: %s",
    47  				numAdded, numObj+1, response.ErrorString)
    48  			if err := conn.Flush(); err != nil { // Report error quickly.
    49  				return err
    50  			}
    51  			continue
    52  		}
    53  		bytesReceived += request.Length
    54  		if response.Added {
    55  			bytesAdded += request.Length
    56  			numAdded++
    57  		}
    58  	}
    59  	duration := time.Since(startTime)
    60  	speed := uint64(float64(bytesReceived) / duration.Seconds())
    61  	logger.Printf(
    62  		"AddObjects(): %d (%s) of %d (%s) in %s (%s/s) are new objects",
    63  		numAdded, format.FormatBytes(bytesAdded),
    64  		numObj, format.FormatBytes(bytesReceived),
    65  		format.Duration(duration), format.FormatBytes(speed))
    66  	return nil
    67  }