@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,3197 @@
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
+ // Copyright (c) 2011 The LevelDB Authors. All rights reserved.
7
+ // Use of this source code is governed by a BSD-style license that can be
8
+ // found in the LICENSE file. See the AUTHORS file for names of contributors.
9
+
10
+ #include <functional>
11
+
12
+ #include "db/arena_wrapped_db_iter.h"
13
+ #include "db/db_iter.h"
14
+ #include "db/db_test_util.h"
15
+ #include "port/port.h"
16
+ #include "port/stack_trace.h"
17
+ #include "rocksdb/iostats_context.h"
18
+ #include "rocksdb/perf_context.h"
19
+ #include "table/block_based/flush_block_policy.h"
20
+ #include "util/random.h"
21
+
22
+ namespace ROCKSDB_NAMESPACE {
23
+
24
+ // A dumb ReadCallback which saying every key is committed.
25
+ class DummyReadCallback : public ReadCallback {
26
+ public:
27
+ DummyReadCallback() : ReadCallback(kMaxSequenceNumber) {}
28
+ bool IsVisibleFullCheck(SequenceNumber /*seq*/) override { return true; }
29
+ void SetSnapshot(SequenceNumber seq) { max_visible_seq_ = seq; }
30
+ };
31
+
32
+ // Test param:
33
+ // bool: whether to pass read_callback to NewIterator().
34
+ class DBIteratorTest : public DBTestBase,
35
+ public testing::WithParamInterface<bool> {
36
+ public:
37
+ DBIteratorTest() : DBTestBase("/db_iterator_test", /*env_do_fsync=*/true) {}
38
+
39
+ Iterator* NewIterator(const ReadOptions& read_options,
40
+ ColumnFamilyHandle* column_family = nullptr) {
41
+ if (column_family == nullptr) {
42
+ column_family = db_->DefaultColumnFamily();
43
+ }
44
+ auto* cfd =
45
+ static_cast_with_check<ColumnFamilyHandleImpl>(column_family)->cfd();
46
+ SequenceNumber seq = read_options.snapshot != nullptr
47
+ ? read_options.snapshot->GetSequenceNumber()
48
+ : db_->GetLatestSequenceNumber();
49
+ bool use_read_callback = GetParam();
50
+ DummyReadCallback* read_callback = nullptr;
51
+ if (use_read_callback) {
52
+ read_callback = new DummyReadCallback();
53
+ read_callback->SetSnapshot(seq);
54
+ InstrumentedMutexLock lock(&mutex_);
55
+ read_callbacks_.push_back(
56
+ std::unique_ptr<DummyReadCallback>(read_callback));
57
+ }
58
+ return dbfull()->NewIteratorImpl(read_options, cfd, seq, read_callback);
59
+ }
60
+
61
+ private:
62
+ InstrumentedMutex mutex_;
63
+ std::vector<std::unique_ptr<DummyReadCallback>> read_callbacks_;
64
+ };
65
+
66
+ TEST_P(DBIteratorTest, IteratorProperty) {
67
+ // The test needs to be changed if kPersistedTier is supported in iterator.
68
+ Options options = CurrentOptions();
69
+ CreateAndReopenWithCF({"pikachu"}, options);
70
+ ASSERT_OK(Put(1, "1", "2"));
71
+ ASSERT_OK(Delete(1, "2"));
72
+ ReadOptions ropt;
73
+ ropt.pin_data = false;
74
+ {
75
+ std::unique_ptr<Iterator> iter(NewIterator(ropt, handles_[1]));
76
+ iter->SeekToFirst();
77
+ std::string prop_value;
78
+ ASSERT_NOK(iter->GetProperty("non_existing.value", &prop_value));
79
+ ASSERT_OK(iter->GetProperty("rocksdb.iterator.is-key-pinned", &prop_value));
80
+ ASSERT_EQ("0", prop_value);
81
+ ASSERT_OK(iter->GetProperty("rocksdb.iterator.internal-key", &prop_value));
82
+ ASSERT_EQ("1", prop_value);
83
+ iter->Next();
84
+ ASSERT_OK(iter->GetProperty("rocksdb.iterator.is-key-pinned", &prop_value));
85
+ ASSERT_EQ("Iterator is not valid.", prop_value);
86
+
87
+ // Get internal key at which the iteration stopped (tombstone in this case).
88
+ ASSERT_OK(iter->GetProperty("rocksdb.iterator.internal-key", &prop_value));
89
+ ASSERT_EQ("2", prop_value);
90
+ }
91
+ Close();
92
+ }
93
+
94
+ TEST_P(DBIteratorTest, PersistedTierOnIterator) {
95
+ // The test needs to be changed if kPersistedTier is supported in iterator.
96
+ Options options = CurrentOptions();
97
+ CreateAndReopenWithCF({"pikachu"}, options);
98
+ ReadOptions ropt;
99
+ ropt.read_tier = kPersistedTier;
100
+
101
+ auto* iter = db_->NewIterator(ropt, handles_[1]);
102
+ ASSERT_TRUE(iter->status().IsNotSupported());
103
+ delete iter;
104
+
105
+ std::vector<Iterator*> iters;
106
+ ASSERT_TRUE(db_->NewIterators(ropt, {handles_[1]}, &iters).IsNotSupported());
107
+ Close();
108
+ }
109
+
110
+ TEST_P(DBIteratorTest, NonBlockingIteration) {
111
+ do {
112
+ ReadOptions non_blocking_opts, regular_opts;
113
+ Options options = CurrentOptions();
114
+ options.statistics = ROCKSDB_NAMESPACE::CreateDBStatistics();
115
+ non_blocking_opts.read_tier = kBlockCacheTier;
116
+ CreateAndReopenWithCF({"pikachu"}, options);
117
+ // write one kv to the database.
118
+ ASSERT_OK(Put(1, "a", "b"));
119
+
120
+ // scan using non-blocking iterator. We should find it because
121
+ // it is in memtable.
122
+ Iterator* iter = NewIterator(non_blocking_opts, handles_[1]);
123
+ int count = 0;
124
+ for (iter->SeekToFirst(); iter->Valid(); iter->Next()) {
125
+ ASSERT_OK(iter->status());
126
+ count++;
127
+ }
128
+ ASSERT_EQ(count, 1);
129
+ delete iter;
130
+
131
+ // flush memtable to storage. Now, the key should not be in the
132
+ // memtable neither in the block cache.
133
+ ASSERT_OK(Flush(1));
134
+
135
+ // verify that a non-blocking iterator does not find any
136
+ // kvs. Neither does it do any IOs to storage.
137
+ uint64_t numopen = TestGetTickerCount(options, NO_FILE_OPENS);
138
+ uint64_t cache_added = TestGetTickerCount(options, BLOCK_CACHE_ADD);
139
+ iter = NewIterator(non_blocking_opts, handles_[1]);
140
+ count = 0;
141
+ for (iter->SeekToFirst(); iter->Valid(); iter->Next()) {
142
+ count++;
143
+ }
144
+ ASSERT_EQ(count, 0);
145
+ ASSERT_TRUE(iter->status().IsIncomplete());
146
+ ASSERT_EQ(numopen, TestGetTickerCount(options, NO_FILE_OPENS));
147
+ ASSERT_EQ(cache_added, TestGetTickerCount(options, BLOCK_CACHE_ADD));
148
+ delete iter;
149
+
150
+ // read in the specified block via a regular get
151
+ ASSERT_EQ(Get(1, "a"), "b");
152
+
153
+ // verify that we can find it via a non-blocking scan
154
+ numopen = TestGetTickerCount(options, NO_FILE_OPENS);
155
+ cache_added = TestGetTickerCount(options, BLOCK_CACHE_ADD);
156
+ iter = NewIterator(non_blocking_opts, handles_[1]);
157
+ count = 0;
158
+ for (iter->SeekToFirst(); iter->Valid(); iter->Next()) {
159
+ ASSERT_OK(iter->status());
160
+ count++;
161
+ }
162
+ ASSERT_EQ(count, 1);
163
+ ASSERT_EQ(numopen, TestGetTickerCount(options, NO_FILE_OPENS));
164
+ ASSERT_EQ(cache_added, TestGetTickerCount(options, BLOCK_CACHE_ADD));
165
+ delete iter;
166
+
167
+ // This test verifies block cache behaviors, which is not used by plain
168
+ // table format.
169
+ } while (ChangeOptions(kSkipPlainTable | kSkipNoSeekToLast | kSkipMmapReads));
170
+ }
171
+
172
+ TEST_P(DBIteratorTest, IterSeekBeforePrev) {
173
+ ASSERT_OK(Put("a", "b"));
174
+ ASSERT_OK(Put("c", "d"));
175
+ EXPECT_OK(dbfull()->Flush(FlushOptions()));
176
+ ASSERT_OK(Put("0", "f"));
177
+ ASSERT_OK(Put("1", "h"));
178
+ EXPECT_OK(dbfull()->Flush(FlushOptions()));
179
+ ASSERT_OK(Put("2", "j"));
180
+ auto iter = NewIterator(ReadOptions());
181
+ iter->Seek(Slice("c"));
182
+ iter->Prev();
183
+ iter->Seek(Slice("a"));
184
+ iter->Prev();
185
+ delete iter;
186
+ }
187
+
188
+ TEST_P(DBIteratorTest, IterReseekNewUpperBound) {
189
+ Random rnd(301);
190
+ Options options = CurrentOptions();
191
+ BlockBasedTableOptions table_options;
192
+ table_options.block_size = 1024;
193
+ table_options.block_size_deviation = 50;
194
+ options.table_factory.reset(NewBlockBasedTableFactory(table_options));
195
+ options.compression = kNoCompression;
196
+ Reopen(options);
197
+
198
+ ASSERT_OK(Put("a", rnd.RandomString(400)));
199
+ ASSERT_OK(Put("aabb", rnd.RandomString(400)));
200
+ ASSERT_OK(Put("aaef", rnd.RandomString(400)));
201
+ ASSERT_OK(Put("b", rnd.RandomString(400)));
202
+ EXPECT_OK(dbfull()->Flush(FlushOptions()));
203
+ ReadOptions opts;
204
+ Slice ub = Slice("aa");
205
+ opts.iterate_upper_bound = &ub;
206
+ auto iter = NewIterator(opts);
207
+ iter->Seek(Slice("a"));
208
+ ub = Slice("b");
209
+ iter->Seek(Slice("aabc"));
210
+ ASSERT_TRUE(iter->Valid());
211
+ ASSERT_EQ(iter->key().ToString(), "aaef");
212
+ delete iter;
213
+ }
214
+
215
+ TEST_P(DBIteratorTest, IterSeekForPrevBeforeNext) {
216
+ ASSERT_OK(Put("a", "b"));
217
+ ASSERT_OK(Put("c", "d"));
218
+ EXPECT_OK(dbfull()->Flush(FlushOptions()));
219
+ ASSERT_OK(Put("0", "f"));
220
+ ASSERT_OK(Put("1", "h"));
221
+ EXPECT_OK(dbfull()->Flush(FlushOptions()));
222
+ ASSERT_OK(Put("2", "j"));
223
+ auto iter = NewIterator(ReadOptions());
224
+ iter->SeekForPrev(Slice("0"));
225
+ iter->Next();
226
+ iter->SeekForPrev(Slice("1"));
227
+ iter->Next();
228
+ delete iter;
229
+ }
230
+
231
+ namespace {
232
+ std::string MakeLongKey(size_t length, char c) {
233
+ return std::string(length, c);
234
+ }
235
+ } // namespace
236
+
237
+ TEST_P(DBIteratorTest, IterLongKeys) {
238
+ ASSERT_OK(Put(MakeLongKey(20, 0), "0"));
239
+ ASSERT_OK(Put(MakeLongKey(32, 2), "2"));
240
+ ASSERT_OK(Put("a", "b"));
241
+ EXPECT_OK(dbfull()->Flush(FlushOptions()));
242
+ ASSERT_OK(Put(MakeLongKey(50, 1), "1"));
243
+ ASSERT_OK(Put(MakeLongKey(127, 3), "3"));
244
+ ASSERT_OK(Put(MakeLongKey(64, 4), "4"));
245
+ auto iter = NewIterator(ReadOptions());
246
+
247
+ // Create a key that needs to be skipped for Seq too new
248
+ iter->Seek(MakeLongKey(20, 0));
249
+ ASSERT_EQ(IterStatus(iter), MakeLongKey(20, 0) + "->0");
250
+ iter->Next();
251
+ ASSERT_EQ(IterStatus(iter), MakeLongKey(50, 1) + "->1");
252
+ iter->Next();
253
+ ASSERT_EQ(IterStatus(iter), MakeLongKey(32, 2) + "->2");
254
+ iter->Next();
255
+ ASSERT_EQ(IterStatus(iter), MakeLongKey(127, 3) + "->3");
256
+ iter->Next();
257
+ ASSERT_EQ(IterStatus(iter), MakeLongKey(64, 4) + "->4");
258
+
259
+ iter->SeekForPrev(MakeLongKey(127, 3));
260
+ ASSERT_EQ(IterStatus(iter), MakeLongKey(127, 3) + "->3");
261
+ iter->Prev();
262
+ ASSERT_EQ(IterStatus(iter), MakeLongKey(32, 2) + "->2");
263
+ iter->Prev();
264
+ ASSERT_EQ(IterStatus(iter), MakeLongKey(50, 1) + "->1");
265
+ delete iter;
266
+
267
+ iter = NewIterator(ReadOptions());
268
+ iter->Seek(MakeLongKey(50, 1));
269
+ ASSERT_EQ(IterStatus(iter), MakeLongKey(50, 1) + "->1");
270
+ iter->Next();
271
+ ASSERT_EQ(IterStatus(iter), MakeLongKey(32, 2) + "->2");
272
+ iter->Next();
273
+ ASSERT_EQ(IterStatus(iter), MakeLongKey(127, 3) + "->3");
274
+ delete iter;
275
+ }
276
+
277
+ TEST_P(DBIteratorTest, IterNextWithNewerSeq) {
278
+ ASSERT_OK(Put("0", "0"));
279
+ EXPECT_OK(dbfull()->Flush(FlushOptions()));
280
+ ASSERT_OK(Put("a", "b"));
281
+ ASSERT_OK(Put("c", "d"));
282
+ ASSERT_OK(Put("d", "e"));
283
+ auto iter = NewIterator(ReadOptions());
284
+
285
+ // Create a key that needs to be skipped for Seq too new
286
+ for (uint64_t i = 0; i < last_options_.max_sequential_skip_in_iterations + 1;
287
+ i++) {
288
+ ASSERT_OK(Put("b", "f"));
289
+ }
290
+
291
+ iter->Seek(Slice("a"));
292
+ ASSERT_EQ(IterStatus(iter), "a->b");
293
+ iter->Next();
294
+ ASSERT_EQ(IterStatus(iter), "c->d");
295
+ iter->SeekForPrev(Slice("b"));
296
+ ASSERT_EQ(IterStatus(iter), "a->b");
297
+ iter->Next();
298
+ ASSERT_EQ(IterStatus(iter), "c->d");
299
+
300
+ delete iter;
301
+ }
302
+
303
+ TEST_P(DBIteratorTest, IterPrevWithNewerSeq) {
304
+ ASSERT_OK(Put("0", "0"));
305
+ EXPECT_OK(dbfull()->Flush(FlushOptions()));
306
+ ASSERT_OK(Put("a", "b"));
307
+ ASSERT_OK(Put("c", "d"));
308
+ ASSERT_OK(Put("d", "e"));
309
+ auto iter = NewIterator(ReadOptions());
310
+
311
+ // Create a key that needs to be skipped for Seq too new
312
+ for (uint64_t i = 0; i < last_options_.max_sequential_skip_in_iterations + 1;
313
+ i++) {
314
+ ASSERT_OK(Put("b", "f"));
315
+ }
316
+
317
+ iter->Seek(Slice("d"));
318
+ ASSERT_EQ(IterStatus(iter), "d->e");
319
+ iter->Prev();
320
+ ASSERT_EQ(IterStatus(iter), "c->d");
321
+ iter->Prev();
322
+ ASSERT_EQ(IterStatus(iter), "a->b");
323
+ iter->Prev();
324
+ iter->SeekForPrev(Slice("d"));
325
+ ASSERT_EQ(IterStatus(iter), "d->e");
326
+ iter->Prev();
327
+ ASSERT_EQ(IterStatus(iter), "c->d");
328
+ iter->Prev();
329
+ ASSERT_EQ(IterStatus(iter), "a->b");
330
+ iter->Prev();
331
+ delete iter;
332
+ }
333
+
334
+ TEST_P(DBIteratorTest, IterPrevWithNewerSeq2) {
335
+ ASSERT_OK(Put("0", "0"));
336
+ EXPECT_OK(dbfull()->Flush(FlushOptions()));
337
+ ASSERT_OK(Put("a", "b"));
338
+ ASSERT_OK(Put("c", "d"));
339
+ ASSERT_OK(Put("e", "f"));
340
+ auto iter = NewIterator(ReadOptions());
341
+ auto iter2 = NewIterator(ReadOptions());
342
+ iter->Seek(Slice("c"));
343
+ iter2->SeekForPrev(Slice("d"));
344
+ ASSERT_EQ(IterStatus(iter), "c->d");
345
+ ASSERT_EQ(IterStatus(iter2), "c->d");
346
+
347
+ // Create a key that needs to be skipped for Seq too new
348
+ for (uint64_t i = 0; i < last_options_.max_sequential_skip_in_iterations + 1;
349
+ i++) {
350
+ ASSERT_OK(Put("b", "f"));
351
+ }
352
+
353
+ iter->Prev();
354
+ ASSERT_EQ(IterStatus(iter), "a->b");
355
+ iter->Prev();
356
+ iter2->Prev();
357
+ ASSERT_EQ(IterStatus(iter2), "a->b");
358
+ iter2->Prev();
359
+ delete iter;
360
+ delete iter2;
361
+ }
362
+
363
+ TEST_P(DBIteratorTest, IterEmpty) {
364
+ do {
365
+ CreateAndReopenWithCF({"pikachu"}, CurrentOptions());
366
+ Iterator* iter = NewIterator(ReadOptions(), handles_[1]);
367
+
368
+ iter->SeekToFirst();
369
+ ASSERT_EQ(IterStatus(iter), "(invalid)");
370
+
371
+ iter->SeekToLast();
372
+ ASSERT_EQ(IterStatus(iter), "(invalid)");
373
+
374
+ iter->Seek("foo");
375
+ ASSERT_EQ(IterStatus(iter), "(invalid)");
376
+
377
+ iter->SeekForPrev("foo");
378
+ ASSERT_EQ(IterStatus(iter), "(invalid)");
379
+
380
+ ASSERT_OK(iter->status());
381
+
382
+ delete iter;
383
+ } while (ChangeCompactOptions());
384
+ }
385
+
386
+ TEST_P(DBIteratorTest, IterSingle) {
387
+ do {
388
+ CreateAndReopenWithCF({"pikachu"}, CurrentOptions());
389
+ ASSERT_OK(Put(1, "a", "va"));
390
+ Iterator* iter = NewIterator(ReadOptions(), handles_[1]);
391
+
392
+ iter->SeekToFirst();
393
+ ASSERT_EQ(IterStatus(iter), "a->va");
394
+ iter->Next();
395
+ ASSERT_EQ(IterStatus(iter), "(invalid)");
396
+ iter->SeekToFirst();
397
+ ASSERT_EQ(IterStatus(iter), "a->va");
398
+ iter->Prev();
399
+ ASSERT_EQ(IterStatus(iter), "(invalid)");
400
+
401
+ iter->SeekToLast();
402
+ ASSERT_EQ(IterStatus(iter), "a->va");
403
+ iter->Next();
404
+ ASSERT_EQ(IterStatus(iter), "(invalid)");
405
+ iter->SeekToLast();
406
+ ASSERT_EQ(IterStatus(iter), "a->va");
407
+ iter->Prev();
408
+ ASSERT_EQ(IterStatus(iter), "(invalid)");
409
+
410
+ iter->Seek("");
411
+ ASSERT_EQ(IterStatus(iter), "a->va");
412
+ iter->Next();
413
+ ASSERT_EQ(IterStatus(iter), "(invalid)");
414
+ iter->SeekForPrev("");
415
+ ASSERT_EQ(IterStatus(iter), "(invalid)");
416
+
417
+ iter->Seek("a");
418
+ ASSERT_EQ(IterStatus(iter), "a->va");
419
+ iter->Next();
420
+ ASSERT_EQ(IterStatus(iter), "(invalid)");
421
+ iter->SeekForPrev("a");
422
+ ASSERT_EQ(IterStatus(iter), "a->va");
423
+ iter->Prev();
424
+ ASSERT_EQ(IterStatus(iter), "(invalid)");
425
+
426
+ iter->Seek("b");
427
+ ASSERT_EQ(IterStatus(iter), "(invalid)");
428
+ iter->SeekForPrev("b");
429
+ ASSERT_EQ(IterStatus(iter), "a->va");
430
+ iter->Prev();
431
+ ASSERT_EQ(IterStatus(iter), "(invalid)");
432
+
433
+ delete iter;
434
+ } while (ChangeCompactOptions());
435
+ }
436
+
437
+ TEST_P(DBIteratorTest, IterMulti) {
438
+ do {
439
+ CreateAndReopenWithCF({"pikachu"}, CurrentOptions());
440
+ ASSERT_OK(Put(1, "a", "va"));
441
+ ASSERT_OK(Put(1, "b", "vb"));
442
+ ASSERT_OK(Put(1, "c", "vc"));
443
+ Iterator* iter = NewIterator(ReadOptions(), handles_[1]);
444
+
445
+ iter->SeekToFirst();
446
+ ASSERT_EQ(IterStatus(iter), "a->va");
447
+ iter->Next();
448
+ ASSERT_EQ(IterStatus(iter), "b->vb");
449
+ iter->Next();
450
+ ASSERT_EQ(IterStatus(iter), "c->vc");
451
+ iter->Next();
452
+ ASSERT_EQ(IterStatus(iter), "(invalid)");
453
+ iter->SeekToFirst();
454
+ ASSERT_EQ(IterStatus(iter), "a->va");
455
+ iter->Prev();
456
+ ASSERT_EQ(IterStatus(iter), "(invalid)");
457
+
458
+ iter->SeekToLast();
459
+ ASSERT_EQ(IterStatus(iter), "c->vc");
460
+ iter->Prev();
461
+ ASSERT_EQ(IterStatus(iter), "b->vb");
462
+ iter->Prev();
463
+ ASSERT_EQ(IterStatus(iter), "a->va");
464
+ iter->Prev();
465
+ ASSERT_EQ(IterStatus(iter), "(invalid)");
466
+ iter->SeekToLast();
467
+ ASSERT_EQ(IterStatus(iter), "c->vc");
468
+ iter->Next();
469
+ ASSERT_EQ(IterStatus(iter), "(invalid)");
470
+
471
+ iter->Seek("");
472
+ ASSERT_EQ(IterStatus(iter), "a->va");
473
+ iter->Seek("a");
474
+ ASSERT_EQ(IterStatus(iter), "a->va");
475
+ iter->Seek("ax");
476
+ ASSERT_EQ(IterStatus(iter), "b->vb");
477
+ iter->SeekForPrev("d");
478
+ ASSERT_EQ(IterStatus(iter), "c->vc");
479
+ iter->SeekForPrev("c");
480
+ ASSERT_EQ(IterStatus(iter), "c->vc");
481
+ iter->SeekForPrev("bx");
482
+ ASSERT_EQ(IterStatus(iter), "b->vb");
483
+
484
+ iter->Seek("b");
485
+ ASSERT_EQ(IterStatus(iter), "b->vb");
486
+ iter->Seek("z");
487
+ ASSERT_EQ(IterStatus(iter), "(invalid)");
488
+ iter->SeekForPrev("b");
489
+ ASSERT_EQ(IterStatus(iter), "b->vb");
490
+ iter->SeekForPrev("");
491
+ ASSERT_EQ(IterStatus(iter), "(invalid)");
492
+
493
+ // Switch from reverse to forward
494
+ iter->SeekToLast();
495
+ iter->Prev();
496
+ iter->Prev();
497
+ iter->Next();
498
+ ASSERT_EQ(IterStatus(iter), "b->vb");
499
+
500
+ // Switch from forward to reverse
501
+ iter->SeekToFirst();
502
+ iter->Next();
503
+ iter->Next();
504
+ iter->Prev();
505
+ ASSERT_EQ(IterStatus(iter), "b->vb");
506
+
507
+ // Make sure iter stays at snapshot
508
+ ASSERT_OK(Put(1, "a", "va2"));
509
+ ASSERT_OK(Put(1, "a2", "va3"));
510
+ ASSERT_OK(Put(1, "b", "vb2"));
511
+ ASSERT_OK(Put(1, "c", "vc2"));
512
+ ASSERT_OK(Delete(1, "b"));
513
+ iter->SeekToFirst();
514
+ ASSERT_EQ(IterStatus(iter), "a->va");
515
+ iter->Next();
516
+ ASSERT_EQ(IterStatus(iter), "b->vb");
517
+ iter->Next();
518
+ ASSERT_EQ(IterStatus(iter), "c->vc");
519
+ iter->Next();
520
+ ASSERT_EQ(IterStatus(iter), "(invalid)");
521
+ iter->SeekToLast();
522
+ ASSERT_EQ(IterStatus(iter), "c->vc");
523
+ iter->Prev();
524
+ ASSERT_EQ(IterStatus(iter), "b->vb");
525
+ iter->Prev();
526
+ ASSERT_EQ(IterStatus(iter), "a->va");
527
+ iter->Prev();
528
+ ASSERT_EQ(IterStatus(iter), "(invalid)");
529
+
530
+ delete iter;
531
+ } while (ChangeCompactOptions());
532
+ }
533
+
534
+ // Check that we can skip over a run of user keys
535
+ // by using reseek rather than sequential scan
536
+ TEST_P(DBIteratorTest, IterReseek) {
537
+ anon::OptionsOverride options_override;
538
+ options_override.skip_policy = kSkipNoSnapshot;
539
+ Options options = CurrentOptions(options_override);
540
+ options.max_sequential_skip_in_iterations = 3;
541
+ options.create_if_missing = true;
542
+ options.statistics = ROCKSDB_NAMESPACE::CreateDBStatistics();
543
+ DestroyAndReopen(options);
544
+ CreateAndReopenWithCF({"pikachu"}, options);
545
+
546
+ // insert three keys with same userkey and verify that
547
+ // reseek is not invoked. For each of these test cases,
548
+ // verify that we can find the next key "b".
549
+ ASSERT_OK(Put(1, "a", "zero"));
550
+ ASSERT_OK(Put(1, "a", "one"));
551
+ ASSERT_OK(Put(1, "a", "two"));
552
+ ASSERT_OK(Put(1, "b", "bone"));
553
+ Iterator* iter = NewIterator(ReadOptions(), handles_[1]);
554
+ iter->SeekToFirst();
555
+ ASSERT_EQ(TestGetTickerCount(options, NUMBER_OF_RESEEKS_IN_ITERATION), 0);
556
+ ASSERT_EQ(IterStatus(iter), "a->two");
557
+ iter->Next();
558
+ ASSERT_EQ(TestGetTickerCount(options, NUMBER_OF_RESEEKS_IN_ITERATION), 0);
559
+ ASSERT_EQ(IterStatus(iter), "b->bone");
560
+ delete iter;
561
+
562
+ // insert a total of three keys with same userkey and verify
563
+ // that reseek is still not invoked.
564
+ ASSERT_OK(Put(1, "a", "three"));
565
+ iter = NewIterator(ReadOptions(), handles_[1]);
566
+ iter->SeekToFirst();
567
+ ASSERT_EQ(IterStatus(iter), "a->three");
568
+ iter->Next();
569
+ ASSERT_EQ(TestGetTickerCount(options, NUMBER_OF_RESEEKS_IN_ITERATION), 0);
570
+ ASSERT_EQ(IterStatus(iter), "b->bone");
571
+ delete iter;
572
+
573
+ // insert a total of four keys with same userkey and verify
574
+ // that reseek is invoked.
575
+ ASSERT_OK(Put(1, "a", "four"));
576
+ iter = NewIterator(ReadOptions(), handles_[1]);
577
+ iter->SeekToFirst();
578
+ ASSERT_EQ(IterStatus(iter), "a->four");
579
+ ASSERT_EQ(TestGetTickerCount(options, NUMBER_OF_RESEEKS_IN_ITERATION), 0);
580
+ iter->Next();
581
+ ASSERT_EQ(TestGetTickerCount(options, NUMBER_OF_RESEEKS_IN_ITERATION), 1);
582
+ ASSERT_EQ(IterStatus(iter), "b->bone");
583
+ delete iter;
584
+
585
+ // Testing reverse iterator
586
+ // At this point, we have three versions of "a" and one version of "b".
587
+ // The reseek statistics is already at 1.
588
+ int num_reseeks = static_cast<int>(
589
+ TestGetTickerCount(options, NUMBER_OF_RESEEKS_IN_ITERATION));
590
+
591
+ // Insert another version of b and assert that reseek is not invoked
592
+ ASSERT_OK(Put(1, "b", "btwo"));
593
+ iter = NewIterator(ReadOptions(), handles_[1]);
594
+ iter->SeekToLast();
595
+ ASSERT_EQ(IterStatus(iter), "b->btwo");
596
+ ASSERT_EQ(TestGetTickerCount(options, NUMBER_OF_RESEEKS_IN_ITERATION),
597
+ num_reseeks);
598
+ iter->Prev();
599
+ ASSERT_EQ(TestGetTickerCount(options, NUMBER_OF_RESEEKS_IN_ITERATION),
600
+ num_reseeks + 1);
601
+ ASSERT_EQ(IterStatus(iter), "a->four");
602
+ delete iter;
603
+
604
+ // insert two more versions of b. This makes a total of 4 versions
605
+ // of b and 4 versions of a.
606
+ ASSERT_OK(Put(1, "b", "bthree"));
607
+ ASSERT_OK(Put(1, "b", "bfour"));
608
+ iter = NewIterator(ReadOptions(), handles_[1]);
609
+ iter->SeekToLast();
610
+ ASSERT_EQ(IterStatus(iter), "b->bfour");
611
+ ASSERT_EQ(TestGetTickerCount(options, NUMBER_OF_RESEEKS_IN_ITERATION),
612
+ num_reseeks + 2);
613
+ iter->Prev();
614
+
615
+ // the previous Prev call should have invoked reseek
616
+ ASSERT_EQ(TestGetTickerCount(options, NUMBER_OF_RESEEKS_IN_ITERATION),
617
+ num_reseeks + 3);
618
+ ASSERT_EQ(IterStatus(iter), "a->four");
619
+ delete iter;
620
+ }
621
+
622
+ TEST_P(DBIteratorTest, IterSmallAndLargeMix) {
623
+ do {
624
+ CreateAndReopenWithCF({"pikachu"}, CurrentOptions());
625
+ ASSERT_OK(Put(1, "a", "va"));
626
+ ASSERT_OK(Put(1, "b", std::string(100000, 'b')));
627
+ ASSERT_OK(Put(1, "c", "vc"));
628
+ ASSERT_OK(Put(1, "d", std::string(100000, 'd')));
629
+ ASSERT_OK(Put(1, "e", std::string(100000, 'e')));
630
+
631
+ Iterator* iter = NewIterator(ReadOptions(), handles_[1]);
632
+
633
+ iter->SeekToFirst();
634
+ ASSERT_EQ(IterStatus(iter), "a->va");
635
+ iter->Next();
636
+ ASSERT_EQ(IterStatus(iter), "b->" + std::string(100000, 'b'));
637
+ iter->Next();
638
+ ASSERT_EQ(IterStatus(iter), "c->vc");
639
+ iter->Next();
640
+ ASSERT_EQ(IterStatus(iter), "d->" + std::string(100000, 'd'));
641
+ iter->Next();
642
+ ASSERT_EQ(IterStatus(iter), "e->" + std::string(100000, 'e'));
643
+ iter->Next();
644
+ ASSERT_EQ(IterStatus(iter), "(invalid)");
645
+
646
+ iter->SeekToLast();
647
+ ASSERT_EQ(IterStatus(iter), "e->" + std::string(100000, 'e'));
648
+ iter->Prev();
649
+ ASSERT_EQ(IterStatus(iter), "d->" + std::string(100000, 'd'));
650
+ iter->Prev();
651
+ ASSERT_EQ(IterStatus(iter), "c->vc");
652
+ iter->Prev();
653
+ ASSERT_EQ(IterStatus(iter), "b->" + std::string(100000, 'b'));
654
+ iter->Prev();
655
+ ASSERT_EQ(IterStatus(iter), "a->va");
656
+ iter->Prev();
657
+ ASSERT_EQ(IterStatus(iter), "(invalid)");
658
+
659
+ delete iter;
660
+ } while (ChangeCompactOptions());
661
+ }
662
+
663
+ TEST_P(DBIteratorTest, IterMultiWithDelete) {
664
+ do {
665
+ CreateAndReopenWithCF({"pikachu"}, CurrentOptions());
666
+ ASSERT_OK(Put(1, "ka", "va"));
667
+ ASSERT_OK(Put(1, "kb", "vb"));
668
+ ASSERT_OK(Put(1, "kc", "vc"));
669
+ ASSERT_OK(Delete(1, "kb"));
670
+ ASSERT_EQ("NOT_FOUND", Get(1, "kb"));
671
+
672
+ Iterator* iter = NewIterator(ReadOptions(), handles_[1]);
673
+ iter->Seek("kc");
674
+ ASSERT_EQ(IterStatus(iter), "kc->vc");
675
+ if (!CurrentOptions().merge_operator) {
676
+ // TODO: merge operator does not support backward iteration yet
677
+ if (kPlainTableAllBytesPrefix != option_config_ &&
678
+ kBlockBasedTableWithWholeKeyHashIndex != option_config_ &&
679
+ kHashLinkList != option_config_ &&
680
+ kHashSkipList != option_config_) { // doesn't support SeekToLast
681
+ iter->Prev();
682
+ ASSERT_EQ(IterStatus(iter), "ka->va");
683
+ }
684
+ }
685
+ delete iter;
686
+ } while (ChangeOptions());
687
+ }
688
+
689
+ TEST_P(DBIteratorTest, IterPrevMaxSkip) {
690
+ do {
691
+ CreateAndReopenWithCF({"pikachu"}, CurrentOptions());
692
+ for (int i = 0; i < 2; i++) {
693
+ ASSERT_OK(Put(1, "key1", "v1"));
694
+ ASSERT_OK(Put(1, "key2", "v2"));
695
+ ASSERT_OK(Put(1, "key3", "v3"));
696
+ ASSERT_OK(Put(1, "key4", "v4"));
697
+ ASSERT_OK(Put(1, "key5", "v5"));
698
+ }
699
+
700
+ VerifyIterLast("key5->v5", 1);
701
+
702
+ ASSERT_OK(Delete(1, "key5"));
703
+ VerifyIterLast("key4->v4", 1);
704
+
705
+ ASSERT_OK(Delete(1, "key4"));
706
+ VerifyIterLast("key3->v3", 1);
707
+
708
+ ASSERT_OK(Delete(1, "key3"));
709
+ VerifyIterLast("key2->v2", 1);
710
+
711
+ ASSERT_OK(Delete(1, "key2"));
712
+ VerifyIterLast("key1->v1", 1);
713
+
714
+ ASSERT_OK(Delete(1, "key1"));
715
+ VerifyIterLast("(invalid)", 1);
716
+ } while (ChangeOptions(kSkipMergePut | kSkipNoSeekToLast));
717
+ }
718
+
719
+ TEST_P(DBIteratorTest, IterWithSnapshot) {
720
+ anon::OptionsOverride options_override;
721
+ options_override.skip_policy = kSkipNoSnapshot;
722
+ do {
723
+ CreateAndReopenWithCF({"pikachu"}, CurrentOptions(options_override));
724
+ ASSERT_OK(Put(1, "key1", "val1"));
725
+ ASSERT_OK(Put(1, "key2", "val2"));
726
+ ASSERT_OK(Put(1, "key3", "val3"));
727
+ ASSERT_OK(Put(1, "key4", "val4"));
728
+ ASSERT_OK(Put(1, "key5", "val5"));
729
+
730
+ const Snapshot* snapshot = db_->GetSnapshot();
731
+ ReadOptions options;
732
+ options.snapshot = snapshot;
733
+ Iterator* iter = NewIterator(options, handles_[1]);
734
+
735
+ ASSERT_OK(Put(1, "key0", "val0"));
736
+ // Put more values after the snapshot
737
+ ASSERT_OK(Put(1, "key100", "val100"));
738
+ ASSERT_OK(Put(1, "key101", "val101"));
739
+
740
+ iter->Seek("key5");
741
+ ASSERT_EQ(IterStatus(iter), "key5->val5");
742
+ if (!CurrentOptions().merge_operator) {
743
+ // TODO: merge operator does not support backward iteration yet
744
+ if (kPlainTableAllBytesPrefix != option_config_ &&
745
+ kBlockBasedTableWithWholeKeyHashIndex != option_config_ &&
746
+ kHashLinkList != option_config_ && kHashSkipList != option_config_) {
747
+ iter->Prev();
748
+ ASSERT_EQ(IterStatus(iter), "key4->val4");
749
+ iter->Prev();
750
+ ASSERT_EQ(IterStatus(iter), "key3->val3");
751
+
752
+ iter->Next();
753
+ ASSERT_EQ(IterStatus(iter), "key4->val4");
754
+ iter->Next();
755
+ ASSERT_EQ(IterStatus(iter), "key5->val5");
756
+ }
757
+ iter->Next();
758
+ ASSERT_TRUE(!iter->Valid());
759
+ }
760
+
761
+ if (!CurrentOptions().merge_operator) {
762
+ // TODO(gzh): merge operator does not support backward iteration yet
763
+ if (kPlainTableAllBytesPrefix != option_config_ &&
764
+ kBlockBasedTableWithWholeKeyHashIndex != option_config_ &&
765
+ kHashLinkList != option_config_ && kHashSkipList != option_config_) {
766
+ iter->SeekForPrev("key1");
767
+ ASSERT_EQ(IterStatus(iter), "key1->val1");
768
+ iter->Next();
769
+ ASSERT_EQ(IterStatus(iter), "key2->val2");
770
+ iter->Next();
771
+ ASSERT_EQ(IterStatus(iter), "key3->val3");
772
+ iter->Prev();
773
+ ASSERT_EQ(IterStatus(iter), "key2->val2");
774
+ iter->Prev();
775
+ ASSERT_EQ(IterStatus(iter), "key1->val1");
776
+ iter->Prev();
777
+ ASSERT_TRUE(!iter->Valid());
778
+ }
779
+ }
780
+ db_->ReleaseSnapshot(snapshot);
781
+ delete iter;
782
+ } while (ChangeOptions());
783
+ }
784
+
785
+ TEST_P(DBIteratorTest, IteratorPinsRef) {
786
+ do {
787
+ CreateAndReopenWithCF({"pikachu"}, CurrentOptions());
788
+ ASSERT_OK(Put(1, "foo", "hello"));
789
+
790
+ // Get iterator that will yield the current contents of the DB.
791
+ Iterator* iter = NewIterator(ReadOptions(), handles_[1]);
792
+
793
+ // Write to force compactions
794
+ ASSERT_OK(Put(1, "foo", "newvalue1"));
795
+ for (int i = 0; i < 100; i++) {
796
+ // 100K values
797
+ ASSERT_OK(Put(1, Key(i), Key(i) + std::string(100000, 'v')));
798
+ }
799
+ ASSERT_OK(Put(1, "foo", "newvalue2"));
800
+
801
+ iter->SeekToFirst();
802
+ ASSERT_TRUE(iter->Valid());
803
+ ASSERT_EQ("foo", iter->key().ToString());
804
+ ASSERT_EQ("hello", iter->value().ToString());
805
+ iter->Next();
806
+ ASSERT_TRUE(!iter->Valid());
807
+ delete iter;
808
+ } while (ChangeCompactOptions());
809
+ }
810
+
811
+ TEST_P(DBIteratorTest, IteratorDeleteAfterCfDelete) {
812
+ CreateAndReopenWithCF({"pikachu"}, CurrentOptions());
813
+
814
+ ASSERT_OK(Put(1, "foo", "delete-cf-then-delete-iter"));
815
+ ASSERT_OK(Put(1, "hello", "value2"));
816
+
817
+ ColumnFamilyHandle* cf = handles_[1];
818
+ ReadOptions ro;
819
+
820
+ auto* iter = db_->NewIterator(ro, cf);
821
+ iter->SeekToFirst();
822
+ ASSERT_EQ(IterStatus(iter), "foo->delete-cf-then-delete-iter");
823
+
824
+ // delete CF handle
825
+ EXPECT_OK(db_->DestroyColumnFamilyHandle(cf));
826
+ handles_.erase(std::begin(handles_) + 1);
827
+
828
+ // delete Iterator after CF handle is deleted
829
+ iter->Next();
830
+ ASSERT_EQ(IterStatus(iter), "hello->value2");
831
+ delete iter;
832
+ }
833
+
834
+ TEST_P(DBIteratorTest, IteratorDeleteAfterCfDrop) {
835
+ CreateAndReopenWithCF({"pikachu"}, CurrentOptions());
836
+
837
+ ASSERT_OK(Put(1, "foo", "drop-cf-then-delete-iter"));
838
+
839
+ ReadOptions ro;
840
+ ColumnFamilyHandle* cf = handles_[1];
841
+
842
+ auto* iter = db_->NewIterator(ro, cf);
843
+ iter->SeekToFirst();
844
+ ASSERT_EQ(IterStatus(iter), "foo->drop-cf-then-delete-iter");
845
+
846
+ // drop and delete CF
847
+ EXPECT_OK(db_->DropColumnFamily(cf));
848
+ EXPECT_OK(db_->DestroyColumnFamilyHandle(cf));
849
+ handles_.erase(std::begin(handles_) + 1);
850
+
851
+ // delete Iterator after CF handle is dropped
852
+ delete iter;
853
+ }
854
+
855
+ // SetOptions not defined in ROCKSDB LITE
856
+ #ifndef ROCKSDB_LITE
857
+ TEST_P(DBIteratorTest, DBIteratorBoundTest) {
858
+ Options options = CurrentOptions();
859
+ options.env = env_;
860
+ options.create_if_missing = true;
861
+
862
+ options.prefix_extractor = nullptr;
863
+ DestroyAndReopen(options);
864
+ ASSERT_OK(Put("a", "0"));
865
+ ASSERT_OK(Put("foo", "bar"));
866
+ ASSERT_OK(Put("foo1", "bar1"));
867
+ ASSERT_OK(Put("g1", "0"));
868
+
869
+ // testing basic case with no iterate_upper_bound and no prefix_extractor
870
+ {
871
+ ReadOptions ro;
872
+ ro.iterate_upper_bound = nullptr;
873
+
874
+ std::unique_ptr<Iterator> iter(NewIterator(ro));
875
+
876
+ iter->Seek("foo");
877
+
878
+ ASSERT_TRUE(iter->Valid());
879
+ ASSERT_EQ(iter->key().compare(Slice("foo")), 0);
880
+
881
+ iter->Next();
882
+ ASSERT_TRUE(iter->Valid());
883
+ ASSERT_EQ(iter->key().compare(Slice("foo1")), 0);
884
+
885
+ iter->Next();
886
+ ASSERT_TRUE(iter->Valid());
887
+ ASSERT_EQ(iter->key().compare(Slice("g1")), 0);
888
+
889
+ iter->SeekForPrev("g1");
890
+
891
+ ASSERT_TRUE(iter->Valid());
892
+ ASSERT_EQ(iter->key().compare(Slice("g1")), 0);
893
+
894
+ iter->Prev();
895
+ ASSERT_TRUE(iter->Valid());
896
+ ASSERT_EQ(iter->key().compare(Slice("foo1")), 0);
897
+
898
+ iter->Prev();
899
+ ASSERT_TRUE(iter->Valid());
900
+ ASSERT_EQ(iter->key().compare(Slice("foo")), 0);
901
+ }
902
+
903
+ // testing iterate_upper_bound and forward iterator
904
+ // to make sure it stops at bound
905
+ {
906
+ ReadOptions ro;
907
+ // iterate_upper_bound points beyond the last expected entry
908
+ Slice prefix("foo2");
909
+ ro.iterate_upper_bound = &prefix;
910
+
911
+ std::unique_ptr<Iterator> iter(NewIterator(ro));
912
+
913
+ iter->Seek("foo");
914
+
915
+ ASSERT_TRUE(iter->Valid());
916
+ ASSERT_EQ(iter->key().compare(Slice("foo")), 0);
917
+
918
+ iter->Next();
919
+ ASSERT_TRUE(iter->Valid());
920
+ ASSERT_EQ(iter->key().compare(("foo1")), 0);
921
+
922
+ iter->Next();
923
+ // should stop here...
924
+ ASSERT_TRUE(!iter->Valid());
925
+ }
926
+ // Testing SeekToLast with iterate_upper_bound set
927
+ {
928
+ ReadOptions ro;
929
+
930
+ Slice prefix("foo");
931
+ ro.iterate_upper_bound = &prefix;
932
+
933
+ std::unique_ptr<Iterator> iter(NewIterator(ro));
934
+
935
+ iter->SeekToLast();
936
+ ASSERT_TRUE(iter->Valid());
937
+ ASSERT_EQ(iter->key().compare(Slice("a")), 0);
938
+ }
939
+
940
+ // prefix is the first letter of the key
941
+ ASSERT_OK(dbfull()->SetOptions({{"prefix_extractor", "fixed:1"}}));
942
+ ASSERT_OK(Put("a", "0"));
943
+ ASSERT_OK(Put("foo", "bar"));
944
+ ASSERT_OK(Put("foo1", "bar1"));
945
+ ASSERT_OK(Put("g1", "0"));
946
+
947
+ // testing with iterate_upper_bound and prefix_extractor
948
+ // Seek target and iterate_upper_bound are not is same prefix
949
+ // This should be an error
950
+ {
951
+ ReadOptions ro;
952
+ Slice upper_bound("g");
953
+ ro.iterate_upper_bound = &upper_bound;
954
+
955
+ std::unique_ptr<Iterator> iter(NewIterator(ro));
956
+
957
+ iter->Seek("foo");
958
+
959
+ ASSERT_TRUE(iter->Valid());
960
+ ASSERT_EQ("foo", iter->key().ToString());
961
+
962
+ iter->Next();
963
+ ASSERT_TRUE(iter->Valid());
964
+ ASSERT_EQ("foo1", iter->key().ToString());
965
+
966
+ iter->Next();
967
+ ASSERT_TRUE(!iter->Valid());
968
+ }
969
+
970
+ // testing that iterate_upper_bound prevents iterating over deleted items
971
+ // if the bound has already reached
972
+ {
973
+ options.prefix_extractor = nullptr;
974
+ DestroyAndReopen(options);
975
+ ASSERT_OK(Put("a", "0"));
976
+ ASSERT_OK(Put("b", "0"));
977
+ ASSERT_OK(Put("b1", "0"));
978
+ ASSERT_OK(Put("c", "0"));
979
+ ASSERT_OK(Put("d", "0"));
980
+ ASSERT_OK(Put("e", "0"));
981
+ ASSERT_OK(Delete("c"));
982
+ ASSERT_OK(Delete("d"));
983
+
984
+ // base case with no bound
985
+ ReadOptions ro;
986
+ ro.iterate_upper_bound = nullptr;
987
+
988
+ std::unique_ptr<Iterator> iter(NewIterator(ro));
989
+
990
+ iter->Seek("b");
991
+ ASSERT_TRUE(iter->Valid());
992
+ ASSERT_EQ(iter->key().compare(Slice("b")), 0);
993
+
994
+ iter->Next();
995
+ ASSERT_TRUE(iter->Valid());
996
+ ASSERT_EQ(iter->key().compare(("b1")), 0);
997
+
998
+ get_perf_context()->Reset();
999
+ iter->Next();
1000
+
1001
+ ASSERT_TRUE(iter->Valid());
1002
+ ASSERT_EQ(static_cast<int>(get_perf_context()->internal_delete_skipped_count), 2);
1003
+
1004
+ // now testing with iterate_bound
1005
+ Slice prefix("c");
1006
+ ro.iterate_upper_bound = &prefix;
1007
+
1008
+ iter.reset(NewIterator(ro));
1009
+
1010
+ get_perf_context()->Reset();
1011
+
1012
+ iter->Seek("b");
1013
+ ASSERT_TRUE(iter->Valid());
1014
+ ASSERT_EQ(iter->key().compare(Slice("b")), 0);
1015
+
1016
+ iter->Next();
1017
+ ASSERT_TRUE(iter->Valid());
1018
+ ASSERT_EQ(iter->key().compare(("b1")), 0);
1019
+
1020
+ iter->Next();
1021
+ // the iteration should stop as soon as the bound key is reached
1022
+ // even though the key is deleted
1023
+ // hence internal_delete_skipped_count should be 0
1024
+ ASSERT_TRUE(!iter->Valid());
1025
+ ASSERT_EQ(static_cast<int>(get_perf_context()->internal_delete_skipped_count), 0);
1026
+ }
1027
+ }
1028
+
1029
+ TEST_P(DBIteratorTest, DBIteratorBoundMultiSeek) {
1030
+ Options options = CurrentOptions();
1031
+ options.env = env_;
1032
+ options.create_if_missing = true;
1033
+ options.statistics = ROCKSDB_NAMESPACE::CreateDBStatistics();
1034
+ options.prefix_extractor = nullptr;
1035
+ DestroyAndReopen(options);
1036
+ ASSERT_OK(Put("a", "0"));
1037
+ ASSERT_OK(Put("z", "0"));
1038
+ ASSERT_OK(Flush());
1039
+ ASSERT_OK(Put("foo1", "bar1"));
1040
+ ASSERT_OK(Put("foo2", "bar2"));
1041
+ ASSERT_OK(Put("foo3", "bar3"));
1042
+ ASSERT_OK(Put("foo4", "bar4"));
1043
+
1044
+ {
1045
+ std::string up_str = "foo5";
1046
+ Slice up(up_str);
1047
+ ReadOptions ro;
1048
+ ro.iterate_upper_bound = &up;
1049
+ std::unique_ptr<Iterator> iter(NewIterator(ro));
1050
+
1051
+ iter->Seek("foo1");
1052
+ ASSERT_TRUE(iter->Valid());
1053
+ ASSERT_EQ(iter->key().compare(Slice("foo1")), 0);
1054
+
1055
+ uint64_t prev_block_cache_hit =
1056
+ TestGetTickerCount(options, BLOCK_CACHE_HIT);
1057
+ uint64_t prev_block_cache_miss =
1058
+ TestGetTickerCount(options, BLOCK_CACHE_MISS);
1059
+
1060
+ ASSERT_GT(prev_block_cache_hit + prev_block_cache_miss, 0);
1061
+
1062
+ iter->Seek("foo4");
1063
+ ASSERT_TRUE(iter->Valid());
1064
+ ASSERT_EQ(iter->key().compare(Slice("foo4")), 0);
1065
+ ASSERT_EQ(prev_block_cache_hit,
1066
+ TestGetTickerCount(options, BLOCK_CACHE_HIT));
1067
+ ASSERT_EQ(prev_block_cache_miss,
1068
+ TestGetTickerCount(options, BLOCK_CACHE_MISS));
1069
+
1070
+ iter->Seek("foo2");
1071
+ ASSERT_TRUE(iter->Valid());
1072
+ ASSERT_EQ(iter->key().compare(Slice("foo2")), 0);
1073
+ iter->Next();
1074
+ ASSERT_TRUE(iter->Valid());
1075
+ ASSERT_EQ(iter->key().compare(Slice("foo3")), 0);
1076
+ ASSERT_EQ(prev_block_cache_hit,
1077
+ TestGetTickerCount(options, BLOCK_CACHE_HIT));
1078
+ ASSERT_EQ(prev_block_cache_miss,
1079
+ TestGetTickerCount(options, BLOCK_CACHE_MISS));
1080
+ }
1081
+ }
1082
+ #endif
1083
+
1084
+ TEST_P(DBIteratorTest, DBIteratorBoundOptimizationTest) {
1085
+ for (auto format_version : {2, 3, 4}) {
1086
+ int upper_bound_hits = 0;
1087
+ Options options = CurrentOptions();
1088
+ ROCKSDB_NAMESPACE::SyncPoint::GetInstance()->SetCallBack(
1089
+ "BlockBasedTableIterator:out_of_bound",
1090
+ [&upper_bound_hits](void*) { upper_bound_hits++; });
1091
+ ROCKSDB_NAMESPACE::SyncPoint::GetInstance()->EnableProcessing();
1092
+ options.env = env_;
1093
+ options.create_if_missing = true;
1094
+ options.prefix_extractor = nullptr;
1095
+ BlockBasedTableOptions table_options;
1096
+ table_options.format_version = format_version;
1097
+ table_options.flush_block_policy_factory =
1098
+ std::make_shared<FlushBlockEveryKeyPolicyFactory>();
1099
+ options.table_factory.reset(NewBlockBasedTableFactory(table_options));
1100
+
1101
+ DestroyAndReopen(options);
1102
+ ASSERT_OK(Put("foo1", "bar1"));
1103
+ ASSERT_OK(Put("foo2", "bar2"));
1104
+ ASSERT_OK(Put("foo4", "bar4"));
1105
+ ASSERT_OK(Flush());
1106
+
1107
+ Slice ub("foo3");
1108
+ ReadOptions ro;
1109
+ ro.iterate_upper_bound = &ub;
1110
+
1111
+ std::unique_ptr<Iterator> iter(NewIterator(ro));
1112
+
1113
+ iter->Seek("foo");
1114
+ ASSERT_TRUE(iter->Valid());
1115
+ ASSERT_EQ(iter->key().compare(Slice("foo1")), 0);
1116
+ ASSERT_EQ(upper_bound_hits, 0);
1117
+
1118
+ iter->Next();
1119
+ ASSERT_TRUE(iter->Valid());
1120
+ ASSERT_EQ(iter->key().compare(Slice("foo2")), 0);
1121
+ ASSERT_EQ(upper_bound_hits, 0);
1122
+
1123
+ iter->Next();
1124
+ ASSERT_FALSE(iter->Valid());
1125
+ ASSERT_EQ(upper_bound_hits, 1);
1126
+ }
1127
+ }
1128
+
1129
+ // Enable kBinarySearchWithFirstKey, do some iterator operations and check that
1130
+ // they don't do unnecessary block reads.
1131
+ TEST_P(DBIteratorTest, IndexWithFirstKey) {
1132
+ for (int tailing = 0; tailing < 2; ++tailing) {
1133
+ SCOPED_TRACE("tailing = " + std::to_string(tailing));
1134
+ Options options = CurrentOptions();
1135
+ options.env = env_;
1136
+ options.create_if_missing = true;
1137
+ options.prefix_extractor = nullptr;
1138
+ options.merge_operator = MergeOperators::CreateStringAppendOperator();
1139
+ options.statistics = ROCKSDB_NAMESPACE::CreateDBStatistics();
1140
+ Statistics* stats = options.statistics.get();
1141
+ BlockBasedTableOptions table_options;
1142
+ table_options.index_type =
1143
+ BlockBasedTableOptions::IndexType::kBinarySearchWithFirstKey;
1144
+ table_options.index_shortening =
1145
+ BlockBasedTableOptions::IndexShorteningMode::kNoShortening;
1146
+ table_options.flush_block_policy_factory =
1147
+ std::make_shared<FlushBlockEveryKeyPolicyFactory>();
1148
+ table_options.block_cache =
1149
+ NewLRUCache(8000); // fits all blocks and their cache metadata overhead
1150
+ options.table_factory.reset(NewBlockBasedTableFactory(table_options));
1151
+
1152
+ DestroyAndReopen(options);
1153
+ ASSERT_OK(Merge("a1", "x1"));
1154
+ ASSERT_OK(Merge("b1", "y1"));
1155
+ ASSERT_OK(Merge("c0", "z1"));
1156
+ ASSERT_OK(Flush());
1157
+ ASSERT_OK(Merge("a2", "x2"));
1158
+ ASSERT_OK(Merge("b2", "y2"));
1159
+ ASSERT_OK(Merge("c0", "z2"));
1160
+ ASSERT_OK(Flush());
1161
+ ASSERT_OK(Merge("a3", "x3"));
1162
+ ASSERT_OK(Merge("b3", "y3"));
1163
+ ASSERT_OK(Merge("c3", "z3"));
1164
+ ASSERT_OK(Flush());
1165
+
1166
+ // Block cache is not important for this test.
1167
+ // We use BLOCK_CACHE_DATA_* counters just because they're the most readily
1168
+ // available way of counting block accesses.
1169
+
1170
+ ReadOptions ropt;
1171
+ ropt.tailing = tailing;
1172
+ std::unique_ptr<Iterator> iter(NewIterator(ropt));
1173
+
1174
+ ropt.read_tier = ReadTier::kBlockCacheTier;
1175
+ std::unique_ptr<Iterator> nonblocking_iter(NewIterator(ropt));
1176
+
1177
+ iter->Seek("b10");
1178
+ ASSERT_TRUE(iter->Valid());
1179
+ EXPECT_EQ("b2", iter->key().ToString());
1180
+ EXPECT_EQ("y2", iter->value().ToString());
1181
+ EXPECT_EQ(1, stats->getTickerCount(BLOCK_CACHE_DATA_MISS));
1182
+
1183
+ // The cache-only iterator should succeed too, using the blocks pulled into
1184
+ // the cache by the previous iterator.
1185
+ nonblocking_iter->Seek("b10");
1186
+ ASSERT_TRUE(nonblocking_iter->Valid());
1187
+ EXPECT_EQ("b2", nonblocking_iter->key().ToString());
1188
+ EXPECT_EQ("y2", nonblocking_iter->value().ToString());
1189
+ EXPECT_EQ(1, stats->getTickerCount(BLOCK_CACHE_DATA_HIT));
1190
+
1191
+ // ... but it shouldn't be able to step forward since the next block is
1192
+ // not in cache yet.
1193
+ nonblocking_iter->Next();
1194
+ ASSERT_FALSE(nonblocking_iter->Valid());
1195
+ ASSERT_TRUE(nonblocking_iter->status().IsIncomplete());
1196
+
1197
+ // ... nor should a seek to the next key succeed.
1198
+ nonblocking_iter->Seek("b20");
1199
+ ASSERT_FALSE(nonblocking_iter->Valid());
1200
+ ASSERT_TRUE(nonblocking_iter->status().IsIncomplete());
1201
+
1202
+ iter->Next();
1203
+ ASSERT_TRUE(iter->Valid());
1204
+ EXPECT_EQ("b3", iter->key().ToString());
1205
+ EXPECT_EQ("y3", iter->value().ToString());
1206
+ EXPECT_EQ(4, stats->getTickerCount(BLOCK_CACHE_DATA_MISS));
1207
+ EXPECT_EQ(1, stats->getTickerCount(BLOCK_CACHE_DATA_HIT));
1208
+
1209
+ // After the blocking iterator loaded the next block, the nonblocking
1210
+ // iterator's seek should succeed.
1211
+ nonblocking_iter->Seek("b20");
1212
+ ASSERT_TRUE(nonblocking_iter->Valid());
1213
+ EXPECT_EQ("b3", nonblocking_iter->key().ToString());
1214
+ EXPECT_EQ("y3", nonblocking_iter->value().ToString());
1215
+ EXPECT_EQ(2, stats->getTickerCount(BLOCK_CACHE_DATA_HIT));
1216
+
1217
+ iter->Seek("c0");
1218
+ ASSERT_TRUE(iter->Valid());
1219
+ EXPECT_EQ("c0", iter->key().ToString());
1220
+ EXPECT_EQ("z1,z2", iter->value().ToString());
1221
+ EXPECT_EQ(2, stats->getTickerCount(BLOCK_CACHE_DATA_HIT));
1222
+ EXPECT_EQ(6, stats->getTickerCount(BLOCK_CACHE_DATA_MISS));
1223
+
1224
+ iter->Next();
1225
+ ASSERT_TRUE(iter->Valid());
1226
+ EXPECT_EQ("c3", iter->key().ToString());
1227
+ EXPECT_EQ("z3", iter->value().ToString());
1228
+ EXPECT_EQ(2, stats->getTickerCount(BLOCK_CACHE_DATA_HIT));
1229
+ EXPECT_EQ(7, stats->getTickerCount(BLOCK_CACHE_DATA_MISS));
1230
+
1231
+ iter.reset();
1232
+
1233
+ // Enable iterate_upper_bound and check that iterator is not trying to read
1234
+ // blocks that are fully above upper bound.
1235
+ std::string ub = "b3";
1236
+ Slice ub_slice(ub);
1237
+ ropt.iterate_upper_bound = &ub_slice;
1238
+ iter.reset(NewIterator(ropt));
1239
+
1240
+ iter->Seek("b2");
1241
+ ASSERT_TRUE(iter->Valid());
1242
+ EXPECT_EQ("b2", iter->key().ToString());
1243
+ EXPECT_EQ("y2", iter->value().ToString());
1244
+ EXPECT_EQ(3, stats->getTickerCount(BLOCK_CACHE_DATA_HIT));
1245
+ EXPECT_EQ(7, stats->getTickerCount(BLOCK_CACHE_DATA_MISS));
1246
+
1247
+ iter->Next();
1248
+ ASSERT_FALSE(iter->Valid());
1249
+ EXPECT_EQ(3, stats->getTickerCount(BLOCK_CACHE_DATA_HIT));
1250
+ EXPECT_EQ(7, stats->getTickerCount(BLOCK_CACHE_DATA_MISS));
1251
+ }
1252
+ }
1253
+
1254
+ TEST_P(DBIteratorTest, IndexWithFirstKeyGet) {
1255
+ Options options = CurrentOptions();
1256
+ options.env = env_;
1257
+ options.create_if_missing = true;
1258
+ options.prefix_extractor = nullptr;
1259
+ options.merge_operator = MergeOperators::CreateStringAppendOperator();
1260
+ options.statistics = ROCKSDB_NAMESPACE::CreateDBStatistics();
1261
+ Statistics* stats = options.statistics.get();
1262
+ BlockBasedTableOptions table_options;
1263
+ table_options.index_type =
1264
+ BlockBasedTableOptions::IndexType::kBinarySearchWithFirstKey;
1265
+ table_options.index_shortening =
1266
+ BlockBasedTableOptions::IndexShorteningMode::kNoShortening;
1267
+ table_options.flush_block_policy_factory =
1268
+ std::make_shared<FlushBlockEveryKeyPolicyFactory>();
1269
+ table_options.block_cache = NewLRUCache(1000); // fits all blocks
1270
+ options.table_factory.reset(NewBlockBasedTableFactory(table_options));
1271
+
1272
+ DestroyAndReopen(options);
1273
+ ASSERT_OK(Merge("a", "x1"));
1274
+ ASSERT_OK(Merge("c", "y1"));
1275
+ ASSERT_OK(Merge("e", "z1"));
1276
+ ASSERT_OK(Flush());
1277
+ ASSERT_OK(Merge("c", "y2"));
1278
+ ASSERT_OK(Merge("e", "z2"));
1279
+ ASSERT_OK(Flush());
1280
+
1281
+ // Get() between blocks shouldn't read any blocks.
1282
+ ASSERT_EQ("NOT_FOUND", Get("b"));
1283
+ EXPECT_EQ(0, stats->getTickerCount(BLOCK_CACHE_DATA_MISS));
1284
+ EXPECT_EQ(0, stats->getTickerCount(BLOCK_CACHE_DATA_HIT));
1285
+
1286
+ // Get() of an existing key shouldn't read any unnecessary blocks when there's
1287
+ // only one key per block.
1288
+
1289
+ ASSERT_EQ("y1,y2", Get("c"));
1290
+ EXPECT_EQ(2, stats->getTickerCount(BLOCK_CACHE_DATA_MISS));
1291
+ EXPECT_EQ(0, stats->getTickerCount(BLOCK_CACHE_DATA_HIT));
1292
+
1293
+ ASSERT_EQ("x1", Get("a"));
1294
+ EXPECT_EQ(3, stats->getTickerCount(BLOCK_CACHE_DATA_MISS));
1295
+ EXPECT_EQ(0, stats->getTickerCount(BLOCK_CACHE_DATA_HIT));
1296
+
1297
+ EXPECT_EQ(std::vector<std::string>({"NOT_FOUND", "z1,z2"}),
1298
+ MultiGet({"b", "e"}));
1299
+ }
1300
+
1301
+ // TODO(3.13): fix the issue of Seek() + Prev() which might not necessary
1302
+ // return the biggest key which is smaller than the seek key.
1303
+ TEST_P(DBIteratorTest, PrevAfterAndNextAfterMerge) {
1304
+ Options options;
1305
+ options.create_if_missing = true;
1306
+ options.merge_operator = MergeOperators::CreatePutOperator();
1307
+ options.env = env_;
1308
+ DestroyAndReopen(options);
1309
+
1310
+ // write three entries with different keys using Merge()
1311
+ WriteOptions wopts;
1312
+ ASSERT_OK(db_->Merge(wopts, "1", "data1"));
1313
+ ASSERT_OK(db_->Merge(wopts, "2", "data2"));
1314
+ ASSERT_OK(db_->Merge(wopts, "3", "data3"));
1315
+
1316
+ std::unique_ptr<Iterator> it(NewIterator(ReadOptions()));
1317
+
1318
+ it->Seek("2");
1319
+ ASSERT_TRUE(it->Valid());
1320
+ ASSERT_EQ("2", it->key().ToString());
1321
+
1322
+ it->Prev();
1323
+ ASSERT_TRUE(it->Valid());
1324
+ ASSERT_EQ("1", it->key().ToString());
1325
+
1326
+ it->SeekForPrev("1");
1327
+ ASSERT_TRUE(it->Valid());
1328
+ ASSERT_EQ("1", it->key().ToString());
1329
+
1330
+ it->Next();
1331
+ ASSERT_TRUE(it->Valid());
1332
+ ASSERT_EQ("2", it->key().ToString());
1333
+ }
1334
+
1335
+ class DBIteratorTestForPinnedData : public DBIteratorTest {
1336
+ public:
1337
+ enum TestConfig {
1338
+ NORMAL,
1339
+ CLOSE_AND_OPEN,
1340
+ COMPACT_BEFORE_READ,
1341
+ FLUSH_EVERY_1000,
1342
+ MAX
1343
+ };
1344
+ DBIteratorTestForPinnedData() : DBIteratorTest() {}
1345
+ void PinnedDataIteratorRandomized(TestConfig run_config) {
1346
+ // Generate Random data
1347
+ Random rnd(301);
1348
+
1349
+ int puts = 100000;
1350
+ int key_pool = static_cast<int>(puts * 0.7);
1351
+ int key_size = 100;
1352
+ int val_size = 1000;
1353
+ int seeks_percentage = 20; // 20% of keys will be used to test seek()
1354
+ int delete_percentage = 20; // 20% of keys will be deleted
1355
+ int merge_percentage = 20; // 20% of keys will be added using Merge()
1356
+
1357
+ Options options = CurrentOptions();
1358
+ BlockBasedTableOptions table_options;
1359
+ table_options.use_delta_encoding = false;
1360
+ options.table_factory.reset(NewBlockBasedTableFactory(table_options));
1361
+ options.merge_operator = MergeOperators::CreatePutOperator();
1362
+ DestroyAndReopen(options);
1363
+
1364
+ std::vector<std::string> generated_keys(key_pool);
1365
+ for (int i = 0; i < key_pool; i++) {
1366
+ generated_keys[i] = rnd.RandomString(key_size);
1367
+ }
1368
+
1369
+ std::map<std::string, std::string> true_data;
1370
+ std::vector<std::string> random_keys;
1371
+ std::vector<std::string> deleted_keys;
1372
+ for (int i = 0; i < puts; i++) {
1373
+ auto& k = generated_keys[rnd.Next() % key_pool];
1374
+ auto v = rnd.RandomString(val_size);
1375
+
1376
+ // Insert data to true_data map and to DB
1377
+ true_data[k] = v;
1378
+ if (rnd.PercentTrue(merge_percentage)) {
1379
+ ASSERT_OK(db_->Merge(WriteOptions(), k, v));
1380
+ } else {
1381
+ ASSERT_OK(Put(k, v));
1382
+ }
1383
+
1384
+ // Pick random keys to be used to test Seek()
1385
+ if (rnd.PercentTrue(seeks_percentage)) {
1386
+ random_keys.push_back(k);
1387
+ }
1388
+
1389
+ // Delete some random keys
1390
+ if (rnd.PercentTrue(delete_percentage)) {
1391
+ deleted_keys.push_back(k);
1392
+ true_data.erase(k);
1393
+ ASSERT_OK(Delete(k));
1394
+ }
1395
+
1396
+ if (run_config == TestConfig::FLUSH_EVERY_1000) {
1397
+ if (i && i % 1000 == 0) {
1398
+ ASSERT_OK(Flush());
1399
+ }
1400
+ }
1401
+ }
1402
+
1403
+ if (run_config == TestConfig::CLOSE_AND_OPEN) {
1404
+ Close();
1405
+ Reopen(options);
1406
+ } else if (run_config == TestConfig::COMPACT_BEFORE_READ) {
1407
+ ASSERT_OK(db_->CompactRange(CompactRangeOptions(), nullptr, nullptr));
1408
+ }
1409
+
1410
+ ReadOptions ro;
1411
+ ro.pin_data = true;
1412
+ auto iter = NewIterator(ro);
1413
+
1414
+ {
1415
+ // Test Seek to random keys
1416
+ std::vector<Slice> keys_slices;
1417
+ std::vector<std::string> true_keys;
1418
+ for (auto& k : random_keys) {
1419
+ iter->Seek(k);
1420
+ if (!iter->Valid()) {
1421
+ ASSERT_EQ(true_data.lower_bound(k), true_data.end());
1422
+ continue;
1423
+ }
1424
+ std::string prop_value;
1425
+ ASSERT_OK(
1426
+ iter->GetProperty("rocksdb.iterator.is-key-pinned", &prop_value));
1427
+ ASSERT_EQ("1", prop_value);
1428
+ keys_slices.push_back(iter->key());
1429
+ true_keys.push_back(true_data.lower_bound(k)->first);
1430
+ }
1431
+
1432
+ for (size_t i = 0; i < keys_slices.size(); i++) {
1433
+ ASSERT_EQ(keys_slices[i].ToString(), true_keys[i]);
1434
+ }
1435
+ }
1436
+
1437
+ {
1438
+ // Test SeekForPrev to random keys
1439
+ std::vector<Slice> keys_slices;
1440
+ std::vector<std::string> true_keys;
1441
+ for (auto& k : random_keys) {
1442
+ iter->SeekForPrev(k);
1443
+ if (!iter->Valid()) {
1444
+ ASSERT_EQ(true_data.upper_bound(k), true_data.begin());
1445
+ continue;
1446
+ }
1447
+ std::string prop_value;
1448
+ ASSERT_OK(
1449
+ iter->GetProperty("rocksdb.iterator.is-key-pinned", &prop_value));
1450
+ ASSERT_EQ("1", prop_value);
1451
+ keys_slices.push_back(iter->key());
1452
+ true_keys.push_back((--true_data.upper_bound(k))->first);
1453
+ }
1454
+
1455
+ for (size_t i = 0; i < keys_slices.size(); i++) {
1456
+ ASSERT_EQ(keys_slices[i].ToString(), true_keys[i]);
1457
+ }
1458
+ }
1459
+
1460
+ {
1461
+ // Test iterating all data forward
1462
+ std::vector<Slice> all_keys;
1463
+ for (iter->SeekToFirst(); iter->Valid(); iter->Next()) {
1464
+ std::string prop_value;
1465
+ ASSERT_OK(
1466
+ iter->GetProperty("rocksdb.iterator.is-key-pinned", &prop_value));
1467
+ ASSERT_EQ("1", prop_value);
1468
+ all_keys.push_back(iter->key());
1469
+ }
1470
+ ASSERT_EQ(all_keys.size(), true_data.size());
1471
+
1472
+ // Verify that all keys slices are valid
1473
+ auto data_iter = true_data.begin();
1474
+ for (size_t i = 0; i < all_keys.size(); i++) {
1475
+ ASSERT_EQ(all_keys[i].ToString(), data_iter->first);
1476
+ data_iter++;
1477
+ }
1478
+ }
1479
+
1480
+ {
1481
+ // Test iterating all data backward
1482
+ std::vector<Slice> all_keys;
1483
+ for (iter->SeekToLast(); iter->Valid(); iter->Prev()) {
1484
+ std::string prop_value;
1485
+ ASSERT_OK(
1486
+ iter->GetProperty("rocksdb.iterator.is-key-pinned", &prop_value));
1487
+ ASSERT_EQ("1", prop_value);
1488
+ all_keys.push_back(iter->key());
1489
+ }
1490
+ ASSERT_EQ(all_keys.size(), true_data.size());
1491
+
1492
+ // Verify that all keys slices are valid (backward)
1493
+ auto data_iter = true_data.rbegin();
1494
+ for (size_t i = 0; i < all_keys.size(); i++) {
1495
+ ASSERT_EQ(all_keys[i].ToString(), data_iter->first);
1496
+ data_iter++;
1497
+ }
1498
+ }
1499
+
1500
+ delete iter;
1501
+ }
1502
+ };
1503
+
1504
+ TEST_P(DBIteratorTestForPinnedData, PinnedDataIteratorRandomizedNormal) {
1505
+ PinnedDataIteratorRandomized(TestConfig::NORMAL);
1506
+ }
1507
+
1508
+ TEST_P(DBIteratorTestForPinnedData, PinnedDataIteratorRandomizedCLoseAndOpen) {
1509
+ PinnedDataIteratorRandomized(TestConfig::CLOSE_AND_OPEN);
1510
+ }
1511
+
1512
+ TEST_P(DBIteratorTestForPinnedData,
1513
+ PinnedDataIteratorRandomizedCompactBeforeRead) {
1514
+ PinnedDataIteratorRandomized(TestConfig::COMPACT_BEFORE_READ);
1515
+ }
1516
+
1517
+ TEST_P(DBIteratorTestForPinnedData, PinnedDataIteratorRandomizedFlush) {
1518
+ PinnedDataIteratorRandomized(TestConfig::FLUSH_EVERY_1000);
1519
+ }
1520
+
1521
+ #ifndef ROCKSDB_LITE
1522
+ TEST_P(DBIteratorTest, PinnedDataIteratorMultipleFiles) {
1523
+ Options options = CurrentOptions();
1524
+ BlockBasedTableOptions table_options;
1525
+ table_options.use_delta_encoding = false;
1526
+ options.table_factory.reset(NewBlockBasedTableFactory(table_options));
1527
+ options.disable_auto_compactions = true;
1528
+ options.write_buffer_size = 1024 * 1024 * 10; // 10 Mb
1529
+ DestroyAndReopen(options);
1530
+
1531
+ std::map<std::string, std::string> true_data;
1532
+
1533
+ // Generate 4 sst files in L2
1534
+ Random rnd(301);
1535
+ for (int i = 1; i <= 1000; i++) {
1536
+ std::string k = Key(i * 3);
1537
+ std::string v = rnd.RandomString(100);
1538
+ ASSERT_OK(Put(k, v));
1539
+ true_data[k] = v;
1540
+ if (i % 250 == 0) {
1541
+ ASSERT_OK(Flush());
1542
+ }
1543
+ }
1544
+ ASSERT_EQ(FilesPerLevel(0), "4");
1545
+ ASSERT_OK(db_->CompactRange(CompactRangeOptions(), nullptr, nullptr));
1546
+ ASSERT_EQ(FilesPerLevel(0), "0,4");
1547
+
1548
+ // Generate 4 sst files in L0
1549
+ for (int i = 1; i <= 1000; i++) {
1550
+ std::string k = Key(i * 2);
1551
+ std::string v = rnd.RandomString(100);
1552
+ ASSERT_OK(Put(k, v));
1553
+ true_data[k] = v;
1554
+ if (i % 250 == 0) {
1555
+ ASSERT_OK(Flush());
1556
+ }
1557
+ }
1558
+ ASSERT_EQ(FilesPerLevel(0), "4,4");
1559
+
1560
+ // Add some keys/values in memtables
1561
+ for (int i = 1; i <= 1000; i++) {
1562
+ std::string k = Key(i);
1563
+ std::string v = rnd.RandomString(100);
1564
+ ASSERT_OK(Put(k, v));
1565
+ true_data[k] = v;
1566
+ }
1567
+ ASSERT_EQ(FilesPerLevel(0), "4,4");
1568
+
1569
+ ReadOptions ro;
1570
+ ro.pin_data = true;
1571
+ auto iter = NewIterator(ro);
1572
+
1573
+ std::vector<std::pair<Slice, std::string>> results;
1574
+ for (iter->SeekToFirst(); iter->Valid(); iter->Next()) {
1575
+ std::string prop_value;
1576
+ ASSERT_OK(iter->GetProperty("rocksdb.iterator.is-key-pinned", &prop_value));
1577
+ ASSERT_EQ("1", prop_value);
1578
+ results.emplace_back(iter->key(), iter->value().ToString());
1579
+ }
1580
+
1581
+ ASSERT_EQ(results.size(), true_data.size());
1582
+ auto data_iter = true_data.begin();
1583
+ for (size_t i = 0; i < results.size(); i++, data_iter++) {
1584
+ auto& kv = results[i];
1585
+ ASSERT_EQ(kv.first, data_iter->first);
1586
+ ASSERT_EQ(kv.second, data_iter->second);
1587
+ }
1588
+
1589
+ delete iter;
1590
+ }
1591
+ #endif
1592
+
1593
+ TEST_P(DBIteratorTest, PinnedDataIteratorMergeOperator) {
1594
+ Options options = CurrentOptions();
1595
+ BlockBasedTableOptions table_options;
1596
+ table_options.use_delta_encoding = false;
1597
+ options.table_factory.reset(NewBlockBasedTableFactory(table_options));
1598
+ options.merge_operator = MergeOperators::CreateUInt64AddOperator();
1599
+ DestroyAndReopen(options);
1600
+
1601
+ std::string numbers[7];
1602
+ for (int val = 0; val <= 6; val++) {
1603
+ PutFixed64(numbers + val, val);
1604
+ }
1605
+
1606
+ // +1 all keys in range [ 0 => 999]
1607
+ for (int i = 0; i < 1000; i++) {
1608
+ WriteOptions wo;
1609
+ ASSERT_OK(db_->Merge(wo, Key(i), numbers[1]));
1610
+ }
1611
+
1612
+ // +2 all keys divisible by 2 in range [ 0 => 999]
1613
+ for (int i = 0; i < 1000; i += 2) {
1614
+ WriteOptions wo;
1615
+ ASSERT_OK(db_->Merge(wo, Key(i), numbers[2]));
1616
+ }
1617
+
1618
+ // +3 all keys divisible by 5 in range [ 0 => 999]
1619
+ for (int i = 0; i < 1000; i += 5) {
1620
+ WriteOptions wo;
1621
+ ASSERT_OK(db_->Merge(wo, Key(i), numbers[3]));
1622
+ }
1623
+
1624
+ ReadOptions ro;
1625
+ ro.pin_data = true;
1626
+ auto iter = NewIterator(ro);
1627
+
1628
+ std::vector<std::pair<Slice, std::string>> results;
1629
+ for (iter->SeekToFirst(); iter->Valid(); iter->Next()) {
1630
+ std::string prop_value;
1631
+ ASSERT_OK(iter->GetProperty("rocksdb.iterator.is-key-pinned", &prop_value));
1632
+ ASSERT_EQ("1", prop_value);
1633
+ results.emplace_back(iter->key(), iter->value().ToString());
1634
+ }
1635
+
1636
+ ASSERT_EQ(results.size(), 1000);
1637
+ for (size_t i = 0; i < results.size(); i++) {
1638
+ auto& kv = results[i];
1639
+ ASSERT_EQ(kv.first, Key(static_cast<int>(i)));
1640
+ int expected_val = 1;
1641
+ if (i % 2 == 0) {
1642
+ expected_val += 2;
1643
+ }
1644
+ if (i % 5 == 0) {
1645
+ expected_val += 3;
1646
+ }
1647
+ ASSERT_EQ(kv.second, numbers[expected_val]);
1648
+ }
1649
+
1650
+ delete iter;
1651
+ }
1652
+
1653
+ TEST_P(DBIteratorTest, PinnedDataIteratorReadAfterUpdate) {
1654
+ Options options = CurrentOptions();
1655
+ BlockBasedTableOptions table_options;
1656
+ table_options.use_delta_encoding = false;
1657
+ options.table_factory.reset(NewBlockBasedTableFactory(table_options));
1658
+ options.write_buffer_size = 100000;
1659
+ DestroyAndReopen(options);
1660
+
1661
+ Random rnd(301);
1662
+
1663
+ std::map<std::string, std::string> true_data;
1664
+ for (int i = 0; i < 1000; i++) {
1665
+ std::string k = rnd.RandomString(10);
1666
+ std::string v = rnd.RandomString(1000);
1667
+ ASSERT_OK(Put(k, v));
1668
+ true_data[k] = v;
1669
+ }
1670
+
1671
+ ReadOptions ro;
1672
+ ro.pin_data = true;
1673
+ auto iter = NewIterator(ro);
1674
+
1675
+ // Delete 50% of the keys and update the other 50%
1676
+ for (auto& kv : true_data) {
1677
+ if (rnd.OneIn(2)) {
1678
+ ASSERT_OK(Delete(kv.first));
1679
+ } else {
1680
+ std::string new_val = rnd.RandomString(1000);
1681
+ ASSERT_OK(Put(kv.first, new_val));
1682
+ }
1683
+ }
1684
+
1685
+ std::vector<std::pair<Slice, std::string>> results;
1686
+ for (iter->SeekToFirst(); iter->Valid(); iter->Next()) {
1687
+ std::string prop_value;
1688
+ ASSERT_OK(iter->GetProperty("rocksdb.iterator.is-key-pinned", &prop_value));
1689
+ ASSERT_EQ("1", prop_value);
1690
+ results.emplace_back(iter->key(), iter->value().ToString());
1691
+ }
1692
+
1693
+ auto data_iter = true_data.begin();
1694
+ for (size_t i = 0; i < results.size(); i++, data_iter++) {
1695
+ auto& kv = results[i];
1696
+ ASSERT_EQ(kv.first, data_iter->first);
1697
+ ASSERT_EQ(kv.second, data_iter->second);
1698
+ }
1699
+
1700
+ delete iter;
1701
+ }
1702
+
1703
+ class SliceTransformLimitedDomainGeneric : public SliceTransform {
1704
+ const char* Name() const override {
1705
+ return "SliceTransformLimitedDomainGeneric";
1706
+ }
1707
+
1708
+ Slice Transform(const Slice& src) const override {
1709
+ return Slice(src.data(), 1);
1710
+ }
1711
+
1712
+ bool InDomain(const Slice& src) const override {
1713
+ // prefix will be x????
1714
+ return src.size() >= 1;
1715
+ }
1716
+
1717
+ bool InRange(const Slice& dst) const override {
1718
+ // prefix will be x????
1719
+ return dst.size() == 1;
1720
+ }
1721
+ };
1722
+
1723
+ TEST_P(DBIteratorTest, IterSeekForPrevCrossingFiles) {
1724
+ Options options = CurrentOptions();
1725
+ options.prefix_extractor.reset(NewFixedPrefixTransform(1));
1726
+ options.disable_auto_compactions = true;
1727
+ // Enable prefix bloom for SST files
1728
+ BlockBasedTableOptions table_options;
1729
+ table_options.filter_policy.reset(NewBloomFilterPolicy(10, true));
1730
+ options.table_factory.reset(NewBlockBasedTableFactory(table_options));
1731
+ DestroyAndReopen(options);
1732
+
1733
+ ASSERT_OK(Put("a1", "va1"));
1734
+ ASSERT_OK(Put("a2", "va2"));
1735
+ ASSERT_OK(Put("a3", "va3"));
1736
+ ASSERT_OK(Flush());
1737
+
1738
+ ASSERT_OK(Put("b1", "vb1"));
1739
+ ASSERT_OK(Put("b2", "vb2"));
1740
+ ASSERT_OK(Put("b3", "vb3"));
1741
+ ASSERT_OK(Flush());
1742
+
1743
+ ASSERT_OK(Put("b4", "vb4"));
1744
+ ASSERT_OK(Put("d1", "vd1"));
1745
+ ASSERT_OK(Put("d2", "vd2"));
1746
+ ASSERT_OK(Put("d4", "vd4"));
1747
+ ASSERT_OK(Flush());
1748
+
1749
+ MoveFilesToLevel(1);
1750
+ {
1751
+ ReadOptions ro;
1752
+ Iterator* iter = NewIterator(ro);
1753
+
1754
+ iter->SeekForPrev("a4");
1755
+ ASSERT_EQ(iter->key().ToString(), "a3");
1756
+ ASSERT_EQ(iter->value().ToString(), "va3");
1757
+
1758
+ iter->SeekForPrev("c2");
1759
+ ASSERT_EQ(iter->key().ToString(), "b3");
1760
+ iter->SeekForPrev("d3");
1761
+ ASSERT_EQ(iter->key().ToString(), "d2");
1762
+ iter->SeekForPrev("b5");
1763
+ ASSERT_EQ(iter->key().ToString(), "b4");
1764
+ delete iter;
1765
+ }
1766
+
1767
+ {
1768
+ ReadOptions ro;
1769
+ ro.prefix_same_as_start = true;
1770
+ Iterator* iter = NewIterator(ro);
1771
+ iter->SeekForPrev("c2");
1772
+ ASSERT_TRUE(!iter->Valid());
1773
+ ASSERT_OK(iter->status());
1774
+ delete iter;
1775
+ }
1776
+ }
1777
+
1778
+ TEST_P(DBIteratorTest, IterSeekForPrevCrossingFilesCustomPrefixExtractor) {
1779
+ Options options = CurrentOptions();
1780
+ options.prefix_extractor =
1781
+ std::make_shared<SliceTransformLimitedDomainGeneric>();
1782
+ options.disable_auto_compactions = true;
1783
+ // Enable prefix bloom for SST files
1784
+ BlockBasedTableOptions table_options;
1785
+ table_options.filter_policy.reset(NewBloomFilterPolicy(10, true));
1786
+ options.table_factory.reset(NewBlockBasedTableFactory(table_options));
1787
+ DestroyAndReopen(options);
1788
+
1789
+ ASSERT_OK(Put("a1", "va1"));
1790
+ ASSERT_OK(Put("a2", "va2"));
1791
+ ASSERT_OK(Put("a3", "va3"));
1792
+ ASSERT_OK(Flush());
1793
+
1794
+ ASSERT_OK(Put("b1", "vb1"));
1795
+ ASSERT_OK(Put("b2", "vb2"));
1796
+ ASSERT_OK(Put("b3", "vb3"));
1797
+ ASSERT_OK(Flush());
1798
+
1799
+ ASSERT_OK(Put("b4", "vb4"));
1800
+ ASSERT_OK(Put("d1", "vd1"));
1801
+ ASSERT_OK(Put("d2", "vd2"));
1802
+ ASSERT_OK(Put("d4", "vd4"));
1803
+ ASSERT_OK(Flush());
1804
+
1805
+ MoveFilesToLevel(1);
1806
+ {
1807
+ ReadOptions ro;
1808
+ Iterator* iter = NewIterator(ro);
1809
+
1810
+ iter->SeekForPrev("a4");
1811
+ ASSERT_EQ(iter->key().ToString(), "a3");
1812
+ ASSERT_EQ(iter->value().ToString(), "va3");
1813
+
1814
+ iter->SeekForPrev("c2");
1815
+ ASSERT_EQ(iter->key().ToString(), "b3");
1816
+ iter->SeekForPrev("d3");
1817
+ ASSERT_EQ(iter->key().ToString(), "d2");
1818
+ iter->SeekForPrev("b5");
1819
+ ASSERT_EQ(iter->key().ToString(), "b4");
1820
+ delete iter;
1821
+ }
1822
+
1823
+ {
1824
+ ReadOptions ro;
1825
+ ro.prefix_same_as_start = true;
1826
+ Iterator* iter = NewIterator(ro);
1827
+ iter->SeekForPrev("c2");
1828
+ ASSERT_TRUE(!iter->Valid());
1829
+ ASSERT_OK(iter->status());
1830
+ delete iter;
1831
+ }
1832
+ }
1833
+
1834
+ TEST_P(DBIteratorTest, IterPrevKeyCrossingBlocks) {
1835
+ Options options = CurrentOptions();
1836
+ BlockBasedTableOptions table_options;
1837
+ table_options.block_size = 1; // every block will contain one entry
1838
+ options.table_factory.reset(NewBlockBasedTableFactory(table_options));
1839
+ options.merge_operator = MergeOperators::CreateStringAppendTESTOperator();
1840
+ options.disable_auto_compactions = true;
1841
+ options.max_sequential_skip_in_iterations = 8;
1842
+
1843
+ DestroyAndReopen(options);
1844
+
1845
+ // Putting such deletes will force DBIter::Prev() to fallback to a Seek
1846
+ for (int file_num = 0; file_num < 10; file_num++) {
1847
+ ASSERT_OK(Delete("key4"));
1848
+ ASSERT_OK(Flush());
1849
+ }
1850
+
1851
+ // First File containing 5 blocks of puts
1852
+ ASSERT_OK(Put("key1", "val1.0"));
1853
+ ASSERT_OK(Put("key2", "val2.0"));
1854
+ ASSERT_OK(Put("key3", "val3.0"));
1855
+ ASSERT_OK(Put("key4", "val4.0"));
1856
+ ASSERT_OK(Put("key5", "val5.0"));
1857
+ ASSERT_OK(Flush());
1858
+
1859
+ // Second file containing 9 blocks of merge operands
1860
+ ASSERT_OK(db_->Merge(WriteOptions(), "key1", "val1.1"));
1861
+ ASSERT_OK(db_->Merge(WriteOptions(), "key1", "val1.2"));
1862
+
1863
+ ASSERT_OK(db_->Merge(WriteOptions(), "key2", "val2.1"));
1864
+ ASSERT_OK(db_->Merge(WriteOptions(), "key2", "val2.2"));
1865
+ ASSERT_OK(db_->Merge(WriteOptions(), "key2", "val2.3"));
1866
+
1867
+ ASSERT_OK(db_->Merge(WriteOptions(), "key3", "val3.1"));
1868
+ ASSERT_OK(db_->Merge(WriteOptions(), "key3", "val3.2"));
1869
+ ASSERT_OK(db_->Merge(WriteOptions(), "key3", "val3.3"));
1870
+ ASSERT_OK(db_->Merge(WriteOptions(), "key3", "val3.4"));
1871
+ ASSERT_OK(Flush());
1872
+
1873
+ {
1874
+ ReadOptions ro;
1875
+ ro.fill_cache = false;
1876
+ Iterator* iter = NewIterator(ro);
1877
+
1878
+ iter->SeekToLast();
1879
+ ASSERT_EQ(iter->key().ToString(), "key5");
1880
+ ASSERT_EQ(iter->value().ToString(), "val5.0");
1881
+
1882
+ iter->Prev();
1883
+ ASSERT_EQ(iter->key().ToString(), "key4");
1884
+ ASSERT_EQ(iter->value().ToString(), "val4.0");
1885
+
1886
+ iter->Prev();
1887
+ ASSERT_EQ(iter->key().ToString(), "key3");
1888
+ ASSERT_EQ(iter->value().ToString(), "val3.0,val3.1,val3.2,val3.3,val3.4");
1889
+
1890
+ iter->Prev();
1891
+ ASSERT_EQ(iter->key().ToString(), "key2");
1892
+ ASSERT_EQ(iter->value().ToString(), "val2.0,val2.1,val2.2,val2.3");
1893
+
1894
+ iter->Prev();
1895
+ ASSERT_EQ(iter->key().ToString(), "key1");
1896
+ ASSERT_EQ(iter->value().ToString(), "val1.0,val1.1,val1.2");
1897
+
1898
+ delete iter;
1899
+ }
1900
+ }
1901
+
1902
+ TEST_P(DBIteratorTest, IterPrevKeyCrossingBlocksRandomized) {
1903
+ Options options = CurrentOptions();
1904
+ options.merge_operator = MergeOperators::CreateStringAppendTESTOperator();
1905
+ options.disable_auto_compactions = true;
1906
+ options.level0_slowdown_writes_trigger = (1 << 30);
1907
+ options.level0_stop_writes_trigger = (1 << 30);
1908
+ options.max_sequential_skip_in_iterations = 8;
1909
+ DestroyAndReopen(options);
1910
+
1911
+ const int kNumKeys = 500;
1912
+ // Small number of merge operands to make sure that DBIter::Prev() don't
1913
+ // fall back to Seek()
1914
+ const int kNumMergeOperands = 3;
1915
+ // Use value size that will make sure that every block contain 1 key
1916
+ const int kValSize =
1917
+ static_cast<int>(BlockBasedTableOptions().block_size) * 4;
1918
+ // Percentage of keys that wont get merge operations
1919
+ const int kNoMergeOpPercentage = 20;
1920
+ // Percentage of keys that will be deleted
1921
+ const int kDeletePercentage = 10;
1922
+
1923
+ // For half of the key range we will write multiple deletes first to
1924
+ // force DBIter::Prev() to fall back to Seek()
1925
+ for (int file_num = 0; file_num < 10; file_num++) {
1926
+ for (int i = 0; i < kNumKeys; i += 2) {
1927
+ ASSERT_OK(Delete(Key(i)));
1928
+ }
1929
+ ASSERT_OK(Flush());
1930
+ }
1931
+
1932
+ Random rnd(301);
1933
+ std::map<std::string, std::string> true_data;
1934
+ std::string gen_key;
1935
+ std::string gen_val;
1936
+
1937
+ for (int i = 0; i < kNumKeys; i++) {
1938
+ gen_key = Key(i);
1939
+ gen_val = rnd.RandomString(kValSize);
1940
+
1941
+ ASSERT_OK(Put(gen_key, gen_val));
1942
+ true_data[gen_key] = gen_val;
1943
+ }
1944
+ ASSERT_OK(Flush());
1945
+
1946
+ // Separate values and merge operands in different file so that we
1947
+ // make sure that we don't merge them while flushing but actually
1948
+ // merge them in the read path
1949
+ for (int i = 0; i < kNumKeys; i++) {
1950
+ if (rnd.PercentTrue(kNoMergeOpPercentage)) {
1951
+ // Dont give merge operations for some keys
1952
+ continue;
1953
+ }
1954
+
1955
+ for (int j = 0; j < kNumMergeOperands; j++) {
1956
+ gen_key = Key(i);
1957
+ gen_val = rnd.RandomString(kValSize);
1958
+
1959
+ ASSERT_OK(db_->Merge(WriteOptions(), gen_key, gen_val));
1960
+ true_data[gen_key] += "," + gen_val;
1961
+ }
1962
+ }
1963
+ ASSERT_OK(Flush());
1964
+
1965
+ for (int i = 0; i < kNumKeys; i++) {
1966
+ if (rnd.PercentTrue(kDeletePercentage)) {
1967
+ gen_key = Key(i);
1968
+
1969
+ ASSERT_OK(Delete(gen_key));
1970
+ true_data.erase(gen_key);
1971
+ }
1972
+ }
1973
+ ASSERT_OK(Flush());
1974
+
1975
+ {
1976
+ ReadOptions ro;
1977
+ ro.fill_cache = false;
1978
+ Iterator* iter = NewIterator(ro);
1979
+ auto data_iter = true_data.rbegin();
1980
+
1981
+ for (iter->SeekToLast(); iter->Valid(); iter->Prev()) {
1982
+ ASSERT_EQ(iter->key().ToString(), data_iter->first);
1983
+ ASSERT_EQ(iter->value().ToString(), data_iter->second);
1984
+ data_iter++;
1985
+ }
1986
+ ASSERT_EQ(data_iter, true_data.rend());
1987
+
1988
+ delete iter;
1989
+ }
1990
+
1991
+ {
1992
+ ReadOptions ro;
1993
+ ro.fill_cache = false;
1994
+ Iterator* iter = NewIterator(ro);
1995
+ auto data_iter = true_data.rbegin();
1996
+
1997
+ int entries_right = 0;
1998
+ std::string seek_key;
1999
+ for (iter->SeekToLast(); iter->Valid(); iter->Prev()) {
2000
+ // Verify key/value of current position
2001
+ ASSERT_EQ(iter->key().ToString(), data_iter->first);
2002
+ ASSERT_EQ(iter->value().ToString(), data_iter->second);
2003
+
2004
+ bool restore_position_with_seek = rnd.Uniform(2);
2005
+ if (restore_position_with_seek) {
2006
+ seek_key = iter->key().ToString();
2007
+ }
2008
+
2009
+ // Do some Next() operations the restore the iterator to orignal position
2010
+ int next_count =
2011
+ entries_right > 0 ? rnd.Uniform(std::min(entries_right, 10)) : 0;
2012
+ for (int i = 0; i < next_count; i++) {
2013
+ iter->Next();
2014
+ data_iter--;
2015
+
2016
+ ASSERT_EQ(iter->key().ToString(), data_iter->first);
2017
+ ASSERT_EQ(iter->value().ToString(), data_iter->second);
2018
+ }
2019
+
2020
+ if (restore_position_with_seek) {
2021
+ // Restore orignal position using Seek()
2022
+ iter->Seek(seek_key);
2023
+ for (int i = 0; i < next_count; i++) {
2024
+ data_iter++;
2025
+ }
2026
+
2027
+ ASSERT_EQ(iter->key().ToString(), data_iter->first);
2028
+ ASSERT_EQ(iter->value().ToString(), data_iter->second);
2029
+ } else {
2030
+ // Restore original position using Prev()
2031
+ for (int i = 0; i < next_count; i++) {
2032
+ iter->Prev();
2033
+ data_iter++;
2034
+
2035
+ ASSERT_EQ(iter->key().ToString(), data_iter->first);
2036
+ ASSERT_EQ(iter->value().ToString(), data_iter->second);
2037
+ }
2038
+ }
2039
+
2040
+ entries_right++;
2041
+ data_iter++;
2042
+ }
2043
+ ASSERT_EQ(data_iter, true_data.rend());
2044
+
2045
+ delete iter;
2046
+ }
2047
+ }
2048
+
2049
+ TEST_P(DBIteratorTest, IteratorWithLocalStatistics) {
2050
+ Options options = CurrentOptions();
2051
+ options.statistics = ROCKSDB_NAMESPACE::CreateDBStatistics();
2052
+ DestroyAndReopen(options);
2053
+
2054
+ Random rnd(301);
2055
+ for (int i = 0; i < 1000; i++) {
2056
+ // Key 10 bytes / Value 10 bytes
2057
+ ASSERT_OK(Put(rnd.RandomString(10), rnd.RandomString(10)));
2058
+ }
2059
+
2060
+ std::atomic<uint64_t> total_next(0);
2061
+ std::atomic<uint64_t> total_next_found(0);
2062
+ std::atomic<uint64_t> total_prev(0);
2063
+ std::atomic<uint64_t> total_prev_found(0);
2064
+ std::atomic<uint64_t> total_bytes(0);
2065
+
2066
+ std::vector<port::Thread> threads;
2067
+ std::function<void()> reader_func_next = [&]() {
2068
+ SetPerfLevel(kEnableCount);
2069
+ get_perf_context()->Reset();
2070
+ Iterator* iter = NewIterator(ReadOptions());
2071
+
2072
+ iter->SeekToFirst();
2073
+ // Seek will bump ITER_BYTES_READ
2074
+ uint64_t bytes = 0;
2075
+ bytes += iter->key().size();
2076
+ bytes += iter->value().size();
2077
+ while (true) {
2078
+ iter->Next();
2079
+ total_next++;
2080
+
2081
+ if (!iter->Valid()) {
2082
+ break;
2083
+ }
2084
+ total_next_found++;
2085
+ bytes += iter->key().size();
2086
+ bytes += iter->value().size();
2087
+ }
2088
+
2089
+ delete iter;
2090
+ ASSERT_EQ(bytes, get_perf_context()->iter_read_bytes);
2091
+ SetPerfLevel(kDisable);
2092
+ total_bytes += bytes;
2093
+ };
2094
+
2095
+ std::function<void()> reader_func_prev = [&]() {
2096
+ SetPerfLevel(kEnableCount);
2097
+ Iterator* iter = NewIterator(ReadOptions());
2098
+
2099
+ iter->SeekToLast();
2100
+ // Seek will bump ITER_BYTES_READ
2101
+ uint64_t bytes = 0;
2102
+ bytes += iter->key().size();
2103
+ bytes += iter->value().size();
2104
+ while (true) {
2105
+ iter->Prev();
2106
+ total_prev++;
2107
+
2108
+ if (!iter->Valid()) {
2109
+ break;
2110
+ }
2111
+ total_prev_found++;
2112
+ bytes += iter->key().size();
2113
+ bytes += iter->value().size();
2114
+ }
2115
+
2116
+ delete iter;
2117
+ ASSERT_EQ(bytes, get_perf_context()->iter_read_bytes);
2118
+ SetPerfLevel(kDisable);
2119
+ total_bytes += bytes;
2120
+ };
2121
+
2122
+ for (int i = 0; i < 10; i++) {
2123
+ threads.emplace_back(reader_func_next);
2124
+ }
2125
+ for (int i = 0; i < 15; i++) {
2126
+ threads.emplace_back(reader_func_prev);
2127
+ }
2128
+
2129
+ for (auto& t : threads) {
2130
+ t.join();
2131
+ }
2132
+
2133
+ ASSERT_EQ(TestGetTickerCount(options, NUMBER_DB_NEXT), (uint64_t)total_next);
2134
+ ASSERT_EQ(TestGetTickerCount(options, NUMBER_DB_NEXT_FOUND),
2135
+ (uint64_t)total_next_found);
2136
+ ASSERT_EQ(TestGetTickerCount(options, NUMBER_DB_PREV), (uint64_t)total_prev);
2137
+ ASSERT_EQ(TestGetTickerCount(options, NUMBER_DB_PREV_FOUND),
2138
+ (uint64_t)total_prev_found);
2139
+ ASSERT_EQ(TestGetTickerCount(options, ITER_BYTES_READ), (uint64_t)total_bytes);
2140
+
2141
+ }
2142
+
2143
+ TEST_P(DBIteratorTest, ReadAhead) {
2144
+ Options options;
2145
+ env_->count_random_reads_ = true;
2146
+ options.env = env_;
2147
+ options.disable_auto_compactions = true;
2148
+ options.write_buffer_size = 4 << 20;
2149
+ options.statistics = ROCKSDB_NAMESPACE::CreateDBStatistics();
2150
+ BlockBasedTableOptions table_options;
2151
+ table_options.block_size = 1024;
2152
+ table_options.no_block_cache = true;
2153
+ options.table_factory.reset(NewBlockBasedTableFactory(table_options));
2154
+ Reopen(options);
2155
+
2156
+ std::string value(1024, 'a');
2157
+ for (int i = 0; i < 100; i++) {
2158
+ ASSERT_OK(Put(Key(i), value));
2159
+ }
2160
+ ASSERT_OK(Flush());
2161
+ MoveFilesToLevel(2);
2162
+
2163
+ for (int i = 0; i < 100; i++) {
2164
+ ASSERT_OK(Put(Key(i), value));
2165
+ }
2166
+ ASSERT_OK(Flush());
2167
+ MoveFilesToLevel(1);
2168
+
2169
+ for (int i = 0; i < 100; i++) {
2170
+ ASSERT_OK(Put(Key(i), value));
2171
+ }
2172
+ ASSERT_OK(Flush());
2173
+ #ifndef ROCKSDB_LITE
2174
+ ASSERT_EQ("1,1,1", FilesPerLevel());
2175
+ #endif // !ROCKSDB_LITE
2176
+
2177
+ env_->random_read_bytes_counter_ = 0;
2178
+ options.statistics->setTickerCount(NO_FILE_OPENS, 0);
2179
+ ReadOptions read_options;
2180
+ auto* iter = NewIterator(read_options);
2181
+ iter->SeekToFirst();
2182
+ int64_t num_file_opens = TestGetTickerCount(options, NO_FILE_OPENS);
2183
+ size_t bytes_read = env_->random_read_bytes_counter_;
2184
+ delete iter;
2185
+
2186
+ int64_t num_file_closes = TestGetTickerCount(options, NO_FILE_CLOSES);
2187
+ env_->random_read_bytes_counter_ = 0;
2188
+ options.statistics->setTickerCount(NO_FILE_OPENS, 0);
2189
+ read_options.readahead_size = 1024 * 10;
2190
+ iter = NewIterator(read_options);
2191
+ iter->SeekToFirst();
2192
+ int64_t num_file_opens_readahead = TestGetTickerCount(options, NO_FILE_OPENS);
2193
+ size_t bytes_read_readahead = env_->random_read_bytes_counter_;
2194
+ delete iter;
2195
+ int64_t num_file_closes_readahead =
2196
+ TestGetTickerCount(options, NO_FILE_CLOSES);
2197
+ ASSERT_EQ(num_file_opens, num_file_opens_readahead);
2198
+ ASSERT_EQ(num_file_closes, num_file_closes_readahead);
2199
+ ASSERT_GT(bytes_read_readahead, bytes_read);
2200
+ ASSERT_GT(bytes_read_readahead, read_options.readahead_size * 3);
2201
+
2202
+ // Verify correctness.
2203
+ iter = NewIterator(read_options);
2204
+ int count = 0;
2205
+ for (iter->SeekToFirst(); iter->Valid(); iter->Next()) {
2206
+ ASSERT_EQ(value, iter->value());
2207
+ count++;
2208
+ }
2209
+ ASSERT_EQ(100, count);
2210
+ for (int i = 0; i < 100; i++) {
2211
+ iter->Seek(Key(i));
2212
+ ASSERT_EQ(value, iter->value());
2213
+ }
2214
+ delete iter;
2215
+ }
2216
+
2217
+ // Insert a key, create a snapshot iterator, overwrite key lots of times,
2218
+ // seek to a smaller key. Expect DBIter to fall back to a seek instead of
2219
+ // going through all the overwrites linearly.
2220
+ TEST_P(DBIteratorTest, DBIteratorSkipRecentDuplicatesTest) {
2221
+ Options options = CurrentOptions();
2222
+ options.env = env_;
2223
+ options.create_if_missing = true;
2224
+ options.max_sequential_skip_in_iterations = 3;
2225
+ options.prefix_extractor = nullptr;
2226
+ options.write_buffer_size = 1 << 27; // big enough to avoid flush
2227
+ options.statistics = ROCKSDB_NAMESPACE::CreateDBStatistics();
2228
+ DestroyAndReopen(options);
2229
+
2230
+ // Insert.
2231
+ ASSERT_OK(Put("b", "0"));
2232
+
2233
+ // Create iterator.
2234
+ ReadOptions ro;
2235
+ std::unique_ptr<Iterator> iter(NewIterator(ro));
2236
+
2237
+ // Insert a lot.
2238
+ for (int i = 0; i < 100; ++i) {
2239
+ ASSERT_OK(Put("b", std::to_string(i + 1).c_str()));
2240
+ }
2241
+
2242
+ #ifndef ROCKSDB_LITE
2243
+ // Check that memtable wasn't flushed.
2244
+ std::string val;
2245
+ ASSERT_TRUE(db_->GetProperty("rocksdb.num-files-at-level0", &val));
2246
+ EXPECT_EQ("0", val);
2247
+ #endif
2248
+
2249
+ // Seek iterator to a smaller key.
2250
+ get_perf_context()->Reset();
2251
+ iter->Seek("a");
2252
+ ASSERT_TRUE(iter->Valid());
2253
+ EXPECT_EQ("b", iter->key().ToString());
2254
+ EXPECT_EQ("0", iter->value().ToString());
2255
+
2256
+ // Check that the seek didn't do too much work.
2257
+ // Checks are not tight, just make sure that everything is well below 100.
2258
+ EXPECT_LT(get_perf_context()->internal_key_skipped_count, 4);
2259
+ EXPECT_LT(get_perf_context()->internal_recent_skipped_count, 8);
2260
+ EXPECT_LT(get_perf_context()->seek_on_memtable_count, 10);
2261
+ EXPECT_LT(get_perf_context()->next_on_memtable_count, 10);
2262
+ EXPECT_LT(get_perf_context()->prev_on_memtable_count, 10);
2263
+
2264
+ // Check that iterator did something like what we expect.
2265
+ EXPECT_EQ(get_perf_context()->internal_delete_skipped_count, 0);
2266
+ EXPECT_EQ(get_perf_context()->internal_merge_count, 0);
2267
+ EXPECT_GE(get_perf_context()->internal_recent_skipped_count, 2);
2268
+ EXPECT_GE(get_perf_context()->seek_on_memtable_count, 2);
2269
+ EXPECT_EQ(1, options.statistics->getTickerCount(
2270
+ NUMBER_OF_RESEEKS_IN_ITERATION));
2271
+ }
2272
+
2273
+ TEST_P(DBIteratorTest, Refresh) {
2274
+ ASSERT_OK(Put("x", "y"));
2275
+
2276
+ std::unique_ptr<Iterator> iter(NewIterator(ReadOptions()));
2277
+ ASSERT_OK(iter->status());
2278
+ iter->Seek(Slice("a"));
2279
+ ASSERT_TRUE(iter->Valid());
2280
+ ASSERT_EQ(iter->key().compare(Slice("x")), 0);
2281
+ iter->Next();
2282
+ ASSERT_FALSE(iter->Valid());
2283
+
2284
+ ASSERT_OK(Put("c", "d"));
2285
+
2286
+ iter->Seek(Slice("a"));
2287
+ ASSERT_TRUE(iter->Valid());
2288
+ ASSERT_EQ(iter->key().compare(Slice("x")), 0);
2289
+ iter->Next();
2290
+ ASSERT_FALSE(iter->Valid());
2291
+
2292
+ ASSERT_OK(iter->status());
2293
+ ASSERT_OK(iter->Refresh());
2294
+
2295
+ iter->Seek(Slice("a"));
2296
+ ASSERT_TRUE(iter->Valid());
2297
+ ASSERT_EQ(iter->key().compare(Slice("c")), 0);
2298
+ iter->Next();
2299
+ ASSERT_TRUE(iter->Valid());
2300
+ ASSERT_EQ(iter->key().compare(Slice("x")), 0);
2301
+ iter->Next();
2302
+ ASSERT_FALSE(iter->Valid());
2303
+
2304
+ EXPECT_OK(dbfull()->Flush(FlushOptions()));
2305
+
2306
+ ASSERT_OK(Put("m", "n"));
2307
+
2308
+ iter->Seek(Slice("a"));
2309
+ ASSERT_TRUE(iter->Valid());
2310
+ ASSERT_EQ(iter->key().compare(Slice("c")), 0);
2311
+ iter->Next();
2312
+ ASSERT_TRUE(iter->Valid());
2313
+ ASSERT_EQ(iter->key().compare(Slice("x")), 0);
2314
+ iter->Next();
2315
+ ASSERT_FALSE(iter->Valid());
2316
+
2317
+ ASSERT_OK(iter->status());
2318
+ ASSERT_OK(iter->Refresh());
2319
+
2320
+ iter->Seek(Slice("a"));
2321
+ ASSERT_TRUE(iter->Valid());
2322
+ ASSERT_EQ(iter->key().compare(Slice("c")), 0);
2323
+ iter->Next();
2324
+ ASSERT_TRUE(iter->Valid());
2325
+ ASSERT_EQ(iter->key().compare(Slice("m")), 0);
2326
+ iter->Next();
2327
+ ASSERT_TRUE(iter->Valid());
2328
+ ASSERT_EQ(iter->key().compare(Slice("x")), 0);
2329
+ iter->Next();
2330
+ ASSERT_FALSE(iter->Valid());
2331
+
2332
+ iter.reset();
2333
+ }
2334
+
2335
+ TEST_P(DBIteratorTest, RefreshWithSnapshot) {
2336
+ ASSERT_OK(Put("x", "y"));
2337
+ const Snapshot* snapshot = db_->GetSnapshot();
2338
+ ReadOptions options;
2339
+ options.snapshot = snapshot;
2340
+ Iterator* iter = NewIterator(options);
2341
+ ASSERT_OK(iter->status());
2342
+
2343
+ iter->Seek(Slice("a"));
2344
+ ASSERT_TRUE(iter->Valid());
2345
+ ASSERT_EQ(iter->key().compare(Slice("x")), 0);
2346
+ iter->Next();
2347
+ ASSERT_FALSE(iter->Valid());
2348
+
2349
+ ASSERT_OK(Put("c", "d"));
2350
+
2351
+ iter->Seek(Slice("a"));
2352
+ ASSERT_TRUE(iter->Valid());
2353
+ ASSERT_EQ(iter->key().compare(Slice("x")), 0);
2354
+ iter->Next();
2355
+ ASSERT_FALSE(iter->Valid());
2356
+
2357
+ ASSERT_OK(iter->status());
2358
+ Status s = iter->Refresh();
2359
+ ASSERT_TRUE(s.IsNotSupported());
2360
+ db_->ReleaseSnapshot(snapshot);
2361
+ delete iter;
2362
+ }
2363
+
2364
+ TEST_P(DBIteratorTest, CreationFailure) {
2365
+ SyncPoint::GetInstance()->SetCallBack(
2366
+ "DBImpl::NewInternalIterator:StatusCallback", [](void* arg) {
2367
+ *(reinterpret_cast<Status*>(arg)) = Status::Corruption("test status");
2368
+ });
2369
+ SyncPoint::GetInstance()->EnableProcessing();
2370
+
2371
+ Iterator* iter = NewIterator(ReadOptions());
2372
+ ASSERT_FALSE(iter->Valid());
2373
+ ASSERT_TRUE(iter->status().IsCorruption());
2374
+ delete iter;
2375
+ }
2376
+
2377
+ TEST_P(DBIteratorTest, UpperBoundWithChangeDirection) {
2378
+ Options options = CurrentOptions();
2379
+ options.max_sequential_skip_in_iterations = 3;
2380
+ DestroyAndReopen(options);
2381
+
2382
+ // write a bunch of kvs to the database.
2383
+ ASSERT_OK(Put("a", "1"));
2384
+ ASSERT_OK(Put("y", "1"));
2385
+ ASSERT_OK(Put("y1", "1"));
2386
+ ASSERT_OK(Put("y2", "1"));
2387
+ ASSERT_OK(Put("y3", "1"));
2388
+ ASSERT_OK(Put("z", "1"));
2389
+ ASSERT_OK(Flush());
2390
+ ASSERT_OK(Put("a", "1"));
2391
+ ASSERT_OK(Put("z", "1"));
2392
+ ASSERT_OK(Put("bar", "1"));
2393
+ ASSERT_OK(Put("foo", "1"));
2394
+
2395
+ std::string upper_bound = "x";
2396
+ Slice ub_slice(upper_bound);
2397
+ ReadOptions ro;
2398
+ ro.iterate_upper_bound = &ub_slice;
2399
+ ro.max_skippable_internal_keys = 1000;
2400
+
2401
+ Iterator* iter = NewIterator(ro);
2402
+ iter->Seek("foo");
2403
+ ASSERT_TRUE(iter->Valid());
2404
+ ASSERT_EQ("foo", iter->key().ToString());
2405
+
2406
+ iter->Prev();
2407
+ ASSERT_TRUE(iter->Valid());
2408
+ ASSERT_OK(iter->status());
2409
+ ASSERT_EQ("bar", iter->key().ToString());
2410
+
2411
+ delete iter;
2412
+ }
2413
+
2414
+ TEST_P(DBIteratorTest, TableFilter) {
2415
+ ASSERT_OK(Put("a", "1"));
2416
+ EXPECT_OK(dbfull()->Flush(FlushOptions()));
2417
+ ASSERT_OK(Put("b", "2"));
2418
+ ASSERT_OK(Put("c", "3"));
2419
+ EXPECT_OK(dbfull()->Flush(FlushOptions()));
2420
+ ASSERT_OK(Put("d", "4"));
2421
+ ASSERT_OK(Put("e", "5"));
2422
+ ASSERT_OK(Put("f", "6"));
2423
+ EXPECT_OK(dbfull()->Flush(FlushOptions()));
2424
+
2425
+ // Ensure the table_filter callback is called once for each table.
2426
+ {
2427
+ std::set<uint64_t> unseen{1, 2, 3};
2428
+ ReadOptions opts;
2429
+ opts.table_filter = [&](const TableProperties& props) {
2430
+ auto it = unseen.find(props.num_entries);
2431
+ if (it == unseen.end()) {
2432
+ ADD_FAILURE() << "saw table properties with an unexpected "
2433
+ << props.num_entries << " entries";
2434
+ } else {
2435
+ unseen.erase(it);
2436
+ }
2437
+ return true;
2438
+ };
2439
+ auto iter = NewIterator(opts);
2440
+ iter->SeekToFirst();
2441
+ ASSERT_EQ(IterStatus(iter), "a->1");
2442
+ iter->Next();
2443
+ ASSERT_EQ(IterStatus(iter), "b->2");
2444
+ iter->Next();
2445
+ ASSERT_EQ(IterStatus(iter), "c->3");
2446
+ iter->Next();
2447
+ ASSERT_EQ(IterStatus(iter), "d->4");
2448
+ iter->Next();
2449
+ ASSERT_EQ(IterStatus(iter), "e->5");
2450
+ iter->Next();
2451
+ ASSERT_EQ(IterStatus(iter), "f->6");
2452
+ iter->Next();
2453
+ ASSERT_FALSE(iter->Valid());
2454
+ ASSERT_TRUE(unseen.empty());
2455
+ delete iter;
2456
+ }
2457
+
2458
+ // Ensure returning false in the table_filter hides the keys from that table
2459
+ // during iteration.
2460
+ {
2461
+ ReadOptions opts;
2462
+ opts.table_filter = [](const TableProperties& props) {
2463
+ return props.num_entries != 2;
2464
+ };
2465
+ auto iter = NewIterator(opts);
2466
+ iter->SeekToFirst();
2467
+ ASSERT_EQ(IterStatus(iter), "a->1");
2468
+ iter->Next();
2469
+ ASSERT_EQ(IterStatus(iter), "d->4");
2470
+ iter->Next();
2471
+ ASSERT_EQ(IterStatus(iter), "e->5");
2472
+ iter->Next();
2473
+ ASSERT_EQ(IterStatus(iter), "f->6");
2474
+ iter->Next();
2475
+ ASSERT_FALSE(iter->Valid());
2476
+ delete iter;
2477
+ }
2478
+ }
2479
+
2480
+ TEST_P(DBIteratorTest, UpperBoundWithPrevReseek) {
2481
+ Options options = CurrentOptions();
2482
+ options.max_sequential_skip_in_iterations = 3;
2483
+ DestroyAndReopen(options);
2484
+
2485
+ // write a bunch of kvs to the database.
2486
+ ASSERT_OK(Put("a", "1"));
2487
+ ASSERT_OK(Put("y", "1"));
2488
+ ASSERT_OK(Put("z", "1"));
2489
+ ASSERT_OK(Flush());
2490
+ ASSERT_OK(Put("a", "1"));
2491
+ ASSERT_OK(Put("z", "1"));
2492
+ ASSERT_OK(Put("bar", "1"));
2493
+ ASSERT_OK(Put("foo", "1"));
2494
+ ASSERT_OK(Put("foo", "2"));
2495
+
2496
+ ASSERT_OK(Put("foo", "3"));
2497
+ ASSERT_OK(Put("foo", "4"));
2498
+ ASSERT_OK(Put("foo", "5"));
2499
+ const Snapshot* snapshot = db_->GetSnapshot();
2500
+ ASSERT_OK(Put("foo", "6"));
2501
+
2502
+ std::string upper_bound = "x";
2503
+ Slice ub_slice(upper_bound);
2504
+ ReadOptions ro;
2505
+ ro.snapshot = snapshot;
2506
+ ro.iterate_upper_bound = &ub_slice;
2507
+
2508
+ Iterator* iter = NewIterator(ro);
2509
+ iter->SeekForPrev("goo");
2510
+ ASSERT_TRUE(iter->Valid());
2511
+ ASSERT_EQ("foo", iter->key().ToString());
2512
+ iter->Prev();
2513
+
2514
+ ASSERT_TRUE(iter->Valid());
2515
+ ASSERT_EQ("bar", iter->key().ToString());
2516
+
2517
+ delete iter;
2518
+ db_->ReleaseSnapshot(snapshot);
2519
+ }
2520
+
2521
+ TEST_P(DBIteratorTest, SkipStatistics) {
2522
+ Options options = CurrentOptions();
2523
+ options.statistics = ROCKSDB_NAMESPACE::CreateDBStatistics();
2524
+ DestroyAndReopen(options);
2525
+
2526
+ int skip_count = 0;
2527
+
2528
+ // write a bunch of kvs to the database.
2529
+ ASSERT_OK(Put("a", "1"));
2530
+ ASSERT_OK(Put("b", "1"));
2531
+ ASSERT_OK(Put("c", "1"));
2532
+ ASSERT_OK(Flush());
2533
+ ASSERT_OK(Put("d", "1"));
2534
+ ASSERT_OK(Put("e", "1"));
2535
+ ASSERT_OK(Put("f", "1"));
2536
+ ASSERT_OK(Put("a", "2"));
2537
+ ASSERT_OK(Put("b", "2"));
2538
+ ASSERT_OK(Flush());
2539
+ ASSERT_OK(Delete("d"));
2540
+ ASSERT_OK(Delete("e"));
2541
+ ASSERT_OK(Delete("f"));
2542
+
2543
+ Iterator* iter = NewIterator(ReadOptions());
2544
+ int count = 0;
2545
+ for (iter->SeekToFirst(); iter->Valid(); iter->Next()) {
2546
+ ASSERT_OK(iter->status());
2547
+ count++;
2548
+ }
2549
+ ASSERT_EQ(count, 3);
2550
+ delete iter;
2551
+ skip_count += 8; // 3 deletes + 3 original keys + 2 lower in sequence
2552
+ ASSERT_EQ(skip_count, TestGetTickerCount(options, NUMBER_ITER_SKIP));
2553
+
2554
+ iter = NewIterator(ReadOptions());
2555
+ count = 0;
2556
+ for (iter->SeekToLast(); iter->Valid(); iter->Prev()) {
2557
+ ASSERT_OK(iter->status());
2558
+ count++;
2559
+ }
2560
+ ASSERT_EQ(count, 3);
2561
+ delete iter;
2562
+ skip_count += 8; // Same as above, but in reverse order
2563
+ ASSERT_EQ(skip_count, TestGetTickerCount(options, NUMBER_ITER_SKIP));
2564
+
2565
+ ASSERT_OK(Put("aa", "1"));
2566
+ ASSERT_OK(Put("ab", "1"));
2567
+ ASSERT_OK(Put("ac", "1"));
2568
+ ASSERT_OK(Put("ad", "1"));
2569
+ ASSERT_OK(Flush());
2570
+ ASSERT_OK(Delete("ab"));
2571
+ ASSERT_OK(Delete("ac"));
2572
+ ASSERT_OK(Delete("ad"));
2573
+
2574
+ ReadOptions ro;
2575
+ Slice prefix("b");
2576
+ ro.iterate_upper_bound = &prefix;
2577
+
2578
+ iter = NewIterator(ro);
2579
+ count = 0;
2580
+ for(iter->Seek("aa"); iter->Valid(); iter->Next()) {
2581
+ ASSERT_OK(iter->status());
2582
+ count++;
2583
+ }
2584
+ ASSERT_EQ(count, 1);
2585
+ delete iter;
2586
+ skip_count += 6; // 3 deletes + 3 original keys
2587
+ ASSERT_EQ(skip_count, TestGetTickerCount(options, NUMBER_ITER_SKIP));
2588
+
2589
+ iter = NewIterator(ro);
2590
+ count = 0;
2591
+ for(iter->SeekToLast(); iter->Valid(); iter->Prev()) {
2592
+ ASSERT_OK(iter->status());
2593
+ count++;
2594
+ }
2595
+ ASSERT_EQ(count, 2);
2596
+ delete iter;
2597
+ // 3 deletes + 3 original keys + lower sequence of "a"
2598
+ skip_count += 7;
2599
+ ASSERT_EQ(skip_count, TestGetTickerCount(options, NUMBER_ITER_SKIP));
2600
+ }
2601
+
2602
+ TEST_P(DBIteratorTest, SeekAfterHittingManyInternalKeys) {
2603
+ Options options = CurrentOptions();
2604
+ DestroyAndReopen(options);
2605
+ ReadOptions ropts;
2606
+ ropts.max_skippable_internal_keys = 2;
2607
+
2608
+ ASSERT_OK(Put("1", "val_1"));
2609
+ // Add more tombstones than max_skippable_internal_keys so that Next() fails.
2610
+ ASSERT_OK(Delete("2"));
2611
+ ASSERT_OK(Delete("3"));
2612
+ ASSERT_OK(Delete("4"));
2613
+ ASSERT_OK(Delete("5"));
2614
+ ASSERT_OK(Put("6", "val_6"));
2615
+
2616
+ std::unique_ptr<Iterator> iter(NewIterator(ropts));
2617
+ iter->SeekToFirst();
2618
+
2619
+ ASSERT_TRUE(iter->Valid());
2620
+ ASSERT_EQ(iter->key().ToString(), "1");
2621
+ ASSERT_EQ(iter->value().ToString(), "val_1");
2622
+
2623
+ // This should fail as incomplete due to too many non-visible internal keys on
2624
+ // the way to the next valid user key.
2625
+ iter->Next();
2626
+ ASSERT_TRUE(!iter->Valid());
2627
+ ASSERT_TRUE(iter->status().IsIncomplete());
2628
+
2629
+ // Get the internal key at which Next() failed.
2630
+ std::string prop_value;
2631
+ ASSERT_OK(iter->GetProperty("rocksdb.iterator.internal-key", &prop_value));
2632
+ ASSERT_EQ("4", prop_value);
2633
+
2634
+ // Create a new iterator to seek to the internal key.
2635
+ std::unique_ptr<Iterator> iter2(NewIterator(ropts));
2636
+ iter2->Seek(prop_value);
2637
+ ASSERT_TRUE(iter2->Valid());
2638
+ ASSERT_OK(iter2->status());
2639
+
2640
+ ASSERT_EQ(iter2->key().ToString(), "6");
2641
+ ASSERT_EQ(iter2->value().ToString(), "val_6");
2642
+ }
2643
+
2644
+ // Reproduces a former bug where iterator would skip some records when DBIter
2645
+ // re-seeks subiterator with Incomplete status.
2646
+ TEST_P(DBIteratorTest, NonBlockingIterationBugRepro) {
2647
+ Options options = CurrentOptions();
2648
+ BlockBasedTableOptions table_options;
2649
+ // Make sure the sst file has more than one block.
2650
+ table_options.flush_block_policy_factory =
2651
+ std::make_shared<FlushBlockEveryKeyPolicyFactory>();
2652
+ options.table_factory.reset(NewBlockBasedTableFactory(table_options));
2653
+ DestroyAndReopen(options);
2654
+
2655
+ // Two records in sst file, each in its own block.
2656
+ ASSERT_OK(Put("b", ""));
2657
+ ASSERT_OK(Put("d", ""));
2658
+ ASSERT_OK(Flush());
2659
+
2660
+ // Create a nonblocking iterator before writing to memtable.
2661
+ ReadOptions ropt;
2662
+ ropt.read_tier = kBlockCacheTier;
2663
+ std::unique_ptr<Iterator> iter(NewIterator(ropt));
2664
+
2665
+ // Overwrite a key in memtable many times to hit
2666
+ // max_sequential_skip_in_iterations (which is 8 by default).
2667
+ for (int i = 0; i < 20; ++i) {
2668
+ ASSERT_OK(Put("c", ""));
2669
+ }
2670
+
2671
+ // Load the second block in sst file into the block cache.
2672
+ {
2673
+ std::unique_ptr<Iterator> iter2(NewIterator(ReadOptions()));
2674
+ iter2->Seek("d");
2675
+ }
2676
+
2677
+ // Finally seek the nonblocking iterator.
2678
+ iter->Seek("a");
2679
+ // With the bug, the status used to be OK, and the iterator used to point to
2680
+ // "d".
2681
+ EXPECT_TRUE(iter->status().IsIncomplete());
2682
+ }
2683
+
2684
+ TEST_P(DBIteratorTest, SeekBackwardAfterOutOfUpperBound) {
2685
+ ASSERT_OK(Put("a", ""));
2686
+ ASSERT_OK(Put("b", ""));
2687
+ ASSERT_OK(Flush());
2688
+
2689
+ ReadOptions ropt;
2690
+ Slice ub = "b";
2691
+ ropt.iterate_upper_bound = &ub;
2692
+
2693
+ std::unique_ptr<Iterator> it(dbfull()->NewIterator(ropt));
2694
+ it->SeekForPrev("a");
2695
+ ASSERT_TRUE(it->Valid());
2696
+ ASSERT_OK(it->status());
2697
+ ASSERT_EQ("a", it->key().ToString());
2698
+ it->Next();
2699
+ ASSERT_FALSE(it->Valid());
2700
+ ASSERT_OK(it->status());
2701
+ it->SeekForPrev("a");
2702
+ ASSERT_OK(it->status());
2703
+
2704
+ ASSERT_TRUE(it->Valid());
2705
+ ASSERT_EQ("a", it->key().ToString());
2706
+ }
2707
+
2708
+ TEST_P(DBIteratorTest, AvoidReseekLevelIterator) {
2709
+ Options options = CurrentOptions();
2710
+ options.compression = CompressionType::kNoCompression;
2711
+ BlockBasedTableOptions table_options;
2712
+ table_options.block_size = 800;
2713
+ options.table_factory.reset(NewBlockBasedTableFactory(table_options));
2714
+ Reopen(options);
2715
+
2716
+ Random rnd(301);
2717
+ std::string random_str = rnd.RandomString(180);
2718
+
2719
+ ASSERT_OK(Put("1", random_str));
2720
+ ASSERT_OK(Put("2", random_str));
2721
+ ASSERT_OK(Put("3", random_str));
2722
+ ASSERT_OK(Put("4", random_str));
2723
+ // A new block
2724
+ ASSERT_OK(Put("5", random_str));
2725
+ ASSERT_OK(Put("6", random_str));
2726
+ ASSERT_OK(Put("7", random_str));
2727
+ ASSERT_OK(Flush());
2728
+ ASSERT_OK(Put("8", random_str));
2729
+ ASSERT_OK(Put("9", random_str));
2730
+ ASSERT_OK(Flush());
2731
+ ASSERT_OK(db_->CompactRange(CompactRangeOptions(), nullptr, nullptr));
2732
+
2733
+ int num_find_file_in_level = 0;
2734
+ int num_idx_blk_seek = 0;
2735
+ SyncPoint::GetInstance()->SetCallBack(
2736
+ "LevelIterator::Seek:BeforeFindFile",
2737
+ [&](void* /*arg*/) { num_find_file_in_level++; });
2738
+ SyncPoint::GetInstance()->SetCallBack(
2739
+ "IndexBlockIter::Seek:0", [&](void* /*arg*/) { num_idx_blk_seek++; });
2740
+ SyncPoint::GetInstance()->EnableProcessing();
2741
+
2742
+ {
2743
+ std::unique_ptr<Iterator> iter(NewIterator(ReadOptions()));
2744
+ iter->Seek("1");
2745
+ ASSERT_TRUE(iter->Valid());
2746
+ ASSERT_EQ(1, num_find_file_in_level);
2747
+ ASSERT_EQ(1, num_idx_blk_seek);
2748
+
2749
+ iter->Seek("2");
2750
+ ASSERT_TRUE(iter->Valid());
2751
+ ASSERT_EQ(1, num_find_file_in_level);
2752
+ ASSERT_EQ(1, num_idx_blk_seek);
2753
+
2754
+ iter->Seek("3");
2755
+ ASSERT_TRUE(iter->Valid());
2756
+ ASSERT_EQ(1, num_find_file_in_level);
2757
+ ASSERT_EQ(1, num_idx_blk_seek);
2758
+
2759
+ iter->Next();
2760
+ ASSERT_TRUE(iter->Valid());
2761
+ ASSERT_EQ(1, num_find_file_in_level);
2762
+ ASSERT_EQ(1, num_idx_blk_seek);
2763
+
2764
+ iter->Seek("5");
2765
+ ASSERT_TRUE(iter->Valid());
2766
+ ASSERT_EQ(1, num_find_file_in_level);
2767
+ ASSERT_EQ(2, num_idx_blk_seek);
2768
+
2769
+ iter->Seek("6");
2770
+ ASSERT_TRUE(iter->Valid());
2771
+ ASSERT_EQ(1, num_find_file_in_level);
2772
+ ASSERT_EQ(2, num_idx_blk_seek);
2773
+
2774
+ iter->Seek("7");
2775
+ ASSERT_TRUE(iter->Valid());
2776
+ ASSERT_EQ(1, num_find_file_in_level);
2777
+ ASSERT_EQ(3, num_idx_blk_seek);
2778
+
2779
+ iter->Seek("8");
2780
+ ASSERT_TRUE(iter->Valid());
2781
+ ASSERT_EQ(2, num_find_file_in_level);
2782
+ // Still re-seek because "8" is the boundary key, which has
2783
+ // the same user key as the seek key.
2784
+ ASSERT_EQ(4, num_idx_blk_seek);
2785
+
2786
+ iter->Seek("5");
2787
+ ASSERT_TRUE(iter->Valid());
2788
+ ASSERT_EQ(3, num_find_file_in_level);
2789
+ ASSERT_EQ(5, num_idx_blk_seek);
2790
+
2791
+ iter->Next();
2792
+ ASSERT_TRUE(iter->Valid());
2793
+ ASSERT_EQ(3, num_find_file_in_level);
2794
+ ASSERT_EQ(5, num_idx_blk_seek);
2795
+
2796
+ // Seek backward never triggers the index block seek to be skipped
2797
+ iter->Seek("5");
2798
+ ASSERT_TRUE(iter->Valid());
2799
+ ASSERT_EQ(3, num_find_file_in_level);
2800
+ ASSERT_EQ(6, num_idx_blk_seek);
2801
+ }
2802
+
2803
+ SyncPoint::GetInstance()->DisableProcessing();
2804
+ }
2805
+
2806
+ // MyRocks may change iterate bounds before seek. Simply test to make sure such
2807
+ // usage doesn't break iterator.
2808
+ TEST_P(DBIteratorTest, IterateBoundChangedBeforeSeek) {
2809
+ Options options = CurrentOptions();
2810
+ options.compression = CompressionType::kNoCompression;
2811
+ BlockBasedTableOptions table_options;
2812
+ table_options.block_size = 100;
2813
+ options.table_factory.reset(NewBlockBasedTableFactory(table_options));
2814
+ std::string value(50, 'v');
2815
+ Reopen(options);
2816
+ ASSERT_OK(Put("aaa", value));
2817
+ ASSERT_OK(Flush());
2818
+ ASSERT_OK(Put("bbb", "v"));
2819
+ ASSERT_OK(Put("ccc", "v"));
2820
+ ASSERT_OK(Put("ddd", "v"));
2821
+ ASSERT_OK(Flush());
2822
+ ASSERT_OK(Put("eee", "v"));
2823
+ ASSERT_OK(Flush());
2824
+ ASSERT_OK(db_->CompactRange(CompactRangeOptions(), nullptr, nullptr));
2825
+
2826
+ std::string ub1 = "e";
2827
+ std::string ub2 = "c";
2828
+ Slice ub(ub1);
2829
+ ReadOptions read_opts1;
2830
+ read_opts1.iterate_upper_bound = &ub;
2831
+ Iterator* iter = NewIterator(read_opts1);
2832
+ // Seek and iterate accross block boundary.
2833
+ iter->Seek("b");
2834
+ ASSERT_TRUE(iter->Valid());
2835
+ ASSERT_OK(iter->status());
2836
+ ASSERT_EQ("bbb", iter->key());
2837
+ ub = Slice(ub2);
2838
+ iter->Seek("b");
2839
+ ASSERT_TRUE(iter->Valid());
2840
+ ASSERT_OK(iter->status());
2841
+ ASSERT_EQ("bbb", iter->key());
2842
+ iter->Next();
2843
+ ASSERT_FALSE(iter->Valid());
2844
+ ASSERT_OK(iter->status());
2845
+ delete iter;
2846
+
2847
+ std::string lb1 = "a";
2848
+ std::string lb2 = "c";
2849
+ Slice lb(lb1);
2850
+ ReadOptions read_opts2;
2851
+ read_opts2.iterate_lower_bound = &lb;
2852
+ iter = NewIterator(read_opts2);
2853
+ iter->SeekForPrev("d");
2854
+ ASSERT_TRUE(iter->Valid());
2855
+ ASSERT_OK(iter->status());
2856
+ ASSERT_EQ("ccc", iter->key());
2857
+ lb = Slice(lb2);
2858
+ iter->SeekForPrev("d");
2859
+ ASSERT_TRUE(iter->Valid());
2860
+ ASSERT_OK(iter->status());
2861
+ ASSERT_EQ("ccc", iter->key());
2862
+ iter->Prev();
2863
+ ASSERT_FALSE(iter->Valid());
2864
+ ASSERT_OK(iter->status());
2865
+ delete iter;
2866
+ }
2867
+
2868
+ TEST_P(DBIteratorTest, IterateWithLowerBoundAcrossFileBoundary) {
2869
+ ASSERT_OK(Put("aaa", "v"));
2870
+ ASSERT_OK(Put("bbb", "v"));
2871
+ ASSERT_OK(Flush());
2872
+ ASSERT_OK(Put("ccc", "v"));
2873
+ ASSERT_OK(Put("ddd", "v"));
2874
+ ASSERT_OK(Flush());
2875
+ // Move both files to bottom level.
2876
+ ASSERT_OK(dbfull()->CompactRange(CompactRangeOptions(), nullptr, nullptr));
2877
+ Slice lower_bound("b");
2878
+ ReadOptions read_opts;
2879
+ read_opts.iterate_lower_bound = &lower_bound;
2880
+ std::unique_ptr<Iterator> iter(NewIterator(read_opts));
2881
+ iter->SeekForPrev("d");
2882
+ ASSERT_TRUE(iter->Valid());
2883
+ ASSERT_OK(iter->status());
2884
+ ASSERT_EQ("ccc", iter->key());
2885
+ iter->Prev();
2886
+ ASSERT_TRUE(iter->Valid());
2887
+ ASSERT_OK(iter->status());
2888
+ ASSERT_EQ("bbb", iter->key());
2889
+ iter->Prev();
2890
+ ASSERT_FALSE(iter->Valid());
2891
+ ASSERT_OK(iter->status());
2892
+ }
2893
+
2894
+ TEST_P(DBIteratorTest, Blob) {
2895
+ Options options = CurrentOptions();
2896
+ options.enable_blob_files = true;
2897
+ options.max_sequential_skip_in_iterations = 2;
2898
+ options.statistics = CreateDBStatistics();
2899
+
2900
+ Reopen(options);
2901
+
2902
+ // Note: we have 4 KVs (3 of which are hidden) for key "b" and
2903
+ // max_sequential_skip_in_iterations is set to 2. Thus, we need to do a reseek
2904
+ // anytime we move from "b" to "c" or vice versa.
2905
+ ASSERT_OK(Put("a", "va"));
2906
+ ASSERT_OK(Flush());
2907
+ ASSERT_OK(Put("b", "vb0"));
2908
+ ASSERT_OK(Flush());
2909
+ ASSERT_OK(Put("b", "vb1"));
2910
+ ASSERT_OK(Flush());
2911
+ ASSERT_OK(Put("b", "vb2"));
2912
+ ASSERT_OK(Flush());
2913
+ ASSERT_OK(Put("b", "vb3"));
2914
+ ASSERT_OK(Flush());
2915
+ ASSERT_OK(Put("c", "vc"));
2916
+ ASSERT_OK(Flush());
2917
+
2918
+ std::unique_ptr<Iterator> iter_guard(NewIterator(ReadOptions()));
2919
+ Iterator* const iter = iter_guard.get();
2920
+
2921
+ iter->SeekToFirst();
2922
+ ASSERT_EQ(TestGetTickerCount(options, NUMBER_OF_RESEEKS_IN_ITERATION), 0);
2923
+ ASSERT_EQ(IterStatus(iter), "a->va");
2924
+ iter->Next();
2925
+ ASSERT_EQ(TestGetTickerCount(options, NUMBER_OF_RESEEKS_IN_ITERATION), 0);
2926
+ ASSERT_EQ(IterStatus(iter), "b->vb3");
2927
+ iter->Next();
2928
+ ASSERT_EQ(TestGetTickerCount(options, NUMBER_OF_RESEEKS_IN_ITERATION), 1);
2929
+ ASSERT_EQ(IterStatus(iter), "c->vc");
2930
+ iter->Next();
2931
+ ASSERT_EQ(TestGetTickerCount(options, NUMBER_OF_RESEEKS_IN_ITERATION), 1);
2932
+ ASSERT_EQ(IterStatus(iter), "(invalid)");
2933
+ iter->SeekToFirst();
2934
+ ASSERT_EQ(TestGetTickerCount(options, NUMBER_OF_RESEEKS_IN_ITERATION), 1);
2935
+ ASSERT_EQ(IterStatus(iter), "a->va");
2936
+ iter->Prev();
2937
+ ASSERT_EQ(TestGetTickerCount(options, NUMBER_OF_RESEEKS_IN_ITERATION), 1);
2938
+ ASSERT_EQ(IterStatus(iter), "(invalid)");
2939
+
2940
+ iter->SeekToLast();
2941
+ ASSERT_EQ(TestGetTickerCount(options, NUMBER_OF_RESEEKS_IN_ITERATION), 1);
2942
+ ASSERT_EQ(IterStatus(iter), "c->vc");
2943
+ iter->Prev();
2944
+ ASSERT_EQ(TestGetTickerCount(options, NUMBER_OF_RESEEKS_IN_ITERATION), 2);
2945
+ ASSERT_EQ(IterStatus(iter), "b->vb3");
2946
+ iter->Prev();
2947
+ ASSERT_EQ(TestGetTickerCount(options, NUMBER_OF_RESEEKS_IN_ITERATION), 2);
2948
+ ASSERT_EQ(IterStatus(iter), "a->va");
2949
+ iter->Prev();
2950
+ ASSERT_EQ(TestGetTickerCount(options, NUMBER_OF_RESEEKS_IN_ITERATION), 2);
2951
+ ASSERT_EQ(IterStatus(iter), "(invalid)");
2952
+ iter->SeekToLast();
2953
+ ASSERT_EQ(TestGetTickerCount(options, NUMBER_OF_RESEEKS_IN_ITERATION), 2);
2954
+ ASSERT_EQ(IterStatus(iter), "c->vc");
2955
+ iter->Next();
2956
+ ASSERT_EQ(TestGetTickerCount(options, NUMBER_OF_RESEEKS_IN_ITERATION), 2);
2957
+ ASSERT_EQ(IterStatus(iter), "(invalid)");
2958
+
2959
+ iter->Seek("");
2960
+ ASSERT_EQ(TestGetTickerCount(options, NUMBER_OF_RESEEKS_IN_ITERATION), 2);
2961
+ ASSERT_EQ(IterStatus(iter), "a->va");
2962
+ iter->Seek("a");
2963
+ ASSERT_EQ(TestGetTickerCount(options, NUMBER_OF_RESEEKS_IN_ITERATION), 2);
2964
+ ASSERT_EQ(IterStatus(iter), "a->va");
2965
+ iter->Seek("ax");
2966
+ ASSERT_EQ(TestGetTickerCount(options, NUMBER_OF_RESEEKS_IN_ITERATION), 2);
2967
+ ASSERT_EQ(IterStatus(iter), "b->vb3");
2968
+
2969
+ iter->SeekForPrev("d");
2970
+ ASSERT_EQ(TestGetTickerCount(options, NUMBER_OF_RESEEKS_IN_ITERATION), 2);
2971
+ ASSERT_EQ(IterStatus(iter), "c->vc");
2972
+ iter->SeekForPrev("c");
2973
+ ASSERT_EQ(TestGetTickerCount(options, NUMBER_OF_RESEEKS_IN_ITERATION), 2);
2974
+ ASSERT_EQ(IterStatus(iter), "c->vc");
2975
+ iter->SeekForPrev("bx");
2976
+ ASSERT_EQ(TestGetTickerCount(options, NUMBER_OF_RESEEKS_IN_ITERATION), 3);
2977
+ ASSERT_EQ(IterStatus(iter), "b->vb3");
2978
+
2979
+ iter->Seek("b");
2980
+ ASSERT_EQ(TestGetTickerCount(options, NUMBER_OF_RESEEKS_IN_ITERATION), 3);
2981
+ ASSERT_EQ(IterStatus(iter), "b->vb3");
2982
+ iter->Seek("z");
2983
+ ASSERT_EQ(TestGetTickerCount(options, NUMBER_OF_RESEEKS_IN_ITERATION), 3);
2984
+ ASSERT_EQ(IterStatus(iter), "(invalid)");
2985
+ iter->SeekForPrev("b");
2986
+ ASSERT_EQ(TestGetTickerCount(options, NUMBER_OF_RESEEKS_IN_ITERATION), 4);
2987
+ ASSERT_EQ(IterStatus(iter), "b->vb3");
2988
+ iter->SeekForPrev("");
2989
+ ASSERT_EQ(TestGetTickerCount(options, NUMBER_OF_RESEEKS_IN_ITERATION), 4);
2990
+ ASSERT_EQ(IterStatus(iter), "(invalid)");
2991
+
2992
+ // Switch from reverse to forward
2993
+ iter->SeekToLast();
2994
+ ASSERT_EQ(TestGetTickerCount(options, NUMBER_OF_RESEEKS_IN_ITERATION), 4);
2995
+ iter->Prev();
2996
+ ASSERT_EQ(TestGetTickerCount(options, NUMBER_OF_RESEEKS_IN_ITERATION), 5);
2997
+ iter->Prev();
2998
+ ASSERT_EQ(TestGetTickerCount(options, NUMBER_OF_RESEEKS_IN_ITERATION), 5);
2999
+ iter->Next();
3000
+ ASSERT_EQ(TestGetTickerCount(options, NUMBER_OF_RESEEKS_IN_ITERATION), 5);
3001
+ ASSERT_EQ(IterStatus(iter), "b->vb3");
3002
+
3003
+ // Switch from forward to reverse
3004
+ iter->SeekToFirst();
3005
+ ASSERT_EQ(TestGetTickerCount(options, NUMBER_OF_RESEEKS_IN_ITERATION), 5);
3006
+ iter->Next();
3007
+ ASSERT_EQ(TestGetTickerCount(options, NUMBER_OF_RESEEKS_IN_ITERATION), 5);
3008
+ iter->Next();
3009
+ ASSERT_EQ(TestGetTickerCount(options, NUMBER_OF_RESEEKS_IN_ITERATION), 6);
3010
+ iter->Prev();
3011
+ ASSERT_EQ(TestGetTickerCount(options, NUMBER_OF_RESEEKS_IN_ITERATION), 7);
3012
+ ASSERT_EQ(IterStatus(iter), "b->vb3");
3013
+ }
3014
+
3015
+ INSTANTIATE_TEST_CASE_P(DBIteratorTestInstance, DBIteratorTest,
3016
+ testing::Values(true, false));
3017
+
3018
+ // Tests how DBIter work with ReadCallback
3019
+ class DBIteratorWithReadCallbackTest : public DBIteratorTest {};
3020
+
3021
+ TEST_F(DBIteratorWithReadCallbackTest, ReadCallback) {
3022
+ class TestReadCallback : public ReadCallback {
3023
+ public:
3024
+ explicit TestReadCallback(SequenceNumber _max_visible_seq)
3025
+ : ReadCallback(_max_visible_seq) {}
3026
+
3027
+ bool IsVisibleFullCheck(SequenceNumber seq) override {
3028
+ return seq <= max_visible_seq_;
3029
+ }
3030
+ };
3031
+
3032
+ ASSERT_OK(Put("foo", "v1"));
3033
+ ASSERT_OK(Put("foo", "v2"));
3034
+ ASSERT_OK(Put("foo", "v3"));
3035
+ ASSERT_OK(Put("a", "va"));
3036
+ ASSERT_OK(Put("z", "vz"));
3037
+ SequenceNumber seq1 = db_->GetLatestSequenceNumber();
3038
+ TestReadCallback callback1(seq1);
3039
+ ASSERT_OK(Put("foo", "v4"));
3040
+ ASSERT_OK(Put("foo", "v5"));
3041
+ ASSERT_OK(Put("bar", "v7"));
3042
+
3043
+ SequenceNumber seq2 = db_->GetLatestSequenceNumber();
3044
+ auto* cfd =
3045
+ static_cast_with_check<ColumnFamilyHandleImpl>(db_->DefaultColumnFamily())
3046
+ ->cfd();
3047
+ // The iterator are suppose to see data before seq1.
3048
+ Iterator* iter =
3049
+ dbfull()->NewIteratorImpl(ReadOptions(), cfd, seq2, &callback1);
3050
+
3051
+ // Seek
3052
+ // The latest value of "foo" before seq1 is "v3"
3053
+ iter->Seek("foo");
3054
+ ASSERT_TRUE(iter->Valid());
3055
+ ASSERT_OK(iter->status());
3056
+ ASSERT_EQ("foo", iter->key());
3057
+ ASSERT_EQ("v3", iter->value());
3058
+ // "bar" is not visible to the iterator. It will move on to the next key
3059
+ // "foo".
3060
+ iter->Seek("bar");
3061
+ ASSERT_TRUE(iter->Valid());
3062
+ ASSERT_OK(iter->status());
3063
+ ASSERT_EQ("foo", iter->key());
3064
+ ASSERT_EQ("v3", iter->value());
3065
+
3066
+ // Next
3067
+ // Seek to "a"
3068
+ iter->Seek("a");
3069
+ ASSERT_TRUE(iter->Valid());
3070
+ ASSERT_OK(iter->status());
3071
+ ASSERT_EQ("va", iter->value());
3072
+ // "bar" is not visible to the iterator. It will move on to the next key
3073
+ // "foo".
3074
+ iter->Next();
3075
+ ASSERT_TRUE(iter->Valid());
3076
+ ASSERT_OK(iter->status());
3077
+ ASSERT_EQ("foo", iter->key());
3078
+ ASSERT_EQ("v3", iter->value());
3079
+
3080
+ // Prev
3081
+ // Seek to "z"
3082
+ iter->Seek("z");
3083
+ ASSERT_TRUE(iter->Valid());
3084
+ ASSERT_OK(iter->status());
3085
+ ASSERT_EQ("vz", iter->value());
3086
+ // The previous key is "foo", which is visible to the iterator.
3087
+ iter->Prev();
3088
+ ASSERT_TRUE(iter->Valid());
3089
+ ASSERT_OK(iter->status());
3090
+ ASSERT_EQ("foo", iter->key());
3091
+ ASSERT_EQ("v3", iter->value());
3092
+ // "bar" is not visible to the iterator. It will move on to the next key "a".
3093
+ iter->Prev(); // skipping "bar"
3094
+ ASSERT_TRUE(iter->Valid());
3095
+ ASSERT_OK(iter->status());
3096
+ ASSERT_EQ("a", iter->key());
3097
+ ASSERT_EQ("va", iter->value());
3098
+
3099
+ // SeekForPrev
3100
+ // The previous key is "foo", which is visible to the iterator.
3101
+ iter->SeekForPrev("y");
3102
+ ASSERT_TRUE(iter->Valid());
3103
+ ASSERT_OK(iter->status());
3104
+ ASSERT_EQ("foo", iter->key());
3105
+ ASSERT_EQ("v3", iter->value());
3106
+ // "bar" is not visible to the iterator. It will move on to the next key "a".
3107
+ iter->SeekForPrev("bar");
3108
+ ASSERT_TRUE(iter->Valid());
3109
+ ASSERT_OK(iter->status());
3110
+ ASSERT_EQ("a", iter->key());
3111
+ ASSERT_EQ("va", iter->value());
3112
+
3113
+ delete iter;
3114
+
3115
+ // Prev beyond max_sequential_skip_in_iterations
3116
+ uint64_t num_versions =
3117
+ CurrentOptions().max_sequential_skip_in_iterations + 10;
3118
+ for (uint64_t i = 0; i < num_versions; i++) {
3119
+ ASSERT_OK(Put("bar", ToString(i)));
3120
+ }
3121
+ SequenceNumber seq3 = db_->GetLatestSequenceNumber();
3122
+ TestReadCallback callback2(seq3);
3123
+ ASSERT_OK(Put("bar", "v8"));
3124
+ SequenceNumber seq4 = db_->GetLatestSequenceNumber();
3125
+
3126
+ // The iterator is suppose to see data before seq3.
3127
+ iter = dbfull()->NewIteratorImpl(ReadOptions(), cfd, seq4, &callback2);
3128
+ // Seek to "z", which is visible.
3129
+ iter->Seek("z");
3130
+ ASSERT_TRUE(iter->Valid());
3131
+ ASSERT_OK(iter->status());
3132
+ ASSERT_EQ("vz", iter->value());
3133
+ // Previous key is "foo" and the last value "v5" is visible.
3134
+ iter->Prev();
3135
+ ASSERT_TRUE(iter->Valid());
3136
+ ASSERT_OK(iter->status());
3137
+ ASSERT_EQ("foo", iter->key());
3138
+ ASSERT_EQ("v5", iter->value());
3139
+ // Since the number of values of "bar" is more than
3140
+ // max_sequential_skip_in_iterations, Prev() will ultimately fallback to
3141
+ // seek in forward direction. Here we test the fallback seek is correct.
3142
+ // The last visible value should be (num_versions - 1), as "v8" is not
3143
+ // visible.
3144
+ iter->Prev();
3145
+ ASSERT_TRUE(iter->Valid());
3146
+ ASSERT_OK(iter->status());
3147
+ ASSERT_EQ("bar", iter->key());
3148
+ ASSERT_EQ(ToString(num_versions - 1), iter->value());
3149
+
3150
+ delete iter;
3151
+ }
3152
+
3153
+ TEST_F(DBIteratorTest, BackwardIterationOnInplaceUpdateMemtable) {
3154
+ Options options = CurrentOptions();
3155
+ options.create_if_missing = true;
3156
+ options.inplace_update_support = false;
3157
+ options.env = env_;
3158
+ DestroyAndReopen(options);
3159
+ constexpr int kNumKeys = 10;
3160
+
3161
+ // Write kNumKeys to WAL.
3162
+ for (int i = 0; i < kNumKeys; ++i) {
3163
+ ASSERT_OK(Put(Key(i), "val"));
3164
+ }
3165
+ ReadOptions read_opts;
3166
+ read_opts.total_order_seek = true;
3167
+ {
3168
+ std::unique_ptr<Iterator> iter(db_->NewIterator(read_opts));
3169
+ int count = 0;
3170
+ for (iter->SeekToLast(); iter->Valid(); iter->Prev()) {
3171
+ ++count;
3172
+ }
3173
+ ASSERT_EQ(kNumKeys, count);
3174
+ }
3175
+
3176
+ // Reopen and rebuild the memtable from WAL.
3177
+ options.create_if_missing = false;
3178
+ options.avoid_flush_during_recovery = true;
3179
+ options.inplace_update_support = true;
3180
+ options.allow_concurrent_memtable_write = false;
3181
+ Reopen(options);
3182
+ {
3183
+ std::unique_ptr<Iterator> iter(db_->NewIterator(read_opts));
3184
+ iter->SeekToLast();
3185
+ // Backward iteration not supported due to inplace_update_support = true.
3186
+ ASSERT_TRUE(iter->status().IsNotSupported());
3187
+ ASSERT_FALSE(iter->Valid());
3188
+ }
3189
+ }
3190
+
3191
+ } // namespace ROCKSDB_NAMESPACE
3192
+
3193
+ int main(int argc, char** argv) {
3194
+ ROCKSDB_NAMESPACE::port::InstallStackTraceHandler();
3195
+ ::testing::InitGoogleTest(&argc, argv);
3196
+ return RUN_ALL_TESTS();
3197
+ }