From: Mark McLoughlin <markmc@redhat.com>
Subject: [PATCH] Fix flavorid migration failure

With sqlalchemy 0.7.2 and migrate 0.7.1, I was seeing:

   Traceback (most recent call last):
      File "/usr/lib/python2.7/site-packages/nova/db/migration.py", line 37, in db_sync
        ret = IMPL.db_sync(version=version)
      [...]
      File "/usr/lib/python2.7/site-packages/nova/db/sqlalchemy/migrate_repo/versions/036_change_flavor_id_in_migrations.py", line 46, in upgrade
        .values(old_instance_type_id=instance_type.id))
      [...]
      File "/usr/lib64/python2.7/site-packages/sqlalchemy/engine/default.py", line 301, in do_commit
        connection.commit()
    OperationalError: (OperationalError) database is locked None None

It looks like the database is being held open as we iterate over the
rows in the instance_types table.
---
 .../versions/036_change_flavor_id_in_migrations.py |   12 ++++++++----
 1 files changed, 8 insertions(+), 4 deletions(-)

diff --git a/nova/db/sqlalchemy/migrate_repo/versions/036_change_flavor_id_in_migrations.py b/nova/db/sqlalchemy/migrate_repo/versions/036_change_flavor_id_in_migrations.py
index f324403..dfbd4ba 100644
--- a/nova/db/sqlalchemy/migrate_repo/versions/036_change_flavor_id_in_migrations.py
+++ b/nova/db/sqlalchemy/migrate_repo/versions/036_change_flavor_id_in_migrations.py
@@ -40,13 +40,17 @@ def upgrade(migrate_engine):
     migrations.create_column(new_instance_type_id)
 
     # Convert flavor_id to instance_type_id
+    itypes = {}
     for instance_type in migrate_engine.execute(instance_types.select()):
+        itypes[instance_type.id] = instance_type.flavorid
+
+    for instance_type_id in itypes.keys():
         migrate_engine.execute(migrations.update()\
-                .where(migrations.c.old_flavor_id == instance_type.flavorid)\
-                .values(old_instance_type_id=instance_type.id))
+                .where(migrations.c.old_flavor_id == itypes[instance_type_id])\
+                .values(old_instance_type_id=instance_type_id))
         migrate_engine.execute(migrations.update()\
-                .where(migrations.c.new_flavor_id == instance_type.flavorid)\
-                .values(new_instance_type_id=instance_type.id))
+                .where(migrations.c.new_flavor_id == itypes[instance_type_id])\
+                .values(new_instance_type_id=instance_type_id))
 
     migrations.c.old_flavor_id.drop()
     migrations.c.new_flavor_id.drop()
-- 
1.7.4.4