Skip to content

Commit

Permalink
rados: implement binding for rados_write_op_cmpext
Browse files Browse the repository at this point in the history
This commit implements binding for rados_write_op_cmpext RADOS Write operation.
Includes a unit test.

Signed-off-by: Robert Vasek <[email protected]>
  • Loading branch information
gman0 committed Sep 28, 2021
1 parent b425523 commit 2926a90
Show file tree
Hide file tree
Showing 2 changed files with 71 additions and 0 deletions.
31 changes: 31 additions & 0 deletions rados/write_op_preview.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
// +build ceph_preview

package rados

// #cgo LDFLAGS: -lrados
// #include <rados/librados.h>
//
import "C"

import (
"unsafe"
)

// CmpExt ensures that given object range (extent) satisfies comparison (PREVIEW).
//
// Implements:
// void rados_write_op_cmpext(rados_write_op_t write_op,
// const char * cmp_buf,
// size_t cmp_len,
// uint64_t off,
// int * prval);
func (w *WriteOp) CmpExt(b []byte, offset uint64, prval *int32) {
oe := newWriteStep(b, 0, offset)
w.steps = append(w.steps, oe)
C.rados_write_op_cmpext(
w.op,
oe.cBuffer,
oe.cDataLen,
oe.cOffset,
(*C.int)(unsafe.Pointer(prval)))
}
40 changes: 40 additions & 0 deletions rados/write_op_preview_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
// +build ceph_preview

package rados

import (
"github.com/stretchr/testify/assert"
)

func (suite *RadosTestSuite) TestWriteOpCmpExt() {
suite.SetupConnection()
ta := assert.New(suite.T())

oid := "TestWriteOpCmpExt"
data := []byte("compare this")
var prval int32

// Create an object and populate it with data.
op1 := CreateWriteOp()
defer op1.Release()
op1.Create(CreateIdempotent)
op1.WriteFull([]byte(data))
err := op1.Operate(suite.ioctx, oid, OperationNoFlag)
ta.NoError(err)

// Compare contents of the object. Should succeed.
op2 := CreateWriteOp()
defer op2.Release()
op2.CmpExt(data, 0, &prval)
err = op2.Operate(suite.ioctx, oid, OperationNoFlag)
ta.NoError(err)
ta.Equal(prval, int32(0))

// Compare contents of the object. Should fail.
op3 := CreateWriteOp()
defer op3.Release()
op3.CmpExt([]byte("xxx"), 0, &prval)
err = op3.Operate(suite.ioctx, oid, OperationNoFlag)
ta.Error(err)
ta.NotEqual(prval, int32(0))
}

0 comments on commit 2926a90

Please sign in to comment.