]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
pybind/rados: fixed Python3 string conversion issue on get_fsid 27674/head
authorJason Dillaman <dillaman@redhat.com>
Tue, 19 Feb 2019 16:02:41 +0000 (11:02 -0500)
committerNathan Cutler <ncutler@suse.com>
Thu, 18 Apr 2019 09:36:25 +0000 (11:36 +0200)
Fixes: http://tracker.ceph.com/issues/38381
Signed-off-by: Jason Dillaman <dillaman@redhat.com>
(cherry picked from commit 005f19eff0b4a92647e5847e306718be76704432)

Conflicts:
src/test/pybind/test_rados.py
- no "import os" in luminous

src/pybind/rados/rados.pyx
src/test/pybind/test_rados.py

index 431f5a9f84e44ac24afa24261c1f606e809b09b8..c17f013881ddadecba3b4773bf1426069dd8e72e 100644 (file)
@@ -1157,26 +1157,23 @@ Rados object in state %s." % self.state)
         """
         self.require_state("connected")
         cdef:
-            char *ret_buf
-            size_t buf_len = 37
-            PyObject* ret_s = NULL
+            char *ret_buf = NULL
+            size_t buf_len = 64
 
-        ret_s = PyBytes_FromStringAndSize(NULL, buf_len)
         try:
-            ret_buf = PyBytes_AsString(ret_s)
-            with nogil:
-                ret = rados_cluster_fsid(self.cluster, ret_buf, buf_len)
-            if ret < 0:
-                raise make_ex(ret, "error getting cluster fsid")
-            if ret != <int>buf_len:
-                _PyBytes_Resize(&ret_s, ret)
-            return <object>ret_s
+            while True:
+                ret_buf = <char *>realloc_chk(ret_buf, buf_len)
+                with nogil:
+                    ret = rados_cluster_fsid(self.cluster, ret_buf, buf_len)
+                if ret == -errno.ERANGE:
+                    buf_len = buf_len * 2
+                elif ret < 0:
+                    raise make_ex(ret, "error getting cluster fsid")
+                else:
+                    break
+            return decode_cstr(ret_buf)
         finally:
-            # We DECREF unconditionally: the cast to object above will have
-            # INCREFed if necessary. This also takes care of exceptions,
-            # including if _PyString_Resize fails (that will free the string
-            # itself and set ret_s to NULL, hence XDECREF).
-            ref.Py_XDECREF(ret_s)
+            free(ret_buf)
 
     @requires(('ioctx_name', str_type))
     def open_ioctx(self, ioctx_name):
index d510b2143f160fa433bb33af7f94dbb533d0318c..d477385c3ea63f4bc64094ddcc4abfb3e85e5946 100644 (file)
@@ -9,6 +9,7 @@ import time
 import threading
 import json
 import errno
+import re
 import sys
 
 # Are we running Python 2.x
@@ -244,7 +245,7 @@ class TestRados(object):
 
     def test_get_fsid(self):
         fsid = self.rados.get_fsid()
-        eq(len(fsid), 36)
+        assert re.match('[0-9a-f\-]{36}', fsid, re.I)
 
     def test_blacklist_add(self):
         self.rados.blacklist_add("1.2.3.4/123", 1)