mirror of https://github.com/ceph/go-ceph
rados: add support for object listing
Signed-off-by: Noah Watkins <noahwatkins@gmail.com>
This commit is contained in:
parent
2b8309e816
commit
ddde581874
29
ioctx.go
29
ioctx.go
|
@ -157,3 +157,32 @@ func (ioctx *IOContext) GetPoolName() (name string, err error) {
|
||||||
return name, nil
|
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")
|
||||||
|
}
|
||||||
|
|
|
@ -11,6 +11,7 @@ import "io/ioutil"
|
||||||
import "time"
|
import "time"
|
||||||
import "net"
|
import "net"
|
||||||
import "fmt"
|
import "fmt"
|
||||||
|
import "sort"
|
||||||
|
|
||||||
func GetUUID() string {
|
func GetUUID() string {
|
||||||
out, _ := exec.Command("uuidgen").Output()
|
out, _ := exec.Command("uuidgen").Output()
|
||||||
|
@ -373,3 +374,44 @@ func TestGetPoolName(t *testing.T) {
|
||||||
ioctx.Destroy()
|
ioctx.Destroy()
|
||||||
conn.Shutdown()
|
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)
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in New Issue