diff --git a/nova/db/api.py b/nova/db/api.py index a26cb3908..5dbc8b9ad 100644 --- a/nova/db/api.py +++ b/nova/db/api.py @@ -585,6 +585,12 @@ def instance_get_project_vpn(context, project_id): return IMPL.instance_get_project_vpn(context, project_id) +def instance_get_all_hung_in_rebooting(context, reboot_window, session=None): + """Get all instances stuck in a rebooting state.""" + return IMPL.instance_get_all_hung_in_rebooting(context, reboot_window, + session) + + def instance_set_state(context, instance_id, state, description=None): """Set the state of an instance.""" return IMPL.instance_set_state(context, instance_id, state, description) diff --git a/nova/db/sqlalchemy/api.py b/nova/db/sqlalchemy/api.py index 077471e95..cb049652b 100644 --- a/nova/db/sqlalchemy/api.py +++ b/nova/db/sqlalchemy/api.py @@ -1529,6 +1529,21 @@ def instance_get_floating_address(context, instance_id): return fixed_ip_refs[0].floating_ips[0]['address'] +@require_admin_context +def instance_get_all_hung_in_rebooting(context, reboot_window, session=None): + reboot_window = datetime.datetime.utcnow() - datetime.timedelta( + seconds=reboot_window) + + if not session: + session = get_session() + + results = session.query(models.Instance).\ + filter(models.Instance.updated_at <= reboot_window).\ + filter_by(task_state="rebooting").all() + + return results + + @require_context def instance_update(context, instance_id, values): session = get_session()