On 5/21/15 2:57 PM, Mike Bayer wrote:


On 5/21/15 2:50 PM, Mike Bayer wrote:

Put another way, if I want to do a migration that someday, "over time", eventually, etc., will drop the "widget_status" table and merge it into the "widget" table, how do I write the "get_widget()" DB API call ? Same for just dropping a column. If we have to write code that will return the value of the old table / old column while it exists, how does that part work? Somewhere, there has to be code that in one case says: "query(Widget).join(WidgetStatus)" and in other case says "query(Widget)". You have to maintain *both* SQL queries at the same time?
OK I guess it is this: "Kilo queries Widget JOIN WidgetStatus while Liberty queries just Widget" - e.g. the two versions of the query are just in two different releases of the application. You need to run exclusively the old sqlalchemy/api.py version of the code before "contract" is run, that is, the new API / nova.objects runs against the old model code.

OK!   let me chew on that.
hmm, still not grokking this.


"Kilo" application has:

    query(Widget).join(WidgetStatus)  # for queries, and:

    session.add(Widget)
    session.add(WidgetStatus) # for persistence.

It has no knowledge that Widget and WidgetStatus are merged. Or does it? (in which case, yuk?)

"Liberty" application has:

    query(Widget)  # for queries, and:

    session.add(Widget) # for persistence.


It has no knowledge that WidgetStatus exists. Or does it? (in which case, yuk?)

It seems like the two possibilities are that either a database API somewhere needs to know of both "endpoint" states of the schema, or the oslo.objects API needs to ensure that it communicates data across two different versions of the SQL API at the same time in order to do data migrations. Either way I don't know how that works.

My concern that given a series of migrations A, B, C, D, and E, the states of B, C and D *do* disappear as new states are added, is true. It's just that the data migrations here are not simplistic scripts but are instead embedded into the oslo.objects and possibly the model objects as well, and these must be maintained as new states are added to accommodate the new reality of the schema from a POV of only the previous major release to the next major release.

I understand that this is all towards the notion that an operator can have dozens of apps hitting the same database and all those apps are in a mixture of "Kilo" / "Liberty" and all work the same. That is a hard problem to solve. I only regret that I haven't had the opportunity to put any thinking of my own into this problem; while it was part of my original mandate starting work at Red Hat, the versioned objects approach was already moving 100 miles an hour from my first day on the job and this is not a train I've been able to catch. I'm really hoping to be involved with it, as it is my job, though each time I attempt to go there it feels a bit impenetrable.

A side-channel convo with Jay confirms that he had all these same questions / confusion as well - somewhere, his confusion was cleared up, though I don't know where that is. Might this be a really good reason for this architecture to somewhere be documented really, really completely and thoroughly, with detailed workflow examples and such? If that's been done, can someone link me please?












__________________________________________________________________________
OpenStack Development Mailing List (not for usage questions)
Unsubscribe: openstack-dev-requ...@lists.openstack.org?subject:unsubscribe
http://lists.openstack.org/cgi-bin/mailman/listinfo/openstack-dev

Reply via email to