From b7c64443db310325881076aab9f415160434455e Mon Sep 17 00:00:00 2001 From: Eric Callahan Date: Wed, 24 Nov 2021 06:18:28 -0500 Subject: [PATCH] file_manager: refactor metadata processing When destructively iterating over pending metdata requests don't pop the pending item until metadata processing is complete. If a call to `parse_metadata()` has a request pending, return the asyncio Event associated with that request. Signed-off-by: Eric Callahan --- moonraker/components/file_manager/file_manager.py | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/moonraker/components/file_manager/file_manager.py b/moonraker/components/file_manager/file_manager.py index 2fdf9a2..a14c2fc 100644 --- a/moonraker/components/file_manager/file_manager.py +++ b/moonraker/components/file_manager/file_manager.py @@ -1492,11 +1492,14 @@ class MetadataStorage: fname: str, path_info: Dict[str, Any] ) -> asyncio.Event: + if fname in self.pending_requests: + return self.pending_requests[fname][1] mevt = asyncio.Event() ext = os.path.splitext(fname)[1] - if fname in self.pending_requests or \ - ext not in VALID_GCODE_EXTS or \ - self._has_valid_data(fname, path_info): + if ( + ext not in VALID_GCODE_EXTS or + self._has_valid_data(fname, path_info) + ): # request already pending or not necessary mevt.set() return mevt @@ -1511,7 +1514,7 @@ class MetadataStorage: async def _process_metadata_update(self) -> None: while self.pending_requests: fname, (path_info, mevt) = \ - self.pending_requests.popitem() + list(self.pending_requests.items())[0] if self._has_valid_data(fname, path_info): mevt.set() continue @@ -1535,6 +1538,7 @@ class MetadataStorage: } logging.info( f"Unable to extract medatadata from file: {fname}") + self.pending_requests.pop(fname, None) mevt.set() self.busy = False