From fb6850a5b9d7d61a4bb96af8d1cd516fd139c1f8 Mon Sep 17 00:00:00 2001 From: Vishvananda Ishaya Date: Fri, 16 Dec 2011 16:02:54 -0800 Subject: Makes disassociate by timeout work with multi-host * fixes bug 898485 * updates timeout query to key off of instance host as well * removes unused status=1 in related query Change-Id: Ia11b3d4d3db930eb31ccc2f74635971ba6edc32c --- nova/db/sqlalchemy/api.py | 25 +++++++++++++++++-------- 1 file changed, 17 insertions(+), 8 deletions(-) diff --git a/nova/db/sqlalchemy/api.py b/nova/db/sqlalchemy/api.py index c8ac5ca44..2163ba8ca 100644 --- a/nova/db/sqlalchemy/api.py +++ b/nova/db/sqlalchemy/api.py @@ -32,6 +32,7 @@ from nova import log as logging from nova.compute import vm_states from nova.db.sqlalchemy import models from nova.db.sqlalchemy.session import get_session +from sqlalchemy import and_ from sqlalchemy import or_ from sqlalchemy.exc import IntegrityError from sqlalchemy.orm import joinedload @@ -774,16 +775,25 @@ def fixed_ip_disassociate(context, address): @require_admin_context def fixed_ip_disassociate_all_by_timeout(context, host, time): session = get_session() - inner_q = model_query(context, models.Network.id, session=session, - read_deleted="yes").\ - filter_by(host=host).\ + # NOTE(vish): only update fixed ips that "belong" to this + # host; i.e. the network host or the instance + # host matches. Inner queries necessary because + # join with update doesn't work. + host_filter = or_(and_(models.Instance.host == host, + models.Network.multi_host == True), + models.Network.host == host) + subq = model_query(context, models.FixedIp.id, session=session, + read_deleted="yes").\ + filter(models.FixedIp.updated_at < time).\ + filter(models.FixedIp.instance_id != None).\ + filter(models.FixedIp.allocated == False).\ + join(models.FixedIp.instance).\ + join(models.FixedIp.network).\ + filter(host_filter).\ subquery() result = model_query(context, models.FixedIp, session=session, read_deleted="yes").\ - filter(models.FixedIp.network_id.in_(inner_q)).\ - filter(models.FixedIp.updated_at < time).\ - filter(models.FixedIp.instance_id != None).\ - filter_by(allocated=False).\ + filter(models.FixedIp.id.in_(subq)).\ update({'instance_id': None, 'leased': False, 'updated_at': utils.utcnow()}, @@ -826,7 +836,6 @@ def fixed_ip_get_all_by_instance_host(context, host=None): result = model_query(context, models.FixedIp, read_deleted="yes").\ options(joinedload('floating_ips')).\ join(models.FixedIp.instance).\ - filter_by(state=1).\ filter_by(host=host).\ all() -- cgit