]> review.fuel-infra Code Review - openstack-build/neutron-build.git/commitdiff
Add index on db "allocated" columns
authorElena Ezhova <eezhova@mirantis.com>
Tue, 20 Jan 2015 16:19:43 +0000 (19:19 +0300)
committerElena Ezhova <eezhova@mirantis.com>
Fri, 23 Jan 2015 16:18:52 +0000 (19:18 +0300)
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

neutron/db/migration/alembic_migrations/versions/26b54cf9024d_add_index_on_allocated.py [new file with mode: 0644]
neutron/db/migration/alembic_migrations/versions/HEAD
neutron/plugins/ml2/drivers/type_gre.py
neutron/plugins/ml2/drivers/type_vlan.py
neutron/plugins/ml2/drivers/type_vxlan.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 (file)
index 0000000..1c762cf
--- /dev/null
@@ -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')
index 19ae3849e0544ac47e1d28a3f1ec14e4667d2aa6..ab78cc0f3ace9d46d9fbdf7228c3c9d224c24318 100644 (file)
@@ -1 +1 @@
-2a1ee2fb59e0
+26b54cf9024d
index 96a6715eb57d03913a8aef2cf3d7babbad280a19..383315261bc755b41e16fe66108f2947dfad02d6 100644 (file)
@@ -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):
index 8853b846fd8ac72fc5c74951704660af08250f86..ac06e89e3d1bf97321de1d8f20f5f0571d10c36c 100644 (file)
@@ -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)
index 563179de1967d152682d9b4666fdac46ce8dd108..6c2d69592d3e36f9c23500f4f78eab76a66958f3 100644 (file)
@@ -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):