diff options
author | Loic Dachary <loic@dachary.org> | 2013-06-25 16:10:02 +0200 |
---|---|---|
committer | Loic Dachary <loic@dachary.org> | 2013-06-25 16:10:22 +0200 |
commit | 3016f46f53d4701ead1e30f2a3d67a39ca0050f8 (patch) | |
tree | 8178ac96f0e47c35b5356d7477c476dbe38da3dc | |
parent | 37a20174fd22a79938ba9c93046e8830f4a3306f (diff) | |
download | ceph-3016f46f53d4701ead1e30f2a3d67a39ca0050f8.tar.gz |
get_xattr() can return more than 4KB
Instead of failing if the attribute to be returned is larger than 4KB,
double the buffer size each time librados.rados_getxattr returns
-errno.ERANGE and try again.
http://tracker.ceph.com/issues/4907 fixes #4907
Signed-off-by: Loic Dachary <loic@dachary.org>
-rw-r--r-- | src/pybind/rados.py | 17 |
1 files changed, 11 insertions, 6 deletions
diff --git a/src/pybind/rados.py b/src/pybind/rados.py index 6e6d14ea1dd..13badc997f9 100644 --- a/src/pybind/rados.py +++ b/src/pybind/rados.py @@ -1328,12 +1328,17 @@ written." % (self.name, ret, length)) if not isinstance(xattr_name, str): raise TypeError('xattr_name must be a string') ret_length = 4096 - ret_buf = create_string_buffer(ret_length) - ret = run_in_thread(self.librados.rados_getxattr, - (self.io, c_char_p(key), c_char_p(xattr_name), - ret_buf, c_size_t(ret_length))) - if ret < 0: - raise make_ex(ret, "Failed to get xattr %r" % xattr_name) + while ret_length < 4096 * 1024 * 1024: + ret_buf = create_string_buffer(ret_length) + ret = run_in_thread(self.librados.rados_getxattr, + (self.io, c_char_p(key), c_char_p(xattr_name), + ret_buf, c_size_t(ret_length))) + if (ret == -errno.ERANGE): + ret_length *= 2 + elif ret < 0: + raise make_ex(ret, "Failed to get xattr %r" % xattr_name) + else: + break return ctypes.string_at(ret_buf, ret) def get_xattrs(self, oid): |