Release reservation when stoping the ironic-conductor service

If a conductor hostname is changed while reservations are
issued to a conductor with one hostname, such as 'hostname'
and then the process is restarted with 'new_hostname', then the
queries would not match the node and effectively the nodes
would become inaccessible until the reservation is cleared.

This patch clears the reservation when stoping the
ironic-conductor service to avoid the nodes becoming inaccessible.

Ref to: https://review.opendev.org/#/c/711765/

Change-Id: Id31cd30564ff26df0bbe4976ffe3f268b0dd3d7b
This commit is contained in:
shenxindi 2020-04-08 16:07:29 +08:00
parent a3bce80a74
commit 861f35b038
3 changed files with 19 additions and 0 deletions

View File

@ -296,6 +296,8 @@ class BaseConductorManager(object):
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 deregister:
try:
# Inform the cluster that this conductor is shutting down.

View File

@ -64,6 +64,17 @@ class StartStopTestCase(mgr_utils.ServiceSetUpMixin, db_base.DbTestCase):
node.refresh()
self.assertIsNone(node.reservation)
def test_stop_clears_conductor_locks(self):
node = obj_utils.create_test_node(self.context,
reservation=self.hostname)
node.save()
self._start_service()
res = objects.Conductor.get_by_hostname(self.context, self.hostname)
self.assertEqual(self.hostname, res['hostname'])
self.service.del_host()
node.refresh()
self.assertIsNone(node.reservation)
def test_stop_unregisters_conductor(self):
self._start_service()
res = objects.Conductor.get_by_hostname(self.context, self.hostname)

View File

@ -0,0 +1,6 @@
---
fixes:
- |
Fixes an issue where a node may be locked from changes if a conductor's
hostname case is changed before restarting the conductor service. clean
up the reservation once the conductor stopped.