From 303c8859681be6b1dc4f5d716cfad87845b1f80a Mon Sep 17 00:00:00 2001 From: Jason Dillaman Date: Tue, 19 Feb 2019 11:02:41 -0500 Subject: [PATCH] pybind/rados: fixed Python3 string conversion issue on get_fsid Fixes: http://tracker.ceph.com/issues/38381 Signed-off-by: Jason Dillaman (cherry picked from commit 005f19eff0b4a92647e5847e306718be76704432) Conflicts: src/test/pybind/test_rados.py - no "import os" in luminous --- src/pybind/rados/rados.pyx | 31 ++++++++++++++----------------- src/test/pybind/test_rados.py | 3 ++- 2 files changed, 16 insertions(+), 18 deletions(-) diff --git a/src/pybind/rados/rados.pyx b/src/pybind/rados/rados.pyx index 431f5a9f84e4..c17f013881dd 100644 --- a/src/pybind/rados/rados.pyx +++ b/src/pybind/rados/rados.pyx @@ -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 != buf_len: - _PyBytes_Resize(&ret_s, ret) - return ret_s + while True: + ret_buf = 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): diff --git a/src/test/pybind/test_rados.py b/src/test/pybind/test_rados.py index d510b2143f16..d477385c3ea6 100644 --- a/src/test/pybind/test_rados.py +++ b/src/test/pybind/test_rados.py @@ -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) -- 2.47.3