mirror of https://github.com/ceph/go-ceph
Merge pull request #12 from theanalyst/f/rw_xattr
ioctx: get/set xattr added Signed-off-by: Noah Watkins <noahwatkins@gmail.com>
This commit is contained in:
commit
85ccb42861
|
@ -191,3 +191,46 @@ func (ioctx *IOContext) ListObjects(listFn ObjectListFunc) error {
|
||||||
|
|
||||||
panic("invalid state")
|
panic("invalid state")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// GetXattr gets an xattr with key `name`, it returns the length of
|
||||||
|
// the key read or an error if not successful
|
||||||
|
func (ioctx *IOContext) GetXattr(object string, name string, data []byte) (int, error) {
|
||||||
|
c_object := C.CString(object)
|
||||||
|
c_name := C.CString(name)
|
||||||
|
defer C.free(unsafe.Pointer(c_object))
|
||||||
|
defer C.free(unsafe.Pointer(c_name))
|
||||||
|
|
||||||
|
ret := C.rados_getxattr(
|
||||||
|
ioctx.ioctx,
|
||||||
|
c_object,
|
||||||
|
c_name,
|
||||||
|
(*C.char)(unsafe.Pointer(&data[0])),
|
||||||
|
(C.size_t)(len(data)))
|
||||||
|
|
||||||
|
if ret >= 0 {
|
||||||
|
return int(ret), nil
|
||||||
|
} else {
|
||||||
|
return 0, RadosError(int(ret))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Sets an xattr for an object with key `name` with value as `data`
|
||||||
|
func (ioctx *IOContext) SetXattr(object string, name string, data []byte) error {
|
||||||
|
c_object := C.CString(object)
|
||||||
|
c_name := C.CString(name)
|
||||||
|
defer C.free(unsafe.Pointer(c_object))
|
||||||
|
defer C.free(unsafe.Pointer(c_name))
|
||||||
|
|
||||||
|
ret := C.rados_setxattr(
|
||||||
|
ioctx.ioctx,
|
||||||
|
c_object,
|
||||||
|
c_name,
|
||||||
|
(*C.char)(unsafe.Pointer(&data[0])),
|
||||||
|
(C.size_t)(len(data)))
|
||||||
|
|
||||||
|
if ret == 0 {
|
||||||
|
return nil
|
||||||
|
} else {
|
||||||
|
return RadosError(int(ret))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
@ -441,3 +441,33 @@ func TestNewConnWithUser(t *testing.T) {
|
||||||
_, err := rados.NewConnWithUser("admin")
|
_, err := rados.NewConnWithUser("admin")
|
||||||
assert.Equal(t, err, nil)
|
assert.Equal(t, err, nil)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestReadWriteXattr(t *testing.T) {
|
||||||
|
conn, _ := rados.NewConn()
|
||||||
|
conn.ReadDefaultConfigFile()
|
||||||
|
conn.Connect()
|
||||||
|
|
||||||
|
// make pool
|
||||||
|
pool_name := GetUUID()
|
||||||
|
err := conn.MakePool(pool_name)
|
||||||
|
assert.NoError(t, err)
|
||||||
|
|
||||||
|
pool, err := conn.OpenIOContext(pool_name)
|
||||||
|
assert.NoError(t, err)
|
||||||
|
|
||||||
|
bytes_in := []byte("input data")
|
||||||
|
err = pool.Write("obj", bytes_in, 0)
|
||||||
|
assert.NoError(t, err)
|
||||||
|
|
||||||
|
my_xattr_in := []byte("my_value")
|
||||||
|
err = pool.SetXattr("obj", "my_key", my_xattr_in)
|
||||||
|
assert.NoError(t, err)
|
||||||
|
|
||||||
|
my_xattr_out := make([]byte, len(my_xattr_in))
|
||||||
|
n_out, err := pool.GetXattr("obj", "my_key", my_xattr_out)
|
||||||
|
|
||||||
|
assert.Equal(t, n_out, len(my_xattr_in))
|
||||||
|
assert.Equal(t, my_xattr_in, my_xattr_out)
|
||||||
|
|
||||||
|
pool.Destroy()
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in New Issue