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 }