From fe0f3e9a389ecbed9225cb3cb5250ff6d67a1047 Mon Sep 17 00:00:00 2001 From: Jeff Layton Date: Wed, 15 Aug 2018 12:24:45 -0400 Subject: [PATCH] librados: add a rados_omap_iter_size function Sometimes we need to know how many elements are represented by an omap iterator. Add a new rados_omap_iter_size to return the number of elements in the returned iterator. Also add some sanity checks for this to existing tests. Tracker: http://tracker.ceph.com/issues/26948 Signed-off-by: Jeff Layton --- src/include/rados/librados.h | 7 +++++++ src/librados/librados.cc | 6 ++++++ src/test/librados/c_read_operations.cc | 4 ++++ 3 files changed, 17 insertions(+) diff --git a/src/include/rados/librados.h b/src/include/rados/librados.h index e7cacbb2402aa..fb9989014ed2f 100644 --- a/src/include/rados/librados.h +++ b/src/include/rados/librados.h @@ -1715,6 +1715,13 @@ CEPH_RADOS_API int rados_omap_get_next2(rados_omap_iter_t iter, size_t *key_len, size_t *val_len); +/** + * Return number of elements in the iterator + * + * @param iter the iterator of which to return the size + */ +CEPH_RADOS_API unsigned int rados_omap_iter_size(rados_omap_iter_t iter); + /** * Close the omap iterator. * diff --git a/src/librados/librados.cc b/src/librados/librados.cc index b835f7add957b..ee5cec2db5000 100644 --- a/src/librados/librados.cc +++ b/src/librados/librados.cc @@ -6370,6 +6370,12 @@ extern "C" int rados_omap_get_next2(rados_omap_iter_t iter, return 0; } +extern "C" unsigned int rados_omap_iter_size(rados_omap_iter_t iter) +{ + RadosOmapIter *it = static_cast(iter); + return it->values.size(); +} + extern "C" void rados_omap_get_end(rados_omap_iter_t iter) { tracepoint(librados, rados_omap_get_end_enter, iter); diff --git a/src/test/librados/c_read_operations.cc b/src/test/librados/c_read_operations.cc index 9d424aaaf3870..f718cbb10084d 100644 --- a/src/test/librados/c_read_operations.cc +++ b/src/test/librados/c_read_operations.cc @@ -74,6 +74,7 @@ protected: char *key = NULL; char *val = NULL; size_t val_len = 0; + ASSERT_EQ(len, rados_omap_iter_size(iter)); while (i < len) { ASSERT_EQ(0, rados_omap_get_next(iter, &key, &val, &val_len)); if (val_len == 0 && key == NULL && val == NULL) @@ -125,6 +126,7 @@ protected: char *val = NULL; size_t key_len = 0; size_t val_len = 0; + ASSERT_EQ(len, rados_omap_iter_size(iter)); while (i < len) { ASSERT_EQ(0, rados_omap_get_next2(iter, &key, &val, &key_len, &val_len)); if (key_len == 0 && val_len == 0 && key == NULL && val == NULL) @@ -646,6 +648,8 @@ TEST_F(CReadOpsTest, Omap) { rados_release_read_op(rop); EXPECT_EQ(0, r_vals); EXPECT_EQ(0, r_keys); + EXPECT_EQ(1, rados_omap_iter_size(iter_vals)); + EXPECT_EQ(1, rados_omap_iter_size(iter_keys)); compare_omap_vals(&keys[2], &vals[2], &lens[2], 1, iter_vals); compare_omap_vals(&keys[2], &vals[0], &lens[0], 1, iter_keys); -- 2.39.5