Przeglądaj źródła

Fix reservation management on minion pool errors

Fixes an edge-case where if a reservation cannot be found for an existing
replica, and the minion pool set to it is also in an invalid state, a new
reservation would be created but never saved to DB because of the minion pool
error. This patch makes sure that the minion pool validation is done before
the reservation checks when creating replica executions.
Daniel Vincze 1 rok temu
rodzic
commit
cc228fcb5e
1 zmienionych plików z 2 dodań i 2 usunięć
  1. 2 2
      coriolis/conductor/rpc/server.py

+ 2 - 2
coriolis/conductor/rpc/server.py

@@ -911,9 +911,9 @@ class ConductorServerEndpoint(object):
     @replica_synchronized
     @replica_synchronized
     def execute_replica_tasks(self, ctxt, replica_id, shutdown_instances):
     def execute_replica_tasks(self, ctxt, replica_id, shutdown_instances):
         replica = self._get_replica(ctxt, replica_id, include_task_info=True)
         replica = self._get_replica(ctxt, replica_id, include_task_info=True)
-        self._check_reservation_for_replica(replica)
         self._check_replica_running_executions(ctxt, replica)
         self._check_replica_running_executions(ctxt, replica)
         self._check_minion_pools_for_action(ctxt, replica)
         self._check_minion_pools_for_action(ctxt, replica)
+        self._check_reservation_for_replica(replica)
 
 
         execution = models.TasksExecution()
         execution = models.TasksExecution()
         execution.id = str(uuid.uuid4())
         execution.id = str(uuid.uuid4())
@@ -1396,7 +1396,6 @@ class ConductorServerEndpoint(object):
             instance_osmorphing_minion_pool_mappings=None,
             instance_osmorphing_minion_pool_mappings=None,
             skip_os_morphing=False, user_scripts=None):
             skip_os_morphing=False, user_scripts=None):
         replica = self._get_replica(ctxt, replica_id, include_task_info=True)
         replica = self._get_replica(ctxt, replica_id, include_task_info=True)
-        self._check_reservation_for_replica(replica)
         self._check_replica_running_executions(ctxt, replica)
         self._check_replica_running_executions(ctxt, replica)
         self._check_valid_replica_tasks_execution(replica, force)
         self._check_valid_replica_tasks_execution(replica, force)
         user_scripts = user_scripts or replica.user_scripts
         user_scripts = user_scripts or replica.user_scripts
@@ -1445,6 +1444,7 @@ class ConductorServerEndpoint(object):
             migration.instance_osmorphing_minion_pool_mappings.update(
             migration.instance_osmorphing_minion_pool_mappings.update(
                 instance_osmorphing_minion_pool_mappings)
                 instance_osmorphing_minion_pool_mappings)
         self._check_minion_pools_for_action(ctxt, migration)
         self._check_minion_pools_for_action(ctxt, migration)
+        self._check_reservation_for_replica(replica)
 
 
         execution = models.TasksExecution()
         execution = models.TasksExecution()
         migration.executions = [execution]
         migration.executions = [execution]