]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
pybind/rados:add WriteOp::cmpext()
authorzhangjiao <zhangjiao@cmss.chinamobile.com>
Fri, 11 Dec 2020 10:21:51 +0000 (18:21 +0800)
committerzhangjiao <zhangjiao@cmss.chinamobile.com>
Fri, 8 Jan 2021 08:51:31 +0000 (16:51 +0800)
Signed-off-by: Zhang Jiao <zhangjiao_yewu@cmss.chinamobile.com>
src/pybind/rados/c_rados.pxd
src/pybind/rados/mock_rados.pxi
src/pybind/rados/rados.pyx

index 75ee9a51298bec32550a29f1eca5d6ccd832831f..f16e8678b98c28162252b31ec11b0b1dfa640c89 100644 (file)
@@ -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)
index dcd79ed66ad8c206c5523932de6b6bc9934a9591..32100de995cdb732b2ab17969151788b1ddf6ae6 100644 (file)
@@ -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):
index bdab1339dbcd065168ac7002719baec6c92fecee..0dc59fe43b949ae4a10b1bbcdc68e7bb96541696 100644 (file)
@@ -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"""