@nxtedition/rocksdb 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (1088) hide show
  1. package/CHANGELOG.md +294 -0
  2. package/LICENSE +21 -0
  3. package/README.md +102 -0
  4. package/UPGRADING.md +91 -0
  5. package/binding.cc +1276 -0
  6. package/binding.gyp +73 -0
  7. package/binding.js +1 -0
  8. package/chained-batch.js +44 -0
  9. package/deps/rocksdb/build_version.cc +4 -0
  10. package/deps/rocksdb/rocksdb/CMakeLists.txt +1356 -0
  11. package/deps/rocksdb/rocksdb/COPYING +339 -0
  12. package/deps/rocksdb/rocksdb/LICENSE.Apache +202 -0
  13. package/deps/rocksdb/rocksdb/LICENSE.leveldb +29 -0
  14. package/deps/rocksdb/rocksdb/Makefile +2521 -0
  15. package/deps/rocksdb/rocksdb/TARGETS +2100 -0
  16. package/deps/rocksdb/rocksdb/cache/cache.cc +63 -0
  17. package/deps/rocksdb/rocksdb/cache/cache_bench.cc +381 -0
  18. package/deps/rocksdb/rocksdb/cache/cache_helpers.h +114 -0
  19. package/deps/rocksdb/rocksdb/cache/cache_test.cc +775 -0
  20. package/deps/rocksdb/rocksdb/cache/clock_cache.cc +769 -0
  21. package/deps/rocksdb/rocksdb/cache/clock_cache.h +16 -0
  22. package/deps/rocksdb/rocksdb/cache/lru_cache.cc +574 -0
  23. package/deps/rocksdb/rocksdb/cache/lru_cache.h +339 -0
  24. package/deps/rocksdb/rocksdb/cache/lru_cache_test.cc +199 -0
  25. package/deps/rocksdb/rocksdb/cache/sharded_cache.cc +162 -0
  26. package/deps/rocksdb/rocksdb/cache/sharded_cache.h +111 -0
  27. package/deps/rocksdb/rocksdb/cmake/RocksDBConfig.cmake.in +54 -0
  28. package/deps/rocksdb/rocksdb/cmake/modules/CxxFlags.cmake +7 -0
  29. package/deps/rocksdb/rocksdb/cmake/modules/FindJeMalloc.cmake +29 -0
  30. package/deps/rocksdb/rocksdb/cmake/modules/FindNUMA.cmake +29 -0
  31. package/deps/rocksdb/rocksdb/cmake/modules/FindSnappy.cmake +29 -0
  32. package/deps/rocksdb/rocksdb/cmake/modules/FindTBB.cmake +33 -0
  33. package/deps/rocksdb/rocksdb/cmake/modules/Findgflags.cmake +29 -0
  34. package/deps/rocksdb/rocksdb/cmake/modules/Findlz4.cmake +29 -0
  35. package/deps/rocksdb/rocksdb/cmake/modules/Findzstd.cmake +29 -0
  36. package/deps/rocksdb/rocksdb/cmake/modules/ReadVersion.cmake +10 -0
  37. package/deps/rocksdb/rocksdb/db/arena_wrapped_db_iter.cc +108 -0
  38. package/deps/rocksdb/rocksdb/db/arena_wrapped_db_iter.h +115 -0
  39. package/deps/rocksdb/rocksdb/db/blob/blob_constants.h +16 -0
  40. package/deps/rocksdb/rocksdb/db/blob/blob_file_addition.cc +154 -0
  41. package/deps/rocksdb/rocksdb/db/blob/blob_file_addition.h +67 -0
  42. package/deps/rocksdb/rocksdb/db/blob/blob_file_addition_test.cc +206 -0
  43. package/deps/rocksdb/rocksdb/db/blob/blob_file_builder.cc +316 -0
  44. package/deps/rocksdb/rocksdb/db/blob/blob_file_builder.h +91 -0
  45. package/deps/rocksdb/rocksdb/db/blob/blob_file_builder_test.cc +660 -0
  46. package/deps/rocksdb/rocksdb/db/blob/blob_file_cache.cc +99 -0
  47. package/deps/rocksdb/rocksdb/db/blob/blob_file_cache.h +49 -0
  48. package/deps/rocksdb/rocksdb/db/blob/blob_file_cache_test.cc +268 -0
  49. package/deps/rocksdb/rocksdb/db/blob/blob_file_garbage.cc +134 -0
  50. package/deps/rocksdb/rocksdb/db/blob/blob_file_garbage.h +57 -0
  51. package/deps/rocksdb/rocksdb/db/blob/blob_file_garbage_test.cc +173 -0
  52. package/deps/rocksdb/rocksdb/db/blob/blob_file_meta.cc +55 -0
  53. package/deps/rocksdb/rocksdb/db/blob/blob_file_meta.h +164 -0
  54. package/deps/rocksdb/rocksdb/db/blob/blob_file_reader.cc +423 -0
  55. package/deps/rocksdb/rocksdb/db/blob/blob_file_reader.h +81 -0
  56. package/deps/rocksdb/rocksdb/db/blob/blob_file_reader_test.cc +771 -0
  57. package/deps/rocksdb/rocksdb/db/blob/blob_index.h +184 -0
  58. package/deps/rocksdb/rocksdb/db/blob/blob_log_format.cc +145 -0
  59. package/deps/rocksdb/rocksdb/db/blob/blob_log_format.h +148 -0
  60. package/deps/rocksdb/rocksdb/db/blob/blob_log_sequential_reader.cc +132 -0
  61. package/deps/rocksdb/rocksdb/db/blob/blob_log_sequential_reader.h +76 -0
  62. package/deps/rocksdb/rocksdb/db/blob/blob_log_writer.cc +168 -0
  63. package/deps/rocksdb/rocksdb/db/blob/blob_log_writer.h +83 -0
  64. package/deps/rocksdb/rocksdb/db/blob/db_blob_basic_test.cc +307 -0
  65. package/deps/rocksdb/rocksdb/db/blob/db_blob_index_test.cc +464 -0
  66. package/deps/rocksdb/rocksdb/db/builder.cc +358 -0
  67. package/deps/rocksdb/rocksdb/db/builder.h +95 -0
  68. package/deps/rocksdb/rocksdb/db/c.cc +5281 -0
  69. package/deps/rocksdb/rocksdb/db/c_test.c +2883 -0
  70. package/deps/rocksdb/rocksdb/db/column_family.cc +1602 -0
  71. package/deps/rocksdb/rocksdb/db/column_family.h +787 -0
  72. package/deps/rocksdb/rocksdb/db/column_family_test.cc +3427 -0
  73. package/deps/rocksdb/rocksdb/db/compact_files_test.cc +425 -0
  74. package/deps/rocksdb/rocksdb/db/compacted_db_impl.cc +169 -0
  75. package/deps/rocksdb/rocksdb/db/compacted_db_impl.h +118 -0
  76. package/deps/rocksdb/rocksdb/db/compaction/compaction.cc +591 -0
  77. package/deps/rocksdb/rocksdb/db/compaction/compaction.h +389 -0
  78. package/deps/rocksdb/rocksdb/db/compaction/compaction_iteration_stats.h +37 -0
  79. package/deps/rocksdb/rocksdb/db/compaction/compaction_iterator.cc +1023 -0
  80. package/deps/rocksdb/rocksdb/db/compaction/compaction_iterator.h +353 -0
  81. package/deps/rocksdb/rocksdb/db/compaction/compaction_iterator_test.cc +1254 -0
  82. package/deps/rocksdb/rocksdb/db/compaction/compaction_job.cc +1917 -0
  83. package/deps/rocksdb/rocksdb/db/compaction/compaction_job.h +208 -0
  84. package/deps/rocksdb/rocksdb/db/compaction/compaction_job_stats_test.cc +1037 -0
  85. package/deps/rocksdb/rocksdb/db/compaction/compaction_job_test.cc +1224 -0
  86. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker.cc +1135 -0
  87. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker.h +318 -0
  88. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_fifo.cc +255 -0
  89. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_fifo.h +57 -0
  90. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_level.cc +510 -0
  91. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_level.h +33 -0
  92. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_test.cc +2190 -0
  93. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_universal.cc +1103 -0
  94. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_universal.h +32 -0
  95. package/deps/rocksdb/rocksdb/db/compaction/sst_partitioner.cc +44 -0
  96. package/deps/rocksdb/rocksdb/db/comparator_db_test.cc +660 -0
  97. package/deps/rocksdb/rocksdb/db/convenience.cc +78 -0
  98. package/deps/rocksdb/rocksdb/db/corruption_test.cc +921 -0
  99. package/deps/rocksdb/rocksdb/db/cuckoo_table_db_test.cc +359 -0
  100. package/deps/rocksdb/rocksdb/db/db_basic_test.cc +3820 -0
  101. package/deps/rocksdb/rocksdb/db/db_block_cache_test.cc +1058 -0
  102. package/deps/rocksdb/rocksdb/db/db_bloom_filter_test.cc +2128 -0
  103. package/deps/rocksdb/rocksdb/db/db_compaction_filter_test.cc +851 -0
  104. package/deps/rocksdb/rocksdb/db/db_compaction_test.cc +6292 -0
  105. package/deps/rocksdb/rocksdb/db/db_dynamic_level_test.cc +509 -0
  106. package/deps/rocksdb/rocksdb/db/db_encryption_test.cc +130 -0
  107. package/deps/rocksdb/rocksdb/db/db_filesnapshot.cc +137 -0
  108. package/deps/rocksdb/rocksdb/db/db_flush_test.cc +1119 -0
  109. package/deps/rocksdb/rocksdb/db/db_impl/db_impl.cc +5057 -0
  110. package/deps/rocksdb/rocksdb/db/db_impl/db_impl.h +2274 -0
  111. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_compaction_flush.cc +3421 -0
  112. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_debug.cc +298 -0
  113. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_experimental.cc +151 -0
  114. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_files.cc +967 -0
  115. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_open.cc +1806 -0
  116. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_readonly.cc +270 -0
  117. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_readonly.h +146 -0
  118. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_secondary.cc +683 -0
  119. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_secondary.h +333 -0
  120. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_write.cc +2024 -0
  121. package/deps/rocksdb/rocksdb/db/db_impl/db_secondary_test.cc +932 -0
  122. package/deps/rocksdb/rocksdb/db/db_info_dumper.cc +137 -0
  123. package/deps/rocksdb/rocksdb/db/db_info_dumper.h +15 -0
  124. package/deps/rocksdb/rocksdb/db/db_inplace_update_test.cc +178 -0
  125. package/deps/rocksdb/rocksdb/db/db_io_failure_test.cc +592 -0
  126. package/deps/rocksdb/rocksdb/db/db_iter.cc +1493 -0
  127. package/deps/rocksdb/rocksdb/db/db_iter.h +390 -0
  128. package/deps/rocksdb/rocksdb/db/db_iter_stress_test.cc +657 -0
  129. package/deps/rocksdb/rocksdb/db/db_iter_test.cc +3268 -0
  130. package/deps/rocksdb/rocksdb/db/db_iterator_test.cc +3197 -0
  131. package/deps/rocksdb/rocksdb/db/db_log_iter_test.cc +299 -0
  132. package/deps/rocksdb/rocksdb/db/db_logical_block_size_cache_test.cc +513 -0
  133. package/deps/rocksdb/rocksdb/db/db_memtable_test.cc +329 -0
  134. package/deps/rocksdb/rocksdb/db/db_merge_operand_test.cc +241 -0
  135. package/deps/rocksdb/rocksdb/db/db_merge_operator_test.cc +671 -0
  136. package/deps/rocksdb/rocksdb/db/db_options_test.cc +1022 -0
  137. package/deps/rocksdb/rocksdb/db/db_properties_test.cc +1723 -0
  138. package/deps/rocksdb/rocksdb/db/db_range_del_test.cc +1694 -0
  139. package/deps/rocksdb/rocksdb/db/db_sst_test.cc +1261 -0
  140. package/deps/rocksdb/rocksdb/db/db_statistics_test.cc +164 -0
  141. package/deps/rocksdb/rocksdb/db/db_table_properties_test.cc +488 -0
  142. package/deps/rocksdb/rocksdb/db/db_tailing_iter_test.cc +567 -0
  143. package/deps/rocksdb/rocksdb/db/db_test.cc +6736 -0
  144. package/deps/rocksdb/rocksdb/db/db_test2.cc +5408 -0
  145. package/deps/rocksdb/rocksdb/db/db_test_util.cc +1633 -0
  146. package/deps/rocksdb/rocksdb/db/db_test_util.h +1194 -0
  147. package/deps/rocksdb/rocksdb/db/db_universal_compaction_test.cc +2235 -0
  148. package/deps/rocksdb/rocksdb/db/db_wal_test.cc +1780 -0
  149. package/deps/rocksdb/rocksdb/db/db_with_timestamp_basic_test.cc +2520 -0
  150. package/deps/rocksdb/rocksdb/db/db_with_timestamp_compaction_test.cc +119 -0
  151. package/deps/rocksdb/rocksdb/db/db_write_test.cc +465 -0
  152. package/deps/rocksdb/rocksdb/db/dbformat.cc +222 -0
  153. package/deps/rocksdb/rocksdb/db/dbformat.h +786 -0
  154. package/deps/rocksdb/rocksdb/db/dbformat_test.cc +206 -0
  155. package/deps/rocksdb/rocksdb/db/deletefile_test.cc +580 -0
  156. package/deps/rocksdb/rocksdb/db/error_handler.cc +726 -0
  157. package/deps/rocksdb/rocksdb/db/error_handler.h +117 -0
  158. package/deps/rocksdb/rocksdb/db/error_handler_fs_test.cc +2598 -0
  159. package/deps/rocksdb/rocksdb/db/event_helpers.cc +233 -0
  160. package/deps/rocksdb/rocksdb/db/event_helpers.h +57 -0
  161. package/deps/rocksdb/rocksdb/db/experimental.cc +50 -0
  162. package/deps/rocksdb/rocksdb/db/external_sst_file_basic_test.cc +1559 -0
  163. package/deps/rocksdb/rocksdb/db/external_sst_file_ingestion_job.cc +910 -0
  164. package/deps/rocksdb/rocksdb/db/external_sst_file_ingestion_job.h +195 -0
  165. package/deps/rocksdb/rocksdb/db/external_sst_file_test.cc +2936 -0
  166. package/deps/rocksdb/rocksdb/db/fault_injection_test.cc +556 -0
  167. package/deps/rocksdb/rocksdb/db/file_indexer.cc +216 -0
  168. package/deps/rocksdb/rocksdb/db/file_indexer.h +142 -0
  169. package/deps/rocksdb/rocksdb/db/file_indexer_test.cc +350 -0
  170. package/deps/rocksdb/rocksdb/db/filename_test.cc +179 -0
  171. package/deps/rocksdb/rocksdb/db/flush_job.cc +514 -0
  172. package/deps/rocksdb/rocksdb/db/flush_job.h +169 -0
  173. package/deps/rocksdb/rocksdb/db/flush_job_test.cc +647 -0
  174. package/deps/rocksdb/rocksdb/db/flush_scheduler.cc +86 -0
  175. package/deps/rocksdb/rocksdb/db/flush_scheduler.h +54 -0
  176. package/deps/rocksdb/rocksdb/db/forward_iterator.cc +1023 -0
  177. package/deps/rocksdb/rocksdb/db/forward_iterator.h +163 -0
  178. package/deps/rocksdb/rocksdb/db/forward_iterator_bench.cc +377 -0
  179. package/deps/rocksdb/rocksdb/db/import_column_family_job.cc +282 -0
  180. package/deps/rocksdb/rocksdb/db/import_column_family_job.h +75 -0
  181. package/deps/rocksdb/rocksdb/db/import_column_family_test.cc +632 -0
  182. package/deps/rocksdb/rocksdb/db/internal_stats.cc +1461 -0
  183. package/deps/rocksdb/rocksdb/db/internal_stats.h +712 -0
  184. package/deps/rocksdb/rocksdb/db/job_context.h +226 -0
  185. package/deps/rocksdb/rocksdb/db/listener_test.cc +1118 -0
  186. package/deps/rocksdb/rocksdb/db/log_format.h +48 -0
  187. package/deps/rocksdb/rocksdb/db/log_reader.cc +654 -0
  188. package/deps/rocksdb/rocksdb/db/log_reader.h +192 -0
  189. package/deps/rocksdb/rocksdb/db/log_test.cc +901 -0
  190. package/deps/rocksdb/rocksdb/db/log_writer.cc +164 -0
  191. package/deps/rocksdb/rocksdb/db/log_writer.h +115 -0
  192. package/deps/rocksdb/rocksdb/db/logs_with_prep_tracker.cc +67 -0
  193. package/deps/rocksdb/rocksdb/db/logs_with_prep_tracker.h +63 -0
  194. package/deps/rocksdb/rocksdb/db/lookup_key.h +66 -0
  195. package/deps/rocksdb/rocksdb/db/malloc_stats.cc +54 -0
  196. package/deps/rocksdb/rocksdb/db/malloc_stats.h +24 -0
  197. package/deps/rocksdb/rocksdb/db/manual_compaction_test.cc +296 -0
  198. package/deps/rocksdb/rocksdb/db/memtable.cc +1169 -0
  199. package/deps/rocksdb/rocksdb/db/memtable.h +554 -0
  200. package/deps/rocksdb/rocksdb/db/memtable_list.cc +888 -0
  201. package/deps/rocksdb/rocksdb/db/memtable_list.h +438 -0
  202. package/deps/rocksdb/rocksdb/db/memtable_list_test.cc +935 -0
  203. package/deps/rocksdb/rocksdb/db/merge_context.h +134 -0
  204. package/deps/rocksdb/rocksdb/db/merge_helper.cc +421 -0
  205. package/deps/rocksdb/rocksdb/db/merge_helper.h +197 -0
  206. package/deps/rocksdb/rocksdb/db/merge_helper_test.cc +290 -0
  207. package/deps/rocksdb/rocksdb/db/merge_operator.cc +86 -0
  208. package/deps/rocksdb/rocksdb/db/merge_test.cc +608 -0
  209. package/deps/rocksdb/rocksdb/db/obsolete_files_test.cc +338 -0
  210. package/deps/rocksdb/rocksdb/db/options_file_test.cc +119 -0
  211. package/deps/rocksdb/rocksdb/db/output_validator.cc +30 -0
  212. package/deps/rocksdb/rocksdb/db/output_validator.h +47 -0
  213. package/deps/rocksdb/rocksdb/db/perf_context_test.cc +993 -0
  214. package/deps/rocksdb/rocksdb/db/periodic_work_scheduler.cc +113 -0
  215. package/deps/rocksdb/rocksdb/db/periodic_work_scheduler.h +76 -0
  216. package/deps/rocksdb/rocksdb/db/periodic_work_scheduler_test.cc +231 -0
  217. package/deps/rocksdb/rocksdb/db/pinned_iterators_manager.h +87 -0
  218. package/deps/rocksdb/rocksdb/db/plain_table_db_test.cc +1374 -0
  219. package/deps/rocksdb/rocksdb/db/pre_release_callback.h +38 -0
  220. package/deps/rocksdb/rocksdb/db/prefix_test.cc +910 -0
  221. package/deps/rocksdb/rocksdb/db/range_del_aggregator.cc +489 -0
  222. package/deps/rocksdb/rocksdb/db/range_del_aggregator.h +446 -0
  223. package/deps/rocksdb/rocksdb/db/range_del_aggregator_bench.cc +260 -0
  224. package/deps/rocksdb/rocksdb/db/range_del_aggregator_test.cc +709 -0
  225. package/deps/rocksdb/rocksdb/db/range_tombstone_fragmenter.cc +439 -0
  226. package/deps/rocksdb/rocksdb/db/range_tombstone_fragmenter.h +256 -0
  227. package/deps/rocksdb/rocksdb/db/range_tombstone_fragmenter_test.cc +552 -0
  228. package/deps/rocksdb/rocksdb/db/read_callback.h +53 -0
  229. package/deps/rocksdb/rocksdb/db/repair.cc +722 -0
  230. package/deps/rocksdb/rocksdb/db/repair_test.cc +390 -0
  231. package/deps/rocksdb/rocksdb/db/snapshot_checker.h +61 -0
  232. package/deps/rocksdb/rocksdb/db/snapshot_impl.cc +26 -0
  233. package/deps/rocksdb/rocksdb/db/snapshot_impl.h +167 -0
  234. package/deps/rocksdb/rocksdb/db/table_cache.cc +704 -0
  235. package/deps/rocksdb/rocksdb/db/table_cache.h +233 -0
  236. package/deps/rocksdb/rocksdb/db/table_properties_collector.cc +75 -0
  237. package/deps/rocksdb/rocksdb/db/table_properties_collector.h +107 -0
  238. package/deps/rocksdb/rocksdb/db/table_properties_collector_test.cc +517 -0
  239. package/deps/rocksdb/rocksdb/db/transaction_log_impl.cc +318 -0
  240. package/deps/rocksdb/rocksdb/db/transaction_log_impl.h +128 -0
  241. package/deps/rocksdb/rocksdb/db/trim_history_scheduler.cc +54 -0
  242. package/deps/rocksdb/rocksdb/db/trim_history_scheduler.h +44 -0
  243. package/deps/rocksdb/rocksdb/db/version_builder.cc +1078 -0
  244. package/deps/rocksdb/rocksdb/db/version_builder.h +69 -0
  245. package/deps/rocksdb/rocksdb/db/version_builder_test.cc +1551 -0
  246. package/deps/rocksdb/rocksdb/db/version_edit.cc +955 -0
  247. package/deps/rocksdb/rocksdb/db/version_edit.h +609 -0
  248. package/deps/rocksdb/rocksdb/db/version_edit_handler.cc +699 -0
  249. package/deps/rocksdb/rocksdb/db/version_edit_handler.h +252 -0
  250. package/deps/rocksdb/rocksdb/db/version_edit_test.cc +597 -0
  251. package/deps/rocksdb/rocksdb/db/version_set.cc +6333 -0
  252. package/deps/rocksdb/rocksdb/db/version_set.h +1485 -0
  253. package/deps/rocksdb/rocksdb/db/version_set_test.cc +3035 -0
  254. package/deps/rocksdb/rocksdb/db/wal_edit.cc +204 -0
  255. package/deps/rocksdb/rocksdb/db/wal_edit.h +166 -0
  256. package/deps/rocksdb/rocksdb/db/wal_edit_test.cc +214 -0
  257. package/deps/rocksdb/rocksdb/db/wal_manager.cc +517 -0
  258. package/deps/rocksdb/rocksdb/db/wal_manager.h +119 -0
  259. package/deps/rocksdb/rocksdb/db/wal_manager_test.cc +340 -0
  260. package/deps/rocksdb/rocksdb/db/write_batch.cc +2174 -0
  261. package/deps/rocksdb/rocksdb/db/write_batch_base.cc +94 -0
  262. package/deps/rocksdb/rocksdb/db/write_batch_internal.h +250 -0
  263. package/deps/rocksdb/rocksdb/db/write_batch_test.cc +907 -0
  264. package/deps/rocksdb/rocksdb/db/write_callback.h +27 -0
  265. package/deps/rocksdb/rocksdb/db/write_callback_test.cc +457 -0
  266. package/deps/rocksdb/rocksdb/db/write_controller.cc +128 -0
  267. package/deps/rocksdb/rocksdb/db/write_controller.h +144 -0
  268. package/deps/rocksdb/rocksdb/db/write_controller_test.cc +135 -0
  269. package/deps/rocksdb/rocksdb/db/write_thread.cc +796 -0
  270. package/deps/rocksdb/rocksdb/db/write_thread.h +433 -0
  271. package/deps/rocksdb/rocksdb/db_stress_tool/CMakeLists.txt +14 -0
  272. package/deps/rocksdb/rocksdb/db_stress_tool/batched_ops_stress.cc +341 -0
  273. package/deps/rocksdb/rocksdb/db_stress_tool/cf_consistency_stress.cc +520 -0
  274. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress.cc +23 -0
  275. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_common.cc +337 -0
  276. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_common.h +554 -0
  277. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_compaction_filter.h +79 -0
  278. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_driver.cc +173 -0
  279. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_driver.h +17 -0
  280. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_env_wrapper.h +38 -0
  281. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_gflags.cc +763 -0
  282. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_listener.h +222 -0
  283. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_shared_state.cc +27 -0
  284. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_shared_state.h +428 -0
  285. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_stat.h +218 -0
  286. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_table_properties_collector.h +64 -0
  287. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_test_base.cc +2430 -0
  288. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_test_base.h +237 -0
  289. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_tool.cc +343 -0
  290. package/deps/rocksdb/rocksdb/db_stress_tool/no_batched_ops_stress.cc +800 -0
  291. package/deps/rocksdb/rocksdb/env/composite_env_wrapper.h +920 -0
  292. package/deps/rocksdb/rocksdb/env/env.cc +733 -0
  293. package/deps/rocksdb/rocksdb/env/env_basic_test.cc +352 -0
  294. package/deps/rocksdb/rocksdb/env/env_chroot.cc +346 -0
  295. package/deps/rocksdb/rocksdb/env/env_chroot.h +22 -0
  296. package/deps/rocksdb/rocksdb/env/env_encryption.cc +1148 -0
  297. package/deps/rocksdb/rocksdb/env/env_encryption_ctr.h +137 -0
  298. package/deps/rocksdb/rocksdb/env/env_hdfs.cc +648 -0
  299. package/deps/rocksdb/rocksdb/env/env_posix.cc +514 -0
  300. package/deps/rocksdb/rocksdb/env/env_test.cc +2230 -0
  301. package/deps/rocksdb/rocksdb/env/file_system.cc +132 -0
  302. package/deps/rocksdb/rocksdb/env/file_system_tracer.cc +448 -0
  303. package/deps/rocksdb/rocksdb/env/file_system_tracer.h +415 -0
  304. package/deps/rocksdb/rocksdb/env/fs_posix.cc +1086 -0
  305. package/deps/rocksdb/rocksdb/env/io_posix.cc +1499 -0
  306. package/deps/rocksdb/rocksdb/env/io_posix.h +402 -0
  307. package/deps/rocksdb/rocksdb/env/io_posix_test.cc +140 -0
  308. package/deps/rocksdb/rocksdb/env/mock_env.cc +1066 -0
  309. package/deps/rocksdb/rocksdb/env/mock_env.h +41 -0
  310. package/deps/rocksdb/rocksdb/env/mock_env_test.cc +85 -0
  311. package/deps/rocksdb/rocksdb/file/delete_scheduler.cc +402 -0
  312. package/deps/rocksdb/rocksdb/file/delete_scheduler.h +150 -0
  313. package/deps/rocksdb/rocksdb/file/delete_scheduler_test.cc +717 -0
  314. package/deps/rocksdb/rocksdb/file/file_prefetch_buffer.cc +156 -0
  315. package/deps/rocksdb/rocksdb/file/file_prefetch_buffer.h +99 -0
  316. package/deps/rocksdb/rocksdb/file/file_util.cc +268 -0
  317. package/deps/rocksdb/rocksdb/file/file_util.h +96 -0
  318. package/deps/rocksdb/rocksdb/file/filename.cc +473 -0
  319. package/deps/rocksdb/rocksdb/file/filename.h +182 -0
  320. package/deps/rocksdb/rocksdb/file/prefetch_test.cc +188 -0
  321. package/deps/rocksdb/rocksdb/file/random_access_file_reader.cc +315 -0
  322. package/deps/rocksdb/rocksdb/file/random_access_file_reader.h +142 -0
  323. package/deps/rocksdb/rocksdb/file/random_access_file_reader_test.cc +482 -0
  324. package/deps/rocksdb/rocksdb/file/read_write_util.cc +67 -0
  325. package/deps/rocksdb/rocksdb/file/read_write_util.h +34 -0
  326. package/deps/rocksdb/rocksdb/file/readahead_raf.cc +169 -0
  327. package/deps/rocksdb/rocksdb/file/readahead_raf.h +29 -0
  328. package/deps/rocksdb/rocksdb/file/sequence_file_reader.cc +237 -0
  329. package/deps/rocksdb/rocksdb/file/sequence_file_reader.h +63 -0
  330. package/deps/rocksdb/rocksdb/file/sst_file_manager_impl.cc +552 -0
  331. package/deps/rocksdb/rocksdb/file/sst_file_manager_impl.h +203 -0
  332. package/deps/rocksdb/rocksdb/file/writable_file_writer.cc +523 -0
  333. package/deps/rocksdb/rocksdb/file/writable_file_writer.h +251 -0
  334. package/deps/rocksdb/rocksdb/hdfs/env_hdfs.h +386 -0
  335. package/deps/rocksdb/rocksdb/include/rocksdb/advanced_options.h +839 -0
  336. package/deps/rocksdb/rocksdb/include/rocksdb/c.h +2218 -0
  337. package/deps/rocksdb/rocksdb/include/rocksdb/cache.h +294 -0
  338. package/deps/rocksdb/rocksdb/include/rocksdb/cleanable.h +71 -0
  339. package/deps/rocksdb/rocksdb/include/rocksdb/compaction_filter.h +214 -0
  340. package/deps/rocksdb/rocksdb/include/rocksdb/compaction_job_stats.h +98 -0
  341. package/deps/rocksdb/rocksdb/include/rocksdb/comparator.h +137 -0
  342. package/deps/rocksdb/rocksdb/include/rocksdb/compression_type.h +40 -0
  343. package/deps/rocksdb/rocksdb/include/rocksdb/concurrent_task_limiter.h +46 -0
  344. package/deps/rocksdb/rocksdb/include/rocksdb/configurable.h +359 -0
  345. package/deps/rocksdb/rocksdb/include/rocksdb/convenience.h +499 -0
  346. package/deps/rocksdb/rocksdb/include/rocksdb/customizable.h +138 -0
  347. package/deps/rocksdb/rocksdb/include/rocksdb/db.h +1697 -0
  348. package/deps/rocksdb/rocksdb/include/rocksdb/db_bench_tool.h +11 -0
  349. package/deps/rocksdb/rocksdb/include/rocksdb/db_dump_tool.h +45 -0
  350. package/deps/rocksdb/rocksdb/include/rocksdb/db_stress_tool.h +11 -0
  351. package/deps/rocksdb/rocksdb/include/rocksdb/env.h +1671 -0
  352. package/deps/rocksdb/rocksdb/include/rocksdb/env_encryption.h +405 -0
  353. package/deps/rocksdb/rocksdb/include/rocksdb/experimental.h +29 -0
  354. package/deps/rocksdb/rocksdb/include/rocksdb/file_checksum.h +129 -0
  355. package/deps/rocksdb/rocksdb/include/rocksdb/file_system.h +1472 -0
  356. package/deps/rocksdb/rocksdb/include/rocksdb/filter_policy.h +238 -0
  357. package/deps/rocksdb/rocksdb/include/rocksdb/flush_block_policy.h +61 -0
  358. package/deps/rocksdb/rocksdb/include/rocksdb/io_status.h +269 -0
  359. package/deps/rocksdb/rocksdb/include/rocksdb/iostats_context.h +56 -0
  360. package/deps/rocksdb/rocksdb/include/rocksdb/iterator.h +128 -0
  361. package/deps/rocksdb/rocksdb/include/rocksdb/ldb_tool.h +43 -0
  362. package/deps/rocksdb/rocksdb/include/rocksdb/listener.h +556 -0
  363. package/deps/rocksdb/rocksdb/include/rocksdb/memory_allocator.h +77 -0
  364. package/deps/rocksdb/rocksdb/include/rocksdb/memtablerep.h +385 -0
  365. package/deps/rocksdb/rocksdb/include/rocksdb/merge_operator.h +257 -0
  366. package/deps/rocksdb/rocksdb/include/rocksdb/metadata.h +155 -0
  367. package/deps/rocksdb/rocksdb/include/rocksdb/options.h +1702 -0
  368. package/deps/rocksdb/rocksdb/include/rocksdb/perf_context.h +237 -0
  369. package/deps/rocksdb/rocksdb/include/rocksdb/perf_level.h +35 -0
  370. package/deps/rocksdb/rocksdb/include/rocksdb/persistent_cache.h +73 -0
  371. package/deps/rocksdb/rocksdb/include/rocksdb/rate_limiter.h +139 -0
  372. package/deps/rocksdb/rocksdb/include/rocksdb/rocksdb_namespace.h +10 -0
  373. package/deps/rocksdb/rocksdb/include/rocksdb/slice.h +269 -0
  374. package/deps/rocksdb/rocksdb/include/rocksdb/slice_transform.h +103 -0
  375. package/deps/rocksdb/rocksdb/include/rocksdb/snapshot.h +48 -0
  376. package/deps/rocksdb/rocksdb/include/rocksdb/sst_dump_tool.h +19 -0
  377. package/deps/rocksdb/rocksdb/include/rocksdb/sst_file_manager.h +136 -0
  378. package/deps/rocksdb/rocksdb/include/rocksdb/sst_file_reader.h +47 -0
  379. package/deps/rocksdb/rocksdb/include/rocksdb/sst_file_writer.h +145 -0
  380. package/deps/rocksdb/rocksdb/include/rocksdb/sst_partitioner.h +135 -0
  381. package/deps/rocksdb/rocksdb/include/rocksdb/statistics.h +592 -0
  382. package/deps/rocksdb/rocksdb/include/rocksdb/stats_history.h +69 -0
  383. package/deps/rocksdb/rocksdb/include/rocksdb/status.h +608 -0
  384. package/deps/rocksdb/rocksdb/include/rocksdb/table.h +711 -0
  385. package/deps/rocksdb/rocksdb/include/rocksdb/table_properties.h +280 -0
  386. package/deps/rocksdb/rocksdb/include/rocksdb/thread_status.h +188 -0
  387. package/deps/rocksdb/rocksdb/include/rocksdb/threadpool.h +58 -0
  388. package/deps/rocksdb/rocksdb/include/rocksdb/trace_reader_writer.h +48 -0
  389. package/deps/rocksdb/rocksdb/include/rocksdb/transaction_log.h +121 -0
  390. package/deps/rocksdb/rocksdb/include/rocksdb/types.h +74 -0
  391. package/deps/rocksdb/rocksdb/include/rocksdb/universal_compaction.h +86 -0
  392. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/backupable_db.h +535 -0
  393. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/checkpoint.h +61 -0
  394. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/convenience.h +10 -0
  395. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/db_ttl.h +72 -0
  396. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/debug.h +49 -0
  397. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/env_librados.h +175 -0
  398. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/env_mirror.h +180 -0
  399. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/info_log_finder.h +19 -0
  400. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/ldb_cmd.h +288 -0
  401. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/ldb_cmd_execute_result.h +71 -0
  402. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/leveldb_options.h +145 -0
  403. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/lua/rocks_lua_custom_library.h +43 -0
  404. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/lua/rocks_lua_util.h +55 -0
  405. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/memory_util.h +50 -0
  406. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/object_registry.h +205 -0
  407. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/optimistic_transaction_db.h +100 -0
  408. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/option_change_migration.h +19 -0
  409. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/options_type.h +876 -0
  410. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/options_util.h +128 -0
  411. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/sim_cache.h +94 -0
  412. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/stackable_db.h +504 -0
  413. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/table_properties_collectors.h +95 -0
  414. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/transaction.h +626 -0
  415. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/transaction_db.h +432 -0
  416. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/transaction_db_mutex.h +92 -0
  417. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/utility_db.h +34 -0
  418. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/write_batch_with_index.h +279 -0
  419. package/deps/rocksdb/rocksdb/include/rocksdb/version.h +16 -0
  420. package/deps/rocksdb/rocksdb/include/rocksdb/wal_filter.h +102 -0
  421. package/deps/rocksdb/rocksdb/include/rocksdb/write_batch.h +377 -0
  422. package/deps/rocksdb/rocksdb/include/rocksdb/write_batch_base.h +127 -0
  423. package/deps/rocksdb/rocksdb/include/rocksdb/write_buffer_manager.h +106 -0
  424. package/deps/rocksdb/rocksdb/logging/auto_roll_logger.cc +300 -0
  425. package/deps/rocksdb/rocksdb/logging/auto_roll_logger.h +165 -0
  426. package/deps/rocksdb/rocksdb/logging/auto_roll_logger_test.cc +684 -0
  427. package/deps/rocksdb/rocksdb/logging/env_logger.h +165 -0
  428. package/deps/rocksdb/rocksdb/logging/env_logger_test.cc +162 -0
  429. package/deps/rocksdb/rocksdb/logging/event_logger.cc +70 -0
  430. package/deps/rocksdb/rocksdb/logging/event_logger.h +203 -0
  431. package/deps/rocksdb/rocksdb/logging/event_logger_test.cc +43 -0
  432. package/deps/rocksdb/rocksdb/logging/log_buffer.cc +92 -0
  433. package/deps/rocksdb/rocksdb/logging/log_buffer.h +56 -0
  434. package/deps/rocksdb/rocksdb/logging/logging.h +68 -0
  435. package/deps/rocksdb/rocksdb/logging/posix_logger.h +185 -0
  436. package/deps/rocksdb/rocksdb/memory/allocator.h +57 -0
  437. package/deps/rocksdb/rocksdb/memory/arena.cc +233 -0
  438. package/deps/rocksdb/rocksdb/memory/arena.h +141 -0
  439. package/deps/rocksdb/rocksdb/memory/arena_test.cc +204 -0
  440. package/deps/rocksdb/rocksdb/memory/concurrent_arena.cc +47 -0
  441. package/deps/rocksdb/rocksdb/memory/concurrent_arena.h +218 -0
  442. package/deps/rocksdb/rocksdb/memory/jemalloc_nodump_allocator.cc +206 -0
  443. package/deps/rocksdb/rocksdb/memory/jemalloc_nodump_allocator.h +78 -0
  444. package/deps/rocksdb/rocksdb/memory/memkind_kmem_allocator.cc +33 -0
  445. package/deps/rocksdb/rocksdb/memory/memkind_kmem_allocator.h +27 -0
  446. package/deps/rocksdb/rocksdb/memory/memkind_kmem_allocator_test.cc +102 -0
  447. package/deps/rocksdb/rocksdb/memory/memory_allocator.h +38 -0
  448. package/deps/rocksdb/rocksdb/memory/memory_usage.h +25 -0
  449. package/deps/rocksdb/rocksdb/memtable/alloc_tracker.cc +62 -0
  450. package/deps/rocksdb/rocksdb/memtable/hash_linklist_rep.cc +844 -0
  451. package/deps/rocksdb/rocksdb/memtable/hash_linklist_rep.h +49 -0
  452. package/deps/rocksdb/rocksdb/memtable/hash_skiplist_rep.cc +349 -0
  453. package/deps/rocksdb/rocksdb/memtable/hash_skiplist_rep.h +44 -0
  454. package/deps/rocksdb/rocksdb/memtable/inlineskiplist.h +997 -0
  455. package/deps/rocksdb/rocksdb/memtable/inlineskiplist_test.cc +663 -0
  456. package/deps/rocksdb/rocksdb/memtable/memtablerep_bench.cc +677 -0
  457. package/deps/rocksdb/rocksdb/memtable/skiplist.h +496 -0
  458. package/deps/rocksdb/rocksdb/memtable/skiplist_test.cc +388 -0
  459. package/deps/rocksdb/rocksdb/memtable/skiplistrep.cc +280 -0
  460. package/deps/rocksdb/rocksdb/memtable/stl_wrappers.h +33 -0
  461. package/deps/rocksdb/rocksdb/memtable/vectorrep.cc +301 -0
  462. package/deps/rocksdb/rocksdb/memtable/write_buffer_manager.cc +148 -0
  463. package/deps/rocksdb/rocksdb/memtable/write_buffer_manager_test.cc +203 -0
  464. package/deps/rocksdb/rocksdb/monitoring/file_read_sample.h +23 -0
  465. package/deps/rocksdb/rocksdb/monitoring/histogram.cc +287 -0
  466. package/deps/rocksdb/rocksdb/monitoring/histogram.h +149 -0
  467. package/deps/rocksdb/rocksdb/monitoring/histogram_test.cc +231 -0
  468. package/deps/rocksdb/rocksdb/monitoring/histogram_windowing.cc +200 -0
  469. package/deps/rocksdb/rocksdb/monitoring/histogram_windowing.h +84 -0
  470. package/deps/rocksdb/rocksdb/monitoring/in_memory_stats_history.cc +49 -0
  471. package/deps/rocksdb/rocksdb/monitoring/in_memory_stats_history.h +74 -0
  472. package/deps/rocksdb/rocksdb/monitoring/instrumented_mutex.cc +71 -0
  473. package/deps/rocksdb/rocksdb/monitoring/instrumented_mutex.h +98 -0
  474. package/deps/rocksdb/rocksdb/monitoring/iostats_context.cc +62 -0
  475. package/deps/rocksdb/rocksdb/monitoring/iostats_context_imp.h +60 -0
  476. package/deps/rocksdb/rocksdb/monitoring/iostats_context_test.cc +29 -0
  477. package/deps/rocksdb/rocksdb/monitoring/perf_context.cc +566 -0
  478. package/deps/rocksdb/rocksdb/monitoring/perf_context_imp.h +97 -0
  479. package/deps/rocksdb/rocksdb/monitoring/perf_level.cc +28 -0
  480. package/deps/rocksdb/rocksdb/monitoring/perf_level_imp.h +18 -0
  481. package/deps/rocksdb/rocksdb/monitoring/perf_step_timer.h +79 -0
  482. package/deps/rocksdb/rocksdb/monitoring/persistent_stats_history.cc +169 -0
  483. package/deps/rocksdb/rocksdb/monitoring/persistent_stats_history.h +83 -0
  484. package/deps/rocksdb/rocksdb/monitoring/statistics.cc +431 -0
  485. package/deps/rocksdb/rocksdb/monitoring/statistics.h +138 -0
  486. package/deps/rocksdb/rocksdb/monitoring/statistics_test.cc +47 -0
  487. package/deps/rocksdb/rocksdb/monitoring/stats_history_test.cc +652 -0
  488. package/deps/rocksdb/rocksdb/monitoring/thread_status_impl.cc +163 -0
  489. package/deps/rocksdb/rocksdb/monitoring/thread_status_updater.cc +314 -0
  490. package/deps/rocksdb/rocksdb/monitoring/thread_status_updater.h +233 -0
  491. package/deps/rocksdb/rocksdb/monitoring/thread_status_updater_debug.cc +43 -0
  492. package/deps/rocksdb/rocksdb/monitoring/thread_status_util.cc +206 -0
  493. package/deps/rocksdb/rocksdb/monitoring/thread_status_util.h +134 -0
  494. package/deps/rocksdb/rocksdb/monitoring/thread_status_util_debug.cc +32 -0
  495. package/deps/rocksdb/rocksdb/options/cf_options.cc +1026 -0
  496. package/deps/rocksdb/rocksdb/options/cf_options.h +308 -0
  497. package/deps/rocksdb/rocksdb/options/configurable.cc +681 -0
  498. package/deps/rocksdb/rocksdb/options/configurable_helper.h +251 -0
  499. package/deps/rocksdb/rocksdb/options/configurable_test.cc +757 -0
  500. package/deps/rocksdb/rocksdb/options/configurable_test.h +127 -0
  501. package/deps/rocksdb/rocksdb/options/customizable.cc +77 -0
  502. package/deps/rocksdb/rocksdb/options/customizable_helper.h +216 -0
  503. package/deps/rocksdb/rocksdb/options/customizable_test.cc +625 -0
  504. package/deps/rocksdb/rocksdb/options/db_options.cc +835 -0
  505. package/deps/rocksdb/rocksdb/options/db_options.h +126 -0
  506. package/deps/rocksdb/rocksdb/options/options.cc +664 -0
  507. package/deps/rocksdb/rocksdb/options/options_helper.cc +1391 -0
  508. package/deps/rocksdb/rocksdb/options/options_helper.h +118 -0
  509. package/deps/rocksdb/rocksdb/options/options_parser.cc +721 -0
  510. package/deps/rocksdb/rocksdb/options/options_parser.h +151 -0
  511. package/deps/rocksdb/rocksdb/options/options_settable_test.cc +583 -0
  512. package/deps/rocksdb/rocksdb/options/options_test.cc +3794 -0
  513. package/deps/rocksdb/rocksdb/port/jemalloc_helper.h +106 -0
  514. package/deps/rocksdb/rocksdb/port/lang.h +16 -0
  515. package/deps/rocksdb/rocksdb/port/likely.h +18 -0
  516. package/deps/rocksdb/rocksdb/port/malloc.h +17 -0
  517. package/deps/rocksdb/rocksdb/port/port.h +21 -0
  518. package/deps/rocksdb/rocksdb/port/port_dirent.h +44 -0
  519. package/deps/rocksdb/rocksdb/port/port_example.h +101 -0
  520. package/deps/rocksdb/rocksdb/port/port_posix.cc +266 -0
  521. package/deps/rocksdb/rocksdb/port/port_posix.h +223 -0
  522. package/deps/rocksdb/rocksdb/port/stack_trace.cc +179 -0
  523. package/deps/rocksdb/rocksdb/port/stack_trace.h +28 -0
  524. package/deps/rocksdb/rocksdb/port/sys_time.h +47 -0
  525. package/deps/rocksdb/rocksdb/port/util_logger.h +20 -0
  526. package/deps/rocksdb/rocksdb/port/win/env_default.cc +45 -0
  527. package/deps/rocksdb/rocksdb/port/win/env_win.cc +1449 -0
  528. package/deps/rocksdb/rocksdb/port/win/env_win.h +294 -0
  529. package/deps/rocksdb/rocksdb/port/win/io_win.cc +1084 -0
  530. package/deps/rocksdb/rocksdb/port/win/io_win.h +494 -0
  531. package/deps/rocksdb/rocksdb/port/win/port_win.cc +283 -0
  532. package/deps/rocksdb/rocksdb/port/win/port_win.h +411 -0
  533. package/deps/rocksdb/rocksdb/port/win/win_jemalloc.cc +79 -0
  534. package/deps/rocksdb/rocksdb/port/win/win_logger.cc +194 -0
  535. package/deps/rocksdb/rocksdb/port/win/win_logger.h +67 -0
  536. package/deps/rocksdb/rocksdb/port/win/win_thread.cc +183 -0
  537. package/deps/rocksdb/rocksdb/port/win/win_thread.h +122 -0
  538. package/deps/rocksdb/rocksdb/port/win/xpress_win.cc +221 -0
  539. package/deps/rocksdb/rocksdb/port/win/xpress_win.h +26 -0
  540. package/deps/rocksdb/rocksdb/port/xpress.h +17 -0
  541. package/deps/rocksdb/rocksdb/src.mk +631 -0
  542. package/deps/rocksdb/rocksdb/table/adaptive/adaptive_table_factory.cc +126 -0
  543. package/deps/rocksdb/rocksdb/table/adaptive/adaptive_table_factory.h +57 -0
  544. package/deps/rocksdb/rocksdb/table/block_based/binary_search_index_reader.cc +73 -0
  545. package/deps/rocksdb/rocksdb/table/block_based/binary_search_index_reader.h +48 -0
  546. package/deps/rocksdb/rocksdb/table/block_based/block.cc +1049 -0
  547. package/deps/rocksdb/rocksdb/table/block_based/block.h +720 -0
  548. package/deps/rocksdb/rocksdb/table/block_based/block_based_filter_block.cc +348 -0
  549. package/deps/rocksdb/rocksdb/table/block_based/block_based_filter_block.h +119 -0
  550. package/deps/rocksdb/rocksdb/table/block_based/block_based_filter_block_test.cc +434 -0
  551. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_builder.cc +1835 -0
  552. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_builder.h +193 -0
  553. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_factory.cc +839 -0
  554. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_factory.h +95 -0
  555. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_iterator.cc +383 -0
  556. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_iterator.h +251 -0
  557. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader.cc +3563 -0
  558. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader.h +681 -0
  559. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader_impl.h +190 -0
  560. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader_test.cc +347 -0
  561. package/deps/rocksdb/rocksdb/table/block_based/block_builder.cc +201 -0
  562. package/deps/rocksdb/rocksdb/table/block_based/block_builder.h +78 -0
  563. package/deps/rocksdb/rocksdb/table/block_based/block_prefetcher.cc +66 -0
  564. package/deps/rocksdb/rocksdb/table/block_based/block_prefetcher.h +32 -0
  565. package/deps/rocksdb/rocksdb/table/block_based/block_prefix_index.cc +232 -0
  566. package/deps/rocksdb/rocksdb/table/block_based/block_prefix_index.h +66 -0
  567. package/deps/rocksdb/rocksdb/table/block_based/block_test.cc +623 -0
  568. package/deps/rocksdb/rocksdb/table/block_based/block_type.h +30 -0
  569. package/deps/rocksdb/rocksdb/table/block_based/cachable_entry.h +220 -0
  570. package/deps/rocksdb/rocksdb/table/block_based/data_block_footer.cc +59 -0
  571. package/deps/rocksdb/rocksdb/table/block_based/data_block_footer.h +25 -0
  572. package/deps/rocksdb/rocksdb/table/block_based/data_block_hash_index.cc +93 -0
  573. package/deps/rocksdb/rocksdb/table/block_based/data_block_hash_index.h +136 -0
  574. package/deps/rocksdb/rocksdb/table/block_based/data_block_hash_index_test.cc +717 -0
  575. package/deps/rocksdb/rocksdb/table/block_based/filter_block.h +180 -0
  576. package/deps/rocksdb/rocksdb/table/block_based/filter_block_reader_common.cc +102 -0
  577. package/deps/rocksdb/rocksdb/table/block_based/filter_block_reader_common.h +55 -0
  578. package/deps/rocksdb/rocksdb/table/block_based/filter_policy.cc +1407 -0
  579. package/deps/rocksdb/rocksdb/table/block_based/filter_policy_internal.h +168 -0
  580. package/deps/rocksdb/rocksdb/table/block_based/flush_block_policy.cc +88 -0
  581. package/deps/rocksdb/rocksdb/table/block_based/flush_block_policy.h +41 -0
  582. package/deps/rocksdb/rocksdb/table/block_based/full_filter_block.cc +344 -0
  583. package/deps/rocksdb/rocksdb/table/block_based/full_filter_block.h +139 -0
  584. package/deps/rocksdb/rocksdb/table/block_based/full_filter_block_test.cc +333 -0
  585. package/deps/rocksdb/rocksdb/table/block_based/hash_index_reader.cc +147 -0
  586. package/deps/rocksdb/rocksdb/table/block_based/hash_index_reader.h +49 -0
  587. package/deps/rocksdb/rocksdb/table/block_based/index_builder.cc +248 -0
  588. package/deps/rocksdb/rocksdb/table/block_based/index_builder.h +444 -0
  589. package/deps/rocksdb/rocksdb/table/block_based/index_reader_common.cc +54 -0
  590. package/deps/rocksdb/rocksdb/table/block_based/index_reader_common.h +85 -0
  591. package/deps/rocksdb/rocksdb/table/block_based/mock_block_based_table.h +56 -0
  592. package/deps/rocksdb/rocksdb/table/block_based/parsed_full_filter_block.cc +22 -0
  593. package/deps/rocksdb/rocksdb/table/block_based/parsed_full_filter_block.h +40 -0
  594. package/deps/rocksdb/rocksdb/table/block_based/partitioned_filter_block.cc +521 -0
  595. package/deps/rocksdb/rocksdb/table/block_based/partitioned_filter_block.h +144 -0
  596. package/deps/rocksdb/rocksdb/table/block_based/partitioned_filter_block_test.cc +424 -0
  597. package/deps/rocksdb/rocksdb/table/block_based/partitioned_index_iterator.cc +163 -0
  598. package/deps/rocksdb/rocksdb/table/block_based/partitioned_index_iterator.h +142 -0
  599. package/deps/rocksdb/rocksdb/table/block_based/partitioned_index_reader.cc +186 -0
  600. package/deps/rocksdb/rocksdb/table/block_based/partitioned_index_reader.h +51 -0
  601. package/deps/rocksdb/rocksdb/table/block_based/reader_common.cc +64 -0
  602. package/deps/rocksdb/rocksdb/table/block_based/reader_common.h +38 -0
  603. package/deps/rocksdb/rocksdb/table/block_based/uncompression_dict_reader.cc +120 -0
  604. package/deps/rocksdb/rocksdb/table/block_based/uncompression_dict_reader.h +59 -0
  605. package/deps/rocksdb/rocksdb/table/block_fetcher.cc +324 -0
  606. package/deps/rocksdb/rocksdb/table/block_fetcher.h +129 -0
  607. package/deps/rocksdb/rocksdb/table/block_fetcher_test.cc +534 -0
  608. package/deps/rocksdb/rocksdb/table/cleanable_test.cc +277 -0
  609. package/deps/rocksdb/rocksdb/table/cuckoo/cuckoo_table_builder.cc +543 -0
  610. package/deps/rocksdb/rocksdb/table/cuckoo/cuckoo_table_builder.h +136 -0
  611. package/deps/rocksdb/rocksdb/table/cuckoo/cuckoo_table_builder_test.cc +663 -0
  612. package/deps/rocksdb/rocksdb/table/cuckoo/cuckoo_table_factory.cc +107 -0
  613. package/deps/rocksdb/rocksdb/table/cuckoo/cuckoo_table_factory.h +81 -0
  614. package/deps/rocksdb/rocksdb/table/cuckoo/cuckoo_table_reader.cc +404 -0
  615. package/deps/rocksdb/rocksdb/table/cuckoo/cuckoo_table_reader.h +101 -0
  616. package/deps/rocksdb/rocksdb/table/cuckoo/cuckoo_table_reader_test.cc +585 -0
  617. package/deps/rocksdb/rocksdb/table/format.cc +422 -0
  618. package/deps/rocksdb/rocksdb/table/format.h +348 -0
  619. package/deps/rocksdb/rocksdb/table/get_context.cc +408 -0
  620. package/deps/rocksdb/rocksdb/table/get_context.h +212 -0
  621. package/deps/rocksdb/rocksdb/table/internal_iterator.h +205 -0
  622. package/deps/rocksdb/rocksdb/table/iter_heap.h +42 -0
  623. package/deps/rocksdb/rocksdb/table/iterator.cc +210 -0
  624. package/deps/rocksdb/rocksdb/table/iterator_wrapper.h +180 -0
  625. package/deps/rocksdb/rocksdb/table/merger_test.cc +180 -0
  626. package/deps/rocksdb/rocksdb/table/merging_iterator.cc +481 -0
  627. package/deps/rocksdb/rocksdb/table/merging_iterator.h +64 -0
  628. package/deps/rocksdb/rocksdb/table/meta_blocks.cc +541 -0
  629. package/deps/rocksdb/rocksdb/table/meta_blocks.h +154 -0
  630. package/deps/rocksdb/rocksdb/table/mock_table.cc +328 -0
  631. package/deps/rocksdb/rocksdb/table/mock_table.h +89 -0
  632. package/deps/rocksdb/rocksdb/table/multiget_context.h +282 -0
  633. package/deps/rocksdb/rocksdb/table/persistent_cache_helper.cc +116 -0
  634. package/deps/rocksdb/rocksdb/table/persistent_cache_helper.h +44 -0
  635. package/deps/rocksdb/rocksdb/table/persistent_cache_options.h +34 -0
  636. package/deps/rocksdb/rocksdb/table/plain/plain_table_bloom.cc +78 -0
  637. package/deps/rocksdb/rocksdb/table/plain/plain_table_bloom.h +135 -0
  638. package/deps/rocksdb/rocksdb/table/plain/plain_table_builder.cc +332 -0
  639. package/deps/rocksdb/rocksdb/table/plain/plain_table_builder.h +153 -0
  640. package/deps/rocksdb/rocksdb/table/plain/plain_table_factory.cc +263 -0
  641. package/deps/rocksdb/rocksdb/table/plain/plain_table_factory.h +182 -0
  642. package/deps/rocksdb/rocksdb/table/plain/plain_table_index.cc +211 -0
  643. package/deps/rocksdb/rocksdb/table/plain/plain_table_index.h +249 -0
  644. package/deps/rocksdb/rocksdb/table/plain/plain_table_key_coding.cc +506 -0
  645. package/deps/rocksdb/rocksdb/table/plain/plain_table_key_coding.h +201 -0
  646. package/deps/rocksdb/rocksdb/table/plain/plain_table_reader.cc +781 -0
  647. package/deps/rocksdb/rocksdb/table/plain/plain_table_reader.h +247 -0
  648. package/deps/rocksdb/rocksdb/table/scoped_arena_iterator.h +61 -0
  649. package/deps/rocksdb/rocksdb/table/sst_file_dumper.cc +502 -0
  650. package/deps/rocksdb/rocksdb/table/sst_file_dumper.h +96 -0
  651. package/deps/rocksdb/rocksdb/table/sst_file_reader.cc +98 -0
  652. package/deps/rocksdb/rocksdb/table/sst_file_reader_test.cc +228 -0
  653. package/deps/rocksdb/rocksdb/table/sst_file_writer.cc +340 -0
  654. package/deps/rocksdb/rocksdb/table/sst_file_writer_collectors.h +94 -0
  655. package/deps/rocksdb/rocksdb/table/table_builder.h +203 -0
  656. package/deps/rocksdb/rocksdb/table/table_factory.cc +38 -0
  657. package/deps/rocksdb/rocksdb/table/table_properties.cc +300 -0
  658. package/deps/rocksdb/rocksdb/table/table_properties_internal.h +30 -0
  659. package/deps/rocksdb/rocksdb/table/table_reader.h +147 -0
  660. package/deps/rocksdb/rocksdb/table/table_reader_bench.cc +347 -0
  661. package/deps/rocksdb/rocksdb/table/table_reader_caller.h +39 -0
  662. package/deps/rocksdb/rocksdb/table/table_test.cc +4769 -0
  663. package/deps/rocksdb/rocksdb/table/two_level_iterator.cc +215 -0
  664. package/deps/rocksdb/rocksdb/table/two_level_iterator.h +43 -0
  665. package/deps/rocksdb/rocksdb/test_util/mock_time_env.cc +38 -0
  666. package/deps/rocksdb/rocksdb/test_util/mock_time_env.h +74 -0
  667. package/deps/rocksdb/rocksdb/test_util/sync_point.cc +93 -0
  668. package/deps/rocksdb/rocksdb/test_util/sync_point.h +161 -0
  669. package/deps/rocksdb/rocksdb/test_util/sync_point_impl.cc +129 -0
  670. package/deps/rocksdb/rocksdb/test_util/sync_point_impl.h +74 -0
  671. package/deps/rocksdb/rocksdb/test_util/testharness.cc +56 -0
  672. package/deps/rocksdb/rocksdb/test_util/testharness.h +53 -0
  673. package/deps/rocksdb/rocksdb/test_util/testutil.cc +566 -0
  674. package/deps/rocksdb/rocksdb/test_util/testutil.h +887 -0
  675. package/deps/rocksdb/rocksdb/test_util/testutil_test.cc +43 -0
  676. package/deps/rocksdb/rocksdb/test_util/transaction_test_util.cc +388 -0
  677. package/deps/rocksdb/rocksdb/test_util/transaction_test_util.h +132 -0
  678. package/deps/rocksdb/rocksdb/third-party/folly/folly/CPortability.h +27 -0
  679. package/deps/rocksdb/rocksdb/third-party/folly/folly/ConstexprMath.h +45 -0
  680. package/deps/rocksdb/rocksdb/third-party/folly/folly/Indestructible.h +166 -0
  681. package/deps/rocksdb/rocksdb/third-party/folly/folly/Optional.h +570 -0
  682. package/deps/rocksdb/rocksdb/third-party/folly/folly/Portability.h +92 -0
  683. package/deps/rocksdb/rocksdb/third-party/folly/folly/ScopeGuard.h +54 -0
  684. package/deps/rocksdb/rocksdb/third-party/folly/folly/Traits.h +152 -0
  685. package/deps/rocksdb/rocksdb/third-party/folly/folly/Unit.h +59 -0
  686. package/deps/rocksdb/rocksdb/third-party/folly/folly/Utility.h +141 -0
  687. package/deps/rocksdb/rocksdb/third-party/folly/folly/chrono/Hardware.h +33 -0
  688. package/deps/rocksdb/rocksdb/third-party/folly/folly/container/Array.h +74 -0
  689. package/deps/rocksdb/rocksdb/third-party/folly/folly/detail/Futex-inl.h +117 -0
  690. package/deps/rocksdb/rocksdb/third-party/folly/folly/detail/Futex.cpp +263 -0
  691. package/deps/rocksdb/rocksdb/third-party/folly/folly/detail/Futex.h +96 -0
  692. package/deps/rocksdb/rocksdb/third-party/folly/folly/functional/Invoke.h +40 -0
  693. package/deps/rocksdb/rocksdb/third-party/folly/folly/hash/Hash.h +29 -0
  694. package/deps/rocksdb/rocksdb/third-party/folly/folly/lang/Align.h +144 -0
  695. package/deps/rocksdb/rocksdb/third-party/folly/folly/lang/Bits.h +30 -0
  696. package/deps/rocksdb/rocksdb/third-party/folly/folly/lang/Launder.h +51 -0
  697. package/deps/rocksdb/rocksdb/third-party/folly/folly/portability/Asm.h +28 -0
  698. package/deps/rocksdb/rocksdb/third-party/folly/folly/portability/SysSyscall.h +10 -0
  699. package/deps/rocksdb/rocksdb/third-party/folly/folly/portability/SysTypes.h +26 -0
  700. package/deps/rocksdb/rocksdb/third-party/folly/folly/synchronization/AtomicNotification-inl.h +138 -0
  701. package/deps/rocksdb/rocksdb/third-party/folly/folly/synchronization/AtomicNotification.cpp +23 -0
  702. package/deps/rocksdb/rocksdb/third-party/folly/folly/synchronization/AtomicNotification.h +57 -0
  703. package/deps/rocksdb/rocksdb/third-party/folly/folly/synchronization/AtomicUtil-inl.h +260 -0
  704. package/deps/rocksdb/rocksdb/third-party/folly/folly/synchronization/AtomicUtil.h +52 -0
  705. package/deps/rocksdb/rocksdb/third-party/folly/folly/synchronization/Baton.h +328 -0
  706. package/deps/rocksdb/rocksdb/third-party/folly/folly/synchronization/DistributedMutex-inl.h +1703 -0
  707. package/deps/rocksdb/rocksdb/third-party/folly/folly/synchronization/DistributedMutex.cpp +16 -0
  708. package/deps/rocksdb/rocksdb/third-party/folly/folly/synchronization/DistributedMutex.h +304 -0
  709. package/deps/rocksdb/rocksdb/third-party/folly/folly/synchronization/DistributedMutexSpecializations.h +39 -0
  710. package/deps/rocksdb/rocksdb/third-party/folly/folly/synchronization/ParkingLot.cpp +26 -0
  711. package/deps/rocksdb/rocksdb/third-party/folly/folly/synchronization/ParkingLot.h +318 -0
  712. package/deps/rocksdb/rocksdb/third-party/folly/folly/synchronization/WaitOptions.cpp +12 -0
  713. package/deps/rocksdb/rocksdb/third-party/folly/folly/synchronization/WaitOptions.h +57 -0
  714. package/deps/rocksdb/rocksdb/third-party/folly/folly/synchronization/detail/InlineFunctionRef.h +219 -0
  715. package/deps/rocksdb/rocksdb/third-party/folly/folly/synchronization/detail/ProxyLockable-inl.h +207 -0
  716. package/deps/rocksdb/rocksdb/third-party/folly/folly/synchronization/detail/ProxyLockable.h +164 -0
  717. package/deps/rocksdb/rocksdb/third-party/folly/folly/synchronization/detail/Sleeper.h +57 -0
  718. package/deps/rocksdb/rocksdb/third-party/folly/folly/synchronization/detail/Spin.h +77 -0
  719. package/deps/rocksdb/rocksdb/third-party/gcc/ppc-asm.h +390 -0
  720. package/deps/rocksdb/rocksdb/thirdparty.inc +268 -0
  721. package/deps/rocksdb/rocksdb/tools/CMakeLists.txt +30 -0
  722. package/deps/rocksdb/rocksdb/tools/blob_dump.cc +110 -0
  723. package/deps/rocksdb/rocksdb/tools/block_cache_analyzer/__init__.py +2 -0
  724. package/deps/rocksdb/rocksdb/tools/block_cache_analyzer/block_cache_pysim.py +2000 -0
  725. package/deps/rocksdb/rocksdb/tools/block_cache_analyzer/block_cache_pysim.sh +156 -0
  726. package/deps/rocksdb/rocksdb/tools/block_cache_analyzer/block_cache_pysim_test.py +734 -0
  727. package/deps/rocksdb/rocksdb/tools/block_cache_analyzer/block_cache_trace_analyzer.cc +2307 -0
  728. package/deps/rocksdb/rocksdb/tools/block_cache_analyzer/block_cache_trace_analyzer.h +395 -0
  729. package/deps/rocksdb/rocksdb/tools/block_cache_analyzer/block_cache_trace_analyzer_plot.py +721 -0
  730. package/deps/rocksdb/rocksdb/tools/block_cache_analyzer/block_cache_trace_analyzer_test.cc +719 -0
  731. package/deps/rocksdb/rocksdb/tools/block_cache_analyzer/block_cache_trace_analyzer_tool.cc +25 -0
  732. package/deps/rocksdb/rocksdb/tools/db_bench.cc +21 -0
  733. package/deps/rocksdb/rocksdb/tools/db_bench_tool.cc +7416 -0
  734. package/deps/rocksdb/rocksdb/tools/db_bench_tool_test.cc +328 -0
  735. package/deps/rocksdb/rocksdb/tools/db_repl_stress.cc +130 -0
  736. package/deps/rocksdb/rocksdb/tools/db_sanity_test.cc +297 -0
  737. package/deps/rocksdb/rocksdb/tools/dump/db_dump_tool.cc +259 -0
  738. package/deps/rocksdb/rocksdb/tools/dump/rocksdb_dump.cc +63 -0
  739. package/deps/rocksdb/rocksdb/tools/dump/rocksdb_undump.cc +62 -0
  740. package/deps/rocksdb/rocksdb/tools/io_tracer_parser.cc +25 -0
  741. package/deps/rocksdb/rocksdb/tools/io_tracer_parser_test.cc +187 -0
  742. package/deps/rocksdb/rocksdb/tools/io_tracer_parser_tool.cc +120 -0
  743. package/deps/rocksdb/rocksdb/tools/io_tracer_parser_tool.h +40 -0
  744. package/deps/rocksdb/rocksdb/tools/ldb.cc +21 -0
  745. package/deps/rocksdb/rocksdb/tools/ldb_cmd.cc +3609 -0
  746. package/deps/rocksdb/rocksdb/tools/ldb_cmd_impl.h +665 -0
  747. package/deps/rocksdb/rocksdb/tools/ldb_cmd_test.cc +746 -0
  748. package/deps/rocksdb/rocksdb/tools/ldb_tool.cc +159 -0
  749. package/deps/rocksdb/rocksdb/tools/reduce_levels_test.cc +221 -0
  750. package/deps/rocksdb/rocksdb/tools/sst_dump.cc +20 -0
  751. package/deps/rocksdb/rocksdb/tools/sst_dump_test.cc +427 -0
  752. package/deps/rocksdb/rocksdb/tools/sst_dump_tool.cc +541 -0
  753. package/deps/rocksdb/rocksdb/tools/trace_analyzer.cc +25 -0
  754. package/deps/rocksdb/rocksdb/tools/trace_analyzer_test.cc +752 -0
  755. package/deps/rocksdb/rocksdb/tools/trace_analyzer_tool.cc +2001 -0
  756. package/deps/rocksdb/rocksdb/tools/trace_analyzer_tool.h +292 -0
  757. package/deps/rocksdb/rocksdb/tools/write_stress.cc +305 -0
  758. package/deps/rocksdb/rocksdb/trace_replay/block_cache_tracer.cc +496 -0
  759. package/deps/rocksdb/rocksdb/trace_replay/block_cache_tracer.h +294 -0
  760. package/deps/rocksdb/rocksdb/trace_replay/block_cache_tracer_test.cc +379 -0
  761. package/deps/rocksdb/rocksdb/trace_replay/io_tracer.cc +229 -0
  762. package/deps/rocksdb/rocksdb/trace_replay/io_tracer.h +174 -0
  763. package/deps/rocksdb/rocksdb/trace_replay/io_tracer_test.cc +215 -0
  764. package/deps/rocksdb/rocksdb/trace_replay/trace_replay.cc +491 -0
  765. package/deps/rocksdb/rocksdb/trace_replay/trace_replay.h +195 -0
  766. package/deps/rocksdb/rocksdb/util/aligned_buffer.h +255 -0
  767. package/deps/rocksdb/rocksdb/util/autovector.h +367 -0
  768. package/deps/rocksdb/rocksdb/util/autovector_test.cc +330 -0
  769. package/deps/rocksdb/rocksdb/util/bloom_impl.h +485 -0
  770. package/deps/rocksdb/rocksdb/util/bloom_test.cc +1191 -0
  771. package/deps/rocksdb/rocksdb/util/build_version.cc.in +5 -0
  772. package/deps/rocksdb/rocksdb/util/build_version.h +15 -0
  773. package/deps/rocksdb/rocksdb/util/cast_util.h +20 -0
  774. package/deps/rocksdb/rocksdb/util/channel.h +67 -0
  775. package/deps/rocksdb/rocksdb/util/coding.cc +89 -0
  776. package/deps/rocksdb/rocksdb/util/coding.h +419 -0
  777. package/deps/rocksdb/rocksdb/util/coding_lean.h +101 -0
  778. package/deps/rocksdb/rocksdb/util/coding_test.cc +217 -0
  779. package/deps/rocksdb/rocksdb/util/compaction_job_stats_impl.cc +92 -0
  780. package/deps/rocksdb/rocksdb/util/comparator.cc +219 -0
  781. package/deps/rocksdb/rocksdb/util/compression.h +1529 -0
  782. package/deps/rocksdb/rocksdb/util/compression_context_cache.cc +108 -0
  783. package/deps/rocksdb/rocksdb/util/compression_context_cache.h +47 -0
  784. package/deps/rocksdb/rocksdb/util/concurrent_task_limiter_impl.cc +67 -0
  785. package/deps/rocksdb/rocksdb/util/concurrent_task_limiter_impl.h +67 -0
  786. package/deps/rocksdb/rocksdb/util/core_local.h +83 -0
  787. package/deps/rocksdb/rocksdb/util/crc32c.cc +1283 -0
  788. package/deps/rocksdb/rocksdb/util/crc32c.h +51 -0
  789. package/deps/rocksdb/rocksdb/util/crc32c_arm64.cc +169 -0
  790. package/deps/rocksdb/rocksdb/util/crc32c_arm64.h +50 -0
  791. package/deps/rocksdb/rocksdb/util/crc32c_ppc.c +94 -0
  792. package/deps/rocksdb/rocksdb/util/crc32c_ppc.h +19 -0
  793. package/deps/rocksdb/rocksdb/util/crc32c_ppc_asm.S +756 -0
  794. package/deps/rocksdb/rocksdb/util/crc32c_ppc_constants.h +900 -0
  795. package/deps/rocksdb/rocksdb/util/crc32c_test.cc +180 -0
  796. package/deps/rocksdb/rocksdb/util/defer.h +52 -0
  797. package/deps/rocksdb/rocksdb/util/defer_test.cc +39 -0
  798. package/deps/rocksdb/rocksdb/util/duplicate_detector.h +68 -0
  799. package/deps/rocksdb/rocksdb/util/dynamic_bloom.cc +70 -0
  800. package/deps/rocksdb/rocksdb/util/dynamic_bloom.h +214 -0
  801. package/deps/rocksdb/rocksdb/util/dynamic_bloom_test.cc +323 -0
  802. package/deps/rocksdb/rocksdb/util/fastrange.h +112 -0
  803. package/deps/rocksdb/rocksdb/util/file_checksum_helper.cc +136 -0
  804. package/deps/rocksdb/rocksdb/util/file_checksum_helper.h +98 -0
  805. package/deps/rocksdb/rocksdb/util/file_reader_writer_test.cc +449 -0
  806. package/deps/rocksdb/rocksdb/util/filelock_test.cc +152 -0
  807. package/deps/rocksdb/rocksdb/util/filter_bench.cc +781 -0
  808. package/deps/rocksdb/rocksdb/util/gflags_compat.h +20 -0
  809. package/deps/rocksdb/rocksdb/util/hash.cc +83 -0
  810. package/deps/rocksdb/rocksdb/util/hash.h +107 -0
  811. package/deps/rocksdb/rocksdb/util/hash_map.h +67 -0
  812. package/deps/rocksdb/rocksdb/util/hash_test.cc +593 -0
  813. package/deps/rocksdb/rocksdb/util/heap.h +166 -0
  814. package/deps/rocksdb/rocksdb/util/heap_test.cc +139 -0
  815. package/deps/rocksdb/rocksdb/util/kv_map.h +33 -0
  816. package/deps/rocksdb/rocksdb/util/log_write_bench.cc +86 -0
  817. package/deps/rocksdb/rocksdb/util/math.h +186 -0
  818. package/deps/rocksdb/rocksdb/util/math128.h +298 -0
  819. package/deps/rocksdb/rocksdb/util/murmurhash.cc +191 -0
  820. package/deps/rocksdb/rocksdb/util/murmurhash.h +42 -0
  821. package/deps/rocksdb/rocksdb/util/mutexlock.h +186 -0
  822. package/deps/rocksdb/rocksdb/util/ppc-opcode.h +27 -0
  823. package/deps/rocksdb/rocksdb/util/random.cc +56 -0
  824. package/deps/rocksdb/rocksdb/util/random.h +186 -0
  825. package/deps/rocksdb/rocksdb/util/random_test.cc +105 -0
  826. package/deps/rocksdb/rocksdb/util/rate_limiter.cc +340 -0
  827. package/deps/rocksdb/rocksdb/util/rate_limiter.h +113 -0
  828. package/deps/rocksdb/rocksdb/util/rate_limiter_test.cc +251 -0
  829. package/deps/rocksdb/rocksdb/util/repeatable_thread.h +151 -0
  830. package/deps/rocksdb/rocksdb/util/repeatable_thread_test.cc +107 -0
  831. package/deps/rocksdb/rocksdb/util/ribbon_alg.h +1201 -0
  832. package/deps/rocksdb/rocksdb/util/ribbon_impl.h +1062 -0
  833. package/deps/rocksdb/rocksdb/util/ribbon_test.cc +931 -0
  834. package/deps/rocksdb/rocksdb/util/set_comparator.h +22 -0
  835. package/deps/rocksdb/rocksdb/util/slice.cc +243 -0
  836. package/deps/rocksdb/rocksdb/util/slice_test.cc +163 -0
  837. package/deps/rocksdb/rocksdb/util/slice_transform_test.cc +153 -0
  838. package/deps/rocksdb/rocksdb/util/status.cc +149 -0
  839. package/deps/rocksdb/rocksdb/util/stderr_logger.h +31 -0
  840. package/deps/rocksdb/rocksdb/util/stop_watch.h +118 -0
  841. package/deps/rocksdb/rocksdb/util/string_util.cc +422 -0
  842. package/deps/rocksdb/rocksdb/util/string_util.h +144 -0
  843. package/deps/rocksdb/rocksdb/util/thread_list_test.cc +354 -0
  844. package/deps/rocksdb/rocksdb/util/thread_local.cc +554 -0
  845. package/deps/rocksdb/rocksdb/util/thread_local.h +101 -0
  846. package/deps/rocksdb/rocksdb/util/thread_local_test.cc +583 -0
  847. package/deps/rocksdb/rocksdb/util/thread_operation.h +121 -0
  848. package/deps/rocksdb/rocksdb/util/threadpool_imp.cc +506 -0
  849. package/deps/rocksdb/rocksdb/util/threadpool_imp.h +112 -0
  850. package/deps/rocksdb/rocksdb/util/timer.h +331 -0
  851. package/deps/rocksdb/rocksdb/util/timer_queue.h +230 -0
  852. package/deps/rocksdb/rocksdb/util/timer_queue_test.cc +72 -0
  853. package/deps/rocksdb/rocksdb/util/timer_test.cc +399 -0
  854. package/deps/rocksdb/rocksdb/util/user_comparator_wrapper.h +80 -0
  855. package/deps/rocksdb/rocksdb/util/vector_iterator.h +101 -0
  856. package/deps/rocksdb/rocksdb/util/work_queue.h +148 -0
  857. package/deps/rocksdb/rocksdb/util/work_queue_test.cc +268 -0
  858. package/deps/rocksdb/rocksdb/util/xxh3p.h +1392 -0
  859. package/deps/rocksdb/rocksdb/util/xxhash.cc +1158 -0
  860. package/deps/rocksdb/rocksdb/util/xxhash.h +598 -0
  861. package/deps/rocksdb/rocksdb/utilities/backupable/backupable_db.cc +2354 -0
  862. package/deps/rocksdb/rocksdb/utilities/backupable/backupable_db_test.cc +2955 -0
  863. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_compaction_filter.cc +488 -0
  864. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_compaction_filter.h +199 -0
  865. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db.cc +112 -0
  866. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db.h +266 -0
  867. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db_gc_stats.h +52 -0
  868. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db_impl.cc +2167 -0
  869. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db_impl.h +500 -0
  870. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db_impl_filesnapshot.cc +113 -0
  871. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db_iterator.h +147 -0
  872. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db_listener.h +66 -0
  873. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db_test.cc +2386 -0
  874. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_dump_tool.cc +281 -0
  875. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_dump_tool.h +58 -0
  876. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_file.cc +314 -0
  877. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_file.h +244 -0
  878. package/deps/rocksdb/rocksdb/utilities/cassandra/cassandra_compaction_filter.cc +47 -0
  879. package/deps/rocksdb/rocksdb/utilities/cassandra/cassandra_compaction_filter.h +42 -0
  880. package/deps/rocksdb/rocksdb/utilities/cassandra/cassandra_format_test.cc +375 -0
  881. package/deps/rocksdb/rocksdb/utilities/cassandra/cassandra_functional_test.cc +327 -0
  882. package/deps/rocksdb/rocksdb/utilities/cassandra/cassandra_row_merge_test.cc +114 -0
  883. package/deps/rocksdb/rocksdb/utilities/cassandra/cassandra_serialize_test.cc +187 -0
  884. package/deps/rocksdb/rocksdb/utilities/cassandra/format.cc +390 -0
  885. package/deps/rocksdb/rocksdb/utilities/cassandra/format.h +184 -0
  886. package/deps/rocksdb/rocksdb/utilities/cassandra/merge_operator.cc +67 -0
  887. package/deps/rocksdb/rocksdb/utilities/cassandra/merge_operator.h +44 -0
  888. package/deps/rocksdb/rocksdb/utilities/cassandra/serialize.h +75 -0
  889. package/deps/rocksdb/rocksdb/utilities/cassandra/test_utils.cc +72 -0
  890. package/deps/rocksdb/rocksdb/utilities/cassandra/test_utils.h +43 -0
  891. package/deps/rocksdb/rocksdb/utilities/checkpoint/checkpoint_impl.cc +588 -0
  892. package/deps/rocksdb/rocksdb/utilities/checkpoint/checkpoint_impl.h +82 -0
  893. package/deps/rocksdb/rocksdb/utilities/checkpoint/checkpoint_test.cc +821 -0
  894. package/deps/rocksdb/rocksdb/utilities/compaction_filters/layered_compaction_filter_base.h +37 -0
  895. package/deps/rocksdb/rocksdb/utilities/compaction_filters/remove_emptyvalue_compactionfilter.cc +29 -0
  896. package/deps/rocksdb/rocksdb/utilities/compaction_filters/remove_emptyvalue_compactionfilter.h +27 -0
  897. package/deps/rocksdb/rocksdb/utilities/convenience/info_log_finder.cc +25 -0
  898. package/deps/rocksdb/rocksdb/utilities/debug.cc +82 -0
  899. package/deps/rocksdb/rocksdb/utilities/env_librados.cc +1497 -0
  900. package/deps/rocksdb/rocksdb/utilities/env_librados_test.cc +1146 -0
  901. package/deps/rocksdb/rocksdb/utilities/env_mirror.cc +262 -0
  902. package/deps/rocksdb/rocksdb/utilities/env_mirror_test.cc +223 -0
  903. package/deps/rocksdb/rocksdb/utilities/env_timed.cc +145 -0
  904. package/deps/rocksdb/rocksdb/utilities/env_timed_test.cc +44 -0
  905. package/deps/rocksdb/rocksdb/utilities/fault_injection_env.cc +490 -0
  906. package/deps/rocksdb/rocksdb/utilities/fault_injection_env.h +242 -0
  907. package/deps/rocksdb/rocksdb/utilities/fault_injection_fs.cc +581 -0
  908. package/deps/rocksdb/rocksdb/utilities/fault_injection_fs.h +437 -0
  909. package/deps/rocksdb/rocksdb/utilities/leveldb_options/leveldb_options.cc +56 -0
  910. package/deps/rocksdb/rocksdb/utilities/memory/memory_test.cc +275 -0
  911. package/deps/rocksdb/rocksdb/utilities/memory/memory_util.cc +52 -0
  912. package/deps/rocksdb/rocksdb/utilities/merge_operators/bytesxor.cc +59 -0
  913. package/deps/rocksdb/rocksdb/utilities/merge_operators/bytesxor.h +39 -0
  914. package/deps/rocksdb/rocksdb/utilities/merge_operators/max.cc +77 -0
  915. package/deps/rocksdb/rocksdb/utilities/merge_operators/put.cc +83 -0
  916. package/deps/rocksdb/rocksdb/utilities/merge_operators/sortlist.cc +97 -0
  917. package/deps/rocksdb/rocksdb/utilities/merge_operators/sortlist.h +38 -0
  918. package/deps/rocksdb/rocksdb/utilities/merge_operators/string_append/stringappend.cc +59 -0
  919. package/deps/rocksdb/rocksdb/utilities/merge_operators/string_append/stringappend.h +31 -0
  920. package/deps/rocksdb/rocksdb/utilities/merge_operators/string_append/stringappend2.cc +117 -0
  921. package/deps/rocksdb/rocksdb/utilities/merge_operators/string_append/stringappend2.h +49 -0
  922. package/deps/rocksdb/rocksdb/utilities/merge_operators/string_append/stringappend_test.cc +598 -0
  923. package/deps/rocksdb/rocksdb/utilities/merge_operators/uint64add.cc +69 -0
  924. package/deps/rocksdb/rocksdb/utilities/merge_operators.h +55 -0
  925. package/deps/rocksdb/rocksdb/utilities/object_registry.cc +87 -0
  926. package/deps/rocksdb/rocksdb/utilities/object_registry_test.cc +174 -0
  927. package/deps/rocksdb/rocksdb/utilities/option_change_migration/option_change_migration.cc +168 -0
  928. package/deps/rocksdb/rocksdb/utilities/option_change_migration/option_change_migration_test.cc +431 -0
  929. package/deps/rocksdb/rocksdb/utilities/options/options_util.cc +159 -0
  930. package/deps/rocksdb/rocksdb/utilities/options/options_util_test.cc +655 -0
  931. package/deps/rocksdb/rocksdb/utilities/persistent_cache/block_cache_tier.cc +425 -0
  932. package/deps/rocksdb/rocksdb/utilities/persistent_cache/block_cache_tier.h +156 -0
  933. package/deps/rocksdb/rocksdb/utilities/persistent_cache/block_cache_tier_file.cc +609 -0
  934. package/deps/rocksdb/rocksdb/utilities/persistent_cache/block_cache_tier_file.h +296 -0
  935. package/deps/rocksdb/rocksdb/utilities/persistent_cache/block_cache_tier_file_buffer.h +127 -0
  936. package/deps/rocksdb/rocksdb/utilities/persistent_cache/block_cache_tier_metadata.cc +86 -0
  937. package/deps/rocksdb/rocksdb/utilities/persistent_cache/block_cache_tier_metadata.h +125 -0
  938. package/deps/rocksdb/rocksdb/utilities/persistent_cache/hash_table.h +238 -0
  939. package/deps/rocksdb/rocksdb/utilities/persistent_cache/hash_table_bench.cc +308 -0
  940. package/deps/rocksdb/rocksdb/utilities/persistent_cache/hash_table_evictable.h +168 -0
  941. package/deps/rocksdb/rocksdb/utilities/persistent_cache/hash_table_test.cc +160 -0
  942. package/deps/rocksdb/rocksdb/utilities/persistent_cache/lrulist.h +174 -0
  943. package/deps/rocksdb/rocksdb/utilities/persistent_cache/persistent_cache_bench.cc +360 -0
  944. package/deps/rocksdb/rocksdb/utilities/persistent_cache/persistent_cache_test.cc +456 -0
  945. package/deps/rocksdb/rocksdb/utilities/persistent_cache/persistent_cache_test.h +286 -0
  946. package/deps/rocksdb/rocksdb/utilities/persistent_cache/persistent_cache_tier.cc +167 -0
  947. package/deps/rocksdb/rocksdb/utilities/persistent_cache/persistent_cache_tier.h +339 -0
  948. package/deps/rocksdb/rocksdb/utilities/persistent_cache/persistent_cache_util.h +67 -0
  949. package/deps/rocksdb/rocksdb/utilities/persistent_cache/volatile_tier_impl.cc +140 -0
  950. package/deps/rocksdb/rocksdb/utilities/persistent_cache/volatile_tier_impl.h +142 -0
  951. package/deps/rocksdb/rocksdb/utilities/simulator_cache/cache_simulator.cc +285 -0
  952. package/deps/rocksdb/rocksdb/utilities/simulator_cache/cache_simulator.h +231 -0
  953. package/deps/rocksdb/rocksdb/utilities/simulator_cache/cache_simulator_test.cc +494 -0
  954. package/deps/rocksdb/rocksdb/utilities/simulator_cache/sim_cache.cc +356 -0
  955. package/deps/rocksdb/rocksdb/utilities/simulator_cache/sim_cache_test.cc +224 -0
  956. package/deps/rocksdb/rocksdb/utilities/table_properties_collectors/compact_on_deletion_collector.cc +122 -0
  957. package/deps/rocksdb/rocksdb/utilities/table_properties_collectors/compact_on_deletion_collector.h +72 -0
  958. package/deps/rocksdb/rocksdb/utilities/table_properties_collectors/compact_on_deletion_collector_test.cc +244 -0
  959. package/deps/rocksdb/rocksdb/utilities/trace/file_trace_reader_writer.cc +125 -0
  960. package/deps/rocksdb/rocksdb/utilities/trace/file_trace_reader_writer.h +48 -0
  961. package/deps/rocksdb/rocksdb/utilities/transactions/lock/lock_manager.cc +29 -0
  962. package/deps/rocksdb/rocksdb/utilities/transactions/lock/lock_manager.h +82 -0
  963. package/deps/rocksdb/rocksdb/utilities/transactions/lock/lock_tracker.h +209 -0
  964. package/deps/rocksdb/rocksdb/utilities/transactions/lock/point/point_lock_manager.cc +720 -0
  965. package/deps/rocksdb/rocksdb/utilities/transactions/lock/point/point_lock_manager.h +223 -0
  966. package/deps/rocksdb/rocksdb/utilities/transactions/lock/point/point_lock_manager_test.cc +181 -0
  967. package/deps/rocksdb/rocksdb/utilities/transactions/lock/point/point_lock_manager_test.h +319 -0
  968. package/deps/rocksdb/rocksdb/utilities/transactions/lock/point/point_lock_tracker.cc +270 -0
  969. package/deps/rocksdb/rocksdb/utilities/transactions/lock/point/point_lock_tracker.h +99 -0
  970. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_lock_manager.h +30 -0
  971. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_locking_test.cc +306 -0
  972. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/COPYING.AGPLv3 +661 -0
  973. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/COPYING.APACHEv2 +174 -0
  974. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/COPYING.GPLv2 +339 -0
  975. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/db.h +76 -0
  976. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/ft/comparator.h +138 -0
  977. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/ft/ft-status.h +102 -0
  978. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/locktree/concurrent_tree.cc +139 -0
  979. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/locktree/concurrent_tree.h +174 -0
  980. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/locktree/keyrange.cc +222 -0
  981. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/locktree/keyrange.h +141 -0
  982. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/locktree/lock_request.cc +525 -0
  983. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/locktree/lock_request.h +253 -0
  984. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/locktree/locktree.cc +1007 -0
  985. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/locktree/locktree.h +560 -0
  986. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/locktree/manager.cc +527 -0
  987. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/locktree/range_buffer.cc +265 -0
  988. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/locktree/range_buffer.h +178 -0
  989. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/locktree/treenode.cc +520 -0
  990. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/locktree/treenode.h +302 -0
  991. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/locktree/txnid_set.cc +120 -0
  992. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/locktree/txnid_set.h +92 -0
  993. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/locktree/wfg.cc +213 -0
  994. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/locktree/wfg.h +124 -0
  995. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/portability/memory.h +215 -0
  996. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/portability/toku_assert_subst.h +39 -0
  997. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/portability/toku_atomic.h +130 -0
  998. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/portability/toku_external_pthread.h +82 -0
  999. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/portability/toku_instrumentation.h +286 -0
  1000. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/portability/toku_portability.h +87 -0
  1001. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/portability/toku_pthread.h +520 -0
  1002. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/portability/toku_race_tools.h +179 -0
  1003. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/portability/toku_time.h +172 -0
  1004. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/portability/txn_subst.h +27 -0
  1005. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/standalone_port.cc +132 -0
  1006. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/util/dbt.cc +153 -0
  1007. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/util/dbt.h +98 -0
  1008. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/util/growable_array.h +144 -0
  1009. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/util/memarena.cc +201 -0
  1010. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/util/memarena.h +141 -0
  1011. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/util/omt.h +794 -0
  1012. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/util/omt_impl.h +1295 -0
  1013. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/util/partitioned_counter.h +165 -0
  1014. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/util/status.h +76 -0
  1015. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/range_tree_lock_manager.cc +479 -0
  1016. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/range_tree_lock_manager.h +130 -0
  1017. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/range_tree_lock_tracker.cc +156 -0
  1018. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/range_tree_lock_tracker.h +146 -0
  1019. package/deps/rocksdb/rocksdb/utilities/transactions/optimistic_transaction.cc +196 -0
  1020. package/deps/rocksdb/rocksdb/utilities/transactions/optimistic_transaction.h +101 -0
  1021. package/deps/rocksdb/rocksdb/utilities/transactions/optimistic_transaction_db_impl.cc +111 -0
  1022. package/deps/rocksdb/rocksdb/utilities/transactions/optimistic_transaction_db_impl.h +87 -0
  1023. package/deps/rocksdb/rocksdb/utilities/transactions/optimistic_transaction_test.cc +1418 -0
  1024. package/deps/rocksdb/rocksdb/utilities/transactions/pessimistic_transaction.cc +752 -0
  1025. package/deps/rocksdb/rocksdb/utilities/transactions/pessimistic_transaction.h +232 -0
  1026. package/deps/rocksdb/rocksdb/utilities/transactions/pessimistic_transaction_db.cc +628 -0
  1027. package/deps/rocksdb/rocksdb/utilities/transactions/pessimistic_transaction_db.h +228 -0
  1028. package/deps/rocksdb/rocksdb/utilities/transactions/snapshot_checker.cc +49 -0
  1029. package/deps/rocksdb/rocksdb/utilities/transactions/transaction_base.cc +678 -0
  1030. package/deps/rocksdb/rocksdb/utilities/transactions/transaction_base.h +373 -0
  1031. package/deps/rocksdb/rocksdb/utilities/transactions/transaction_db_mutex_impl.cc +135 -0
  1032. package/deps/rocksdb/rocksdb/utilities/transactions/transaction_db_mutex_impl.h +26 -0
  1033. package/deps/rocksdb/rocksdb/utilities/transactions/transaction_test.cc +6350 -0
  1034. package/deps/rocksdb/rocksdb/utilities/transactions/transaction_test.h +522 -0
  1035. package/deps/rocksdb/rocksdb/utilities/transactions/transaction_util.cc +188 -0
  1036. package/deps/rocksdb/rocksdb/utilities/transactions/transaction_util.h +80 -0
  1037. package/deps/rocksdb/rocksdb/utilities/transactions/write_prepared_transaction_test.cc +3531 -0
  1038. package/deps/rocksdb/rocksdb/utilities/transactions/write_prepared_txn.cc +483 -0
  1039. package/deps/rocksdb/rocksdb/utilities/transactions/write_prepared_txn.h +119 -0
  1040. package/deps/rocksdb/rocksdb/utilities/transactions/write_prepared_txn_db.cc +999 -0
  1041. package/deps/rocksdb/rocksdb/utilities/transactions/write_prepared_txn_db.h +1109 -0
  1042. package/deps/rocksdb/rocksdb/utilities/transactions/write_unprepared_transaction_test.cc +786 -0
  1043. package/deps/rocksdb/rocksdb/utilities/transactions/write_unprepared_txn.cc +1039 -0
  1044. package/deps/rocksdb/rocksdb/utilities/transactions/write_unprepared_txn.h +341 -0
  1045. package/deps/rocksdb/rocksdb/utilities/transactions/write_unprepared_txn_db.cc +470 -0
  1046. package/deps/rocksdb/rocksdb/utilities/transactions/write_unprepared_txn_db.h +108 -0
  1047. package/deps/rocksdb/rocksdb/utilities/ttl/db_ttl_impl.cc +332 -0
  1048. package/deps/rocksdb/rocksdb/utilities/ttl/db_ttl_impl.h +353 -0
  1049. package/deps/rocksdb/rocksdb/utilities/ttl/ttl_test.cc +703 -0
  1050. package/deps/rocksdb/rocksdb/utilities/util_merge_operators_test.cc +99 -0
  1051. package/deps/rocksdb/rocksdb/utilities/write_batch_with_index/write_batch_with_index.cc +617 -0
  1052. package/deps/rocksdb/rocksdb/utilities/write_batch_with_index/write_batch_with_index_internal.cc +345 -0
  1053. package/deps/rocksdb/rocksdb/utilities/write_batch_with_index/write_batch_with_index_internal.h +569 -0
  1054. package/deps/rocksdb/rocksdb/utilities/write_batch_with_index/write_batch_with_index_test.cc +1867 -0
  1055. package/deps/rocksdb/rocksdb.gyp +475 -0
  1056. package/deps/snappy/freebsd/config.h +135 -0
  1057. package/deps/snappy/freebsd/snappy-stubs-public.h +100 -0
  1058. package/deps/snappy/linux/config.h +135 -0
  1059. package/deps/snappy/linux/snappy-stubs-public.h +100 -0
  1060. package/deps/snappy/mac/config.h +137 -0
  1061. package/deps/snappy/mac/snappy-stubs-public.h +100 -0
  1062. package/deps/snappy/openbsd/config.h +135 -0
  1063. package/deps/snappy/openbsd/snappy-stubs-public.h +100 -0
  1064. package/deps/snappy/snappy-1.1.7/COPYING +54 -0
  1065. package/deps/snappy/snappy-1.1.7/cmake/SnappyConfig.cmake +1 -0
  1066. package/deps/snappy/snappy-1.1.7/cmake/config.h.in +62 -0
  1067. package/deps/snappy/snappy-1.1.7/snappy-c.cc +90 -0
  1068. package/deps/snappy/snappy-1.1.7/snappy-c.h +138 -0
  1069. package/deps/snappy/snappy-1.1.7/snappy-internal.h +224 -0
  1070. package/deps/snappy/snappy-1.1.7/snappy-sinksource.cc +104 -0
  1071. package/deps/snappy/snappy-1.1.7/snappy-sinksource.h +182 -0
  1072. package/deps/snappy/snappy-1.1.7/snappy-stubs-internal.cc +42 -0
  1073. package/deps/snappy/snappy-1.1.7/snappy-stubs-internal.h +561 -0
  1074. package/deps/snappy/snappy-1.1.7/snappy-stubs-public.h.in +94 -0
  1075. package/deps/snappy/snappy-1.1.7/snappy-test.cc +612 -0
  1076. package/deps/snappy/snappy-1.1.7/snappy-test.h +573 -0
  1077. package/deps/snappy/snappy-1.1.7/snappy.cc +1515 -0
  1078. package/deps/snappy/snappy-1.1.7/snappy.h +203 -0
  1079. package/deps/snappy/snappy-1.1.7/snappy_unittest.cc +1410 -0
  1080. package/deps/snappy/snappy.gyp +90 -0
  1081. package/deps/snappy/solaris/config.h +135 -0
  1082. package/deps/snappy/solaris/snappy-stubs-public.h +100 -0
  1083. package/deps/snappy/win32/config.h +29 -0
  1084. package/deps/snappy/win32/snappy-stubs-public.h +100 -0
  1085. package/iterator.js +55 -0
  1086. package/leveldown.js +113 -0
  1087. package/package-lock.json +23687 -0
  1088. package/package.json +70 -0
@@ -0,0 +1,3268 @@
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
+
6
+ #include <string>
7
+ #include <vector>
8
+ #include <algorithm>
9
+ #include <utility>
10
+
11
+ #include "db/db_iter.h"
12
+ #include "db/dbformat.h"
13
+ #include "rocksdb/comparator.h"
14
+ #include "rocksdb/options.h"
15
+ #include "rocksdb/perf_context.h"
16
+ #include "rocksdb/slice.h"
17
+ #include "rocksdb/statistics.h"
18
+ #include "table/iterator_wrapper.h"
19
+ #include "table/merging_iterator.h"
20
+ #include "test_util/sync_point.h"
21
+ #include "test_util/testharness.h"
22
+ #include "util/string_util.h"
23
+ #include "utilities/merge_operators.h"
24
+
25
+ namespace ROCKSDB_NAMESPACE {
26
+
27
+ static uint64_t TestGetTickerCount(const Options& options,
28
+ Tickers ticker_type) {
29
+ return options.statistics->getTickerCount(ticker_type);
30
+ }
31
+
32
+ class TestIterator : public InternalIterator {
33
+ public:
34
+ explicit TestIterator(const Comparator* comparator)
35
+ : initialized_(false),
36
+ valid_(false),
37
+ sequence_number_(0),
38
+ iter_(0),
39
+ cmp(comparator) {
40
+ data_.reserve(16);
41
+ }
42
+
43
+ void AddPut(std::string argkey, std::string argvalue) {
44
+ Add(argkey, kTypeValue, argvalue);
45
+ }
46
+
47
+ void AddDeletion(std::string argkey) {
48
+ Add(argkey, kTypeDeletion, std::string());
49
+ }
50
+
51
+ void AddSingleDeletion(std::string argkey) {
52
+ Add(argkey, kTypeSingleDeletion, std::string());
53
+ }
54
+
55
+ void AddMerge(std::string argkey, std::string argvalue) {
56
+ Add(argkey, kTypeMerge, argvalue);
57
+ }
58
+
59
+ void Add(std::string argkey, ValueType type, std::string argvalue) {
60
+ Add(argkey, type, argvalue, sequence_number_++);
61
+ }
62
+
63
+ void Add(std::string argkey, ValueType type, std::string argvalue,
64
+ size_t seq_num, bool update_iter = false) {
65
+ valid_ = true;
66
+ ParsedInternalKey internal_key(argkey, seq_num, type);
67
+ data_.push_back(
68
+ std::pair<std::string, std::string>(std::string(), argvalue));
69
+ AppendInternalKey(&data_.back().first, internal_key);
70
+ if (update_iter && valid_ && cmp.Compare(data_.back().first, key()) < 0) {
71
+ // insert a key smaller than current key
72
+ Finish();
73
+ // data_[iter_] is not anymore the current element of the iterator.
74
+ // Increment it to reposition it to the right position.
75
+ iter_++;
76
+ }
77
+ }
78
+
79
+ // should be called before operations with iterator
80
+ void Finish() {
81
+ initialized_ = true;
82
+ std::sort(data_.begin(), data_.end(),
83
+ [this](std::pair<std::string, std::string> a,
84
+ std::pair<std::string, std::string> b) {
85
+ return (cmp.Compare(a.first, b.first) < 0);
86
+ });
87
+ }
88
+
89
+ // Removes the key from the set of keys over which this iterator iterates.
90
+ // Not to be confused with AddDeletion().
91
+ // If the iterator is currently positioned on this key, the deletion will
92
+ // apply next time the iterator moves.
93
+ // Used for simulating ForwardIterator updating to a new version that doesn't
94
+ // have some of the keys (e.g. after compaction with a filter).
95
+ void Vanish(std::string _key) {
96
+ if (valid_ && data_[iter_].first == _key) {
97
+ delete_current_ = true;
98
+ return;
99
+ }
100
+ for (auto it = data_.begin(); it != data_.end(); ++it) {
101
+ ParsedInternalKey ikey;
102
+ Status pik_status =
103
+ ParseInternalKey(it->first, &ikey, true /* log_err_key */);
104
+ pik_status.PermitUncheckedError();
105
+ assert(pik_status.ok());
106
+ if (!pik_status.ok() || ikey.user_key != _key) {
107
+ continue;
108
+ }
109
+ if (valid_ && data_.begin() + iter_ > it) {
110
+ --iter_;
111
+ }
112
+ data_.erase(it);
113
+ return;
114
+ }
115
+ assert(false);
116
+ }
117
+
118
+ // Number of operations done on this iterator since construction.
119
+ size_t steps() const { return steps_; }
120
+
121
+ bool Valid() const override {
122
+ assert(initialized_);
123
+ return valid_;
124
+ }
125
+
126
+ void SeekToFirst() override {
127
+ assert(initialized_);
128
+ ++steps_;
129
+ DeleteCurrentIfNeeded();
130
+ valid_ = (data_.size() > 0);
131
+ iter_ = 0;
132
+ }
133
+
134
+ void SeekToLast() override {
135
+ assert(initialized_);
136
+ ++steps_;
137
+ DeleteCurrentIfNeeded();
138
+ valid_ = (data_.size() > 0);
139
+ iter_ = data_.size() - 1;
140
+ }
141
+
142
+ void Seek(const Slice& target) override {
143
+ assert(initialized_);
144
+ SeekToFirst();
145
+ ++steps_;
146
+ if (!valid_) {
147
+ return;
148
+ }
149
+ while (iter_ < data_.size() &&
150
+ (cmp.Compare(data_[iter_].first, target) < 0)) {
151
+ ++iter_;
152
+ }
153
+
154
+ if (iter_ == data_.size()) {
155
+ valid_ = false;
156
+ }
157
+ }
158
+
159
+ void SeekForPrev(const Slice& target) override {
160
+ assert(initialized_);
161
+ DeleteCurrentIfNeeded();
162
+ SeekForPrevImpl(target, &cmp);
163
+ }
164
+
165
+ void Next() override {
166
+ assert(initialized_);
167
+ assert(valid_);
168
+ assert(iter_ < data_.size());
169
+
170
+ ++steps_;
171
+ if (delete_current_) {
172
+ DeleteCurrentIfNeeded();
173
+ } else {
174
+ ++iter_;
175
+ }
176
+ valid_ = iter_ < data_.size();
177
+ }
178
+
179
+ void Prev() override {
180
+ assert(initialized_);
181
+ assert(valid_);
182
+ assert(iter_ < data_.size());
183
+
184
+ ++steps_;
185
+ DeleteCurrentIfNeeded();
186
+ if (iter_ == 0) {
187
+ valid_ = false;
188
+ } else {
189
+ --iter_;
190
+ }
191
+ }
192
+
193
+ Slice key() const override {
194
+ assert(initialized_);
195
+ return data_[iter_].first;
196
+ }
197
+
198
+ Slice value() const override {
199
+ assert(initialized_);
200
+ return data_[iter_].second;
201
+ }
202
+
203
+ Status status() const override {
204
+ assert(initialized_);
205
+ return Status::OK();
206
+ }
207
+
208
+ bool IsKeyPinned() const override { return true; }
209
+ bool IsValuePinned() const override { return true; }
210
+
211
+ private:
212
+ bool initialized_;
213
+ bool valid_;
214
+ size_t sequence_number_;
215
+ size_t iter_;
216
+ size_t steps_ = 0;
217
+
218
+ InternalKeyComparator cmp;
219
+ std::vector<std::pair<std::string, std::string>> data_;
220
+ bool delete_current_ = false;
221
+
222
+ void DeleteCurrentIfNeeded() {
223
+ if (!delete_current_) {
224
+ return;
225
+ }
226
+ data_.erase(data_.begin() + iter_);
227
+ delete_current_ = false;
228
+ }
229
+ };
230
+
231
+ class DBIteratorTest : public testing::Test {
232
+ public:
233
+ Env* env_;
234
+
235
+ DBIteratorTest() : env_(Env::Default()) {}
236
+ };
237
+
238
+ TEST_F(DBIteratorTest, DBIteratorPrevNext) {
239
+ Options options;
240
+ ImmutableCFOptions cf_options = ImmutableCFOptions(options);
241
+ MutableCFOptions mutable_cf_options = MutableCFOptions(options);
242
+ {
243
+ TestIterator* internal_iter = new TestIterator(BytewiseComparator());
244
+ internal_iter->AddDeletion("a");
245
+ internal_iter->AddDeletion("a");
246
+ internal_iter->AddDeletion("a");
247
+ internal_iter->AddDeletion("a");
248
+ internal_iter->AddPut("a", "val_a");
249
+
250
+ internal_iter->AddPut("b", "val_b");
251
+ internal_iter->Finish();
252
+
253
+ ReadOptions ro;
254
+ std::unique_ptr<Iterator> db_iter(NewDBIterator(
255
+ env_, ro, cf_options, mutable_cf_options, BytewiseComparator(),
256
+ internal_iter, nullptr /* version */, 10 /* sequence */,
257
+ options.max_sequential_skip_in_iterations,
258
+ nullptr /* read_callback */));
259
+
260
+ db_iter->SeekToLast();
261
+ ASSERT_TRUE(db_iter->Valid());
262
+ ASSERT_EQ(db_iter->key().ToString(), "b");
263
+ ASSERT_EQ(db_iter->value().ToString(), "val_b");
264
+
265
+ db_iter->Prev();
266
+ ASSERT_TRUE(db_iter->Valid());
267
+ ASSERT_EQ(db_iter->key().ToString(), "a");
268
+ ASSERT_EQ(db_iter->value().ToString(), "val_a");
269
+
270
+ db_iter->Next();
271
+ ASSERT_TRUE(db_iter->Valid());
272
+ ASSERT_EQ(db_iter->key().ToString(), "b");
273
+ ASSERT_EQ(db_iter->value().ToString(), "val_b");
274
+
275
+ db_iter->Next();
276
+ ASSERT_TRUE(!db_iter->Valid());
277
+ }
278
+ // Test to check the SeekToLast() with iterate_upper_bound not set
279
+ {
280
+ TestIterator* internal_iter = new TestIterator(BytewiseComparator());
281
+ internal_iter->AddPut("a", "val_a");
282
+ internal_iter->AddPut("b", "val_b");
283
+ internal_iter->AddPut("b", "val_b");
284
+ internal_iter->AddPut("c", "val_c");
285
+ internal_iter->Finish();
286
+
287
+ ReadOptions ro;
288
+ std::unique_ptr<Iterator> db_iter(NewDBIterator(
289
+ env_, ro, cf_options, mutable_cf_options, BytewiseComparator(),
290
+ internal_iter, nullptr /* version */, 10 /* sequence */,
291
+ options.max_sequential_skip_in_iterations,
292
+ nullptr /* read_callback */));
293
+
294
+ db_iter->SeekToLast();
295
+ ASSERT_TRUE(db_iter->Valid());
296
+ ASSERT_EQ(db_iter->key().ToString(), "c");
297
+ }
298
+
299
+ // Test to check the SeekToLast() with iterate_upper_bound set
300
+ {
301
+ TestIterator* internal_iter = new TestIterator(BytewiseComparator());
302
+
303
+ internal_iter->AddPut("a", "val_a");
304
+ internal_iter->AddPut("b", "val_b");
305
+ internal_iter->AddPut("c", "val_c");
306
+ internal_iter->AddPut("d", "val_d");
307
+ internal_iter->AddPut("e", "val_e");
308
+ internal_iter->AddPut("f", "val_f");
309
+ internal_iter->Finish();
310
+
311
+ Slice prefix("d");
312
+
313
+ ReadOptions ro;
314
+ ro.iterate_upper_bound = &prefix;
315
+
316
+ std::unique_ptr<Iterator> db_iter(NewDBIterator(
317
+ env_, ro, cf_options, mutable_cf_options, BytewiseComparator(),
318
+ internal_iter, nullptr /* version */, 10 /* sequence */,
319
+ options.max_sequential_skip_in_iterations,
320
+ nullptr /* read_callback */));
321
+
322
+ db_iter->SeekToLast();
323
+ ASSERT_TRUE(db_iter->Valid());
324
+ ASSERT_EQ(db_iter->key().ToString(), "c");
325
+
326
+ db_iter->Next();
327
+ ASSERT_TRUE(!db_iter->Valid());
328
+
329
+ db_iter->SeekToLast();
330
+ ASSERT_TRUE(db_iter->Valid());
331
+ ASSERT_EQ(db_iter->key().ToString(), "c");
332
+ }
333
+ // Test to check the SeekToLast() iterate_upper_bound set to a key that
334
+ // is not Put yet
335
+ {
336
+ TestIterator* internal_iter = new TestIterator(BytewiseComparator());
337
+
338
+ internal_iter->AddPut("a", "val_a");
339
+ internal_iter->AddPut("a", "val_a");
340
+ internal_iter->AddPut("b", "val_b");
341
+ internal_iter->AddPut("c", "val_c");
342
+ internal_iter->AddPut("d", "val_d");
343
+ internal_iter->Finish();
344
+
345
+ Slice prefix("z");
346
+
347
+ ReadOptions ro;
348
+ ro.iterate_upper_bound = &prefix;
349
+
350
+ std::unique_ptr<Iterator> db_iter(NewDBIterator(
351
+ env_, ro, cf_options, mutable_cf_options, BytewiseComparator(),
352
+ internal_iter, nullptr /* version */, 10 /* sequence */,
353
+ options.max_sequential_skip_in_iterations,
354
+ nullptr /* read_callback */));
355
+
356
+ db_iter->SeekToLast();
357
+ ASSERT_TRUE(db_iter->Valid());
358
+ ASSERT_EQ(db_iter->key().ToString(), "d");
359
+
360
+ db_iter->Next();
361
+ ASSERT_TRUE(!db_iter->Valid());
362
+
363
+ db_iter->SeekToLast();
364
+ ASSERT_TRUE(db_iter->Valid());
365
+ ASSERT_EQ(db_iter->key().ToString(), "d");
366
+
367
+ db_iter->Prev();
368
+ ASSERT_TRUE(db_iter->Valid());
369
+ ASSERT_EQ(db_iter->key().ToString(), "c");
370
+ }
371
+ // Test to check the SeekToLast() with iterate_upper_bound set to the
372
+ // first key
373
+ {
374
+ TestIterator* internal_iter = new TestIterator(BytewiseComparator());
375
+ internal_iter->AddPut("a", "val_a");
376
+ internal_iter->AddPut("a", "val_a");
377
+ internal_iter->AddPut("a", "val_a");
378
+ internal_iter->AddPut("b", "val_b");
379
+ internal_iter->AddPut("b", "val_b");
380
+ internal_iter->Finish();
381
+
382
+ Slice prefix("a");
383
+
384
+ ReadOptions ro;
385
+ ro.iterate_upper_bound = &prefix;
386
+
387
+ std::unique_ptr<Iterator> db_iter(NewDBIterator(
388
+ env_, ro, cf_options, mutable_cf_options, BytewiseComparator(),
389
+ internal_iter, nullptr /* version */, 10 /* sequence */,
390
+ options.max_sequential_skip_in_iterations,
391
+ nullptr /* read_callback */));
392
+
393
+ db_iter->SeekToLast();
394
+ ASSERT_TRUE(!db_iter->Valid());
395
+ ASSERT_OK(db_iter->status());
396
+ }
397
+ // Test case to check SeekToLast with iterate_upper_bound set
398
+ // (same key put may times - SeekToLast should start with the
399
+ // maximum sequence id of the upper bound)
400
+
401
+ {
402
+ TestIterator* internal_iter = new TestIterator(BytewiseComparator());
403
+ internal_iter->AddPut("a", "val_a");
404
+ internal_iter->AddPut("b", "val_b");
405
+ internal_iter->AddPut("c", "val_c");
406
+ internal_iter->AddPut("c", "val_c");
407
+ internal_iter->AddPut("c", "val_c");
408
+ internal_iter->AddPut("c", "val_c");
409
+ internal_iter->AddPut("c", "val_c");
410
+ internal_iter->AddPut("c", "val_c");
411
+ internal_iter->AddPut("c", "val_c");
412
+ internal_iter->Finish();
413
+
414
+ Slice prefix("c");
415
+
416
+ ReadOptions ro;
417
+ ro.iterate_upper_bound = &prefix;
418
+
419
+ std::unique_ptr<Iterator> db_iter(NewDBIterator(
420
+ env_, ro, cf_options, mutable_cf_options, BytewiseComparator(),
421
+ internal_iter, nullptr /* version */, 7 /* sequence */,
422
+ options.max_sequential_skip_in_iterations,
423
+ nullptr /* read_callback */));
424
+
425
+ SetPerfLevel(kEnableCount);
426
+ ASSERT_TRUE(GetPerfLevel() == kEnableCount);
427
+
428
+ get_perf_context()->Reset();
429
+ db_iter->SeekToLast();
430
+
431
+ ASSERT_TRUE(db_iter->Valid());
432
+ ASSERT_EQ(static_cast<int>(get_perf_context()->internal_key_skipped_count), 1);
433
+ ASSERT_EQ(db_iter->key().ToString(), "b");
434
+
435
+ SetPerfLevel(kDisable);
436
+ }
437
+ // Test to check the SeekToLast() with the iterate_upper_bound set
438
+ // (Checking the value of the key which has sequence ids greater than
439
+ // and less that the iterator's sequence id)
440
+ {
441
+ TestIterator* internal_iter = new TestIterator(BytewiseComparator());
442
+
443
+ internal_iter->AddPut("a", "val_a1");
444
+ internal_iter->AddPut("a", "val_a2");
445
+ internal_iter->AddPut("b", "val_b1");
446
+ internal_iter->AddPut("c", "val_c1");
447
+ internal_iter->AddPut("c", "val_c2");
448
+ internal_iter->AddPut("c", "val_c3");
449
+ internal_iter->AddPut("b", "val_b2");
450
+ internal_iter->AddPut("d", "val_d1");
451
+ internal_iter->Finish();
452
+
453
+ Slice prefix("c");
454
+
455
+ ReadOptions ro;
456
+ ro.iterate_upper_bound = &prefix;
457
+
458
+ std::unique_ptr<Iterator> db_iter(NewDBIterator(
459
+ env_, ro, cf_options, mutable_cf_options, BytewiseComparator(),
460
+ internal_iter, nullptr /* version */, 4 /* sequence */,
461
+ options.max_sequential_skip_in_iterations,
462
+ nullptr /* read_callback */));
463
+
464
+ db_iter->SeekToLast();
465
+ ASSERT_TRUE(db_iter->Valid());
466
+ ASSERT_EQ(db_iter->key().ToString(), "b");
467
+ ASSERT_EQ(db_iter->value().ToString(), "val_b1");
468
+ }
469
+
470
+ // Test to check the SeekToLast() with the iterate_upper_bound set to the
471
+ // key that is deleted
472
+ {
473
+ TestIterator* internal_iter = new TestIterator(BytewiseComparator());
474
+ internal_iter->AddPut("a", "val_a");
475
+ internal_iter->AddDeletion("a");
476
+ internal_iter->AddPut("b", "val_b");
477
+ internal_iter->AddPut("c", "val_c");
478
+ internal_iter->Finish();
479
+
480
+ Slice prefix("a");
481
+
482
+ ReadOptions ro;
483
+ ro.iterate_upper_bound = &prefix;
484
+
485
+ std::unique_ptr<Iterator> db_iter(NewDBIterator(
486
+ env_, ro, cf_options, mutable_cf_options, BytewiseComparator(),
487
+ internal_iter, nullptr /* version */, 10 /* sequence */,
488
+ options.max_sequential_skip_in_iterations,
489
+ nullptr /* read_callback */));
490
+
491
+ db_iter->SeekToLast();
492
+ ASSERT_TRUE(!db_iter->Valid());
493
+ ASSERT_OK(db_iter->status());
494
+ }
495
+ // Test to check the SeekToLast() with the iterate_upper_bound set
496
+ // (Deletion cases)
497
+ {
498
+ TestIterator* internal_iter = new TestIterator(BytewiseComparator());
499
+ internal_iter->AddPut("a", "val_a");
500
+ internal_iter->AddPut("b", "val_b");
501
+ internal_iter->AddDeletion("b");
502
+ internal_iter->AddPut("c", "val_c");
503
+ internal_iter->Finish();
504
+
505
+ Slice prefix("c");
506
+
507
+ ReadOptions ro;
508
+ ro.iterate_upper_bound = &prefix;
509
+
510
+ std::unique_ptr<Iterator> db_iter(NewDBIterator(
511
+ env_, ro, cf_options, mutable_cf_options, BytewiseComparator(),
512
+ internal_iter, nullptr /* version */, 10 /* sequence */,
513
+ options.max_sequential_skip_in_iterations,
514
+ nullptr /* read_callback */));
515
+
516
+ db_iter->SeekToLast();
517
+ ASSERT_TRUE(db_iter->Valid());
518
+ ASSERT_EQ(db_iter->key().ToString(), "a");
519
+
520
+ db_iter->Next();
521
+ ASSERT_TRUE(!db_iter->Valid());
522
+
523
+ db_iter->SeekToLast();
524
+ ASSERT_TRUE(db_iter->Valid());
525
+ ASSERT_EQ(db_iter->key().ToString(), "a");
526
+ }
527
+ // Test to check the SeekToLast() with iterate_upper_bound set
528
+ // (Deletion cases - Lot of internal keys after the upper_bound
529
+ // is deleted)
530
+ {
531
+ TestIterator* internal_iter = new TestIterator(BytewiseComparator());
532
+ internal_iter->AddPut("a", "val_a");
533
+ internal_iter->AddPut("b", "val_b");
534
+ internal_iter->AddDeletion("c");
535
+ internal_iter->AddDeletion("d");
536
+ internal_iter->AddDeletion("e");
537
+ internal_iter->AddDeletion("f");
538
+ internal_iter->AddDeletion("g");
539
+ internal_iter->AddDeletion("h");
540
+ internal_iter->Finish();
541
+
542
+ Slice prefix("c");
543
+
544
+ ReadOptions ro;
545
+ ro.iterate_upper_bound = &prefix;
546
+
547
+ std::unique_ptr<Iterator> db_iter(NewDBIterator(
548
+ env_, ro, cf_options, mutable_cf_options, BytewiseComparator(),
549
+ internal_iter, nullptr /* version */, 7 /* sequence */,
550
+ options.max_sequential_skip_in_iterations,
551
+ nullptr /* read_callback */));
552
+
553
+ SetPerfLevel(kEnableCount);
554
+ ASSERT_TRUE(GetPerfLevel() == kEnableCount);
555
+
556
+ get_perf_context()->Reset();
557
+ db_iter->SeekToLast();
558
+
559
+ ASSERT_TRUE(db_iter->Valid());
560
+ ASSERT_EQ(static_cast<int>(get_perf_context()->internal_delete_skipped_count), 0);
561
+ ASSERT_EQ(db_iter->key().ToString(), "b");
562
+
563
+ SetPerfLevel(kDisable);
564
+ }
565
+
566
+ {
567
+ TestIterator* internal_iter = new TestIterator(BytewiseComparator());
568
+ internal_iter->AddDeletion("a");
569
+ internal_iter->AddDeletion("a");
570
+ internal_iter->AddDeletion("a");
571
+ internal_iter->AddDeletion("a");
572
+ internal_iter->AddPut("a", "val_a");
573
+
574
+ internal_iter->AddPut("b", "val_b");
575
+ internal_iter->Finish();
576
+
577
+ ReadOptions ro;
578
+ std::unique_ptr<Iterator> db_iter(NewDBIterator(
579
+ env_, ro, cf_options, mutable_cf_options, BytewiseComparator(),
580
+ internal_iter, nullptr /* version */, 10 /* sequence */,
581
+ options.max_sequential_skip_in_iterations,
582
+ nullptr /* read_callback */));
583
+
584
+ db_iter->SeekToFirst();
585
+ ASSERT_TRUE(db_iter->Valid());
586
+ ASSERT_EQ(db_iter->key().ToString(), "a");
587
+ ASSERT_EQ(db_iter->value().ToString(), "val_a");
588
+
589
+ db_iter->Next();
590
+ ASSERT_TRUE(db_iter->Valid());
591
+ ASSERT_EQ(db_iter->key().ToString(), "b");
592
+ ASSERT_EQ(db_iter->value().ToString(), "val_b");
593
+
594
+ db_iter->Prev();
595
+ ASSERT_TRUE(db_iter->Valid());
596
+ ASSERT_EQ(db_iter->key().ToString(), "a");
597
+ ASSERT_EQ(db_iter->value().ToString(), "val_a");
598
+
599
+ db_iter->Prev();
600
+ ASSERT_TRUE(!db_iter->Valid());
601
+ ASSERT_OK(db_iter->status());
602
+ }
603
+
604
+ {
605
+ TestIterator* internal_iter = new TestIterator(BytewiseComparator());
606
+ internal_iter->AddPut("a", "val_a");
607
+ internal_iter->AddPut("b", "val_b");
608
+
609
+ internal_iter->AddPut("a", "val_a");
610
+ internal_iter->AddPut("b", "val_b");
611
+
612
+ internal_iter->AddPut("a", "val_a");
613
+ internal_iter->AddPut("b", "val_b");
614
+
615
+ internal_iter->AddPut("a", "val_a");
616
+ internal_iter->AddPut("b", "val_b");
617
+
618
+ internal_iter->AddPut("a", "val_a");
619
+ internal_iter->AddPut("b", "val_b");
620
+ internal_iter->Finish();
621
+
622
+ ReadOptions ro;
623
+ std::unique_ptr<Iterator> db_iter(NewDBIterator(
624
+ env_, ro, cf_options, mutable_cf_options, BytewiseComparator(),
625
+ internal_iter, nullptr /* version */, 2 /* sequence */,
626
+ options.max_sequential_skip_in_iterations,
627
+ nullptr /* read_callback */));
628
+ db_iter->SeekToLast();
629
+ ASSERT_TRUE(db_iter->Valid());
630
+ ASSERT_EQ(db_iter->key().ToString(), "b");
631
+ ASSERT_EQ(db_iter->value().ToString(), "val_b");
632
+
633
+ db_iter->Next();
634
+ ASSERT_TRUE(!db_iter->Valid());
635
+
636
+ db_iter->SeekToLast();
637
+ ASSERT_TRUE(db_iter->Valid());
638
+ ASSERT_EQ(db_iter->key().ToString(), "b");
639
+ ASSERT_EQ(db_iter->value().ToString(), "val_b");
640
+ }
641
+
642
+ {
643
+ TestIterator* internal_iter = new TestIterator(BytewiseComparator());
644
+ internal_iter->AddPut("a", "val_a");
645
+ internal_iter->AddPut("a", "val_a");
646
+ internal_iter->AddPut("a", "val_a");
647
+ internal_iter->AddPut("a", "val_a");
648
+ internal_iter->AddPut("a", "val_a");
649
+
650
+ internal_iter->AddPut("b", "val_b");
651
+
652
+ internal_iter->AddPut("c", "val_c");
653
+ internal_iter->Finish();
654
+
655
+ ReadOptions ro;
656
+ std::unique_ptr<Iterator> db_iter(NewDBIterator(
657
+ env_, ro, cf_options, mutable_cf_options, BytewiseComparator(),
658
+ internal_iter, nullptr /* version */, 10 /* sequence */,
659
+ options.max_sequential_skip_in_iterations,
660
+ nullptr /* read_callback */));
661
+ db_iter->SeekToLast();
662
+ ASSERT_TRUE(db_iter->Valid());
663
+ ASSERT_EQ(db_iter->key().ToString(), "c");
664
+ ASSERT_EQ(db_iter->value().ToString(), "val_c");
665
+
666
+ db_iter->Prev();
667
+ ASSERT_TRUE(db_iter->Valid());
668
+ ASSERT_EQ(db_iter->key().ToString(), "b");
669
+ ASSERT_EQ(db_iter->value().ToString(), "val_b");
670
+
671
+ db_iter->Next();
672
+ ASSERT_TRUE(db_iter->Valid());
673
+ ASSERT_EQ(db_iter->key().ToString(), "c");
674
+ ASSERT_EQ(db_iter->value().ToString(), "val_c");
675
+ }
676
+ }
677
+
678
+ TEST_F(DBIteratorTest, DBIteratorEmpty) {
679
+ Options options;
680
+ ImmutableCFOptions cf_options = ImmutableCFOptions(options);
681
+ MutableCFOptions mutable_cf_options = MutableCFOptions(options);
682
+ ReadOptions ro;
683
+
684
+ {
685
+ TestIterator* internal_iter = new TestIterator(BytewiseComparator());
686
+ internal_iter->Finish();
687
+
688
+ std::unique_ptr<Iterator> db_iter(NewDBIterator(
689
+ env_, ro, cf_options, mutable_cf_options, BytewiseComparator(),
690
+ internal_iter, nullptr /* version */, 0 /* sequence */,
691
+ options.max_sequential_skip_in_iterations,
692
+ nullptr /* read_callback */));
693
+ db_iter->SeekToLast();
694
+ ASSERT_TRUE(!db_iter->Valid());
695
+ ASSERT_OK(db_iter->status());
696
+ }
697
+
698
+ {
699
+ TestIterator* internal_iter = new TestIterator(BytewiseComparator());
700
+ internal_iter->Finish();
701
+
702
+ std::unique_ptr<Iterator> db_iter(NewDBIterator(
703
+ env_, ro, cf_options, mutable_cf_options, BytewiseComparator(),
704
+ internal_iter, nullptr /* version */, 0 /* sequence */,
705
+ options.max_sequential_skip_in_iterations,
706
+ nullptr /* read_callback */));
707
+ db_iter->SeekToFirst();
708
+ ASSERT_TRUE(!db_iter->Valid());
709
+ ASSERT_OK(db_iter->status());
710
+ }
711
+ }
712
+
713
+ TEST_F(DBIteratorTest, DBIteratorUseSkipCountSkips) {
714
+ ReadOptions ro;
715
+ Options options;
716
+ options.statistics = ROCKSDB_NAMESPACE::CreateDBStatistics();
717
+ options.merge_operator = MergeOperators::CreateFromStringId("stringappend");
718
+
719
+ TestIterator* internal_iter = new TestIterator(BytewiseComparator());
720
+ for (size_t i = 0; i < 200; ++i) {
721
+ internal_iter->AddPut("a", "a");
722
+ internal_iter->AddPut("b", "b");
723
+ internal_iter->AddPut("c", "c");
724
+ }
725
+ internal_iter->Finish();
726
+
727
+ std::unique_ptr<Iterator> db_iter(NewDBIterator(
728
+ env_, ro, ImmutableCFOptions(options), MutableCFOptions(options),
729
+ BytewiseComparator(), internal_iter, nullptr /* version */,
730
+ 2 /* sequence */, options.max_sequential_skip_in_iterations,
731
+ nullptr /* read_callback */));
732
+ db_iter->SeekToLast();
733
+ ASSERT_TRUE(db_iter->Valid());
734
+ ASSERT_EQ(db_iter->key().ToString(), "c");
735
+ ASSERT_EQ(db_iter->value().ToString(), "c");
736
+ ASSERT_EQ(TestGetTickerCount(options, NUMBER_OF_RESEEKS_IN_ITERATION), 1u);
737
+
738
+ db_iter->Prev();
739
+ ASSERT_TRUE(db_iter->Valid());
740
+ ASSERT_EQ(db_iter->key().ToString(), "b");
741
+ ASSERT_EQ(db_iter->value().ToString(), "b");
742
+ ASSERT_EQ(TestGetTickerCount(options, NUMBER_OF_RESEEKS_IN_ITERATION), 2u);
743
+
744
+ db_iter->Prev();
745
+ ASSERT_TRUE(db_iter->Valid());
746
+ ASSERT_EQ(db_iter->key().ToString(), "a");
747
+ ASSERT_EQ(db_iter->value().ToString(), "a");
748
+ ASSERT_EQ(TestGetTickerCount(options, NUMBER_OF_RESEEKS_IN_ITERATION), 3u);
749
+
750
+ db_iter->Prev();
751
+ ASSERT_TRUE(!db_iter->Valid());
752
+ ASSERT_OK(db_iter->status());
753
+ ASSERT_EQ(TestGetTickerCount(options, NUMBER_OF_RESEEKS_IN_ITERATION), 3u);
754
+ }
755
+
756
+ TEST_F(DBIteratorTest, DBIteratorUseSkip) {
757
+ ReadOptions ro;
758
+ Options options;
759
+ options.merge_operator = MergeOperators::CreateFromStringId("stringappend");
760
+ ImmutableCFOptions cf_options = ImmutableCFOptions(options);
761
+ MutableCFOptions mutable_cf_options = MutableCFOptions(options);
762
+
763
+ {
764
+ for (size_t i = 0; i < 200; ++i) {
765
+ TestIterator* internal_iter = new TestIterator(BytewiseComparator());
766
+ internal_iter->AddMerge("b", "merge_1");
767
+ internal_iter->AddMerge("a", "merge_2");
768
+ for (size_t k = 0; k < 200; ++k) {
769
+ internal_iter->AddPut("c", ToString(k));
770
+ }
771
+ internal_iter->Finish();
772
+
773
+ options.statistics = ROCKSDB_NAMESPACE::CreateDBStatistics();
774
+ std::unique_ptr<Iterator> db_iter(NewDBIterator(
775
+ env_, ro, cf_options, mutable_cf_options, BytewiseComparator(),
776
+ internal_iter, nullptr /* version */, i + 2 /* sequence */,
777
+ options.max_sequential_skip_in_iterations,
778
+ nullptr /* read_callback */));
779
+ db_iter->SeekToLast();
780
+ ASSERT_TRUE(db_iter->Valid());
781
+
782
+ ASSERT_EQ(db_iter->key().ToString(), "c");
783
+ ASSERT_EQ(db_iter->value().ToString(), ToString(i));
784
+ db_iter->Prev();
785
+ ASSERT_TRUE(db_iter->Valid());
786
+
787
+ ASSERT_EQ(db_iter->key().ToString(), "b");
788
+ ASSERT_EQ(db_iter->value().ToString(), "merge_1");
789
+ db_iter->Prev();
790
+ ASSERT_TRUE(db_iter->Valid());
791
+
792
+ ASSERT_EQ(db_iter->key().ToString(), "a");
793
+ ASSERT_EQ(db_iter->value().ToString(), "merge_2");
794
+ db_iter->Prev();
795
+
796
+ ASSERT_TRUE(!db_iter->Valid());
797
+ ASSERT_OK(db_iter->status());
798
+ }
799
+ }
800
+
801
+ {
802
+ for (size_t i = 0; i < 200; ++i) {
803
+ TestIterator* internal_iter = new TestIterator(BytewiseComparator());
804
+ internal_iter->AddMerge("b", "merge_1");
805
+ internal_iter->AddMerge("a", "merge_2");
806
+ for (size_t k = 0; k < 200; ++k) {
807
+ internal_iter->AddDeletion("c");
808
+ }
809
+ internal_iter->AddPut("c", "200");
810
+ internal_iter->Finish();
811
+
812
+ std::unique_ptr<Iterator> db_iter(NewDBIterator(
813
+ env_, ro, cf_options, mutable_cf_options, BytewiseComparator(),
814
+ internal_iter, nullptr /* version */, i + 2 /* sequence */,
815
+ options.max_sequential_skip_in_iterations,
816
+ nullptr /* read_callback */));
817
+ db_iter->SeekToLast();
818
+ ASSERT_TRUE(db_iter->Valid());
819
+
820
+ ASSERT_EQ(db_iter->key().ToString(), "b");
821
+ ASSERT_EQ(db_iter->value().ToString(), "merge_1");
822
+ db_iter->Prev();
823
+ ASSERT_TRUE(db_iter->Valid());
824
+
825
+ ASSERT_EQ(db_iter->key().ToString(), "a");
826
+ ASSERT_EQ(db_iter->value().ToString(), "merge_2");
827
+ db_iter->Prev();
828
+
829
+ ASSERT_TRUE(!db_iter->Valid());
830
+ ASSERT_OK(db_iter->status());
831
+ }
832
+
833
+ {
834
+ TestIterator* internal_iter = new TestIterator(BytewiseComparator());
835
+ internal_iter->AddMerge("b", "merge_1");
836
+ internal_iter->AddMerge("a", "merge_2");
837
+ for (size_t i = 0; i < 200; ++i) {
838
+ internal_iter->AddDeletion("c");
839
+ }
840
+ internal_iter->AddPut("c", "200");
841
+ internal_iter->Finish();
842
+
843
+ std::unique_ptr<Iterator> db_iter(NewDBIterator(
844
+ env_, ro, cf_options, mutable_cf_options, BytewiseComparator(),
845
+ internal_iter, nullptr /* version */, 202 /* sequence */,
846
+ options.max_sequential_skip_in_iterations,
847
+ nullptr /* read_callback */));
848
+ db_iter->SeekToLast();
849
+ ASSERT_TRUE(db_iter->Valid());
850
+
851
+ ASSERT_EQ(db_iter->key().ToString(), "c");
852
+ ASSERT_EQ(db_iter->value().ToString(), "200");
853
+ db_iter->Prev();
854
+ ASSERT_TRUE(db_iter->Valid());
855
+
856
+ ASSERT_EQ(db_iter->key().ToString(), "b");
857
+ ASSERT_EQ(db_iter->value().ToString(), "merge_1");
858
+ db_iter->Prev();
859
+ ASSERT_TRUE(db_iter->Valid());
860
+
861
+ ASSERT_EQ(db_iter->key().ToString(), "a");
862
+ ASSERT_EQ(db_iter->value().ToString(), "merge_2");
863
+ db_iter->Prev();
864
+
865
+ ASSERT_TRUE(!db_iter->Valid());
866
+ ASSERT_OK(db_iter->status());
867
+ }
868
+ }
869
+
870
+ {
871
+ for (size_t i = 0; i < 200; ++i) {
872
+ TestIterator* internal_iter = new TestIterator(BytewiseComparator());
873
+ for (size_t k = 0; k < 200; ++k) {
874
+ internal_iter->AddDeletion("c");
875
+ }
876
+ internal_iter->AddPut("c", "200");
877
+ internal_iter->Finish();
878
+ std::unique_ptr<Iterator> db_iter(NewDBIterator(
879
+ env_, ro, cf_options, mutable_cf_options, BytewiseComparator(),
880
+ internal_iter, nullptr /* version */, i /* sequence */,
881
+ options.max_sequential_skip_in_iterations,
882
+ nullptr /* read_callback */));
883
+ db_iter->SeekToLast();
884
+ ASSERT_TRUE(!db_iter->Valid());
885
+ ASSERT_OK(db_iter->status());
886
+
887
+ db_iter->SeekToFirst();
888
+ ASSERT_TRUE(!db_iter->Valid());
889
+ ASSERT_OK(db_iter->status());
890
+ }
891
+
892
+ TestIterator* internal_iter = new TestIterator(BytewiseComparator());
893
+ for (size_t i = 0; i < 200; ++i) {
894
+ internal_iter->AddDeletion("c");
895
+ }
896
+ internal_iter->AddPut("c", "200");
897
+ internal_iter->Finish();
898
+ std::unique_ptr<Iterator> db_iter(NewDBIterator(
899
+ env_, ro, cf_options, mutable_cf_options, BytewiseComparator(),
900
+ internal_iter, nullptr /* version */, 200 /* sequence */,
901
+ options.max_sequential_skip_in_iterations,
902
+ nullptr /* read_callback */));
903
+ db_iter->SeekToLast();
904
+ ASSERT_TRUE(db_iter->Valid());
905
+ ASSERT_EQ(db_iter->key().ToString(), "c");
906
+ ASSERT_EQ(db_iter->value().ToString(), "200");
907
+
908
+ db_iter->Prev();
909
+ ASSERT_TRUE(!db_iter->Valid());
910
+ ASSERT_OK(db_iter->status());
911
+
912
+ db_iter->SeekToFirst();
913
+ ASSERT_TRUE(db_iter->Valid());
914
+ ASSERT_EQ(db_iter->key().ToString(), "c");
915
+ ASSERT_EQ(db_iter->value().ToString(), "200");
916
+
917
+ db_iter->Next();
918
+ ASSERT_TRUE(!db_iter->Valid());
919
+ ASSERT_OK(db_iter->status());
920
+ }
921
+
922
+ {
923
+ for (size_t i = 0; i < 200; ++i) {
924
+ TestIterator* internal_iter = new TestIterator(BytewiseComparator());
925
+ internal_iter->AddMerge("b", "merge_1");
926
+ internal_iter->AddMerge("a", "merge_2");
927
+ for (size_t k = 0; k < 200; ++k) {
928
+ internal_iter->AddPut("d", ToString(k));
929
+ }
930
+
931
+ for (size_t k = 0; k < 200; ++k) {
932
+ internal_iter->AddPut("c", ToString(k));
933
+ }
934
+ internal_iter->Finish();
935
+
936
+ std::unique_ptr<Iterator> db_iter(NewDBIterator(
937
+ env_, ro, cf_options, mutable_cf_options, BytewiseComparator(),
938
+ internal_iter, nullptr /* version */, i + 2 /* sequence */,
939
+ options.max_sequential_skip_in_iterations,
940
+ nullptr /* read_callback */));
941
+ db_iter->SeekToLast();
942
+ ASSERT_TRUE(db_iter->Valid());
943
+
944
+ ASSERT_EQ(db_iter->key().ToString(), "d");
945
+ ASSERT_EQ(db_iter->value().ToString(), ToString(i));
946
+ db_iter->Prev();
947
+ ASSERT_TRUE(db_iter->Valid());
948
+
949
+ ASSERT_EQ(db_iter->key().ToString(), "b");
950
+ ASSERT_EQ(db_iter->value().ToString(), "merge_1");
951
+ db_iter->Prev();
952
+ ASSERT_TRUE(db_iter->Valid());
953
+
954
+ ASSERT_EQ(db_iter->key().ToString(), "a");
955
+ ASSERT_EQ(db_iter->value().ToString(), "merge_2");
956
+ db_iter->Prev();
957
+
958
+ ASSERT_TRUE(!db_iter->Valid());
959
+ ASSERT_OK(db_iter->status());
960
+ }
961
+ }
962
+
963
+ {
964
+ for (size_t i = 0; i < 200; ++i) {
965
+ TestIterator* internal_iter = new TestIterator(BytewiseComparator());
966
+ internal_iter->AddMerge("b", "b");
967
+ internal_iter->AddMerge("a", "a");
968
+ for (size_t k = 0; k < 200; ++k) {
969
+ internal_iter->AddMerge("c", ToString(k));
970
+ }
971
+ internal_iter->Finish();
972
+
973
+ std::unique_ptr<Iterator> db_iter(NewDBIterator(
974
+ env_, ro, cf_options, mutable_cf_options, BytewiseComparator(),
975
+ internal_iter, nullptr /* version */, i + 2 /* sequence */,
976
+ options.max_sequential_skip_in_iterations,
977
+ nullptr /* read_callback */));
978
+ db_iter->SeekToLast();
979
+ ASSERT_TRUE(db_iter->Valid());
980
+
981
+ ASSERT_EQ(db_iter->key().ToString(), "c");
982
+ std::string merge_result = "0";
983
+ for (size_t j = 1; j <= i; ++j) {
984
+ merge_result += "," + ToString(j);
985
+ }
986
+ ASSERT_EQ(db_iter->value().ToString(), merge_result);
987
+
988
+ db_iter->Prev();
989
+ ASSERT_TRUE(db_iter->Valid());
990
+ ASSERT_EQ(db_iter->key().ToString(), "b");
991
+ ASSERT_EQ(db_iter->value().ToString(), "b");
992
+
993
+ db_iter->Prev();
994
+ ASSERT_TRUE(db_iter->Valid());
995
+ ASSERT_EQ(db_iter->key().ToString(), "a");
996
+ ASSERT_EQ(db_iter->value().ToString(), "a");
997
+
998
+ db_iter->Prev();
999
+ ASSERT_TRUE(!db_iter->Valid());
1000
+ ASSERT_OK(db_iter->status());
1001
+ }
1002
+ }
1003
+ }
1004
+
1005
+ TEST_F(DBIteratorTest, DBIteratorSkipInternalKeys) {
1006
+ Options options;
1007
+ ImmutableCFOptions cf_options = ImmutableCFOptions(options);
1008
+ MutableCFOptions mutable_cf_options = MutableCFOptions(options);
1009
+ ReadOptions ro;
1010
+
1011
+ // Basic test case ... Make sure explicityly passing the default value works.
1012
+ // Skipping internal keys is disabled by default, when the value is 0.
1013
+ {
1014
+ TestIterator* internal_iter = new TestIterator(BytewiseComparator());
1015
+ internal_iter->AddPut("a", "val_a");
1016
+ internal_iter->AddDeletion("b");
1017
+ internal_iter->AddDeletion("b");
1018
+ internal_iter->AddPut("c", "val_c");
1019
+ internal_iter->AddPut("c", "val_c");
1020
+ internal_iter->AddDeletion("c");
1021
+ internal_iter->AddPut("d", "val_d");
1022
+ internal_iter->Finish();
1023
+
1024
+ ro.max_skippable_internal_keys = 0;
1025
+ std::unique_ptr<Iterator> db_iter(NewDBIterator(
1026
+ env_, ro, cf_options, mutable_cf_options, BytewiseComparator(),
1027
+ internal_iter, nullptr /* version */, 10 /* sequence */,
1028
+ options.max_sequential_skip_in_iterations,
1029
+ nullptr /* read_callback */));
1030
+
1031
+ db_iter->SeekToFirst();
1032
+ ASSERT_TRUE(db_iter->Valid());
1033
+ ASSERT_EQ(db_iter->key().ToString(), "a");
1034
+ ASSERT_EQ(db_iter->value().ToString(), "val_a");
1035
+
1036
+ db_iter->Next();
1037
+ ASSERT_TRUE(db_iter->Valid());
1038
+ ASSERT_EQ(db_iter->key().ToString(), "d");
1039
+ ASSERT_EQ(db_iter->value().ToString(), "val_d");
1040
+
1041
+ db_iter->Next();
1042
+ ASSERT_TRUE(!db_iter->Valid());
1043
+ ASSERT_TRUE(db_iter->status().ok());
1044
+
1045
+ db_iter->SeekToLast();
1046
+ ASSERT_TRUE(db_iter->Valid());
1047
+ ASSERT_EQ(db_iter->key().ToString(), "d");
1048
+ ASSERT_EQ(db_iter->value().ToString(), "val_d");
1049
+
1050
+ db_iter->Prev();
1051
+ ASSERT_TRUE(db_iter->Valid());
1052
+ ASSERT_EQ(db_iter->key().ToString(), "a");
1053
+ ASSERT_EQ(db_iter->value().ToString(), "val_a");
1054
+
1055
+ db_iter->Prev();
1056
+ ASSERT_TRUE(!db_iter->Valid());
1057
+ ASSERT_OK(db_iter->status());
1058
+ }
1059
+
1060
+ // Test to make sure that the request will *not* fail as incomplete if
1061
+ // num_internal_keys_skipped is *equal* to max_skippable_internal_keys
1062
+ // threshold. (It will fail as incomplete only when the threshold is
1063
+ // exceeded.)
1064
+ {
1065
+ TestIterator* internal_iter = new TestIterator(BytewiseComparator());
1066
+ internal_iter->AddPut("a", "val_a");
1067
+ internal_iter->AddDeletion("b");
1068
+ internal_iter->AddDeletion("b");
1069
+ internal_iter->AddPut("c", "val_c");
1070
+ internal_iter->Finish();
1071
+
1072
+ ro.max_skippable_internal_keys = 2;
1073
+ std::unique_ptr<Iterator> db_iter(NewDBIterator(
1074
+ env_, ro, cf_options, mutable_cf_options, BytewiseComparator(),
1075
+ internal_iter, nullptr /* version */, 10 /* sequence */,
1076
+ options.max_sequential_skip_in_iterations,
1077
+ nullptr /* read_callback */));
1078
+
1079
+ db_iter->SeekToFirst();
1080
+ ASSERT_TRUE(db_iter->Valid());
1081
+ ASSERT_EQ(db_iter->key().ToString(), "a");
1082
+ ASSERT_EQ(db_iter->value().ToString(), "val_a");
1083
+
1084
+ db_iter->Next();
1085
+ ASSERT_TRUE(db_iter->Valid());
1086
+ ASSERT_EQ(db_iter->key().ToString(), "c");
1087
+ ASSERT_EQ(db_iter->value().ToString(), "val_c");
1088
+
1089
+ db_iter->Next();
1090
+ ASSERT_TRUE(!db_iter->Valid());
1091
+ ASSERT_TRUE(db_iter->status().ok());
1092
+
1093
+ db_iter->SeekToLast();
1094
+ ASSERT_TRUE(db_iter->Valid());
1095
+ ASSERT_EQ(db_iter->key().ToString(), "c");
1096
+ ASSERT_EQ(db_iter->value().ToString(), "val_c");
1097
+
1098
+ db_iter->Prev();
1099
+ ASSERT_EQ(db_iter->key().ToString(), "a");
1100
+ ASSERT_EQ(db_iter->value().ToString(), "val_a");
1101
+
1102
+ db_iter->Prev();
1103
+ ASSERT_TRUE(!db_iter->Valid());
1104
+ ASSERT_TRUE(db_iter->status().ok());
1105
+ }
1106
+
1107
+ // Fail the request as incomplete when num_internal_keys_skipped >
1108
+ // max_skippable_internal_keys
1109
+ {
1110
+ TestIterator* internal_iter = new TestIterator(BytewiseComparator());
1111
+ internal_iter->AddPut("a", "val_a");
1112
+ internal_iter->AddDeletion("b");
1113
+ internal_iter->AddDeletion("b");
1114
+ internal_iter->AddDeletion("b");
1115
+ internal_iter->AddPut("c", "val_c");
1116
+ internal_iter->Finish();
1117
+
1118
+ ro.max_skippable_internal_keys = 2;
1119
+ std::unique_ptr<Iterator> db_iter(NewDBIterator(
1120
+ env_, ro, cf_options, mutable_cf_options, BytewiseComparator(),
1121
+ internal_iter, nullptr /* version */, 10 /* sequence */,
1122
+ options.max_sequential_skip_in_iterations,
1123
+ nullptr /* read_callback */));
1124
+
1125
+ db_iter->SeekToFirst();
1126
+ ASSERT_TRUE(db_iter->Valid());
1127
+ ASSERT_EQ(db_iter->key().ToString(), "a");
1128
+ ASSERT_EQ(db_iter->value().ToString(), "val_a");
1129
+
1130
+ db_iter->Next();
1131
+ ASSERT_TRUE(!db_iter->Valid());
1132
+ ASSERT_TRUE(db_iter->status().IsIncomplete());
1133
+
1134
+ db_iter->SeekToLast();
1135
+ ASSERT_TRUE(db_iter->Valid());
1136
+ ASSERT_EQ(db_iter->key().ToString(), "c");
1137
+ ASSERT_EQ(db_iter->value().ToString(), "val_c");
1138
+
1139
+ db_iter->Prev();
1140
+ ASSERT_TRUE(!db_iter->Valid());
1141
+ ASSERT_TRUE(db_iter->status().IsIncomplete());
1142
+ }
1143
+
1144
+ // Test that the num_internal_keys_skipped counter resets after a successful
1145
+ // read.
1146
+ {
1147
+ TestIterator* internal_iter = new TestIterator(BytewiseComparator());
1148
+ internal_iter->AddPut("a", "val_a");
1149
+ internal_iter->AddDeletion("b");
1150
+ internal_iter->AddDeletion("b");
1151
+ internal_iter->AddPut("c", "val_c");
1152
+ internal_iter->AddDeletion("d");
1153
+ internal_iter->AddDeletion("d");
1154
+ internal_iter->AddDeletion("d");
1155
+ internal_iter->AddPut("e", "val_e");
1156
+ internal_iter->Finish();
1157
+
1158
+ ro.max_skippable_internal_keys = 2;
1159
+ std::unique_ptr<Iterator> db_iter(NewDBIterator(
1160
+ env_, ro, cf_options, mutable_cf_options, BytewiseComparator(),
1161
+ internal_iter, nullptr /* version */, 10 /* sequence */,
1162
+ options.max_sequential_skip_in_iterations,
1163
+ nullptr /* read_callback */));
1164
+
1165
+ db_iter->SeekToFirst();
1166
+ ASSERT_TRUE(db_iter->Valid());
1167
+ ASSERT_EQ(db_iter->key().ToString(), "a");
1168
+ ASSERT_EQ(db_iter->value().ToString(), "val_a");
1169
+
1170
+ db_iter->Next();
1171
+ ASSERT_TRUE(db_iter->Valid());
1172
+ ASSERT_EQ(db_iter->key().ToString(), "c");
1173
+ ASSERT_EQ(db_iter->value().ToString(), "val_c");
1174
+
1175
+ db_iter->Next(); // num_internal_keys_skipped counter resets here.
1176
+ ASSERT_TRUE(!db_iter->Valid());
1177
+ ASSERT_TRUE(db_iter->status().IsIncomplete());
1178
+ }
1179
+
1180
+ // Test that the num_internal_keys_skipped counter resets after a successful
1181
+ // read.
1182
+ // Reverse direction
1183
+ {
1184
+ TestIterator* internal_iter = new TestIterator(BytewiseComparator());
1185
+ internal_iter->AddPut("a", "val_a");
1186
+ internal_iter->AddDeletion("b");
1187
+ internal_iter->AddDeletion("b");
1188
+ internal_iter->AddDeletion("b");
1189
+ internal_iter->AddPut("c", "val_c");
1190
+ internal_iter->AddDeletion("d");
1191
+ internal_iter->AddDeletion("d");
1192
+ internal_iter->AddPut("e", "val_e");
1193
+ internal_iter->Finish();
1194
+
1195
+ ro.max_skippable_internal_keys = 2;
1196
+ std::unique_ptr<Iterator> db_iter(NewDBIterator(
1197
+ env_, ro, cf_options, mutable_cf_options, BytewiseComparator(),
1198
+ internal_iter, nullptr /* version */, 10 /* sequence */,
1199
+ options.max_sequential_skip_in_iterations,
1200
+ nullptr /* read_callback */));
1201
+
1202
+ db_iter->SeekToLast();
1203
+ ASSERT_TRUE(db_iter->Valid());
1204
+ ASSERT_EQ(db_iter->key().ToString(), "e");
1205
+ ASSERT_EQ(db_iter->value().ToString(), "val_e");
1206
+
1207
+ db_iter->Prev();
1208
+ ASSERT_TRUE(db_iter->Valid());
1209
+ ASSERT_EQ(db_iter->key().ToString(), "c");
1210
+ ASSERT_EQ(db_iter->value().ToString(), "val_c");
1211
+
1212
+ db_iter->Prev(); // num_internal_keys_skipped counter resets here.
1213
+ ASSERT_TRUE(!db_iter->Valid());
1214
+ ASSERT_TRUE(db_iter->status().IsIncomplete());
1215
+ }
1216
+
1217
+ // Test that skipping separate keys is handled
1218
+ {
1219
+ TestIterator* internal_iter = new TestIterator(BytewiseComparator());
1220
+ internal_iter->AddPut("a", "val_a");
1221
+ internal_iter->AddDeletion("b");
1222
+ internal_iter->AddDeletion("c");
1223
+ internal_iter->AddDeletion("d");
1224
+ internal_iter->AddPut("e", "val_e");
1225
+ internal_iter->Finish();
1226
+
1227
+ ro.max_skippable_internal_keys = 2;
1228
+ std::unique_ptr<Iterator> db_iter(NewDBIterator(
1229
+ env_, ro, cf_options, mutable_cf_options, BytewiseComparator(),
1230
+ internal_iter, nullptr /* version */, 10 /* sequence */,
1231
+ options.max_sequential_skip_in_iterations,
1232
+ nullptr /* read_callback */));
1233
+
1234
+ db_iter->SeekToFirst();
1235
+ ASSERT_TRUE(db_iter->Valid());
1236
+ ASSERT_EQ(db_iter->key().ToString(), "a");
1237
+ ASSERT_EQ(db_iter->value().ToString(), "val_a");
1238
+
1239
+ db_iter->Next();
1240
+ ASSERT_TRUE(!db_iter->Valid());
1241
+ ASSERT_TRUE(db_iter->status().IsIncomplete());
1242
+
1243
+ db_iter->SeekToLast();
1244
+ ASSERT_TRUE(db_iter->Valid());
1245
+ ASSERT_EQ(db_iter->key().ToString(), "e");
1246
+ ASSERT_EQ(db_iter->value().ToString(), "val_e");
1247
+
1248
+ db_iter->Prev();
1249
+ ASSERT_TRUE(!db_iter->Valid());
1250
+ ASSERT_TRUE(db_iter->status().IsIncomplete());
1251
+ }
1252
+
1253
+ // Test if alternating puts and deletes of the same key are handled correctly.
1254
+ {
1255
+ TestIterator* internal_iter = new TestIterator(BytewiseComparator());
1256
+ internal_iter->AddPut("a", "val_a");
1257
+ internal_iter->AddPut("b", "val_b");
1258
+ internal_iter->AddDeletion("b");
1259
+ internal_iter->AddPut("c", "val_c");
1260
+ internal_iter->AddDeletion("c");
1261
+ internal_iter->AddPut("d", "val_d");
1262
+ internal_iter->AddDeletion("d");
1263
+ internal_iter->AddPut("e", "val_e");
1264
+ internal_iter->Finish();
1265
+
1266
+ ro.max_skippable_internal_keys = 2;
1267
+ std::unique_ptr<Iterator> db_iter(NewDBIterator(
1268
+ env_, ro, cf_options, mutable_cf_options, BytewiseComparator(),
1269
+ internal_iter, nullptr /* version */, 10 /* sequence */,
1270
+ options.max_sequential_skip_in_iterations,
1271
+ nullptr /* read_callback */));
1272
+
1273
+ db_iter->SeekToFirst();
1274
+ ASSERT_TRUE(db_iter->Valid());
1275
+ ASSERT_EQ(db_iter->key().ToString(), "a");
1276
+ ASSERT_EQ(db_iter->value().ToString(), "val_a");
1277
+
1278
+ db_iter->Next();
1279
+ ASSERT_TRUE(!db_iter->Valid());
1280
+ ASSERT_TRUE(db_iter->status().IsIncomplete());
1281
+
1282
+ db_iter->SeekToLast();
1283
+ ASSERT_TRUE(db_iter->Valid());
1284
+ ASSERT_EQ(db_iter->key().ToString(), "e");
1285
+ ASSERT_EQ(db_iter->value().ToString(), "val_e");
1286
+
1287
+ db_iter->Prev();
1288
+ ASSERT_TRUE(!db_iter->Valid());
1289
+ ASSERT_TRUE(db_iter->status().IsIncomplete());
1290
+ }
1291
+
1292
+ // Test for large number of skippable internal keys with *default*
1293
+ // max_sequential_skip_in_iterations.
1294
+ {
1295
+ for (size_t i = 1; i <= 200; ++i) {
1296
+ TestIterator* internal_iter = new TestIterator(BytewiseComparator());
1297
+ internal_iter->AddPut("a", "val_a");
1298
+ for (size_t j = 1; j <= i; ++j) {
1299
+ internal_iter->AddPut("b", "val_b");
1300
+ internal_iter->AddDeletion("b");
1301
+ }
1302
+ internal_iter->AddPut("c", "val_c");
1303
+ internal_iter->Finish();
1304
+
1305
+ ro.max_skippable_internal_keys = i;
1306
+ std::unique_ptr<Iterator> db_iter(NewDBIterator(
1307
+ env_, ro, cf_options, mutable_cf_options, BytewiseComparator(),
1308
+ internal_iter, nullptr /* version */, 2 * i + 1 /* sequence */,
1309
+ options.max_sequential_skip_in_iterations,
1310
+ nullptr /* read_callback */));
1311
+
1312
+ db_iter->SeekToFirst();
1313
+ ASSERT_TRUE(db_iter->Valid());
1314
+ ASSERT_EQ(db_iter->key().ToString(), "a");
1315
+ ASSERT_EQ(db_iter->value().ToString(), "val_a");
1316
+
1317
+ db_iter->Next();
1318
+ if ((options.max_sequential_skip_in_iterations + 1) >=
1319
+ ro.max_skippable_internal_keys) {
1320
+ ASSERT_TRUE(!db_iter->Valid());
1321
+ ASSERT_TRUE(db_iter->status().IsIncomplete());
1322
+ } else {
1323
+ ASSERT_TRUE(db_iter->Valid());
1324
+ ASSERT_EQ(db_iter->key().ToString(), "c");
1325
+ ASSERT_EQ(db_iter->value().ToString(), "val_c");
1326
+ }
1327
+
1328
+ db_iter->SeekToLast();
1329
+ ASSERT_TRUE(db_iter->Valid());
1330
+ ASSERT_EQ(db_iter->key().ToString(), "c");
1331
+ ASSERT_EQ(db_iter->value().ToString(), "val_c");
1332
+
1333
+ db_iter->Prev();
1334
+ if ((options.max_sequential_skip_in_iterations + 1) >=
1335
+ ro.max_skippable_internal_keys) {
1336
+ ASSERT_TRUE(!db_iter->Valid());
1337
+ ASSERT_TRUE(db_iter->status().IsIncomplete());
1338
+ } else {
1339
+ ASSERT_TRUE(db_iter->Valid());
1340
+ ASSERT_EQ(db_iter->key().ToString(), "a");
1341
+ ASSERT_EQ(db_iter->value().ToString(), "val_a");
1342
+ }
1343
+ }
1344
+ }
1345
+
1346
+ // Test for large number of skippable internal keys with a *non-default*
1347
+ // max_sequential_skip_in_iterations.
1348
+ {
1349
+ for (size_t i = 1; i <= 200; ++i) {
1350
+ TestIterator* internal_iter = new TestIterator(BytewiseComparator());
1351
+ internal_iter->AddPut("a", "val_a");
1352
+ for (size_t j = 1; j <= i; ++j) {
1353
+ internal_iter->AddPut("b", "val_b");
1354
+ internal_iter->AddDeletion("b");
1355
+ }
1356
+ internal_iter->AddPut("c", "val_c");
1357
+ internal_iter->Finish();
1358
+
1359
+ options.max_sequential_skip_in_iterations = 1000;
1360
+ ro.max_skippable_internal_keys = i;
1361
+ std::unique_ptr<Iterator> db_iter(NewDBIterator(
1362
+ env_, ro, cf_options, mutable_cf_options, BytewiseComparator(),
1363
+ internal_iter, nullptr /* version */, 2 * i + 1 /* sequence */,
1364
+ options.max_sequential_skip_in_iterations,
1365
+ nullptr /* read_callback */));
1366
+
1367
+ db_iter->SeekToFirst();
1368
+ ASSERT_TRUE(db_iter->Valid());
1369
+ ASSERT_EQ(db_iter->key().ToString(), "a");
1370
+ ASSERT_EQ(db_iter->value().ToString(), "val_a");
1371
+
1372
+ db_iter->Next();
1373
+ ASSERT_TRUE(!db_iter->Valid());
1374
+ ASSERT_TRUE(db_iter->status().IsIncomplete());
1375
+
1376
+ db_iter->SeekToLast();
1377
+ ASSERT_TRUE(db_iter->Valid());
1378
+ ASSERT_EQ(db_iter->key().ToString(), "c");
1379
+ ASSERT_EQ(db_iter->value().ToString(), "val_c");
1380
+
1381
+ db_iter->Prev();
1382
+ ASSERT_TRUE(!db_iter->Valid());
1383
+ ASSERT_TRUE(db_iter->status().IsIncomplete());
1384
+ }
1385
+ }
1386
+ }
1387
+
1388
+ TEST_F(DBIteratorTest, DBIterator1) {
1389
+ ReadOptions ro;
1390
+ Options options;
1391
+ options.merge_operator = MergeOperators::CreateFromStringId("stringappend");
1392
+
1393
+ TestIterator* internal_iter = new TestIterator(BytewiseComparator());
1394
+ internal_iter->AddPut("a", "0");
1395
+ internal_iter->AddPut("b", "0");
1396
+ internal_iter->AddDeletion("b");
1397
+ internal_iter->AddMerge("a", "1");
1398
+ internal_iter->AddMerge("b", "2");
1399
+ internal_iter->Finish();
1400
+
1401
+ std::unique_ptr<Iterator> db_iter(NewDBIterator(
1402
+ env_, ro, ImmutableCFOptions(options), MutableCFOptions(options),
1403
+ BytewiseComparator(), internal_iter, nullptr /* version */,
1404
+ 1 /* sequence */, options.max_sequential_skip_in_iterations,
1405
+ nullptr /* read_callback */));
1406
+ db_iter->SeekToFirst();
1407
+ ASSERT_TRUE(db_iter->Valid());
1408
+ ASSERT_EQ(db_iter->key().ToString(), "a");
1409
+ ASSERT_EQ(db_iter->value().ToString(), "0");
1410
+ db_iter->Next();
1411
+ ASSERT_TRUE(db_iter->Valid());
1412
+ ASSERT_EQ(db_iter->key().ToString(), "b");
1413
+ db_iter->Next();
1414
+ ASSERT_FALSE(db_iter->Valid());
1415
+ }
1416
+
1417
+ TEST_F(DBIteratorTest, DBIterator2) {
1418
+ ReadOptions ro;
1419
+ Options options;
1420
+ options.merge_operator = MergeOperators::CreateFromStringId("stringappend");
1421
+
1422
+ TestIterator* internal_iter = new TestIterator(BytewiseComparator());
1423
+ internal_iter->AddPut("a", "0");
1424
+ internal_iter->AddPut("b", "0");
1425
+ internal_iter->AddDeletion("b");
1426
+ internal_iter->AddMerge("a", "1");
1427
+ internal_iter->AddMerge("b", "2");
1428
+ internal_iter->Finish();
1429
+
1430
+ std::unique_ptr<Iterator> db_iter(NewDBIterator(
1431
+ env_, ro, ImmutableCFOptions(options), MutableCFOptions(options),
1432
+ BytewiseComparator(), internal_iter, nullptr /* version */,
1433
+ 0 /* sequence */, options.max_sequential_skip_in_iterations,
1434
+ nullptr /* read_callback */));
1435
+ db_iter->SeekToFirst();
1436
+ ASSERT_TRUE(db_iter->Valid());
1437
+ ASSERT_EQ(db_iter->key().ToString(), "a");
1438
+ ASSERT_EQ(db_iter->value().ToString(), "0");
1439
+ db_iter->Next();
1440
+ ASSERT_TRUE(!db_iter->Valid());
1441
+ }
1442
+
1443
+ TEST_F(DBIteratorTest, DBIterator3) {
1444
+ ReadOptions ro;
1445
+ Options options;
1446
+ options.merge_operator = MergeOperators::CreateFromStringId("stringappend");
1447
+
1448
+ TestIterator* internal_iter = new TestIterator(BytewiseComparator());
1449
+ internal_iter->AddPut("a", "0");
1450
+ internal_iter->AddPut("b", "0");
1451
+ internal_iter->AddDeletion("b");
1452
+ internal_iter->AddMerge("a", "1");
1453
+ internal_iter->AddMerge("b", "2");
1454
+ internal_iter->Finish();
1455
+
1456
+ std::unique_ptr<Iterator> db_iter(NewDBIterator(
1457
+ env_, ro, ImmutableCFOptions(options), MutableCFOptions(options),
1458
+ BytewiseComparator(), internal_iter, nullptr /* version */,
1459
+ 2 /* sequence */, options.max_sequential_skip_in_iterations,
1460
+ nullptr /* read_callback */));
1461
+ db_iter->SeekToFirst();
1462
+ ASSERT_TRUE(db_iter->Valid());
1463
+ ASSERT_EQ(db_iter->key().ToString(), "a");
1464
+ ASSERT_EQ(db_iter->value().ToString(), "0");
1465
+ db_iter->Next();
1466
+ ASSERT_TRUE(!db_iter->Valid());
1467
+ }
1468
+
1469
+ TEST_F(DBIteratorTest, DBIterator4) {
1470
+ ReadOptions ro;
1471
+ Options options;
1472
+ options.merge_operator = MergeOperators::CreateFromStringId("stringappend");
1473
+
1474
+ TestIterator* internal_iter = new TestIterator(BytewiseComparator());
1475
+ internal_iter->AddPut("a", "0");
1476
+ internal_iter->AddPut("b", "0");
1477
+ internal_iter->AddDeletion("b");
1478
+ internal_iter->AddMerge("a", "1");
1479
+ internal_iter->AddMerge("b", "2");
1480
+ internal_iter->Finish();
1481
+
1482
+ std::unique_ptr<Iterator> db_iter(NewDBIterator(
1483
+ env_, ro, ImmutableCFOptions(options), MutableCFOptions(options),
1484
+ BytewiseComparator(), internal_iter, nullptr /* version */,
1485
+ 4 /* sequence */, options.max_sequential_skip_in_iterations,
1486
+ nullptr /* read_callback */));
1487
+ db_iter->SeekToFirst();
1488
+ ASSERT_TRUE(db_iter->Valid());
1489
+ ASSERT_EQ(db_iter->key().ToString(), "a");
1490
+ ASSERT_EQ(db_iter->value().ToString(), "0,1");
1491
+ db_iter->Next();
1492
+ ASSERT_TRUE(db_iter->Valid());
1493
+ ASSERT_EQ(db_iter->key().ToString(), "b");
1494
+ ASSERT_EQ(db_iter->value().ToString(), "2");
1495
+ db_iter->Next();
1496
+ ASSERT_TRUE(!db_iter->Valid());
1497
+ }
1498
+
1499
+ TEST_F(DBIteratorTest, DBIterator5) {
1500
+ ReadOptions ro;
1501
+ Options options;
1502
+ options.merge_operator = MergeOperators::CreateFromStringId("stringappend");
1503
+ ImmutableCFOptions cf_options = ImmutableCFOptions(options);
1504
+ MutableCFOptions mutable_cf_options = MutableCFOptions(options);
1505
+
1506
+ {
1507
+ TestIterator* internal_iter = new TestIterator(BytewiseComparator());
1508
+ internal_iter->AddMerge("a", "merge_1");
1509
+ internal_iter->AddMerge("a", "merge_2");
1510
+ internal_iter->AddMerge("a", "merge_3");
1511
+ internal_iter->AddPut("a", "put_1");
1512
+ internal_iter->AddMerge("a", "merge_4");
1513
+ internal_iter->AddMerge("a", "merge_5");
1514
+ internal_iter->AddMerge("a", "merge_6");
1515
+ internal_iter->Finish();
1516
+
1517
+ std::unique_ptr<Iterator> db_iter(NewDBIterator(
1518
+ env_, ro, cf_options, mutable_cf_options, BytewiseComparator(),
1519
+ internal_iter, nullptr /* version */, 0 /* sequence */,
1520
+ options.max_sequential_skip_in_iterations,
1521
+ nullptr /* read_callback */));
1522
+ db_iter->SeekToLast();
1523
+ ASSERT_TRUE(db_iter->Valid());
1524
+ ASSERT_EQ(db_iter->key().ToString(), "a");
1525
+ ASSERT_EQ(db_iter->value().ToString(), "merge_1");
1526
+ db_iter->Prev();
1527
+ ASSERT_TRUE(!db_iter->Valid());
1528
+ }
1529
+
1530
+ {
1531
+ TestIterator* internal_iter = new TestIterator(BytewiseComparator());
1532
+ internal_iter->AddMerge("a", "merge_1");
1533
+ internal_iter->AddMerge("a", "merge_2");
1534
+ internal_iter->AddMerge("a", "merge_3");
1535
+ internal_iter->AddPut("a", "put_1");
1536
+ internal_iter->AddMerge("a", "merge_4");
1537
+ internal_iter->AddMerge("a", "merge_5");
1538
+ internal_iter->AddMerge("a", "merge_6");
1539
+ internal_iter->Finish();
1540
+
1541
+ std::unique_ptr<Iterator> db_iter(NewDBIterator(
1542
+ env_, ro, cf_options, mutable_cf_options, BytewiseComparator(),
1543
+ internal_iter, nullptr /* version */, 1 /* sequence */,
1544
+ options.max_sequential_skip_in_iterations,
1545
+ nullptr /* read_callback */));
1546
+ db_iter->SeekToLast();
1547
+ ASSERT_TRUE(db_iter->Valid());
1548
+ ASSERT_EQ(db_iter->key().ToString(), "a");
1549
+ ASSERT_EQ(db_iter->value().ToString(), "merge_1,merge_2");
1550
+ db_iter->Prev();
1551
+ ASSERT_TRUE(!db_iter->Valid());
1552
+ }
1553
+
1554
+ {
1555
+ TestIterator* internal_iter = new TestIterator(BytewiseComparator());
1556
+ internal_iter->AddMerge("a", "merge_1");
1557
+ internal_iter->AddMerge("a", "merge_2");
1558
+ internal_iter->AddMerge("a", "merge_3");
1559
+ internal_iter->AddPut("a", "put_1");
1560
+ internal_iter->AddMerge("a", "merge_4");
1561
+ internal_iter->AddMerge("a", "merge_5");
1562
+ internal_iter->AddMerge("a", "merge_6");
1563
+ internal_iter->Finish();
1564
+
1565
+ std::unique_ptr<Iterator> db_iter(NewDBIterator(
1566
+ env_, ro, cf_options, mutable_cf_options, BytewiseComparator(),
1567
+ internal_iter, nullptr /* version */, 2 /* sequence */,
1568
+ options.max_sequential_skip_in_iterations,
1569
+ nullptr /* read_callback */));
1570
+ db_iter->SeekToLast();
1571
+ ASSERT_TRUE(db_iter->Valid());
1572
+ ASSERT_EQ(db_iter->key().ToString(), "a");
1573
+ ASSERT_EQ(db_iter->value().ToString(), "merge_1,merge_2,merge_3");
1574
+ db_iter->Prev();
1575
+ ASSERT_TRUE(!db_iter->Valid());
1576
+ }
1577
+
1578
+ {
1579
+ TestIterator* internal_iter = new TestIterator(BytewiseComparator());
1580
+ internal_iter->AddMerge("a", "merge_1");
1581
+ internal_iter->AddMerge("a", "merge_2");
1582
+ internal_iter->AddMerge("a", "merge_3");
1583
+ internal_iter->AddPut("a", "put_1");
1584
+ internal_iter->AddMerge("a", "merge_4");
1585
+ internal_iter->AddMerge("a", "merge_5");
1586
+ internal_iter->AddMerge("a", "merge_6");
1587
+ internal_iter->Finish();
1588
+
1589
+ std::unique_ptr<Iterator> db_iter(NewDBIterator(
1590
+ env_, ro, cf_options, mutable_cf_options, BytewiseComparator(),
1591
+ internal_iter, nullptr /* version */, 3 /* sequence */,
1592
+ options.max_sequential_skip_in_iterations,
1593
+ nullptr /* read_callback */));
1594
+ db_iter->SeekToLast();
1595
+ ASSERT_TRUE(db_iter->Valid());
1596
+ ASSERT_EQ(db_iter->key().ToString(), "a");
1597
+ ASSERT_EQ(db_iter->value().ToString(), "put_1");
1598
+ db_iter->Prev();
1599
+ ASSERT_TRUE(!db_iter->Valid());
1600
+ }
1601
+
1602
+ {
1603
+ TestIterator* internal_iter = new TestIterator(BytewiseComparator());
1604
+ internal_iter->AddMerge("a", "merge_1");
1605
+ internal_iter->AddMerge("a", "merge_2");
1606
+ internal_iter->AddMerge("a", "merge_3");
1607
+ internal_iter->AddPut("a", "put_1");
1608
+ internal_iter->AddMerge("a", "merge_4");
1609
+ internal_iter->AddMerge("a", "merge_5");
1610
+ internal_iter->AddMerge("a", "merge_6");
1611
+ internal_iter->Finish();
1612
+
1613
+ std::unique_ptr<Iterator> db_iter(NewDBIterator(
1614
+ env_, ro, cf_options, mutable_cf_options, BytewiseComparator(),
1615
+ internal_iter, nullptr /* version */, 4 /* sequence */,
1616
+ options.max_sequential_skip_in_iterations,
1617
+ nullptr /* read_callback */));
1618
+ db_iter->SeekToLast();
1619
+ ASSERT_TRUE(db_iter->Valid());
1620
+ ASSERT_EQ(db_iter->key().ToString(), "a");
1621
+ ASSERT_EQ(db_iter->value().ToString(), "put_1,merge_4");
1622
+ db_iter->Prev();
1623
+ ASSERT_TRUE(!db_iter->Valid());
1624
+ }
1625
+
1626
+ {
1627
+ TestIterator* internal_iter = new TestIterator(BytewiseComparator());
1628
+ internal_iter->AddMerge("a", "merge_1");
1629
+ internal_iter->AddMerge("a", "merge_2");
1630
+ internal_iter->AddMerge("a", "merge_3");
1631
+ internal_iter->AddPut("a", "put_1");
1632
+ internal_iter->AddMerge("a", "merge_4");
1633
+ internal_iter->AddMerge("a", "merge_5");
1634
+ internal_iter->AddMerge("a", "merge_6");
1635
+ internal_iter->Finish();
1636
+
1637
+ std::unique_ptr<Iterator> db_iter(NewDBIterator(
1638
+ env_, ro, cf_options, mutable_cf_options, BytewiseComparator(),
1639
+ internal_iter, nullptr /* version */, 5 /* sequence */,
1640
+ options.max_sequential_skip_in_iterations,
1641
+ nullptr /* read_callback */));
1642
+ db_iter->SeekToLast();
1643
+ ASSERT_TRUE(db_iter->Valid());
1644
+ ASSERT_EQ(db_iter->key().ToString(), "a");
1645
+ ASSERT_EQ(db_iter->value().ToString(), "put_1,merge_4,merge_5");
1646
+ db_iter->Prev();
1647
+ ASSERT_TRUE(!db_iter->Valid());
1648
+ }
1649
+
1650
+ {
1651
+ TestIterator* internal_iter = new TestIterator(BytewiseComparator());
1652
+ internal_iter->AddMerge("a", "merge_1");
1653
+ internal_iter->AddMerge("a", "merge_2");
1654
+ internal_iter->AddMerge("a", "merge_3");
1655
+ internal_iter->AddPut("a", "put_1");
1656
+ internal_iter->AddMerge("a", "merge_4");
1657
+ internal_iter->AddMerge("a", "merge_5");
1658
+ internal_iter->AddMerge("a", "merge_6");
1659
+ internal_iter->Finish();
1660
+
1661
+ std::unique_ptr<Iterator> db_iter(NewDBIterator(
1662
+ env_, ro, cf_options, mutable_cf_options, BytewiseComparator(),
1663
+ internal_iter, nullptr /* version */, 6 /* sequence */,
1664
+ options.max_sequential_skip_in_iterations,
1665
+ nullptr /* read_callback */));
1666
+ db_iter->SeekToLast();
1667
+ ASSERT_TRUE(db_iter->Valid());
1668
+ ASSERT_EQ(db_iter->key().ToString(), "a");
1669
+ ASSERT_EQ(db_iter->value().ToString(), "put_1,merge_4,merge_5,merge_6");
1670
+ db_iter->Prev();
1671
+ ASSERT_TRUE(!db_iter->Valid());
1672
+ }
1673
+
1674
+ {
1675
+ // put, singledelete, merge
1676
+ TestIterator* internal_iter = new TestIterator(BytewiseComparator());
1677
+ internal_iter->AddPut("a", "val_a");
1678
+ internal_iter->AddSingleDeletion("a");
1679
+ internal_iter->AddMerge("a", "merge_1");
1680
+ internal_iter->AddMerge("a", "merge_2");
1681
+ internal_iter->AddPut("b", "val_b");
1682
+ internal_iter->Finish();
1683
+ std::unique_ptr<Iterator> db_iter(NewDBIterator(
1684
+ env_, ro, cf_options, mutable_cf_options, BytewiseComparator(),
1685
+ internal_iter, nullptr /* version */, 10 /* sequence */,
1686
+ options.max_sequential_skip_in_iterations,
1687
+ nullptr /* read_callback */));
1688
+ db_iter->Seek("b");
1689
+ ASSERT_TRUE(db_iter->Valid());
1690
+ ASSERT_EQ(db_iter->key().ToString(), "b");
1691
+ db_iter->Prev();
1692
+ ASSERT_TRUE(db_iter->Valid());
1693
+ ASSERT_EQ(db_iter->key().ToString(), "a");
1694
+ }
1695
+ }
1696
+
1697
+ TEST_F(DBIteratorTest, DBIterator6) {
1698
+ ReadOptions ro;
1699
+ Options options;
1700
+ options.merge_operator = MergeOperators::CreateFromStringId("stringappend");
1701
+ ImmutableCFOptions cf_options = ImmutableCFOptions(options);
1702
+ MutableCFOptions mutable_cf_options = MutableCFOptions(options);
1703
+
1704
+ {
1705
+ TestIterator* internal_iter = new TestIterator(BytewiseComparator());
1706
+ internal_iter->AddMerge("a", "merge_1");
1707
+ internal_iter->AddMerge("a", "merge_2");
1708
+ internal_iter->AddMerge("a", "merge_3");
1709
+ internal_iter->AddDeletion("a");
1710
+ internal_iter->AddMerge("a", "merge_4");
1711
+ internal_iter->AddMerge("a", "merge_5");
1712
+ internal_iter->AddMerge("a", "merge_6");
1713
+ internal_iter->Finish();
1714
+
1715
+ std::unique_ptr<Iterator> db_iter(NewDBIterator(
1716
+ env_, ro, cf_options, mutable_cf_options, BytewiseComparator(),
1717
+ internal_iter, nullptr /* version */, 0 /* sequence */,
1718
+ options.max_sequential_skip_in_iterations,
1719
+ nullptr /* read_callback */));
1720
+ db_iter->SeekToLast();
1721
+ ASSERT_TRUE(db_iter->Valid());
1722
+ ASSERT_EQ(db_iter->key().ToString(), "a");
1723
+ ASSERT_EQ(db_iter->value().ToString(), "merge_1");
1724
+ db_iter->Prev();
1725
+ ASSERT_TRUE(!db_iter->Valid());
1726
+ }
1727
+
1728
+ {
1729
+ TestIterator* internal_iter = new TestIterator(BytewiseComparator());
1730
+ internal_iter->AddMerge("a", "merge_1");
1731
+ internal_iter->AddMerge("a", "merge_2");
1732
+ internal_iter->AddMerge("a", "merge_3");
1733
+ internal_iter->AddDeletion("a");
1734
+ internal_iter->AddMerge("a", "merge_4");
1735
+ internal_iter->AddMerge("a", "merge_5");
1736
+ internal_iter->AddMerge("a", "merge_6");
1737
+ internal_iter->Finish();
1738
+
1739
+ std::unique_ptr<Iterator> db_iter(NewDBIterator(
1740
+ env_, ro, cf_options, mutable_cf_options, BytewiseComparator(),
1741
+ internal_iter, nullptr /* version */, 1 /* sequence */,
1742
+ options.max_sequential_skip_in_iterations,
1743
+ nullptr /* read_callback */));
1744
+ db_iter->SeekToLast();
1745
+ ASSERT_TRUE(db_iter->Valid());
1746
+ ASSERT_EQ(db_iter->key().ToString(), "a");
1747
+ ASSERT_EQ(db_iter->value().ToString(), "merge_1,merge_2");
1748
+ db_iter->Prev();
1749
+ ASSERT_TRUE(!db_iter->Valid());
1750
+ }
1751
+
1752
+ {
1753
+ TestIterator* internal_iter = new TestIterator(BytewiseComparator());
1754
+ internal_iter->AddMerge("a", "merge_1");
1755
+ internal_iter->AddMerge("a", "merge_2");
1756
+ internal_iter->AddMerge("a", "merge_3");
1757
+ internal_iter->AddDeletion("a");
1758
+ internal_iter->AddMerge("a", "merge_4");
1759
+ internal_iter->AddMerge("a", "merge_5");
1760
+ internal_iter->AddMerge("a", "merge_6");
1761
+ internal_iter->Finish();
1762
+
1763
+ std::unique_ptr<Iterator> db_iter(NewDBIterator(
1764
+ env_, ro, cf_options, mutable_cf_options, BytewiseComparator(),
1765
+ internal_iter, nullptr /* version */, 2 /* sequence */,
1766
+ options.max_sequential_skip_in_iterations,
1767
+ nullptr /* read_callback */));
1768
+ db_iter->SeekToLast();
1769
+ ASSERT_TRUE(db_iter->Valid());
1770
+ ASSERT_EQ(db_iter->key().ToString(), "a");
1771
+ ASSERT_EQ(db_iter->value().ToString(), "merge_1,merge_2,merge_3");
1772
+ db_iter->Prev();
1773
+ ASSERT_TRUE(!db_iter->Valid());
1774
+ }
1775
+
1776
+ {
1777
+ TestIterator* internal_iter = new TestIterator(BytewiseComparator());
1778
+ internal_iter->AddMerge("a", "merge_1");
1779
+ internal_iter->AddMerge("a", "merge_2");
1780
+ internal_iter->AddMerge("a", "merge_3");
1781
+ internal_iter->AddDeletion("a");
1782
+ internal_iter->AddMerge("a", "merge_4");
1783
+ internal_iter->AddMerge("a", "merge_5");
1784
+ internal_iter->AddMerge("a", "merge_6");
1785
+ internal_iter->Finish();
1786
+
1787
+ std::unique_ptr<Iterator> db_iter(NewDBIterator(
1788
+ env_, ro, cf_options, mutable_cf_options, BytewiseComparator(),
1789
+ internal_iter, nullptr /* version */, 3 /* sequence */,
1790
+ options.max_sequential_skip_in_iterations,
1791
+ nullptr /* read_callback */));
1792
+ db_iter->SeekToLast();
1793
+ ASSERT_TRUE(!db_iter->Valid());
1794
+ }
1795
+
1796
+ {
1797
+ TestIterator* internal_iter = new TestIterator(BytewiseComparator());
1798
+ internal_iter->AddMerge("a", "merge_1");
1799
+ internal_iter->AddMerge("a", "merge_2");
1800
+ internal_iter->AddMerge("a", "merge_3");
1801
+ internal_iter->AddDeletion("a");
1802
+ internal_iter->AddMerge("a", "merge_4");
1803
+ internal_iter->AddMerge("a", "merge_5");
1804
+ internal_iter->AddMerge("a", "merge_6");
1805
+ internal_iter->Finish();
1806
+
1807
+ std::unique_ptr<Iterator> db_iter(NewDBIterator(
1808
+ env_, ro, cf_options, mutable_cf_options, BytewiseComparator(),
1809
+ internal_iter, nullptr /* version */, 4 /* sequence */,
1810
+ options.max_sequential_skip_in_iterations,
1811
+ nullptr /* read_callback */));
1812
+ db_iter->SeekToLast();
1813
+ ASSERT_TRUE(db_iter->Valid());
1814
+ ASSERT_EQ(db_iter->key().ToString(), "a");
1815
+ ASSERT_EQ(db_iter->value().ToString(), "merge_4");
1816
+ db_iter->Prev();
1817
+ ASSERT_TRUE(!db_iter->Valid());
1818
+ }
1819
+
1820
+ {
1821
+ TestIterator* internal_iter = new TestIterator(BytewiseComparator());
1822
+ internal_iter->AddMerge("a", "merge_1");
1823
+ internal_iter->AddMerge("a", "merge_2");
1824
+ internal_iter->AddMerge("a", "merge_3");
1825
+ internal_iter->AddDeletion("a");
1826
+ internal_iter->AddMerge("a", "merge_4");
1827
+ internal_iter->AddMerge("a", "merge_5");
1828
+ internal_iter->AddMerge("a", "merge_6");
1829
+ internal_iter->Finish();
1830
+
1831
+ std::unique_ptr<Iterator> db_iter(NewDBIterator(
1832
+ env_, ro, cf_options, mutable_cf_options, BytewiseComparator(),
1833
+ internal_iter, nullptr /* version */, 5 /* sequence */,
1834
+ options.max_sequential_skip_in_iterations,
1835
+ nullptr /* read_callback */));
1836
+ db_iter->SeekToLast();
1837
+ ASSERT_TRUE(db_iter->Valid());
1838
+ ASSERT_EQ(db_iter->key().ToString(), "a");
1839
+ ASSERT_EQ(db_iter->value().ToString(), "merge_4,merge_5");
1840
+ db_iter->Prev();
1841
+ ASSERT_TRUE(!db_iter->Valid());
1842
+ }
1843
+
1844
+ {
1845
+ TestIterator* internal_iter = new TestIterator(BytewiseComparator());
1846
+ internal_iter->AddMerge("a", "merge_1");
1847
+ internal_iter->AddMerge("a", "merge_2");
1848
+ internal_iter->AddMerge("a", "merge_3");
1849
+ internal_iter->AddDeletion("a");
1850
+ internal_iter->AddMerge("a", "merge_4");
1851
+ internal_iter->AddMerge("a", "merge_5");
1852
+ internal_iter->AddMerge("a", "merge_6");
1853
+ internal_iter->Finish();
1854
+
1855
+ std::unique_ptr<Iterator> db_iter(NewDBIterator(
1856
+ env_, ro, cf_options, mutable_cf_options, BytewiseComparator(),
1857
+ internal_iter, nullptr /* version */, 6 /* sequence */,
1858
+ options.max_sequential_skip_in_iterations,
1859
+ nullptr /* read_callback */));
1860
+ db_iter->SeekToLast();
1861
+ ASSERT_TRUE(db_iter->Valid());
1862
+ ASSERT_EQ(db_iter->key().ToString(), "a");
1863
+ ASSERT_EQ(db_iter->value().ToString(), "merge_4,merge_5,merge_6");
1864
+ db_iter->Prev();
1865
+ ASSERT_TRUE(!db_iter->Valid());
1866
+ }
1867
+ }
1868
+
1869
+ TEST_F(DBIteratorTest, DBIterator7) {
1870
+ ReadOptions ro;
1871
+ Options options;
1872
+ options.merge_operator = MergeOperators::CreateFromStringId("stringappend");
1873
+ ImmutableCFOptions cf_options = ImmutableCFOptions(options);
1874
+ MutableCFOptions mutable_cf_options = MutableCFOptions(options);
1875
+
1876
+ {
1877
+ TestIterator* internal_iter = new TestIterator(BytewiseComparator());
1878
+ internal_iter->AddMerge("a", "merge_1");
1879
+ internal_iter->AddPut("b", "val");
1880
+ internal_iter->AddMerge("b", "merge_2");
1881
+
1882
+ internal_iter->AddDeletion("b");
1883
+ internal_iter->AddMerge("b", "merge_3");
1884
+
1885
+ internal_iter->AddMerge("c", "merge_4");
1886
+ internal_iter->AddMerge("c", "merge_5");
1887
+
1888
+ internal_iter->AddDeletion("b");
1889
+ internal_iter->AddMerge("b", "merge_6");
1890
+ internal_iter->AddMerge("b", "merge_7");
1891
+ internal_iter->AddMerge("b", "merge_8");
1892
+ internal_iter->AddMerge("b", "merge_9");
1893
+ internal_iter->AddMerge("b", "merge_10");
1894
+ internal_iter->AddMerge("b", "merge_11");
1895
+
1896
+ internal_iter->AddDeletion("c");
1897
+ internal_iter->Finish();
1898
+
1899
+ std::unique_ptr<Iterator> db_iter(NewDBIterator(
1900
+ env_, ro, cf_options, mutable_cf_options, BytewiseComparator(),
1901
+ internal_iter, nullptr /* version */, 0 /* sequence */,
1902
+ options.max_sequential_skip_in_iterations,
1903
+ nullptr /* read_callback */));
1904
+ db_iter->SeekToLast();
1905
+ ASSERT_TRUE(db_iter->Valid());
1906
+ ASSERT_EQ(db_iter->key().ToString(), "a");
1907
+ ASSERT_EQ(db_iter->value().ToString(), "merge_1");
1908
+ db_iter->Prev();
1909
+ ASSERT_TRUE(!db_iter->Valid());
1910
+ }
1911
+
1912
+ {
1913
+ TestIterator* internal_iter = new TestIterator(BytewiseComparator());
1914
+ internal_iter->AddMerge("a", "merge_1");
1915
+ internal_iter->AddPut("b", "val");
1916
+ internal_iter->AddMerge("b", "merge_2");
1917
+
1918
+ internal_iter->AddDeletion("b");
1919
+ internal_iter->AddMerge("b", "merge_3");
1920
+
1921
+ internal_iter->AddMerge("c", "merge_4");
1922
+ internal_iter->AddMerge("c", "merge_5");
1923
+
1924
+ internal_iter->AddDeletion("b");
1925
+ internal_iter->AddMerge("b", "merge_6");
1926
+ internal_iter->AddMerge("b", "merge_7");
1927
+ internal_iter->AddMerge("b", "merge_8");
1928
+ internal_iter->AddMerge("b", "merge_9");
1929
+ internal_iter->AddMerge("b", "merge_10");
1930
+ internal_iter->AddMerge("b", "merge_11");
1931
+
1932
+ internal_iter->AddDeletion("c");
1933
+ internal_iter->Finish();
1934
+
1935
+ std::unique_ptr<Iterator> db_iter(NewDBIterator(
1936
+ env_, ro, cf_options, mutable_cf_options, BytewiseComparator(),
1937
+ internal_iter, nullptr /* version */, 2 /* sequence */,
1938
+ options.max_sequential_skip_in_iterations,
1939
+ nullptr /* read_callback */));
1940
+ db_iter->SeekToLast();
1941
+ ASSERT_TRUE(db_iter->Valid());
1942
+
1943
+ ASSERT_EQ(db_iter->key().ToString(), "b");
1944
+ ASSERT_EQ(db_iter->value().ToString(), "val,merge_2");
1945
+ db_iter->Prev();
1946
+ ASSERT_TRUE(db_iter->Valid());
1947
+
1948
+ ASSERT_EQ(db_iter->key().ToString(), "a");
1949
+ ASSERT_EQ(db_iter->value().ToString(), "merge_1");
1950
+ db_iter->Prev();
1951
+ ASSERT_TRUE(!db_iter->Valid());
1952
+ }
1953
+
1954
+ {
1955
+ TestIterator* internal_iter = new TestIterator(BytewiseComparator());
1956
+ internal_iter->AddMerge("a", "merge_1");
1957
+ internal_iter->AddPut("b", "val");
1958
+ internal_iter->AddMerge("b", "merge_2");
1959
+
1960
+ internal_iter->AddDeletion("b");
1961
+ internal_iter->AddMerge("b", "merge_3");
1962
+
1963
+ internal_iter->AddMerge("c", "merge_4");
1964
+ internal_iter->AddMerge("c", "merge_5");
1965
+
1966
+ internal_iter->AddDeletion("b");
1967
+ internal_iter->AddMerge("b", "merge_6");
1968
+ internal_iter->AddMerge("b", "merge_7");
1969
+ internal_iter->AddMerge("b", "merge_8");
1970
+ internal_iter->AddMerge("b", "merge_9");
1971
+ internal_iter->AddMerge("b", "merge_10");
1972
+ internal_iter->AddMerge("b", "merge_11");
1973
+
1974
+ internal_iter->AddDeletion("c");
1975
+ internal_iter->Finish();
1976
+
1977
+ std::unique_ptr<Iterator> db_iter(NewDBIterator(
1978
+ env_, ro, cf_options, mutable_cf_options, BytewiseComparator(),
1979
+ internal_iter, nullptr /* version */, 4 /* sequence */,
1980
+ options.max_sequential_skip_in_iterations,
1981
+ nullptr /* read_callback */));
1982
+ db_iter->SeekToLast();
1983
+ ASSERT_TRUE(db_iter->Valid());
1984
+
1985
+ ASSERT_EQ(db_iter->key().ToString(), "b");
1986
+ ASSERT_EQ(db_iter->value().ToString(), "merge_3");
1987
+ db_iter->Prev();
1988
+ ASSERT_TRUE(db_iter->Valid());
1989
+
1990
+ ASSERT_EQ(db_iter->key().ToString(), "a");
1991
+ ASSERT_EQ(db_iter->value().ToString(), "merge_1");
1992
+ db_iter->Prev();
1993
+ ASSERT_TRUE(!db_iter->Valid());
1994
+ }
1995
+
1996
+ {
1997
+ TestIterator* internal_iter = new TestIterator(BytewiseComparator());
1998
+ internal_iter->AddMerge("a", "merge_1");
1999
+ internal_iter->AddPut("b", "val");
2000
+ internal_iter->AddMerge("b", "merge_2");
2001
+
2002
+ internal_iter->AddDeletion("b");
2003
+ internal_iter->AddMerge("b", "merge_3");
2004
+
2005
+ internal_iter->AddMerge("c", "merge_4");
2006
+ internal_iter->AddMerge("c", "merge_5");
2007
+
2008
+ internal_iter->AddDeletion("b");
2009
+ internal_iter->AddMerge("b", "merge_6");
2010
+ internal_iter->AddMerge("b", "merge_7");
2011
+ internal_iter->AddMerge("b", "merge_8");
2012
+ internal_iter->AddMerge("b", "merge_9");
2013
+ internal_iter->AddMerge("b", "merge_10");
2014
+ internal_iter->AddMerge("b", "merge_11");
2015
+
2016
+ internal_iter->AddDeletion("c");
2017
+ internal_iter->Finish();
2018
+
2019
+ std::unique_ptr<Iterator> db_iter(NewDBIterator(
2020
+ env_, ro, cf_options, mutable_cf_options, BytewiseComparator(),
2021
+ internal_iter, nullptr /* version */, 5 /* sequence */,
2022
+ options.max_sequential_skip_in_iterations,
2023
+ nullptr /* read_callback */));
2024
+ db_iter->SeekToLast();
2025
+ ASSERT_TRUE(db_iter->Valid());
2026
+
2027
+ ASSERT_EQ(db_iter->key().ToString(), "c");
2028
+ ASSERT_EQ(db_iter->value().ToString(), "merge_4");
2029
+ db_iter->Prev();
2030
+
2031
+ ASSERT_TRUE(db_iter->Valid());
2032
+ ASSERT_EQ(db_iter->key().ToString(), "b");
2033
+ ASSERT_EQ(db_iter->value().ToString(), "merge_3");
2034
+ db_iter->Prev();
2035
+ ASSERT_TRUE(db_iter->Valid());
2036
+
2037
+ ASSERT_EQ(db_iter->key().ToString(), "a");
2038
+ ASSERT_EQ(db_iter->value().ToString(), "merge_1");
2039
+ db_iter->Prev();
2040
+ ASSERT_TRUE(!db_iter->Valid());
2041
+ }
2042
+
2043
+ {
2044
+ TestIterator* internal_iter = new TestIterator(BytewiseComparator());
2045
+ internal_iter->AddMerge("a", "merge_1");
2046
+ internal_iter->AddPut("b", "val");
2047
+ internal_iter->AddMerge("b", "merge_2");
2048
+
2049
+ internal_iter->AddDeletion("b");
2050
+ internal_iter->AddMerge("b", "merge_3");
2051
+
2052
+ internal_iter->AddMerge("c", "merge_4");
2053
+ internal_iter->AddMerge("c", "merge_5");
2054
+
2055
+ internal_iter->AddDeletion("b");
2056
+ internal_iter->AddMerge("b", "merge_6");
2057
+ internal_iter->AddMerge("b", "merge_7");
2058
+ internal_iter->AddMerge("b", "merge_8");
2059
+ internal_iter->AddMerge("b", "merge_9");
2060
+ internal_iter->AddMerge("b", "merge_10");
2061
+ internal_iter->AddMerge("b", "merge_11");
2062
+
2063
+ internal_iter->AddDeletion("c");
2064
+ internal_iter->Finish();
2065
+
2066
+ std::unique_ptr<Iterator> db_iter(NewDBIterator(
2067
+ env_, ro, cf_options, mutable_cf_options, BytewiseComparator(),
2068
+ internal_iter, nullptr /* version */, 6 /* sequence */,
2069
+ options.max_sequential_skip_in_iterations,
2070
+ nullptr /* read_callback */));
2071
+ db_iter->SeekToLast();
2072
+ ASSERT_TRUE(db_iter->Valid());
2073
+
2074
+ ASSERT_EQ(db_iter->key().ToString(), "c");
2075
+ ASSERT_EQ(db_iter->value().ToString(), "merge_4,merge_5");
2076
+ db_iter->Prev();
2077
+ ASSERT_TRUE(db_iter->Valid());
2078
+
2079
+ ASSERT_TRUE(db_iter->Valid());
2080
+ ASSERT_EQ(db_iter->key().ToString(), "b");
2081
+ ASSERT_EQ(db_iter->value().ToString(), "merge_3");
2082
+ db_iter->Prev();
2083
+ ASSERT_TRUE(db_iter->Valid());
2084
+
2085
+ ASSERT_EQ(db_iter->key().ToString(), "a");
2086
+ ASSERT_EQ(db_iter->value().ToString(), "merge_1");
2087
+ db_iter->Prev();
2088
+ ASSERT_TRUE(!db_iter->Valid());
2089
+ }
2090
+
2091
+ {
2092
+ TestIterator* internal_iter = new TestIterator(BytewiseComparator());
2093
+ internal_iter->AddMerge("a", "merge_1");
2094
+ internal_iter->AddPut("b", "val");
2095
+ internal_iter->AddMerge("b", "merge_2");
2096
+
2097
+ internal_iter->AddDeletion("b");
2098
+ internal_iter->AddMerge("b", "merge_3");
2099
+
2100
+ internal_iter->AddMerge("c", "merge_4");
2101
+ internal_iter->AddMerge("c", "merge_5");
2102
+
2103
+ internal_iter->AddDeletion("b");
2104
+ internal_iter->AddMerge("b", "merge_6");
2105
+ internal_iter->AddMerge("b", "merge_7");
2106
+ internal_iter->AddMerge("b", "merge_8");
2107
+ internal_iter->AddMerge("b", "merge_9");
2108
+ internal_iter->AddMerge("b", "merge_10");
2109
+ internal_iter->AddMerge("b", "merge_11");
2110
+
2111
+ internal_iter->AddDeletion("c");
2112
+ internal_iter->Finish();
2113
+
2114
+ std::unique_ptr<Iterator> db_iter(NewDBIterator(
2115
+ env_, ro, cf_options, mutable_cf_options, BytewiseComparator(),
2116
+ internal_iter, nullptr /* version */, 7 /* sequence */,
2117
+ options.max_sequential_skip_in_iterations,
2118
+ nullptr /* read_callback */));
2119
+ db_iter->SeekToLast();
2120
+ ASSERT_TRUE(db_iter->Valid());
2121
+
2122
+ ASSERT_EQ(db_iter->key().ToString(), "c");
2123
+ ASSERT_EQ(db_iter->value().ToString(), "merge_4,merge_5");
2124
+ db_iter->Prev();
2125
+ ASSERT_TRUE(db_iter->Valid());
2126
+
2127
+ ASSERT_EQ(db_iter->key().ToString(), "a");
2128
+ ASSERT_EQ(db_iter->value().ToString(), "merge_1");
2129
+ db_iter->Prev();
2130
+ ASSERT_TRUE(!db_iter->Valid());
2131
+ }
2132
+
2133
+ {
2134
+ TestIterator* internal_iter = new TestIterator(BytewiseComparator());
2135
+ internal_iter->AddMerge("a", "merge_1");
2136
+ internal_iter->AddPut("b", "val");
2137
+ internal_iter->AddMerge("b", "merge_2");
2138
+
2139
+ internal_iter->AddDeletion("b");
2140
+ internal_iter->AddMerge("b", "merge_3");
2141
+
2142
+ internal_iter->AddMerge("c", "merge_4");
2143
+ internal_iter->AddMerge("c", "merge_5");
2144
+
2145
+ internal_iter->AddDeletion("b");
2146
+ internal_iter->AddMerge("b", "merge_6");
2147
+ internal_iter->AddMerge("b", "merge_7");
2148
+ internal_iter->AddMerge("b", "merge_8");
2149
+ internal_iter->AddMerge("b", "merge_9");
2150
+ internal_iter->AddMerge("b", "merge_10");
2151
+ internal_iter->AddMerge("b", "merge_11");
2152
+
2153
+ internal_iter->AddDeletion("c");
2154
+ internal_iter->Finish();
2155
+
2156
+ std::unique_ptr<Iterator> db_iter(NewDBIterator(
2157
+ env_, ro, cf_options, mutable_cf_options, BytewiseComparator(),
2158
+ internal_iter, nullptr /* version */, 9 /* sequence */,
2159
+ options.max_sequential_skip_in_iterations,
2160
+ nullptr /* read_callback */));
2161
+ db_iter->SeekToLast();
2162
+ ASSERT_TRUE(db_iter->Valid());
2163
+
2164
+ ASSERT_EQ(db_iter->key().ToString(), "c");
2165
+ ASSERT_EQ(db_iter->value().ToString(), "merge_4,merge_5");
2166
+ db_iter->Prev();
2167
+ ASSERT_TRUE(db_iter->Valid());
2168
+
2169
+ ASSERT_TRUE(db_iter->Valid());
2170
+ ASSERT_EQ(db_iter->key().ToString(), "b");
2171
+ ASSERT_EQ(db_iter->value().ToString(), "merge_6,merge_7");
2172
+ db_iter->Prev();
2173
+ ASSERT_TRUE(db_iter->Valid());
2174
+
2175
+ ASSERT_EQ(db_iter->key().ToString(), "a");
2176
+ ASSERT_EQ(db_iter->value().ToString(), "merge_1");
2177
+ db_iter->Prev();
2178
+ ASSERT_TRUE(!db_iter->Valid());
2179
+ }
2180
+
2181
+ {
2182
+ TestIterator* internal_iter = new TestIterator(BytewiseComparator());
2183
+ internal_iter->AddMerge("a", "merge_1");
2184
+ internal_iter->AddPut("b", "val");
2185
+ internal_iter->AddMerge("b", "merge_2");
2186
+
2187
+ internal_iter->AddDeletion("b");
2188
+ internal_iter->AddMerge("b", "merge_3");
2189
+
2190
+ internal_iter->AddMerge("c", "merge_4");
2191
+ internal_iter->AddMerge("c", "merge_5");
2192
+
2193
+ internal_iter->AddDeletion("b");
2194
+ internal_iter->AddMerge("b", "merge_6");
2195
+ internal_iter->AddMerge("b", "merge_7");
2196
+ internal_iter->AddMerge("b", "merge_8");
2197
+ internal_iter->AddMerge("b", "merge_9");
2198
+ internal_iter->AddMerge("b", "merge_10");
2199
+ internal_iter->AddMerge("b", "merge_11");
2200
+
2201
+ internal_iter->AddDeletion("c");
2202
+ internal_iter->Finish();
2203
+
2204
+ std::unique_ptr<Iterator> db_iter(NewDBIterator(
2205
+ env_, ro, cf_options, mutable_cf_options, BytewiseComparator(),
2206
+ internal_iter, nullptr /* version */, 13 /* sequence */,
2207
+ options.max_sequential_skip_in_iterations,
2208
+ nullptr /* read_callback */));
2209
+ db_iter->SeekToLast();
2210
+ ASSERT_TRUE(db_iter->Valid());
2211
+
2212
+ ASSERT_EQ(db_iter->key().ToString(), "c");
2213
+ ASSERT_EQ(db_iter->value().ToString(), "merge_4,merge_5");
2214
+ db_iter->Prev();
2215
+ ASSERT_TRUE(db_iter->Valid());
2216
+
2217
+ ASSERT_TRUE(db_iter->Valid());
2218
+ ASSERT_EQ(db_iter->key().ToString(), "b");
2219
+ ASSERT_EQ(db_iter->value().ToString(),
2220
+ "merge_6,merge_7,merge_8,merge_9,merge_10,merge_11");
2221
+ db_iter->Prev();
2222
+ ASSERT_TRUE(db_iter->Valid());
2223
+
2224
+ ASSERT_EQ(db_iter->key().ToString(), "a");
2225
+ ASSERT_EQ(db_iter->value().ToString(), "merge_1");
2226
+ db_iter->Prev();
2227
+ ASSERT_TRUE(!db_iter->Valid());
2228
+ }
2229
+
2230
+ {
2231
+ TestIterator* internal_iter = new TestIterator(BytewiseComparator());
2232
+ internal_iter->AddMerge("a", "merge_1");
2233
+ internal_iter->AddPut("b", "val");
2234
+ internal_iter->AddMerge("b", "merge_2");
2235
+
2236
+ internal_iter->AddDeletion("b");
2237
+ internal_iter->AddMerge("b", "merge_3");
2238
+
2239
+ internal_iter->AddMerge("c", "merge_4");
2240
+ internal_iter->AddMerge("c", "merge_5");
2241
+
2242
+ internal_iter->AddDeletion("b");
2243
+ internal_iter->AddMerge("b", "merge_6");
2244
+ internal_iter->AddMerge("b", "merge_7");
2245
+ internal_iter->AddMerge("b", "merge_8");
2246
+ internal_iter->AddMerge("b", "merge_9");
2247
+ internal_iter->AddMerge("b", "merge_10");
2248
+ internal_iter->AddMerge("b", "merge_11");
2249
+
2250
+ internal_iter->AddDeletion("c");
2251
+ internal_iter->Finish();
2252
+
2253
+ std::unique_ptr<Iterator> db_iter(NewDBIterator(
2254
+ env_, ro, cf_options, mutable_cf_options, BytewiseComparator(),
2255
+ internal_iter, nullptr /* version */, 14 /* sequence */,
2256
+ options.max_sequential_skip_in_iterations,
2257
+ nullptr /* read_callback */));
2258
+ db_iter->SeekToLast();
2259
+ ASSERT_TRUE(db_iter->Valid());
2260
+
2261
+ ASSERT_EQ(db_iter->key().ToString(), "b");
2262
+ ASSERT_EQ(db_iter->value().ToString(),
2263
+ "merge_6,merge_7,merge_8,merge_9,merge_10,merge_11");
2264
+ db_iter->Prev();
2265
+ ASSERT_TRUE(db_iter->Valid());
2266
+
2267
+ ASSERT_EQ(db_iter->key().ToString(), "a");
2268
+ ASSERT_EQ(db_iter->value().ToString(), "merge_1");
2269
+ db_iter->Prev();
2270
+ ASSERT_TRUE(!db_iter->Valid());
2271
+ }
2272
+ }
2273
+
2274
+ TEST_F(DBIteratorTest, DBIterator8) {
2275
+ ReadOptions ro;
2276
+ Options options;
2277
+ options.merge_operator = MergeOperators::CreateFromStringId("stringappend");
2278
+
2279
+ TestIterator* internal_iter = new TestIterator(BytewiseComparator());
2280
+ internal_iter->AddDeletion("a");
2281
+ internal_iter->AddPut("a", "0");
2282
+ internal_iter->AddPut("b", "0");
2283
+ internal_iter->Finish();
2284
+
2285
+ std::unique_ptr<Iterator> db_iter(NewDBIterator(
2286
+ env_, ro, ImmutableCFOptions(options), MutableCFOptions(options),
2287
+ BytewiseComparator(), internal_iter, nullptr /* version */,
2288
+ 10 /* sequence */, options.max_sequential_skip_in_iterations,
2289
+ nullptr /* read_callback */));
2290
+ db_iter->SeekToLast();
2291
+ ASSERT_TRUE(db_iter->Valid());
2292
+ ASSERT_EQ(db_iter->key().ToString(), "b");
2293
+ ASSERT_EQ(db_iter->value().ToString(), "0");
2294
+
2295
+ db_iter->Prev();
2296
+ ASSERT_TRUE(db_iter->Valid());
2297
+ ASSERT_EQ(db_iter->key().ToString(), "a");
2298
+ ASSERT_EQ(db_iter->value().ToString(), "0");
2299
+ }
2300
+
2301
+ // TODO(3.13): fix the issue of Seek() then Prev() which might not necessary
2302
+ // return the biggest element smaller than the seek key.
2303
+ TEST_F(DBIteratorTest, DBIterator9) {
2304
+ ReadOptions ro;
2305
+ Options options;
2306
+ options.merge_operator = MergeOperators::CreateFromStringId("stringappend");
2307
+ {
2308
+ TestIterator* internal_iter = new TestIterator(BytewiseComparator());
2309
+ internal_iter->AddMerge("a", "merge_1");
2310
+ internal_iter->AddMerge("a", "merge_2");
2311
+ internal_iter->AddMerge("b", "merge_3");
2312
+ internal_iter->AddMerge("b", "merge_4");
2313
+ internal_iter->AddMerge("d", "merge_5");
2314
+ internal_iter->AddMerge("d", "merge_6");
2315
+ internal_iter->Finish();
2316
+
2317
+ std::unique_ptr<Iterator> db_iter(NewDBIterator(
2318
+ env_, ro, ImmutableCFOptions(options), MutableCFOptions(options),
2319
+ BytewiseComparator(), internal_iter, nullptr /* version */,
2320
+ 10 /* sequence */, options.max_sequential_skip_in_iterations,
2321
+ nullptr /* read_callback */));
2322
+
2323
+ db_iter->SeekToLast();
2324
+ ASSERT_TRUE(db_iter->Valid());
2325
+ db_iter->Prev();
2326
+ ASSERT_TRUE(db_iter->Valid());
2327
+ ASSERT_EQ(db_iter->key().ToString(), "b");
2328
+ ASSERT_EQ(db_iter->value().ToString(), "merge_3,merge_4");
2329
+ db_iter->Next();
2330
+ ASSERT_TRUE(db_iter->Valid());
2331
+ ASSERT_EQ(db_iter->key().ToString(), "d");
2332
+ ASSERT_EQ(db_iter->value().ToString(), "merge_5,merge_6");
2333
+
2334
+ db_iter->Seek("b");
2335
+ ASSERT_TRUE(db_iter->Valid());
2336
+ ASSERT_EQ(db_iter->key().ToString(), "b");
2337
+ ASSERT_EQ(db_iter->value().ToString(), "merge_3,merge_4");
2338
+ db_iter->Prev();
2339
+ ASSERT_TRUE(db_iter->Valid());
2340
+ ASSERT_EQ(db_iter->key().ToString(), "a");
2341
+ ASSERT_EQ(db_iter->value().ToString(), "merge_1,merge_2");
2342
+
2343
+ db_iter->SeekForPrev("b");
2344
+ ASSERT_TRUE(db_iter->Valid());
2345
+ ASSERT_EQ(db_iter->key().ToString(), "b");
2346
+ ASSERT_EQ(db_iter->value().ToString(), "merge_3,merge_4");
2347
+ db_iter->Next();
2348
+ ASSERT_TRUE(db_iter->Valid());
2349
+ ASSERT_EQ(db_iter->key().ToString(), "d");
2350
+ ASSERT_EQ(db_iter->value().ToString(), "merge_5,merge_6");
2351
+
2352
+ db_iter->Seek("c");
2353
+ ASSERT_TRUE(db_iter->Valid());
2354
+ ASSERT_EQ(db_iter->key().ToString(), "d");
2355
+ ASSERT_EQ(db_iter->value().ToString(), "merge_5,merge_6");
2356
+ db_iter->Prev();
2357
+ ASSERT_TRUE(db_iter->Valid());
2358
+ ASSERT_EQ(db_iter->key().ToString(), "b");
2359
+ ASSERT_EQ(db_iter->value().ToString(), "merge_3,merge_4");
2360
+
2361
+ db_iter->SeekForPrev("c");
2362
+ ASSERT_TRUE(db_iter->Valid());
2363
+ ASSERT_EQ(db_iter->key().ToString(), "b");
2364
+ ASSERT_EQ(db_iter->value().ToString(), "merge_3,merge_4");
2365
+ db_iter->Next();
2366
+ ASSERT_TRUE(db_iter->Valid());
2367
+ ASSERT_EQ(db_iter->key().ToString(), "d");
2368
+ ASSERT_EQ(db_iter->value().ToString(), "merge_5,merge_6");
2369
+ }
2370
+ }
2371
+
2372
+ // TODO(3.13): fix the issue of Seek() then Prev() which might not necessary
2373
+ // return the biggest element smaller than the seek key.
2374
+ TEST_F(DBIteratorTest, DBIterator10) {
2375
+ ReadOptions ro;
2376
+ Options options;
2377
+
2378
+ TestIterator* internal_iter = new TestIterator(BytewiseComparator());
2379
+ internal_iter->AddPut("a", "1");
2380
+ internal_iter->AddPut("b", "2");
2381
+ internal_iter->AddPut("c", "3");
2382
+ internal_iter->AddPut("d", "4");
2383
+ internal_iter->Finish();
2384
+
2385
+ std::unique_ptr<Iterator> db_iter(NewDBIterator(
2386
+ env_, ro, ImmutableCFOptions(options), MutableCFOptions(options),
2387
+ BytewiseComparator(), internal_iter, nullptr /* version */,
2388
+ 10 /* sequence */, options.max_sequential_skip_in_iterations,
2389
+ nullptr /* read_callback */));
2390
+
2391
+ db_iter->Seek("c");
2392
+ ASSERT_TRUE(db_iter->Valid());
2393
+ db_iter->Prev();
2394
+ ASSERT_TRUE(db_iter->Valid());
2395
+ ASSERT_EQ(db_iter->key().ToString(), "b");
2396
+ ASSERT_EQ(db_iter->value().ToString(), "2");
2397
+
2398
+ db_iter->Next();
2399
+ ASSERT_TRUE(db_iter->Valid());
2400
+ ASSERT_EQ(db_iter->key().ToString(), "c");
2401
+ ASSERT_EQ(db_iter->value().ToString(), "3");
2402
+
2403
+ db_iter->SeekForPrev("c");
2404
+ ASSERT_TRUE(db_iter->Valid());
2405
+ db_iter->Next();
2406
+ ASSERT_TRUE(db_iter->Valid());
2407
+ ASSERT_EQ(db_iter->key().ToString(), "d");
2408
+ ASSERT_EQ(db_iter->value().ToString(), "4");
2409
+
2410
+ db_iter->Prev();
2411
+ ASSERT_TRUE(db_iter->Valid());
2412
+ ASSERT_EQ(db_iter->key().ToString(), "c");
2413
+ ASSERT_EQ(db_iter->value().ToString(), "3");
2414
+ }
2415
+
2416
+ TEST_F(DBIteratorTest, SeekToLastOccurrenceSeq0) {
2417
+ ReadOptions ro;
2418
+ Options options;
2419
+ options.merge_operator = nullptr;
2420
+
2421
+ TestIterator* internal_iter = new TestIterator(BytewiseComparator());
2422
+ internal_iter->AddPut("a", "1");
2423
+ internal_iter->AddPut("b", "2");
2424
+ internal_iter->Finish();
2425
+
2426
+ std::unique_ptr<Iterator> db_iter(NewDBIterator(
2427
+ env_, ro, ImmutableCFOptions(options), MutableCFOptions(options),
2428
+ BytewiseComparator(), internal_iter, nullptr /* version */,
2429
+ 10 /* sequence */, 0 /* force seek */, nullptr /* read_callback */));
2430
+ db_iter->SeekToFirst();
2431
+ ASSERT_TRUE(db_iter->Valid());
2432
+ ASSERT_EQ(db_iter->key().ToString(), "a");
2433
+ ASSERT_EQ(db_iter->value().ToString(), "1");
2434
+ db_iter->Next();
2435
+ ASSERT_TRUE(db_iter->Valid());
2436
+ ASSERT_EQ(db_iter->key().ToString(), "b");
2437
+ ASSERT_EQ(db_iter->value().ToString(), "2");
2438
+ db_iter->Next();
2439
+ ASSERT_FALSE(db_iter->Valid());
2440
+ }
2441
+
2442
+ TEST_F(DBIteratorTest, DBIterator11) {
2443
+ ReadOptions ro;
2444
+ Options options;
2445
+ options.merge_operator = MergeOperators::CreateFromStringId("stringappend");
2446
+
2447
+ TestIterator* internal_iter = new TestIterator(BytewiseComparator());
2448
+ internal_iter->AddPut("a", "0");
2449
+ internal_iter->AddPut("b", "0");
2450
+ internal_iter->AddSingleDeletion("b");
2451
+ internal_iter->AddMerge("a", "1");
2452
+ internal_iter->AddMerge("b", "2");
2453
+ internal_iter->Finish();
2454
+
2455
+ std::unique_ptr<Iterator> db_iter(NewDBIterator(
2456
+ env_, ro, ImmutableCFOptions(options), MutableCFOptions(options),
2457
+ BytewiseComparator(), internal_iter, nullptr /* version */,
2458
+ 1 /* sequence */, options.max_sequential_skip_in_iterations,
2459
+ nullptr /* read_callback */));
2460
+ db_iter->SeekToFirst();
2461
+ ASSERT_TRUE(db_iter->Valid());
2462
+ ASSERT_EQ(db_iter->key().ToString(), "a");
2463
+ ASSERT_EQ(db_iter->value().ToString(), "0");
2464
+ db_iter->Next();
2465
+ ASSERT_TRUE(db_iter->Valid());
2466
+ ASSERT_EQ(db_iter->key().ToString(), "b");
2467
+ db_iter->Next();
2468
+ ASSERT_FALSE(db_iter->Valid());
2469
+ }
2470
+
2471
+ TEST_F(DBIteratorTest, DBIterator12) {
2472
+ ReadOptions ro;
2473
+ Options options;
2474
+ options.merge_operator = nullptr;
2475
+
2476
+ TestIterator* internal_iter = new TestIterator(BytewiseComparator());
2477
+ internal_iter->AddPut("a", "1");
2478
+ internal_iter->AddPut("b", "2");
2479
+ internal_iter->AddPut("c", "3");
2480
+ internal_iter->AddSingleDeletion("b");
2481
+ internal_iter->Finish();
2482
+
2483
+ std::unique_ptr<Iterator> db_iter(NewDBIterator(
2484
+ env_, ro, ImmutableCFOptions(options), MutableCFOptions(options),
2485
+ BytewiseComparator(), internal_iter, nullptr /* version */,
2486
+ 10 /* sequence */, 0 /* force seek */, nullptr /* read_callback */));
2487
+ db_iter->SeekToLast();
2488
+ ASSERT_TRUE(db_iter->Valid());
2489
+ ASSERT_EQ(db_iter->key().ToString(), "c");
2490
+ ASSERT_EQ(db_iter->value().ToString(), "3");
2491
+ db_iter->Prev();
2492
+ ASSERT_TRUE(db_iter->Valid());
2493
+ ASSERT_EQ(db_iter->key().ToString(), "a");
2494
+ ASSERT_EQ(db_iter->value().ToString(), "1");
2495
+ db_iter->Prev();
2496
+ ASSERT_FALSE(db_iter->Valid());
2497
+ }
2498
+
2499
+ TEST_F(DBIteratorTest, DBIterator13) {
2500
+ ReadOptions ro;
2501
+ Options options;
2502
+ options.merge_operator = nullptr;
2503
+
2504
+ std::string key;
2505
+ key.resize(9);
2506
+ key.assign(9, static_cast<char>(0));
2507
+ key[0] = 'b';
2508
+
2509
+ TestIterator* internal_iter = new TestIterator(BytewiseComparator());
2510
+ internal_iter->AddPut(key, "0");
2511
+ internal_iter->AddPut(key, "1");
2512
+ internal_iter->AddPut(key, "2");
2513
+ internal_iter->AddPut(key, "3");
2514
+ internal_iter->AddPut(key, "4");
2515
+ internal_iter->AddPut(key, "5");
2516
+ internal_iter->AddPut(key, "6");
2517
+ internal_iter->AddPut(key, "7");
2518
+ internal_iter->AddPut(key, "8");
2519
+ internal_iter->Finish();
2520
+
2521
+ std::unique_ptr<Iterator> db_iter(NewDBIterator(
2522
+ env_, ro, ImmutableCFOptions(options), MutableCFOptions(options),
2523
+ BytewiseComparator(), internal_iter, nullptr /* version */,
2524
+ 2 /* sequence */, 3 /* max_sequential_skip_in_iterations */,
2525
+ nullptr /* read_callback */));
2526
+ db_iter->Seek("b");
2527
+ ASSERT_TRUE(db_iter->Valid());
2528
+ ASSERT_EQ(db_iter->key().ToString(), key);
2529
+ ASSERT_EQ(db_iter->value().ToString(), "2");
2530
+ }
2531
+
2532
+ TEST_F(DBIteratorTest, DBIterator14) {
2533
+ ReadOptions ro;
2534
+ Options options;
2535
+ options.merge_operator = nullptr;
2536
+
2537
+ std::string key("b");
2538
+ TestIterator* internal_iter = new TestIterator(BytewiseComparator());
2539
+ internal_iter->AddPut("b", "0");
2540
+ internal_iter->AddPut("b", "1");
2541
+ internal_iter->AddPut("b", "2");
2542
+ internal_iter->AddPut("b", "3");
2543
+ internal_iter->AddPut("a", "4");
2544
+ internal_iter->AddPut("a", "5");
2545
+ internal_iter->AddPut("a", "6");
2546
+ internal_iter->AddPut("c", "7");
2547
+ internal_iter->AddPut("c", "8");
2548
+ internal_iter->AddPut("c", "9");
2549
+ internal_iter->Finish();
2550
+
2551
+ std::unique_ptr<Iterator> db_iter(NewDBIterator(
2552
+ env_, ro, ImmutableCFOptions(options), MutableCFOptions(options),
2553
+ BytewiseComparator(), internal_iter, nullptr /* version */,
2554
+ 4 /* sequence */, 1 /* max_sequential_skip_in_iterations */,
2555
+ nullptr /* read_callback */));
2556
+ db_iter->Seek("b");
2557
+ ASSERT_TRUE(db_iter->Valid());
2558
+ ASSERT_EQ(db_iter->key().ToString(), "b");
2559
+ ASSERT_EQ(db_iter->value().ToString(), "3");
2560
+ db_iter->SeekToFirst();
2561
+ ASSERT_EQ(db_iter->key().ToString(), "a");
2562
+ ASSERT_EQ(db_iter->value().ToString(), "4");
2563
+ }
2564
+
2565
+ TEST_F(DBIteratorTest, DBIteratorTestDifferentialSnapshots) {
2566
+ { // test that KVs earlier that iter_start_seqnum are filtered out
2567
+ ReadOptions ro;
2568
+ ro.iter_start_seqnum=5;
2569
+ Options options;
2570
+ options.statistics = ROCKSDB_NAMESPACE::CreateDBStatistics();
2571
+
2572
+ TestIterator* internal_iter = new TestIterator(BytewiseComparator());
2573
+ for (size_t i = 0; i < 10; ++i) {
2574
+ internal_iter->AddPut(std::to_string(i), std::to_string(i) + "a");
2575
+ internal_iter->AddPut(std::to_string(i), std::to_string(i) + "b");
2576
+ internal_iter->AddPut(std::to_string(i), std::to_string(i) + "c");
2577
+ }
2578
+ internal_iter->Finish();
2579
+
2580
+ std::unique_ptr<Iterator> db_iter(NewDBIterator(
2581
+ env_, ro, ImmutableCFOptions(options), MutableCFOptions(options),
2582
+ BytewiseComparator(), internal_iter, nullptr /* version */,
2583
+ 13 /* sequence */, options.max_sequential_skip_in_iterations,
2584
+ nullptr /* read_callback */));
2585
+ // Expecting InternalKeys in [5,8] range with correct type
2586
+ int seqnums[4] = {5,8,11,13};
2587
+ std::string user_keys[4] = {"1","2","3","4"};
2588
+ std::string values[4] = {"1c", "2c", "3c", "4b"};
2589
+ int i = 0;
2590
+ for (db_iter->SeekToFirst(); db_iter->Valid(); db_iter->Next()) {
2591
+ FullKey fkey;
2592
+ ParseFullKey(db_iter->key(), &fkey);
2593
+ ASSERT_EQ(user_keys[i], fkey.user_key.ToString());
2594
+ ASSERT_EQ(EntryType::kEntryPut, fkey.type);
2595
+ ASSERT_EQ(seqnums[i], fkey.sequence);
2596
+ ASSERT_EQ(values[i], db_iter->value().ToString());
2597
+ i++;
2598
+ }
2599
+ ASSERT_EQ(i, 4);
2600
+ }
2601
+
2602
+ { // Test that deletes are returned correctly as internal KVs
2603
+ ReadOptions ro;
2604
+ ro.iter_start_seqnum=5;
2605
+ Options options;
2606
+ options.statistics = ROCKSDB_NAMESPACE::CreateDBStatistics();
2607
+
2608
+ TestIterator* internal_iter = new TestIterator(BytewiseComparator());
2609
+ for (size_t i = 0; i < 10; ++i) {
2610
+ internal_iter->AddPut(std::to_string(i), std::to_string(i) + "a");
2611
+ internal_iter->AddPut(std::to_string(i), std::to_string(i) + "b");
2612
+ internal_iter->AddDeletion(std::to_string(i));
2613
+ }
2614
+ internal_iter->Finish();
2615
+
2616
+ std::unique_ptr<Iterator> db_iter(NewDBIterator(
2617
+ env_, ro, ImmutableCFOptions(options), MutableCFOptions(options),
2618
+ BytewiseComparator(), internal_iter, nullptr /* version */,
2619
+ 13 /* sequence */, options.max_sequential_skip_in_iterations,
2620
+ nullptr /* read_callback */));
2621
+ // Expecting InternalKeys in [5,8] range with correct type
2622
+ int seqnums[4] = {5,8,11,13};
2623
+ EntryType key_types[4] = {EntryType::kEntryDelete,EntryType::kEntryDelete,
2624
+ EntryType::kEntryDelete,EntryType::kEntryPut};
2625
+ std::string user_keys[4] = {"1","2","3","4"};
2626
+ std::string values[4] = {"", "", "", "4b"};
2627
+ int i = 0;
2628
+ for (db_iter->SeekToFirst(); db_iter->Valid(); db_iter->Next()) {
2629
+ FullKey fkey;
2630
+ ParseFullKey(db_iter->key(), &fkey);
2631
+ ASSERT_EQ(user_keys[i], fkey.user_key.ToString());
2632
+ ASSERT_EQ(key_types[i], fkey.type);
2633
+ ASSERT_EQ(seqnums[i], fkey.sequence);
2634
+ ASSERT_EQ(values[i], db_iter->value().ToString());
2635
+ i++;
2636
+ }
2637
+ ASSERT_EQ(i, 4);
2638
+ }
2639
+ }
2640
+
2641
+ class DBIterWithMergeIterTest : public testing::Test {
2642
+ public:
2643
+ DBIterWithMergeIterTest()
2644
+ : env_(Env::Default()), icomp_(BytewiseComparator()) {
2645
+ options_.merge_operator = nullptr;
2646
+
2647
+ internal_iter1_ = new TestIterator(BytewiseComparator());
2648
+ internal_iter1_->Add("a", kTypeValue, "1", 3u);
2649
+ internal_iter1_->Add("f", kTypeValue, "2", 5u);
2650
+ internal_iter1_->Add("g", kTypeValue, "3", 7u);
2651
+ internal_iter1_->Finish();
2652
+
2653
+ internal_iter2_ = new TestIterator(BytewiseComparator());
2654
+ internal_iter2_->Add("a", kTypeValue, "4", 6u);
2655
+ internal_iter2_->Add("b", kTypeValue, "5", 1u);
2656
+ internal_iter2_->Add("c", kTypeValue, "6", 2u);
2657
+ internal_iter2_->Add("d", kTypeValue, "7", 3u);
2658
+ internal_iter2_->Finish();
2659
+
2660
+ std::vector<InternalIterator*> child_iters;
2661
+ child_iters.push_back(internal_iter1_);
2662
+ child_iters.push_back(internal_iter2_);
2663
+ InternalKeyComparator icomp(BytewiseComparator());
2664
+ InternalIterator* merge_iter =
2665
+ NewMergingIterator(&icomp_, &child_iters[0], 2u);
2666
+
2667
+ db_iter_.reset(NewDBIterator(
2668
+ env_, ro_, ImmutableCFOptions(options_), MutableCFOptions(options_),
2669
+ BytewiseComparator(), merge_iter, nullptr /* version */,
2670
+ 8 /* read data earlier than seqId 8 */,
2671
+ 3 /* max iterators before reseek */, nullptr /* read_callback */));
2672
+ }
2673
+
2674
+ Env* env_;
2675
+ ReadOptions ro_;
2676
+ Options options_;
2677
+ TestIterator* internal_iter1_;
2678
+ TestIterator* internal_iter2_;
2679
+ InternalKeyComparator icomp_;
2680
+ Iterator* merge_iter_;
2681
+ std::unique_ptr<Iterator> db_iter_;
2682
+ };
2683
+
2684
+ TEST_F(DBIterWithMergeIterTest, InnerMergeIterator1) {
2685
+ db_iter_->SeekToFirst();
2686
+ ASSERT_TRUE(db_iter_->Valid());
2687
+ ASSERT_EQ(db_iter_->key().ToString(), "a");
2688
+ ASSERT_EQ(db_iter_->value().ToString(), "4");
2689
+ db_iter_->Next();
2690
+ ASSERT_TRUE(db_iter_->Valid());
2691
+ ASSERT_EQ(db_iter_->key().ToString(), "b");
2692
+ ASSERT_EQ(db_iter_->value().ToString(), "5");
2693
+ db_iter_->Next();
2694
+ ASSERT_TRUE(db_iter_->Valid());
2695
+ ASSERT_EQ(db_iter_->key().ToString(), "c");
2696
+ ASSERT_EQ(db_iter_->value().ToString(), "6");
2697
+ db_iter_->Next();
2698
+ ASSERT_TRUE(db_iter_->Valid());
2699
+ ASSERT_EQ(db_iter_->key().ToString(), "d");
2700
+ ASSERT_EQ(db_iter_->value().ToString(), "7");
2701
+ db_iter_->Next();
2702
+ ASSERT_TRUE(db_iter_->Valid());
2703
+ ASSERT_EQ(db_iter_->key().ToString(), "f");
2704
+ ASSERT_EQ(db_iter_->value().ToString(), "2");
2705
+ db_iter_->Next();
2706
+ ASSERT_TRUE(db_iter_->Valid());
2707
+ ASSERT_EQ(db_iter_->key().ToString(), "g");
2708
+ ASSERT_EQ(db_iter_->value().ToString(), "3");
2709
+ db_iter_->Next();
2710
+ ASSERT_FALSE(db_iter_->Valid());
2711
+ }
2712
+
2713
+ TEST_F(DBIterWithMergeIterTest, InnerMergeIterator2) {
2714
+ // Test Prev() when one child iterator is at its end.
2715
+ db_iter_->SeekForPrev("g");
2716
+ ASSERT_TRUE(db_iter_->Valid());
2717
+ ASSERT_EQ(db_iter_->key().ToString(), "g");
2718
+ ASSERT_EQ(db_iter_->value().ToString(), "3");
2719
+ db_iter_->Prev();
2720
+ ASSERT_TRUE(db_iter_->Valid());
2721
+ ASSERT_EQ(db_iter_->key().ToString(), "f");
2722
+ ASSERT_EQ(db_iter_->value().ToString(), "2");
2723
+ db_iter_->Prev();
2724
+ ASSERT_TRUE(db_iter_->Valid());
2725
+ ASSERT_EQ(db_iter_->key().ToString(), "d");
2726
+ ASSERT_EQ(db_iter_->value().ToString(), "7");
2727
+ db_iter_->Prev();
2728
+ ASSERT_TRUE(db_iter_->Valid());
2729
+ ASSERT_EQ(db_iter_->key().ToString(), "c");
2730
+ ASSERT_EQ(db_iter_->value().ToString(), "6");
2731
+ db_iter_->Prev();
2732
+ ASSERT_TRUE(db_iter_->Valid());
2733
+ ASSERT_EQ(db_iter_->key().ToString(), "b");
2734
+ ASSERT_EQ(db_iter_->value().ToString(), "5");
2735
+ db_iter_->Prev();
2736
+ ASSERT_TRUE(db_iter_->Valid());
2737
+ ASSERT_EQ(db_iter_->key().ToString(), "a");
2738
+ ASSERT_EQ(db_iter_->value().ToString(), "4");
2739
+ }
2740
+
2741
+ TEST_F(DBIterWithMergeIterTest, InnerMergeIteratorDataRace1) {
2742
+ // Test Prev() when one child iterator is at its end but more rows
2743
+ // are added.
2744
+ db_iter_->Seek("f");
2745
+ ASSERT_TRUE(db_iter_->Valid());
2746
+ ASSERT_EQ(db_iter_->key().ToString(), "f");
2747
+ ASSERT_EQ(db_iter_->value().ToString(), "2");
2748
+
2749
+ // Test call back inserts a key in the end of the mem table after
2750
+ // MergeIterator::Prev() realized the mem table iterator is at its end
2751
+ // and before an SeekToLast() is called.
2752
+ ROCKSDB_NAMESPACE::SyncPoint::GetInstance()->SetCallBack(
2753
+ "MergeIterator::Prev:BeforePrev",
2754
+ [&](void* /*arg*/) { internal_iter2_->Add("z", kTypeValue, "7", 12u); });
2755
+ ROCKSDB_NAMESPACE::SyncPoint::GetInstance()->EnableProcessing();
2756
+
2757
+ db_iter_->Prev();
2758
+ ASSERT_TRUE(db_iter_->Valid());
2759
+ ASSERT_EQ(db_iter_->key().ToString(), "d");
2760
+ ASSERT_EQ(db_iter_->value().ToString(), "7");
2761
+ db_iter_->Prev();
2762
+ ASSERT_TRUE(db_iter_->Valid());
2763
+ ASSERT_EQ(db_iter_->key().ToString(), "c");
2764
+ ASSERT_EQ(db_iter_->value().ToString(), "6");
2765
+ db_iter_->Prev();
2766
+ ASSERT_TRUE(db_iter_->Valid());
2767
+ ASSERT_EQ(db_iter_->key().ToString(), "b");
2768
+ ASSERT_EQ(db_iter_->value().ToString(), "5");
2769
+ db_iter_->Prev();
2770
+ ASSERT_TRUE(db_iter_->Valid());
2771
+ ASSERT_EQ(db_iter_->key().ToString(), "a");
2772
+ ASSERT_EQ(db_iter_->value().ToString(), "4");
2773
+
2774
+ ROCKSDB_NAMESPACE::SyncPoint::GetInstance()->DisableProcessing();
2775
+ }
2776
+
2777
+ TEST_F(DBIterWithMergeIterTest, InnerMergeIteratorDataRace2) {
2778
+ // Test Prev() when one child iterator is at its end but more rows
2779
+ // are added.
2780
+ db_iter_->Seek("f");
2781
+ ASSERT_TRUE(db_iter_->Valid());
2782
+ ASSERT_EQ(db_iter_->key().ToString(), "f");
2783
+ ASSERT_EQ(db_iter_->value().ToString(), "2");
2784
+
2785
+ // Test call back inserts entries for update a key in the end of the
2786
+ // mem table after MergeIterator::Prev() realized the mem tableiterator is at
2787
+ // its end and before an SeekToLast() is called.
2788
+ ROCKSDB_NAMESPACE::SyncPoint::GetInstance()->SetCallBack(
2789
+ "MergeIterator::Prev:BeforePrev", [&](void* /*arg*/) {
2790
+ internal_iter2_->Add("z", kTypeValue, "7", 12u);
2791
+ internal_iter2_->Add("z", kTypeValue, "7", 11u);
2792
+ });
2793
+ ROCKSDB_NAMESPACE::SyncPoint::GetInstance()->EnableProcessing();
2794
+
2795
+ db_iter_->Prev();
2796
+ ASSERT_TRUE(db_iter_->Valid());
2797
+ ASSERT_EQ(db_iter_->key().ToString(), "d");
2798
+ ASSERT_EQ(db_iter_->value().ToString(), "7");
2799
+ db_iter_->Prev();
2800
+ ASSERT_TRUE(db_iter_->Valid());
2801
+ ASSERT_EQ(db_iter_->key().ToString(), "c");
2802
+ ASSERT_EQ(db_iter_->value().ToString(), "6");
2803
+ db_iter_->Prev();
2804
+ ASSERT_TRUE(db_iter_->Valid());
2805
+ ASSERT_EQ(db_iter_->key().ToString(), "b");
2806
+ ASSERT_EQ(db_iter_->value().ToString(), "5");
2807
+ db_iter_->Prev();
2808
+ ASSERT_TRUE(db_iter_->Valid());
2809
+ ASSERT_EQ(db_iter_->key().ToString(), "a");
2810
+ ASSERT_EQ(db_iter_->value().ToString(), "4");
2811
+
2812
+ ROCKSDB_NAMESPACE::SyncPoint::GetInstance()->DisableProcessing();
2813
+ }
2814
+
2815
+ TEST_F(DBIterWithMergeIterTest, InnerMergeIteratorDataRace3) {
2816
+ // Test Prev() when one child iterator is at its end but more rows
2817
+ // are added and max_skipped is triggered.
2818
+ db_iter_->Seek("f");
2819
+ ASSERT_TRUE(db_iter_->Valid());
2820
+ ASSERT_EQ(db_iter_->key().ToString(), "f");
2821
+ ASSERT_EQ(db_iter_->value().ToString(), "2");
2822
+
2823
+ // Test call back inserts entries for update a key in the end of the
2824
+ // mem table after MergeIterator::Prev() realized the mem table iterator is at
2825
+ // its end and before an SeekToLast() is called.
2826
+ ROCKSDB_NAMESPACE::SyncPoint::GetInstance()->SetCallBack(
2827
+ "MergeIterator::Prev:BeforePrev", [&](void* /*arg*/) {
2828
+ internal_iter2_->Add("z", kTypeValue, "7", 16u, true);
2829
+ internal_iter2_->Add("z", kTypeValue, "7", 15u, true);
2830
+ internal_iter2_->Add("z", kTypeValue, "7", 14u, true);
2831
+ internal_iter2_->Add("z", kTypeValue, "7", 13u, true);
2832
+ internal_iter2_->Add("z", kTypeValue, "7", 12u, true);
2833
+ internal_iter2_->Add("z", kTypeValue, "7", 11u, true);
2834
+ });
2835
+ ROCKSDB_NAMESPACE::SyncPoint::GetInstance()->EnableProcessing();
2836
+
2837
+ db_iter_->Prev();
2838
+ ASSERT_TRUE(db_iter_->Valid());
2839
+ ASSERT_EQ(db_iter_->key().ToString(), "d");
2840
+ ASSERT_EQ(db_iter_->value().ToString(), "7");
2841
+ db_iter_->Prev();
2842
+ ASSERT_TRUE(db_iter_->Valid());
2843
+ ASSERT_EQ(db_iter_->key().ToString(), "c");
2844
+ ASSERT_EQ(db_iter_->value().ToString(), "6");
2845
+ db_iter_->Prev();
2846
+ ASSERT_TRUE(db_iter_->Valid());
2847
+ ASSERT_EQ(db_iter_->key().ToString(), "b");
2848
+ ASSERT_EQ(db_iter_->value().ToString(), "5");
2849
+ db_iter_->Prev();
2850
+ ASSERT_TRUE(db_iter_->Valid());
2851
+ ASSERT_EQ(db_iter_->key().ToString(), "a");
2852
+ ASSERT_EQ(db_iter_->value().ToString(), "4");
2853
+
2854
+ ROCKSDB_NAMESPACE::SyncPoint::GetInstance()->DisableProcessing();
2855
+ }
2856
+
2857
+ TEST_F(DBIterWithMergeIterTest, InnerMergeIteratorDataRace4) {
2858
+ // Test Prev() when one child iterator has more rows inserted
2859
+ // between Seek() and Prev() when changing directions.
2860
+ internal_iter2_->Add("z", kTypeValue, "9", 4u);
2861
+
2862
+ db_iter_->Seek("g");
2863
+ ASSERT_TRUE(db_iter_->Valid());
2864
+ ASSERT_EQ(db_iter_->key().ToString(), "g");
2865
+ ASSERT_EQ(db_iter_->value().ToString(), "3");
2866
+
2867
+ // Test call back inserts entries for update a key before "z" in
2868
+ // mem table after MergeIterator::Prev() calls mem table iterator's
2869
+ // Seek() and before calling Prev()
2870
+ ROCKSDB_NAMESPACE::SyncPoint::GetInstance()->SetCallBack(
2871
+ "MergeIterator::Prev:BeforePrev", [&](void* arg) {
2872
+ IteratorWrapper* it = reinterpret_cast<IteratorWrapper*>(arg);
2873
+ if (it->key().starts_with("z")) {
2874
+ internal_iter2_->Add("x", kTypeValue, "7", 16u, true);
2875
+ internal_iter2_->Add("x", kTypeValue, "7", 15u, true);
2876
+ internal_iter2_->Add("x", kTypeValue, "7", 14u, true);
2877
+ internal_iter2_->Add("x", kTypeValue, "7", 13u, true);
2878
+ internal_iter2_->Add("x", kTypeValue, "7", 12u, true);
2879
+ internal_iter2_->Add("x", kTypeValue, "7", 11u, true);
2880
+ }
2881
+ });
2882
+ ROCKSDB_NAMESPACE::SyncPoint::GetInstance()->EnableProcessing();
2883
+
2884
+ db_iter_->Prev();
2885
+ ASSERT_TRUE(db_iter_->Valid());
2886
+ ASSERT_EQ(db_iter_->key().ToString(), "f");
2887
+ ASSERT_EQ(db_iter_->value().ToString(), "2");
2888
+ db_iter_->Prev();
2889
+ ASSERT_TRUE(db_iter_->Valid());
2890
+ ASSERT_EQ(db_iter_->key().ToString(), "d");
2891
+ ASSERT_EQ(db_iter_->value().ToString(), "7");
2892
+ db_iter_->Prev();
2893
+ ASSERT_TRUE(db_iter_->Valid());
2894
+ ASSERT_EQ(db_iter_->key().ToString(), "c");
2895
+ ASSERT_EQ(db_iter_->value().ToString(), "6");
2896
+ db_iter_->Prev();
2897
+ ASSERT_TRUE(db_iter_->Valid());
2898
+ ASSERT_EQ(db_iter_->key().ToString(), "b");
2899
+ ASSERT_EQ(db_iter_->value().ToString(), "5");
2900
+ db_iter_->Prev();
2901
+ ASSERT_TRUE(db_iter_->Valid());
2902
+ ASSERT_EQ(db_iter_->key().ToString(), "a");
2903
+ ASSERT_EQ(db_iter_->value().ToString(), "4");
2904
+
2905
+ ROCKSDB_NAMESPACE::SyncPoint::GetInstance()->DisableProcessing();
2906
+ }
2907
+
2908
+ TEST_F(DBIterWithMergeIterTest, InnerMergeIteratorDataRace5) {
2909
+ internal_iter2_->Add("z", kTypeValue, "9", 4u);
2910
+
2911
+ // Test Prev() when one child iterator has more rows inserted
2912
+ // between Seek() and Prev() when changing directions.
2913
+ db_iter_->Seek("g");
2914
+ ASSERT_TRUE(db_iter_->Valid());
2915
+ ASSERT_EQ(db_iter_->key().ToString(), "g");
2916
+ ASSERT_EQ(db_iter_->value().ToString(), "3");
2917
+
2918
+ // Test call back inserts entries for update a key before "z" in
2919
+ // mem table after MergeIterator::Prev() calls mem table iterator's
2920
+ // Seek() and before calling Prev()
2921
+ ROCKSDB_NAMESPACE::SyncPoint::GetInstance()->SetCallBack(
2922
+ "MergeIterator::Prev:BeforePrev", [&](void* arg) {
2923
+ IteratorWrapper* it = reinterpret_cast<IteratorWrapper*>(arg);
2924
+ if (it->key().starts_with("z")) {
2925
+ internal_iter2_->Add("x", kTypeValue, "7", 16u, true);
2926
+ internal_iter2_->Add("x", kTypeValue, "7", 15u, true);
2927
+ }
2928
+ });
2929
+ ROCKSDB_NAMESPACE::SyncPoint::GetInstance()->EnableProcessing();
2930
+
2931
+ db_iter_->Prev();
2932
+ ASSERT_TRUE(db_iter_->Valid());
2933
+ ASSERT_EQ(db_iter_->key().ToString(), "f");
2934
+ ASSERT_EQ(db_iter_->value().ToString(), "2");
2935
+ db_iter_->Prev();
2936
+ ASSERT_TRUE(db_iter_->Valid());
2937
+ ASSERT_EQ(db_iter_->key().ToString(), "d");
2938
+ ASSERT_EQ(db_iter_->value().ToString(), "7");
2939
+ db_iter_->Prev();
2940
+ ASSERT_TRUE(db_iter_->Valid());
2941
+ ASSERT_EQ(db_iter_->key().ToString(), "c");
2942
+ ASSERT_EQ(db_iter_->value().ToString(), "6");
2943
+ db_iter_->Prev();
2944
+ ASSERT_TRUE(db_iter_->Valid());
2945
+ ASSERT_EQ(db_iter_->key().ToString(), "b");
2946
+ ASSERT_EQ(db_iter_->value().ToString(), "5");
2947
+ db_iter_->Prev();
2948
+ ASSERT_TRUE(db_iter_->Valid());
2949
+ ASSERT_EQ(db_iter_->key().ToString(), "a");
2950
+ ASSERT_EQ(db_iter_->value().ToString(), "4");
2951
+
2952
+ ROCKSDB_NAMESPACE::SyncPoint::GetInstance()->DisableProcessing();
2953
+ }
2954
+
2955
+ TEST_F(DBIterWithMergeIterTest, InnerMergeIteratorDataRace6) {
2956
+ internal_iter2_->Add("z", kTypeValue, "9", 4u);
2957
+
2958
+ // Test Prev() when one child iterator has more rows inserted
2959
+ // between Seek() and Prev() when changing directions.
2960
+ db_iter_->Seek("g");
2961
+ ASSERT_TRUE(db_iter_->Valid());
2962
+ ASSERT_EQ(db_iter_->key().ToString(), "g");
2963
+ ASSERT_EQ(db_iter_->value().ToString(), "3");
2964
+
2965
+ // Test call back inserts an entry for update a key before "z" in
2966
+ // mem table after MergeIterator::Prev() calls mem table iterator's
2967
+ // Seek() and before calling Prev()
2968
+ ROCKSDB_NAMESPACE::SyncPoint::GetInstance()->SetCallBack(
2969
+ "MergeIterator::Prev:BeforePrev", [&](void* arg) {
2970
+ IteratorWrapper* it = reinterpret_cast<IteratorWrapper*>(arg);
2971
+ if (it->key().starts_with("z")) {
2972
+ internal_iter2_->Add("x", kTypeValue, "7", 16u, true);
2973
+ }
2974
+ });
2975
+ ROCKSDB_NAMESPACE::SyncPoint::GetInstance()->EnableProcessing();
2976
+
2977
+ db_iter_->Prev();
2978
+ ASSERT_TRUE(db_iter_->Valid());
2979
+ ASSERT_EQ(db_iter_->key().ToString(), "f");
2980
+ ASSERT_EQ(db_iter_->value().ToString(), "2");
2981
+ db_iter_->Prev();
2982
+ ASSERT_TRUE(db_iter_->Valid());
2983
+ ASSERT_EQ(db_iter_->key().ToString(), "d");
2984
+ ASSERT_EQ(db_iter_->value().ToString(), "7");
2985
+ db_iter_->Prev();
2986
+ ASSERT_TRUE(db_iter_->Valid());
2987
+ ASSERT_EQ(db_iter_->key().ToString(), "c");
2988
+ ASSERT_EQ(db_iter_->value().ToString(), "6");
2989
+ db_iter_->Prev();
2990
+ ASSERT_TRUE(db_iter_->Valid());
2991
+ ASSERT_EQ(db_iter_->key().ToString(), "b");
2992
+ ASSERT_EQ(db_iter_->value().ToString(), "5");
2993
+ db_iter_->Prev();
2994
+ ASSERT_TRUE(db_iter_->Valid());
2995
+ ASSERT_EQ(db_iter_->key().ToString(), "a");
2996
+ ASSERT_EQ(db_iter_->value().ToString(), "4");
2997
+
2998
+ ROCKSDB_NAMESPACE::SyncPoint::GetInstance()->DisableProcessing();
2999
+ }
3000
+
3001
+ TEST_F(DBIterWithMergeIterTest, InnerMergeIteratorDataRace7) {
3002
+ internal_iter1_->Add("u", kTypeValue, "10", 4u);
3003
+ internal_iter1_->Add("v", kTypeValue, "11", 4u);
3004
+ internal_iter1_->Add("w", kTypeValue, "12", 4u);
3005
+ internal_iter2_->Add("z", kTypeValue, "9", 4u);
3006
+
3007
+ // Test Prev() when one child iterator has more rows inserted
3008
+ // between Seek() and Prev() when changing directions.
3009
+ db_iter_->Seek("g");
3010
+ ASSERT_TRUE(db_iter_->Valid());
3011
+ ASSERT_EQ(db_iter_->key().ToString(), "g");
3012
+ ASSERT_EQ(db_iter_->value().ToString(), "3");
3013
+
3014
+ // Test call back inserts entries for update a key before "z" in
3015
+ // mem table after MergeIterator::Prev() calls mem table iterator's
3016
+ // Seek() and before calling Prev()
3017
+ ROCKSDB_NAMESPACE::SyncPoint::GetInstance()->SetCallBack(
3018
+ "MergeIterator::Prev:BeforePrev", [&](void* arg) {
3019
+ IteratorWrapper* it = reinterpret_cast<IteratorWrapper*>(arg);
3020
+ if (it->key().starts_with("z")) {
3021
+ internal_iter2_->Add("x", kTypeValue, "7", 16u, true);
3022
+ internal_iter2_->Add("x", kTypeValue, "7", 15u, true);
3023
+ internal_iter2_->Add("x", kTypeValue, "7", 14u, true);
3024
+ internal_iter2_->Add("x", kTypeValue, "7", 13u, true);
3025
+ internal_iter2_->Add("x", kTypeValue, "7", 12u, true);
3026
+ internal_iter2_->Add("x", kTypeValue, "7", 11u, true);
3027
+ }
3028
+ });
3029
+ ROCKSDB_NAMESPACE::SyncPoint::GetInstance()->EnableProcessing();
3030
+
3031
+ db_iter_->Prev();
3032
+ ASSERT_TRUE(db_iter_->Valid());
3033
+ ASSERT_EQ(db_iter_->key().ToString(), "f");
3034
+ ASSERT_EQ(db_iter_->value().ToString(), "2");
3035
+ db_iter_->Prev();
3036
+ ASSERT_TRUE(db_iter_->Valid());
3037
+ ASSERT_EQ(db_iter_->key().ToString(), "d");
3038
+ ASSERT_EQ(db_iter_->value().ToString(), "7");
3039
+ db_iter_->Prev();
3040
+ ASSERT_TRUE(db_iter_->Valid());
3041
+ ASSERT_EQ(db_iter_->key().ToString(), "c");
3042
+ ASSERT_EQ(db_iter_->value().ToString(), "6");
3043
+ db_iter_->Prev();
3044
+ ASSERT_TRUE(db_iter_->Valid());
3045
+ ASSERT_EQ(db_iter_->key().ToString(), "b");
3046
+ ASSERT_EQ(db_iter_->value().ToString(), "5");
3047
+ db_iter_->Prev();
3048
+ ASSERT_TRUE(db_iter_->Valid());
3049
+ ASSERT_EQ(db_iter_->key().ToString(), "a");
3050
+ ASSERT_EQ(db_iter_->value().ToString(), "4");
3051
+
3052
+ ROCKSDB_NAMESPACE::SyncPoint::GetInstance()->DisableProcessing();
3053
+ }
3054
+
3055
+ TEST_F(DBIterWithMergeIterTest, InnerMergeIteratorDataRace8) {
3056
+ // internal_iter1_: a, f, g
3057
+ // internal_iter2_: a, b, c, d, adding (z)
3058
+ internal_iter2_->Add("z", kTypeValue, "9", 4u);
3059
+
3060
+ // Test Prev() when one child iterator has more rows inserted
3061
+ // between Seek() and Prev() when changing directions.
3062
+ db_iter_->Seek("g");
3063
+ ASSERT_TRUE(db_iter_->Valid());
3064
+ ASSERT_EQ(db_iter_->key().ToString(), "g");
3065
+ ASSERT_EQ(db_iter_->value().ToString(), "3");
3066
+
3067
+ // Test call back inserts two keys before "z" in mem table after
3068
+ // MergeIterator::Prev() calls mem table iterator's Seek() and
3069
+ // before calling Prev()
3070
+ ROCKSDB_NAMESPACE::SyncPoint::GetInstance()->SetCallBack(
3071
+ "MergeIterator::Prev:BeforePrev", [&](void* arg) {
3072
+ IteratorWrapper* it = reinterpret_cast<IteratorWrapper*>(arg);
3073
+ if (it->key().starts_with("z")) {
3074
+ internal_iter2_->Add("x", kTypeValue, "7", 16u, true);
3075
+ internal_iter2_->Add("y", kTypeValue, "7", 17u, true);
3076
+ }
3077
+ });
3078
+ ROCKSDB_NAMESPACE::SyncPoint::GetInstance()->EnableProcessing();
3079
+
3080
+ db_iter_->Prev();
3081
+ ASSERT_TRUE(db_iter_->Valid());
3082
+ ASSERT_EQ(db_iter_->key().ToString(), "f");
3083
+ ASSERT_EQ(db_iter_->value().ToString(), "2");
3084
+ db_iter_->Prev();
3085
+ ASSERT_TRUE(db_iter_->Valid());
3086
+ ASSERT_EQ(db_iter_->key().ToString(), "d");
3087
+ ASSERT_EQ(db_iter_->value().ToString(), "7");
3088
+
3089
+ ROCKSDB_NAMESPACE::SyncPoint::GetInstance()->DisableProcessing();
3090
+ }
3091
+
3092
+
3093
+ TEST_F(DBIteratorTest, SeekPrefixTombstones) {
3094
+ ReadOptions ro;
3095
+ Options options;
3096
+ options.prefix_extractor.reset(NewNoopTransform());
3097
+ TestIterator* internal_iter = new TestIterator(BytewiseComparator());
3098
+ internal_iter->AddDeletion("b");
3099
+ internal_iter->AddDeletion("c");
3100
+ internal_iter->AddDeletion("d");
3101
+ internal_iter->AddDeletion("e");
3102
+ internal_iter->AddDeletion("f");
3103
+ internal_iter->AddDeletion("g");
3104
+ internal_iter->Finish();
3105
+
3106
+ ro.prefix_same_as_start = true;
3107
+ std::unique_ptr<Iterator> db_iter(NewDBIterator(
3108
+ env_, ro, ImmutableCFOptions(options), MutableCFOptions(options),
3109
+ BytewiseComparator(), internal_iter, nullptr /* version */,
3110
+ 10 /* sequence */, options.max_sequential_skip_in_iterations,
3111
+ nullptr /* read_callback */));
3112
+
3113
+ int skipped_keys = 0;
3114
+
3115
+ get_perf_context()->Reset();
3116
+ db_iter->SeekForPrev("z");
3117
+ skipped_keys =
3118
+ static_cast<int>(get_perf_context()->internal_key_skipped_count);
3119
+ ASSERT_EQ(skipped_keys, 0);
3120
+
3121
+ get_perf_context()->Reset();
3122
+ db_iter->Seek("a");
3123
+ skipped_keys =
3124
+ static_cast<int>(get_perf_context()->internal_key_skipped_count);
3125
+ ASSERT_EQ(skipped_keys, 0);
3126
+ }
3127
+
3128
+ TEST_F(DBIteratorTest, SeekToFirstLowerBound) {
3129
+ const int kNumKeys = 3;
3130
+ for (int i = 0; i < kNumKeys + 2; ++i) {
3131
+ // + 2 for two special cases: lower bound before and lower bound after the
3132
+ // internal iterator's keys
3133
+ TestIterator* internal_iter = new TestIterator(BytewiseComparator());
3134
+ for (int j = 1; j <= kNumKeys; ++j) {
3135
+ internal_iter->AddPut(std::to_string(j), "val");
3136
+ }
3137
+ internal_iter->Finish();
3138
+
3139
+ ReadOptions ro;
3140
+ auto lower_bound_str = std::to_string(i);
3141
+ Slice lower_bound(lower_bound_str);
3142
+ ro.iterate_lower_bound = &lower_bound;
3143
+ Options options;
3144
+ std::unique_ptr<Iterator> db_iter(NewDBIterator(
3145
+ env_, ro, ImmutableCFOptions(options), MutableCFOptions(options),
3146
+ BytewiseComparator(), internal_iter, nullptr /* version */,
3147
+ 10 /* sequence */, options.max_sequential_skip_in_iterations,
3148
+ nullptr /* read_callback */));
3149
+
3150
+ db_iter->SeekToFirst();
3151
+ if (i == kNumKeys + 1) {
3152
+ // lower bound was beyond the last key
3153
+ ASSERT_FALSE(db_iter->Valid());
3154
+ ASSERT_OK(db_iter->status());
3155
+ } else {
3156
+ ASSERT_TRUE(db_iter->Valid());
3157
+ int expected;
3158
+ if (i == 0) {
3159
+ // lower bound was before the first key
3160
+ expected = 1;
3161
+ } else {
3162
+ // lower bound was at the ith key
3163
+ expected = i;
3164
+ }
3165
+ ASSERT_EQ(std::to_string(expected), db_iter->key().ToString());
3166
+ }
3167
+ }
3168
+ }
3169
+
3170
+ TEST_F(DBIteratorTest, PrevLowerBound) {
3171
+ const int kNumKeys = 3;
3172
+ const int kLowerBound = 2;
3173
+ TestIterator* internal_iter = new TestIterator(BytewiseComparator());
3174
+ for (int j = 1; j <= kNumKeys; ++j) {
3175
+ internal_iter->AddPut(std::to_string(j), "val");
3176
+ }
3177
+ internal_iter->Finish();
3178
+
3179
+ ReadOptions ro;
3180
+ auto lower_bound_str = std::to_string(kLowerBound);
3181
+ Slice lower_bound(lower_bound_str);
3182
+ ro.iterate_lower_bound = &lower_bound;
3183
+ Options options;
3184
+ std::unique_ptr<Iterator> db_iter(NewDBIterator(
3185
+ env_, ro, ImmutableCFOptions(options), MutableCFOptions(options),
3186
+ BytewiseComparator(), internal_iter, nullptr /* version */,
3187
+ 10 /* sequence */, options.max_sequential_skip_in_iterations,
3188
+ nullptr /* read_callback */));
3189
+
3190
+ db_iter->SeekToLast();
3191
+ for (int i = kNumKeys; i >= kLowerBound; --i) {
3192
+ ASSERT_TRUE(db_iter->Valid());
3193
+ ASSERT_EQ(std::to_string(i), db_iter->key().ToString());
3194
+ db_iter->Prev();
3195
+ }
3196
+ ASSERT_FALSE(db_iter->Valid());
3197
+ }
3198
+
3199
+ TEST_F(DBIteratorTest, SeekLessLowerBound) {
3200
+ const int kNumKeys = 3;
3201
+ const int kLowerBound = 2;
3202
+ TestIterator* internal_iter = new TestIterator(BytewiseComparator());
3203
+ for (int j = 1; j <= kNumKeys; ++j) {
3204
+ internal_iter->AddPut(std::to_string(j), "val");
3205
+ }
3206
+ internal_iter->Finish();
3207
+
3208
+ ReadOptions ro;
3209
+ auto lower_bound_str = std::to_string(kLowerBound);
3210
+ Slice lower_bound(lower_bound_str);
3211
+ ro.iterate_lower_bound = &lower_bound;
3212
+ Options options;
3213
+ std::unique_ptr<Iterator> db_iter(NewDBIterator(
3214
+ env_, ro, ImmutableCFOptions(options), MutableCFOptions(options),
3215
+ BytewiseComparator(), internal_iter, nullptr /* version */,
3216
+ 10 /* sequence */, options.max_sequential_skip_in_iterations,
3217
+ nullptr /* read_callback */));
3218
+
3219
+ auto before_lower_bound_str = std::to_string(kLowerBound - 1);
3220
+ Slice before_lower_bound(lower_bound_str);
3221
+
3222
+ db_iter->Seek(before_lower_bound);
3223
+ ASSERT_TRUE(db_iter->Valid());
3224
+ ASSERT_EQ(lower_bound_str, db_iter->key().ToString());
3225
+ }
3226
+
3227
+ TEST_F(DBIteratorTest, ReverseToForwardWithDisappearingKeys) {
3228
+ Options options;
3229
+ options.prefix_extractor.reset(NewCappedPrefixTransform(0));
3230
+
3231
+ TestIterator* internal_iter = new TestIterator(BytewiseComparator());
3232
+ internal_iter->AddPut("a", "A");
3233
+ internal_iter->AddPut("b", "B");
3234
+ for (int i = 0; i < 100; ++i) {
3235
+ internal_iter->AddPut("c" + ToString(i), "");
3236
+ }
3237
+ internal_iter->Finish();
3238
+
3239
+ std::unique_ptr<Iterator> db_iter(NewDBIterator(
3240
+ env_, ReadOptions(), ImmutableCFOptions(options),
3241
+ MutableCFOptions(options), BytewiseComparator(), internal_iter,
3242
+ nullptr /* version */, 10 /* sequence */,
3243
+ options.max_sequential_skip_in_iterations, nullptr /* read_callback */));
3244
+
3245
+ db_iter->SeekForPrev("a");
3246
+ ASSERT_TRUE(db_iter->Valid());
3247
+ ASSERT_OK(db_iter->status());
3248
+ ASSERT_EQ("a", db_iter->key().ToString());
3249
+
3250
+ internal_iter->Vanish("a");
3251
+ db_iter->Next();
3252
+ ASSERT_TRUE(db_iter->Valid());
3253
+ ASSERT_OK(db_iter->status());
3254
+ ASSERT_EQ("b", db_iter->key().ToString());
3255
+
3256
+ // A (sort of) bug used to cause DBIter to pointlessly drag the internal
3257
+ // iterator all the way to the end. But this doesn't really matter at the time
3258
+ // of writing because the only iterator that can see disappearing keys is
3259
+ // ForwardIterator, which doesn't support SeekForPrev().
3260
+ EXPECT_LT(internal_iter->steps(), 20);
3261
+ }
3262
+
3263
+ } // namespace ROCKSDB_NAMESPACE
3264
+
3265
+ int main(int argc, char** argv) {
3266
+ ::testing::InitGoogleTest(&argc, argv);
3267
+ return RUN_ALL_TESTS();
3268
+ }