@@ -107,6 +107,41 @@ struct seastore_test_t :
107107 std::map<string, bufferlist> omap;
108108 bufferlist contents;
109109
110+ ObjectStore::omap_iter_ret_t check_iterate (
111+ std::string_view key,
112+ std::string_view value,
113+ std::map<string, bufferlist>::iterator &refiter)
114+ {
115+ if (refiter != omap.end ()) {
116+ EXPECT_EQ (refiter->first , key);
117+ }
118+ if (refiter != omap.end () && refiter->first < key) {
119+ auto ite = omap.find (std::string (key));
120+ auto dist = std::distance (refiter, ite);
121+ for (int i = 0 ; i < dist; i++) {
122+ logger ().debug (
123+ " check_omap: missing omap key {}" ,
124+ refiter->first );
125+ EXPECT_TRUE (false ) << " missing omap key " << refiter->first ;
126+ return ObjectStore::omap_iter_ret_t ::STOP;
127+ }
128+ ++refiter;
129+ EXPECT_EQ (refiter->first , key);
130+ } else if (refiter == omap.end () || refiter->first > key) {
131+ logger ().debug (
132+ " check_omap: extra omap key {}" ,
133+ key);
134+ EXPECT_TRUE (false ) << " extra omap key " << key;
135+ return ObjectStore::omap_iter_ret_t ::STOP;
136+ } else {
137+ ceph::bufferlist bl;
138+ bl.append (value);
139+ EXPECT_EQ (bl, refiter->second );
140+ ++refiter;
141+ }
142+ return ObjectStore::omap_iter_ret_t ::NEXT;
143+ }
144+
110145 std::map<snapid_t , bufferlist> clone_contents;
111146
112147 void touch (
@@ -429,41 +464,26 @@ struct seastore_test_t :
429464 }
430465 }
431466
432- void check_omap (SeaStoreShard &sharded_seastore) {
433- auto refiter = omap.begin ();
434- std::optional<std::string> start;
435- while (true ) {
436- auto [done, kvs] = sharded_seastore.omap_get_values (
437- coll,
438- oid,
439- start).unsafe_get ();
440- auto iter = kvs.begin ();
441- while (true ) {
442- if ((done && iter == kvs.end ()) && refiter == omap.end ()) {
443- return ; // finished
444- } else if (!done && iter == kvs.end ()) {
445- break ; // reload kvs
446- }
447- if (iter == kvs.end () || refiter->first < iter->first ) {
448- logger ().debug (
449- " check_omap: missing omap key {}" ,
450- refiter->first );
451- GTEST_FAIL () << " missing omap key " << refiter->first ;
452- ++refiter;
453- } else if (refiter == omap.end () || refiter->first > iter->first ) {
454- logger ().debug (
455- " check_omap: extra omap key {}" ,
456- iter->first );
457- GTEST_FAIL () << " extra omap key " << iter->first ;
458- ++iter;
459- } else {
460- EXPECT_EQ (iter->second , refiter->second );
461- ++iter;
462- ++refiter;
463- }
464- }
465- if (!done) {
466- start = kvs.rbegin ()->first ;
467+ void check_omap (SeaStoreShard &sharded_seastore,
468+ std::map<string, bufferlist>::iterator &refiter,
469+ std::function<ObjectStore::omap_iter_ret_t (std::string_view, std::string_view)> callback)
470+ {
471+ ObjectStore::omap_iter_seek_t start_from = ObjectStore::omap_iter_seek_t::min_lower_bound ();
472+ refiter = omap.begin ();
473+ sharded_seastore.omap_iterate (
474+ coll,
475+ oid,
476+ start_from,
477+ callback).unsafe_get ();
478+
479+ if (refiter == omap.end ()) {
480+ return ;
481+ } else {
482+ for (; refiter != omap.end (); refiter++) {
483+ logger ().debug (
484+ " check_omap: missing omap key {}" ,
485+ refiter->first );
486+ GTEST_FAIL () << " missing omap key " << refiter->first ;
467487 }
468488 }
469489 }
@@ -814,9 +834,16 @@ TEST_P(seastore_test_t, rename)
814834 test_obj.cid ,
815835 test_obj.coll ,
816836 ghobject_t (hobject_t (sobject_t (std::string (" object_1" ), CEPH_NOSNAP)))};
837+
838+ std::map<string, bufferlist>::iterator refiter;
839+ std::function<ObjectStore::omap_iter_ret_t (std::string_view, std::string_view)> callback =
840+ [&test_other, &refiter](std::string_view key, std::string_view val)
841+ {
842+ return test_other.check_iterate (key, val, refiter);
843+ };
817844 test_obj.rename (*sharded_seastore, test_other);
818845 test_other.read (*sharded_seastore, 0 , 4096 );
819- test_other.check_omap (*sharded_seastore);
846+ test_other.check_omap (*sharded_seastore, refiter, callback );
820847 });
821848}
822849
@@ -1071,11 +1098,17 @@ TEST_P(seastore_test_t, omap_test_iterator)
10711098 test_obj.touch (*sharded_seastore);
10721099 for (unsigned i = 0 ; i < 20 ; ++i) {
10731100 test_obj.set_omap (
1074- *sharded_seastore,
1075- make_key (i),
1076- make_bufferlist (128 ));
1101+ *sharded_seastore,
1102+ make_key (i),
1103+ make_bufferlist (128 ));
10771104 }
1078- test_obj.check_omap (*sharded_seastore);
1105+ std::map<string, bufferlist>::iterator refiter;
1106+ std::function<ObjectStore::omap_iter_ret_t (std::string_view, std::string_view)> callback =
1107+ [&test_obj, &refiter](std::string_view key, std::string_view val)
1108+ {
1109+ return test_obj.check_iterate (key, val, refiter);
1110+ };
1111+ test_obj.check_omap (*sharded_seastore, refiter, callback);
10791112 });
10801113}
10811114
@@ -1091,18 +1124,24 @@ TEST_P(seastore_test_t, object_data_omap_remove)
10911124 test_obj.touch (*sharded_seastore);
10921125 for (unsigned i = 0 ; i < 1024 ; ++i) {
10931126 test_obj.set_omap (
1094- *sharded_seastore,
1095- make_key (i),
1096- make_bufferlist (128 ));
1127+ *sharded_seastore,
1128+ make_key (i),
1129+ make_bufferlist (128 ));
10971130 }
1098- test_obj.check_omap (*sharded_seastore);
1131+ std::map<string, bufferlist>::iterator refiter;
1132+ std::function<ObjectStore::omap_iter_ret_t (std::string_view, std::string_view)> callback =
1133+ [&test_obj, &refiter](std::string_view key, std::string_view val)
1134+ {
1135+ return test_obj.check_iterate (key, val, refiter);
1136+ };
1137+ test_obj.check_omap (*sharded_seastore, refiter, callback);
10991138
11001139 for (uint64_t i = 0 ; i < 16 ; i++) {
11011140 test_obj.write (
1102- *sharded_seastore,
1103- 4096 * i,
1104- 4096 ,
1105- ' a' );
1141+ *sharded_seastore,
1142+ 4096 * i,
1143+ 4096 ,
1144+ ' a' );
11061145 }
11071146 test_obj.remove (*sharded_seastore);
11081147 });
0 commit comments