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

     1  package client
     2  
     3  import (
     4  	"errors"
     5  	"fmt"
     6  	"io"
     7  
     8  	"github.com/Cloud-Foundations/Dominator/lib/hash"
     9  	"github.com/Cloud-Foundations/Dominator/proto/objectserver"
    10  )
    11  
    12  func (objClient *ObjectClient) addObject(reader io.Reader, length uint64,
    13  	expectedHash *hash.Hash) (hash.Hash, bool, error) {
    14  	var request objectserver.AddObjectRequest
    15  	var reply objectserver.AddObjectResponse
    16  	if length < 1 {
    17  		return reply.Hash, false, errors.New(
    18  			"zero length object cannot be added")
    19  	}
    20  	srpcClient, err := objClient.getClient()
    21  	if err != nil {
    22  		return reply.Hash, false, err
    23  	}
    24  	conn, err := srpcClient.Call("ObjectServer.AddObjects")
    25  	if err != nil {
    26  		return reply.Hash, false, err
    27  	}
    28  	defer conn.Close()
    29  	request.Length = length
    30  	request.ExpectedHash = expectedHash
    31  	conn.Encode(request)
    32  	nCopied, err := io.Copy(conn, reader)
    33  	if err != nil {
    34  		return reply.Hash, false, err
    35  	}
    36  	if uint64(nCopied) != length {
    37  		return reply.Hash, false, errors.New(fmt.Sprintf(
    38  			"failed to copy, wanted: %d, got: %d bytes", length, nCopied))
    39  	}
    40  	// Send end-of-stream marker.
    41  	request = objectserver.AddObjectRequest{}
    42  	conn.Encode(request)
    43  	conn.Flush()
    44  	if err := conn.Decode(&reply); err != nil {
    45  		return reply.Hash, false, err
    46  	}
    47  	if reply.ErrorString != "" {
    48  		return reply.Hash, false, errors.New(reply.ErrorString)
    49  	}
    50  	if expectedHash != nil && *expectedHash != reply.Hash {
    51  		return reply.Hash, false, errors.New(fmt.Sprintf(
    52  			"received hash: %x != expected: %x",
    53  			reply.Hash, *expectedHash))
    54  	}
    55  	return reply.Hash, reply.Added, nil
    56  }