From f72b07e5d184946271b090905c2f2ea67fc1479a Mon Sep 17 00:00:00 2001 From: Elena Ezhova Date: Tue, 20 Jan 2015 19:19:43 +0300 Subject: [PATCH] Add index on db "allocated" columns ml2_vxlan_allocations, ml2_gre_allocations, ml2_vlan_allocations tables have the 'allocated' field. There are a lot of similar queries to these tables which look like the following: SELECT ml2_vxlan_allocations.vxlan_vni AS ml2_vxlan_allocations_vxlan_vni, ml2_vxlan_allocations.allocated AS ml2_vxlan_allocations_allocated FROM ml2_vxlan_allocations WHERE ml2_vxlan_allocations.allocated = 0 LIMIT 1; Performing such selects can take quite a lot of time and if a transaction which performs allocation is executed in parallel, it can lead to allocation failure and retry. Adding an index on "allocated" column significantly improves the performance. For ml2_vlan_allocations table created an index on (physical_network, allocation) together. Example for MySQL for execution of query select * from ml2_vxlan_allocations where allocated = 0; when on the table with ~3 mln entries, ~500K of which have allocated = 0: +-----------------------+---------------------+ |No index on "allocated"| Index on "allocated"| +---------------------------------------------+ | 2.02 sec | 0.43 sec | +-----------------------+---------------------+ Closes-Bug: #1412348 Change-Id: Ie90ba611dcae6bd0cb7686a0c7b29b9484eae693 --- .../26b54cf9024d_add_index_on_allocated.py | 50 +++++++++++++++++++ .../alembic_migrations/versions/HEAD | 2 +- neutron/plugins/ml2/drivers/type_gre.py | 2 +- neutron/plugins/ml2/drivers/type_vlan.py | 4 ++ neutron/plugins/ml2/drivers/type_vxlan.py | 2 +- 5 files changed, 57 insertions(+), 3 deletions(-) create mode 100644 neutron/db/migration/alembic_migrations/versions/26b54cf9024d_add_index_on_allocated.py diff --git a/neutron/db/migration/alembic_migrations/versions/26b54cf9024d_add_index_on_allocated.py b/neutron/db/migration/alembic_migrations/versions/26b54cf9024d_add_index_on_allocated.py new file mode 100644 index 00000000000..1c762cffa95 --- /dev/null +++ b/neutron/db/migration/alembic_migrations/versions/26b54cf9024d_add_index_on_allocated.py @@ -0,0 +1,50 @@ +# Copyright 2015 OpenStack Foundation +# +# Licensed under the Apache License, Version 2.0 (the "License"); you may +# not use this file except in compliance with the License. You may obtain +# a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations +# under the License. +# + +"""Add index on allocated + +Revision ID: 26b54cf9024d +Revises: 41662e32bce2 +Create Date: 2015-01-20 15:49:46.100172 + +""" + +# revision identifiers, used by Alembic. +revision = '26b54cf9024d' +down_revision = '2a1ee2fb59e0' + +from alembic import op + + +def upgrade(): + op.create_index( + op.f('ix_ml2_gre_allocations_allocated'), + 'ml2_gre_allocations', ['allocated'], unique=False) + op.create_index( + op.f('ix_ml2_vxlan_allocations_allocated'), + 'ml2_vxlan_allocations', ['allocated'], unique=False) + op.create_index( + op.f('ix_ml2_vlan_allocations_physical_network_allocated'), + 'ml2_vlan_allocations', ['physical_network', 'allocated'], + unique=False) + + +def downgrade(): + op.drop_index(op.f('ix_ml2_vxlan_allocations_allocated'), + table_name='ml2_vxlan_allocations') + op.drop_index(op.f('ix_ml2_gre_allocations_allocated'), + table_name='ml2_gre_allocations') + op.drop_index(op.f('ix_ml2_vlan_allocations_allocated'), + table_name='ml2_vlan_allocations') diff --git a/neutron/db/migration/alembic_migrations/versions/HEAD b/neutron/db/migration/alembic_migrations/versions/HEAD index 19ae3849e05..ab78cc0f3ac 100644 --- a/neutron/db/migration/alembic_migrations/versions/HEAD +++ b/neutron/db/migration/alembic_migrations/versions/HEAD @@ -1 +1 @@ -2a1ee2fb59e0 +26b54cf9024d diff --git a/neutron/plugins/ml2/drivers/type_gre.py b/neutron/plugins/ml2/drivers/type_gre.py index 96a6715eb57..383315261bc 100644 --- a/neutron/plugins/ml2/drivers/type_gre.py +++ b/neutron/plugins/ml2/drivers/type_gre.py @@ -47,7 +47,7 @@ class GreAllocation(model_base.BASEV2): gre_id = sa.Column(sa.Integer, nullable=False, primary_key=True, autoincrement=False) allocated = sa.Column(sa.Boolean, nullable=False, default=False, - server_default=sql.false()) + server_default=sql.false(), index=True) class GreEndpoints(model_base.BASEV2): diff --git a/neutron/plugins/ml2/drivers/type_vlan.py b/neutron/plugins/ml2/drivers/type_vlan.py index 8853b846fd8..ac06e89e3d1 100644 --- a/neutron/plugins/ml2/drivers/type_vlan.py +++ b/neutron/plugins/ml2/drivers/type_vlan.py @@ -61,6 +61,10 @@ class VlanAllocation(model_base.BASEV2): """ __tablename__ = 'ml2_vlan_allocations' + __table_args__ = ( + sa.Index('ix_ml2_vlan_allocations_physical_network_allocated', + 'physical_network', 'allocated'), + model_base.BASEV2.__table_args__,) physical_network = sa.Column(sa.String(64), nullable=False, primary_key=True) diff --git a/neutron/plugins/ml2/drivers/type_vxlan.py b/neutron/plugins/ml2/drivers/type_vxlan.py index 563179de196..6c2d69592d3 100644 --- a/neutron/plugins/ml2/drivers/type_vxlan.py +++ b/neutron/plugins/ml2/drivers/type_vxlan.py @@ -53,7 +53,7 @@ class VxlanAllocation(model_base.BASEV2): vxlan_vni = sa.Column(sa.Integer, nullable=False, primary_key=True, autoincrement=False) allocated = sa.Column(sa.Boolean, nullable=False, default=False, - server_default=sql.false()) + server_default=sql.false(), index=True) class VxlanEndpoints(model_base.BASEV2):