Browse Source

[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 năm trước cách đây
mục cha
commit
26d9545
1 tập tin đã thay đổi với 9 bổ sung1 xóa
  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()