|
|
@ -19,7 +19,9 @@ package http |
|
|
|
import ( |
|
|
|
import ( |
|
|
|
"crypto/tls" |
|
|
|
"crypto/tls" |
|
|
|
"errors" |
|
|
|
"errors" |
|
|
|
|
|
|
|
"io/ioutil" |
|
|
|
"net/http" |
|
|
|
"net/http" |
|
|
|
|
|
|
|
"runtime/pprof" |
|
|
|
"sync" |
|
|
|
"sync" |
|
|
|
"sync/atomic" |
|
|
|
"sync/atomic" |
|
|
|
"time" |
|
|
|
"time" |
|
|
@ -137,6 +139,13 @@ func (srv *Server) Shutdown() error { |
|
|
|
for { |
|
|
|
for { |
|
|
|
select { |
|
|
|
select { |
|
|
|
case <-shutdownTimer.C: |
|
|
|
case <-shutdownTimer.C: |
|
|
|
|
|
|
|
// Write all running goroutines.
|
|
|
|
|
|
|
|
tmp, err := ioutil.TempFile("", "minio-goroutines-*.txt") |
|
|
|
|
|
|
|
if err == nil { |
|
|
|
|
|
|
|
_ = pprof.Lookup("goroutine").WriteTo(tmp, 1) |
|
|
|
|
|
|
|
tmp.Close() |
|
|
|
|
|
|
|
return errors.New("timed out. some connections are still active. doing abnormal shutdown. goroutines written to " + tmp.Name()) |
|
|
|
|
|
|
|
} |
|
|
|
return errors.New("timed out. some connections are still active. doing abnormal shutdown") |
|
|
|
return errors.New("timed out. some connections are still active. doing abnormal shutdown") |
|
|
|
case <-ticker.C: |
|
|
|
case <-ticker.C: |
|
|
|
if atomic.LoadInt32(&srv.requestCount) <= 0 { |
|
|
|
if atomic.LoadInt32(&srv.requestCount) <= 0 { |
|
|
|