Pārlūkot izejas kodu

[desktop] Fix another deadlock fetching thrift clients

Wait until the queue has been filled with connections before adding
it to the pool. This is done last because any exceptions thrown
by the client construction could result in there being no
connections available in this pool. When `get_client` is called next,
it would skip this block because the key has a value, but then it
would deadlock later because there are no connections for it to
fetch from the pool.
Erick Tryzelaar 10 gadi atpakaļ
vecāks
revīzija
26d9545
1 mainītis faili ar 9 papildinājumiem un 1 dzēšanām
  1. 9 1
      desktop/core/src/desktop/lib/thrift_util.py

+ 9 - 1
desktop/core/src/desktop/lib/thrift_util.py

@@ -184,11 +184,19 @@ class ConnectionPooler(object):
       try:
         if _get_pool_key(conf) not in self.pooldict:
           q = LifoQueue(self.poolsize)
-          self.pooldict[_get_pool_key(conf)] = q
           for i in xrange(self.poolsize):
             client = construct_superclient(conf)
             client.CID = i
             q.put(client, False)
+
+          # Wait until the queue has been filled with connections before adding
+          # it to the pool. This is done last because any exceptions thrown
+          # by the client construction could result in there being no
+          # connections available in this pool. When `get_client` is called next,
+          # it would skip this block because the key has a value, but then it
+          # would deadlock later because there are no connections for it to
+          # fetch from the pool.
+          self.pooldict[_get_pool_key(conf)] = q
       finally:
         self.dictlock.release()