From 83ef828a71864739718ef0d3a50b89d17e7024cb Mon Sep 17 00:00:00 2001 From: Gorka Eguileor Date: Fri, 14 Jul 2023 13:13:15 +0200 Subject: [PATCH] Scheduler: Remove unnecessary DB read The scheduler has been receiving the whole volume object for a while now instead of just the volume id, so during a volume creation operation the scheduler doesn't need to read the whole volume from the database. This patch skips a DB read when the volume is present in the request_spec, speeding up the volume creation code in the scheduler, reducing network traffic, and load on the DBMS. Change-Id: Ifd3c817d8c6be9ae9d2ff15f4e1dccd969eca7e9 --- cinder/scheduler/driver.py | 5 +++-- cinder/scheduler/filter_scheduler.py | 3 ++- cinder/tests/unit/scheduler/test_scheduler.py | 17 +++++++++++++++++ 3 files changed, 22 insertions(+), 3 deletions(-) diff --git a/cinder/scheduler/driver.py b/cinder/scheduler/driver.py index fe92905bee2..6e7ecf6e6f1 100644 --- a/cinder/scheduler/driver.py +++ b/cinder/scheduler/driver.py @@ -42,12 +42,13 @@ CONF.register_opts(scheduler_driver_opts) def volume_update_db(context, volume_id, host, cluster_name, - availability_zone=None): + availability_zone=None, volume=None): """Set the host, cluster_name, and set the scheduled_at field of a volume. :returns: A Volume with the updated fields set properly. """ - volume = objects.Volume.get_by_id(context, volume_id) + if not volume: + volume = objects.Volume.get_by_id(context, volume_id) volume.host = host volume.cluster_name = cluster_name volume.scheduled_at = timeutils.utcnow() diff --git a/cinder/scheduler/filter_scheduler.py b/cinder/scheduler/filter_scheduler.py index db53196e8c0..9edf6c3e04b 100644 --- a/cinder/scheduler/filter_scheduler.py +++ b/cinder/scheduler/filter_scheduler.py @@ -110,7 +110,8 @@ class FilterScheduler(driver.Scheduler): context, volume_id, backend.host, backend.cluster_name, - availability_zone=backend.service['availability_zone']) + availability_zone=backend.service['availability_zone'], + volume=request_spec.get('volume')) self._post_select_populate_filter_properties(filter_properties, backend) diff --git a/cinder/tests/unit/scheduler/test_scheduler.py b/cinder/tests/unit/scheduler/test_scheduler.py index c2c51a0c1e0..f0c8fdecbbd 100644 --- a/cinder/tests/unit/scheduler/test_scheduler.py +++ b/cinder/tests/unit/scheduler/test_scheduler.py @@ -716,6 +716,23 @@ class SchedulerDriverModuleTestCase(test.TestCase): driver.volume_update_db(self.context, volume.id, 'fake_host', 'fake_cluster') scheduled_at = volume.scheduled_at.replace(tzinfo=None) + _mock_volume_get.assert_called_once_with(self.context, volume.id) + _mock_vol_update.assert_called_once_with( + self.context, volume.id, {'host': 'fake_host', + 'cluster_name': 'fake_cluster', + 'scheduled_at': scheduled_at, + 'availability_zone': None}) + + @mock.patch('cinder.db.volume_update') + @mock.patch('cinder.objects.volume.Volume.get_by_id') + def test_volume_host_update_db_vol_present(self, _mock_volume_get, + _mock_vol_update): + volume = fake_volume.fake_volume_obj(self.context, use_quota=True) + + driver.volume_update_db(self.context, volume.id, 'fake_host', + 'fake_cluster', volume=volume) + scheduled_at = volume.scheduled_at.replace(tzinfo=None) + _mock_volume_get.assert_not_called() _mock_vol_update.assert_called_once_with( self.context, volume.id, {'host': 'fake_host', 'cluster_name': 'fake_cluster',