From: Josh Durgin Date: Tue, 10 Feb 2015 04:50:23 +0000 (-0800) Subject: rados.py: keep reference to python callbacks X-Git-Tag: v0.87.2~27^2 X-Git-Url: http://git.apps.os.sepia.ceph.com/?a=commitdiff_plain;h=28583276254ba6121b93688a6c6d8fab6588c864;p=ceph.git rados.py: keep reference to python callbacks If we don't keep a reference to these, the librados aio calls will segfault since the python-level callbacks will have been garbage collected. Passing them to aio_create_completion() does not take a reference to them. Keep a reference in the python Completion object associated with the request, since they need the same lifetime. This fixes a regression from 60b019f69aa0e39d276c669698c92fc890599f50. Fixes: #10775 Backport: dumpling, firefly, giant Signed-off-by: Josh Durgin (cherry picked from commit 36d37aadbbbece28d70e827511f1a473d851463d) (cherry picked from commit 5f1245e131e33a98572408c8223deed2c7cf7b75) --- diff --git a/src/pybind/rados.py b/src/pybind/rados.py index fe517f2598689..bfa1b6180355f 100644 --- a/src/pybind/rados.py +++ b/src/pybind/rados.py @@ -825,11 +825,14 @@ class Snap(object): class Completion(object): """completion object""" - def __init__(self, ioctx, rados_comp, oncomplete, onsafe): + def __init__(self, ioctx, rados_comp, oncomplete, onsafe, + complete_cb, safe_cb): self.rados_comp = rados_comp self.oncomplete = oncomplete self.onsafe = onsafe self.ioctx = ioctx + self.complete_cb = complete_cb + self.safe_cb = safe_cb def wait_for_safe(self): """ @@ -948,7 +951,8 @@ class Ioctx(object): if ret < 0: raise make_ex(ret, "error getting a completion") with self.lock: - completion_obj = Completion(self, completion, oncomplete, onsafe) + completion_obj = Completion(self, completion, oncomplete, onsafe, + complete_cb, safe_cb) if oncomplete: self.complete_cbs[completion.value] = completion_obj if onsafe: