[openstack-dev] [Oslo] [Ironic] DB migration woes

Devananda van der Veen devananda.vdv at gmail.com
Sat Jun 7 00:12:26 UTC 2014


I think some things are broken in the oslo-incubator db migration code.

Ironic moved to this when Juno opened and things seemed fine, until
recently when Lucas tried to add a DB migration and noticed that it didn't
run... So I looked into it a bit today. Below are my findings.

Firstly, I filed this bug and proposed a fix, because I think that tests
that don't run any code should not report that they passed -- they should
report that they were skipped.
  https://bugs.launchpad.net/oslo/+bug/1327397
  "No notice given when db migrations are not run due to missing engine"

Then, I edited the test_migrations.conf file appropriately for my local
mysql service, ran the tests again, and verified that migration tests ran
-- and they passed. Great!

Now, a little background... Ironic's TestMigrations class inherits from
oslo's BaseMigrationTestCase, then "opportunistically" checks each
back-end, if it's available. This opportunistic checking was inherited from
Nova so that tests could pass on developer workstations where not all
backends are present (eg, I have mysql installed, but not postgres), and
still transparently run on all backends in the gate. I couldn't find such
opportunistic testing in the oslo db migration test code, unfortunately -
but maybe it's well hidden.

Anyhow. When I stopped the local mysql service (leaving the configuration
unchanged), I expected the tests to be skipped, but instead I got two
surprise failures:
- test_mysql_opportunistically() failed because setUp() raises an exception
before the test code could call calling _have_mysql()
- test_mysql_connect_fail() actually failed! Again, because setUp() raises
an exception before running the test itself

Unfortunately, there's one more problem... when I run the tests in
parallel, they fail randomly because sometimes two test threads run
different migration tests, and the setUp() for one thread (remember, it
calls _reset_databases) blows up the other test.

Out of 10 runs, it failed three times, each with different errors:
  NoSuchTableError: `chassis`
  ERROR 1007 (HY000) at line 1: Can't create database 'test_migrations';
database exists
  ProgrammingError: (ProgrammingError) (1146, "Table
'test_migrations.alembic_version' doesn't exist")

As far as I can tell, this is all coming from:

https://github.com/openstack/oslo-incubator/blob/master/openstack/common/db/sqlalchemy/test_migrations.py#L86;L111


So, Ironic devs -- if you see a DB migration proposed, pay extra attention
to it. We aren't running migration tests in our check or gate queues right
now, and we shouldn't enable them until this fixed.

Regards,
Devananda
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.openstack.org/pipermail/openstack-dev/attachments/20140606/0ff8c397/attachment.html>


More information about the OpenStack-dev mailing list