From: Ivan Kolodyazhny Date: Wed, 1 Jul 2015 18:54:23 +0000 (+0300) Subject: Fix block eventlet threads on rbd calls X-Git-Url: https://review.fuel-infra.org/gitweb?a=commitdiff_plain;h=1bbbd4666ae73abd0cbc045a19b27c578a740157;p=openstack-build%2Fcinder-build.git Fix block eventlet threads on rbd calls Commit Ibaf43858d60e1320c339f2523b5c09c7f7c7f91e caused new problem with cross thread communication. According to Python documentation, code can lead to a deadlock if the spawned thread directly or indirectly attempts to import a module. python-rados spawns new thread to connect to cluster. So I removed new spawning new thread to connect to rados. All long-running operations calls whith python-rbd are still implemented in native Python threads to block eventlet loop. Change-Id: Ic9971254102914080383b63cd2807e36213dd6eb Closes-Bug: #1401335 --- diff --git a/cinder/volume/drivers/rbd.py b/cinder/volume/drivers/rbd.py index 9b8e613f6..f8f9143fa 100644 --- a/cinder/volume/drivers/rbd.py +++ b/cinder/volume/drivers/rbd.py @@ -319,14 +319,10 @@ class RBDDriver(driver.RetypeVD, driver.TransferVD, driver.ExtendVD, LOG.debug("opening connection to ceph cluster (timeout=%s).", self.configuration.rados_connect_timeout) - # NOTE (e0ne): rados is binding to C lbirary librados. - # It blocks eventlet loop so we need to run it in a native - # python thread. - client = tpool.Proxy( - self.rados.Rados( - rados_id=self.configuration.rbd_user, - clustername=self.configuration.rbd_cluster_name, - conffile=self.configuration.rbd_ceph_conf)) + client = self.rados.Rados( + rados_id=self.configuration.rbd_user, + clustername=self.configuration.rbd_cluster_name, + conffile=self.configuration.rbd_ceph_conf) if pool is not None: pool = utils.convert_str(pool) else: