From 12819a1b6d78f253f795e7992b93ebfb8347e884 Mon Sep 17 00:00:00 2001 From: wuyuting Date: Tue, 2 Feb 2016 02:33:35 -0500 Subject: [PATCH] Add index for reservations on (deleted, uuid) The query for uuid_reservations currently does a full table scan. This adds an index so frequent invocations of uuid does not bog down the database. Change-Id: I149a9de82fc1003b88e0c0852a0b64634f0c622e Closes-Bug: #1540750 --- .../113_add_reservation_deleted_uuid_index.py | 28 +++++++++++++++++++ cinder/db/sqlalchemy/models.py | 2 ++ cinder/tests/unit/test_migrations.py | 12 ++++++++ 3 files changed, 42 insertions(+) create mode 100644 cinder/db/sqlalchemy/migrate_repo/versions/113_add_reservation_deleted_uuid_index.py diff --git a/cinder/db/sqlalchemy/migrate_repo/versions/113_add_reservation_deleted_uuid_index.py b/cinder/db/sqlalchemy/migrate_repo/versions/113_add_reservation_deleted_uuid_index.py new file mode 100644 index 00000000000..0253580557f --- /dev/null +++ b/cinder/db/sqlalchemy/migrate_repo/versions/113_add_reservation_deleted_uuid_index.py @@ -0,0 +1,28 @@ +# All Rights Reserved. +# +# 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. + +from oslo_db.sqlalchemy import utils +from sqlalchemy import MetaData + + +def upgrade(migrate_engine): + meta = MetaData() + meta.bind = migrate_engine + + index_name = 'reservations_deleted_uuid_idx' + columns = ['deleted', 'uuid'] + if utils.index_exists_on_columns(migrate_engine, 'reservations', columns): + return + + utils.add_index(migrate_engine, 'reservations', index_name, columns) diff --git a/cinder/db/sqlalchemy/models.py b/cinder/db/sqlalchemy/models.py index 11475aa22fc..eed697cfcdb 100644 --- a/cinder/db/sqlalchemy/models.py +++ b/cinder/db/sqlalchemy/models.py @@ -636,6 +636,8 @@ class Reservation(BASE, CinderBase): __tablename__ = 'reservations' __table_args__ = (Index('reservations_deleted_expire_idx', 'deleted', 'expire'), + Index('reservations_deleted_uuid_idx', + 'deleted', 'uuid'), CinderBase.__table_args__) id = Column(Integer, primary_key=True) diff --git a/cinder/tests/unit/test_migrations.py b/cinder/tests/unit/test_migrations.py index 007a01b99b9..f83fa2757cf 100644 --- a/cinder/tests/unit/test_migrations.py +++ b/cinder/tests/unit/test_migrations.py @@ -360,6 +360,18 @@ class MigrationsMixin(test_migrations.WalkVersionsMixin): self.assertIsInstance(services.c.uuid.type, self.VARCHAR_TYPE) + def _check_113(self, engine, data): + """Test that adding reservations index works correctly.""" + reservations = db_utils.get_table(engine, 'reservations') + index_columns = [] + for idx in reservations.indexes: + if idx.name == 'reservations_deleted_uuid_idx': + index_columns = idx.columns.keys() + break + + self.assertEqual(sorted(['deleted', 'uuid']), + sorted(index_columns)) + def test_walk_versions(self): self.walk_versions(False, False) self.assert_each_foreign_key_is_part_of_an_index()