summaryrefslogtreecommitdiff
path: root/ironic_python_agent/agent.py
diff options
context:
space:
mode:
Diffstat (limited to 'ironic_python_agent/agent.py')
-rw-r--r--ironic_python_agent/agent.py21
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."""