]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
rados.py: avoid CephManager creation race
authorLoic Dachary <loic@dachary.org>
Thu, 14 Aug 2014 08:49:45 +0000 (10:49 +0200)
committerLoic Dachary <loic@dachary.org>
Thu, 14 Aug 2014 08:57:35 +0000 (10:57 +0200)
gevent may hold the rados.py thread when it has an opportunity. The

   if not hasattr(ctx, 'manager'):

must therefore be immediately before the manager creation it is supposed
to protect. If any of the functions called as a side effect of

   first_mon = teuthology.get_first_mon(ctx, config)
   (mon,) = ctx.cluster.only(first_mon).remotes.iterkeys()

give gevent an opportunity to hold the thread, it creates a race
condition.

The other possibility would be use a ctx lock to protect the code, but
this solution seem simpler.

http://tracker.ceph.com/issues/9027 Fixes: #9027

Signed-off-by: Loic Dachary <loic@dachary.org>
tasks/rados.py

index 537deac0f25dc6c48f16f8b6c6d7d7fd6c792086..3bc17cc8f5c6466132ef98c3c80b7cc1b904b3ac 100644 (file)
@@ -142,9 +142,9 @@ def task(ctx, config):
 
     def thread():
         """Thread spawned by gevent"""
+        first_mon = teuthology.get_first_mon(ctx, config)
+        (mon,) = ctx.cluster.only(first_mon).remotes.iterkeys()
         if not hasattr(ctx, 'manager'):
-            first_mon = teuthology.get_first_mon(ctx, config)
-            (mon,) = ctx.cluster.only(first_mon).remotes.iterkeys()
             ctx.manager = CephManager(
                 mon,
                 ctx=ctx,