diff options
author | Maxim Devaev <[email protected]> | 2024-10-29 13:35:39 +0200 |
---|---|---|
committer | Maxim Devaev <[email protected]> | 2024-10-29 13:35:39 +0200 |
commit | c02bc53bc400dfe43d9eec84fc26cc4ce31ebb7a (patch) | |
tree | 219c8cea550076420bc388e949de4d417d467157 | |
parent | 546ac24b93bcc80a691b17d8bddb88002c399558 (diff) |
msd: reload parts from inotify loop
-rw-r--r-- | kvmd/plugins/msd/otg/__init__.py | 38 |
1 files changed, 24 insertions, 14 deletions
diff --git a/kvmd/plugins/msd/otg/__init__.py b/kvmd/plugins/msd/otg/__init__.py index b0a2d2ac..fca18e7b 100644 --- a/kvmd/plugins/msd/otg/__init__.py +++ b/kvmd/plugins/msd/otg/__init__.py @@ -171,10 +171,6 @@ class Plugin(BaseMsd): # pylint: disable=too-many-instance-attributes async with self.__state._lock: # pylint: disable=protected-access storage: (dict | None) = None if self.__state.storage: - if self.__writer: - # При загрузке файла показываем актуальную статистику вручную - await aiotools.shield_fg(self.__storage.reload_parts_info()) - storage = dataclasses.asdict(self.__state.storage) for name in list(storage["images"]): del storage["images"][name]["name"] @@ -321,18 +317,21 @@ class Plugin(BaseMsd): # pylint: disable=too-many-instance-attributes # до того, как мы не закончим все процедуры. async with self.__state._lock: # pylint: disable=protected-access try: - if image: - await image.set_complete(complete) + self.__notifier.notify() finally: try: - if image and remove_incomplete and not complete: - await image.remove(fatal=False) + if image: + await image.set_complete(complete) finally: try: - await self.__close_writer() + if image and remove_incomplete and not complete: + await image.remove(fatal=False) finally: - if image: - await image.remount_rw(False, fatal=False) + try: + await self.__close_writer() + finally: + if image: + await image.remount_rw(False, fatal=False) try: with self.__state._region: # pylint: disable=protected-access @@ -441,14 +440,14 @@ class Plugin(BaseMsd): # pylint: disable=too-many-instance-attributes await asyncio.sleep(5) with Inotify() as inotify: + # Из-за гонки между первым релоадом и установкой вотчеров, + # мы можем потерять какие-то каталоги стораджа, но это допустимо, + # так как всегда есть ручной перезапуск. await inotify.watch_all_changes(*self.__storage.get_watchable_paths()) await inotify.watch_all_changes(*self.__drive.get_watchable_paths()) # После установки вотчеров еще раз проверяем стейт, # чтобы не потерять состояние привода. - # Из-за гонки между первым релоадом и установкой вотчеров, - # мы можем потерять какие-то каталоги стораджа, но это допустимо, - # так как всегда есть ручной перезапуск. await self.__reload_state() while self.__state.vd: # Если живы после предыдущей проверки @@ -467,6 +466,11 @@ class Plugin(BaseMsd): # pylint: disable=too-many-instance-attributes break if need_reload_state: await self.__reload_state() + elif self.__writer: + # При загрузке файла обновляем статистику раз в секунду (по таймауту). + # Это не нужно при обычном релоаде, потому что там и так проверяются все разделы. + await self.__reload_parts_info() + except Exception: logger.exception("Unexpected MSD watcher error") await asyncio.sleep(1) @@ -476,6 +480,12 @@ class Plugin(BaseMsd): # pylint: disable=too-many-instance-attributes await self.__unsafe_reload_state() self.__notifier.notify() + async def __reload_parts_info(self) -> None: + assert self.__writer # Использовать только при записи образа + async with self.__state._lock: # pylint: disable=protected-access + await self.__storage.reload_parts_info() + self.__notifier.notify() + # ===== Don't call this directly ==== async def __unsafe_reload_state(self) -> None: |