Skip to content

Commit

Permalink
Fix timer leaks - this was leaking a lot of memory for long running t…
Browse files Browse the repository at this point in the history
…ransfers
  • Loading branch information
ncw committed Oct 19, 2017
1 parent 9d3f812 commit c95c6e5
Show file tree
Hide file tree
Showing 3 changed files with 11 additions and 4 deletions.
9 changes: 6 additions & 3 deletions largeobjects.go
Original file line number Diff line number Diff line change
Expand Up @@ -276,8 +276,9 @@ func (file *largeObjectCreateFile) Size() int64 {
}

func withLORetry(expectedSize int64, fn func() (Headers, int64, error)) (err error) {
endTimer := time.NewTimer(readAfterWriteTimeout)
defer endTimer.Stop()
waitingTime := readAfterWriteWait
endTimer := time.After(readAfterWriteTimeout)
for {
var headers Headers
var sz int64
Expand All @@ -288,11 +289,13 @@ func withLORetry(expectedSize int64, fn func() (Headers, int64, error)) (err err
} else {
return
}
waitTimer := time.NewTimer(waitingTime)
select {
case <-endTimer:
case <-endTimer.C:
waitTimer.Stop()
err = fmt.Errorf("Timeout expired while waiting for object to have size == %d, got: %d", expectedSize, sz)
return
case <-time.After(waitingTime):
case <-waitTimer.C:
waitingTime *= 2
}
}
Expand Down
2 changes: 2 additions & 0 deletions swift.go
Original file line number Diff line number Diff line change
Expand Up @@ -471,6 +471,7 @@ again:
}
if req != nil {
timer := time.NewTimer(c.ConnectTimeout)
defer timer.Stop()
var resp *http.Response
resp, err = c.doTimeoutRequest(timer, req)
if err != nil {
Expand Down Expand Up @@ -691,6 +692,7 @@ func (c *Connection) Call(targetUrl string, p RequestOpts) (resp *http.Response,
URL.RawQuery = p.Parameters.Encode()
}
timer := time.NewTimer(c.ConnectTimeout)
defer timer.Stop()
reader := p.Body
if reader != nil {
reader = newWatchdogReader(reader, c.Timeout, timer)
Expand Down
4 changes: 3 additions & 1 deletion timeout_reader.go
Original file line number Diff line number Diff line change
Expand Up @@ -38,10 +38,12 @@ func (t *timeoutReader) Read(p []byte) (int, error) {
done <- result{n, err}
}()
// Wait for the read or the timeout
timer := time.NewTimer(t.timeout)
defer timer.Stop()
select {
case r := <-done:
return r.n, r.err
case <-time.After(t.timeout):
case <-timer.C:
t.cancel()
return 0, TimeoutError
}
Expand Down

0 comments on commit c95c6e5

Please sign in to comment.