From 3258c610a62d1a0bfb9a9abde951bff9f9252599 Mon Sep 17 00:00:00 2001 From: zhangjiao Date: Fri, 11 Dec 2020 18:21:51 +0800 Subject: [PATCH] pybind/rados:add WriteOp::cmpext() Signed-off-by: Zhang Jiao --- src/pybind/rados/c_rados.pxd | 1 + src/pybind/rados/mock_rados.pxi | 2 ++ src/pybind/rados/rados.pyx | 21 +++++++++++++++++++++ 3 files changed, 24 insertions(+) diff --git a/src/pybind/rados/c_rados.pxd b/src/pybind/rados/c_rados.pxd index 75ee9a51298..f16e8678b98 100644 --- a/src/pybind/rados/c_rados.pxd +++ b/src/pybind/rados/c_rados.pxd @@ -258,6 +258,7 @@ cdef extern from "rados/librados.h" nogil: int rados_write_op_operate(rados_write_op_t write_op, rados_ioctx_t io, const char * oid, time_t * mtime, int flags) int rados_aio_write_op_operate(rados_write_op_t write_op, rados_ioctx_t io, rados_completion_t completion, const char *oid, time_t *mtime, int flags) + void rados_write_op_cmpext(rados_write_op_t write_op, const char *cmp_buf, size_t cmp_len, uint64_t off, int *prval) void rados_write_op_omap_set(rados_write_op_t write_op, const char * const* keys, const char * const* vals, const size_t * lens, size_t num) void rados_write_op_omap_rm_keys(rados_write_op_t write_op, const char * const* keys, size_t keys_len) void rados_write_op_omap_clear(rados_write_op_t write_op) diff --git a/src/pybind/rados/mock_rados.pxi b/src/pybind/rados/mock_rados.pxi index dcd79ed66ad..32100de995c 100644 --- a/src/pybind/rados/mock_rados.pxi +++ b/src/pybind/rados/mock_rados.pxi @@ -378,6 +378,8 @@ cdef nogil: pass int rados_aio_write_op_operate(rados_write_op_t write_op, rados_ioctx_t io, rados_completion_t completion, const char *oid, time_t *mtime, int flags): pass + void rados_write_op_cmpext(rados_write_op_t write_op, const char *cmp_buf, size_t cmp_len, uint64_t off, int *prval): + pass void rados_write_op_omap_set(rados_write_op_t write_op, const char * const* keys, const char * const* vals, const size_t * lens, size_t num): pass void rados_write_op_omap_rm_keys(rados_write_op_t write_op, const char * const* keys, size_t keys_len): diff --git a/src/pybind/rados/rados.pyx b/src/pybind/rados/rados.pyx index bdab1339dbc..0dc59fe43b9 100644 --- a/src/pybind/rados/rados.pyx +++ b/src/pybind/rados/rados.pyx @@ -90,6 +90,11 @@ class InvalidArgumentError(Error): super(InvalidArgumentError, self).__init__( "RADOS invalid argument (%s)" % message, errno) +class ExtendMismatch(Error): + def __init__(self, message, errno, offset): + super().__init__( + "object content does not match (%s)" % message, errno) + self.offset = offset class OSError(Error): """ `OSError` class, derived from `Error` """ @@ -261,6 +266,9 @@ cdef make_ex(ret: int, msg: str): ret = abs(ret) if ret in errno_to_exception: return errno_to_exception[ret](msg, errno=ret) + elif ret > MAX_ERRNO: + offset = ret - MAX_ERRNO + return ExtendMismatch(msg, ret, offset) else: return OSError(msg, errno=ret) @@ -1889,6 +1897,19 @@ cdef class WriteOp(object): with nogil: rados_write_op_writesame(self.write_op, _to_write, _data_len, _write_len, _offset) + def cmpext(self, cmp_buf: bytes, offset: int = 0): + """ + Ensure that given object range (extent) satisfies comparison + :param cmp_buf: buffer containing bytes to be compared with object contents + :param offset: object byte offset at which to start the comparison + """ + cdef: + char *_cmp_buf = cmp_buf + size_t _cmp_buf_len = len(cmp_buf) + uint64_t _offset = offset + with nogil: + rados_write_op_cmpext(self.write_op, _cmp_buf, _cmp_buf_len, _offset, NULL) + class WriteOpCtx(WriteOp, OpCtx): """write operation context manager""" -- 2.39.5