db_iter_test.cc 110 KB

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