From 5846954ba153132bed07f98aefa9e60353f70d2c Mon Sep 17 00:00:00 2001
From: Jason Separovic <jason.separovic@nokia.com>
Date: Wed, 20 Jul 2022 17:35:33 -0700
Subject: [PATCH] add maxbackoff to limit the interval between retries

---
 supervisor/options.py | 4 +++-
 supervisor/process.py | 3 ++-
 2 files changed, 5 insertions(+), 2 deletions(-)

diff --git a/supervisor/options.py b/supervisor/options.py
index 20c1b07aa..40ae6db3d 100644
--- a/supervisor/options.py
+++ b/supervisor/options.py
@@ -925,6 +925,7 @@ def get(section, opt, *args, **kwargs):
         autorestart = auto_restart(get(section, 'autorestart', 'unexpected'))
         startsecs = integer(get(section, 'startsecs', 1))
         startretries = integer(get(section, 'startretries', 3))
+        maxbackoff = integer(get(section, 'maxbackoff', 60))
         stopsignal = signal_number(get(section, 'stopsignal', 'TERM'))
         stopwaitsecs = integer(get(section, 'stopwaitsecs', 10))
         stopasgroup = boolean(get(section, 'stopasgroup', 'false'))
@@ -1047,6 +1048,7 @@ def get(section, opt, *args, **kwargs):
                 autorestart=autorestart,
                 startsecs=startsecs,
                 startretries=startretries,
+                maxbackoff=maxbackoff,
                 uid=uid,
                 stdout_logfile=logfiles['stdout_logfile'],
                 stdout_capture_maxbytes = stdout_cmaxbytes,
@@ -1879,7 +1881,7 @@ def __repr__(self):
 class ProcessConfig(Config):
     req_param_names = [
         'name', 'uid', 'command', 'directory', 'umask', 'priority',
-        'autostart', 'autorestart', 'startsecs', 'startretries',
+        'autostart', 'autorestart', 'startsecs', 'startretries', 'maxbackoff',
         'stdout_logfile', 'stdout_capture_maxbytes',
         'stdout_events_enabled', 'stdout_syslog',
         'stdout_logfile_backups', 'stdout_logfile_maxbytes',
diff --git a/supervisor/process.py b/supervisor/process.py
index b394be812..3f461ff42 100644
--- a/supervisor/process.py
+++ b/supervisor/process.py
@@ -168,7 +168,8 @@ def change_state(self, new_state, expected=True):
         self.state = new_state
         if new_state == ProcessStates.BACKOFF:
             now = time.time()
-            self.backoff += 1
+            if self.backoff < self.config.maxbackoff:
+                self.backoff += 1
             self.delay = now + self.backoff
 
         event_class = self.event_map.get(new_state)