diff options
| author | Jenkins <jenkins@review.openstack.org> | 2011-12-21 16:31:36 +0000 |
|---|---|---|
| committer | Gerrit Code Review <review@openstack.org> | 2011-12-21 16:31:36 +0000 |
| commit | f3ab0023b0b44d5be12f08588010aa76ae79c57f (patch) | |
| tree | 4d7bf3604f7dea6f137b47cc2e82eb28f16bfed3 | |
| parent | 0cf2935688b84bb850f73b5974a0fd15b8f2015f (diff) | |
| parent | fb6850a5b9d7d61a4bb96af8d1cd516fd139c1f8 (diff) | |
| download | nova-f3ab0023b0b44d5be12f08588010aa76ae79c57f.tar.gz nova-f3ab0023b0b44d5be12f08588010aa76ae79c57f.tar.xz nova-f3ab0023b0b44d5be12f08588010aa76ae79c57f.zip | |
Merge "Makes disassociate by timeout work with multi-host"
| -rw-r--r-- | nova/db/sqlalchemy/api.py | 25 |
1 files 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() |
