Merge pull request #1557 from croneter/fix-racing

Fix a racing condition that could lead to the sync getting stuck
This commit is contained in:
croneter 2021-07-25 11:21:04 +02:00 committed by GitHub
commit 6201a04513
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
3 changed files with 22 additions and 1 deletions

View file

@ -170,6 +170,24 @@ class ProcessingQueue(Queue.Queue, object):
with self.mutex: with self.mutex:
self._add_section(section) self._add_section(section)
def change_section_number_of_items(self, section, number_of_items):
"""
Hit this method if you've reset section.number_of_items to make
sure we're not blocking
"""
with self.mutex:
self._change_section_number_of_items(section, number_of_items)
def _change_section_number_of_items(self, section, number_of_items):
section.number_of_items = number_of_items
if (self._current_section == section
and self._counter == number_of_items):
# We were actually waiting for more items to come in - but there
# aren't any!
self._init_next_section()
if self._qsize() > 0:
self.not_empty.notify()
def _add_section(self, section): def _add_section(self, section):
self._sections.append(section) self._sections.append(section)
self._queues.append( self._queues.append(

View file

@ -62,7 +62,8 @@ class FillMetadataQueue(common.LibrarySyncMixin,
count += 1 count += 1
# We might have received LESS items from the PMS than anticipated. # We might have received LESS items from the PMS than anticipated.
# Ensures that our queues finish # Ensures that our queues finish
section.number_of_items = count self.processing_queue.change_section_number_of_items(section,
count)
LOG.debug('%s items to process for section %s', LOG.debug('%s items to process for section %s',
section.number_of_items, section) section.number_of_items, section)

View file

@ -109,6 +109,8 @@ class Section(object):
Sections compare equal if their section_id, name and plex_type (first Sections compare equal if their section_id, name and plex_type (first
prio) OR section_type (if there is no plex_type is set) compare equal prio) OR section_type (if there is no plex_type is set) compare equal
""" """
if not isinstance(section, Section):
return False
return (self.section_id == section.section_id and return (self.section_id == section.section_id and
self.name == section.name and self.name == section.name and
(self.plex_type == section.plex_type if self.plex_type else (self.plex_type == section.plex_type if self.plex_type else