Comment 5 for bug 1546441

Revision history for this message
Dinesh Bhor (dinesh-bhor) wrote :

Hi All,

I have found two more issues related to 'glance-manage db sync'.

Commands:
'glance-manage db sync' has two arguments 'version' and 'current_version'.
If you give 'current_version' greater than the actual current database version it
throws InvalidVersionError exception with traceback.

$ glance-manage db sync 45 56

LOG:
2016-03-11 10:21:37.520 CRITICAL glance [-] InvalidVersionError: 56
2016-03-11 10:21:37.520 TRACE glance Traceback (most recent call last):
2016-03-11 10:21:37.520 TRACE glance File "/usr/local/bin/glance-manage", line 10, in <module>
2016-03-11 10:21:37.520 TRACE glance sys.exit(main())
2016-03-11 10:21:37.520 TRACE glance File "/opt/stack/glance/glance/cmd/manage.py", line 383, in main
2016-03-11 10:21:37.520 TRACE glance return CONF.command.action_fn(*func_args, **func_kwargs)
2016-03-11 10:21:37.520 TRACE glance File "/opt/stack/glance/glance/cmd/manage.py", line 146, in sync
2016-03-11 10:21:37.520 TRACE glance version=current_version)
2016-03-11 10:21:37.520 TRACE glance File "/usr/local/lib/python2.7/dist-packages/oslo_db/sqlalchemy/migration.py", line 153, in db_version_control
2016-03-11 10:21:37.520 TRACE glance versioning_api.version_control(engine, repository, version)
2016-03-11 10:21:37.520 TRACE glance File "<decorator-gen-8>", line 2, in version_control
2016-03-11 10:21:37.520 TRACE glance File "/usr/local/lib/python2.7/dist-packages/migrate/versioning/util/__init__.py", line 160, in with_engine
2016-03-11 10:21:37.520 TRACE glance return f(*a, **kw)
2016-03-11 10:21:37.520 TRACE glance File "/usr/local/lib/python2.7/dist-packages/migrate/versioning/api.py", line 250, in version_control
2016-03-11 10:21:37.520 TRACE glance ControlledSchema.create(engine, repository, version)
2016-03-11 10:21:37.520 TRACE glance File "/usr/local/lib/python2.7/dist-packages/migrate/versioning/schema.py", line 140, in create
2016-03-11 10:21:37.520 TRACE glance version = cls._validate_version(repository, version)
2016-03-11 10:21:37.520 TRACE glance File "/usr/local/lib/python2.7/dist-packages/migrate/versioning/schema.py", line 161, in _validate_version
2016-03-11 10:21:37.520 TRACE glance raise exceptions.InvalidVersionError(version)
2016-03-11 10:21:37.520 TRACE glance InvalidVersionError: 56
2016-03-11 10:21:37.520 TRACE glance

In case of 'current_version' greater than 0 and less than the current database version it throws DatabaseAlreadyControlledError.
$ glance-manage db sync 100 43

LOG:
2016-03-11 09:17:18.841 CRITICAL glance [-] DatabaseAlreadyControlledError
2016-03-11 09:17:18.841 TRACE glance Traceback (most recent call last):
2016-03-11 09:17:18.841 TRACE glance File "/usr/local/bin/glance-manage", line 10, in <module>
2016-03-11 09:17:18.841 TRACE glance sys.exit(main())
2016-03-11 09:17:18.841 TRACE glance File "/opt/stack/glance/glance/cmd/manage.py", line 353, in main
2016-03-11 09:17:18.841 TRACE glance return CONF.command.action_fn(*func_args, **func_kwargs)
2016-03-11 09:17:18.841 TRACE glance File "/opt/stack/glance/glance/cmd/manage.py", line 117, in sync
2016-03-11 09:17:18.841 TRACE glance version=current_version)
2016-03-11 09:17:18.841 TRACE glance File "/usr/local/lib/python2.7/dist-packages/oslo_db/sqlalchemy/migration.py", line 153, in db_version_control
2016-03-11 09:17:18.841 TRACE glance versioning_api.version_control(engine, repository, version)
2016-03-11 09:17:18.841 TRACE glance File "<decorator-gen-8>", line 2, in version_control
2016-03-11 09:17:18.841 TRACE glance File "/usr/local/lib/python2.7/dist-packages/migrate/versioning/util/__init__.py", line 160, in with_engine
2016-03-11 09:17:18.841 TRACE glance return f(*a, **kw)
2016-03-11 09:17:18.841 TRACE glance File "/usr/local/lib/python2.7/dist-packages/migrate/versioning/api.py", line 250, in version_control
2016-03-11 09:17:18.841 TRACE glance ControlledSchema.create(engine, repository, version)
2016-03-11 09:17:18.841 TRACE glance File "/usr/local/lib/python2.7/dist-packages/migrate/versioning/schema.py", line 141, in create
2016-03-11 09:17:18.841 TRACE glance table = cls._create_table_version(engine, repository, version)
2016-03-11 09:17:18.841 TRACE glance File "/usr/local/lib/python2.7/dist-packages/migrate/versioning/schema.py", line 189, in _create_table_version
2016-03-11 09:17:18.841 TRACE glance raise exceptions.DatabaseAlreadyControlledError
2016-03-11 09:17:18.841 TRACE glance DatabaseAlreadyControlledError
2016-03-11 09:17:18.841 TRACE glance

To fix these issues we can go with following approaches:

[A] Project oslo_db is using sqlalchemy-migrate internally so as both the exceptions are raised from
    migrate/versioning/schema.py of sqlalchemy-migrate project [1] [2], we can handle them in oslo_db itself
    and raise appropriate exception. Project oslo_db is imported in glance so we can easily import oslo_db.exception
    and catch exceptions to provide user friendly messages instead of traceback.

[B] We can use generic 'Exception' class to handle the exceptions which are raised from third party projects.

So which approach is right ? Please suggest your opinion.

[1] https://github.com/openstack/sqlalchemy-migrate/blob/master/migrate/versioning/schema.py#L189
[2] https://github.com/openstack/sqlalchemy-migrate/blob/master/migrate/versioning/schema.py#L161