From e779cacc82d256830d4282f0501a4a0ea66c898f Mon Sep 17 00:00:00 2001 From: Nick Craig-Wood Date: Fri, 12 Feb 2021 21:10:58 +0000 Subject: [PATCH] fshttp: fix bandwidth limiting after bad merge Reapply missing bwlimiting which was inserted in 0a932dc1f28fcc4d Add --bwlimit for upload and download #1873 But accidentally removed when merging edfe183ba2f95120 fshttp: add DSCP support with --dscp for QoS with differentiated services --- fs/fshttp/dialer.go | 26 ++++++++++++++++---------- 1 file changed, 16 insertions(+), 10 deletions(-) diff --git a/fs/fshttp/dialer.go b/fs/fshttp/dialer.go index b15ce4847..533754649 100644 --- a/fs/fshttp/dialer.go +++ b/fs/fshttp/dialer.go @@ -6,6 +6,7 @@ import ( "time" "github.com/rclone/rclone/fs" + "github.com/rclone/rclone/fs/accounting" "golang.org/x/net/ipv4" "golang.org/x/net/ipv6" ) @@ -91,24 +92,29 @@ func (c *timeoutConn) nudgeDeadline() (err error) { return c.Conn.SetDeadline(when) } -// readOrWrite bytes doing idle timeouts -func (c *timeoutConn) readOrWrite(f func([]byte) (int, error), b []byte) (n int, err error) { - n, err = f(b) +// Read bytes doing idle timeouts +func (c *timeoutConn) Read(b []byte) (n int, err error) { + // Ideally we would LimitBandwidth(len(b)) here and replace tokens we didn't use + n, err = c.Conn.Read(b) + accounting.TokenBucket.LimitBandwidth(accounting.TokenBucketSlotTransportRx, n) // Don't nudge if no bytes or an error if n == 0 || err != nil { return } // Nudge the deadline on successful Read or Write err = c.nudgeDeadline() - return -} - -// Read bytes doing idle timeouts -func (c *timeoutConn) Read(b []byte) (n int, err error) { - return c.readOrWrite(c.Conn.Read, b) + return n, err } // Write bytes doing idle timeouts func (c *timeoutConn) Write(b []byte) (n int, err error) { - return c.readOrWrite(c.Conn.Write, b) + accounting.TokenBucket.LimitBandwidth(accounting.TokenBucketSlotTransportTx, len(b)) + n, err = c.Conn.Write(b) + // Don't nudge if no bytes or an error + if n == 0 || err != nil { + return + } + // Nudge the deadline on successful Read or Write + err = c.nudgeDeadline() + return n, err }