]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
mgr/dashboard: Fix data race and use-before-assignment 21590/head
authorSebastian Wagner <sebastian.wagner@suse.com>
Mon, 23 Apr 2018 08:13:28 +0000 (10:13 +0200)
committerSebastian Wagner <sebastian.wagner@suse.com>
Mon, 23 Apr 2018 08:13:28 +0000 (10:13 +0200)
The race happes, if a task raises an exception very early.
Then, `self.getter_thread.event` fails as `getter_thread` is
already `None`

Also fix use-before-assignment, as `t0` and `t1` are only defined,
if no exception was raised.

Signed-off-by: Sebastian Wagner <sebastian.wagner@suse.com>
src/pybind/mgr/dashboard/tools.py

index 6175140bd719cd439364935712a62113c3b83e49..05b42d8469ac4d3a0d6fea5840310d9ee8f7b25e 100644 (file)
@@ -113,18 +113,21 @@ class ViewCache(object):
 
         # pylint: disable=broad-except
         def run(self):
+            t0 = 0
+            t1 = 0
             try:
                 t0 = time.time()
                 logger.debug("VC: starting execution of %s", self.fn)
                 val = self.fn(*self.args, **self.kwargs)
                 t1 = time.time()
             except Exception as ex:
-                logger.exception("Error while calling fn=%s ex=%s", self.fn,
-                                 str(ex))
-                self._view.value = None
-                self._view.value_when = None
-                self._view.getter_thread = None
-                self._view.exception = ex
+                with self._view.lock:
+                    logger.exception("Error while calling fn=%s ex=%s", self.fn,
+                                     str(ex))
+                    self._view.value = None
+                    self._view.value_when = None
+                    self._view.getter_thread = None
+                    self._view.exception = ex
             else:
                 with self._view.lock:
                     self._view.latency = t1 - t0