From b1b9e7a7a8456aa17ac804a53d0717f1e160ac40 Mon Sep 17 00:00:00 2001 From: Joshua Harlow Date: Tue, 8 Apr 2014 14:27:11 -0700 Subject: [PATCH] Fix not found being raised when iterating Instead of re-raising a not found exception just silence those exceptions when iterating (and do not yield that job back in the first place) and then remove the job from the jobboard internals to avoid further iteration. Fixes bug 1304562 Change-Id: Ibc6d3ea55dc19e70104bfc801283b8ad919496c4 --- taskflow/jobs/backends/impl_zookeeper.py | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/taskflow/jobs/backends/impl_zookeeper.py b/taskflow/jobs/backends/impl_zookeeper.py index 360714b3..912b7702 100644 --- a/taskflow/jobs/backends/impl_zookeeper.py +++ b/taskflow/jobs/backends/impl_zookeeper.py @@ -209,8 +209,8 @@ class ZookeeperJobBoard(jobboard.JobBoard): if only_unclaimed: ok_states = UNCLAIMED_JOB_STATES with self._job_mutate: - known_jobs = list(six.itervalues(self._known_jobs)) - for (job, posting_state) in known_jobs: + known_jobs = list(six.iteritems(self._known_jobs)) + for (path, (job, posting_state)) in known_jobs: if posting_state != _READY: continue try: @@ -219,6 +219,10 @@ class ZookeeperJobBoard(jobboard.JobBoard): except excp.JobFailure as e: LOG.warn("Failed determining the state of job %s" " due to: %s", job.uuid, e) + except excp.NotFound: + # Someone destroyed it while we are iterating. + with self._job_mutate: + self._remove_job(path) def _remove_job(self, path): LOG.debug("Removing job that was at path: %s", path)