From 100f7e52f6337a95d69cf3bae9168bc4c12f073e Mon Sep 17 00:00:00 2001 From: Waqar Ahmed Date: Wed, 25 Sep 2024 21:49:55 +0500 Subject: [PATCH] Properly wait for catalog to sync on docker.update --- src/middlewared/middlewared/plugins/docker/fs_manage.py | 6 +++--- src/middlewared/middlewared/plugins/docker/state_setup.py | 4 +++- src/middlewared/middlewared/plugins/docker/update.py | 6 +++++- 3 files changed, 11 insertions(+), 5 deletions(-) diff --git a/src/middlewared/middlewared/plugins/docker/fs_manage.py b/src/middlewared/middlewared/plugins/docker/fs_manage.py index 9629294e7423..46dfc82ce94a 100644 --- a/src/middlewared/middlewared/plugins/docker/fs_manage.py +++ b/src/middlewared/middlewared/plugins/docker/fs_manage.py @@ -18,7 +18,7 @@ async def common_func(self, mount): await self.middleware.call('zfs.dataset.mount', docker_ds, {'recursive': True, 'force_mount': True}) else: await self.middleware.call('zfs.dataset.umount', docker_ds, {'force': True}) - await self.middleware.call('catalog.sync') + return await self.middleware.call('catalog.sync') except Exception as e: await self.middleware.call( 'docker.state.set_status', Status.FAILED.value, @@ -27,10 +27,10 @@ async def common_func(self, mount): raise async def mount(self): - await self.common_func(True) + return await self.common_func(True) async def umount(self): - await self.common_func(False) + return await self.common_func(False) async def ix_apps_is_mounted(self, dataset_to_check=None): """ diff --git a/src/middlewared/middlewared/plugins/docker/state_setup.py b/src/middlewared/middlewared/plugins/docker/state_setup.py index e1250614de7f..cf5253c62b24 100644 --- a/src/middlewared/middlewared/plugins/docker/state_setup.py +++ b/src/middlewared/middlewared/plugins/docker/state_setup.py @@ -75,7 +75,9 @@ async def status_change(self): await self.create_update_docker_datasets(config['dataset']) # Docker dataset would not be mounted at this point, so we will explicitly mount them now - await self.middleware.call('docker.fs_manage.mount') + catalog_sync_job = await self.middleware.call('docker.fs_manage.mount') + if catalog_sync_job: + await catalog_sync_job.wait() await self.middleware.call('docker.state.start_service') self.middleware.create_task(self.middleware.call('docker.state.periodic_check')) diff --git a/src/middlewared/middlewared/plugins/docker/update.py b/src/middlewared/middlewared/plugins/docker/update.py index f16e494be058..1f7eca194308 100644 --- a/src/middlewared/middlewared/plugins/docker/update.py +++ b/src/middlewared/middlewared/plugins/docker/update.py @@ -96,8 +96,9 @@ async def do_update(self, job, data): except Exception as e: raise CallError(f'Failed to stop docker service: {e}') + catalog_sync_job = None try: - await self.middleware.call('docker.fs_manage.umount') + catalog_sync_job = await self.middleware.call('docker.fs_manage.umount') except CallError as e: # We handle this specially, if for whatever reason ix-apps dataset is not there, # we don't make it fatal to change pools etc - however if some dataset other then @@ -105,6 +106,9 @@ async def do_update(self, job, data): # and needs to be fixed before we can proceed if e.errno != errno.ENOENT or await self.middleware.call('docker.fs_manage.ix_apps_is_mounted'): raise + finally: + if catalog_sync_job: + await catalog_sync_job.wait() await self.middleware.call('docker.state.set_status', Status.UNCONFIGURED.value)