From f192c0912c6ecdc04f9485f25489485d6e724d83 Mon Sep 17 00:00:00 2001 From: croneter Date: Sun, 31 Jan 2021 17:39:44 +0100 Subject: [PATCH] Hopefully fix rare case when sync would get stuck indefinitely --- resources/lib/backgroundthread.py | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/resources/lib/backgroundthread.py b/resources/lib/backgroundthread.py index 831b3274..5c095720 100644 --- a/resources/lib/backgroundthread.py +++ b/resources/lib/backgroundthread.py @@ -136,6 +136,11 @@ class ProcessingQueue(Queue.Queue, object): return self._current_queue._qsize() if self._current_queue else 0 def _total_qsize(self): + """ + This method is BROKEN as it can lead to a deadlock when a single item + from the current section takes longer to download then any new items + coming in + """ return sum(q._qsize() for q in self._queues) if self._queues else 0 def put(self, item, block=True, timeout=None): @@ -147,16 +152,16 @@ class ProcessingQueue(Queue.Queue, object): try: if self.maxsize > 0: if not block: - if self._total_qsize() == self.maxsize: + if self._qsize() == self.maxsize: raise Queue.Full elif timeout is None: - while self._total_qsize() == self.maxsize: + while self._qsize() == self.maxsize: self.not_full.wait() elif timeout < 0: raise ValueError("'timeout' must be a non-negative number") else: endtime = _time() + timeout - while self._total_qsize() == self.maxsize: + while self._qsize() == self.maxsize: remaining = endtime - _time() if remaining <= 0.0: raise Queue.Full