From 005f19eff0b4a92647e5847e306718be76704432 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 --- 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 052c491517df8..40064441e4e8b 100644 --- a/src/pybind/rados/rados.pyx +++ b/src/pybind/rados/rados.pyx @@ -1160,26 +1160,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 5eda5d612e866..52bdcfa921cc7 100644 --- a/src/test/pybind/test_rados.py +++ b/src/test/pybind/test_rados.py @@ -10,6 +10,7 @@ import threading import json import errno import os +import re import sys # Are we running Python 2.x @@ -240,7 +241,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.39.5