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 }