db_iter_test.cc 108 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301230223032304230523062307230823092310231123122313231423152316231723182319232023212322232323242325232623272328232923302331233223332334233523362337233823392340234123422343234423452346234723482349235023512352235323542355235623572358235923602361236223632364236523662367236823692370237123722373237423752376237723782379238023812382238323842385238623872388238923902391239223932394239523962397239823992400240124022403240424052406240724082409241024112412241324142415241624172418241924202421242224232424242524262427242824292430243124322433243424352436243724382439244024412442244324442445244624472448244924502451245224532454245524562457245824592460246124622463246424652466246724682469247024712472247324742475247624772478247924802481248224832484248524862487248824892490249124922493249424952496249724982499250025012502250325042505250625072508250925102511251225132514251525162517251825192520252125222523252425252526252725282529253025312532253325342535253625372538253925402541254225432544254525462547254825492550255125522553255425552556255725582559256025612562256325642565256625672568256925702571257225732574257525762577257825792580258125822583258425852586258725882589259025912592259325942595259625972598259926002601260226032604260526062607260826092610261126122613261426152616261726182619262026212622262326242625262626272628262926302631263226332634263526362637263826392640264126422643264426452646264726482649265026512652265326542655265626572658265926602661266226632664266526662667266826692670267126722673267426752676267726782679268026812682268326842685268626872688268926902691269226932694269526962697269826992700270127022703270427052706270727082709271027112712271327142715271627172718271927202721272227232724272527262727272827292730273127322733273427352736273727382739274027412742274327442745274627472748274927502751275227532754275527562757275827592760276127622763276427652766276727682769277027712772277327742775277627772778277927802781278227832784278527862787278827892790279127922793279427952796279727982799280028012802280328042805280628072808280928102811281228132814281528162817281828192820282128222823282428252826282728282829283028312832283328342835283628372838283928402841284228432844284528462847284828492850285128522853285428552856285728582859286028612862286328642865286628672868286928702871287228732874287528762877287828792880288128822883288428852886288728882889289028912892289328942895289628972898289929002901290229032904290529062907290829092910291129122913291429152916291729182919292029212922292329242925292629272928292929302931293229332934293529362937293829392940294129422943294429452946294729482949295029512952295329542955295629572958295929602961296229632964296529662967296829692970297129722973297429752976297729782979298029812982298329842985298629872988298929902991299229932994299529962997299829993000300130023003300430053006300730083009301030113012301330143015301630173018301930203021302230233024302530263027302830293030303130323033303430353036303730383039304030413042304330443045304630473048304930503051305230533054305530563057305830593060306130623063306430653066306730683069307030713072307330743075307630773078307930803081308230833084308530863087308830893090309130923093309430953096309730983099310031013102310331043105310631073108310931103111311231133114311531163117311831193120312131223123312431253126312731283129313031313132313331343135313631373138313931403141314231433144314531463147314831493150315131523153315431553156315731583159316031613162316331643165316631673168316931703171317231733174317531763177317831793180318131823183
  1. // Copyright (c) 2011-present, Facebook, Inc. All rights reserved.
  2. // This source code is licensed under both the GPLv2 (found in the
  3. // COPYING file in the root directory) and Apache 2.0 License
  4. // (found in the LICENSE.Apache file in the root directory).
  5. #include <string>
  6. #include <vector>
  7. #include <algorithm>
  8. #include <utility>
  9. #include "db/db_iter.h"
  10. #include "db/dbformat.h"
  11. #include "rocksdb/comparator.h"
  12. #include "rocksdb/options.h"
  13. #include "rocksdb/perf_context.h"
  14. #include "rocksdb/slice.h"
  15. #include "rocksdb/statistics.h"
  16. #include "table/iterator_wrapper.h"
  17. #include "table/merging_iterator.h"
  18. #include "test_util/sync_point.h"
  19. #include "test_util/testharness.h"
  20. #include "util/string_util.h"
  21. #include "utilities/merge_operators.h"
  22. namespace ROCKSDB_NAMESPACE {
  23. static uint64_t TestGetTickerCount(const Options& options,
  24. Tickers ticker_type) {
  25. return options.statistics->getTickerCount(ticker_type);
  26. }
  27. class TestIterator : public InternalIterator {
  28. public:
  29. explicit TestIterator(const Comparator* comparator)
  30. : initialized_(false),
  31. valid_(false),
  32. sequence_number_(0),
  33. iter_(0),
  34. cmp(comparator) {
  35. data_.reserve(16);
  36. }
  37. void AddPut(std::string argkey, std::string argvalue) {
  38. Add(argkey, kTypeValue, argvalue);
  39. }
  40. void AddDeletion(std::string argkey) {
  41. Add(argkey, kTypeDeletion, std::string());
  42. }
  43. void AddSingleDeletion(std::string argkey) {
  44. Add(argkey, kTypeSingleDeletion, std::string());
  45. }
  46. void AddMerge(std::string argkey, std::string argvalue) {
  47. Add(argkey, kTypeMerge, argvalue);
  48. }
  49. void Add(std::string argkey, ValueType type, std::string argvalue) {
  50. Add(argkey, type, argvalue, sequence_number_++);
  51. }
  52. void Add(std::string argkey, ValueType type, std::string argvalue,
  53. size_t seq_num, bool update_iter = false) {
  54. valid_ = true;
  55. ParsedInternalKey internal_key(argkey, seq_num, type);
  56. data_.push_back(
  57. std::pair<std::string, std::string>(std::string(), argvalue));
  58. AppendInternalKey(&data_.back().first, internal_key);
  59. if (update_iter && valid_ && cmp.Compare(data_.back().first, key()) < 0) {
  60. // insert a key smaller than current key
  61. Finish();
  62. // data_[iter_] is not anymore the current element of the iterator.
  63. // Increment it to reposition it to the right position.
  64. iter_++;
  65. }
  66. }
  67. // should be called before operations with iterator
  68. void Finish() {
  69. initialized_ = true;
  70. std::sort(data_.begin(), data_.end(),
  71. [this](std::pair<std::string, std::string> a,
  72. std::pair<std::string, std::string> b) {
  73. return (cmp.Compare(a.first, b.first) < 0);
  74. });
  75. }
  76. // Removes the key from the set of keys over which this iterator iterates.
  77. // Not to be confused with AddDeletion().
  78. // If the iterator is currently positioned on this key, the deletion will
  79. // apply next time the iterator moves.
  80. // Used for simulating ForwardIterator updating to a new version that doesn't
  81. // have some of the keys (e.g. after compaction with a filter).
  82. void Vanish(std::string _key) {
  83. if (valid_ && data_[iter_].first == _key) {
  84. delete_current_ = true;
  85. return;
  86. }
  87. for (auto it = data_.begin(); it != data_.end(); ++it) {
  88. ParsedInternalKey ikey;
  89. bool ok __attribute__((__unused__)) = ParseInternalKey(it->first, &ikey);
  90. assert(ok);
  91. if (ikey.user_key != _key) {
  92. continue;
  93. }
  94. if (valid_ && data_.begin() + iter_ > it) {
  95. --iter_;
  96. }
  97. data_.erase(it);
  98. return;
  99. }
  100. assert(false);
  101. }
  102. // Number of operations done on this iterator since construction.
  103. size_t steps() const { return steps_; }
  104. bool Valid() const override {
  105. assert(initialized_);
  106. return valid_;
  107. }
  108. void SeekToFirst() override {
  109. assert(initialized_);
  110. ++steps_;
  111. DeleteCurrentIfNeeded();
  112. valid_ = (data_.size() > 0);
  113. iter_ = 0;
  114. }
  115. void SeekToLast() override {
  116. assert(initialized_);
  117. ++steps_;
  118. DeleteCurrentIfNeeded();
  119. valid_ = (data_.size() > 0);
  120. iter_ = data_.size() - 1;
  121. }
  122. void Seek(const Slice& target) override {
  123. assert(initialized_);
  124. SeekToFirst();
  125. ++steps_;
  126. if (!valid_) {
  127. return;
  128. }
  129. while (iter_ < data_.size() &&
  130. (cmp.Compare(data_[iter_].first, target) < 0)) {
  131. ++iter_;
  132. }
  133. if (iter_ == data_.size()) {
  134. valid_ = false;
  135. }
  136. }
  137. void SeekForPrev(const Slice& target) override {
  138. assert(initialized_);
  139. DeleteCurrentIfNeeded();
  140. SeekForPrevImpl(target, &cmp);
  141. }
  142. void Next() override {
  143. assert(initialized_);
  144. assert(valid_);
  145. assert(iter_ < data_.size());
  146. ++steps_;
  147. if (delete_current_) {
  148. DeleteCurrentIfNeeded();
  149. } else {
  150. ++iter_;
  151. }
  152. valid_ = iter_ < data_.size();
  153. }
  154. void Prev() override {
  155. assert(initialized_);
  156. assert(valid_);
  157. assert(iter_ < data_.size());
  158. ++steps_;
  159. DeleteCurrentIfNeeded();
  160. if (iter_ == 0) {
  161. valid_ = false;
  162. } else {
  163. --iter_;
  164. }
  165. }
  166. Slice key() const override {
  167. assert(initialized_);
  168. return data_[iter_].first;
  169. }
  170. Slice value() const override {
  171. assert(initialized_);
  172. return data_[iter_].second;
  173. }
  174. Status status() const override {
  175. assert(initialized_);
  176. return Status::OK();
  177. }
  178. bool IsKeyPinned() const override { return true; }
  179. bool IsValuePinned() const override { return true; }
  180. private:
  181. bool initialized_;
  182. bool valid_;
  183. size_t sequence_number_;
  184. size_t iter_;
  185. size_t steps_ = 0;
  186. InternalKeyComparator cmp;
  187. std::vector<std::pair<std::string, std::string>> data_;
  188. bool delete_current_ = false;
  189. void DeleteCurrentIfNeeded() {
  190. if (!delete_current_) {
  191. return;
  192. }
  193. data_.erase(data_.begin() + iter_);
  194. delete_current_ = false;
  195. }
  196. };
  197. class DBIteratorTest : public testing::Test {
  198. public:
  199. Env* env_;
  200. DBIteratorTest() : env_(Env::Default()) {}
  201. };
  202. TEST_F(DBIteratorTest, DBIteratorPrevNext) {
  203. Options options;
  204. ImmutableCFOptions cf_options = ImmutableCFOptions(options);
  205. MutableCFOptions mutable_cf_options = MutableCFOptions(options);
  206. {
  207. TestIterator* internal_iter = new TestIterator(BytewiseComparator());
  208. internal_iter->AddDeletion("a");
  209. internal_iter->AddDeletion("a");
  210. internal_iter->AddDeletion("a");
  211. internal_iter->AddDeletion("a");
  212. internal_iter->AddPut("a", "val_a");
  213. internal_iter->AddPut("b", "val_b");
  214. internal_iter->Finish();
  215. ReadOptions ro;
  216. std::unique_ptr<Iterator> db_iter(NewDBIterator(
  217. env_, ro, cf_options, mutable_cf_options, BytewiseComparator(),
  218. internal_iter, 10, options.max_sequential_skip_in_iterations,
  219. nullptr /*read_callback*/));
  220. db_iter->SeekToLast();
  221. ASSERT_TRUE(db_iter->Valid());
  222. ASSERT_EQ(db_iter->key().ToString(), "b");
  223. ASSERT_EQ(db_iter->value().ToString(), "val_b");
  224. db_iter->Prev();
  225. ASSERT_TRUE(db_iter->Valid());
  226. ASSERT_EQ(db_iter->key().ToString(), "a");
  227. ASSERT_EQ(db_iter->value().ToString(), "val_a");
  228. db_iter->Next();
  229. ASSERT_TRUE(db_iter->Valid());
  230. ASSERT_EQ(db_iter->key().ToString(), "b");
  231. ASSERT_EQ(db_iter->value().ToString(), "val_b");
  232. db_iter->Next();
  233. ASSERT_TRUE(!db_iter->Valid());
  234. }
  235. // Test to check the SeekToLast() with iterate_upper_bound not set
  236. {
  237. TestIterator* internal_iter = new TestIterator(BytewiseComparator());
  238. internal_iter->AddPut("a", "val_a");
  239. internal_iter->AddPut("b", "val_b");
  240. internal_iter->AddPut("b", "val_b");
  241. internal_iter->AddPut("c", "val_c");
  242. internal_iter->Finish();
  243. ReadOptions ro;
  244. std::unique_ptr<Iterator> db_iter(NewDBIterator(
  245. env_, ro, cf_options, mutable_cf_options, BytewiseComparator(),
  246. internal_iter, 10, options.max_sequential_skip_in_iterations,
  247. nullptr /*read_callback*/));
  248. db_iter->SeekToLast();
  249. ASSERT_TRUE(db_iter->Valid());
  250. ASSERT_EQ(db_iter->key().ToString(), "c");
  251. }
  252. // Test to check the SeekToLast() with iterate_upper_bound set
  253. {
  254. TestIterator* internal_iter = new TestIterator(BytewiseComparator());
  255. internal_iter->AddPut("a", "val_a");
  256. internal_iter->AddPut("b", "val_b");
  257. internal_iter->AddPut("c", "val_c");
  258. internal_iter->AddPut("d", "val_d");
  259. internal_iter->AddPut("e", "val_e");
  260. internal_iter->AddPut("f", "val_f");
  261. internal_iter->Finish();
  262. Slice prefix("d");
  263. ReadOptions ro;
  264. ro.iterate_upper_bound = &prefix;
  265. std::unique_ptr<Iterator> db_iter(NewDBIterator(
  266. env_, ro, cf_options, mutable_cf_options, BytewiseComparator(),
  267. internal_iter, 10, options.max_sequential_skip_in_iterations,
  268. nullptr /*read_callback*/));
  269. db_iter->SeekToLast();
  270. ASSERT_TRUE(db_iter->Valid());
  271. ASSERT_EQ(db_iter->key().ToString(), "c");
  272. db_iter->Next();
  273. ASSERT_TRUE(!db_iter->Valid());
  274. db_iter->SeekToLast();
  275. ASSERT_TRUE(db_iter->Valid());
  276. ASSERT_EQ(db_iter->key().ToString(), "c");
  277. }
  278. // Test to check the SeekToLast() iterate_upper_bound set to a key that
  279. // is not Put yet
  280. {
  281. TestIterator* internal_iter = new TestIterator(BytewiseComparator());
  282. internal_iter->AddPut("a", "val_a");
  283. internal_iter->AddPut("a", "val_a");
  284. internal_iter->AddPut("b", "val_b");
  285. internal_iter->AddPut("c", "val_c");
  286. internal_iter->AddPut("d", "val_d");
  287. internal_iter->Finish();
  288. Slice prefix("z");
  289. ReadOptions ro;
  290. ro.iterate_upper_bound = &prefix;
  291. std::unique_ptr<Iterator> db_iter(NewDBIterator(
  292. env_, ro, cf_options, mutable_cf_options, BytewiseComparator(),
  293. internal_iter, 10, options.max_sequential_skip_in_iterations,
  294. nullptr /*read_callback*/));
  295. db_iter->SeekToLast();
  296. ASSERT_TRUE(db_iter->Valid());
  297. ASSERT_EQ(db_iter->key().ToString(), "d");
  298. db_iter->Next();
  299. ASSERT_TRUE(!db_iter->Valid());
  300. db_iter->SeekToLast();
  301. ASSERT_TRUE(db_iter->Valid());
  302. ASSERT_EQ(db_iter->key().ToString(), "d");
  303. db_iter->Prev();
  304. ASSERT_TRUE(db_iter->Valid());
  305. ASSERT_EQ(db_iter->key().ToString(), "c");
  306. }
  307. // Test to check the SeekToLast() with iterate_upper_bound set to the
  308. // first key
  309. {
  310. TestIterator* internal_iter = new TestIterator(BytewiseComparator());
  311. internal_iter->AddPut("a", "val_a");
  312. internal_iter->AddPut("a", "val_a");
  313. internal_iter->AddPut("a", "val_a");
  314. internal_iter->AddPut("b", "val_b");
  315. internal_iter->AddPut("b", "val_b");
  316. internal_iter->Finish();
  317. Slice prefix("a");
  318. ReadOptions ro;
  319. ro.iterate_upper_bound = &prefix;
  320. std::unique_ptr<Iterator> db_iter(NewDBIterator(
  321. env_, ro, cf_options, mutable_cf_options, BytewiseComparator(),
  322. internal_iter, 10, options.max_sequential_skip_in_iterations,
  323. nullptr /*read_callback*/));
  324. db_iter->SeekToLast();
  325. ASSERT_TRUE(!db_iter->Valid());
  326. }
  327. // Test case to check SeekToLast with iterate_upper_bound set
  328. // (same key put may times - SeekToLast should start with the
  329. // maximum sequence id of the upper bound)
  330. {
  331. TestIterator* internal_iter = new TestIterator(BytewiseComparator());
  332. internal_iter->AddPut("a", "val_a");
  333. internal_iter->AddPut("b", "val_b");
  334. internal_iter->AddPut("c", "val_c");
  335. internal_iter->AddPut("c", "val_c");
  336. internal_iter->AddPut("c", "val_c");
  337. internal_iter->AddPut("c", "val_c");
  338. internal_iter->AddPut("c", "val_c");
  339. internal_iter->AddPut("c", "val_c");
  340. internal_iter->AddPut("c", "val_c");
  341. internal_iter->Finish();
  342. Slice prefix("c");
  343. ReadOptions ro;
  344. ro.iterate_upper_bound = &prefix;
  345. std::unique_ptr<Iterator> db_iter(NewDBIterator(
  346. env_, ro, cf_options, mutable_cf_options, BytewiseComparator(),
  347. internal_iter, 7, options.max_sequential_skip_in_iterations,
  348. nullptr /*read_callback*/));
  349. SetPerfLevel(kEnableCount);
  350. ASSERT_TRUE(GetPerfLevel() == kEnableCount);
  351. get_perf_context()->Reset();
  352. db_iter->SeekToLast();
  353. ASSERT_TRUE(db_iter->Valid());
  354. ASSERT_EQ(static_cast<int>(get_perf_context()->internal_key_skipped_count), 1);
  355. ASSERT_EQ(db_iter->key().ToString(), "b");
  356. SetPerfLevel(kDisable);
  357. }
  358. // Test to check the SeekToLast() with the iterate_upper_bound set
  359. // (Checking the value of the key which has sequence ids greater than
  360. // and less that the iterator's sequence id)
  361. {
  362. TestIterator* internal_iter = new TestIterator(BytewiseComparator());
  363. internal_iter->AddPut("a", "val_a1");
  364. internal_iter->AddPut("a", "val_a2");
  365. internal_iter->AddPut("b", "val_b1");
  366. internal_iter->AddPut("c", "val_c1");
  367. internal_iter->AddPut("c", "val_c2");
  368. internal_iter->AddPut("c", "val_c3");
  369. internal_iter->AddPut("b", "val_b2");
  370. internal_iter->AddPut("d", "val_d1");
  371. internal_iter->Finish();
  372. Slice prefix("c");
  373. ReadOptions ro;
  374. ro.iterate_upper_bound = &prefix;
  375. std::unique_ptr<Iterator> db_iter(NewDBIterator(
  376. env_, ro, cf_options, mutable_cf_options, BytewiseComparator(),
  377. internal_iter, 4, options.max_sequential_skip_in_iterations,
  378. nullptr /*read_callback*/));
  379. db_iter->SeekToLast();
  380. ASSERT_TRUE(db_iter->Valid());
  381. ASSERT_EQ(db_iter->key().ToString(), "b");
  382. ASSERT_EQ(db_iter->value().ToString(), "val_b1");
  383. }
  384. // Test to check the SeekToLast() with the iterate_upper_bound set to the
  385. // key that is deleted
  386. {
  387. TestIterator* internal_iter = new TestIterator(BytewiseComparator());
  388. internal_iter->AddPut("a", "val_a");
  389. internal_iter->AddDeletion("a");
  390. internal_iter->AddPut("b", "val_b");
  391. internal_iter->AddPut("c", "val_c");
  392. internal_iter->Finish();
  393. Slice prefix("a");
  394. ReadOptions ro;
  395. ro.iterate_upper_bound = &prefix;
  396. std::unique_ptr<Iterator> db_iter(NewDBIterator(
  397. env_, ro, cf_options, mutable_cf_options, BytewiseComparator(),
  398. internal_iter, 10, options.max_sequential_skip_in_iterations,
  399. nullptr /*read_callback*/));
  400. db_iter->SeekToLast();
  401. ASSERT_TRUE(!db_iter->Valid());
  402. }
  403. // Test to check the SeekToLast() with the iterate_upper_bound set
  404. // (Deletion cases)
  405. {
  406. TestIterator* internal_iter = new TestIterator(BytewiseComparator());
  407. internal_iter->AddPut("a", "val_a");
  408. internal_iter->AddPut("b", "val_b");
  409. internal_iter->AddDeletion("b");
  410. internal_iter->AddPut("c", "val_c");
  411. internal_iter->Finish();
  412. Slice prefix("c");
  413. ReadOptions ro;
  414. ro.iterate_upper_bound = &prefix;
  415. std::unique_ptr<Iterator> db_iter(NewDBIterator(
  416. env_, ro, cf_options, mutable_cf_options, BytewiseComparator(),
  417. internal_iter, 10, options.max_sequential_skip_in_iterations,
  418. nullptr /*read_callback*/));
  419. db_iter->SeekToLast();
  420. ASSERT_TRUE(db_iter->Valid());
  421. ASSERT_EQ(db_iter->key().ToString(), "a");
  422. db_iter->Next();
  423. ASSERT_TRUE(!db_iter->Valid());
  424. db_iter->SeekToLast();
  425. ASSERT_TRUE(db_iter->Valid());
  426. ASSERT_EQ(db_iter->key().ToString(), "a");
  427. }
  428. // Test to check the SeekToLast() with iterate_upper_bound set
  429. // (Deletion cases - Lot of internal keys after the upper_bound
  430. // is deleted)
  431. {
  432. TestIterator* internal_iter = new TestIterator(BytewiseComparator());
  433. internal_iter->AddPut("a", "val_a");
  434. internal_iter->AddPut("b", "val_b");
  435. internal_iter->AddDeletion("c");
  436. internal_iter->AddDeletion("d");
  437. internal_iter->AddDeletion("e");
  438. internal_iter->AddDeletion("f");
  439. internal_iter->AddDeletion("g");
  440. internal_iter->AddDeletion("h");
  441. internal_iter->Finish();
  442. Slice prefix("c");
  443. ReadOptions ro;
  444. ro.iterate_upper_bound = &prefix;
  445. std::unique_ptr<Iterator> db_iter(NewDBIterator(
  446. env_, ro, cf_options, mutable_cf_options, BytewiseComparator(),
  447. internal_iter, 7, options.max_sequential_skip_in_iterations,
  448. nullptr /*read_callback*/));
  449. SetPerfLevel(kEnableCount);
  450. ASSERT_TRUE(GetPerfLevel() == kEnableCount);
  451. get_perf_context()->Reset();
  452. db_iter->SeekToLast();
  453. ASSERT_TRUE(db_iter->Valid());
  454. ASSERT_EQ(static_cast<int>(get_perf_context()->internal_delete_skipped_count), 0);
  455. ASSERT_EQ(db_iter->key().ToString(), "b");
  456. SetPerfLevel(kDisable);
  457. }
  458. {
  459. TestIterator* internal_iter = new TestIterator(BytewiseComparator());
  460. internal_iter->AddDeletion("a");
  461. internal_iter->AddDeletion("a");
  462. internal_iter->AddDeletion("a");
  463. internal_iter->AddDeletion("a");
  464. internal_iter->AddPut("a", "val_a");
  465. internal_iter->AddPut("b", "val_b");
  466. internal_iter->Finish();
  467. ReadOptions ro;
  468. std::unique_ptr<Iterator> db_iter(NewDBIterator(
  469. env_, ro, cf_options, mutable_cf_options, BytewiseComparator(),
  470. internal_iter, 10, options.max_sequential_skip_in_iterations,
  471. nullptr /*read_callback*/));
  472. db_iter->SeekToFirst();
  473. ASSERT_TRUE(db_iter->Valid());
  474. ASSERT_EQ(db_iter->key().ToString(), "a");
  475. ASSERT_EQ(db_iter->value().ToString(), "val_a");
  476. db_iter->Next();
  477. ASSERT_TRUE(db_iter->Valid());
  478. ASSERT_EQ(db_iter->key().ToString(), "b");
  479. ASSERT_EQ(db_iter->value().ToString(), "val_b");
  480. db_iter->Prev();
  481. ASSERT_TRUE(db_iter->Valid());
  482. ASSERT_EQ(db_iter->key().ToString(), "a");
  483. ASSERT_EQ(db_iter->value().ToString(), "val_a");
  484. db_iter->Prev();
  485. ASSERT_TRUE(!db_iter->Valid());
  486. }
  487. {
  488. TestIterator* internal_iter = new TestIterator(BytewiseComparator());
  489. internal_iter->AddPut("a", "val_a");
  490. internal_iter->AddPut("b", "val_b");
  491. internal_iter->AddPut("a", "val_a");
  492. internal_iter->AddPut("b", "val_b");
  493. internal_iter->AddPut("a", "val_a");
  494. internal_iter->AddPut("b", "val_b");
  495. internal_iter->AddPut("a", "val_a");
  496. internal_iter->AddPut("b", "val_b");
  497. internal_iter->AddPut("a", "val_a");
  498. internal_iter->AddPut("b", "val_b");
  499. internal_iter->Finish();
  500. ReadOptions ro;
  501. std::unique_ptr<Iterator> db_iter(NewDBIterator(
  502. env_, ro, cf_options, mutable_cf_options, BytewiseComparator(),
  503. internal_iter, 2, options.max_sequential_skip_in_iterations,
  504. nullptr /*read_callback*/));
  505. db_iter->SeekToLast();
  506. ASSERT_TRUE(db_iter->Valid());
  507. ASSERT_EQ(db_iter->key().ToString(), "b");
  508. ASSERT_EQ(db_iter->value().ToString(), "val_b");
  509. db_iter->Next();
  510. ASSERT_TRUE(!db_iter->Valid());
  511. db_iter->SeekToLast();
  512. ASSERT_TRUE(db_iter->Valid());
  513. ASSERT_EQ(db_iter->key().ToString(), "b");
  514. ASSERT_EQ(db_iter->value().ToString(), "val_b");
  515. }
  516. {
  517. TestIterator* internal_iter = new TestIterator(BytewiseComparator());
  518. internal_iter->AddPut("a", "val_a");
  519. internal_iter->AddPut("a", "val_a");
  520. internal_iter->AddPut("a", "val_a");
  521. internal_iter->AddPut("a", "val_a");
  522. internal_iter->AddPut("a", "val_a");
  523. internal_iter->AddPut("b", "val_b");
  524. internal_iter->AddPut("c", "val_c");
  525. internal_iter->Finish();
  526. ReadOptions ro;
  527. std::unique_ptr<Iterator> db_iter(NewDBIterator(
  528. env_, ro, cf_options, mutable_cf_options, BytewiseComparator(),
  529. internal_iter, 10, options.max_sequential_skip_in_iterations,
  530. nullptr /*read_callback*/));
  531. db_iter->SeekToLast();
  532. ASSERT_TRUE(db_iter->Valid());
  533. ASSERT_EQ(db_iter->key().ToString(), "c");
  534. ASSERT_EQ(db_iter->value().ToString(), "val_c");
  535. db_iter->Prev();
  536. ASSERT_TRUE(db_iter->Valid());
  537. ASSERT_EQ(db_iter->key().ToString(), "b");
  538. ASSERT_EQ(db_iter->value().ToString(), "val_b");
  539. db_iter->Next();
  540. ASSERT_TRUE(db_iter->Valid());
  541. ASSERT_EQ(db_iter->key().ToString(), "c");
  542. ASSERT_EQ(db_iter->value().ToString(), "val_c");
  543. }
  544. }
  545. TEST_F(DBIteratorTest, DBIteratorEmpty) {
  546. Options options;
  547. ImmutableCFOptions cf_options = ImmutableCFOptions(options);
  548. MutableCFOptions mutable_cf_options = MutableCFOptions(options);
  549. ReadOptions ro;
  550. {
  551. TestIterator* internal_iter = new TestIterator(BytewiseComparator());
  552. internal_iter->Finish();
  553. std::unique_ptr<Iterator> db_iter(NewDBIterator(
  554. env_, ro, cf_options, mutable_cf_options, BytewiseComparator(),
  555. internal_iter, 0, options.max_sequential_skip_in_iterations,
  556. nullptr /*read_callback*/));
  557. db_iter->SeekToLast();
  558. ASSERT_TRUE(!db_iter->Valid());
  559. }
  560. {
  561. TestIterator* internal_iter = new TestIterator(BytewiseComparator());
  562. internal_iter->Finish();
  563. std::unique_ptr<Iterator> db_iter(NewDBIterator(
  564. env_, ro, cf_options, mutable_cf_options, BytewiseComparator(),
  565. internal_iter, 0, options.max_sequential_skip_in_iterations,
  566. nullptr /*read_callback*/));
  567. db_iter->SeekToFirst();
  568. ASSERT_TRUE(!db_iter->Valid());
  569. }
  570. }
  571. TEST_F(DBIteratorTest, DBIteratorUseSkipCountSkips) {
  572. ReadOptions ro;
  573. Options options;
  574. options.statistics = ROCKSDB_NAMESPACE::CreateDBStatistics();
  575. options.merge_operator = MergeOperators::CreateFromStringId("stringappend");
  576. TestIterator* internal_iter = new TestIterator(BytewiseComparator());
  577. for (size_t i = 0; i < 200; ++i) {
  578. internal_iter->AddPut("a", "a");
  579. internal_iter->AddPut("b", "b");
  580. internal_iter->AddPut("c", "c");
  581. }
  582. internal_iter->Finish();
  583. std::unique_ptr<Iterator> db_iter(NewDBIterator(
  584. env_, ro, ImmutableCFOptions(options), MutableCFOptions(options),
  585. BytewiseComparator(), internal_iter, 2,
  586. options.max_sequential_skip_in_iterations, nullptr /*read_callback*/));
  587. db_iter->SeekToLast();
  588. ASSERT_TRUE(db_iter->Valid());
  589. ASSERT_EQ(db_iter->key().ToString(), "c");
  590. ASSERT_EQ(db_iter->value().ToString(), "c");
  591. ASSERT_EQ(TestGetTickerCount(options, NUMBER_OF_RESEEKS_IN_ITERATION), 1u);
  592. db_iter->Prev();
  593. ASSERT_TRUE(db_iter->Valid());
  594. ASSERT_EQ(db_iter->key().ToString(), "b");
  595. ASSERT_EQ(db_iter->value().ToString(), "b");
  596. ASSERT_EQ(TestGetTickerCount(options, NUMBER_OF_RESEEKS_IN_ITERATION), 2u);
  597. db_iter->Prev();
  598. ASSERT_TRUE(db_iter->Valid());
  599. ASSERT_EQ(db_iter->key().ToString(), "a");
  600. ASSERT_EQ(db_iter->value().ToString(), "a");
  601. ASSERT_EQ(TestGetTickerCount(options, NUMBER_OF_RESEEKS_IN_ITERATION), 3u);
  602. db_iter->Prev();
  603. ASSERT_TRUE(!db_iter->Valid());
  604. ASSERT_EQ(TestGetTickerCount(options, NUMBER_OF_RESEEKS_IN_ITERATION), 3u);
  605. }
  606. TEST_F(DBIteratorTest, DBIteratorUseSkip) {
  607. ReadOptions ro;
  608. Options options;
  609. options.merge_operator = MergeOperators::CreateFromStringId("stringappend");
  610. ImmutableCFOptions cf_options = ImmutableCFOptions(options);
  611. MutableCFOptions mutable_cf_options = MutableCFOptions(options);
  612. {
  613. for (size_t i = 0; i < 200; ++i) {
  614. TestIterator* internal_iter = new TestIterator(BytewiseComparator());
  615. internal_iter->AddMerge("b", "merge_1");
  616. internal_iter->AddMerge("a", "merge_2");
  617. for (size_t k = 0; k < 200; ++k) {
  618. internal_iter->AddPut("c", ToString(k));
  619. }
  620. internal_iter->Finish();
  621. options.statistics = ROCKSDB_NAMESPACE::CreateDBStatistics();
  622. std::unique_ptr<Iterator> db_iter(NewDBIterator(
  623. env_, ro, cf_options, mutable_cf_options, BytewiseComparator(),
  624. internal_iter, i + 2, options.max_sequential_skip_in_iterations,
  625. nullptr /*read_callback*/));
  626. db_iter->SeekToLast();
  627. ASSERT_TRUE(db_iter->Valid());
  628. ASSERT_EQ(db_iter->key().ToString(), "c");
  629. ASSERT_EQ(db_iter->value().ToString(), ToString(i));
  630. db_iter->Prev();
  631. ASSERT_TRUE(db_iter->Valid());
  632. ASSERT_EQ(db_iter->key().ToString(), "b");
  633. ASSERT_EQ(db_iter->value().ToString(), "merge_1");
  634. db_iter->Prev();
  635. ASSERT_TRUE(db_iter->Valid());
  636. ASSERT_EQ(db_iter->key().ToString(), "a");
  637. ASSERT_EQ(db_iter->value().ToString(), "merge_2");
  638. db_iter->Prev();
  639. ASSERT_TRUE(!db_iter->Valid());
  640. }
  641. }
  642. {
  643. for (size_t i = 0; i < 200; ++i) {
  644. TestIterator* internal_iter = new TestIterator(BytewiseComparator());
  645. internal_iter->AddMerge("b", "merge_1");
  646. internal_iter->AddMerge("a", "merge_2");
  647. for (size_t k = 0; k < 200; ++k) {
  648. internal_iter->AddDeletion("c");
  649. }
  650. internal_iter->AddPut("c", "200");
  651. internal_iter->Finish();
  652. std::unique_ptr<Iterator> db_iter(NewDBIterator(
  653. env_, ro, cf_options, mutable_cf_options, BytewiseComparator(),
  654. internal_iter, i + 2, options.max_sequential_skip_in_iterations,
  655. nullptr /*read_callback*/));
  656. db_iter->SeekToLast();
  657. ASSERT_TRUE(db_iter->Valid());
  658. ASSERT_EQ(db_iter->key().ToString(), "b");
  659. ASSERT_EQ(db_iter->value().ToString(), "merge_1");
  660. db_iter->Prev();
  661. ASSERT_TRUE(db_iter->Valid());
  662. ASSERT_EQ(db_iter->key().ToString(), "a");
  663. ASSERT_EQ(db_iter->value().ToString(), "merge_2");
  664. db_iter->Prev();
  665. ASSERT_TRUE(!db_iter->Valid());
  666. }
  667. {
  668. TestIterator* internal_iter = new TestIterator(BytewiseComparator());
  669. internal_iter->AddMerge("b", "merge_1");
  670. internal_iter->AddMerge("a", "merge_2");
  671. for (size_t i = 0; i < 200; ++i) {
  672. internal_iter->AddDeletion("c");
  673. }
  674. internal_iter->AddPut("c", "200");
  675. internal_iter->Finish();
  676. std::unique_ptr<Iterator> db_iter(NewDBIterator(
  677. env_, ro, cf_options, mutable_cf_options, BytewiseComparator(),
  678. internal_iter, 202, options.max_sequential_skip_in_iterations,
  679. nullptr /*read_callback*/));
  680. db_iter->SeekToLast();
  681. ASSERT_TRUE(db_iter->Valid());
  682. ASSERT_EQ(db_iter->key().ToString(), "c");
  683. ASSERT_EQ(db_iter->value().ToString(), "200");
  684. db_iter->Prev();
  685. ASSERT_TRUE(db_iter->Valid());
  686. ASSERT_EQ(db_iter->key().ToString(), "b");
  687. ASSERT_EQ(db_iter->value().ToString(), "merge_1");
  688. db_iter->Prev();
  689. ASSERT_TRUE(db_iter->Valid());
  690. ASSERT_EQ(db_iter->key().ToString(), "a");
  691. ASSERT_EQ(db_iter->value().ToString(), "merge_2");
  692. db_iter->Prev();
  693. ASSERT_TRUE(!db_iter->Valid());
  694. }
  695. }
  696. {
  697. for (size_t i = 0; i < 200; ++i) {
  698. TestIterator* internal_iter = new TestIterator(BytewiseComparator());
  699. for (size_t k = 0; k < 200; ++k) {
  700. internal_iter->AddDeletion("c");
  701. }
  702. internal_iter->AddPut("c", "200");
  703. internal_iter->Finish();
  704. std::unique_ptr<Iterator> db_iter(NewDBIterator(
  705. env_, ro, cf_options, mutable_cf_options, BytewiseComparator(),
  706. internal_iter, i, options.max_sequential_skip_in_iterations,
  707. nullptr /*read_callback*/));
  708. db_iter->SeekToLast();
  709. ASSERT_TRUE(!db_iter->Valid());
  710. db_iter->SeekToFirst();
  711. ASSERT_TRUE(!db_iter->Valid());
  712. }
  713. TestIterator* internal_iter = new TestIterator(BytewiseComparator());
  714. for (size_t i = 0; i < 200; ++i) {
  715. internal_iter->AddDeletion("c");
  716. }
  717. internal_iter->AddPut("c", "200");
  718. internal_iter->Finish();
  719. std::unique_ptr<Iterator> db_iter(NewDBIterator(
  720. env_, ro, cf_options, mutable_cf_options, BytewiseComparator(),
  721. internal_iter, 200, options.max_sequential_skip_in_iterations,
  722. nullptr /*read_callback*/));
  723. db_iter->SeekToLast();
  724. ASSERT_TRUE(db_iter->Valid());
  725. ASSERT_EQ(db_iter->key().ToString(), "c");
  726. ASSERT_EQ(db_iter->value().ToString(), "200");
  727. db_iter->Prev();
  728. ASSERT_TRUE(!db_iter->Valid());
  729. db_iter->SeekToFirst();
  730. ASSERT_TRUE(db_iter->Valid());
  731. ASSERT_EQ(db_iter->key().ToString(), "c");
  732. ASSERT_EQ(db_iter->value().ToString(), "200");
  733. db_iter->Next();
  734. ASSERT_TRUE(!db_iter->Valid());
  735. }
  736. {
  737. for (size_t i = 0; i < 200; ++i) {
  738. TestIterator* internal_iter = new TestIterator(BytewiseComparator());
  739. internal_iter->AddMerge("b", "merge_1");
  740. internal_iter->AddMerge("a", "merge_2");
  741. for (size_t k = 0; k < 200; ++k) {
  742. internal_iter->AddPut("d", ToString(k));
  743. }
  744. for (size_t k = 0; k < 200; ++k) {
  745. internal_iter->AddPut("c", ToString(k));
  746. }
  747. internal_iter->Finish();
  748. std::unique_ptr<Iterator> db_iter(NewDBIterator(
  749. env_, ro, cf_options, mutable_cf_options, BytewiseComparator(),
  750. internal_iter, i + 2, options.max_sequential_skip_in_iterations,
  751. nullptr /*read_callback*/));
  752. db_iter->SeekToLast();
  753. ASSERT_TRUE(db_iter->Valid());
  754. ASSERT_EQ(db_iter->key().ToString(), "d");
  755. ASSERT_EQ(db_iter->value().ToString(), ToString(i));
  756. db_iter->Prev();
  757. ASSERT_TRUE(db_iter->Valid());
  758. ASSERT_EQ(db_iter->key().ToString(), "b");
  759. ASSERT_EQ(db_iter->value().ToString(), "merge_1");
  760. db_iter->Prev();
  761. ASSERT_TRUE(db_iter->Valid());
  762. ASSERT_EQ(db_iter->key().ToString(), "a");
  763. ASSERT_EQ(db_iter->value().ToString(), "merge_2");
  764. db_iter->Prev();
  765. ASSERT_TRUE(!db_iter->Valid());
  766. }
  767. }
  768. {
  769. for (size_t i = 0; i < 200; ++i) {
  770. TestIterator* internal_iter = new TestIterator(BytewiseComparator());
  771. internal_iter->AddMerge("b", "b");
  772. internal_iter->AddMerge("a", "a");
  773. for (size_t k = 0; k < 200; ++k) {
  774. internal_iter->AddMerge("c", ToString(k));
  775. }
  776. internal_iter->Finish();
  777. std::unique_ptr<Iterator> db_iter(NewDBIterator(
  778. env_, ro, cf_options, mutable_cf_options, BytewiseComparator(),
  779. internal_iter, i + 2, options.max_sequential_skip_in_iterations,
  780. nullptr /*read_callback*/));
  781. db_iter->SeekToLast();
  782. ASSERT_TRUE(db_iter->Valid());
  783. ASSERT_EQ(db_iter->key().ToString(), "c");
  784. std::string merge_result = "0";
  785. for (size_t j = 1; j <= i; ++j) {
  786. merge_result += "," + ToString(j);
  787. }
  788. ASSERT_EQ(db_iter->value().ToString(), merge_result);
  789. db_iter->Prev();
  790. ASSERT_TRUE(db_iter->Valid());
  791. ASSERT_EQ(db_iter->key().ToString(), "b");
  792. ASSERT_EQ(db_iter->value().ToString(), "b");
  793. db_iter->Prev();
  794. ASSERT_TRUE(db_iter->Valid());
  795. ASSERT_EQ(db_iter->key().ToString(), "a");
  796. ASSERT_EQ(db_iter->value().ToString(), "a");
  797. db_iter->Prev();
  798. ASSERT_TRUE(!db_iter->Valid());
  799. }
  800. }
  801. }
  802. TEST_F(DBIteratorTest, DBIteratorSkipInternalKeys) {
  803. Options options;
  804. ImmutableCFOptions cf_options = ImmutableCFOptions(options);
  805. MutableCFOptions mutable_cf_options = MutableCFOptions(options);
  806. ReadOptions ro;
  807. // Basic test case ... Make sure explicityly passing the default value works.
  808. // Skipping internal keys is disabled by default, when the value is 0.
  809. {
  810. TestIterator* internal_iter = new TestIterator(BytewiseComparator());
  811. internal_iter->AddPut("a", "val_a");
  812. internal_iter->AddDeletion("b");
  813. internal_iter->AddDeletion("b");
  814. internal_iter->AddPut("c", "val_c");
  815. internal_iter->AddPut("c", "val_c");
  816. internal_iter->AddDeletion("c");
  817. internal_iter->AddPut("d", "val_d");
  818. internal_iter->Finish();
  819. ro.max_skippable_internal_keys = 0;
  820. std::unique_ptr<Iterator> db_iter(NewDBIterator(
  821. env_, ro, cf_options, mutable_cf_options, BytewiseComparator(),
  822. internal_iter, 10, options.max_sequential_skip_in_iterations,
  823. nullptr /*read_callback*/));
  824. db_iter->SeekToFirst();
  825. ASSERT_TRUE(db_iter->Valid());
  826. ASSERT_EQ(db_iter->key().ToString(), "a");
  827. ASSERT_EQ(db_iter->value().ToString(), "val_a");
  828. db_iter->Next();
  829. ASSERT_TRUE(db_iter->Valid());
  830. ASSERT_EQ(db_iter->key().ToString(), "d");
  831. ASSERT_EQ(db_iter->value().ToString(), "val_d");
  832. db_iter->Next();
  833. ASSERT_TRUE(!db_iter->Valid());
  834. ASSERT_TRUE(db_iter->status().ok());
  835. db_iter->SeekToLast();
  836. ASSERT_TRUE(db_iter->Valid());
  837. ASSERT_EQ(db_iter->key().ToString(), "d");
  838. ASSERT_EQ(db_iter->value().ToString(), "val_d");
  839. db_iter->Prev();
  840. ASSERT_TRUE(db_iter->Valid());
  841. ASSERT_EQ(db_iter->key().ToString(), "a");
  842. ASSERT_EQ(db_iter->value().ToString(), "val_a");
  843. db_iter->Prev();
  844. ASSERT_TRUE(!db_iter->Valid());
  845. ASSERT_TRUE(db_iter->status().ok());
  846. }
  847. // Test to make sure that the request will *not* fail as incomplete if
  848. // num_internal_keys_skipped is *equal* to max_skippable_internal_keys
  849. // threshold. (It will fail as incomplete only when the threshold is
  850. // exceeded.)
  851. {
  852. TestIterator* internal_iter = new TestIterator(BytewiseComparator());
  853. internal_iter->AddPut("a", "val_a");
  854. internal_iter->AddDeletion("b");
  855. internal_iter->AddDeletion("b");
  856. internal_iter->AddPut("c", "val_c");
  857. internal_iter->Finish();
  858. ro.max_skippable_internal_keys = 2;
  859. std::unique_ptr<Iterator> db_iter(NewDBIterator(
  860. env_, ro, cf_options, mutable_cf_options, BytewiseComparator(),
  861. internal_iter, 10, options.max_sequential_skip_in_iterations,
  862. nullptr /*read_callback*/));
  863. db_iter->SeekToFirst();
  864. ASSERT_TRUE(db_iter->Valid());
  865. ASSERT_EQ(db_iter->key().ToString(), "a");
  866. ASSERT_EQ(db_iter->value().ToString(), "val_a");
  867. db_iter->Next();
  868. ASSERT_TRUE(db_iter->Valid());
  869. ASSERT_EQ(db_iter->key().ToString(), "c");
  870. ASSERT_EQ(db_iter->value().ToString(), "val_c");
  871. db_iter->Next();
  872. ASSERT_TRUE(!db_iter->Valid());
  873. ASSERT_TRUE(db_iter->status().ok());
  874. db_iter->SeekToLast();
  875. ASSERT_TRUE(db_iter->Valid());
  876. ASSERT_EQ(db_iter->key().ToString(), "c");
  877. ASSERT_EQ(db_iter->value().ToString(), "val_c");
  878. db_iter->Prev();
  879. ASSERT_EQ(db_iter->key().ToString(), "a");
  880. ASSERT_EQ(db_iter->value().ToString(), "val_a");
  881. db_iter->Prev();
  882. ASSERT_TRUE(!db_iter->Valid());
  883. ASSERT_TRUE(db_iter->status().ok());
  884. }
  885. // Fail the request as incomplete when num_internal_keys_skipped >
  886. // max_skippable_internal_keys
  887. {
  888. TestIterator* internal_iter = new TestIterator(BytewiseComparator());
  889. internal_iter->AddPut("a", "val_a");
  890. internal_iter->AddDeletion("b");
  891. internal_iter->AddDeletion("b");
  892. internal_iter->AddDeletion("b");
  893. internal_iter->AddPut("c", "val_c");
  894. internal_iter->Finish();
  895. ro.max_skippable_internal_keys = 2;
  896. std::unique_ptr<Iterator> db_iter(NewDBIterator(
  897. env_, ro, cf_options, mutable_cf_options, BytewiseComparator(),
  898. internal_iter, 10, options.max_sequential_skip_in_iterations,
  899. nullptr /*read_callback*/));
  900. db_iter->SeekToFirst();
  901. ASSERT_TRUE(db_iter->Valid());
  902. ASSERT_EQ(db_iter->key().ToString(), "a");
  903. ASSERT_EQ(db_iter->value().ToString(), "val_a");
  904. db_iter->Next();
  905. ASSERT_TRUE(!db_iter->Valid());
  906. ASSERT_TRUE(db_iter->status().IsIncomplete());
  907. db_iter->SeekToLast();
  908. ASSERT_TRUE(db_iter->Valid());
  909. ASSERT_EQ(db_iter->key().ToString(), "c");
  910. ASSERT_EQ(db_iter->value().ToString(), "val_c");
  911. db_iter->Prev();
  912. ASSERT_TRUE(!db_iter->Valid());
  913. ASSERT_TRUE(db_iter->status().IsIncomplete());
  914. }
  915. // Test that the num_internal_keys_skipped counter resets after a successful
  916. // read.
  917. {
  918. TestIterator* internal_iter = new TestIterator(BytewiseComparator());
  919. internal_iter->AddPut("a", "val_a");
  920. internal_iter->AddDeletion("b");
  921. internal_iter->AddDeletion("b");
  922. internal_iter->AddPut("c", "val_c");
  923. internal_iter->AddDeletion("d");
  924. internal_iter->AddDeletion("d");
  925. internal_iter->AddDeletion("d");
  926. internal_iter->AddPut("e", "val_e");
  927. internal_iter->Finish();
  928. ro.max_skippable_internal_keys = 2;
  929. std::unique_ptr<Iterator> db_iter(NewDBIterator(
  930. env_, ro, cf_options, mutable_cf_options, BytewiseComparator(),
  931. internal_iter, 10, options.max_sequential_skip_in_iterations,
  932. nullptr /*read_callback*/));
  933. db_iter->SeekToFirst();
  934. ASSERT_TRUE(db_iter->Valid());
  935. ASSERT_EQ(db_iter->key().ToString(), "a");
  936. ASSERT_EQ(db_iter->value().ToString(), "val_a");
  937. db_iter->Next();
  938. ASSERT_TRUE(db_iter->Valid());
  939. ASSERT_EQ(db_iter->key().ToString(), "c");
  940. ASSERT_EQ(db_iter->value().ToString(), "val_c");
  941. db_iter->Next(); // num_internal_keys_skipped counter resets here.
  942. ASSERT_TRUE(!db_iter->Valid());
  943. ASSERT_TRUE(db_iter->status().IsIncomplete());
  944. }
  945. // Test that the num_internal_keys_skipped counter resets after a successful
  946. // read.
  947. // Reverse direction
  948. {
  949. TestIterator* internal_iter = new TestIterator(BytewiseComparator());
  950. internal_iter->AddPut("a", "val_a");
  951. internal_iter->AddDeletion("b");
  952. internal_iter->AddDeletion("b");
  953. internal_iter->AddDeletion("b");
  954. internal_iter->AddPut("c", "val_c");
  955. internal_iter->AddDeletion("d");
  956. internal_iter->AddDeletion("d");
  957. internal_iter->AddPut("e", "val_e");
  958. internal_iter->Finish();
  959. ro.max_skippable_internal_keys = 2;
  960. std::unique_ptr<Iterator> db_iter(NewDBIterator(
  961. env_, ro, cf_options, mutable_cf_options, BytewiseComparator(),
  962. internal_iter, 10, options.max_sequential_skip_in_iterations,
  963. nullptr /*read_callback*/));
  964. db_iter->SeekToLast();
  965. ASSERT_TRUE(db_iter->Valid());
  966. ASSERT_EQ(db_iter->key().ToString(), "e");
  967. ASSERT_EQ(db_iter->value().ToString(), "val_e");
  968. db_iter->Prev();
  969. ASSERT_TRUE(db_iter->Valid());
  970. ASSERT_EQ(db_iter->key().ToString(), "c");
  971. ASSERT_EQ(db_iter->value().ToString(), "val_c");
  972. db_iter->Prev(); // num_internal_keys_skipped counter resets here.
  973. ASSERT_TRUE(!db_iter->Valid());
  974. ASSERT_TRUE(db_iter->status().IsIncomplete());
  975. }
  976. // Test that skipping separate keys is handled
  977. {
  978. TestIterator* internal_iter = new TestIterator(BytewiseComparator());
  979. internal_iter->AddPut("a", "val_a");
  980. internal_iter->AddDeletion("b");
  981. internal_iter->AddDeletion("c");
  982. internal_iter->AddDeletion("d");
  983. internal_iter->AddPut("e", "val_e");
  984. internal_iter->Finish();
  985. ro.max_skippable_internal_keys = 2;
  986. std::unique_ptr<Iterator> db_iter(NewDBIterator(
  987. env_, ro, cf_options, mutable_cf_options, BytewiseComparator(),
  988. internal_iter, 10, options.max_sequential_skip_in_iterations,
  989. nullptr /*read_callback*/));
  990. db_iter->SeekToFirst();
  991. ASSERT_TRUE(db_iter->Valid());
  992. ASSERT_EQ(db_iter->key().ToString(), "a");
  993. ASSERT_EQ(db_iter->value().ToString(), "val_a");
  994. db_iter->Next();
  995. ASSERT_TRUE(!db_iter->Valid());
  996. ASSERT_TRUE(db_iter->status().IsIncomplete());
  997. db_iter->SeekToLast();
  998. ASSERT_TRUE(db_iter->Valid());
  999. ASSERT_EQ(db_iter->key().ToString(), "e");
  1000. ASSERT_EQ(db_iter->value().ToString(), "val_e");
  1001. db_iter->Prev();
  1002. ASSERT_TRUE(!db_iter->Valid());
  1003. ASSERT_TRUE(db_iter->status().IsIncomplete());
  1004. }
  1005. // Test if alternating puts and deletes of the same key are handled correctly.
  1006. {
  1007. TestIterator* internal_iter = new TestIterator(BytewiseComparator());
  1008. internal_iter->AddPut("a", "val_a");
  1009. internal_iter->AddPut("b", "val_b");
  1010. internal_iter->AddDeletion("b");
  1011. internal_iter->AddPut("c", "val_c");
  1012. internal_iter->AddDeletion("c");
  1013. internal_iter->AddPut("d", "val_d");
  1014. internal_iter->AddDeletion("d");
  1015. internal_iter->AddPut("e", "val_e");
  1016. internal_iter->Finish();
  1017. ro.max_skippable_internal_keys = 2;
  1018. std::unique_ptr<Iterator> db_iter(NewDBIterator(
  1019. env_, ro, cf_options, mutable_cf_options, BytewiseComparator(),
  1020. internal_iter, 10, options.max_sequential_skip_in_iterations,
  1021. nullptr /*read_callback*/));
  1022. db_iter->SeekToFirst();
  1023. ASSERT_TRUE(db_iter->Valid());
  1024. ASSERT_EQ(db_iter->key().ToString(), "a");
  1025. ASSERT_EQ(db_iter->value().ToString(), "val_a");
  1026. db_iter->Next();
  1027. ASSERT_TRUE(!db_iter->Valid());
  1028. ASSERT_TRUE(db_iter->status().IsIncomplete());
  1029. db_iter->SeekToLast();
  1030. ASSERT_TRUE(db_iter->Valid());
  1031. ASSERT_EQ(db_iter->key().ToString(), "e");
  1032. ASSERT_EQ(db_iter->value().ToString(), "val_e");
  1033. db_iter->Prev();
  1034. ASSERT_TRUE(!db_iter->Valid());
  1035. ASSERT_TRUE(db_iter->status().IsIncomplete());
  1036. }
  1037. // Test for large number of skippable internal keys with *default*
  1038. // max_sequential_skip_in_iterations.
  1039. {
  1040. for (size_t i = 1; i <= 200; ++i) {
  1041. TestIterator* internal_iter = new TestIterator(BytewiseComparator());
  1042. internal_iter->AddPut("a", "val_a");
  1043. for (size_t j = 1; j <= i; ++j) {
  1044. internal_iter->AddPut("b", "val_b");
  1045. internal_iter->AddDeletion("b");
  1046. }
  1047. internal_iter->AddPut("c", "val_c");
  1048. internal_iter->Finish();
  1049. ro.max_skippable_internal_keys = i;
  1050. std::unique_ptr<Iterator> db_iter(NewDBIterator(
  1051. env_, ro, cf_options, mutable_cf_options, BytewiseComparator(),
  1052. internal_iter, 2 * i + 1, options.max_sequential_skip_in_iterations,
  1053. nullptr /*read_callback*/));
  1054. db_iter->SeekToFirst();
  1055. ASSERT_TRUE(db_iter->Valid());
  1056. ASSERT_EQ(db_iter->key().ToString(), "a");
  1057. ASSERT_EQ(db_iter->value().ToString(), "val_a");
  1058. db_iter->Next();
  1059. if ((options.max_sequential_skip_in_iterations + 1) >=
  1060. ro.max_skippable_internal_keys) {
  1061. ASSERT_TRUE(!db_iter->Valid());
  1062. ASSERT_TRUE(db_iter->status().IsIncomplete());
  1063. } else {
  1064. ASSERT_TRUE(db_iter->Valid());
  1065. ASSERT_EQ(db_iter->key().ToString(), "c");
  1066. ASSERT_EQ(db_iter->value().ToString(), "val_c");
  1067. }
  1068. db_iter->SeekToLast();
  1069. ASSERT_TRUE(db_iter->Valid());
  1070. ASSERT_EQ(db_iter->key().ToString(), "c");
  1071. ASSERT_EQ(db_iter->value().ToString(), "val_c");
  1072. db_iter->Prev();
  1073. if ((options.max_sequential_skip_in_iterations + 1) >=
  1074. ro.max_skippable_internal_keys) {
  1075. ASSERT_TRUE(!db_iter->Valid());
  1076. ASSERT_TRUE(db_iter->status().IsIncomplete());
  1077. } else {
  1078. ASSERT_TRUE(db_iter->Valid());
  1079. ASSERT_EQ(db_iter->key().ToString(), "a");
  1080. ASSERT_EQ(db_iter->value().ToString(), "val_a");
  1081. }
  1082. }
  1083. }
  1084. // Test for large number of skippable internal keys with a *non-default*
  1085. // max_sequential_skip_in_iterations.
  1086. {
  1087. for (size_t i = 1; i <= 200; ++i) {
  1088. TestIterator* internal_iter = new TestIterator(BytewiseComparator());
  1089. internal_iter->AddPut("a", "val_a");
  1090. for (size_t j = 1; j <= i; ++j) {
  1091. internal_iter->AddPut("b", "val_b");
  1092. internal_iter->AddDeletion("b");
  1093. }
  1094. internal_iter->AddPut("c", "val_c");
  1095. internal_iter->Finish();
  1096. options.max_sequential_skip_in_iterations = 1000;
  1097. ro.max_skippable_internal_keys = i;
  1098. std::unique_ptr<Iterator> db_iter(NewDBIterator(
  1099. env_, ro, cf_options, mutable_cf_options, BytewiseComparator(),
  1100. internal_iter, 2 * i + 1, options.max_sequential_skip_in_iterations,
  1101. nullptr /*read_callback*/));
  1102. db_iter->SeekToFirst();
  1103. ASSERT_TRUE(db_iter->Valid());
  1104. ASSERT_EQ(db_iter->key().ToString(), "a");
  1105. ASSERT_EQ(db_iter->value().ToString(), "val_a");
  1106. db_iter->Next();
  1107. ASSERT_TRUE(!db_iter->Valid());
  1108. ASSERT_TRUE(db_iter->status().IsIncomplete());
  1109. db_iter->SeekToLast();
  1110. ASSERT_TRUE(db_iter->Valid());
  1111. ASSERT_EQ(db_iter->key().ToString(), "c");
  1112. ASSERT_EQ(db_iter->value().ToString(), "val_c");
  1113. db_iter->Prev();
  1114. ASSERT_TRUE(!db_iter->Valid());
  1115. ASSERT_TRUE(db_iter->status().IsIncomplete());
  1116. }
  1117. }
  1118. }
  1119. TEST_F(DBIteratorTest, DBIterator1) {
  1120. ReadOptions ro;
  1121. Options options;
  1122. options.merge_operator = MergeOperators::CreateFromStringId("stringappend");
  1123. TestIterator* internal_iter = new TestIterator(BytewiseComparator());
  1124. internal_iter->AddPut("a", "0");
  1125. internal_iter->AddPut("b", "0");
  1126. internal_iter->AddDeletion("b");
  1127. internal_iter->AddMerge("a", "1");
  1128. internal_iter->AddMerge("b", "2");
  1129. internal_iter->Finish();
  1130. std::unique_ptr<Iterator> db_iter(NewDBIterator(
  1131. env_, ro, ImmutableCFOptions(options), MutableCFOptions(options),
  1132. BytewiseComparator(), internal_iter, 1,
  1133. options.max_sequential_skip_in_iterations, nullptr /*read_callback*/));
  1134. db_iter->SeekToFirst();
  1135. ASSERT_TRUE(db_iter->Valid());
  1136. ASSERT_EQ(db_iter->key().ToString(), "a");
  1137. ASSERT_EQ(db_iter->value().ToString(), "0");
  1138. db_iter->Next();
  1139. ASSERT_TRUE(db_iter->Valid());
  1140. ASSERT_EQ(db_iter->key().ToString(), "b");
  1141. db_iter->Next();
  1142. ASSERT_FALSE(db_iter->Valid());
  1143. }
  1144. TEST_F(DBIteratorTest, DBIterator2) {
  1145. ReadOptions ro;
  1146. Options options;
  1147. options.merge_operator = MergeOperators::CreateFromStringId("stringappend");
  1148. TestIterator* internal_iter = new TestIterator(BytewiseComparator());
  1149. internal_iter->AddPut("a", "0");
  1150. internal_iter->AddPut("b", "0");
  1151. internal_iter->AddDeletion("b");
  1152. internal_iter->AddMerge("a", "1");
  1153. internal_iter->AddMerge("b", "2");
  1154. internal_iter->Finish();
  1155. std::unique_ptr<Iterator> db_iter(NewDBIterator(
  1156. env_, ro, ImmutableCFOptions(options), MutableCFOptions(options),
  1157. BytewiseComparator(), internal_iter, 0,
  1158. options.max_sequential_skip_in_iterations, nullptr /*read_callback*/));
  1159. db_iter->SeekToFirst();
  1160. ASSERT_TRUE(db_iter->Valid());
  1161. ASSERT_EQ(db_iter->key().ToString(), "a");
  1162. ASSERT_EQ(db_iter->value().ToString(), "0");
  1163. db_iter->Next();
  1164. ASSERT_TRUE(!db_iter->Valid());
  1165. }
  1166. TEST_F(DBIteratorTest, DBIterator3) {
  1167. ReadOptions ro;
  1168. Options options;
  1169. options.merge_operator = MergeOperators::CreateFromStringId("stringappend");
  1170. TestIterator* internal_iter = new TestIterator(BytewiseComparator());
  1171. internal_iter->AddPut("a", "0");
  1172. internal_iter->AddPut("b", "0");
  1173. internal_iter->AddDeletion("b");
  1174. internal_iter->AddMerge("a", "1");
  1175. internal_iter->AddMerge("b", "2");
  1176. internal_iter->Finish();
  1177. std::unique_ptr<Iterator> db_iter(NewDBIterator(
  1178. env_, ro, ImmutableCFOptions(options), MutableCFOptions(options),
  1179. BytewiseComparator(), internal_iter, 2,
  1180. options.max_sequential_skip_in_iterations, nullptr /*read_callback*/));
  1181. db_iter->SeekToFirst();
  1182. ASSERT_TRUE(db_iter->Valid());
  1183. ASSERT_EQ(db_iter->key().ToString(), "a");
  1184. ASSERT_EQ(db_iter->value().ToString(), "0");
  1185. db_iter->Next();
  1186. ASSERT_TRUE(!db_iter->Valid());
  1187. }
  1188. TEST_F(DBIteratorTest, DBIterator4) {
  1189. ReadOptions ro;
  1190. Options options;
  1191. options.merge_operator = MergeOperators::CreateFromStringId("stringappend");
  1192. TestIterator* internal_iter = new TestIterator(BytewiseComparator());
  1193. internal_iter->AddPut("a", "0");
  1194. internal_iter->AddPut("b", "0");
  1195. internal_iter->AddDeletion("b");
  1196. internal_iter->AddMerge("a", "1");
  1197. internal_iter->AddMerge("b", "2");
  1198. internal_iter->Finish();
  1199. std::unique_ptr<Iterator> db_iter(NewDBIterator(
  1200. env_, ro, ImmutableCFOptions(options), MutableCFOptions(options),
  1201. BytewiseComparator(), internal_iter, 4,
  1202. options.max_sequential_skip_in_iterations, nullptr /*read_callback*/));
  1203. db_iter->SeekToFirst();
  1204. ASSERT_TRUE(db_iter->Valid());
  1205. ASSERT_EQ(db_iter->key().ToString(), "a");
  1206. ASSERT_EQ(db_iter->value().ToString(), "0,1");
  1207. db_iter->Next();
  1208. ASSERT_TRUE(db_iter->Valid());
  1209. ASSERT_EQ(db_iter->key().ToString(), "b");
  1210. ASSERT_EQ(db_iter->value().ToString(), "2");
  1211. db_iter->Next();
  1212. ASSERT_TRUE(!db_iter->Valid());
  1213. }
  1214. TEST_F(DBIteratorTest, DBIterator5) {
  1215. ReadOptions ro;
  1216. Options options;
  1217. options.merge_operator = MergeOperators::CreateFromStringId("stringappend");
  1218. ImmutableCFOptions cf_options = ImmutableCFOptions(options);
  1219. MutableCFOptions mutable_cf_options = MutableCFOptions(options);
  1220. {
  1221. TestIterator* internal_iter = new TestIterator(BytewiseComparator());
  1222. internal_iter->AddMerge("a", "merge_1");
  1223. internal_iter->AddMerge("a", "merge_2");
  1224. internal_iter->AddMerge("a", "merge_3");
  1225. internal_iter->AddPut("a", "put_1");
  1226. internal_iter->AddMerge("a", "merge_4");
  1227. internal_iter->AddMerge("a", "merge_5");
  1228. internal_iter->AddMerge("a", "merge_6");
  1229. internal_iter->Finish();
  1230. std::unique_ptr<Iterator> db_iter(NewDBIterator(
  1231. env_, ro, cf_options, mutable_cf_options, BytewiseComparator(),
  1232. internal_iter, 0, options.max_sequential_skip_in_iterations,
  1233. nullptr /*read_callback*/));
  1234. db_iter->SeekToLast();
  1235. ASSERT_TRUE(db_iter->Valid());
  1236. ASSERT_EQ(db_iter->key().ToString(), "a");
  1237. ASSERT_EQ(db_iter->value().ToString(), "merge_1");
  1238. db_iter->Prev();
  1239. ASSERT_TRUE(!db_iter->Valid());
  1240. }
  1241. {
  1242. TestIterator* internal_iter = new TestIterator(BytewiseComparator());
  1243. internal_iter->AddMerge("a", "merge_1");
  1244. internal_iter->AddMerge("a", "merge_2");
  1245. internal_iter->AddMerge("a", "merge_3");
  1246. internal_iter->AddPut("a", "put_1");
  1247. internal_iter->AddMerge("a", "merge_4");
  1248. internal_iter->AddMerge("a", "merge_5");
  1249. internal_iter->AddMerge("a", "merge_6");
  1250. internal_iter->Finish();
  1251. std::unique_ptr<Iterator> db_iter(NewDBIterator(
  1252. env_, ro, cf_options, mutable_cf_options, BytewiseComparator(),
  1253. internal_iter, 1, options.max_sequential_skip_in_iterations,
  1254. nullptr /*read_callback*/));
  1255. db_iter->SeekToLast();
  1256. ASSERT_TRUE(db_iter->Valid());
  1257. ASSERT_EQ(db_iter->key().ToString(), "a");
  1258. ASSERT_EQ(db_iter->value().ToString(), "merge_1,merge_2");
  1259. db_iter->Prev();
  1260. ASSERT_TRUE(!db_iter->Valid());
  1261. }
  1262. {
  1263. TestIterator* internal_iter = new TestIterator(BytewiseComparator());
  1264. internal_iter->AddMerge("a", "merge_1");
  1265. internal_iter->AddMerge("a", "merge_2");
  1266. internal_iter->AddMerge("a", "merge_3");
  1267. internal_iter->AddPut("a", "put_1");
  1268. internal_iter->AddMerge("a", "merge_4");
  1269. internal_iter->AddMerge("a", "merge_5");
  1270. internal_iter->AddMerge("a", "merge_6");
  1271. internal_iter->Finish();
  1272. std::unique_ptr<Iterator> db_iter(NewDBIterator(
  1273. env_, ro, cf_options, mutable_cf_options, BytewiseComparator(),
  1274. internal_iter, 2, options.max_sequential_skip_in_iterations,
  1275. nullptr /*read_callback*/));
  1276. db_iter->SeekToLast();
  1277. ASSERT_TRUE(db_iter->Valid());
  1278. ASSERT_EQ(db_iter->key().ToString(), "a");
  1279. ASSERT_EQ(db_iter->value().ToString(), "merge_1,merge_2,merge_3");
  1280. db_iter->Prev();
  1281. ASSERT_TRUE(!db_iter->Valid());
  1282. }
  1283. {
  1284. TestIterator* internal_iter = new TestIterator(BytewiseComparator());
  1285. internal_iter->AddMerge("a", "merge_1");
  1286. internal_iter->AddMerge("a", "merge_2");
  1287. internal_iter->AddMerge("a", "merge_3");
  1288. internal_iter->AddPut("a", "put_1");
  1289. internal_iter->AddMerge("a", "merge_4");
  1290. internal_iter->AddMerge("a", "merge_5");
  1291. internal_iter->AddMerge("a", "merge_6");
  1292. internal_iter->Finish();
  1293. std::unique_ptr<Iterator> db_iter(NewDBIterator(
  1294. env_, ro, cf_options, mutable_cf_options, BytewiseComparator(),
  1295. internal_iter, 3, options.max_sequential_skip_in_iterations,
  1296. nullptr /*read_callback*/));
  1297. db_iter->SeekToLast();
  1298. ASSERT_TRUE(db_iter->Valid());
  1299. ASSERT_EQ(db_iter->key().ToString(), "a");
  1300. ASSERT_EQ(db_iter->value().ToString(), "put_1");
  1301. db_iter->Prev();
  1302. ASSERT_TRUE(!db_iter->Valid());
  1303. }
  1304. {
  1305. TestIterator* internal_iter = new TestIterator(BytewiseComparator());
  1306. internal_iter->AddMerge("a", "merge_1");
  1307. internal_iter->AddMerge("a", "merge_2");
  1308. internal_iter->AddMerge("a", "merge_3");
  1309. internal_iter->AddPut("a", "put_1");
  1310. internal_iter->AddMerge("a", "merge_4");
  1311. internal_iter->AddMerge("a", "merge_5");
  1312. internal_iter->AddMerge("a", "merge_6");
  1313. internal_iter->Finish();
  1314. std::unique_ptr<Iterator> db_iter(NewDBIterator(
  1315. env_, ro, cf_options, mutable_cf_options, BytewiseComparator(),
  1316. internal_iter, 4, options.max_sequential_skip_in_iterations,
  1317. nullptr /*read_callback*/));
  1318. db_iter->SeekToLast();
  1319. ASSERT_TRUE(db_iter->Valid());
  1320. ASSERT_EQ(db_iter->key().ToString(), "a");
  1321. ASSERT_EQ(db_iter->value().ToString(), "put_1,merge_4");
  1322. db_iter->Prev();
  1323. ASSERT_TRUE(!db_iter->Valid());
  1324. }
  1325. {
  1326. TestIterator* internal_iter = new TestIterator(BytewiseComparator());
  1327. internal_iter->AddMerge("a", "merge_1");
  1328. internal_iter->AddMerge("a", "merge_2");
  1329. internal_iter->AddMerge("a", "merge_3");
  1330. internal_iter->AddPut("a", "put_1");
  1331. internal_iter->AddMerge("a", "merge_4");
  1332. internal_iter->AddMerge("a", "merge_5");
  1333. internal_iter->AddMerge("a", "merge_6");
  1334. internal_iter->Finish();
  1335. std::unique_ptr<Iterator> db_iter(NewDBIterator(
  1336. env_, ro, cf_options, mutable_cf_options, BytewiseComparator(),
  1337. internal_iter, 5, options.max_sequential_skip_in_iterations,
  1338. nullptr /*read_callback*/));
  1339. db_iter->SeekToLast();
  1340. ASSERT_TRUE(db_iter->Valid());
  1341. ASSERT_EQ(db_iter->key().ToString(), "a");
  1342. ASSERT_EQ(db_iter->value().ToString(), "put_1,merge_4,merge_5");
  1343. db_iter->Prev();
  1344. ASSERT_TRUE(!db_iter->Valid());
  1345. }
  1346. {
  1347. TestIterator* internal_iter = new TestIterator(BytewiseComparator());
  1348. internal_iter->AddMerge("a", "merge_1");
  1349. internal_iter->AddMerge("a", "merge_2");
  1350. internal_iter->AddMerge("a", "merge_3");
  1351. internal_iter->AddPut("a", "put_1");
  1352. internal_iter->AddMerge("a", "merge_4");
  1353. internal_iter->AddMerge("a", "merge_5");
  1354. internal_iter->AddMerge("a", "merge_6");
  1355. internal_iter->Finish();
  1356. std::unique_ptr<Iterator> db_iter(NewDBIterator(
  1357. env_, ro, cf_options, mutable_cf_options, BytewiseComparator(),
  1358. internal_iter, 6, options.max_sequential_skip_in_iterations,
  1359. nullptr /*read_callback*/));
  1360. db_iter->SeekToLast();
  1361. ASSERT_TRUE(db_iter->Valid());
  1362. ASSERT_EQ(db_iter->key().ToString(), "a");
  1363. ASSERT_EQ(db_iter->value().ToString(), "put_1,merge_4,merge_5,merge_6");
  1364. db_iter->Prev();
  1365. ASSERT_TRUE(!db_iter->Valid());
  1366. }
  1367. {
  1368. // put, singledelete, merge
  1369. TestIterator* internal_iter = new TestIterator(BytewiseComparator());
  1370. internal_iter->AddPut("a", "val_a");
  1371. internal_iter->AddSingleDeletion("a");
  1372. internal_iter->AddMerge("a", "merge_1");
  1373. internal_iter->AddMerge("a", "merge_2");
  1374. internal_iter->AddPut("b", "val_b");
  1375. internal_iter->Finish();
  1376. std::unique_ptr<Iterator> db_iter(NewDBIterator(
  1377. env_, ro, cf_options, mutable_cf_options, BytewiseComparator(),
  1378. internal_iter, 10, options.max_sequential_skip_in_iterations,
  1379. nullptr /*read_callback*/));
  1380. db_iter->Seek("b");
  1381. ASSERT_TRUE(db_iter->Valid());
  1382. ASSERT_EQ(db_iter->key().ToString(), "b");
  1383. db_iter->Prev();
  1384. ASSERT_TRUE(db_iter->Valid());
  1385. ASSERT_EQ(db_iter->key().ToString(), "a");
  1386. }
  1387. }
  1388. TEST_F(DBIteratorTest, DBIterator6) {
  1389. ReadOptions ro;
  1390. Options options;
  1391. options.merge_operator = MergeOperators::CreateFromStringId("stringappend");
  1392. ImmutableCFOptions cf_options = ImmutableCFOptions(options);
  1393. MutableCFOptions mutable_cf_options = MutableCFOptions(options);
  1394. {
  1395. TestIterator* internal_iter = new TestIterator(BytewiseComparator());
  1396. internal_iter->AddMerge("a", "merge_1");
  1397. internal_iter->AddMerge("a", "merge_2");
  1398. internal_iter->AddMerge("a", "merge_3");
  1399. internal_iter->AddDeletion("a");
  1400. internal_iter->AddMerge("a", "merge_4");
  1401. internal_iter->AddMerge("a", "merge_5");
  1402. internal_iter->AddMerge("a", "merge_6");
  1403. internal_iter->Finish();
  1404. std::unique_ptr<Iterator> db_iter(NewDBIterator(
  1405. env_, ro, cf_options, mutable_cf_options, BytewiseComparator(),
  1406. internal_iter, 0, options.max_sequential_skip_in_iterations,
  1407. nullptr /*read_callback*/));
  1408. db_iter->SeekToLast();
  1409. ASSERT_TRUE(db_iter->Valid());
  1410. ASSERT_EQ(db_iter->key().ToString(), "a");
  1411. ASSERT_EQ(db_iter->value().ToString(), "merge_1");
  1412. db_iter->Prev();
  1413. ASSERT_TRUE(!db_iter->Valid());
  1414. }
  1415. {
  1416. TestIterator* internal_iter = new TestIterator(BytewiseComparator());
  1417. internal_iter->AddMerge("a", "merge_1");
  1418. internal_iter->AddMerge("a", "merge_2");
  1419. internal_iter->AddMerge("a", "merge_3");
  1420. internal_iter->AddDeletion("a");
  1421. internal_iter->AddMerge("a", "merge_4");
  1422. internal_iter->AddMerge("a", "merge_5");
  1423. internal_iter->AddMerge("a", "merge_6");
  1424. internal_iter->Finish();
  1425. std::unique_ptr<Iterator> db_iter(NewDBIterator(
  1426. env_, ro, cf_options, mutable_cf_options, BytewiseComparator(),
  1427. internal_iter, 1, options.max_sequential_skip_in_iterations,
  1428. nullptr /*read_callback*/));
  1429. db_iter->SeekToLast();
  1430. ASSERT_TRUE(db_iter->Valid());
  1431. ASSERT_EQ(db_iter->key().ToString(), "a");
  1432. ASSERT_EQ(db_iter->value().ToString(), "merge_1,merge_2");
  1433. db_iter->Prev();
  1434. ASSERT_TRUE(!db_iter->Valid());
  1435. }
  1436. {
  1437. TestIterator* internal_iter = new TestIterator(BytewiseComparator());
  1438. internal_iter->AddMerge("a", "merge_1");
  1439. internal_iter->AddMerge("a", "merge_2");
  1440. internal_iter->AddMerge("a", "merge_3");
  1441. internal_iter->AddDeletion("a");
  1442. internal_iter->AddMerge("a", "merge_4");
  1443. internal_iter->AddMerge("a", "merge_5");
  1444. internal_iter->AddMerge("a", "merge_6");
  1445. internal_iter->Finish();
  1446. std::unique_ptr<Iterator> db_iter(NewDBIterator(
  1447. env_, ro, cf_options, mutable_cf_options, BytewiseComparator(),
  1448. internal_iter, 2, options.max_sequential_skip_in_iterations,
  1449. nullptr /*read_callback*/));
  1450. db_iter->SeekToLast();
  1451. ASSERT_TRUE(db_iter->Valid());
  1452. ASSERT_EQ(db_iter->key().ToString(), "a");
  1453. ASSERT_EQ(db_iter->value().ToString(), "merge_1,merge_2,merge_3");
  1454. db_iter->Prev();
  1455. ASSERT_TRUE(!db_iter->Valid());
  1456. }
  1457. {
  1458. TestIterator* internal_iter = new TestIterator(BytewiseComparator());
  1459. internal_iter->AddMerge("a", "merge_1");
  1460. internal_iter->AddMerge("a", "merge_2");
  1461. internal_iter->AddMerge("a", "merge_3");
  1462. internal_iter->AddDeletion("a");
  1463. internal_iter->AddMerge("a", "merge_4");
  1464. internal_iter->AddMerge("a", "merge_5");
  1465. internal_iter->AddMerge("a", "merge_6");
  1466. internal_iter->Finish();
  1467. std::unique_ptr<Iterator> db_iter(NewDBIterator(
  1468. env_, ro, cf_options, mutable_cf_options, BytewiseComparator(),
  1469. internal_iter, 3, options.max_sequential_skip_in_iterations,
  1470. nullptr /*read_callback*/));
  1471. db_iter->SeekToLast();
  1472. ASSERT_TRUE(!db_iter->Valid());
  1473. }
  1474. {
  1475. TestIterator* internal_iter = new TestIterator(BytewiseComparator());
  1476. internal_iter->AddMerge("a", "merge_1");
  1477. internal_iter->AddMerge("a", "merge_2");
  1478. internal_iter->AddMerge("a", "merge_3");
  1479. internal_iter->AddDeletion("a");
  1480. internal_iter->AddMerge("a", "merge_4");
  1481. internal_iter->AddMerge("a", "merge_5");
  1482. internal_iter->AddMerge("a", "merge_6");
  1483. internal_iter->Finish();
  1484. std::unique_ptr<Iterator> db_iter(NewDBIterator(
  1485. env_, ro, cf_options, mutable_cf_options, BytewiseComparator(),
  1486. internal_iter, 4, options.max_sequential_skip_in_iterations,
  1487. nullptr /*read_callback*/));
  1488. db_iter->SeekToLast();
  1489. ASSERT_TRUE(db_iter->Valid());
  1490. ASSERT_EQ(db_iter->key().ToString(), "a");
  1491. ASSERT_EQ(db_iter->value().ToString(), "merge_4");
  1492. db_iter->Prev();
  1493. ASSERT_TRUE(!db_iter->Valid());
  1494. }
  1495. {
  1496. TestIterator* internal_iter = new TestIterator(BytewiseComparator());
  1497. internal_iter->AddMerge("a", "merge_1");
  1498. internal_iter->AddMerge("a", "merge_2");
  1499. internal_iter->AddMerge("a", "merge_3");
  1500. internal_iter->AddDeletion("a");
  1501. internal_iter->AddMerge("a", "merge_4");
  1502. internal_iter->AddMerge("a", "merge_5");
  1503. internal_iter->AddMerge("a", "merge_6");
  1504. internal_iter->Finish();
  1505. std::unique_ptr<Iterator> db_iter(NewDBIterator(
  1506. env_, ro, cf_options, mutable_cf_options, BytewiseComparator(),
  1507. internal_iter, 5, options.max_sequential_skip_in_iterations,
  1508. nullptr /*read_callback*/));
  1509. db_iter->SeekToLast();
  1510. ASSERT_TRUE(db_iter->Valid());
  1511. ASSERT_EQ(db_iter->key().ToString(), "a");
  1512. ASSERT_EQ(db_iter->value().ToString(), "merge_4,merge_5");
  1513. db_iter->Prev();
  1514. ASSERT_TRUE(!db_iter->Valid());
  1515. }
  1516. {
  1517. TestIterator* internal_iter = new TestIterator(BytewiseComparator());
  1518. internal_iter->AddMerge("a", "merge_1");
  1519. internal_iter->AddMerge("a", "merge_2");
  1520. internal_iter->AddMerge("a", "merge_3");
  1521. internal_iter->AddDeletion("a");
  1522. internal_iter->AddMerge("a", "merge_4");
  1523. internal_iter->AddMerge("a", "merge_5");
  1524. internal_iter->AddMerge("a", "merge_6");
  1525. internal_iter->Finish();
  1526. std::unique_ptr<Iterator> db_iter(NewDBIterator(
  1527. env_, ro, cf_options, mutable_cf_options, BytewiseComparator(),
  1528. internal_iter, 6, options.max_sequential_skip_in_iterations,
  1529. nullptr /*read_callback*/));
  1530. db_iter->SeekToLast();
  1531. ASSERT_TRUE(db_iter->Valid());
  1532. ASSERT_EQ(db_iter->key().ToString(), "a");
  1533. ASSERT_EQ(db_iter->value().ToString(), "merge_4,merge_5,merge_6");
  1534. db_iter->Prev();
  1535. ASSERT_TRUE(!db_iter->Valid());
  1536. }
  1537. }
  1538. TEST_F(DBIteratorTest, DBIterator7) {
  1539. ReadOptions ro;
  1540. Options options;
  1541. options.merge_operator = MergeOperators::CreateFromStringId("stringappend");
  1542. ImmutableCFOptions cf_options = ImmutableCFOptions(options);
  1543. MutableCFOptions mutable_cf_options = MutableCFOptions(options);
  1544. {
  1545. TestIterator* internal_iter = new TestIterator(BytewiseComparator());
  1546. internal_iter->AddMerge("a", "merge_1");
  1547. internal_iter->AddPut("b", "val");
  1548. internal_iter->AddMerge("b", "merge_2");
  1549. internal_iter->AddDeletion("b");
  1550. internal_iter->AddMerge("b", "merge_3");
  1551. internal_iter->AddMerge("c", "merge_4");
  1552. internal_iter->AddMerge("c", "merge_5");
  1553. internal_iter->AddDeletion("b");
  1554. internal_iter->AddMerge("b", "merge_6");
  1555. internal_iter->AddMerge("b", "merge_7");
  1556. internal_iter->AddMerge("b", "merge_8");
  1557. internal_iter->AddMerge("b", "merge_9");
  1558. internal_iter->AddMerge("b", "merge_10");
  1559. internal_iter->AddMerge("b", "merge_11");
  1560. internal_iter->AddDeletion("c");
  1561. internal_iter->Finish();
  1562. std::unique_ptr<Iterator> db_iter(NewDBIterator(
  1563. env_, ro, cf_options, mutable_cf_options, BytewiseComparator(),
  1564. internal_iter, 0, options.max_sequential_skip_in_iterations,
  1565. nullptr /*read_callback*/));
  1566. db_iter->SeekToLast();
  1567. ASSERT_TRUE(db_iter->Valid());
  1568. ASSERT_EQ(db_iter->key().ToString(), "a");
  1569. ASSERT_EQ(db_iter->value().ToString(), "merge_1");
  1570. db_iter->Prev();
  1571. ASSERT_TRUE(!db_iter->Valid());
  1572. }
  1573. {
  1574. TestIterator* internal_iter = new TestIterator(BytewiseComparator());
  1575. internal_iter->AddMerge("a", "merge_1");
  1576. internal_iter->AddPut("b", "val");
  1577. internal_iter->AddMerge("b", "merge_2");
  1578. internal_iter->AddDeletion("b");
  1579. internal_iter->AddMerge("b", "merge_3");
  1580. internal_iter->AddMerge("c", "merge_4");
  1581. internal_iter->AddMerge("c", "merge_5");
  1582. internal_iter->AddDeletion("b");
  1583. internal_iter->AddMerge("b", "merge_6");
  1584. internal_iter->AddMerge("b", "merge_7");
  1585. internal_iter->AddMerge("b", "merge_8");
  1586. internal_iter->AddMerge("b", "merge_9");
  1587. internal_iter->AddMerge("b", "merge_10");
  1588. internal_iter->AddMerge("b", "merge_11");
  1589. internal_iter->AddDeletion("c");
  1590. internal_iter->Finish();
  1591. std::unique_ptr<Iterator> db_iter(NewDBIterator(
  1592. env_, ro, cf_options, mutable_cf_options, BytewiseComparator(),
  1593. internal_iter, 2, options.max_sequential_skip_in_iterations,
  1594. nullptr /*read_callback*/));
  1595. db_iter->SeekToLast();
  1596. ASSERT_TRUE(db_iter->Valid());
  1597. ASSERT_EQ(db_iter->key().ToString(), "b");
  1598. ASSERT_EQ(db_iter->value().ToString(), "val,merge_2");
  1599. db_iter->Prev();
  1600. ASSERT_TRUE(db_iter->Valid());
  1601. ASSERT_EQ(db_iter->key().ToString(), "a");
  1602. ASSERT_EQ(db_iter->value().ToString(), "merge_1");
  1603. db_iter->Prev();
  1604. ASSERT_TRUE(!db_iter->Valid());
  1605. }
  1606. {
  1607. TestIterator* internal_iter = new TestIterator(BytewiseComparator());
  1608. internal_iter->AddMerge("a", "merge_1");
  1609. internal_iter->AddPut("b", "val");
  1610. internal_iter->AddMerge("b", "merge_2");
  1611. internal_iter->AddDeletion("b");
  1612. internal_iter->AddMerge("b", "merge_3");
  1613. internal_iter->AddMerge("c", "merge_4");
  1614. internal_iter->AddMerge("c", "merge_5");
  1615. internal_iter->AddDeletion("b");
  1616. internal_iter->AddMerge("b", "merge_6");
  1617. internal_iter->AddMerge("b", "merge_7");
  1618. internal_iter->AddMerge("b", "merge_8");
  1619. internal_iter->AddMerge("b", "merge_9");
  1620. internal_iter->AddMerge("b", "merge_10");
  1621. internal_iter->AddMerge("b", "merge_11");
  1622. internal_iter->AddDeletion("c");
  1623. internal_iter->Finish();
  1624. std::unique_ptr<Iterator> db_iter(NewDBIterator(
  1625. env_, ro, cf_options, mutable_cf_options, BytewiseComparator(),
  1626. internal_iter, 4, options.max_sequential_skip_in_iterations,
  1627. nullptr /*read_callback*/));
  1628. db_iter->SeekToLast();
  1629. ASSERT_TRUE(db_iter->Valid());
  1630. ASSERT_EQ(db_iter->key().ToString(), "b");
  1631. ASSERT_EQ(db_iter->value().ToString(), "merge_3");
  1632. db_iter->Prev();
  1633. ASSERT_TRUE(db_iter->Valid());
  1634. ASSERT_EQ(db_iter->key().ToString(), "a");
  1635. ASSERT_EQ(db_iter->value().ToString(), "merge_1");
  1636. db_iter->Prev();
  1637. ASSERT_TRUE(!db_iter->Valid());
  1638. }
  1639. {
  1640. TestIterator* internal_iter = new TestIterator(BytewiseComparator());
  1641. internal_iter->AddMerge("a", "merge_1");
  1642. internal_iter->AddPut("b", "val");
  1643. internal_iter->AddMerge("b", "merge_2");
  1644. internal_iter->AddDeletion("b");
  1645. internal_iter->AddMerge("b", "merge_3");
  1646. internal_iter->AddMerge("c", "merge_4");
  1647. internal_iter->AddMerge("c", "merge_5");
  1648. internal_iter->AddDeletion("b");
  1649. internal_iter->AddMerge("b", "merge_6");
  1650. internal_iter->AddMerge("b", "merge_7");
  1651. internal_iter->AddMerge("b", "merge_8");
  1652. internal_iter->AddMerge("b", "merge_9");
  1653. internal_iter->AddMerge("b", "merge_10");
  1654. internal_iter->AddMerge("b", "merge_11");
  1655. internal_iter->AddDeletion("c");
  1656. internal_iter->Finish();
  1657. std::unique_ptr<Iterator> db_iter(NewDBIterator(
  1658. env_, ro, cf_options, mutable_cf_options, BytewiseComparator(),
  1659. internal_iter, 5, options.max_sequential_skip_in_iterations,
  1660. nullptr /*read_callback*/));
  1661. db_iter->SeekToLast();
  1662. ASSERT_TRUE(db_iter->Valid());
  1663. ASSERT_EQ(db_iter->key().ToString(), "c");
  1664. ASSERT_EQ(db_iter->value().ToString(), "merge_4");
  1665. db_iter->Prev();
  1666. ASSERT_TRUE(db_iter->Valid());
  1667. ASSERT_EQ(db_iter->key().ToString(), "b");
  1668. ASSERT_EQ(db_iter->value().ToString(), "merge_3");
  1669. db_iter->Prev();
  1670. ASSERT_TRUE(db_iter->Valid());
  1671. ASSERT_EQ(db_iter->key().ToString(), "a");
  1672. ASSERT_EQ(db_iter->value().ToString(), "merge_1");
  1673. db_iter->Prev();
  1674. ASSERT_TRUE(!db_iter->Valid());
  1675. }
  1676. {
  1677. TestIterator* internal_iter = new TestIterator(BytewiseComparator());
  1678. internal_iter->AddMerge("a", "merge_1");
  1679. internal_iter->AddPut("b", "val");
  1680. internal_iter->AddMerge("b", "merge_2");
  1681. internal_iter->AddDeletion("b");
  1682. internal_iter->AddMerge("b", "merge_3");
  1683. internal_iter->AddMerge("c", "merge_4");
  1684. internal_iter->AddMerge("c", "merge_5");
  1685. internal_iter->AddDeletion("b");
  1686. internal_iter->AddMerge("b", "merge_6");
  1687. internal_iter->AddMerge("b", "merge_7");
  1688. internal_iter->AddMerge("b", "merge_8");
  1689. internal_iter->AddMerge("b", "merge_9");
  1690. internal_iter->AddMerge("b", "merge_10");
  1691. internal_iter->AddMerge("b", "merge_11");
  1692. internal_iter->AddDeletion("c");
  1693. internal_iter->Finish();
  1694. std::unique_ptr<Iterator> db_iter(NewDBIterator(
  1695. env_, ro, cf_options, mutable_cf_options, BytewiseComparator(),
  1696. internal_iter, 6, options.max_sequential_skip_in_iterations,
  1697. nullptr /*read_callback*/));
  1698. db_iter->SeekToLast();
  1699. ASSERT_TRUE(db_iter->Valid());
  1700. ASSERT_EQ(db_iter->key().ToString(), "c");
  1701. ASSERT_EQ(db_iter->value().ToString(), "merge_4,merge_5");
  1702. db_iter->Prev();
  1703. ASSERT_TRUE(db_iter->Valid());
  1704. ASSERT_TRUE(db_iter->Valid());
  1705. ASSERT_EQ(db_iter->key().ToString(), "b");
  1706. ASSERT_EQ(db_iter->value().ToString(), "merge_3");
  1707. db_iter->Prev();
  1708. ASSERT_TRUE(db_iter->Valid());
  1709. ASSERT_EQ(db_iter->key().ToString(), "a");
  1710. ASSERT_EQ(db_iter->value().ToString(), "merge_1");
  1711. db_iter->Prev();
  1712. ASSERT_TRUE(!db_iter->Valid());
  1713. }
  1714. {
  1715. TestIterator* internal_iter = new TestIterator(BytewiseComparator());
  1716. internal_iter->AddMerge("a", "merge_1");
  1717. internal_iter->AddPut("b", "val");
  1718. internal_iter->AddMerge("b", "merge_2");
  1719. internal_iter->AddDeletion("b");
  1720. internal_iter->AddMerge("b", "merge_3");
  1721. internal_iter->AddMerge("c", "merge_4");
  1722. internal_iter->AddMerge("c", "merge_5");
  1723. internal_iter->AddDeletion("b");
  1724. internal_iter->AddMerge("b", "merge_6");
  1725. internal_iter->AddMerge("b", "merge_7");
  1726. internal_iter->AddMerge("b", "merge_8");
  1727. internal_iter->AddMerge("b", "merge_9");
  1728. internal_iter->AddMerge("b", "merge_10");
  1729. internal_iter->AddMerge("b", "merge_11");
  1730. internal_iter->AddDeletion("c");
  1731. internal_iter->Finish();
  1732. std::unique_ptr<Iterator> db_iter(NewDBIterator(
  1733. env_, ro, cf_options, mutable_cf_options, BytewiseComparator(),
  1734. internal_iter, 7, options.max_sequential_skip_in_iterations,
  1735. nullptr /*read_callback*/));
  1736. db_iter->SeekToLast();
  1737. ASSERT_TRUE(db_iter->Valid());
  1738. ASSERT_EQ(db_iter->key().ToString(), "c");
  1739. ASSERT_EQ(db_iter->value().ToString(), "merge_4,merge_5");
  1740. db_iter->Prev();
  1741. ASSERT_TRUE(db_iter->Valid());
  1742. ASSERT_EQ(db_iter->key().ToString(), "a");
  1743. ASSERT_EQ(db_iter->value().ToString(), "merge_1");
  1744. db_iter->Prev();
  1745. ASSERT_TRUE(!db_iter->Valid());
  1746. }
  1747. {
  1748. TestIterator* internal_iter = new TestIterator(BytewiseComparator());
  1749. internal_iter->AddMerge("a", "merge_1");
  1750. internal_iter->AddPut("b", "val");
  1751. internal_iter->AddMerge("b", "merge_2");
  1752. internal_iter->AddDeletion("b");
  1753. internal_iter->AddMerge("b", "merge_3");
  1754. internal_iter->AddMerge("c", "merge_4");
  1755. internal_iter->AddMerge("c", "merge_5");
  1756. internal_iter->AddDeletion("b");
  1757. internal_iter->AddMerge("b", "merge_6");
  1758. internal_iter->AddMerge("b", "merge_7");
  1759. internal_iter->AddMerge("b", "merge_8");
  1760. internal_iter->AddMerge("b", "merge_9");
  1761. internal_iter->AddMerge("b", "merge_10");
  1762. internal_iter->AddMerge("b", "merge_11");
  1763. internal_iter->AddDeletion("c");
  1764. internal_iter->Finish();
  1765. std::unique_ptr<Iterator> db_iter(NewDBIterator(
  1766. env_, ro, cf_options, mutable_cf_options, BytewiseComparator(),
  1767. internal_iter, 9, options.max_sequential_skip_in_iterations,
  1768. nullptr /*read_callback*/));
  1769. db_iter->SeekToLast();
  1770. ASSERT_TRUE(db_iter->Valid());
  1771. ASSERT_EQ(db_iter->key().ToString(), "c");
  1772. ASSERT_EQ(db_iter->value().ToString(), "merge_4,merge_5");
  1773. db_iter->Prev();
  1774. ASSERT_TRUE(db_iter->Valid());
  1775. ASSERT_TRUE(db_iter->Valid());
  1776. ASSERT_EQ(db_iter->key().ToString(), "b");
  1777. ASSERT_EQ(db_iter->value().ToString(), "merge_6,merge_7");
  1778. db_iter->Prev();
  1779. ASSERT_TRUE(db_iter->Valid());
  1780. ASSERT_EQ(db_iter->key().ToString(), "a");
  1781. ASSERT_EQ(db_iter->value().ToString(), "merge_1");
  1782. db_iter->Prev();
  1783. ASSERT_TRUE(!db_iter->Valid());
  1784. }
  1785. {
  1786. TestIterator* internal_iter = new TestIterator(BytewiseComparator());
  1787. internal_iter->AddMerge("a", "merge_1");
  1788. internal_iter->AddPut("b", "val");
  1789. internal_iter->AddMerge("b", "merge_2");
  1790. internal_iter->AddDeletion("b");
  1791. internal_iter->AddMerge("b", "merge_3");
  1792. internal_iter->AddMerge("c", "merge_4");
  1793. internal_iter->AddMerge("c", "merge_5");
  1794. internal_iter->AddDeletion("b");
  1795. internal_iter->AddMerge("b", "merge_6");
  1796. internal_iter->AddMerge("b", "merge_7");
  1797. internal_iter->AddMerge("b", "merge_8");
  1798. internal_iter->AddMerge("b", "merge_9");
  1799. internal_iter->AddMerge("b", "merge_10");
  1800. internal_iter->AddMerge("b", "merge_11");
  1801. internal_iter->AddDeletion("c");
  1802. internal_iter->Finish();
  1803. std::unique_ptr<Iterator> db_iter(NewDBIterator(
  1804. env_, ro, cf_options, mutable_cf_options, BytewiseComparator(),
  1805. internal_iter, 13, options.max_sequential_skip_in_iterations,
  1806. nullptr /*read_callback*/));
  1807. db_iter->SeekToLast();
  1808. ASSERT_TRUE(db_iter->Valid());
  1809. ASSERT_EQ(db_iter->key().ToString(), "c");
  1810. ASSERT_EQ(db_iter->value().ToString(), "merge_4,merge_5");
  1811. db_iter->Prev();
  1812. ASSERT_TRUE(db_iter->Valid());
  1813. ASSERT_TRUE(db_iter->Valid());
  1814. ASSERT_EQ(db_iter->key().ToString(), "b");
  1815. ASSERT_EQ(db_iter->value().ToString(),
  1816. "merge_6,merge_7,merge_8,merge_9,merge_10,merge_11");
  1817. db_iter->Prev();
  1818. ASSERT_TRUE(db_iter->Valid());
  1819. ASSERT_EQ(db_iter->key().ToString(), "a");
  1820. ASSERT_EQ(db_iter->value().ToString(), "merge_1");
  1821. db_iter->Prev();
  1822. ASSERT_TRUE(!db_iter->Valid());
  1823. }
  1824. {
  1825. TestIterator* internal_iter = new TestIterator(BytewiseComparator());
  1826. internal_iter->AddMerge("a", "merge_1");
  1827. internal_iter->AddPut("b", "val");
  1828. internal_iter->AddMerge("b", "merge_2");
  1829. internal_iter->AddDeletion("b");
  1830. internal_iter->AddMerge("b", "merge_3");
  1831. internal_iter->AddMerge("c", "merge_4");
  1832. internal_iter->AddMerge("c", "merge_5");
  1833. internal_iter->AddDeletion("b");
  1834. internal_iter->AddMerge("b", "merge_6");
  1835. internal_iter->AddMerge("b", "merge_7");
  1836. internal_iter->AddMerge("b", "merge_8");
  1837. internal_iter->AddMerge("b", "merge_9");
  1838. internal_iter->AddMerge("b", "merge_10");
  1839. internal_iter->AddMerge("b", "merge_11");
  1840. internal_iter->AddDeletion("c");
  1841. internal_iter->Finish();
  1842. std::unique_ptr<Iterator> db_iter(NewDBIterator(
  1843. env_, ro, cf_options, mutable_cf_options, BytewiseComparator(),
  1844. internal_iter, 14, options.max_sequential_skip_in_iterations,
  1845. nullptr /*read_callback*/));
  1846. db_iter->SeekToLast();
  1847. ASSERT_TRUE(db_iter->Valid());
  1848. ASSERT_EQ(db_iter->key().ToString(), "b");
  1849. ASSERT_EQ(db_iter->value().ToString(),
  1850. "merge_6,merge_7,merge_8,merge_9,merge_10,merge_11");
  1851. db_iter->Prev();
  1852. ASSERT_TRUE(db_iter->Valid());
  1853. ASSERT_EQ(db_iter->key().ToString(), "a");
  1854. ASSERT_EQ(db_iter->value().ToString(), "merge_1");
  1855. db_iter->Prev();
  1856. ASSERT_TRUE(!db_iter->Valid());
  1857. }
  1858. }
  1859. TEST_F(DBIteratorTest, DBIterator8) {
  1860. ReadOptions ro;
  1861. Options options;
  1862. options.merge_operator = MergeOperators::CreateFromStringId("stringappend");
  1863. TestIterator* internal_iter = new TestIterator(BytewiseComparator());
  1864. internal_iter->AddDeletion("a");
  1865. internal_iter->AddPut("a", "0");
  1866. internal_iter->AddPut("b", "0");
  1867. internal_iter->Finish();
  1868. std::unique_ptr<Iterator> db_iter(NewDBIterator(
  1869. env_, ro, ImmutableCFOptions(options), MutableCFOptions(options),
  1870. BytewiseComparator(), internal_iter, 10,
  1871. options.max_sequential_skip_in_iterations, nullptr /*read_callback*/));
  1872. db_iter->SeekToLast();
  1873. ASSERT_TRUE(db_iter->Valid());
  1874. ASSERT_EQ(db_iter->key().ToString(), "b");
  1875. ASSERT_EQ(db_iter->value().ToString(), "0");
  1876. db_iter->Prev();
  1877. ASSERT_TRUE(db_iter->Valid());
  1878. ASSERT_EQ(db_iter->key().ToString(), "a");
  1879. ASSERT_EQ(db_iter->value().ToString(), "0");
  1880. }
  1881. // TODO(3.13): fix the issue of Seek() then Prev() which might not necessary
  1882. // return the biggest element smaller than the seek key.
  1883. TEST_F(DBIteratorTest, DBIterator9) {
  1884. ReadOptions ro;
  1885. Options options;
  1886. options.merge_operator = MergeOperators::CreateFromStringId("stringappend");
  1887. {
  1888. TestIterator* internal_iter = new TestIterator(BytewiseComparator());
  1889. internal_iter->AddMerge("a", "merge_1");
  1890. internal_iter->AddMerge("a", "merge_2");
  1891. internal_iter->AddMerge("b", "merge_3");
  1892. internal_iter->AddMerge("b", "merge_4");
  1893. internal_iter->AddMerge("d", "merge_5");
  1894. internal_iter->AddMerge("d", "merge_6");
  1895. internal_iter->Finish();
  1896. std::unique_ptr<Iterator> db_iter(NewDBIterator(
  1897. env_, ro, ImmutableCFOptions(options), MutableCFOptions(options),
  1898. BytewiseComparator(), internal_iter, 10,
  1899. options.max_sequential_skip_in_iterations, nullptr /*read_callback*/));
  1900. db_iter->SeekToLast();
  1901. ASSERT_TRUE(db_iter->Valid());
  1902. db_iter->Prev();
  1903. ASSERT_TRUE(db_iter->Valid());
  1904. ASSERT_EQ(db_iter->key().ToString(), "b");
  1905. ASSERT_EQ(db_iter->value().ToString(), "merge_3,merge_4");
  1906. db_iter->Next();
  1907. ASSERT_TRUE(db_iter->Valid());
  1908. ASSERT_EQ(db_iter->key().ToString(), "d");
  1909. ASSERT_EQ(db_iter->value().ToString(), "merge_5,merge_6");
  1910. db_iter->Seek("b");
  1911. ASSERT_TRUE(db_iter->Valid());
  1912. ASSERT_EQ(db_iter->key().ToString(), "b");
  1913. ASSERT_EQ(db_iter->value().ToString(), "merge_3,merge_4");
  1914. db_iter->Prev();
  1915. ASSERT_TRUE(db_iter->Valid());
  1916. ASSERT_EQ(db_iter->key().ToString(), "a");
  1917. ASSERT_EQ(db_iter->value().ToString(), "merge_1,merge_2");
  1918. db_iter->SeekForPrev("b");
  1919. ASSERT_TRUE(db_iter->Valid());
  1920. ASSERT_EQ(db_iter->key().ToString(), "b");
  1921. ASSERT_EQ(db_iter->value().ToString(), "merge_3,merge_4");
  1922. db_iter->Next();
  1923. ASSERT_TRUE(db_iter->Valid());
  1924. ASSERT_EQ(db_iter->key().ToString(), "d");
  1925. ASSERT_EQ(db_iter->value().ToString(), "merge_5,merge_6");
  1926. db_iter->Seek("c");
  1927. ASSERT_TRUE(db_iter->Valid());
  1928. ASSERT_EQ(db_iter->key().ToString(), "d");
  1929. ASSERT_EQ(db_iter->value().ToString(), "merge_5,merge_6");
  1930. db_iter->Prev();
  1931. ASSERT_TRUE(db_iter->Valid());
  1932. ASSERT_EQ(db_iter->key().ToString(), "b");
  1933. ASSERT_EQ(db_iter->value().ToString(), "merge_3,merge_4");
  1934. db_iter->SeekForPrev("c");
  1935. ASSERT_TRUE(db_iter->Valid());
  1936. ASSERT_EQ(db_iter->key().ToString(), "b");
  1937. ASSERT_EQ(db_iter->value().ToString(), "merge_3,merge_4");
  1938. db_iter->Next();
  1939. ASSERT_TRUE(db_iter->Valid());
  1940. ASSERT_EQ(db_iter->key().ToString(), "d");
  1941. ASSERT_EQ(db_iter->value().ToString(), "merge_5,merge_6");
  1942. }
  1943. }
  1944. // TODO(3.13): fix the issue of Seek() then Prev() which might not necessary
  1945. // return the biggest element smaller than the seek key.
  1946. TEST_F(DBIteratorTest, DBIterator10) {
  1947. ReadOptions ro;
  1948. Options options;
  1949. TestIterator* internal_iter = new TestIterator(BytewiseComparator());
  1950. internal_iter->AddPut("a", "1");
  1951. internal_iter->AddPut("b", "2");
  1952. internal_iter->AddPut("c", "3");
  1953. internal_iter->AddPut("d", "4");
  1954. internal_iter->Finish();
  1955. std::unique_ptr<Iterator> db_iter(NewDBIterator(
  1956. env_, ro, ImmutableCFOptions(options), MutableCFOptions(options),
  1957. BytewiseComparator(), internal_iter, 10,
  1958. options.max_sequential_skip_in_iterations, nullptr /*read_callback*/));
  1959. db_iter->Seek("c");
  1960. ASSERT_TRUE(db_iter->Valid());
  1961. db_iter->Prev();
  1962. ASSERT_TRUE(db_iter->Valid());
  1963. ASSERT_EQ(db_iter->key().ToString(), "b");
  1964. ASSERT_EQ(db_iter->value().ToString(), "2");
  1965. db_iter->Next();
  1966. ASSERT_TRUE(db_iter->Valid());
  1967. ASSERT_EQ(db_iter->key().ToString(), "c");
  1968. ASSERT_EQ(db_iter->value().ToString(), "3");
  1969. db_iter->SeekForPrev("c");
  1970. ASSERT_TRUE(db_iter->Valid());
  1971. db_iter->Next();
  1972. ASSERT_TRUE(db_iter->Valid());
  1973. ASSERT_EQ(db_iter->key().ToString(), "d");
  1974. ASSERT_EQ(db_iter->value().ToString(), "4");
  1975. db_iter->Prev();
  1976. ASSERT_TRUE(db_iter->Valid());
  1977. ASSERT_EQ(db_iter->key().ToString(), "c");
  1978. ASSERT_EQ(db_iter->value().ToString(), "3");
  1979. }
  1980. TEST_F(DBIteratorTest, SeekToLastOccurrenceSeq0) {
  1981. ReadOptions ro;
  1982. Options options;
  1983. options.merge_operator = nullptr;
  1984. TestIterator* internal_iter = new TestIterator(BytewiseComparator());
  1985. internal_iter->AddPut("a", "1");
  1986. internal_iter->AddPut("b", "2");
  1987. internal_iter->Finish();
  1988. std::unique_ptr<Iterator> db_iter(NewDBIterator(
  1989. env_, ro, ImmutableCFOptions(options), MutableCFOptions(options),
  1990. BytewiseComparator(), internal_iter, 10, 0 /* force seek */,
  1991. nullptr /*read_callback*/));
  1992. db_iter->SeekToFirst();
  1993. ASSERT_TRUE(db_iter->Valid());
  1994. ASSERT_EQ(db_iter->key().ToString(), "a");
  1995. ASSERT_EQ(db_iter->value().ToString(), "1");
  1996. db_iter->Next();
  1997. ASSERT_TRUE(db_iter->Valid());
  1998. ASSERT_EQ(db_iter->key().ToString(), "b");
  1999. ASSERT_EQ(db_iter->value().ToString(), "2");
  2000. db_iter->Next();
  2001. ASSERT_FALSE(db_iter->Valid());
  2002. }
  2003. TEST_F(DBIteratorTest, DBIterator11) {
  2004. ReadOptions ro;
  2005. Options options;
  2006. options.merge_operator = MergeOperators::CreateFromStringId("stringappend");
  2007. TestIterator* internal_iter = new TestIterator(BytewiseComparator());
  2008. internal_iter->AddPut("a", "0");
  2009. internal_iter->AddPut("b", "0");
  2010. internal_iter->AddSingleDeletion("b");
  2011. internal_iter->AddMerge("a", "1");
  2012. internal_iter->AddMerge("b", "2");
  2013. internal_iter->Finish();
  2014. std::unique_ptr<Iterator> db_iter(NewDBIterator(
  2015. env_, ro, ImmutableCFOptions(options), MutableCFOptions(options),
  2016. BytewiseComparator(), internal_iter, 1,
  2017. options.max_sequential_skip_in_iterations, nullptr /*read_callback*/));
  2018. db_iter->SeekToFirst();
  2019. ASSERT_TRUE(db_iter->Valid());
  2020. ASSERT_EQ(db_iter->key().ToString(), "a");
  2021. ASSERT_EQ(db_iter->value().ToString(), "0");
  2022. db_iter->Next();
  2023. ASSERT_TRUE(db_iter->Valid());
  2024. ASSERT_EQ(db_iter->key().ToString(), "b");
  2025. db_iter->Next();
  2026. ASSERT_FALSE(db_iter->Valid());
  2027. }
  2028. TEST_F(DBIteratorTest, DBIterator12) {
  2029. ReadOptions ro;
  2030. Options options;
  2031. options.merge_operator = nullptr;
  2032. TestIterator* internal_iter = new TestIterator(BytewiseComparator());
  2033. internal_iter->AddPut("a", "1");
  2034. internal_iter->AddPut("b", "2");
  2035. internal_iter->AddPut("c", "3");
  2036. internal_iter->AddSingleDeletion("b");
  2037. internal_iter->Finish();
  2038. std::unique_ptr<Iterator> db_iter(NewDBIterator(
  2039. env_, ro, ImmutableCFOptions(options), MutableCFOptions(options),
  2040. BytewiseComparator(), internal_iter, 10, 0, nullptr /*read_callback*/));
  2041. db_iter->SeekToLast();
  2042. ASSERT_TRUE(db_iter->Valid());
  2043. ASSERT_EQ(db_iter->key().ToString(), "c");
  2044. ASSERT_EQ(db_iter->value().ToString(), "3");
  2045. db_iter->Prev();
  2046. ASSERT_TRUE(db_iter->Valid());
  2047. ASSERT_EQ(db_iter->key().ToString(), "a");
  2048. ASSERT_EQ(db_iter->value().ToString(), "1");
  2049. db_iter->Prev();
  2050. ASSERT_FALSE(db_iter->Valid());
  2051. }
  2052. TEST_F(DBIteratorTest, DBIterator13) {
  2053. ReadOptions ro;
  2054. Options options;
  2055. options.merge_operator = nullptr;
  2056. std::string key;
  2057. key.resize(9);
  2058. key.assign(9, static_cast<char>(0));
  2059. key[0] = 'b';
  2060. TestIterator* internal_iter = new TestIterator(BytewiseComparator());
  2061. internal_iter->AddPut(key, "0");
  2062. internal_iter->AddPut(key, "1");
  2063. internal_iter->AddPut(key, "2");
  2064. internal_iter->AddPut(key, "3");
  2065. internal_iter->AddPut(key, "4");
  2066. internal_iter->AddPut(key, "5");
  2067. internal_iter->AddPut(key, "6");
  2068. internal_iter->AddPut(key, "7");
  2069. internal_iter->AddPut(key, "8");
  2070. internal_iter->Finish();
  2071. std::unique_ptr<Iterator> db_iter(NewDBIterator(
  2072. env_, ro, ImmutableCFOptions(options), MutableCFOptions(options),
  2073. BytewiseComparator(), internal_iter, 2, 3, nullptr /*read_callback*/));
  2074. db_iter->Seek("b");
  2075. ASSERT_TRUE(db_iter->Valid());
  2076. ASSERT_EQ(db_iter->key().ToString(), key);
  2077. ASSERT_EQ(db_iter->value().ToString(), "2");
  2078. }
  2079. TEST_F(DBIteratorTest, DBIterator14) {
  2080. ReadOptions ro;
  2081. Options options;
  2082. options.merge_operator = nullptr;
  2083. std::string key("b");
  2084. TestIterator* internal_iter = new TestIterator(BytewiseComparator());
  2085. internal_iter->AddPut("b", "0");
  2086. internal_iter->AddPut("b", "1");
  2087. internal_iter->AddPut("b", "2");
  2088. internal_iter->AddPut("b", "3");
  2089. internal_iter->AddPut("a", "4");
  2090. internal_iter->AddPut("a", "5");
  2091. internal_iter->AddPut("a", "6");
  2092. internal_iter->AddPut("c", "7");
  2093. internal_iter->AddPut("c", "8");
  2094. internal_iter->AddPut("c", "9");
  2095. internal_iter->Finish();
  2096. std::unique_ptr<Iterator> db_iter(NewDBIterator(
  2097. env_, ro, ImmutableCFOptions(options), MutableCFOptions(options),
  2098. BytewiseComparator(), internal_iter, 4, 1, nullptr /*read_callback*/));
  2099. db_iter->Seek("b");
  2100. ASSERT_TRUE(db_iter->Valid());
  2101. ASSERT_EQ(db_iter->key().ToString(), "b");
  2102. ASSERT_EQ(db_iter->value().ToString(), "3");
  2103. db_iter->SeekToFirst();
  2104. ASSERT_EQ(db_iter->key().ToString(), "a");
  2105. ASSERT_EQ(db_iter->value().ToString(), "4");
  2106. }
  2107. TEST_F(DBIteratorTest, DBIteratorTestDifferentialSnapshots) {
  2108. { // test that KVs earlier that iter_start_seqnum are filtered out
  2109. ReadOptions ro;
  2110. ro.iter_start_seqnum=5;
  2111. Options options;
  2112. options.statistics = ROCKSDB_NAMESPACE::CreateDBStatistics();
  2113. TestIterator* internal_iter = new TestIterator(BytewiseComparator());
  2114. for (size_t i = 0; i < 10; ++i) {
  2115. internal_iter->AddPut(std::to_string(i), std::to_string(i) + "a");
  2116. internal_iter->AddPut(std::to_string(i), std::to_string(i) + "b");
  2117. internal_iter->AddPut(std::to_string(i), std::to_string(i) + "c");
  2118. }
  2119. internal_iter->Finish();
  2120. std::unique_ptr<Iterator> db_iter(NewDBIterator(
  2121. env_, ro, ImmutableCFOptions(options), MutableCFOptions(options),
  2122. BytewiseComparator(), internal_iter, 13,
  2123. options.max_sequential_skip_in_iterations, nullptr));
  2124. // Expecting InternalKeys in [5,8] range with correct type
  2125. int seqnums[4] = {5,8,11,13};
  2126. std::string user_keys[4] = {"1","2","3","4"};
  2127. std::string values[4] = {"1c", "2c", "3c", "4b"};
  2128. int i = 0;
  2129. for (db_iter->SeekToFirst(); db_iter->Valid(); db_iter->Next()) {
  2130. FullKey fkey;
  2131. ParseFullKey(db_iter->key(), &fkey);
  2132. ASSERT_EQ(user_keys[i], fkey.user_key.ToString());
  2133. ASSERT_EQ(EntryType::kEntryPut, fkey.type);
  2134. ASSERT_EQ(seqnums[i], fkey.sequence);
  2135. ASSERT_EQ(values[i], db_iter->value().ToString());
  2136. i++;
  2137. }
  2138. ASSERT_EQ(i, 4);
  2139. }
  2140. { // Test that deletes are returned correctly as internal KVs
  2141. ReadOptions ro;
  2142. ro.iter_start_seqnum=5;
  2143. Options options;
  2144. options.statistics = ROCKSDB_NAMESPACE::CreateDBStatistics();
  2145. TestIterator* internal_iter = new TestIterator(BytewiseComparator());
  2146. for (size_t i = 0; i < 10; ++i) {
  2147. internal_iter->AddPut(std::to_string(i), std::to_string(i) + "a");
  2148. internal_iter->AddPut(std::to_string(i), std::to_string(i) + "b");
  2149. internal_iter->AddDeletion(std::to_string(i));
  2150. }
  2151. internal_iter->Finish();
  2152. std::unique_ptr<Iterator> db_iter(NewDBIterator(
  2153. env_, ro, ImmutableCFOptions(options), MutableCFOptions(options),
  2154. BytewiseComparator(), internal_iter, 13,
  2155. options.max_sequential_skip_in_iterations, nullptr));
  2156. // Expecting InternalKeys in [5,8] range with correct type
  2157. int seqnums[4] = {5,8,11,13};
  2158. EntryType key_types[4] = {EntryType::kEntryDelete,EntryType::kEntryDelete,
  2159. EntryType::kEntryDelete,EntryType::kEntryPut};
  2160. std::string user_keys[4] = {"1","2","3","4"};
  2161. std::string values[4] = {"", "", "", "4b"};
  2162. int i = 0;
  2163. for (db_iter->SeekToFirst(); db_iter->Valid(); db_iter->Next()) {
  2164. FullKey fkey;
  2165. ParseFullKey(db_iter->key(), &fkey);
  2166. ASSERT_EQ(user_keys[i], fkey.user_key.ToString());
  2167. ASSERT_EQ(key_types[i], fkey.type);
  2168. ASSERT_EQ(seqnums[i], fkey.sequence);
  2169. ASSERT_EQ(values[i], db_iter->value().ToString());
  2170. i++;
  2171. }
  2172. ASSERT_EQ(i, 4);
  2173. }
  2174. }
  2175. class DBIterWithMergeIterTest : public testing::Test {
  2176. public:
  2177. DBIterWithMergeIterTest()
  2178. : env_(Env::Default()), icomp_(BytewiseComparator()) {
  2179. options_.merge_operator = nullptr;
  2180. internal_iter1_ = new TestIterator(BytewiseComparator());
  2181. internal_iter1_->Add("a", kTypeValue, "1", 3u);
  2182. internal_iter1_->Add("f", kTypeValue, "2", 5u);
  2183. internal_iter1_->Add("g", kTypeValue, "3", 7u);
  2184. internal_iter1_->Finish();
  2185. internal_iter2_ = new TestIterator(BytewiseComparator());
  2186. internal_iter2_->Add("a", kTypeValue, "4", 6u);
  2187. internal_iter2_->Add("b", kTypeValue, "5", 1u);
  2188. internal_iter2_->Add("c", kTypeValue, "6", 2u);
  2189. internal_iter2_->Add("d", kTypeValue, "7", 3u);
  2190. internal_iter2_->Finish();
  2191. std::vector<InternalIterator*> child_iters;
  2192. child_iters.push_back(internal_iter1_);
  2193. child_iters.push_back(internal_iter2_);
  2194. InternalKeyComparator icomp(BytewiseComparator());
  2195. merge_iter =
  2196. NewMergingIterator(&icomp_, &child_iters[0], 2u);
  2197. db_iter_.reset(NewDBIterator(
  2198. env_, ro_, ImmutableCFOptions(options_), MutableCFOptions(options_),
  2199. BytewiseComparator(), merge_iter,
  2200. 8 /* read data earlier than seqId 8 */,
  2201. 3 /* max iterators before reseek */, nullptr /*read_callback*/));
  2202. }
  2203. Env* env_;
  2204. ReadOptions ro_;
  2205. Options options_;
  2206. TestIterator* internal_iter1_;
  2207. TestIterator* internal_iter2_;
  2208. InternalKeyComparator icomp_;
  2209. Iterator* merge_iter_;
  2210. InternalIterator* merge_iter;
  2211. std::unique_ptr<Iterator> db_iter_;
  2212. };
  2213. #include <iostream>
  2214. TEST_F(DBIterWithMergeIterTest, InnerMergeIterator1) {
  2215. merge_iter->SeekToFirst();
  2216. std::cout<<" merge_iter key value :" << std::endl;
  2217. while(merge_iter->Valid()) {
  2218. std::cout<< merge_iter->key().ToString() << " " << merge_iter->value().ToString() <<std::endl;
  2219. merge_iter->Next();
  2220. }
  2221. db_iter_->SeekToFirst();
  2222. ASSERT_TRUE(db_iter_->Valid());
  2223. ASSERT_EQ(db_iter_->key().ToString(), "a");
  2224. ASSERT_EQ(db_iter_->value().ToString(), "4");
  2225. db_iter_->Next();
  2226. ASSERT_TRUE(db_iter_->Valid());
  2227. ASSERT_EQ(db_iter_->key().ToString(), "b");
  2228. ASSERT_EQ(db_iter_->value().ToString(), "5");
  2229. db_iter_->Next();
  2230. ASSERT_TRUE(db_iter_->Valid());
  2231. ASSERT_EQ(db_iter_->key().ToString(), "c");
  2232. ASSERT_EQ(db_iter_->value().ToString(), "6");
  2233. db_iter_->Next();
  2234. ASSERT_TRUE(db_iter_->Valid());
  2235. ASSERT_EQ(db_iter_->key().ToString(), "d");
  2236. ASSERT_EQ(db_iter_->value().ToString(), "7");
  2237. db_iter_->Next();
  2238. ASSERT_TRUE(db_iter_->Valid());
  2239. ASSERT_EQ(db_iter_->key().ToString(), "f");
  2240. ASSERT_EQ(db_iter_->value().ToString(), "2");
  2241. db_iter_->Next();
  2242. ASSERT_TRUE(db_iter_->Valid());
  2243. ASSERT_EQ(db_iter_->key().ToString(), "g");
  2244. ASSERT_EQ(db_iter_->value().ToString(), "3");
  2245. db_iter_->Next();
  2246. ASSERT_FALSE(db_iter_->Valid());
  2247. }
  2248. TEST_F(DBIterWithMergeIterTest, InnerMergeIterator2) {
  2249. // Test Prev() when one child iterator is at its end.
  2250. db_iter_->SeekForPrev("g");
  2251. ASSERT_TRUE(db_iter_->Valid());
  2252. ASSERT_EQ(db_iter_->key().ToString(), "g");
  2253. ASSERT_EQ(db_iter_->value().ToString(), "3");
  2254. db_iter_->Prev();
  2255. ASSERT_TRUE(db_iter_->Valid());
  2256. ASSERT_EQ(db_iter_->key().ToString(), "f");
  2257. ASSERT_EQ(db_iter_->value().ToString(), "2");
  2258. db_iter_->Prev();
  2259. ASSERT_TRUE(db_iter_->Valid());
  2260. ASSERT_EQ(db_iter_->key().ToString(), "d");
  2261. ASSERT_EQ(db_iter_->value().ToString(), "7");
  2262. db_iter_->Prev();
  2263. ASSERT_TRUE(db_iter_->Valid());
  2264. ASSERT_EQ(db_iter_->key().ToString(), "c");
  2265. ASSERT_EQ(db_iter_->value().ToString(), "6");
  2266. db_iter_->Prev();
  2267. ASSERT_TRUE(db_iter_->Valid());
  2268. ASSERT_EQ(db_iter_->key().ToString(), "b");
  2269. ASSERT_EQ(db_iter_->value().ToString(), "5");
  2270. db_iter_->Prev();
  2271. ASSERT_TRUE(db_iter_->Valid());
  2272. ASSERT_EQ(db_iter_->key().ToString(), "a");
  2273. ASSERT_EQ(db_iter_->value().ToString(), "4");
  2274. }
  2275. TEST_F(DBIterWithMergeIterTest, InnerMergeIteratorDataRace1) {
  2276. // Test Prev() when one child iterator is at its end but more rows
  2277. // are added.
  2278. db_iter_->Seek("f");
  2279. ASSERT_TRUE(db_iter_->Valid());
  2280. ASSERT_EQ(db_iter_->key().ToString(), "f");
  2281. ASSERT_EQ(db_iter_->value().ToString(), "2");
  2282. // Test call back inserts a key in the end of the mem table after
  2283. // MergeIterator::Prev() realized the mem table iterator is at its end
  2284. // and before an SeekToLast() is called.
  2285. ROCKSDB_NAMESPACE::SyncPoint::GetInstance()->SetCallBack(
  2286. "MergeIterator::Prev:BeforePrev",
  2287. [&](void* /*arg*/) { internal_iter2_->Add("z", kTypeValue, "7", 12u); });
  2288. ROCKSDB_NAMESPACE::SyncPoint::GetInstance()->EnableProcessing();
  2289. db_iter_->Prev();
  2290. ASSERT_TRUE(db_iter_->Valid());
  2291. ASSERT_EQ(db_iter_->key().ToString(), "d");
  2292. ASSERT_EQ(db_iter_->value().ToString(), "7");
  2293. db_iter_->Prev();
  2294. ASSERT_TRUE(db_iter_->Valid());
  2295. ASSERT_EQ(db_iter_->key().ToString(), "c");
  2296. ASSERT_EQ(db_iter_->value().ToString(), "6");
  2297. db_iter_->Prev();
  2298. ASSERT_TRUE(db_iter_->Valid());
  2299. ASSERT_EQ(db_iter_->key().ToString(), "b");
  2300. ASSERT_EQ(db_iter_->value().ToString(), "5");
  2301. db_iter_->Prev();
  2302. ASSERT_TRUE(db_iter_->Valid());
  2303. ASSERT_EQ(db_iter_->key().ToString(), "a");
  2304. ASSERT_EQ(db_iter_->value().ToString(), "4");
  2305. ROCKSDB_NAMESPACE::SyncPoint::GetInstance()->DisableProcessing();
  2306. }
  2307. TEST_F(DBIterWithMergeIterTest, InnerMergeIteratorDataRace2) {
  2308. // Test Prev() when one child iterator is at its end but more rows
  2309. // are added.
  2310. db_iter_->Seek("f");
  2311. ASSERT_TRUE(db_iter_->Valid());
  2312. ASSERT_EQ(db_iter_->key().ToString(), "f");
  2313. ASSERT_EQ(db_iter_->value().ToString(), "2");
  2314. // Test call back inserts entries for update a key in the end of the
  2315. // mem table after MergeIterator::Prev() realized the mem tableiterator is at
  2316. // its end and before an SeekToLast() is called.
  2317. ROCKSDB_NAMESPACE::SyncPoint::GetInstance()->SetCallBack(
  2318. "MergeIterator::Prev:BeforePrev", [&](void* /*arg*/) {
  2319. internal_iter2_->Add("z", kTypeValue, "7", 12u);
  2320. internal_iter2_->Add("z", kTypeValue, "7", 11u);
  2321. });
  2322. ROCKSDB_NAMESPACE::SyncPoint::GetInstance()->EnableProcessing();
  2323. db_iter_->Prev();
  2324. ASSERT_TRUE(db_iter_->Valid());
  2325. ASSERT_EQ(db_iter_->key().ToString(), "d");
  2326. ASSERT_EQ(db_iter_->value().ToString(), "7");
  2327. db_iter_->Prev();
  2328. ASSERT_TRUE(db_iter_->Valid());
  2329. ASSERT_EQ(db_iter_->key().ToString(), "c");
  2330. ASSERT_EQ(db_iter_->value().ToString(), "6");
  2331. db_iter_->Prev();
  2332. ASSERT_TRUE(db_iter_->Valid());
  2333. ASSERT_EQ(db_iter_->key().ToString(), "b");
  2334. ASSERT_EQ(db_iter_->value().ToString(), "5");
  2335. db_iter_->Prev();
  2336. ASSERT_TRUE(db_iter_->Valid());
  2337. ASSERT_EQ(db_iter_->key().ToString(), "a");
  2338. ASSERT_EQ(db_iter_->value().ToString(), "4");
  2339. ROCKSDB_NAMESPACE::SyncPoint::GetInstance()->DisableProcessing();
  2340. }
  2341. TEST_F(DBIterWithMergeIterTest, InnerMergeIteratorDataRace3) {
  2342. // Test Prev() when one child iterator is at its end but more rows
  2343. // are added and max_skipped is triggered.
  2344. db_iter_->Seek("f");
  2345. ASSERT_TRUE(db_iter_->Valid());
  2346. ASSERT_EQ(db_iter_->key().ToString(), "f");
  2347. ASSERT_EQ(db_iter_->value().ToString(), "2");
  2348. // Test call back inserts entries for update a key in the end of the
  2349. // mem table after MergeIterator::Prev() realized the mem table iterator is at
  2350. // its end and before an SeekToLast() is called.
  2351. ROCKSDB_NAMESPACE::SyncPoint::GetInstance()->SetCallBack(
  2352. "MergeIterator::Prev:BeforePrev", [&](void* /*arg*/) {
  2353. internal_iter2_->Add("z", kTypeValue, "7", 16u, true);
  2354. internal_iter2_->Add("z", kTypeValue, "7", 15u, true);
  2355. internal_iter2_->Add("z", kTypeValue, "7", 14u, true);
  2356. internal_iter2_->Add("z", kTypeValue, "7", 13u, true);
  2357. internal_iter2_->Add("z", kTypeValue, "7", 12u, true);
  2358. internal_iter2_->Add("z", kTypeValue, "7", 11u, true);
  2359. });
  2360. ROCKSDB_NAMESPACE::SyncPoint::GetInstance()->EnableProcessing();
  2361. db_iter_->Prev();
  2362. ASSERT_TRUE(db_iter_->Valid());
  2363. ASSERT_EQ(db_iter_->key().ToString(), "d");
  2364. ASSERT_EQ(db_iter_->value().ToString(), "7");
  2365. db_iter_->Prev();
  2366. ASSERT_TRUE(db_iter_->Valid());
  2367. ASSERT_EQ(db_iter_->key().ToString(), "c");
  2368. ASSERT_EQ(db_iter_->value().ToString(), "6");
  2369. db_iter_->Prev();
  2370. ASSERT_TRUE(db_iter_->Valid());
  2371. ASSERT_EQ(db_iter_->key().ToString(), "b");
  2372. ASSERT_EQ(db_iter_->value().ToString(), "5");
  2373. db_iter_->Prev();
  2374. ASSERT_TRUE(db_iter_->Valid());
  2375. ASSERT_EQ(db_iter_->key().ToString(), "a");
  2376. ASSERT_EQ(db_iter_->value().ToString(), "4");
  2377. ROCKSDB_NAMESPACE::SyncPoint::GetInstance()->DisableProcessing();
  2378. }
  2379. TEST_F(DBIterWithMergeIterTest, InnerMergeIteratorDataRace4) {
  2380. // Test Prev() when one child iterator has more rows inserted
  2381. // between Seek() and Prev() when changing directions.
  2382. internal_iter2_->Add("z", kTypeValue, "9", 4u);
  2383. db_iter_->Seek("g");
  2384. ASSERT_TRUE(db_iter_->Valid());
  2385. ASSERT_EQ(db_iter_->key().ToString(), "g");
  2386. ASSERT_EQ(db_iter_->value().ToString(), "3");
  2387. // Test call back inserts entries for update a key before "z" in
  2388. // mem table after MergeIterator::Prev() calls mem table iterator's
  2389. // Seek() and before calling Prev()
  2390. ROCKSDB_NAMESPACE::SyncPoint::GetInstance()->SetCallBack(
  2391. "MergeIterator::Prev:BeforePrev", [&](void* arg) {
  2392. IteratorWrapper* it = reinterpret_cast<IteratorWrapper*>(arg);
  2393. if (it->key().starts_with("z")) {
  2394. internal_iter2_->Add("x", kTypeValue, "7", 16u, true);
  2395. internal_iter2_->Add("x", kTypeValue, "7", 15u, true);
  2396. internal_iter2_->Add("x", kTypeValue, "7", 14u, true);
  2397. internal_iter2_->Add("x", kTypeValue, "7", 13u, true);
  2398. internal_iter2_->Add("x", kTypeValue, "7", 12u, true);
  2399. internal_iter2_->Add("x", kTypeValue, "7", 11u, true);
  2400. }
  2401. });
  2402. ROCKSDB_NAMESPACE::SyncPoint::GetInstance()->EnableProcessing();
  2403. db_iter_->Prev();
  2404. ASSERT_TRUE(db_iter_->Valid());
  2405. ASSERT_EQ(db_iter_->key().ToString(), "f");
  2406. ASSERT_EQ(db_iter_->value().ToString(), "2");
  2407. db_iter_->Prev();
  2408. ASSERT_TRUE(db_iter_->Valid());
  2409. ASSERT_EQ(db_iter_->key().ToString(), "d");
  2410. ASSERT_EQ(db_iter_->value().ToString(), "7");
  2411. db_iter_->Prev();
  2412. ASSERT_TRUE(db_iter_->Valid());
  2413. ASSERT_EQ(db_iter_->key().ToString(), "c");
  2414. ASSERT_EQ(db_iter_->value().ToString(), "6");
  2415. db_iter_->Prev();
  2416. ASSERT_TRUE(db_iter_->Valid());
  2417. ASSERT_EQ(db_iter_->key().ToString(), "b");
  2418. ASSERT_EQ(db_iter_->value().ToString(), "5");
  2419. db_iter_->Prev();
  2420. ASSERT_TRUE(db_iter_->Valid());
  2421. ASSERT_EQ(db_iter_->key().ToString(), "a");
  2422. ASSERT_EQ(db_iter_->value().ToString(), "4");
  2423. ROCKSDB_NAMESPACE::SyncPoint::GetInstance()->DisableProcessing();
  2424. }
  2425. TEST_F(DBIterWithMergeIterTest, InnerMergeIteratorDataRace5) {
  2426. internal_iter2_->Add("z", kTypeValue, "9", 4u);
  2427. // Test Prev() when one child iterator has more rows inserted
  2428. // between Seek() and Prev() when changing directions.
  2429. db_iter_->Seek("g");
  2430. ASSERT_TRUE(db_iter_->Valid());
  2431. ASSERT_EQ(db_iter_->key().ToString(), "g");
  2432. ASSERT_EQ(db_iter_->value().ToString(), "3");
  2433. // Test call back inserts entries for update a key before "z" in
  2434. // mem table after MergeIterator::Prev() calls mem table iterator's
  2435. // Seek() and before calling Prev()
  2436. ROCKSDB_NAMESPACE::SyncPoint::GetInstance()->SetCallBack(
  2437. "MergeIterator::Prev:BeforePrev", [&](void* arg) {
  2438. IteratorWrapper* it = reinterpret_cast<IteratorWrapper*>(arg);
  2439. if (it->key().starts_with("z")) {
  2440. internal_iter2_->Add("x", kTypeValue, "7", 16u, true);
  2441. internal_iter2_->Add("x", kTypeValue, "7", 15u, true);
  2442. }
  2443. });
  2444. ROCKSDB_NAMESPACE::SyncPoint::GetInstance()->EnableProcessing();
  2445. db_iter_->Prev();
  2446. ASSERT_TRUE(db_iter_->Valid());
  2447. ASSERT_EQ(db_iter_->key().ToString(), "f");
  2448. ASSERT_EQ(db_iter_->value().ToString(), "2");
  2449. db_iter_->Prev();
  2450. ASSERT_TRUE(db_iter_->Valid());
  2451. ASSERT_EQ(db_iter_->key().ToString(), "d");
  2452. ASSERT_EQ(db_iter_->value().ToString(), "7");
  2453. db_iter_->Prev();
  2454. ASSERT_TRUE(db_iter_->Valid());
  2455. ASSERT_EQ(db_iter_->key().ToString(), "c");
  2456. ASSERT_EQ(db_iter_->value().ToString(), "6");
  2457. db_iter_->Prev();
  2458. ASSERT_TRUE(db_iter_->Valid());
  2459. ASSERT_EQ(db_iter_->key().ToString(), "b");
  2460. ASSERT_EQ(db_iter_->value().ToString(), "5");
  2461. db_iter_->Prev();
  2462. ASSERT_TRUE(db_iter_->Valid());
  2463. ASSERT_EQ(db_iter_->key().ToString(), "a");
  2464. ASSERT_EQ(db_iter_->value().ToString(), "4");
  2465. ROCKSDB_NAMESPACE::SyncPoint::GetInstance()->DisableProcessing();
  2466. }
  2467. TEST_F(DBIterWithMergeIterTest, InnerMergeIteratorDataRace6) {
  2468. internal_iter2_->Add("z", kTypeValue, "9", 4u);
  2469. // Test Prev() when one child iterator has more rows inserted
  2470. // between Seek() and Prev() when changing directions.
  2471. db_iter_->Seek("g");
  2472. ASSERT_TRUE(db_iter_->Valid());
  2473. ASSERT_EQ(db_iter_->key().ToString(), "g");
  2474. ASSERT_EQ(db_iter_->value().ToString(), "3");
  2475. // Test call back inserts an entry for update a key before "z" in
  2476. // mem table after MergeIterator::Prev() calls mem table iterator's
  2477. // Seek() and before calling Prev()
  2478. ROCKSDB_NAMESPACE::SyncPoint::GetInstance()->SetCallBack(
  2479. "MergeIterator::Prev:BeforePrev", [&](void* arg) {
  2480. IteratorWrapper* it = reinterpret_cast<IteratorWrapper*>(arg);
  2481. if (it->key().starts_with("z")) {
  2482. internal_iter2_->Add("x", kTypeValue, "7", 16u, true);
  2483. }
  2484. });
  2485. ROCKSDB_NAMESPACE::SyncPoint::GetInstance()->EnableProcessing();
  2486. db_iter_->Prev();
  2487. ASSERT_TRUE(db_iter_->Valid());
  2488. ASSERT_EQ(db_iter_->key().ToString(), "f");
  2489. ASSERT_EQ(db_iter_->value().ToString(), "2");
  2490. db_iter_->Prev();
  2491. ASSERT_TRUE(db_iter_->Valid());
  2492. ASSERT_EQ(db_iter_->key().ToString(), "d");
  2493. ASSERT_EQ(db_iter_->value().ToString(), "7");
  2494. db_iter_->Prev();
  2495. ASSERT_TRUE(db_iter_->Valid());
  2496. ASSERT_EQ(db_iter_->key().ToString(), "c");
  2497. ASSERT_EQ(db_iter_->value().ToString(), "6");
  2498. db_iter_->Prev();
  2499. ASSERT_TRUE(db_iter_->Valid());
  2500. ASSERT_EQ(db_iter_->key().ToString(), "b");
  2501. ASSERT_EQ(db_iter_->value().ToString(), "5");
  2502. db_iter_->Prev();
  2503. ASSERT_TRUE(db_iter_->Valid());
  2504. ASSERT_EQ(db_iter_->key().ToString(), "a");
  2505. ASSERT_EQ(db_iter_->value().ToString(), "4");
  2506. ROCKSDB_NAMESPACE::SyncPoint::GetInstance()->DisableProcessing();
  2507. }
  2508. TEST_F(DBIterWithMergeIterTest, InnerMergeIteratorDataRace7) {
  2509. internal_iter1_->Add("u", kTypeValue, "10", 4u);
  2510. internal_iter1_->Add("v", kTypeValue, "11", 4u);
  2511. internal_iter1_->Add("w", kTypeValue, "12", 4u);
  2512. internal_iter2_->Add("z", kTypeValue, "9", 4u);
  2513. // Test Prev() when one child iterator has more rows inserted
  2514. // between Seek() and Prev() when changing directions.
  2515. db_iter_->Seek("g");
  2516. ASSERT_TRUE(db_iter_->Valid());
  2517. ASSERT_EQ(db_iter_->key().ToString(), "g");
  2518. ASSERT_EQ(db_iter_->value().ToString(), "3");
  2519. // Test call back inserts entries for update a key before "z" in
  2520. // mem table after MergeIterator::Prev() calls mem table iterator's
  2521. // Seek() and before calling Prev()
  2522. ROCKSDB_NAMESPACE::SyncPoint::GetInstance()->SetCallBack(
  2523. "MergeIterator::Prev:BeforePrev", [&](void* arg) {
  2524. IteratorWrapper* it = reinterpret_cast<IteratorWrapper*>(arg);
  2525. if (it->key().starts_with("z")) {
  2526. internal_iter2_->Add("x", kTypeValue, "7", 16u, true);
  2527. internal_iter2_->Add("x", kTypeValue, "7", 15u, true);
  2528. internal_iter2_->Add("x", kTypeValue, "7", 14u, true);
  2529. internal_iter2_->Add("x", kTypeValue, "7", 13u, true);
  2530. internal_iter2_->Add("x", kTypeValue, "7", 12u, true);
  2531. internal_iter2_->Add("x", kTypeValue, "7", 11u, true);
  2532. }
  2533. });
  2534. ROCKSDB_NAMESPACE::SyncPoint::GetInstance()->EnableProcessing();
  2535. db_iter_->Prev();
  2536. ASSERT_TRUE(db_iter_->Valid());
  2537. ASSERT_EQ(db_iter_->key().ToString(), "f");
  2538. ASSERT_EQ(db_iter_->value().ToString(), "2");
  2539. db_iter_->Prev();
  2540. ASSERT_TRUE(db_iter_->Valid());
  2541. ASSERT_EQ(db_iter_->key().ToString(), "d");
  2542. ASSERT_EQ(db_iter_->value().ToString(), "7");
  2543. db_iter_->Prev();
  2544. ASSERT_TRUE(db_iter_->Valid());
  2545. ASSERT_EQ(db_iter_->key().ToString(), "c");
  2546. ASSERT_EQ(db_iter_->value().ToString(), "6");
  2547. db_iter_->Prev();
  2548. ASSERT_TRUE(db_iter_->Valid());
  2549. ASSERT_EQ(db_iter_->key().ToString(), "b");
  2550. ASSERT_EQ(db_iter_->value().ToString(), "5");
  2551. db_iter_->Prev();
  2552. ASSERT_TRUE(db_iter_->Valid());
  2553. ASSERT_EQ(db_iter_->key().ToString(), "a");
  2554. ASSERT_EQ(db_iter_->value().ToString(), "4");
  2555. ROCKSDB_NAMESPACE::SyncPoint::GetInstance()->DisableProcessing();
  2556. }
  2557. TEST_F(DBIterWithMergeIterTest, InnerMergeIteratorDataRace8) {
  2558. // internal_iter1_: a, f, g
  2559. // internal_iter2_: a, b, c, d, adding (z)
  2560. internal_iter2_->Add("z", kTypeValue, "9", 4u);
  2561. // Test Prev() when one child iterator has more rows inserted
  2562. // between Seek() and Prev() when changing directions.
  2563. db_iter_->Seek("g");
  2564. ASSERT_TRUE(db_iter_->Valid());
  2565. ASSERT_EQ(db_iter_->key().ToString(), "g");
  2566. ASSERT_EQ(db_iter_->value().ToString(), "3");
  2567. // Test call back inserts two keys before "z" in mem table after
  2568. // MergeIterator::Prev() calls mem table iterator's Seek() and
  2569. // before calling Prev()
  2570. ROCKSDB_NAMESPACE::SyncPoint::GetInstance()->SetCallBack(
  2571. "MergeIterator::Prev:BeforePrev", [&](void* arg) {
  2572. IteratorWrapper* it = reinterpret_cast<IteratorWrapper*>(arg);
  2573. if (it->key().starts_with("z")) {
  2574. internal_iter2_->Add("x", kTypeValue, "7", 16u, true);
  2575. internal_iter2_->Add("y", kTypeValue, "7", 17u, true);
  2576. }
  2577. });
  2578. ROCKSDB_NAMESPACE::SyncPoint::GetInstance()->EnableProcessing();
  2579. db_iter_->Prev();
  2580. ASSERT_TRUE(db_iter_->Valid());
  2581. ASSERT_EQ(db_iter_->key().ToString(), "f");
  2582. ASSERT_EQ(db_iter_->value().ToString(), "2");
  2583. db_iter_->Prev();
  2584. ASSERT_TRUE(db_iter_->Valid());
  2585. ASSERT_EQ(db_iter_->key().ToString(), "d");
  2586. ASSERT_EQ(db_iter_->value().ToString(), "7");
  2587. ROCKSDB_NAMESPACE::SyncPoint::GetInstance()->DisableProcessing();
  2588. }
  2589. TEST_F(DBIteratorTest, SeekPrefixTombstones) {
  2590. ReadOptions ro;
  2591. Options options;
  2592. options.prefix_extractor.reset(NewNoopTransform());
  2593. TestIterator* internal_iter = new TestIterator(BytewiseComparator());
  2594. internal_iter->AddDeletion("b");
  2595. internal_iter->AddDeletion("c");
  2596. internal_iter->AddDeletion("d");
  2597. internal_iter->AddDeletion("e");
  2598. internal_iter->AddDeletion("f");
  2599. internal_iter->AddDeletion("g");
  2600. internal_iter->Finish();
  2601. ro.prefix_same_as_start = true;
  2602. std::unique_ptr<Iterator> db_iter(NewDBIterator(
  2603. env_, ro, ImmutableCFOptions(options), MutableCFOptions(options),
  2604. BytewiseComparator(), internal_iter, 10,
  2605. options.max_sequential_skip_in_iterations, nullptr /*read_callback*/));
  2606. int skipped_keys = 0;
  2607. get_perf_context()->Reset();
  2608. db_iter->SeekForPrev("z");
  2609. skipped_keys =
  2610. static_cast<int>(get_perf_context()->internal_key_skipped_count);
  2611. ASSERT_EQ(skipped_keys, 0);
  2612. get_perf_context()->Reset();
  2613. db_iter->Seek("a");
  2614. skipped_keys =
  2615. static_cast<int>(get_perf_context()->internal_key_skipped_count);
  2616. ASSERT_EQ(skipped_keys, 0);
  2617. }
  2618. TEST_F(DBIteratorTest, SeekToFirstLowerBound) {
  2619. const int kNumKeys = 3;
  2620. for (int i = 0; i < kNumKeys + 2; ++i) {
  2621. // + 2 for two special cases: lower bound before and lower bound after the
  2622. // internal iterator's keys
  2623. TestIterator* internal_iter = new TestIterator(BytewiseComparator());
  2624. for (int j = 1; j <= kNumKeys; ++j) {
  2625. internal_iter->AddPut(std::to_string(j), "val");
  2626. }
  2627. internal_iter->Finish();
  2628. ReadOptions ro;
  2629. auto lower_bound_str = std::to_string(i);
  2630. Slice lower_bound(lower_bound_str);
  2631. ro.iterate_lower_bound = &lower_bound;
  2632. Options options;
  2633. std::unique_ptr<Iterator> db_iter(NewDBIterator(
  2634. env_, ro, ImmutableCFOptions(options), MutableCFOptions(options),
  2635. BytewiseComparator(), internal_iter, 10 /* sequence */,
  2636. options.max_sequential_skip_in_iterations,
  2637. nullptr /* read_callback */));
  2638. db_iter->SeekToFirst();
  2639. if (i == kNumKeys + 1) {
  2640. // lower bound was beyond the last key
  2641. ASSERT_FALSE(db_iter->Valid());
  2642. } else {
  2643. ASSERT_TRUE(db_iter->Valid());
  2644. int expected;
  2645. if (i == 0) {
  2646. // lower bound was before the first key
  2647. expected = 1;
  2648. } else {
  2649. // lower bound was at the ith key
  2650. expected = i;
  2651. }
  2652. ASSERT_EQ(std::to_string(expected), db_iter->key().ToString());
  2653. }
  2654. }
  2655. }
  2656. TEST_F(DBIteratorTest, PrevLowerBound) {
  2657. const int kNumKeys = 3;
  2658. const int kLowerBound = 2;
  2659. TestIterator* internal_iter = new TestIterator(BytewiseComparator());
  2660. for (int j = 1; j <= kNumKeys; ++j) {
  2661. internal_iter->AddPut(std::to_string(j), "val");
  2662. }
  2663. internal_iter->Finish();
  2664. ReadOptions ro;
  2665. auto lower_bound_str = std::to_string(kLowerBound);
  2666. Slice lower_bound(lower_bound_str);
  2667. ro.iterate_lower_bound = &lower_bound;
  2668. Options options;
  2669. std::unique_ptr<Iterator> db_iter(NewDBIterator(
  2670. env_, ro, ImmutableCFOptions(options), MutableCFOptions(options),
  2671. BytewiseComparator(), internal_iter, 10 /* sequence */,
  2672. options.max_sequential_skip_in_iterations, nullptr /* read_callback */));
  2673. db_iter->SeekToLast();
  2674. for (int i = kNumKeys; i >= kLowerBound; --i) {
  2675. ASSERT_TRUE(db_iter->Valid());
  2676. ASSERT_EQ(std::to_string(i), db_iter->key().ToString());
  2677. db_iter->Prev();
  2678. }
  2679. ASSERT_FALSE(db_iter->Valid());
  2680. }
  2681. TEST_F(DBIteratorTest, SeekLessLowerBound) {
  2682. const int kNumKeys = 3;
  2683. const int kLowerBound = 2;
  2684. TestIterator* internal_iter = new TestIterator(BytewiseComparator());
  2685. for (int j = 1; j <= kNumKeys; ++j) {
  2686. internal_iter->AddPut(std::to_string(j), "val");
  2687. }
  2688. internal_iter->Finish();
  2689. ReadOptions ro;
  2690. auto lower_bound_str = std::to_string(kLowerBound);
  2691. Slice lower_bound(lower_bound_str);
  2692. ro.iterate_lower_bound = &lower_bound;
  2693. Options options;
  2694. std::unique_ptr<Iterator> db_iter(NewDBIterator(
  2695. env_, ro, ImmutableCFOptions(options), MutableCFOptions(options),
  2696. BytewiseComparator(), internal_iter, 10 /* sequence */,
  2697. options.max_sequential_skip_in_iterations, nullptr /* read_callback */));
  2698. auto before_lower_bound_str = std::to_string(kLowerBound - 1);
  2699. Slice before_lower_bound(lower_bound_str);
  2700. db_iter->Seek(before_lower_bound);
  2701. ASSERT_TRUE(db_iter->Valid());
  2702. ASSERT_EQ(lower_bound_str, db_iter->key().ToString());
  2703. }
  2704. TEST_F(DBIteratorTest, ReverseToForwardWithDisappearingKeys) {
  2705. Options options;
  2706. options.prefix_extractor.reset(NewCappedPrefixTransform(0));
  2707. TestIterator* internal_iter = new TestIterator(BytewiseComparator());
  2708. internal_iter->AddPut("a", "A");
  2709. internal_iter->AddPut("b", "B");
  2710. for (int i = 0; i < 100; ++i) {
  2711. internal_iter->AddPut("c" + ToString(i), "");
  2712. }
  2713. internal_iter->Finish();
  2714. std::unique_ptr<Iterator> db_iter(NewDBIterator(
  2715. env_, ReadOptions(), ImmutableCFOptions(options),
  2716. MutableCFOptions(options), BytewiseComparator(), internal_iter, 10,
  2717. options.max_sequential_skip_in_iterations, nullptr /*read_callback*/));
  2718. db_iter->SeekForPrev("a");
  2719. ASSERT_TRUE(db_iter->Valid());
  2720. ASSERT_OK(db_iter->status());
  2721. ASSERT_EQ("a", db_iter->key().ToString());
  2722. internal_iter->Vanish("a");
  2723. db_iter->Next();
  2724. ASSERT_TRUE(db_iter->Valid());
  2725. ASSERT_OK(db_iter->status());
  2726. ASSERT_EQ("b", db_iter->key().ToString());
  2727. // A (sort of) bug used to cause DBIter to pointlessly drag the internal
  2728. // iterator all the way to the end. But this doesn't really matter at the time
  2729. // of writing because the only iterator that can see disappearing keys is
  2730. // ForwardIterator, which doesn't support SeekForPrev().
  2731. EXPECT_LT(internal_iter->steps(), 20);
  2732. }
  2733. } // namespace ROCKSDB_NAMESPACE
  2734. int main(int argc, char** argv) {
  2735. ::testing::InitGoogleTest(&argc, argv);
  2736. return RUN_ALL_TESTS();
  2737. }