Don't watch inotify modify events because they fires on every write()

This commit is contained in:
Maxim Devaev 2024-10-28 17:20:13 +02:00
parent 60f413c1f4
commit 2195acf2ff
3 changed files with 11 additions and 10 deletions

View File

@ -130,13 +130,12 @@ class InotifyMask:
# | OPEN # | OPEN
# ) # )
# Helper for all modify events # Helper for all changes events except MODIFY, because it fires on each write()
ALL_MODIFY_EVENTS = ( ALL_CHANGES_EVENTS = (
CLOSE_WRITE CLOSE_WRITE
| CREATE | CREATE
| DELETE | DELETE
| DELETE_SELF | DELETE_SELF
| MODIFY
| MOVE_SELF | MOVE_SELF
| MOVED_FROM | MOVED_FROM
| MOVED_TO | MOVED_TO
@ -202,8 +201,8 @@ class Inotify:
self.__events_queue: "asyncio.Queue[InotifyEvent]" = asyncio.Queue() self.__events_queue: "asyncio.Queue[InotifyEvent]" = asyncio.Queue()
async def watch_all_modify(self, *paths: str) -> None: async def watch_all_changes(self, *paths: str) -> None:
await self.watch(InotifyMask.ALL_MODIFY_EVENTS, *paths) await self.watch(InotifyMask.ALL_CHANGES_EVENTS, *paths)
async def watch(self, mask: int, *paths: str) -> None: async def watch(self, mask: int, *paths: str) -> None:
for path in paths: for path in paths:
@ -237,7 +236,7 @@ class Inotify:
except asyncio.TimeoutError: except asyncio.TimeoutError:
return None return None
async def get_series(self, timeout: float) -> list[InotifyEvent]: async def get_series(self, timeout: float, max_series: int=64) -> list[InotifyEvent]:
series: list[InotifyEvent] = [] series: list[InotifyEvent] = []
event = await self.get_event(timeout) event = await self.get_event(timeout)
if event: if event:
@ -246,6 +245,8 @@ class Inotify:
event = await self.get_event(timeout) event = await self.get_event(timeout)
if event: if event:
series.append(event) series.append(event)
if len(series) >= max_series:
break
return series return series
def __read_and_queue_events(self) -> None: def __read_and_queue_events(self) -> None:

View File

@ -439,8 +439,8 @@ class Plugin(BaseMsd): # pylint: disable=too-many-instance-attributes
await asyncio.sleep(5) await asyncio.sleep(5)
with Inotify() as inotify: with Inotify() as inotify:
await inotify.watch_all_modify(*self.__storage.get_watchable_paths()) await inotify.watch_all_changes(*self.__storage.get_watchable_paths())
await inotify.watch_all_modify(*self.__drive.get_watchable_paths()) await inotify.watch_all_changes(*self.__drive.get_watchable_paths())
# После установки вотчеров еще раз проверяем стейт, # После установки вотчеров еще раз проверяем стейт,
# чтобы не потерять состояние привода. # чтобы не потерять состояние привода.

View File

@ -81,8 +81,8 @@ class Plugin(BaseUserGpioDriver):
await asyncio.sleep(5) await asyncio.sleep(5)
with Inotify() as inotify: with Inotify() as inotify:
await inotify.watch_all_modify(os.path.dirname(self.__udc_path)) await inotify.watch_all_changes(os.path.dirname(self.__udc_path))
await inotify.watch_all_modify(self.__profile_path) await inotify.watch_all_changes(self.__profile_path)
self._notifier.notify() self._notifier.notify()
while True: while True:
need_restart = False need_restart = False