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  }