Merge branch 'fix-termination-of-long-downloads' into notsure2

This commit is contained in:
notsure2 2020-12-08 22:45:23 +02:00
commit 8afc9315e0
2 changed files with 10 additions and 4 deletions

View File

@ -22,11 +22,13 @@ type datagramBufferedPipe struct {
rDeadline time.Time rDeadline time.Time
timeoutTimer *time.Timer timeoutTimer *time.Timer
enforceReadDeadline bool
} }
func NewDatagramBufferedPipe() *datagramBufferedPipe { func NewDatagramBufferedPipe() *datagramBufferedPipe {
d := &datagramBufferedPipe{ d := &datagramBufferedPipe{
rwCond: sync.NewCond(&sync.Mutex{}), rwCond: sync.NewCond(&sync.Mutex{}),
enforceReadDeadline: true,
} }
return d return d
} }
@ -42,7 +44,7 @@ func (d *datagramBufferedPipe) Read(target []byte) (int, error) {
return 0, io.EOF return 0, io.EOF
} }
hasRDeadline := !d.rDeadline.IsZero() hasRDeadline := !d.rDeadline.IsZero() && d.enforceReadDeadline
if hasRDeadline { if hasRDeadline {
if time.Until(d.rDeadline) <= 0 { if time.Until(d.rDeadline) <= 0 {
return 0, ErrTimeout return 0, ErrTimeout
@ -65,6 +67,7 @@ func (d *datagramBufferedPipe) Read(target []byte) (int, error) {
d.pLens = d.pLens[1:] d.pLens = d.pLens[1:]
d.buf.Read(target[:dataLen]) d.buf.Read(target[:dataLen])
// err will always be nil because we have already verified that buf.Len() != 0 // err will always be nil because we have already verified that buf.Len() != 0
d.enforceReadDeadline = false
d.rwCond.Broadcast() d.rwCond.Broadcast()
return dataLen, nil return dataLen, nil
} }

View File

@ -20,11 +20,13 @@ type streamBufferedPipe struct {
wtTimeout time.Duration wtTimeout time.Duration
timeoutTimer *time.Timer timeoutTimer *time.Timer
enforceReadDeadline bool
} }
func NewStreamBufferedPipe() *streamBufferedPipe { func NewStreamBufferedPipe() *streamBufferedPipe {
p := &streamBufferedPipe{ p := &streamBufferedPipe{
rwCond: sync.NewCond(&sync.Mutex{}), rwCond: sync.NewCond(&sync.Mutex{}),
enforceReadDeadline: true,
} }
return p return p
} }
@ -40,7 +42,7 @@ func (p *streamBufferedPipe) Read(target []byte) (int, error) {
return 0, io.EOF return 0, io.EOF
} }
hasRDeadline := !p.rDeadline.IsZero() hasRDeadline := !p.rDeadline.IsZero() && p.enforceReadDeadline
if hasRDeadline { if hasRDeadline {
if time.Until(p.rDeadline) <= 0 { if time.Until(p.rDeadline) <= 0 {
return 0, ErrTimeout return 0, ErrTimeout
@ -57,6 +59,7 @@ func (p *streamBufferedPipe) Read(target []byte) (int, error) {
} }
n, err := p.buf.Read(target) n, err := p.buf.Read(target)
// err will always be nil because we have already verified that buf.Len() != 0 // err will always be nil because we have already verified that buf.Len() != 0
p.enforceReadDeadline = false
p.rwCond.Broadcast() p.rwCond.Broadcast()
return n, err return n, err
} }