Add the oslo_db enginefacade proposal

Change-Id: I2f2a2fe23332e3f09bbb2541d6def4eeeab27c10
This commit is contained in:
Matthew Booth
2015-01-27 14:34:08 +00:00
parent 286bbffcbc
commit fbb8e0c2a2

View File

@@ -0,0 +1,238 @@
..
This work is licensed under a Creative Commons Attribution 3.0 Unported
License.
http://creativecommons.org/licenses/by/3.0/legalcode
=====================================
Use the new enginefacade from oslo_db
=====================================
https://blueprints.launchpad.net/nova/+spec/new-oslodb-enginefacade
Implement the new oslo.db enginefacade interface described here:
https://blueprints.launchpad.net/oslo.db/+spec/make-enginefacade-a-facade
Problem description
===================
The linked oslo.db spec contains the details of the proposal, including its
general advantages to all projects. In summary, we transparently track database
transactions using the RequestContext object. This means that if there is
already a transaction in progress we will use it by default, only creating a
separate transaction if explicitly requested.
Use Cases
----------
These changes will only affect developers.
* Allow a class of database races to be fixed
Nova currently only exposes database transactions in nova/db/sqlalchemy/api.py,
which means that every db api call is in its own transaction. Although this
will remain the same initially, the new interface allows a caller to extend a
transaction across several db api calls if they wish. This will enable callers
who need these to be atomic to achieve this, which includes the save operation
on several Nova objects.
* Reduce connection load on the database
Many database api calls currently create several separate database connections,
which increases load on the database. By reducing these to a single connection,
load on the db will be decreased.
* Improve atomicity of API calls
By ensuring that database api calls use a single transaction, we fix a class of
bug where failure can leave a partial result.
* Make greater use of slave databases for read-only transactions
The new api marks sections of code as either readers or writers, and enforces
this separation. This allows us to automatically use a slave database
connection for all read-only transactions. It is currently only used when
explicitly requested in code.
Project Priority
-----------------
None
Proposed change
===============
Code changes
------------
* Decorate the RequestContext class
nova.RequestContext is annotated with the
@enginefacade.transaction_context_provider decorator. This adds several code
hooks which provide access to the transaction context via the RequestContext
object.
* Update database apis incrementally
Database apis will be updated in batches, by function. For example, Service
apis, quota apis, instance apis. Invidual calls will be annotated as either
readers or writers. Existing transaction management will be replaced. Calls
into apis which have not been upgraded yet will continue to explicitly pass the
session or connection object.
* Remove uses of use_slave wherever possible
The use_slave parameter will be removed from all upgraded database apis, which
will involve updating call sites and tests. Where the caller no longer uses the
use_slave parameter anywhere, the removal will be propagated as far as
possible. The exception will be external interfaces. All uses of use_slave
will be removed. External interfaces will continue to accept it, but will not
use it.
* Cells 'api' database calls
get_api_engine() and get_api_session() will be replaced by a context manager
which changes the current transaction manager.
Alternatives
------------
Alternatives were examined during the design of the oslo.db code. The goal of
this change is to implement a solution which is common across OpenStack
projects.
Data model impact
-----------------
None.
REST API impact
---------------
None.
This change obsoletes the use_slave parameter everywhere it is used, which
includes several apis with external interfaces. We remove it from all internal
interfaces. For external interfaces we leave it in place, but ignore it. Slave
connections will be used everywhere automatically, whenever possible
Security impact
---------------
Nothing obvious.
Notifications impact
--------------------
None.
Other end user impact
---------------------
None.
Performance Impact
------------------
By reducing connection load on the database, the change is expected to provide
a small performance improvement. However, the primary purpose is correctness.
Other deployer impact
---------------------
None.
Developer impact
----------------
The initial phase of this work will be to implement the new engine facade in
nova/db/sqlalchemy/api.py only, and the couple of cells callers which access
the database outside this module. There will be some minor changes to function
signatures in this module due to removing use_slave, but all callers will be
updated as part of this work. Callers will not have to consider transaction
context if they do not currently do so, as it will be created and destroyed
automatically.
This change will allow developers to explicitly extend database transaction
context to cover several database calls. This allows the caller to make
multiple database changes atomically.
Implementation
==============
Assignee(s)
-----------
Primary assignee:
mbooth-9
Work Items
----------
* Enable use of the new api in Nova
* Migrate api bundles along functional lines:
* Service
* ComputeNode
* Certificate
* FloatingIP
* DNSDomain
* FixedIP
* VIF
* Instance, InstanceInfoCache, InstanceExtra, InstanceMetadata,
InstanceSystemMetadata, InstanceFault, InstanceGroup, InstanceTag
* KeyPair
* Network
* Quota
* EC2
* BDM
* SecurityGroup
* ProviderFWRule
* Migration
* ConsolePool
* Flavor
* Cells
* Agent
* Bandwidth
* Volume
* S3
* Aggregate
* Action
* Task
* PCIDevice
Dependencies
============
A version of oslo.db including the new enginefacade api:
https://review.openstack.org/#/c/138215/
Testing
=======
This change is intended to have no immediate functional impact. The current
tests should continue to pass, except where:
* An internal API is modified to remove use_slave
* The change exposes a bug
* The tests assumed implementation details which have changed
Documentation Impact
====================
None.
References
==========
https://blueprints.launchpad.net/oslo.db/+spec/make-enginefacade-a-facade