github.com/cloud-foundations/dominator@v0.0.0-20221004181915-6e4fee580046/objectserver/rpcd/lib/addObjects.go (about)

     1  package lib
     2  
     3  import (
     4  	"io"
     5  
     6  	"github.com/Cloud-Foundations/Dominator/lib/errors"
     7  	"github.com/Cloud-Foundations/Dominator/lib/log"
     8  	"github.com/Cloud-Foundations/Dominator/lib/srpc"
     9  	"github.com/Cloud-Foundations/Dominator/proto/objectserver"
    10  )
    11  
    12  func addObjects(conn *srpc.Conn, decoder srpc.Decoder, encoder srpc.Encoder,
    13  	adder ObjectAdder, logger log.Logger) error {
    14  	defer conn.Flush()
    15  	logger.Printf("AddObjects(%s) starting\n", conn.RemoteAddr())
    16  	numAdded := 0
    17  	numObj := 0
    18  	for ; ; numObj++ {
    19  		var request objectserver.AddObjectRequest
    20  		var response objectserver.AddObjectResponse
    21  		if err := decoder.Decode(&request); err != nil {
    22  			if err == io.EOF || err == io.ErrUnexpectedEOF {
    23  				break
    24  			}
    25  			return errors.New("error decoding: " + err.Error())
    26  		}
    27  		if request.Length < 1 {
    28  			break
    29  		}
    30  		var err error
    31  		response.Hash, response.Added, err =
    32  			adder.AddObject(conn, request.Length, request.ExpectedHash)
    33  		response.ErrorString = errors.ErrorToString(err)
    34  		if err := encoder.Encode(response); err != nil {
    35  			return errors.New("error encoding: " + err.Error())
    36  		}
    37  		if response.ErrorString != "" {
    38  			logger.Printf(
    39  				"AddObjects(): failed, %d of %d so far are new objects: %s",
    40  				numAdded, numObj+1, response.ErrorString)
    41  			return nil
    42  		}
    43  		if response.Added {
    44  			numAdded++
    45  		}
    46  	}
    47  	logger.Printf("AddObjects(): %d of %d are new objects", numAdded, numObj)
    48  	return nil
    49  }