]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
rados.py: keep reference to python callbacks 4046/head
authorJosh Durgin <jdurgin@redhat.com>
Tue, 10 Feb 2015 04:50:23 +0000 (20:50 -0800)
committerLoic Dachary <ldachary@redhat.com>
Tue, 17 Mar 2015 16:47:53 +0000 (17:47 +0100)
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 <jdurgin@redhat.com>
(cherry picked from commit 36d37aadbbbece28d70e827511f1a473d851463d)
(cherry picked from commit 5f1245e131e33a98572408c8223deed2c7cf7b75)

src/pybind/rados.py

index fe517f25986899fe3d97d9a2bc700c652aa4eeb8..bfa1b6180355fa7bb4eddd1d49421cef302a9a57 100644 (file)
@@ -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: