From 473852e563c8666a803701c7cf855aef6fdeca7e Mon Sep 17 00:00:00 2001
From: finnball <finn.ball@codethink.co.uk>
Date: Mon, 10 Sep 2018 15:21:15 +0100
Subject: [PATCH] Fixed race condition.

If a job was marked as completed, it may be destroyed before
it had time to update the lease state.
---
 buildgrid/server/scheduler.py             | 5 -----
 buildgrid/server/worker/bots_interface.py | 2 +-
 2 files changed, 1 insertion(+), 6 deletions(-)

diff --git a/buildgrid/server/scheduler.py b/buildgrid/server/scheduler.py
index a9740384b..93b826e7f 100644
--- a/buildgrid/server/scheduler.py
+++ b/buildgrid/server/scheduler.py
@@ -82,13 +82,10 @@ class Scheduler:
                 job.n_tries += 1
                 self.queue.appendleft(job)
 
-            self.jobs[name] = job
-
     def job_complete(self, name, result):
         job = self.jobs[name]
         job.result = result
         job.update_execute_stage(ExecuteStage.COMPLETED)
-        self.jobs[name] = job
         if not job.do_not_cache and self._action_cache is not None:
             self._action_cache.update_action_result(job.action_digest, result)
 
@@ -101,7 +98,6 @@ class Scheduler:
     def update_job_lease_state(self, name, state):
         job = self.jobs[name]
         job.lease.state = state
-        self.jobs[name] = job
 
     def get_job_lease(self, name):
         return self.jobs[name].lease
@@ -118,5 +114,4 @@ class Scheduler:
             job.update_execute_stage(ExecuteStage.EXECUTING)
             job.lease = job.create_lease()
             job.lease.state = LeaseState.PENDING.value
-            self.jobs[job.name] = job
             yield job.lease
diff --git a/buildgrid/server/worker/bots_interface.py b/buildgrid/server/worker/bots_interface.py
index 3937108b9..9ebbc7dca 100644
--- a/buildgrid/server/worker/bots_interface.py
+++ b/buildgrid/server/worker/bots_interface.py
@@ -113,8 +113,8 @@ class BotsInterface:
                 pass
 
             elif client_state == LeaseState.COMPLETED:
-                self._scheduler.job_complete(client_lease.id, client_lease.result)
                 self._scheduler.update_job_lease_state(client_lease.id, client_lease.state)
+                self._scheduler.job_complete(client_lease.id, client_lease.result)
                 return None
 
             else:
-- 
GitLab