Periodic task _poll_unconfirmed_resizes can now use slave db

This allows the _poll_unconfirmed_resizes periodic task to use the
slave db for reads if the deployment has a slave configured. For
slaveless deployments behavior remains unchanged.

This commit advances the MigrationList object to version 1.1

Change-Id: I10bf729e92dc599819ef74a97a834c7f2df5b162
Partially-implements: blueprint periodic-tasks-to-db-slave
This commit is contained in:
Michael Wilson
2013-11-19 20:42:25 -07:00
parent 9b44d9d75d
commit 608fbea58d
6 changed files with 23 additions and 15 deletions

View File

@@ -4530,7 +4530,8 @@ class ComputeManager(manager.SchedulerDependentManager):
mig_list_cls = migration_obj.MigrationList
migrations = mig_list_cls.get_unconfirmed_by_dest_compute(
context, CONF.resize_confirm_window, self.host)
context, CONF.resize_confirm_window, self.host,
use_slave=True)
migrations_info = dict(migration_count=len(migrations),
confirm_window=CONF.resize_confirm_window)
@@ -4557,7 +4558,8 @@ class ComputeManager(manager.SchedulerDependentManager):
expected_attrs = ['metadata', 'system_metadata']
try:
instance = instance_obj.Instance.get_by_uuid(context,
instance_uuid, expected_attrs=expected_attrs)
instance_uuid, expected_attrs=expected_attrs,
use_slave=True)
except exception.InstanceNotFound:
reason = (_("Instance %s not found") %
instance_uuid)

View File

@@ -442,13 +442,13 @@ def migration_get_by_instance_and_status(context, instance_uuid, status):
def migration_get_unconfirmed_by_dest_compute(context, confirm_window,
dest_compute):
dest_compute, use_slave=False):
"""
Finds all unconfirmed migrations within the confirmation window for
a specific destination compute host.
"""
return IMPL.migration_get_unconfirmed_by_dest_compute(context,
confirm_window, dest_compute)
confirm_window, dest_compute, use_slave=use_slave)
def migration_get_in_progress_by_host_and_node(context, host, node):

View File

@@ -4025,15 +4025,16 @@ def migration_get_by_instance_and_status(context, instance_uuid, status):
@require_admin_context
def migration_get_unconfirmed_by_dest_compute(context, confirm_window,
dest_compute):
dest_compute, use_slave=False):
confirm_window = (timeutils.utcnow() -
datetime.timedelta(seconds=confirm_window))
return model_query(context, models.Migration, read_deleted="yes").\
filter(models.Migration.updated_at <= confirm_window).\
filter_by(status="finished").\
filter_by(dest_compute=dest_compute).\
all()
return model_query(context, models.Migration, read_deleted="yes",
use_slave=use_slave).\
filter(models.Migration.updated_at <= confirm_window).\
filter_by(status="finished").\
filter_by(dest_compute=dest_compute).\
all()
@require_admin_context

View File

@@ -86,15 +86,19 @@ def _make_list(context, list_obj, item_cls, db_list):
class MigrationList(base.ObjectListBase, base.NovaObject):
# Version 1.0: Initial version
# Version 1.1: Added use_slave to get_unconfirmed_by_dest_compute
VERSION = '1.1'
fields = {
'objects': fields.ListOfObjectsField('Migration'),
}
@base.remotable_classmethod
def get_unconfirmed_by_dest_compute(cls, context, confirm_window,
dest_compute):
dest_compute, use_slave=False):
db_migrations = db.migration_get_unconfirmed_by_dest_compute(
context, confirm_window, dest_compute)
context, confirm_window, dest_compute, use_slave=use_slave)
return _make_list(context, MigrationList(), Migration, db_migrations)
@base.remotable_classmethod

View File

@@ -5092,7 +5092,7 @@ class ComputeTestCase(BaseTestCase):
return instance
def fake_migration_get_unconfirmed_by_dest_compute(context,
resize_confirm_window, dest_compute):
resize_confirm_window, dest_compute, use_slave=False):
self.assertEqual(dest_compute, CONF.host)
return migrations

View File

@@ -118,11 +118,12 @@ class _TestMigrationObject(object):
self.mox.StubOutWithMock(
db, 'migration_get_unconfirmed_by_dest_compute')
db.migration_get_unconfirmed_by_dest_compute(
ctxt, 'window', 'foo').AndReturn(db_migrations)
ctxt, 'window', 'foo',
use_slave=False).AndReturn(db_migrations)
self.mox.ReplayAll()
migrations = (
migration.MigrationList.get_unconfirmed_by_dest_compute(
ctxt, 'window', 'foo'))
ctxt, 'window', 'foo', use_slave=False))
self.assertEqual(2, len(migrations))
for index, db_migration in enumerate(db_migrations):
self.compare_obj(migrations[index], db_migration)