diff options
| author | Vishvananda Ishaya <vishvananda@gmail.com> | 2012-03-19 09:01:16 -0700 |
|---|---|---|
| committer | Vishvananda Ishaya <vishvananda@gmail.com> | 2012-03-19 18:33:51 -0700 |
| commit | ffb9361596c1708d7d009c195b4b3bc74d00a01c (patch) | |
| tree | 81ddb06d23de93cd219455768554785c31b93f89 /nova/db | |
| parent | cb0a25e825a9a09f39aa496a66ad4171ff659af8 (diff) | |
| download | nova-ffb9361596c1708d7d009c195b4b3bc74d00a01c.tar.gz nova-ffb9361596c1708d7d009c195b4b3bc74d00a01c.tar.xz nova-ffb9361596c1708d7d009c195b4b3bc74d00a01c.zip | |
Improve performance of generating dhcp leases
* Dont make 2 * instances queries when generating dhcp leases
* Uses some nasty joins to minimize necessary changes
* Adds test to verify functionality
* Uses old sqlalchemy compatible join syntax
* Uses vif_id as nw identifier for single_host_gateway mode
* Cleans up tests in linux_net
* Fixes bug 959378
Change-Id: I1c74d114dd7caad1781180585bb65691e536bcf9
Diffstat (limited to 'nova/db')
| -rw-r--r-- | nova/db/api.py | 4 | ||||
| -rw-r--r-- | nova/db/sqlalchemy/api.py | 48 |
2 files changed, 43 insertions, 9 deletions
diff --git a/nova/db/api.py b/nova/db/api.py index 286fdc8d0..2a38d026f 100644 --- a/nova/db/api.py +++ b/nova/db/api.py @@ -782,9 +782,9 @@ def network_get_all_by_uuids(context, network_uuids, project_id=None): # pylint: disable=C0103 -def network_get_associated_fixed_ips(context, network_id): +def network_get_associated_fixed_ips(context, network_id, host=None): """Get all network's ips that have been associated.""" - return IMPL.network_get_associated_fixed_ips(context, network_id) + return IMPL.network_get_associated_fixed_ips(context, network_id, host) def network_get_by_bridge(context, bridge): diff --git a/nova/db/sqlalchemy/api.py b/nova/db/sqlalchemy/api.py index 49810de22..9eda43941 100644 --- a/nova/db/sqlalchemy/api.py +++ b/nova/db/sqlalchemy/api.py @@ -1990,15 +1990,49 @@ def network_get_all_by_uuids(context, network_uuids, project_id=None): @require_admin_context -def network_get_associated_fixed_ips(context, network_id): +def network_get_associated_fixed_ips(context, network_id, host=None): # FIXME(sirp): since this returns fixed_ips, this would be better named # fixed_ip_get_all_by_network. - return model_query(context, models.FixedIp, read_deleted="no").\ - filter_by(network_id=network_id).\ - filter_by(allocated=True).\ - filter(models.FixedIp.instance_id != None).\ - filter(models.FixedIp.virtual_interface_id != None).\ - all() + # NOTE(vish): The ugly joins here are to solve a performance issue and + # should be removed once we can add and remove leases + # without regenerating the whole list + vif_and = and_(models.VirtualInterface.id == + models.FixedIp.virtual_interface_id, + models.VirtualInterface.deleted == False) + inst_and = and_(models.Instance.id == models.FixedIp.instance_id, + models.Instance.deleted == False) + session = get_session() + query = session.query(models.FixedIp.address, + models.FixedIp.instance_id, + models.FixedIp.network_id, + models.FixedIp.virtual_interface_id, + models.VirtualInterface.address, + models.Instance.hostname, + models.Instance.updated_at, + models.Instance.created_at).\ + filter(models.FixedIp.deleted == False).\ + filter(models.FixedIp.network_id == network_id).\ + filter(models.FixedIp.allocated == True).\ + join((models.VirtualInterface, vif_and)).\ + join((models.Instance, inst_and)).\ + filter(models.FixedIp.instance_id != None).\ + filter(models.FixedIp.virtual_interface_id != None) + if host: + query = query.filter(models.Instance.host == host) + result = query.all() + data = [] + for datum in result: + cleaned = {} + cleaned['address'] = datum[0] + cleaned['instance_id'] = datum[1] + cleaned['network_id'] = datum[2] + cleaned['vif_id'] = datum[3] + cleaned['vif_address'] = datum[4] + cleaned['instance_hostname'] = datum[5] + cleaned['instance_updated'] = datum[6] + cleaned['instance_created'] = datum[7] + data.append(cleaned) + return data @require_admin_context |
