file_manager: fix notification sync on fast machines
Desktop class PCs may exit the request before the inotify observer gains control of the loop. When the observer does gain control it will immediately notify as the sync mutex is no longer held, this can result in sending the websocket notification before the response has returned. Delay all notifications by 5ms to prevent this. Signed-off-by: Eric Callahan <arksine.code@gmail.com>
This commit is contained in:
parent
a02209443e
commit
fce056e481
|
@ -2144,22 +2144,18 @@ class InotifyObserver(BaseFileSystemObserver):
|
|||
source_root, source_path)
|
||||
result['source_item'] = {'path': src_rel_path, 'root': source_root}
|
||||
key = f"{action}-{root}-{rel_path}"
|
||||
if sync_fut is not None:
|
||||
# Delay this notification so that it occurs after an item
|
||||
logging.debug(f"Syncing notification: {full_path}")
|
||||
self.event_loop.register_callback(
|
||||
self._sync_with_request, result, sync_fut, key
|
||||
self.event_loop.create_task(
|
||||
self._finish_notify(result, sync_fut, key)
|
||||
)
|
||||
else:
|
||||
self.file_manager.cancel_notification(key)
|
||||
self.server.send_event("file_manager:filelist_changed", result)
|
||||
|
||||
async def _sync_with_request(
|
||||
async def _finish_notify(
|
||||
self,
|
||||
result: Dict[str, Any],
|
||||
sync_fut: asyncio.Future,
|
||||
sync_fut: Optional[asyncio.Future],
|
||||
notify_key: str
|
||||
) -> None:
|
||||
if sync_fut is not None:
|
||||
logging.debug(f"Syncing notification: {notify_key}")
|
||||
await sync_fut
|
||||
self.file_manager.cancel_notification(notify_key)
|
||||
await asyncio.sleep(.005)
|
||||
|
|
Loading…
Reference in New Issue