diff options
Diffstat (limited to 'ironic_python_agent/agent.py')
-rw-r--r-- | ironic_python_agent/agent.py | 21 |
1 files changed, 18 insertions, 3 deletions
diff --git a/ironic_python_agent/agent.py b/ironic_python_agent/agent.py index 660619eb..4ca3bce9 100644 --- a/ironic_python_agent/agent.py +++ b/ironic_python_agent/agent.py @@ -88,6 +88,8 @@ class IronicPythonAgentHeartbeater(threading.Thread): self.stop_event = threading.Event() self.api = agent.api_client self.interval = 0 + self.heartbeat_forced = False + self.previous_heartbeat = 0 def run(self): """Start the heartbeat thread.""" @@ -95,10 +97,21 @@ class IronicPythonAgentHeartbeater(threading.Thread): LOG.info('Starting heartbeater') self.agent.set_agent_advertise_addr() - while not self.stop_event.wait(self.interval): - self.do_heartbeat() + while not self.stop_event.wait(min(self.interval, 5)): + if self._heartbeat_expected(): + self.do_heartbeat() eventlet.sleep(0) + def _heartbeat_expected(self): + # Normal heartbeating + if _time() > self.previous_heartbeat + self.interval: + return True + + # Forced heartbeating, but once in 5 seconds + if (self.heartbeat_forced + and _time() > self.previous_heartbeat + 5): + return True + def do_heartbeat(self): """Send a heartbeat to Ironic.""" try: @@ -109,6 +122,8 @@ class IronicPythonAgentHeartbeater(threading.Thread): generated_cert=self.agent.generated_cert, ) LOG.info('heartbeat successful') + self.heartbeat_forced = False + self.previous_heartbeat = _time() except errors.HeartbeatConflictError: LOG.warning('conflict error sending heartbeat to {}'.format( self.agent.api_url)) @@ -123,7 +138,7 @@ class IronicPythonAgentHeartbeater(threading.Thread): LOG.info(log_msg.format(self.interval)) def force_heartbeat(self): - self.do_heartbeat() + self.heartbeat_forced = True def stop(self): """Stop the heartbeat thread.""" |