From f0cb44cabe4d635555bcbba1edaa1038ae6fb49d Mon Sep 17 00:00:00 2001 From: StephenButtolph Date: Sun, 23 Aug 2020 11:27:47 -0400 Subject: [PATCH 1/2] add a maximum timeout value to prevent extremely long timeouts --- snow/networking/timeout/manager.go | 3 ++- utils/timer/adaptive_timeout_manager.go | 8 ++++++++ 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/snow/networking/timeout/manager.go b/snow/networking/timeout/manager.go index 8c6ae26fe768..74724f1f1a5d 100644 --- a/snow/networking/timeout/manager.go +++ b/snow/networking/timeout/manager.go @@ -24,7 +24,8 @@ func (m *Manager) Initialize( return m.tm.Initialize( time.Second, 500*time.Millisecond, - 2, + 10*time.Second, + 1.1, time.Millisecond, namespace, registerer, diff --git a/utils/timer/adaptive_timeout_manager.go b/utils/timer/adaptive_timeout_manager.go index 2ded8412e4f4..da68c6727a18 100644 --- a/utils/timer/adaptive_timeout_manager.go +++ b/utils/timer/adaptive_timeout_manager.go @@ -52,6 +52,7 @@ type AdaptiveTimeoutManager struct { currentDurationMetric prometheus.Gauge minimumDuration time.Duration + maximumDuration time.Duration increaseRatio float64 decreaseValue time.Duration @@ -66,6 +67,7 @@ type AdaptiveTimeoutManager struct { func (tm *AdaptiveTimeoutManager) Initialize( initialDuration time.Duration, minimumDuration time.Duration, + maximumDuration time.Duration, increaseRatio float64, decreaseValue time.Duration, namespace string, @@ -77,6 +79,7 @@ func (tm *AdaptiveTimeoutManager) Initialize( Help: "Duration of current network timeouts in nanoseconds", }) tm.minimumDuration = minimumDuration + tm.maximumDuration = maximumDuration tm.increaseRatio = increaseRatio tm.decreaseValue = decreaseValue tm.currentDuration = initialDuration @@ -164,6 +167,11 @@ func (tm *AdaptiveTimeoutManager) remove(id ids.ID, currentTime time.Time) { // If the current timeout duration is less than or equal to the // timeout that was triggered, double the duration. tm.currentDuration = time.Duration(float64(tm.currentDuration) * tm.increaseRatio) + + if tm.currentDuration > tm.maximumDuration { + // Make sure that we never get stuck in a bad situation + tm.currentDuration = tm.maximumDuration + } } } else { // This request is being removed because it finished successfully. From a15dd9b57493603499936c728efdda96fc631035 Mon Sep 17 00:00:00 2001 From: StephenButtolph Date: Sun, 23 Aug 2020 11:32:34 -0400 Subject: [PATCH 2/2] fixed timeout tests --- utils/timer/adaptive_timeout_manager_test.go | 1 + 1 file changed, 1 insertion(+) diff --git a/utils/timer/adaptive_timeout_manager_test.go b/utils/timer/adaptive_timeout_manager_test.go index 091c3866626f..24607a961b38 100644 --- a/utils/timer/adaptive_timeout_manager_test.go +++ b/utils/timer/adaptive_timeout_manager_test.go @@ -18,6 +18,7 @@ func TestAdaptiveTimeoutManager(t *testing.T) { tm.Initialize( time.Millisecond, // initialDuration time.Millisecond, // minimumDuration + time.Hour, // maximumDuration 2, // increaseRatio time.Microsecond, // decreaseValue "gecko", // namespace