From 80795f2dc58d7210fb8a1564632e4dd34fbeaae3 Mon Sep 17 00:00:00 2001 From: Ken Burger Date: Wed, 7 Sep 2016 21:07:10 -0500 Subject: [PATCH] Increase BDM column in build_requests table When deploying with a very large number of volumes the block_device_mappings column is not sufficient. The column needs to be increased to MEDIUMTEXT size to support this use case. Change-Id: Ia34d06429c1f8f0a8259616bcba0c349c4c9aa33 Closes-Bug: #1621138 --- .../020_block_device_mappings_mediumtext.py | 24 +++++++++++++++++++ nova/db/sqlalchemy/api_models.py | 7 +++++- .../functional/db/api/test_migrations.py | 17 +++++++++++++ 3 files changed, 47 insertions(+), 1 deletion(-) create mode 100644 nova/db/sqlalchemy/api_migrations/migrate_repo/versions/020_block_device_mappings_mediumtext.py diff --git a/nova/db/sqlalchemy/api_migrations/migrate_repo/versions/020_block_device_mappings_mediumtext.py b/nova/db/sqlalchemy/api_migrations/migrate_repo/versions/020_block_device_mappings_mediumtext.py new file mode 100644 index 000000000000..f51455a10934 --- /dev/null +++ b/nova/db/sqlalchemy/api_migrations/migrate_repo/versions/020_block_device_mappings_mediumtext.py @@ -0,0 +1,24 @@ +# 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 sqlalchemy import MetaData +from sqlalchemy import Table + +from nova.db.sqlalchemy import api_models + + +def upgrade(migrate_engine): + meta = MetaData() + meta.bind = migrate_engine + + build_requests = Table('build_requests', meta, autoload=True) + build_requests.c.block_device_mappings.alter(type=api_models.MediumText()) diff --git a/nova/db/sqlalchemy/api_models.py b/nova/db/sqlalchemy/api_models.py index 2b149e76411f..d5dd7ecfce0c 100644 --- a/nova/db/sqlalchemy/api_models.py +++ b/nova/db/sqlalchemy/api_models.py @@ -14,6 +14,7 @@ from oslo_db.sqlalchemy import models from sqlalchemy import Boolean from sqlalchemy import Column +from sqlalchemy.dialects.mysql import MEDIUMTEXT from sqlalchemy import Enum from sqlalchemy.ext.declarative import declarative_base from sqlalchemy import Float @@ -28,6 +29,10 @@ from sqlalchemy import Text from sqlalchemy import Unicode +def MediumText(): + return Text().with_variant(MEDIUMTEXT(), 'mysql') + + class _NovaAPIBase(models.ModelBase, models.TimestampMixin): pass @@ -236,7 +241,7 @@ class BuildRequest(API_BASE): instance_uuid = Column(String(36)) project_id = Column(String(255), nullable=False) instance = Column(Text) - block_device_mappings = Column(Text) + block_device_mappings = Column(MediumText()) # TODO(alaski): Drop these from the db in Ocata # columns_to_drop = ['request_spec_id', 'user_id', 'display_name', # 'instance_metadata', 'progress', 'vm_state', 'task_state', diff --git a/nova/tests/functional/db/api/test_migrations.py b/nova/tests/functional/db/api/test_migrations.py index 616ffe3b0fe5..968f1f2f42a5 100644 --- a/nova/tests/functional/db/api/test_migrations.py +++ b/nova/tests/functional/db/api/test_migrations.py @@ -445,6 +445,23 @@ class NovaAPIMigrationsWalk(test_migrations.WalkVersionsMixin): self.assertColumnExists(engine, 'build_requests', 'block_device_mappings') + def _pre_upgrade_020(self, engine): + build_requests = db_utils.get_table(engine, 'build_requests') + fake_build_req = {'id': 2020, + 'project_id': 'fake_proj_id', + 'block_device_mappings': 'fake_BDM'} + build_requests.insert().execute(fake_build_req) + + def _check_020(self, engine, data): + build_requests = db_utils.get_table(engine, 'build_requests') + if engine.name == 'mysql': + self.assertIsInstance(build_requests.c.block_device_mappings.type, + sqlalchemy.dialects.mysql.MEDIUMTEXT) + + fake_build_req = build_requests.select( + build_requests.c.id == 2020).execute().first() + self.assertEqual('fake_BDM', fake_build_req.block_device_mappings) + class TestNovaAPIMigrationsWalkSQLite(NovaAPIMigrationsWalk, test_base.DbTestCase,