[openstack-dev] Work around DB in OpenStack (Oslo, Nova, Cinder, Glance)

Ben Nemec openstack at nemebean.com
Tue Jul 2 17:55:53 UTC 2013


One small addition I would suggest is a step to remove the unused 
sqlalchemy-migrate code once this is all done.  That's my main concern 
with moving it to Oslo right now.

Also, is this a formal blueprint(s)?  Seems like it should be.

-Ben

On 2013-07-02 12:50, Boris Pavlovic wrote:
>  
>  
>  
>  
>  
>  
>  
>  
> #######################################################################
>  Goal
>  
>  
>  
>  
>  
>  
>  
>  
> #######################################################################
> 
> We should fix work with DB, unify it in all projects and use oslo code
> for all common things.
> 
> In more words:
> 
> DB API
> 
>  *) Fully cover by tests.
> 
>  *) Run tests against all backends (now they are runed only against
> sqlite).
> 
>  *) Unique constraints (instead of select + insert)
>  a) Provide unique constraints.
>  b) Add missing unique constraints.
> 
>  *) DB Archiving
>  a) create shadow tables
>  b) add tests that checks that shadow and main table are synced.
>  c) add code that work with shadow tables.
> 
>  *) DB API performance optimization
>  a) Remove unused joins.
>  b) 1 query instead of N (where it is possible).
>  c) Add methods that could improve performance.
>  d) Drop unused methods.
> 
>  *) DB reconnect
>  a) Don't break huge task if we lost connection for a moment. just
> retry DB query.
> 
>  *) DB Session cleanup
>  a) do not use session parameter in public DB API methods.
>  b) fix places where we are doing N queries in N transactions instead
> of 1.
>  c) get only data that is used (e.g. len(query.all()) =>
> query.count()).
> 
> ----
> 
> DB Migrations
> 
>  *) Test DB Migrations against all backends and real data.
> 
>  *) Fix: DB schemas after Migrations should be same in different
> backends
> 
>  *) Fix: hidden bugs, that are caused by wrong migrations:
>  a) fix indexes. e.g. 152 migration in Nova drop all Indexes that has
> deleted column
>  b) fix wrong types
>  c) drop unused tables
> 
>  *) Switch from sqlalchemy-migrate to something that is not death
> (e.g. alembic).
> 
> ----
> 
> DB Models
> 
>  *) Fix: Schema that is created by Models should be the same as after
> migrations.
> 
>  *) Fix: Unit tests should be runed on DB that was created by Models
> not migrations.
> 
>  *) Add test that checks that Models are synced with migrations.
> 
> ----
> 
> Oslo Code
> 
>  *) Base Sqlalchemy Models.
> 
>  *) Work around engine and session.
> 
>  *) SqlAlchemy Utils - that helps us with migrations and tests.
> 
>  *) Test migrations Base.
> 
>  *) Use common test wrapper that allows us to run tests on different
> backends.
> 
>  
>  
>  
>  
>  
>  
>  
>  
> #######################################################################
>  Implementation
>  
>  
>  
>  
>  
>  
>  
>  
> #######################################################################
> 
>  This is really really huge task. And we are almost done with Nova=).
> 
>  In OpenStack for such work there is only one approach ("baby steps"
> development deriven). So we are making tons of patches that could be
> easy reviewed. But there is also minuses in such approach. It is
> pretty hard to track work on high level. And sometimes there are
> misunderstand.
> 
>  For example with oslo code. In few words at this moment we would like
> to add (for some time) in oslo monkey patching for sqlalchemy-migrate.
> And I got reasonable question from Doug Hellmann. Why? I answer
> because of our "baby steps". But if you don't have a list of baby
> steps it is pretty hard to understand why our baby steps need this
> thing. And why we don't switch to alembic firstly. So I would like to
> describe our Road Map and write list of "baby steps".
> 
> -------
> 
> OSLO
> 
>  *) (Merged) Base code for Models and sqlalchemy engine (session)
> 
>  *) (On review) Sqlalchemy utils that are used to:
>  1. Fix bugs in sqlalchemy-migrate
>  2. Base code for migrations that provides Unique Constraints.
>  3. Utils for db.archiving helps us to create and check shadow tables.
> 
>  *) (On review) Testtools wrapper
>  We should have only one testtool wrapper in all projects. And this is
> the one of base steps in task of running tests against all backends.
> 
>  *) (On review) Test migrations base
>  Base classes that provides us to test our migrations against all
> backends on real data
> 
>  *) (On review, not finished yet) DB Reconnect.
> 
>  *) (Not finished) Test that checks that schemas and models are synced
> 
> -------
> 
> ${PROJECT_NAME}
> 
> In different projects we could work absolutely simultaneously, and
> first candidates are Glance and Cinder. But inside project we could
> also work simultaneously. Here is the workflow:
> 
>  1) (SYNC) Use base code for Models and sqlalchemy engines (from oslo)
> 
>  2) (SYNC) Use test migrations base (from oslo)
> 
>  3) (SYNC) Use SqlAlchemy utils (from oslo)
> 
>  4) (1 patch) Switch to OSLO DB code
> 
>  5) (1 patch) Remove ported test migrations
> 
>  6) (1 Migration) Provide unique constraints (change type of "deleted"
> column)
> 
>  7) (1 Migration) Add shadow tables
>  a) Create shadow tables
>  b) Add test that checks that they are synced always
> 
>  8) (N Migrations) UniqueConstraint/Session/Optimization workflow:
>  a) (1 patch) Add/Improve/Refactor tests for part of api (that is
> connected with model)
>  b) (1 patch) Fix session
>  c) (1 patch) Optimize method
>  d) if required (1 Migration) Add missing Unique Constraints.
> 
>  9) (M Migrations) Sync Models with DB schemas (almost independent
> from 8)
>  a) (K pathces) Sync Models with MySQL Migrations
>  (because they are different in different backneds)
>  b) (Fix, L migrations) Fix migrations, that have bugs (e.g. 152
> migraiton in Nova, drops all
>  Indexes that have 'deleted' column).
>  c) Add test for MySql
>  d) (Fix, 2 migrations) Sync other backends schemas with MySql schema
>  e) Add test for SQLite and Psql
>  f) Rethink our models:
>  *) Improve Indexes
>  *) Use Enum where it is required
>  *) Fix bugs if there are.
>  *) Add missing default values in schema.
> 
> 10) Test should be runed on schema that is created from Models, not
> migrations (depend on 9)
> 
> 11) Use alembic (or something else) instead of sqlalchemy-migrate
> (after 9.e. it will be safe
>  a) make test migrations independent from sqlalchemy-migrate
>  b) (If alembic) Provide work with sqlite.
>  c) Replace all migrations
> 
> Main part of work is in 7, 8 and 10 points.
> 
>  
>  
>  
>  
>  
>  
>  
>  
> #######################################################################
>  Answer for Doug's question
>  
>  
>  
>  
>  
>  
>  
>  
>  
> #######################################################################
> 
> Question:
>  Why we should put in oslo slqlalchemy-migrate monkey patches, when we
> are planing to switch to alembic?
> 
> Answer:
>  If we don't put in oslo sqlalchemy-migrate monkey patches. We won't
> be able to work on 7 point at all until 8 and 10 points will be
> implemented in every project. Also work around 8 point is not
> finished, so we are not able to implement 10 points in any of project.
> So this blocks almost all work in all projects. I think that these
> 100-200 lines of code are not so big price for saving few cycles of
> time.
> 
>  
>  
>  
>  
>  
>  
>  
>  
> #######################################################################
>  Current progress
>  
>  
>  
>  
>  
>  
>  
>  
> #######################################################################
> 
> Nova
> 
>  *) 1,4,6,7 - fully finished
> 
>  *) 2,3,5 - waiting for oslo, but pretty simple to sync it
> 
>  *) 8 - almost finished
>  a) Few patched around tests (on review)
>  b) 9 patches that add UniqueConstraints (on review) and few missing
>  c) Few patches about session (on review) and few missing
> 
>  *) 9 - tons of patches that syncs models with MySql on review. Also
> we are working around tests that checks that schemas that are crated
> by models and migrations are same. So it will be a lot of work here.
> 
>  *) 10 - pretty simple (blocked by 9)
> 
>  *) 11 - tons of work, candidate for I cycle.
> 
>  *) Also here is work around run test on all backends but it is not
> finished yet.
> 
>  -------
> 
> Cinder
> 
>  *) 1,4 - finished
> 
>  *) Some work around 8 (sessions and tests)
> 
>  *) Other things are blocked by oslo
> 
> -------
> 
> Glance
> 
>  *) 1 - finished
> 
>  *) 4 - working on it
> 
> Best regards,
> 
> Boris Pavlović
> 
> (irc boris-42)
> 
> 
> _______________________________________________
> OpenStack-dev mailing list
> OpenStack-dev at lists.openstack.org
> http://lists.openstack.org/cgi-bin/mailman/listinfo/openstack-dev



More information about the OpenStack-dev mailing list