github.com/cloud-foundations/dominator@v0.0.0-20221004181915-6e4fee580046/objectserver/rpcd/testBandwidth.go (about) 1 package rpcd 2 3 import ( 4 "fmt" 5 "io" 6 "math/rand" 7 "time" 8 9 "github.com/Cloud-Foundations/Dominator/lib/srpc" 10 proto "github.com/Cloud-Foundations/Dominator/proto/objectserver" 11 ) 12 13 func (t *srpcType) TestBandwidth(conn *srpc.Conn) error { 14 var request proto.TestBandwidthRequest 15 if err := conn.Decode(&request); err != nil { 16 return err 17 } 18 if request.ChunkSize > 65535 { 19 return fmt.Errorf("ChunkSize: %d exceeds 65535", request.ChunkSize) 20 } 21 if request.SendToServer { 22 return t.testBandwidthToServer(conn, request) 23 } 24 return t.testBandwidthToClient(conn, request) 25 } 26 27 func (t *srpcType) testBandwidthToClient(conn *srpc.Conn, 28 request proto.TestBandwidthRequest) error { 29 buffer := make([]byte, request.ChunkSize+1) 30 rand.Read(buffer[:request.ChunkSize]) 31 if request.Duration < time.Second { 32 request.Duration = time.Second 33 } else if request.Duration > time.Minute { 34 request.Duration = time.Minute 35 } 36 startTime := time.Now() 37 stopTime := startTime.Add(request.Duration) 38 buffer[len(buffer)-1] = 1 39 for time.Until(stopTime) > 0 { 40 if _, err := conn.Write(buffer); err != nil { 41 return err 42 } 43 } 44 buffer[len(buffer)-1] = 0 45 if _, err := conn.Write(buffer); err != nil { 46 return err 47 } 48 return conn.Encode(&proto.TestBandwidthResponse{time.Since(startTime)}) 49 } 50 51 func (t *srpcType) testBandwidthToServer(conn *srpc.Conn, 52 request proto.TestBandwidthRequest) error { 53 buffer := make([]byte, request.ChunkSize+1) 54 startTime := time.Now() 55 for { 56 if _, err := io.ReadAtLeast(conn, buffer, len(buffer)); err != nil { 57 return err 58 } 59 if buffer[len(buffer)-1] == 0 { 60 break 61 } 62 } 63 return conn.Encode(&proto.TestBandwidthResponse{time.Since(startTime)}) 64 }