|
|
|
@ -54,20 +54,25 @@ func (h *healRoutine) queueHealTask(task healTask) { |
|
|
|
|
h.tasks <- task |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
func waitForLowHTTPReq(tolerance int, maxWait time.Duration) { |
|
|
|
|
func waitForLowHTTPReq(maxIO int, maxWait time.Duration) { |
|
|
|
|
// No need to wait run at full speed.
|
|
|
|
|
if maxIO <= 0 { |
|
|
|
|
return |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// At max 10 attempts to wait with 100 millisecond interval before proceeding
|
|
|
|
|
waitCount := 10 |
|
|
|
|
waitTick := 100 * time.Millisecond |
|
|
|
|
|
|
|
|
|
// Bucket notification and http trace are not costly, it is okay to ignore them
|
|
|
|
|
// while counting the number of concurrent connections
|
|
|
|
|
toleranceFn := func() int { |
|
|
|
|
return tolerance + globalHTTPListen.NumSubscribers() + globalHTTPTrace.NumSubscribers() |
|
|
|
|
maxIOFn := func() int { |
|
|
|
|
return maxIO + globalHTTPListen.NumSubscribers() + globalHTTPTrace.NumSubscribers() |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if httpServer := newHTTPServerFn(); httpServer != nil { |
|
|
|
|
// Any requests in progress, delay the heal.
|
|
|
|
|
for httpServer.GetRequestCount() >= toleranceFn() { |
|
|
|
|
for httpServer.GetRequestCount() >= maxIOFn() { |
|
|
|
|
time.Sleep(waitTick) |
|
|
|
|
waitCount-- |
|
|
|
|
if waitCount == 0 { |
|
|
|
|