use timers for periodic tasks

- This change moves execution of the periodic tasks
  to the sync thread and removes the periodic thread.
- This change delays submitting startup task until
  sync.run is started on the sync thread.
- This change converts to using timer threads to submit
  periodics tasks instead of looping with sleeps.

Change-Id: Ieaaa3e415802509a63322f40574a39a077552afe
This commit is contained in:
Sean Mooney 2019-04-17 03:05:04 +01:00
parent e5aa48dfd1
commit fa74f249a5
1 changed files with 26 additions and 26 deletions

View File

@ -1350,6 +1350,7 @@ class Sync(object):
self.version = (0, 0, 0) self.version = (0, 0, 0)
self.offline = False self.offline = False
self.account_id = None self.account_id = None
self.disable_background_sync = disable_background_sync
self.app = app self.app = app
self.log = logging.getLogger('gertty.sync') self.log = logging.getLogger('gertty.sync')
self.queue = PQueue() self.queue = PQueue()
@ -1363,33 +1364,20 @@ class Sync(object):
authclass = requests.auth.HTTPDigestAuth authclass = requests.auth.HTTPDigestAuth
self.auth = authclass( self.auth = authclass(
self.app.config.username, self.app.config.password) self.app.config.username, self.app.config.password)
self.submitTask(GetVersionTask(HIGH_PRIORITY))
self.submitTask(SyncOwnAccountTask(HIGH_PRIORITY))
if not disable_background_sync:
self.submitTask(CheckReposTask(HIGH_PRIORITY))
self.submitTask(UploadReviewsTask(HIGH_PRIORITY))
self.submitTask(SyncProjectListTask(HIGH_PRIORITY))
self.submitTask(SyncSubscribedProjectsTask(NORMAL_PRIORITY))
self.submitTask(SyncSubscribedProjectBranchesTask(LOW_PRIORITY))
self.submitTask(SyncOutdatedChangesTask(LOW_PRIORITY))
self.submitTask(PruneDatabaseTask(self.app.config.expire_age, LOW_PRIORITY))
self.periodic_thread = threading.Thread(target=self.periodicSync)
self.periodic_thread.daemon = True
self.periodic_thread.start()
def periodicSync(self): def syncPeriodic(self):
hourly = time.time() self.submitTask(SyncSubscribedProjectsTask(LOW_PRIORITY))
while True: self.syncTimer = threading.Timer(60, self.syncPeriodic)
try: self.syncTimer.daemon = True
time.sleep(60) self.syncTimer.start()
self.syncSubscribedProjects()
now = time.time() def hourlyPeriodic(self):
if now-hourly > 3600: self.submitTask(SyncOutdatedChangesTask(LOW_PRIORITY))
hourly = now self.submitTask(PruneDatabaseTask(self.app.config.expire_age,
self.pruneDatabase() LOW_PRIORITY))
self.syncOutdatedChanges() self.hourlyTimer = threading.Timer(3600, self.hourlyPeriodic)
except Exception: self.hourlyTimer.daemon = True
self.log.exception('Exception in periodicSync') self.hourlyTimer.start()
def submitTask(self, task): def submitTask(self, task):
if not self.offline: if not self.offline:
@ -1398,7 +1386,19 @@ class Sync(object):
else: else:
task.complete(False) task.complete(False)
def submitStartupTasks(self):
self.submitTask(GetVersionTask(HIGH_PRIORITY))
self.submitTask(SyncOwnAccountTask(HIGH_PRIORITY))
if not self.disable_background_sync:
self.submitTask(CheckReposTask(HIGH_PRIORITY))
self.submitTask(UploadReviewsTask(HIGH_PRIORITY))
self.submitTask(SyncProjectListTask(HIGH_PRIORITY))
self.syncPeriodic()
self.hourlyPeriodic()
def run(self, pipe): def run(self, pipe):
self.submitStartupTasks()
task = None task = None
while True: while True:
task = self._run(pipe, task) task = self._run(pipe, task)