forked from TrueCloudLab/rclone
fshttp: Obey bwlimit in http Transport - fixes #4395
This change uses the bwlimit code to apply limits to the receive and transmit data functions in the HTTP Transport. This means that all HTTP transactions will have limiting applied - this includes listings for example. For HTTP based transorts this makes the limiting in Accounting redundant and possibly counter productive
This commit is contained in:
parent
3b6df71838
commit
8856e0e559
2 changed files with 17 additions and 10 deletions
|
@ -20,6 +20,8 @@ type TokenBucketSlot int
|
|||
// Slots for the token bucket
|
||||
const (
|
||||
TokenBucketSlotAccounting TokenBucketSlot = iota
|
||||
TokenBucketSlotTransportRx
|
||||
TokenBucketSlotTransportTx
|
||||
TokenBucketSlots
|
||||
)
|
||||
|
||||
|
|
|
@ -58,26 +58,31 @@ 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
|
||||
}
|
||||
|
||||
// dial with context and timeouts
|
||||
|
|
Loading…
Reference in a new issue