diff options
author | Josh Durgin <josh.durgin@inktank.com> | 2013-06-25 10:57:41 -0700 |
---|---|---|
committer | Josh Durgin <josh.durgin@inktank.com> | 2013-06-25 10:57:41 -0700 |
commit | 0e1612b3c42f81ba4627eaf89f36f598b363617d (patch) | |
tree | f0dbeac6ba51fe6e3de7114a9c9958fcf1a284de | |
parent | 12678a10938e1156cbce966a40344fc70abd66d2 (diff) | |
parent | 3016f46f53d4701ead1e30f2a3d67a39ca0050f8 (diff) | |
download | ceph-0e1612b3c42f81ba4627eaf89f36f598b363617d.tar.gz |
Merge pull request #380 from dachary/wip-4907
get_xattr() can return more than 4KB
Reviewed-by: Josh Durgin <josh.durgin@inktank.com>
-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): |