From: Yehuda Sadeh Date: Wed, 8 Feb 2017 23:39:22 +0000 (-0800) Subject: librados: nobjects list get and seek to cursor X-Git-Tag: v12.0.1~154^2~1 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=152159fce469a56a41896da7828a5ecf779c3f52;p=ceph.git librados: nobjects list get and seek to cursor cursor is of ObjectCursor type Signed-off-by: Yehuda Sadeh --- diff --git a/src/include/rados/librados.h b/src/include/rados/librados.h index 97765ac679b..9b7fd515140 100644 --- a/src/include/rados/librados.h +++ b/src/include/rados/librados.h @@ -999,6 +999,28 @@ CEPH_RADOS_API uint32_t rados_nobjects_list_get_pg_hash_position(rados_list_ctx_ CEPH_RADOS_API uint32_t rados_nobjects_list_seek(rados_list_ctx_t ctx, uint32_t pos); +/** + * Reposition object iterator to a different position + * + * @param ctx iterator marking where you are in the listing + * @param cursor position to move to + * @returns rounded position we moved to + */ +CEPH_RADOS_API uint32_t rados_nobjects_list_seek_cursor(rados_list_ctx_t ctx, + rados_object_list_cursor cursor); + +/** + * Reposition object iterator to a different position + * + * The returned handle must be released with rados_object_list_cursor_free(). + * + * @param ctx iterator marking where you are in the listing + * @param cursor where to store cursor + * @returns 0 on success, negative error code on failure + */ +CEPH_RADOS_API int rados_nobjects_list_get_cursor(rados_list_ctx_t ctx, + rados_object_list_cursor *cursor); + /** * Get the next object name and locator in the pool * diff --git a/src/include/rados/librados.hpp b/src/include/rados/librados.hpp index ab6b7612787..c70623db3f1 100644 --- a/src/include/rados/librados.hpp +++ b/src/include/rados/librados.hpp @@ -121,6 +121,12 @@ namespace librados /// move the iterator to a given hash position. this may (will!) be rounded to the nearest pg. uint32_t seek(uint32_t pos); + /// move the iterator to a given cursor position + uint32_t seek(const ObjectCursor& cursor); + + /// get current cursor position + ObjectCursor get_cursor(); + /** * Configure PGLS filter to be applied OSD-side (requires caller * to know/understand the format expected by the OSD) @@ -873,6 +879,10 @@ namespace librados NObjectIterator nobjects_begin(uint32_t start_hash_position); NObjectIterator nobjects_begin(uint32_t start_hash_position, const bufferlist &filter); + /// Start enumerating objects for a pool starting from cursor + NObjectIterator nobjects_begin(const librados::ObjectCursor& cursor); + NObjectIterator nobjects_begin(const librados::ObjectCursor& cursor, + const bufferlist &filter); /// Iterator indicating the end of a pool const NObjectIterator& nobjects_end() const; diff --git a/src/librados/IoCtxImpl.cc b/src/librados/IoCtxImpl.cc index 16662ca9e88..835711030bd 100644 --- a/src/librados/IoCtxImpl.cc +++ b/src/librados/IoCtxImpl.cc @@ -595,6 +595,21 @@ uint32_t librados::IoCtxImpl::nlist_seek(Objecter::NListContext *context, return objecter->list_nobjects_seek(context, pos); } +uint32_t librados::IoCtxImpl::nlist_seek(Objecter::NListContext *context, + const rados_object_list_cursor& cursor) +{ + context->list.clear(); + return objecter->list_nobjects_seek(context, *(const hobject_t *)cursor); +} + +rados_object_list_cursor librados::IoCtxImpl::nlist_get_cursor(Objecter::NListContext *context) +{ + hobject_t *c = new hobject_t; + + objecter->list_nobjects_get_cursor(context, c); + return (rados_object_list_cursor)c; +} + int librados::IoCtxImpl::create(const object_t& oid, bool exclusive) { ::ObjectOperation op; diff --git a/src/librados/IoCtxImpl.h b/src/librados/IoCtxImpl.h index 3db028398a5..873a9fcad43 100644 --- a/src/librados/IoCtxImpl.h +++ b/src/librados/IoCtxImpl.h @@ -110,6 +110,8 @@ struct librados::IoCtxImpl { // io int nlist(Objecter::NListContext *context, int max_entries); uint32_t nlist_seek(Objecter::NListContext *context, uint32_t pos); + uint32_t nlist_seek(Objecter::NListContext *context, const rados_object_list_cursor& cursor); + rados_object_list_cursor nlist_get_cursor(Objecter::NListContext *context); void object_list_slice( const hobject_t start, const hobject_t finish, diff --git a/src/librados/ListObjectImpl.h b/src/librados/ListObjectImpl.h index bda275f7f5c..7e605254652 100644 --- a/src/librados/ListObjectImpl.h +++ b/src/librados/ListObjectImpl.h @@ -67,6 +67,12 @@ class NObjectIteratorImpl { /// move the iterator to a given hash position. this may (will!) be rounded to the nearest pg. uint32_t seek(uint32_t pos); + /// move the iterator to a given cursor position + uint32_t seek(const librados::ObjectCursor& cursor); + + /// get current cursor position + librados::ObjectCursor get_cursor(); + void set_filter(const bufferlist &bl); private: diff --git a/src/librados/librados.cc b/src/librados/librados.cc index 72cdfc5c173..ebff3f253b7 100644 --- a/src/librados/librados.cc +++ b/src/librados/librados.cc @@ -737,6 +737,21 @@ uint32_t librados::NObjectIteratorImpl::seek(uint32_t pos) return r; } +uint32_t librados::NObjectIteratorImpl::seek(const ObjectCursor& cursor) +{ + uint32_t r = rados_nobjects_list_seek_cursor(ctx.get(), (rados_object_list_cursor)cursor.c_cursor); + get_next(); + return r; +} + +librados::ObjectCursor librados::NObjectIteratorImpl::get_cursor() +{ + librados::ObjListCtx *lh = (librados::ObjListCtx *)ctx.get(); + librados::ObjectCursor oc; + oc.set(lh->ctx->nlist_get_cursor(lh->nlc)); + return oc; +} + void librados::NObjectIteratorImpl::set_filter(const bufferlist &bl) { assert(ctx); @@ -848,6 +863,18 @@ uint32_t librados::NObjectIterator::seek(uint32_t pos) return impl->seek(pos); } +uint32_t librados::NObjectIterator::seek(const ObjectCursor& cursor) +{ + assert(impl); + return impl->seek(cursor); +} + +librados::ObjectCursor librados::NObjectIterator::get_cursor() +{ + assert(impl); + return impl->get_cursor(); +} + void librados::NObjectIterator::set_filter(const bufferlist &bl) { impl->set_filter(bl); @@ -1702,6 +1729,25 @@ librados::NObjectIterator librados::IoCtx::nobjects_begin( return iter; } +librados::NObjectIterator librados::IoCtx::nobjects_begin(const ObjectCursor& cursor) +{ + bufferlist bl; + return nobjects_begin(cursor, bl); +} + +librados::NObjectIterator librados::IoCtx::nobjects_begin( + const ObjectCursor& cursor, const bufferlist &filter) +{ + rados_list_ctx_t listh; + rados_nobjects_list_open(io_ctx_impl, &listh); + NObjectIterator iter((ObjListCtx*)listh); + if (filter.length() > 0) { + iter.set_filter(filter); + } + iter.seek(cursor); + return iter; +} + const librados::NObjectIterator& librados::IoCtx::nobjects_end() const { return NObjectIterator::__EndObjectIterator; @@ -4153,6 +4199,28 @@ extern "C" uint32_t rados_nobjects_list_seek(rados_list_ctx_t listctx, return r; } +extern "C" uint32_t rados_nobjects_list_seek_cursor(rados_list_ctx_t listctx, + rados_object_list_cursor cursor) +{ + librados::ObjListCtx *lh = (librados::ObjListCtx *)listctx; + + tracepoint(librados, rados_nobjects_list_seek_cursor_enter, listctx); + uint32_t r = lh->ctx->nlist_seek(lh->nlc, cursor); + tracepoint(librados, rados_nobjects_list_seek_cursor_exit, r); + return r; +} + +extern "C" int rados_nobjects_list_get_cursor(rados_list_ctx_t listctx, + rados_object_list_cursor *cursor) +{ + librados::ObjListCtx *lh = (librados::ObjListCtx *)listctx; + + tracepoint(librados, rados_nobjects_list_get_cursor_enter, listctx); + *cursor = lh->ctx->nlist_get_cursor(lh->nlc); + tracepoint(librados, rados_nobjects_list_get_cursor_exit, 0); + return 0; +} + extern "C" uint32_t rados_nobjects_list_get_pg_hash_position( rados_list_ctx_t listctx) { diff --git a/src/tracing/librados.tp b/src/tracing/librados.tp index f56064cf0a1..cb47fe1082d 100644 --- a/src/tracing/librados.tp +++ b/src/tracing/librados.tp @@ -1766,6 +1766,38 @@ TRACEPOINT_EVENT(librados, rados_nobjects_list_seek_exit, ) ) +TRACEPOINT_EVENT(librados, rados_nobjects_list_seek_cursor_enter, + TP_ARGS( + rados_list_ctx_t, listctx), + TP_FIELDS( + ctf_integer_hex(rados_list_ctx_t, listctx, listctx) + ) +) + +TRACEPOINT_EVENT(librados, rados_nobjects_list_seek_cursor_exit, + TP_ARGS( + uint32_t, retval), + TP_FIELDS( + ctf_integer(int, retval, retval) + ) +) + +TRACEPOINT_EVENT(librados, rados_nobjects_list_get_cursor_enter, + TP_ARGS( + rados_list_ctx_t, listctx), + TP_FIELDS( + ctf_integer_hex(rados_list_ctx_t, listctx, listctx) + ) +) + +TRACEPOINT_EVENT(librados, rados_nobjects_list_get_cursor_exit, + TP_ARGS( + uint32_t, retval), + TP_FIELDS( + ctf_integer(int, retval, retval) + ) +) + TRACEPOINT_EVENT(librados, rados_nobjects_list_get_pg_hash_position_enter, TP_ARGS( rados_list_ctx_t, listctx),