diff options
author | Steve Baker <sbaker@redhat.com> | 2023-02-27 11:05:10 +1300 |
---|---|---|
committer | Steve Baker <sbaker@redhat.com> | 2023-02-27 11:10:31 +1300 |
commit | 6a9e319fbeb0851c51bb14b9c4c3c5fa4685b14d (patch) | |
tree | 7505771b8835a033e60c08c39827f03011f3d682 /ironic/conductor/base_manager.py | |
parent | e54ee2ba4cb818e25c75fcdc69f7ff1dc4956c73 (diff) | |
download | ironic-6a9e319fbeb0851c51bb14b9c4c3c5fa4685b14d.tar.gz |
On rpc service stop, wait for node reservation release
Instead of clearing existing reservations at the beginning of
del_host, wait for the tasks holding them to go to completion. This
check continues indefinitely until the conductor process exits due to
one of:
- All reservations for this conductor are released
- CONF.graceful_shutdown_timeout has elapsed
- The process manager (systemd, kubernetes) sends SIGKILL after the
configured graceful period
Because the default values of [DEFAULT]graceful_shutdown_timeout and
[conductor]heartbeat_timeout are the same (60s) no other conductor
will claim a node as an orphan until this conductor exits.
Change-Id: Ib8db915746228cd87272740825aaaea1fdf953c7
Diffstat (limited to 'ironic/conductor/base_manager.py')
-rw-r--r-- | ironic/conductor/base_manager.py | 17 |
1 files changed, 14 insertions, 3 deletions
diff --git a/ironic/conductor/base_manager.py b/ironic/conductor/base_manager.py index 5c2e4ea95..544411e1d 100644 --- a/ironic/conductor/base_manager.py +++ b/ironic/conductor/base_manager.py @@ -298,15 +298,17 @@ class BaseConductorManager(object): # This is only used in tests currently. Delete it? self._periodic_task_callables = periodic_task_callables - def del_host(self, deregister=True): + def del_host(self, deregister=True, clear_node_reservations=True): # Conductor deregistration fails if called on non-initialized # conductor (e.g. when rpc server is unreachable). if not hasattr(self, 'conductor'): return self._shutdown = True self._keepalive_evt.set() - # clear all locks held by this conductor before deregistering - self.dbapi.clear_node_reservations_for_conductor(self.host) + + if clear_node_reservations: + # clear all locks held by this conductor before deregistering + self.dbapi.clear_node_reservations_for_conductor(self.host) if deregister: try: # Inform the cluster that this conductor is shutting down. @@ -338,6 +340,15 @@ class BaseConductorManager(object): """Return a count of currently online conductors""" return len(self.dbapi.get_online_conductors()) + def has_reserved(self): + """Determines if this host currently has any reserved nodes + + :returns: True if this host has reserved nodes + """ + return bool(self.dbapi.get_nodeinfo_list( + filters={'reserved_by_any_of': [self.host]}, + limit=1)) + def _register_and_validate_hardware_interfaces(self, hardware_types): """Register and validate hardware interfaces for this conductor. |