From ddde581874cd63dcb798f138ca01967e1106402c Mon Sep 17 00:00:00 2001 From: Noah Watkins Date: Fri, 9 Jan 2015 14:52:10 -0800 Subject: [PATCH] rados: add support for object listing Signed-off-by: Noah Watkins --- ioctx.go | 29 +++++++++++++++++++++++++++++ rados_test.go | 42 ++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 71 insertions(+) diff --git a/ioctx.go b/ioctx.go index 0ed964b..affe13b 100644 --- a/ioctx.go +++ b/ioctx.go @@ -157,3 +157,32 @@ func (ioctx *IOContext) GetPoolName() (name string, err error) { return name, nil } } + +// ObjectListFunc is the type of the function called for each object visited +// by ListObjects. +type ObjectListFunc func(oid string) + +// ListObjects lists all of the objects in the pool associated with the I/O +// context, and called the provided listFn function for each object, passing +// to the function the name of the object. +func (ioctx *IOContext) ListObjects(listFn ObjectListFunc) error { + var ctx C.rados_list_ctx_t + ret := C.rados_nobjects_list_open(ioctx.ioctx, &ctx) + if ret < 0 { + return RadosError(ret) + } + defer func() { C.rados_nobjects_list_close(ctx) }() + + for { + var c_entry *C.char + ret := C.rados_nobjects_list_next(ctx, &c_entry, nil, nil) + if ret == -2 { // FIXME + return nil + } else if ret < 0 { + return RadosError(ret) + } + listFn(C.GoString(c_entry)) + } + + panic("invalid state") +} diff --git a/rados_test.go b/rados_test.go index 0f0ac1d..b87a4ef 100644 --- a/rados_test.go +++ b/rados_test.go @@ -11,6 +11,7 @@ import "io/ioutil" import "time" import "net" import "fmt" +import "sort" func GetUUID() string { out, _ := exec.Command("uuidgen").Output() @@ -373,3 +374,44 @@ func TestGetPoolName(t *testing.T) { ioctx.Destroy() conn.Shutdown() } + +func TestObjectIterator(t *testing.T) { + conn, _ := rados.NewConn() + conn.ReadDefaultConfigFile() + conn.Connect() + + poolname := GetUUID() + err := conn.MakePool(poolname) + assert.NoError(t, err) + + ioctx, err := conn.OpenIOContext(poolname) + assert.NoError(t, err) + + objectList := []string{} + err = ioctx.ListObjects(func(oid string) { + objectList = append(objectList, oid) + }) + assert.NoError(t, err) + assert.True(t, len(objectList) == 0) + + createdList := []string{} + for i := 0; i < 200; i++ { + oid := GetUUID() + bytes_in := []byte("input data") + err = ioctx.Write(oid, bytes_in, 0) + assert.NoError(t, err) + createdList = append(createdList, oid) + } + assert.True(t, len(createdList) == 200) + + err = ioctx.ListObjects(func(oid string) { + objectList = append(objectList, oid) + }) + assert.NoError(t, err) + assert.Equal(t, len(objectList), len(createdList)) + + sort.Strings(objectList) + sort.Strings(createdList) + + assert.Equal(t, objectList, createdList) +}