@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,1694 @@
1
+ // Copyright (c) 2016-present, Facebook, Inc. All rights reserved.
2
+ // This source code is licensed under both the GPLv2 (found in the
3
+ // COPYING file in the root directory) and Apache 2.0 License
4
+ // (found in the LICENSE.Apache file in the root directory).
5
+
6
+ #include "db/db_test_util.h"
7
+ #include "port/stack_trace.h"
8
+ #include "rocksdb/utilities/write_batch_with_index.h"
9
+ #include "test_util/testutil.h"
10
+ #include "util/random.h"
11
+ #include "utilities/merge_operators.h"
12
+
13
+ namespace ROCKSDB_NAMESPACE {
14
+
15
+ class DBRangeDelTest : public DBTestBase {
16
+ public:
17
+ DBRangeDelTest() : DBTestBase("/db_range_del_test", /*env_do_fsync=*/false) {}
18
+
19
+ std::string GetNumericStr(int key) {
20
+ uint64_t uint64_key = static_cast<uint64_t>(key);
21
+ std::string str;
22
+ str.resize(8);
23
+ memcpy(&str[0], static_cast<void*>(&uint64_key), 8);
24
+ return str;
25
+ }
26
+ };
27
+
28
+ // PlainTableFactory, WriteBatchWithIndex, and NumTableFilesAtLevel() are not
29
+ // supported in ROCKSDB_LITE
30
+ #ifndef ROCKSDB_LITE
31
+ TEST_F(DBRangeDelTest, NonBlockBasedTableNotSupported) {
32
+ // TODO: figure out why MmapReads trips the iterator pinning assertion in
33
+ // RangeDelAggregator. Ideally it would be supported; otherwise it should at
34
+ // least be explicitly unsupported.
35
+ for (auto config : {kPlainTableAllBytesPrefix, /* kWalDirAndMmapReads */}) {
36
+ option_config_ = config;
37
+ DestroyAndReopen(CurrentOptions());
38
+ ASSERT_TRUE(db_->DeleteRange(WriteOptions(), db_->DefaultColumnFamily(),
39
+ "dr1", "dr1")
40
+ .IsNotSupported());
41
+ }
42
+ }
43
+
44
+ TEST_F(DBRangeDelTest, WriteBatchWithIndexNotSupported) {
45
+ WriteBatchWithIndex indexedBatch{};
46
+ ASSERT_TRUE(indexedBatch.DeleteRange(db_->DefaultColumnFamily(), "dr1", "dr1")
47
+ .IsNotSupported());
48
+ ASSERT_TRUE(indexedBatch.DeleteRange("dr1", "dr1").IsNotSupported());
49
+ }
50
+
51
+ TEST_F(DBRangeDelTest, EndSameAsStartCoversNothing) {
52
+ ASSERT_OK(db_->Put(WriteOptions(), "b", "val"));
53
+ ASSERT_OK(
54
+ db_->DeleteRange(WriteOptions(), db_->DefaultColumnFamily(), "b", "b"));
55
+ ASSERT_EQ("val", Get("b"));
56
+ }
57
+
58
+ TEST_F(DBRangeDelTest, EndComesBeforeStartInvalidArgument) {
59
+ ASSERT_OK(db_->Put(WriteOptions(), "b", "val"));
60
+ ASSERT_TRUE(
61
+ db_->DeleteRange(WriteOptions(), db_->DefaultColumnFamily(), "b", "a")
62
+ .IsInvalidArgument());
63
+ ASSERT_EQ("val", Get("b"));
64
+ }
65
+
66
+ TEST_F(DBRangeDelTest, FlushOutputHasOnlyRangeTombstones) {
67
+ do {
68
+ DestroyAndReopen(CurrentOptions());
69
+ ASSERT_OK(db_->DeleteRange(WriteOptions(), db_->DefaultColumnFamily(),
70
+ "dr1", "dr2"));
71
+ ASSERT_OK(db_->Flush(FlushOptions()));
72
+ ASSERT_EQ(1, NumTableFilesAtLevel(0));
73
+ } while (ChangeOptions(kRangeDelSkipConfigs));
74
+ }
75
+
76
+ TEST_F(DBRangeDelTest, CompactionOutputHasOnlyRangeTombstone) {
77
+ do {
78
+ Options opts = CurrentOptions();
79
+ opts.disable_auto_compactions = true;
80
+ opts.statistics = CreateDBStatistics();
81
+ DestroyAndReopen(opts);
82
+
83
+ // snapshot protects range tombstone from dropping due to becoming obsolete.
84
+ const Snapshot* snapshot = db_->GetSnapshot();
85
+ ASSERT_OK(
86
+ db_->DeleteRange(WriteOptions(), db_->DefaultColumnFamily(), "a", "z"));
87
+ ASSERT_OK(db_->Flush(FlushOptions()));
88
+
89
+ ASSERT_EQ(1, NumTableFilesAtLevel(0));
90
+ ASSERT_EQ(0, NumTableFilesAtLevel(1));
91
+ ASSERT_OK(dbfull()->TEST_CompactRange(0, nullptr, nullptr, nullptr,
92
+ true /* disallow_trivial_move */));
93
+ ASSERT_EQ(0, NumTableFilesAtLevel(0));
94
+ ASSERT_EQ(1, NumTableFilesAtLevel(1));
95
+ ASSERT_EQ(0, TestGetTickerCount(opts, COMPACTION_RANGE_DEL_DROP_OBSOLETE));
96
+ db_->ReleaseSnapshot(snapshot);
97
+ // Skip cuckoo memtables, which do not support snapshots. Skip non-leveled
98
+ // compactions as the above assertions about the number of files in a level
99
+ // do not hold true.
100
+ } while (ChangeOptions(kRangeDelSkipConfigs | kSkipUniversalCompaction |
101
+ kSkipFIFOCompaction));
102
+ }
103
+
104
+ TEST_F(DBRangeDelTest, CompactionOutputFilesExactlyFilled) {
105
+ // regression test for exactly filled compaction output files. Previously
106
+ // another file would be generated containing all range deletions, which
107
+ // could invalidate the non-overlapping file boundary invariant.
108
+ const int kNumPerFile = 4, kNumFiles = 2, kFileBytes = 9 << 10;
109
+ Options options = CurrentOptions();
110
+ options.disable_auto_compactions = true;
111
+ options.level0_file_num_compaction_trigger = kNumFiles;
112
+ options.memtable_factory.reset(new SpecialSkipListFactory(kNumPerFile));
113
+ options.num_levels = 2;
114
+ options.target_file_size_base = kFileBytes;
115
+ BlockBasedTableOptions table_options;
116
+ table_options.block_size_deviation = 50; // each block holds two keys
117
+ options.table_factory.reset(NewBlockBasedTableFactory(table_options));
118
+ Reopen(options);
119
+
120
+ // snapshot protects range tombstone from dropping due to becoming obsolete.
121
+ const Snapshot* snapshot = db_->GetSnapshot();
122
+ ASSERT_OK(db_->DeleteRange(WriteOptions(), db_->DefaultColumnFamily(), Key(0),
123
+ Key(1)));
124
+
125
+ Random rnd(301);
126
+ for (int i = 0; i < kNumFiles; ++i) {
127
+ std::vector<std::string> values;
128
+ // Write 12K (4 values, each 3K)
129
+ for (int j = 0; j < kNumPerFile; j++) {
130
+ values.push_back(rnd.RandomString(3 << 10));
131
+ ASSERT_OK(Put(Key(i * kNumPerFile + j), values[j]));
132
+ if (j == 0 && i > 0) {
133
+ ASSERT_OK(dbfull()->TEST_WaitForFlushMemTable());
134
+ }
135
+ }
136
+ }
137
+ // put extra key to trigger final flush
138
+ ASSERT_OK(Put("", ""));
139
+ ASSERT_OK(dbfull()->TEST_WaitForFlushMemTable());
140
+ ASSERT_EQ(kNumFiles, NumTableFilesAtLevel(0));
141
+ ASSERT_EQ(0, NumTableFilesAtLevel(1));
142
+
143
+ ASSERT_OK(dbfull()->TEST_CompactRange(0, nullptr, nullptr, nullptr,
144
+ true /* disallow_trivial_move */));
145
+ ASSERT_EQ(0, NumTableFilesAtLevel(0));
146
+ ASSERT_EQ(2, NumTableFilesAtLevel(1));
147
+ db_->ReleaseSnapshot(snapshot);
148
+ }
149
+
150
+ TEST_F(DBRangeDelTest, MaxCompactionBytesCutsOutputFiles) {
151
+ // Ensures range deletion spanning multiple compaction output files that are
152
+ // cut by max_compaction_bytes will have non-overlapping key-ranges.
153
+ // https://github.com/facebook/rocksdb/issues/1778
154
+ const int kNumFiles = 2, kNumPerFile = 1 << 8, kBytesPerVal = 1 << 12;
155
+ Options opts = CurrentOptions();
156
+ opts.comparator = test::Uint64Comparator();
157
+ opts.disable_auto_compactions = true;
158
+ opts.level0_file_num_compaction_trigger = kNumFiles;
159
+ opts.max_compaction_bytes = kNumPerFile * kBytesPerVal;
160
+ opts.memtable_factory.reset(new SpecialSkipListFactory(kNumPerFile));
161
+ // Want max_compaction_bytes to trigger the end of compaction output file, not
162
+ // target_file_size_base, so make the latter much bigger
163
+ opts.target_file_size_base = 100 * opts.max_compaction_bytes;
164
+ DestroyAndReopen(opts);
165
+
166
+ // snapshot protects range tombstone from dropping due to becoming obsolete.
167
+ const Snapshot* snapshot = db_->GetSnapshot();
168
+
169
+ // It spans the whole key-range, thus will be included in all output files
170
+ ASSERT_OK(db_->DeleteRange(WriteOptions(), db_->DefaultColumnFamily(),
171
+ GetNumericStr(0),
172
+ GetNumericStr(kNumFiles * kNumPerFile - 1)));
173
+ Random rnd(301);
174
+ for (int i = 0; i < kNumFiles; ++i) {
175
+ std::vector<std::string> values;
176
+ // Write 1MB (256 values, each 4K)
177
+ for (int j = 0; j < kNumPerFile; j++) {
178
+ values.push_back(rnd.RandomString(kBytesPerVal));
179
+ ASSERT_OK(Put(GetNumericStr(kNumPerFile * i + j), values[j]));
180
+ }
181
+ // extra entry to trigger SpecialSkipListFactory's flush
182
+ ASSERT_OK(Put(GetNumericStr(kNumPerFile), ""));
183
+ ASSERT_OK(dbfull()->TEST_WaitForFlushMemTable());
184
+ ASSERT_EQ(i + 1, NumTableFilesAtLevel(0));
185
+ }
186
+
187
+ ASSERT_OK(dbfull()->TEST_CompactRange(0, nullptr, nullptr, nullptr,
188
+ true /* disallow_trivial_move */));
189
+ ASSERT_EQ(0, NumTableFilesAtLevel(0));
190
+ ASSERT_GE(NumTableFilesAtLevel(1), 2);
191
+
192
+ std::vector<std::vector<FileMetaData>> files;
193
+ dbfull()->TEST_GetFilesMetaData(db_->DefaultColumnFamily(), &files);
194
+
195
+ for (size_t i = 0; i + 1 < files[1].size(); ++i) {
196
+ ASSERT_TRUE(InternalKeyComparator(opts.comparator)
197
+ .Compare(files[1][i].largest, files[1][i + 1].smallest) <
198
+ 0);
199
+ }
200
+ db_->ReleaseSnapshot(snapshot);
201
+ }
202
+
203
+ TEST_F(DBRangeDelTest, SentinelsOmittedFromOutputFile) {
204
+ // Regression test for bug where sentinel range deletions (i.e., ones with
205
+ // sequence number of zero) were included in output files.
206
+ // snapshot protects range tombstone from dropping due to becoming obsolete.
207
+ const Snapshot* snapshot = db_->GetSnapshot();
208
+
209
+ // gaps between ranges creates sentinels in our internal representation
210
+ std::vector<std::pair<std::string, std::string>> range_dels = {{"a", "b"}, {"c", "d"}, {"e", "f"}};
211
+ for (const auto& range_del : range_dels) {
212
+ ASSERT_OK(db_->DeleteRange(WriteOptions(), db_->DefaultColumnFamily(),
213
+ range_del.first, range_del.second));
214
+ }
215
+ ASSERT_OK(db_->Flush(FlushOptions()));
216
+ ASSERT_EQ(1, NumTableFilesAtLevel(0));
217
+
218
+ std::vector<std::vector<FileMetaData>> files;
219
+ dbfull()->TEST_GetFilesMetaData(db_->DefaultColumnFamily(), &files);
220
+ ASSERT_GT(files[0][0].fd.smallest_seqno, 0);
221
+
222
+ db_->ReleaseSnapshot(snapshot);
223
+ }
224
+
225
+ TEST_F(DBRangeDelTest, FlushRangeDelsSameStartKey) {
226
+ ASSERT_OK(db_->Put(WriteOptions(), "b1", "val"));
227
+ ASSERT_OK(
228
+ db_->DeleteRange(WriteOptions(), db_->DefaultColumnFamily(), "a", "c"));
229
+ ASSERT_OK(db_->Put(WriteOptions(), "b2", "val"));
230
+ ASSERT_OK(
231
+ db_->DeleteRange(WriteOptions(), db_->DefaultColumnFamily(), "a", "b"));
232
+ // first iteration verifies query correctness in memtable, second verifies
233
+ // query correctness for a single SST file
234
+ for (int i = 0; i < 2; ++i) {
235
+ if (i > 0) {
236
+ ASSERT_OK(db_->Flush(FlushOptions()));
237
+ ASSERT_EQ(1, NumTableFilesAtLevel(0));
238
+ }
239
+ std::string value;
240
+ ASSERT_TRUE(db_->Get(ReadOptions(), "b1", &value).IsNotFound());
241
+ ASSERT_OK(db_->Get(ReadOptions(), "b2", &value));
242
+ }
243
+ }
244
+
245
+ TEST_F(DBRangeDelTest, CompactRangeDelsSameStartKey) {
246
+ ASSERT_OK(db_->Put(WriteOptions(), "unused",
247
+ "val")); // prevents empty after compaction
248
+ ASSERT_OK(db_->Put(WriteOptions(), "b1", "val"));
249
+ ASSERT_OK(db_->Flush(FlushOptions()));
250
+ ASSERT_OK(
251
+ db_->DeleteRange(WriteOptions(), db_->DefaultColumnFamily(), "a", "c"));
252
+ ASSERT_OK(db_->Flush(FlushOptions()));
253
+ ASSERT_OK(
254
+ db_->DeleteRange(WriteOptions(), db_->DefaultColumnFamily(), "a", "b"));
255
+ ASSERT_OK(db_->Flush(FlushOptions()));
256
+ ASSERT_EQ(3, NumTableFilesAtLevel(0));
257
+
258
+ for (int i = 0; i < 2; ++i) {
259
+ if (i > 0) {
260
+ ASSERT_OK(dbfull()->TEST_CompactRange(0, nullptr, nullptr, nullptr,
261
+ true /* disallow_trivial_move */));
262
+ ASSERT_EQ(0, NumTableFilesAtLevel(0));
263
+ ASSERT_EQ(1, NumTableFilesAtLevel(1));
264
+ }
265
+ std::string value;
266
+ ASSERT_TRUE(db_->Get(ReadOptions(), "b1", &value).IsNotFound());
267
+ }
268
+ }
269
+ #endif // ROCKSDB_LITE
270
+
271
+ TEST_F(DBRangeDelTest, FlushRemovesCoveredKeys) {
272
+ const int kNum = 300, kRangeBegin = 50, kRangeEnd = 250;
273
+ Options opts = CurrentOptions();
274
+ opts.comparator = test::Uint64Comparator();
275
+ DestroyAndReopen(opts);
276
+
277
+ // Write a third before snapshot, a third between snapshot and tombstone, and
278
+ // a third after the tombstone. Keys older than snapshot or newer than the
279
+ // tombstone should be preserved.
280
+ const Snapshot* snapshot = nullptr;
281
+ for (int i = 0; i < kNum; ++i) {
282
+ if (i == kNum / 3) {
283
+ snapshot = db_->GetSnapshot();
284
+ } else if (i == 2 * kNum / 3) {
285
+ ASSERT_OK(db_->DeleteRange(WriteOptions(), db_->DefaultColumnFamily(),
286
+ GetNumericStr(kRangeBegin),
287
+ GetNumericStr(kRangeEnd)));
288
+ }
289
+ ASSERT_OK(db_->Put(WriteOptions(), GetNumericStr(i), "val"));
290
+ }
291
+ ASSERT_OK(db_->Flush(FlushOptions()));
292
+
293
+ for (int i = 0; i < kNum; ++i) {
294
+ ReadOptions read_opts;
295
+ read_opts.ignore_range_deletions = true;
296
+ std::string value;
297
+ if (i < kRangeBegin || i > kRangeEnd || i < kNum / 3 || i >= 2 * kNum / 3) {
298
+ ASSERT_OK(db_->Get(read_opts, GetNumericStr(i), &value));
299
+ } else {
300
+ ASSERT_TRUE(db_->Get(read_opts, GetNumericStr(i), &value).IsNotFound());
301
+ }
302
+ }
303
+ db_->ReleaseSnapshot(snapshot);
304
+ }
305
+
306
+ // NumTableFilesAtLevel() is not supported in ROCKSDB_LITE
307
+ #ifndef ROCKSDB_LITE
308
+ TEST_F(DBRangeDelTest, CompactionRemovesCoveredKeys) {
309
+ const int kNumPerFile = 100, kNumFiles = 4;
310
+ Options opts = CurrentOptions();
311
+ opts.comparator = test::Uint64Comparator();
312
+ opts.disable_auto_compactions = true;
313
+ opts.memtable_factory.reset(new SpecialSkipListFactory(kNumPerFile));
314
+ opts.num_levels = 2;
315
+ opts.statistics = CreateDBStatistics();
316
+ DestroyAndReopen(opts);
317
+
318
+ for (int i = 0; i < kNumFiles; ++i) {
319
+ if (i > 0) {
320
+ // range tombstone covers first half of the previous file
321
+ ASSERT_OK(db_->DeleteRange(
322
+ WriteOptions(), db_->DefaultColumnFamily(),
323
+ GetNumericStr((i - 1) * kNumPerFile),
324
+ GetNumericStr((i - 1) * kNumPerFile + kNumPerFile / 2)));
325
+ }
326
+ // Make sure a given key appears in each file so compaction won't be able to
327
+ // use trivial move, which would happen if the ranges were non-overlapping.
328
+ // Also, we need an extra element since flush is only triggered when the
329
+ // number of keys is one greater than SpecialSkipListFactory's limit.
330
+ // We choose a key outside the key-range used by the test to avoid conflict.
331
+ ASSERT_OK(db_->Put(WriteOptions(), GetNumericStr(kNumPerFile * kNumFiles),
332
+ "val"));
333
+
334
+ for (int j = 0; j < kNumPerFile; ++j) {
335
+ ASSERT_OK(
336
+ db_->Put(WriteOptions(), GetNumericStr(i * kNumPerFile + j), "val"));
337
+ }
338
+ ASSERT_OK(dbfull()->TEST_WaitForFlushMemTable());
339
+ ASSERT_EQ(i + 1, NumTableFilesAtLevel(0));
340
+ }
341
+ ASSERT_OK(db_->CompactRange(CompactRangeOptions(), nullptr, nullptr));
342
+ ASSERT_EQ(0, NumTableFilesAtLevel(0));
343
+ ASSERT_GT(NumTableFilesAtLevel(1), 0);
344
+ ASSERT_EQ((kNumFiles - 1) * kNumPerFile / 2,
345
+ TestGetTickerCount(opts, COMPACTION_KEY_DROP_RANGE_DEL));
346
+
347
+ for (int i = 0; i < kNumFiles; ++i) {
348
+ for (int j = 0; j < kNumPerFile; ++j) {
349
+ ReadOptions read_opts;
350
+ read_opts.ignore_range_deletions = true;
351
+ std::string value;
352
+ if (i == kNumFiles - 1 || j >= kNumPerFile / 2) {
353
+ ASSERT_OK(
354
+ db_->Get(read_opts, GetNumericStr(i * kNumPerFile + j), &value));
355
+ } else {
356
+ ASSERT_TRUE(
357
+ db_->Get(read_opts, GetNumericStr(i * kNumPerFile + j), &value)
358
+ .IsNotFound());
359
+ }
360
+ }
361
+ }
362
+ }
363
+
364
+ TEST_F(DBRangeDelTest, ValidLevelSubcompactionBoundaries) {
365
+ const int kNumPerFile = 100, kNumFiles = 4, kFileBytes = 100 << 10;
366
+ Options options = CurrentOptions();
367
+ options.disable_auto_compactions = true;
368
+ options.level0_file_num_compaction_trigger = kNumFiles;
369
+ options.max_bytes_for_level_base = 2 * kFileBytes;
370
+ options.max_subcompactions = 4;
371
+ options.memtable_factory.reset(new SpecialSkipListFactory(kNumPerFile));
372
+ options.num_levels = 3;
373
+ options.target_file_size_base = kFileBytes;
374
+ options.target_file_size_multiplier = 1;
375
+ Reopen(options);
376
+
377
+ Random rnd(301);
378
+ for (int i = 0; i < 2; ++i) {
379
+ for (int j = 0; j < kNumFiles; ++j) {
380
+ if (i > 0) {
381
+ // delete [95,105) in two files, [295,305) in next two
382
+ int mid = (j + (1 - j % 2)) * kNumPerFile;
383
+ ASSERT_OK(db_->DeleteRange(WriteOptions(), db_->DefaultColumnFamily(),
384
+ Key(mid - 5), Key(mid + 5)));
385
+ }
386
+ std::vector<std::string> values;
387
+ // Write 100KB (100 values, each 1K)
388
+ for (int k = 0; k < kNumPerFile; k++) {
389
+ values.push_back(rnd.RandomString(990));
390
+ ASSERT_OK(Put(Key(j * kNumPerFile + k), values[k]));
391
+ }
392
+ // put extra key to trigger flush
393
+ ASSERT_OK(Put("", ""));
394
+ ASSERT_OK(dbfull()->TEST_WaitForFlushMemTable());
395
+ if (j < kNumFiles - 1) {
396
+ // background compaction may happen early for kNumFiles'th file
397
+ ASSERT_EQ(NumTableFilesAtLevel(0), j + 1);
398
+ }
399
+ if (j == options.level0_file_num_compaction_trigger - 1) {
400
+ // When i == 1, compaction will output some files to L1, at which point
401
+ // L1 is not bottommost so range deletions cannot be compacted away. The
402
+ // new L1 files must be generated with non-overlapping key ranges even
403
+ // though multiple subcompactions see the same ranges deleted, else an
404
+ // assertion will fail.
405
+ //
406
+ // Only enable auto-compactions when we're ready; otherwise, the
407
+ // oversized L0 (relative to base_level) causes the compaction to run
408
+ // earlier.
409
+ ASSERT_OK(db_->EnableAutoCompaction({db_->DefaultColumnFamily()}));
410
+ ASSERT_OK(dbfull()->TEST_WaitForCompact());
411
+ ASSERT_OK(db_->SetOptions(db_->DefaultColumnFamily(),
412
+ {{"disable_auto_compactions", "true"}}));
413
+ ASSERT_EQ(NumTableFilesAtLevel(0), 0);
414
+ ASSERT_GT(NumTableFilesAtLevel(1), 0);
415
+ ASSERT_GT(NumTableFilesAtLevel(2), 0);
416
+ }
417
+ }
418
+ }
419
+ }
420
+
421
+ TEST_F(DBRangeDelTest, ValidUniversalSubcompactionBoundaries) {
422
+ const int kNumPerFile = 100, kFilesPerLevel = 4, kNumLevels = 4;
423
+ Options options = CurrentOptions();
424
+ options.compaction_options_universal.min_merge_width = kFilesPerLevel;
425
+ options.compaction_options_universal.max_merge_width = kFilesPerLevel;
426
+ options.compaction_options_universal.size_ratio = 10;
427
+ options.compaction_style = kCompactionStyleUniversal;
428
+ options.level0_file_num_compaction_trigger = kFilesPerLevel;
429
+ options.max_subcompactions = 4;
430
+ options.memtable_factory.reset(new SpecialSkipListFactory(kNumPerFile));
431
+ options.num_levels = kNumLevels;
432
+ options.target_file_size_base = kNumPerFile << 10;
433
+ options.target_file_size_multiplier = 1;
434
+ Reopen(options);
435
+
436
+ Random rnd(301);
437
+ for (int i = 0; i < kNumLevels - 1; ++i) {
438
+ for (int j = 0; j < kFilesPerLevel; ++j) {
439
+ if (i == kNumLevels - 2) {
440
+ // insert range deletions [95,105) in two files, [295,305) in next two
441
+ // to prepare L1 for later manual compaction.
442
+ int mid = (j + (1 - j % 2)) * kNumPerFile;
443
+ ASSERT_OK(db_->DeleteRange(WriteOptions(), db_->DefaultColumnFamily(),
444
+ Key(mid - 5), Key(mid + 5)));
445
+ }
446
+ std::vector<std::string> values;
447
+ // Write 100KB (100 values, each 1K)
448
+ for (int k = 0; k < kNumPerFile; k++) {
449
+ values.push_back(rnd.RandomString(990));
450
+ ASSERT_OK(Put(Key(j * kNumPerFile + k), values[k]));
451
+ }
452
+ // put extra key to trigger flush
453
+ ASSERT_OK(Put("", ""));
454
+ ASSERT_OK(dbfull()->TEST_WaitForFlushMemTable());
455
+ if (j < kFilesPerLevel - 1) {
456
+ // background compaction may happen early for kFilesPerLevel'th file
457
+ ASSERT_EQ(NumTableFilesAtLevel(0), j + 1);
458
+ }
459
+ }
460
+ ASSERT_OK(dbfull()->TEST_WaitForCompact());
461
+ ASSERT_EQ(NumTableFilesAtLevel(0), 0);
462
+ ASSERT_GT(NumTableFilesAtLevel(kNumLevels - 1 - i), kFilesPerLevel - 1);
463
+ }
464
+ // Now L1-L3 are full, when we compact L1->L2 we should see (1) subcompactions
465
+ // happen since input level > 0; (2) range deletions are not dropped since
466
+ // output level is not bottommost. If no file boundary assertion fails, that
467
+ // probably means universal compaction + subcompaction + range deletion are
468
+ // compatible.
469
+ ASSERT_OK(dbfull()->RunManualCompaction(
470
+ static_cast_with_check<ColumnFamilyHandleImpl>(db_->DefaultColumnFamily())
471
+ ->cfd(),
472
+ 1 /* input_level */, 2 /* output_level */, CompactRangeOptions(),
473
+ nullptr /* begin */, nullptr /* end */, true /* exclusive */,
474
+ true /* disallow_trivial_move */,
475
+ port::kMaxUint64 /* max_file_num_to_ignore */));
476
+ }
477
+ #endif // ROCKSDB_LITE
478
+
479
+ TEST_F(DBRangeDelTest, CompactionRemovesCoveredMergeOperands) {
480
+ const int kNumPerFile = 3, kNumFiles = 3;
481
+ Options opts = CurrentOptions();
482
+ opts.disable_auto_compactions = true;
483
+ opts.memtable_factory.reset(new SpecialSkipListFactory(2 * kNumPerFile));
484
+ opts.merge_operator = MergeOperators::CreateUInt64AddOperator();
485
+ opts.num_levels = 2;
486
+ Reopen(opts);
487
+
488
+ // Iterates kNumFiles * kNumPerFile + 1 times since flushing the last file
489
+ // requires an extra entry.
490
+ for (int i = 0; i <= kNumFiles * kNumPerFile; ++i) {
491
+ if (i % kNumPerFile == 0 && i / kNumPerFile == kNumFiles - 1) {
492
+ // Delete merge operands from all but the last file
493
+ ASSERT_OK(db_->DeleteRange(WriteOptions(), db_->DefaultColumnFamily(),
494
+ "key", "key_"));
495
+ }
496
+ std::string val;
497
+ PutFixed64(&val, i);
498
+ ASSERT_OK(db_->Merge(WriteOptions(), "key", val));
499
+ // we need to prevent trivial move using Puts so compaction will actually
500
+ // process the merge operands.
501
+ ASSERT_OK(db_->Put(WriteOptions(), "prevent_trivial_move", ""));
502
+ if (i > 0 && i % kNumPerFile == 0) {
503
+ ASSERT_OK(dbfull()->TEST_WaitForFlushMemTable());
504
+ }
505
+ }
506
+
507
+ ReadOptions read_opts;
508
+ read_opts.ignore_range_deletions = true;
509
+ std::string expected, actual;
510
+ ASSERT_OK(db_->Get(read_opts, "key", &actual));
511
+ PutFixed64(&expected, 45); // 1+2+...+9
512
+ ASSERT_EQ(expected, actual);
513
+
514
+ ASSERT_OK(db_->CompactRange(CompactRangeOptions(), nullptr, nullptr));
515
+
516
+ expected.clear();
517
+ ASSERT_OK(db_->Get(read_opts, "key", &actual));
518
+ uint64_t tmp;
519
+ Slice tmp2(actual);
520
+ GetFixed64(&tmp2, &tmp);
521
+ PutFixed64(&expected, 30); // 6+7+8+9 (earlier operands covered by tombstone)
522
+ ASSERT_EQ(expected, actual);
523
+ }
524
+
525
+ TEST_F(DBRangeDelTest, PutDeleteRangeMergeFlush) {
526
+ // Test the sequence of operations: (1) Put, (2) DeleteRange, (3) Merge, (4)
527
+ // Flush. The `CompactionIterator` previously had a bug where we forgot to
528
+ // check for covering range tombstones when processing the (1) Put, causing
529
+ // it to reappear after the flush.
530
+ Options opts = CurrentOptions();
531
+ opts.merge_operator = MergeOperators::CreateUInt64AddOperator();
532
+ Reopen(opts);
533
+
534
+ std::string val;
535
+ PutFixed64(&val, 1);
536
+ ASSERT_OK(db_->Put(WriteOptions(), "key", val));
537
+ ASSERT_OK(db_->DeleteRange(WriteOptions(), db_->DefaultColumnFamily(),
538
+ "key", "key_"));
539
+ ASSERT_OK(db_->Merge(WriteOptions(), "key", val));
540
+ ASSERT_OK(db_->Flush(FlushOptions()));
541
+
542
+ ReadOptions read_opts;
543
+ std::string expected, actual;
544
+ ASSERT_OK(db_->Get(read_opts, "key", &actual));
545
+ PutFixed64(&expected, 1);
546
+ ASSERT_EQ(expected, actual);
547
+ }
548
+
549
+ // NumTableFilesAtLevel() is not supported in ROCKSDB_LITE
550
+ #ifndef ROCKSDB_LITE
551
+ TEST_F(DBRangeDelTest, ObsoleteTombstoneCleanup) {
552
+ // During compaction to bottommost level, verify range tombstones older than
553
+ // the oldest snapshot are removed, while others are preserved.
554
+ Options opts = CurrentOptions();
555
+ opts.disable_auto_compactions = true;
556
+ opts.num_levels = 2;
557
+ opts.statistics = CreateDBStatistics();
558
+ Reopen(opts);
559
+
560
+ ASSERT_OK(db_->DeleteRange(WriteOptions(), db_->DefaultColumnFamily(), "dr1",
561
+ "dr10")); // obsolete after compaction
562
+ ASSERT_OK(db_->Put(WriteOptions(), "key", "val"));
563
+ ASSERT_OK(db_->Flush(FlushOptions()));
564
+ const Snapshot* snapshot = db_->GetSnapshot();
565
+ ASSERT_OK(db_->DeleteRange(WriteOptions(), db_->DefaultColumnFamily(), "dr2",
566
+ "dr20")); // protected by snapshot
567
+ ASSERT_OK(db_->Put(WriteOptions(), "key", "val"));
568
+ ASSERT_OK(db_->Flush(FlushOptions()));
569
+
570
+ ASSERT_EQ(2, NumTableFilesAtLevel(0));
571
+ ASSERT_EQ(0, NumTableFilesAtLevel(1));
572
+ ASSERT_OK(db_->CompactRange(CompactRangeOptions(), nullptr, nullptr));
573
+ ASSERT_EQ(0, NumTableFilesAtLevel(0));
574
+ ASSERT_EQ(1, NumTableFilesAtLevel(1));
575
+ ASSERT_EQ(1, TestGetTickerCount(opts, COMPACTION_RANGE_DEL_DROP_OBSOLETE));
576
+
577
+ db_->ReleaseSnapshot(snapshot);
578
+ }
579
+
580
+ TEST_F(DBRangeDelTest, TableEvictedDuringScan) {
581
+ // The RangeDelAggregator holds pointers into range deletion blocks created by
582
+ // table readers. This test ensures the aggregator can still access those
583
+ // blocks even if it outlives the table readers that created them.
584
+ //
585
+ // DBIter always keeps readers open for L0 files. So, in order to test
586
+ // aggregator outliving reader, we need to have deletions in L1 files, which
587
+ // are opened/closed on-demand during the scan. This is accomplished by
588
+ // setting kNumRanges > level0_stop_writes_trigger, which prevents deletions
589
+ // from all lingering in L0 (there is at most one range deletion per L0 file).
590
+ //
591
+ // The first L1 file will contain a range deletion since its begin key is 0.
592
+ // SeekToFirst() references that table's reader and adds its range tombstone
593
+ // to the aggregator. Upon advancing beyond that table's key-range via Next(),
594
+ // the table reader will be unreferenced by the iterator. Since we manually
595
+ // call Evict() on all readers before the full scan, this unreference causes
596
+ // the reader's refcount to drop to zero and thus be destroyed.
597
+ //
598
+ // When it is destroyed, we do not remove its range deletions from the
599
+ // aggregator. So, subsequent calls to Next() must be able to use these
600
+ // deletions to decide whether a key is covered. This will work as long as
601
+ // the aggregator properly references the range deletion block.
602
+ const int kNum = 25, kRangeBegin = 0, kRangeEnd = 7, kNumRanges = 5;
603
+ Options opts = CurrentOptions();
604
+ opts.comparator = test::Uint64Comparator();
605
+ opts.level0_file_num_compaction_trigger = 4;
606
+ opts.level0_stop_writes_trigger = 4;
607
+ opts.memtable_factory.reset(new SpecialSkipListFactory(1));
608
+ opts.num_levels = 2;
609
+ BlockBasedTableOptions bbto;
610
+ bbto.cache_index_and_filter_blocks = true;
611
+ bbto.block_cache = NewLRUCache(8 << 20);
612
+ opts.table_factory.reset(NewBlockBasedTableFactory(bbto));
613
+ DestroyAndReopen(opts);
614
+
615
+ // Hold a snapshot so range deletions can't become obsolete during compaction
616
+ // to bottommost level (i.e., L1).
617
+ const Snapshot* snapshot = db_->GetSnapshot();
618
+ for (int i = 0; i < kNum; ++i) {
619
+ ASSERT_OK(db_->Put(WriteOptions(), GetNumericStr(i), "val"));
620
+ if (i > 0) {
621
+ ASSERT_OK(dbfull()->TEST_WaitForFlushMemTable());
622
+ }
623
+ if (i >= kNum / 2 && i < kNum / 2 + kNumRanges) {
624
+ ASSERT_OK(db_->DeleteRange(WriteOptions(), db_->DefaultColumnFamily(),
625
+ GetNumericStr(kRangeBegin),
626
+ GetNumericStr(kRangeEnd)));
627
+ }
628
+ }
629
+ // Must be > 1 so the first L1 file can be closed before scan finishes
630
+ ASSERT_OK(dbfull()->TEST_WaitForCompact());
631
+ ASSERT_GT(NumTableFilesAtLevel(1), 1);
632
+ std::vector<uint64_t> file_numbers = ListTableFiles(env_, dbname_);
633
+
634
+ ReadOptions read_opts;
635
+ auto* iter = db_->NewIterator(read_opts);
636
+ ASSERT_OK(iter->status());
637
+ int expected = kRangeEnd;
638
+ iter->SeekToFirst();
639
+ for (auto file_number : file_numbers) {
640
+ // This puts table caches in the state of being externally referenced only
641
+ // so they are destroyed immediately upon iterator unreferencing.
642
+ TableCache::Evict(dbfull()->TEST_table_cache(), file_number);
643
+ }
644
+ for (; iter->Valid(); iter->Next()) {
645
+ ASSERT_EQ(GetNumericStr(expected), iter->key());
646
+ ++expected;
647
+ // Keep clearing block cache's LRU so range deletion block can be freed as
648
+ // soon as its refcount drops to zero.
649
+ bbto.block_cache->EraseUnRefEntries();
650
+ }
651
+ ASSERT_EQ(kNum, expected);
652
+ delete iter;
653
+ db_->ReleaseSnapshot(snapshot);
654
+ }
655
+
656
+ TEST_F(DBRangeDelTest, GetCoveredKeyFromMutableMemtable) {
657
+ do {
658
+ DestroyAndReopen(CurrentOptions());
659
+ ASSERT_OK(db_->Put(WriteOptions(), "key", "val"));
660
+ ASSERT_OK(
661
+ db_->DeleteRange(WriteOptions(), db_->DefaultColumnFamily(), "a", "z"));
662
+
663
+ ReadOptions read_opts;
664
+ std::string value;
665
+ ASSERT_TRUE(db_->Get(read_opts, "key", &value).IsNotFound());
666
+ } while (ChangeOptions(kRangeDelSkipConfigs));
667
+ }
668
+
669
+ TEST_F(DBRangeDelTest, GetCoveredKeyFromImmutableMemtable) {
670
+ do {
671
+ Options opts = CurrentOptions();
672
+ opts.max_write_buffer_number = 3;
673
+ opts.min_write_buffer_number_to_merge = 2;
674
+ // SpecialSkipListFactory lets us specify maximum number of elements the
675
+ // memtable can hold. It switches the active memtable to immutable (flush is
676
+ // prevented by the above options) upon inserting an element that would
677
+ // overflow the memtable.
678
+ opts.memtable_factory.reset(new SpecialSkipListFactory(1));
679
+ DestroyAndReopen(opts);
680
+
681
+ ASSERT_OK(db_->Put(WriteOptions(), "key", "val"));
682
+ ASSERT_OK(
683
+ db_->DeleteRange(WriteOptions(), db_->DefaultColumnFamily(), "a", "z"));
684
+ ASSERT_OK(db_->Put(WriteOptions(), "blah", "val"));
685
+
686
+ ReadOptions read_opts;
687
+ std::string value;
688
+ ASSERT_TRUE(db_->Get(read_opts, "key", &value).IsNotFound());
689
+ } while (ChangeOptions(kRangeDelSkipConfigs));
690
+ }
691
+
692
+ TEST_F(DBRangeDelTest, GetCoveredKeyFromSst) {
693
+ do {
694
+ DestroyAndReopen(CurrentOptions());
695
+ ASSERT_OK(db_->Put(WriteOptions(), "key", "val"));
696
+ // snapshot prevents key from being deleted during flush
697
+ const Snapshot* snapshot = db_->GetSnapshot();
698
+ ASSERT_OK(
699
+ db_->DeleteRange(WriteOptions(), db_->DefaultColumnFamily(), "a", "z"));
700
+ ASSERT_OK(db_->Flush(FlushOptions()));
701
+
702
+ ReadOptions read_opts;
703
+ std::string value;
704
+ ASSERT_TRUE(db_->Get(read_opts, "key", &value).IsNotFound());
705
+ db_->ReleaseSnapshot(snapshot);
706
+ } while (ChangeOptions(kRangeDelSkipConfigs));
707
+ }
708
+
709
+ TEST_F(DBRangeDelTest, GetCoveredMergeOperandFromMemtable) {
710
+ const int kNumMergeOps = 10;
711
+ Options opts = CurrentOptions();
712
+ opts.merge_operator = MergeOperators::CreateUInt64AddOperator();
713
+ Reopen(opts);
714
+
715
+ for (int i = 0; i < kNumMergeOps; ++i) {
716
+ std::string val;
717
+ PutFixed64(&val, i);
718
+ ASSERT_OK(db_->Merge(WriteOptions(), "key", val));
719
+ if (i == kNumMergeOps / 2) {
720
+ // deletes [0, 5]
721
+ ASSERT_OK(db_->DeleteRange(WriteOptions(), db_->DefaultColumnFamily(),
722
+ "key", "key_"));
723
+ }
724
+ }
725
+
726
+ ReadOptions read_opts;
727
+ std::string expected, actual;
728
+ ASSERT_OK(db_->Get(read_opts, "key", &actual));
729
+ PutFixed64(&expected, 30); // 6+7+8+9
730
+ ASSERT_EQ(expected, actual);
731
+
732
+ expected.clear();
733
+ read_opts.ignore_range_deletions = true;
734
+ ASSERT_OK(db_->Get(read_opts, "key", &actual));
735
+ PutFixed64(&expected, 45); // 0+1+2+...+9
736
+ ASSERT_EQ(expected, actual);
737
+ }
738
+
739
+ TEST_F(DBRangeDelTest, GetIgnoresRangeDeletions) {
740
+ Options opts = CurrentOptions();
741
+ opts.max_write_buffer_number = 4;
742
+ opts.min_write_buffer_number_to_merge = 3;
743
+ opts.memtable_factory.reset(new SpecialSkipListFactory(1));
744
+ Reopen(opts);
745
+
746
+ ASSERT_OK(db_->Put(WriteOptions(), "sst_key", "val"));
747
+ // snapshot prevents key from being deleted during flush
748
+ const Snapshot* snapshot = db_->GetSnapshot();
749
+ ASSERT_OK(
750
+ db_->DeleteRange(WriteOptions(), db_->DefaultColumnFamily(), "a", "z"));
751
+ ASSERT_OK(db_->Flush(FlushOptions()));
752
+ ASSERT_OK(db_->Put(WriteOptions(), "imm_key", "val"));
753
+ ASSERT_OK(
754
+ db_->DeleteRange(WriteOptions(), db_->DefaultColumnFamily(), "a", "z"));
755
+ ASSERT_OK(db_->Put(WriteOptions(), "mem_key", "val"));
756
+ ASSERT_OK(
757
+ db_->DeleteRange(WriteOptions(), db_->DefaultColumnFamily(), "a", "z"));
758
+
759
+ ReadOptions read_opts;
760
+ read_opts.ignore_range_deletions = true;
761
+ for (std::string key : {"sst_key", "imm_key", "mem_key"}) {
762
+ std::string value;
763
+ ASSERT_OK(db_->Get(read_opts, key, &value));
764
+ }
765
+ db_->ReleaseSnapshot(snapshot);
766
+ }
767
+
768
+ TEST_F(DBRangeDelTest, IteratorRemovesCoveredKeys) {
769
+ const int kNum = 200, kRangeBegin = 50, kRangeEnd = 150, kNumPerFile = 25;
770
+ Options opts = CurrentOptions();
771
+ opts.comparator = test::Uint64Comparator();
772
+ opts.memtable_factory.reset(new SpecialSkipListFactory(kNumPerFile));
773
+ DestroyAndReopen(opts);
774
+
775
+ // Write half of the keys before the tombstone and half after the tombstone.
776
+ // Only covered keys (i.e., within the range and older than the tombstone)
777
+ // should be deleted.
778
+ for (int i = 0; i < kNum; ++i) {
779
+ if (i == kNum / 2) {
780
+ ASSERT_OK(db_->DeleteRange(WriteOptions(), db_->DefaultColumnFamily(),
781
+ GetNumericStr(kRangeBegin),
782
+ GetNumericStr(kRangeEnd)));
783
+ }
784
+ ASSERT_OK(db_->Put(WriteOptions(), GetNumericStr(i), "val"));
785
+ }
786
+ ReadOptions read_opts;
787
+ auto* iter = db_->NewIterator(read_opts);
788
+ ASSERT_OK(iter->status());
789
+
790
+ int expected = 0;
791
+ for (iter->SeekToFirst(); iter->Valid(); iter->Next()) {
792
+ ASSERT_EQ(GetNumericStr(expected), iter->key());
793
+ if (expected == kRangeBegin - 1) {
794
+ expected = kNum / 2;
795
+ } else {
796
+ ++expected;
797
+ }
798
+ }
799
+ ASSERT_EQ(kNum, expected);
800
+ delete iter;
801
+ }
802
+
803
+ TEST_F(DBRangeDelTest, IteratorOverUserSnapshot) {
804
+ const int kNum = 200, kRangeBegin = 50, kRangeEnd = 150, kNumPerFile = 25;
805
+ Options opts = CurrentOptions();
806
+ opts.comparator = test::Uint64Comparator();
807
+ opts.memtable_factory.reset(new SpecialSkipListFactory(kNumPerFile));
808
+ DestroyAndReopen(opts);
809
+
810
+ const Snapshot* snapshot = nullptr;
811
+ // Put a snapshot before the range tombstone, verify an iterator using that
812
+ // snapshot sees all inserted keys.
813
+ for (int i = 0; i < kNum; ++i) {
814
+ if (i == kNum / 2) {
815
+ snapshot = db_->GetSnapshot();
816
+ ASSERT_OK(db_->DeleteRange(WriteOptions(), db_->DefaultColumnFamily(),
817
+ GetNumericStr(kRangeBegin),
818
+ GetNumericStr(kRangeEnd)));
819
+ }
820
+ ASSERT_OK(db_->Put(WriteOptions(), GetNumericStr(i), "val"));
821
+ }
822
+ ReadOptions read_opts;
823
+ read_opts.snapshot = snapshot;
824
+ auto* iter = db_->NewIterator(read_opts);
825
+ ASSERT_OK(iter->status());
826
+
827
+ int expected = 0;
828
+ for (iter->SeekToFirst(); iter->Valid(); iter->Next()) {
829
+ ASSERT_EQ(GetNumericStr(expected), iter->key());
830
+ ++expected;
831
+ }
832
+ ASSERT_EQ(kNum / 2, expected);
833
+ delete iter;
834
+ db_->ReleaseSnapshot(snapshot);
835
+ }
836
+
837
+ TEST_F(DBRangeDelTest, IteratorIgnoresRangeDeletions) {
838
+ Options opts = CurrentOptions();
839
+ opts.max_write_buffer_number = 4;
840
+ opts.min_write_buffer_number_to_merge = 3;
841
+ opts.memtable_factory.reset(new SpecialSkipListFactory(1));
842
+ Reopen(opts);
843
+
844
+ ASSERT_OK(db_->Put(WriteOptions(), "sst_key", "val"));
845
+ // snapshot prevents key from being deleted during flush
846
+ const Snapshot* snapshot = db_->GetSnapshot();
847
+ ASSERT_OK(
848
+ db_->DeleteRange(WriteOptions(), db_->DefaultColumnFamily(), "a", "z"));
849
+ ASSERT_OK(db_->Flush(FlushOptions()));
850
+ ASSERT_OK(db_->Put(WriteOptions(), "imm_key", "val"));
851
+ ASSERT_OK(
852
+ db_->DeleteRange(WriteOptions(), db_->DefaultColumnFamily(), "a", "z"));
853
+ ASSERT_OK(db_->Put(WriteOptions(), "mem_key", "val"));
854
+ ASSERT_OK(
855
+ db_->DeleteRange(WriteOptions(), db_->DefaultColumnFamily(), "a", "z"));
856
+
857
+ ReadOptions read_opts;
858
+ read_opts.ignore_range_deletions = true;
859
+ auto* iter = db_->NewIterator(read_opts);
860
+ ASSERT_OK(iter->status());
861
+ int i = 0;
862
+ std::string expected[] = {"imm_key", "mem_key", "sst_key"};
863
+ for (iter->SeekToFirst(); iter->Valid(); iter->Next(), ++i) {
864
+ std::string key;
865
+ ASSERT_EQ(expected[i], iter->key());
866
+ }
867
+ ASSERT_EQ(3, i);
868
+ delete iter;
869
+ db_->ReleaseSnapshot(snapshot);
870
+ }
871
+
872
+ #ifndef ROCKSDB_UBSAN_RUN
873
+ TEST_F(DBRangeDelTest, TailingIteratorRangeTombstoneUnsupported) {
874
+ ASSERT_OK(db_->Put(WriteOptions(), "key", "val"));
875
+ // snapshot prevents key from being deleted during flush
876
+ const Snapshot* snapshot = db_->GetSnapshot();
877
+ ASSERT_OK(
878
+ db_->DeleteRange(WriteOptions(), db_->DefaultColumnFamily(), "a", "z"));
879
+
880
+ // iterations check unsupported in memtable, l0, and then l1
881
+ for (int i = 0; i < 3; ++i) {
882
+ ReadOptions read_opts;
883
+ read_opts.tailing = true;
884
+ auto* iter = db_->NewIterator(read_opts);
885
+ if (i == 2) {
886
+ // For L1+, iterators over files are created on-demand, so need seek
887
+ iter->SeekToFirst();
888
+ }
889
+ ASSERT_TRUE(iter->status().IsNotSupported());
890
+
891
+ delete iter;
892
+ if (i == 0) {
893
+ ASSERT_OK(db_->Flush(FlushOptions()));
894
+ } else if (i == 1) {
895
+ MoveFilesToLevel(1);
896
+ }
897
+ }
898
+ db_->ReleaseSnapshot(snapshot);
899
+ }
900
+ #endif // !ROCKSDB_UBSAN_RUN
901
+
902
+ TEST_F(DBRangeDelTest, SubcompactionHasEmptyDedicatedRangeDelFile) {
903
+ const int kNumFiles = 2, kNumKeysPerFile = 4;
904
+ Options options = CurrentOptions();
905
+ options.compression = kNoCompression;
906
+ options.disable_auto_compactions = true;
907
+ options.level0_file_num_compaction_trigger = kNumFiles;
908
+ options.max_subcompactions = 2;
909
+ options.num_levels = 2;
910
+ options.target_file_size_base = 4096;
911
+ Reopen(options);
912
+
913
+ // need a L1 file for subcompaction to be triggered
914
+ ASSERT_OK(
915
+ db_->Put(WriteOptions(), db_->DefaultColumnFamily(), Key(0), "val"));
916
+ ASSERT_OK(db_->Flush(FlushOptions()));
917
+ MoveFilesToLevel(1);
918
+
919
+ // put enough keys to fill up the first subcompaction, and later range-delete
920
+ // them so that the first subcompaction outputs no key-values. In that case
921
+ // it'll consider making an SST file dedicated to range deletions.
922
+ for (int i = 0; i < kNumKeysPerFile; ++i) {
923
+ ASSERT_OK(db_->Put(WriteOptions(), db_->DefaultColumnFamily(), Key(i),
924
+ std::string(1024, 'a')));
925
+ }
926
+ ASSERT_OK(db_->Flush(FlushOptions()));
927
+ ASSERT_OK(db_->DeleteRange(WriteOptions(), db_->DefaultColumnFamily(), Key(0),
928
+ Key(kNumKeysPerFile)));
929
+
930
+ // the above range tombstone can be dropped, so that one alone won't cause a
931
+ // dedicated file to be opened. We can make one protected by snapshot that
932
+ // must be considered. Make its range outside the first subcompaction's range
933
+ // to exercise the tricky part of the code.
934
+ const Snapshot* snapshot = db_->GetSnapshot();
935
+ ASSERT_OK(db_->DeleteRange(WriteOptions(), db_->DefaultColumnFamily(),
936
+ Key(kNumKeysPerFile + 1),
937
+ Key(kNumKeysPerFile + 2)));
938
+ ASSERT_OK(db_->Flush(FlushOptions()));
939
+
940
+ ASSERT_EQ(kNumFiles, NumTableFilesAtLevel(0));
941
+ ASSERT_EQ(1, NumTableFilesAtLevel(1));
942
+
943
+ ASSERT_OK(db_->EnableAutoCompaction({db_->DefaultColumnFamily()}));
944
+ ASSERT_OK(dbfull()->TEST_WaitForCompact());
945
+ db_->ReleaseSnapshot(snapshot);
946
+ }
947
+
948
+ TEST_F(DBRangeDelTest, MemtableBloomFilter) {
949
+ // regression test for #2743. the range delete tombstones in memtable should
950
+ // be added even when Get() skips searching due to its prefix bloom filter
951
+ const int kMemtableSize = 1 << 20; // 1MB
952
+ const int kMemtablePrefixFilterSize = 1 << 13; // 8KB
953
+ const int kNumKeys = 1000;
954
+ const int kPrefixLen = 8;
955
+ Options options = CurrentOptions();
956
+ options.memtable_prefix_bloom_size_ratio =
957
+ static_cast<double>(kMemtablePrefixFilterSize) / kMemtableSize;
958
+ options.prefix_extractor.reset(
959
+ ROCKSDB_NAMESPACE::NewFixedPrefixTransform(kPrefixLen));
960
+ options.write_buffer_size = kMemtableSize;
961
+ Reopen(options);
962
+
963
+ for (int i = 0; i < kNumKeys; ++i) {
964
+ ASSERT_OK(Put(Key(i), "val"));
965
+ }
966
+ ASSERT_OK(Flush());
967
+ ASSERT_OK(db_->DeleteRange(WriteOptions(), db_->DefaultColumnFamily(), Key(0),
968
+ Key(kNumKeys)));
969
+ for (int i = 0; i < kNumKeys; ++i) {
970
+ std::string value;
971
+ ASSERT_TRUE(db_->Get(ReadOptions(), Key(i), &value).IsNotFound());
972
+ }
973
+ }
974
+
975
+ TEST_F(DBRangeDelTest, CompactionTreatsSplitInputLevelDeletionAtomically) {
976
+ // This test originally verified that compaction treated files containing a
977
+ // split range deletion in the input level as an atomic unit. I.e.,
978
+ // compacting any input-level file(s) containing a portion of the range
979
+ // deletion causes all other input-level files containing portions of that
980
+ // same range deletion to be included in the compaction. Range deletion
981
+ // tombstones are now truncated to sstable boundaries which removed the need
982
+ // for that behavior (which could lead to excessively large
983
+ // compactions).
984
+ const int kNumFilesPerLevel = 4, kValueBytes = 4 << 10;
985
+ Options options = CurrentOptions();
986
+ options.compression = kNoCompression;
987
+ options.level0_file_num_compaction_trigger = kNumFilesPerLevel;
988
+ options.memtable_factory.reset(
989
+ new SpecialSkipListFactory(2 /* num_entries_flush */));
990
+ options.target_file_size_base = kValueBytes;
991
+ // i == 0: CompactFiles
992
+ // i == 1: CompactRange
993
+ // i == 2: automatic compaction
994
+ for (int i = 0; i < 3; ++i) {
995
+ DestroyAndReopen(options);
996
+
997
+ ASSERT_OK(Put(Key(0), ""));
998
+ ASSERT_OK(db_->Flush(FlushOptions()));
999
+ MoveFilesToLevel(2);
1000
+ ASSERT_EQ(1, NumTableFilesAtLevel(2));
1001
+
1002
+ // snapshot protects range tombstone from dropping due to becoming obsolete.
1003
+ const Snapshot* snapshot = db_->GetSnapshot();
1004
+ ASSERT_OK(db_->DeleteRange(WriteOptions(), db_->DefaultColumnFamily(),
1005
+ Key(0), Key(2 * kNumFilesPerLevel)));
1006
+
1007
+ Random rnd(301);
1008
+ std::string value = rnd.RandomString(kValueBytes);
1009
+ for (int j = 0; j < kNumFilesPerLevel; ++j) {
1010
+ // give files overlapping key-ranges to prevent trivial move
1011
+ ASSERT_OK(Put(Key(j), value));
1012
+ ASSERT_OK(Put(Key(2 * kNumFilesPerLevel - 1 - j), value));
1013
+ if (j > 0) {
1014
+ ASSERT_OK(dbfull()->TEST_WaitForFlushMemTable());
1015
+ ASSERT_EQ(j, NumTableFilesAtLevel(0));
1016
+ }
1017
+ }
1018
+ // put extra key to trigger final flush
1019
+ ASSERT_OK(Put("", ""));
1020
+ ASSERT_OK(dbfull()->TEST_WaitForFlushMemTable());
1021
+ ASSERT_OK(dbfull()->TEST_WaitForCompact());
1022
+ ASSERT_EQ(0, NumTableFilesAtLevel(0));
1023
+ ASSERT_EQ(kNumFilesPerLevel, NumTableFilesAtLevel(1));
1024
+
1025
+ ColumnFamilyMetaData meta;
1026
+ db_->GetColumnFamilyMetaData(&meta);
1027
+ if (i == 0) {
1028
+ ASSERT_OK(db_->CompactFiles(
1029
+ CompactionOptions(), {meta.levels[1].files[0].name}, 2 /* level */));
1030
+ ASSERT_EQ(0, NumTableFilesAtLevel(1));
1031
+ } else if (i == 1) {
1032
+ auto begin_str = Key(0), end_str = Key(1);
1033
+ Slice begin = begin_str, end = end_str;
1034
+ ASSERT_OK(db_->CompactRange(CompactRangeOptions(), &begin, &end));
1035
+ ASSERT_EQ(3, NumTableFilesAtLevel(1));
1036
+ } else if (i == 2) {
1037
+ ASSERT_OK(db_->SetOptions(db_->DefaultColumnFamily(),
1038
+ {{"max_bytes_for_level_base", "10000"}}));
1039
+ ASSERT_OK(dbfull()->TEST_WaitForCompact());
1040
+ ASSERT_EQ(1, NumTableFilesAtLevel(1));
1041
+ }
1042
+ ASSERT_GT(NumTableFilesAtLevel(2), 0);
1043
+
1044
+ db_->ReleaseSnapshot(snapshot);
1045
+ }
1046
+ }
1047
+
1048
+ TEST_F(DBRangeDelTest, RangeTombstoneEndKeyAsSstableUpperBound) {
1049
+ // Test the handling of the range-tombstone end-key as the
1050
+ // upper-bound for an sstable.
1051
+
1052
+ const int kNumFilesPerLevel = 2, kValueBytes = 4 << 10;
1053
+ Options options = CurrentOptions();
1054
+ options.compression = kNoCompression;
1055
+ options.level0_file_num_compaction_trigger = kNumFilesPerLevel;
1056
+ options.memtable_factory.reset(
1057
+ new SpecialSkipListFactory(2 /* num_entries_flush */));
1058
+ options.target_file_size_base = kValueBytes;
1059
+ options.disable_auto_compactions = true;
1060
+
1061
+ DestroyAndReopen(options);
1062
+
1063
+ // Create an initial sstable at L2:
1064
+ // [key000000#1,1, key000000#1,1]
1065
+ ASSERT_OK(Put(Key(0), ""));
1066
+ ASSERT_OK(db_->Flush(FlushOptions()));
1067
+ MoveFilesToLevel(2);
1068
+ ASSERT_EQ(1, NumTableFilesAtLevel(2));
1069
+
1070
+ // A snapshot protects the range tombstone from dropping due to
1071
+ // becoming obsolete.
1072
+ const Snapshot* snapshot = db_->GetSnapshot();
1073
+ ASSERT_OK(db_->DeleteRange(WriteOptions(), db_->DefaultColumnFamily(), Key(0),
1074
+ Key(2 * kNumFilesPerLevel)));
1075
+
1076
+ // Create 2 additional sstables in L0. Note that the first sstable
1077
+ // contains the range tombstone.
1078
+ // [key000000#3,1, key000004#72057594037927935,15]
1079
+ // [key000001#5,1, key000002#6,1]
1080
+ Random rnd(301);
1081
+ std::string value = rnd.RandomString(kValueBytes);
1082
+ for (int j = 0; j < kNumFilesPerLevel; ++j) {
1083
+ // Give files overlapping key-ranges to prevent a trivial move when we
1084
+ // compact from L0 to L1.
1085
+ ASSERT_OK(Put(Key(j), value));
1086
+ ASSERT_OK(Put(Key(2 * kNumFilesPerLevel - 1 - j), value));
1087
+ ASSERT_OK(db_->Flush(FlushOptions()));
1088
+ ASSERT_EQ(j + 1, NumTableFilesAtLevel(0));
1089
+ }
1090
+ // Compact the 2 L0 sstables to L1, resulting in the following LSM. There
1091
+ // are 2 sstables generated in L1 due to the target_file_size_base setting.
1092
+ // L1:
1093
+ // [key000000#3,1, key000002#72057594037927935,15]
1094
+ // [key000002#6,1, key000004#72057594037927935,15]
1095
+ // L2:
1096
+ // [key000000#1,1, key000000#1,1]
1097
+ MoveFilesToLevel(1);
1098
+ ASSERT_EQ(2, NumTableFilesAtLevel(1));
1099
+
1100
+ {
1101
+ // Compact the second sstable in L1:
1102
+ // L1:
1103
+ // [key000000#3,1, key000002#72057594037927935,15]
1104
+ // L2:
1105
+ // [key000000#1,1, key000000#1,1]
1106
+ // [key000002#6,1, key000004#72057594037927935,15]
1107
+ //
1108
+ // At the same time, verify the compaction does not cause the key at the
1109
+ // endpoint (key000002#6,1) to disappear.
1110
+ ASSERT_EQ(value, Get(Key(2)));
1111
+ auto begin_str = Key(3);
1112
+ const ROCKSDB_NAMESPACE::Slice begin = begin_str;
1113
+ ASSERT_OK(dbfull()->TEST_CompactRange(1, &begin, nullptr));
1114
+ ASSERT_EQ(1, NumTableFilesAtLevel(1));
1115
+ ASSERT_EQ(2, NumTableFilesAtLevel(2));
1116
+ ASSERT_EQ(value, Get(Key(2)));
1117
+ }
1118
+
1119
+ {
1120
+ // Compact the first sstable in L1. This should be copacetic, but
1121
+ // was previously resulting in overlapping sstables in L2 due to
1122
+ // mishandling of the range tombstone end-key when used as the
1123
+ // largest key for an sstable. The resulting LSM structure should
1124
+ // be:
1125
+ //
1126
+ // L2:
1127
+ // [key000000#1,1, key000001#72057594037927935,15]
1128
+ // [key000001#5,1, key000002#72057594037927935,15]
1129
+ // [key000002#6,1, key000004#72057594037927935,15]
1130
+ auto begin_str = Key(0);
1131
+ const ROCKSDB_NAMESPACE::Slice begin = begin_str;
1132
+ ASSERT_OK(dbfull()->TEST_CompactRange(1, &begin, &begin));
1133
+ ASSERT_EQ(0, NumTableFilesAtLevel(1));
1134
+ ASSERT_EQ(3, NumTableFilesAtLevel(2));
1135
+ }
1136
+
1137
+ db_->ReleaseSnapshot(snapshot);
1138
+ }
1139
+
1140
+ TEST_F(DBRangeDelTest, UnorderedTombstones) {
1141
+ // Regression test for #2752. Range delete tombstones between
1142
+ // different snapshot stripes are not stored in order, so the first
1143
+ // tombstone of each snapshot stripe should be checked as a smallest
1144
+ // candidate.
1145
+ Options options = CurrentOptions();
1146
+ DestroyAndReopen(options);
1147
+
1148
+ auto cf = db_->DefaultColumnFamily();
1149
+
1150
+ ASSERT_OK(db_->Put(WriteOptions(), cf, "a", "a"));
1151
+ ASSERT_OK(db_->Flush(FlushOptions(), cf));
1152
+ ASSERT_EQ(1, NumTableFilesAtLevel(0));
1153
+ ASSERT_OK(dbfull()->TEST_CompactRange(0, nullptr, nullptr));
1154
+ ASSERT_EQ(1, NumTableFilesAtLevel(1));
1155
+
1156
+ ASSERT_OK(db_->DeleteRange(WriteOptions(), cf, "b", "c"));
1157
+ // Hold a snapshot to separate these two delete ranges.
1158
+ auto snapshot = db_->GetSnapshot();
1159
+ ASSERT_OK(db_->DeleteRange(WriteOptions(), cf, "a", "b"));
1160
+ ASSERT_OK(db_->Flush(FlushOptions(), cf));
1161
+ db_->ReleaseSnapshot(snapshot);
1162
+
1163
+ std::vector<std::vector<FileMetaData>> files;
1164
+ dbfull()->TEST_GetFilesMetaData(cf, &files);
1165
+ ASSERT_EQ(1, files[0].size());
1166
+ ASSERT_EQ("a", files[0][0].smallest.user_key());
1167
+ ASSERT_EQ("c", files[0][0].largest.user_key());
1168
+
1169
+ std::string v;
1170
+ auto s = db_->Get(ReadOptions(), "a", &v);
1171
+ ASSERT_TRUE(s.IsNotFound());
1172
+ }
1173
+
1174
+ class MockMergeOperator : public MergeOperator {
1175
+ // Mock non-associative operator. Non-associativity is expressed by lack of
1176
+ // implementation for any `PartialMerge*` functions.
1177
+ public:
1178
+ bool FullMergeV2(const MergeOperationInput& merge_in,
1179
+ MergeOperationOutput* merge_out) const override {
1180
+ assert(merge_out != nullptr);
1181
+ merge_out->new_value = merge_in.operand_list.back().ToString();
1182
+ return true;
1183
+ }
1184
+
1185
+ const char* Name() const override { return "MockMergeOperator"; }
1186
+ };
1187
+
1188
+ TEST_F(DBRangeDelTest, KeyAtOverlappingEndpointReappears) {
1189
+ // This test uses a non-associative merge operator since that is a convenient
1190
+ // way to get compaction to write out files with overlapping user-keys at the
1191
+ // endpoints. Note, however, overlapping endpoints can also occur with other
1192
+ // value types (Put, etc.), assuming the right snapshots are present.
1193
+ const int kFileBytes = 1 << 20;
1194
+ const int kValueBytes = 1 << 10;
1195
+ const int kNumFiles = 4;
1196
+
1197
+ Options options = CurrentOptions();
1198
+ options.compression = kNoCompression;
1199
+ options.disable_auto_compactions = true;
1200
+ options.merge_operator.reset(new MockMergeOperator());
1201
+ options.target_file_size_base = kFileBytes;
1202
+ Reopen(options);
1203
+
1204
+ // Push dummy data to L3 so that our actual test files on L0-L2
1205
+ // will not be considered "bottommost" level, otherwise compaction
1206
+ // may prevent us from creating overlapping user keys
1207
+ // as on the bottommost layer MergeHelper
1208
+ ASSERT_OK(db_->Merge(WriteOptions(), "key", "dummy"));
1209
+ ASSERT_OK(db_->Flush(FlushOptions()));
1210
+ MoveFilesToLevel(3);
1211
+
1212
+ Random rnd(301);
1213
+ const Snapshot* snapshot = nullptr;
1214
+ for (int i = 0; i < kNumFiles; ++i) {
1215
+ for (int j = 0; j < kFileBytes / kValueBytes; ++j) {
1216
+ auto value = rnd.RandomString(kValueBytes);
1217
+ ASSERT_OK(db_->Merge(WriteOptions(), "key", value));
1218
+ }
1219
+ if (i == kNumFiles - 1) {
1220
+ // Take snapshot to prevent covered merge operands from being dropped by
1221
+ // compaction.
1222
+ snapshot = db_->GetSnapshot();
1223
+ // The DeleteRange is the last write so all merge operands are covered.
1224
+ ASSERT_OK(db_->DeleteRange(WriteOptions(), db_->DefaultColumnFamily(),
1225
+ "key", "key_"));
1226
+ }
1227
+ ASSERT_OK(db_->Flush(FlushOptions()));
1228
+ }
1229
+ ASSERT_EQ(kNumFiles, NumTableFilesAtLevel(0));
1230
+ std::string value;
1231
+ ASSERT_TRUE(db_->Get(ReadOptions(), "key", &value).IsNotFound());
1232
+
1233
+ ASSERT_OK(dbfull()->TEST_CompactRange(
1234
+ 0 /* level */, nullptr /* begin */, nullptr /* end */,
1235
+ nullptr /* column_family */, true /* disallow_trivial_move */));
1236
+ ASSERT_EQ(0, NumTableFilesAtLevel(0));
1237
+ // Now we have multiple files at L1 all containing a single user key, thus
1238
+ // guaranteeing overlap in the file endpoints.
1239
+ ASSERT_GT(NumTableFilesAtLevel(1), 1);
1240
+
1241
+ // Verify no merge operands reappeared after the compaction.
1242
+ ASSERT_TRUE(db_->Get(ReadOptions(), "key", &value).IsNotFound());
1243
+
1244
+ // Compact and verify again. It's worthwhile because now the files have
1245
+ // tighter endpoints, so we can verify that doesn't mess anything up.
1246
+ ASSERT_OK(dbfull()->TEST_CompactRange(
1247
+ 1 /* level */, nullptr /* begin */, nullptr /* end */,
1248
+ nullptr /* column_family */, true /* disallow_trivial_move */));
1249
+ ASSERT_GT(NumTableFilesAtLevel(2), 1);
1250
+ ASSERT_TRUE(db_->Get(ReadOptions(), "key", &value).IsNotFound());
1251
+
1252
+ db_->ReleaseSnapshot(snapshot);
1253
+ }
1254
+
1255
+ TEST_F(DBRangeDelTest, UntruncatedTombstoneDoesNotDeleteNewerKey) {
1256
+ // Verify a key newer than a range tombstone cannot be deleted by being
1257
+ // compacted to the bottom level (and thus having its seqnum zeroed) before
1258
+ // the range tombstone. This used to happen when range tombstones were
1259
+ // untruncated on reads such that they extended past their file boundaries.
1260
+ //
1261
+ // Test summary:
1262
+ //
1263
+ // - L1 is bottommost.
1264
+ // - A couple snapshots are strategically taken to prevent seqnums from being
1265
+ // zeroed, range tombstone from being dropped, merge operands from being
1266
+ // dropped, and merge operands from being combined.
1267
+ // - Left half of files in L1 all have same user key, ensuring their file
1268
+ // boundaries overlap. In the past this would cause range tombstones to be
1269
+ // untruncated.
1270
+ // - Right half of L1 files all have different keys, ensuring no overlap.
1271
+ // - A range tombstone spans all L1 keys, so it is stored in every L1 file.
1272
+ // - Keys in the right side of the key-range are overwritten. These are
1273
+ // compacted down to L1 after releasing snapshots such that their seqnums
1274
+ // will be zeroed.
1275
+ // - A full range scan is performed. If the tombstone in the left L1 files
1276
+ // were untruncated, it would now cover keys newer than it (but with zeroed
1277
+ // seqnums) in the right L1 files.
1278
+ const int kFileBytes = 1 << 20;
1279
+ const int kValueBytes = 1 << 10;
1280
+ const int kNumFiles = 4;
1281
+ const int kMaxKey = kNumFiles* kFileBytes / kValueBytes;
1282
+ const int kKeysOverwritten = 10;
1283
+
1284
+ Options options = CurrentOptions();
1285
+ options.compression = kNoCompression;
1286
+ options.disable_auto_compactions = true;
1287
+ options.merge_operator.reset(new MockMergeOperator());
1288
+ options.num_levels = 2;
1289
+ options.target_file_size_base = kFileBytes;
1290
+ Reopen(options);
1291
+
1292
+ Random rnd(301);
1293
+ // - snapshots[0] prevents merge operands from being combined during
1294
+ // compaction.
1295
+ // - snapshots[1] prevents merge operands from being dropped due to the
1296
+ // covering range tombstone.
1297
+ const Snapshot* snapshots[] = {nullptr, nullptr};
1298
+ for (int i = 0; i < kNumFiles; ++i) {
1299
+ for (int j = 0; j < kFileBytes / kValueBytes; ++j) {
1300
+ auto value = rnd.RandomString(kValueBytes);
1301
+ std::string key;
1302
+ if (i < kNumFiles / 2) {
1303
+ key = Key(0);
1304
+ } else {
1305
+ key = Key(1 + i * kFileBytes / kValueBytes + j);
1306
+ }
1307
+ ASSERT_OK(db_->Merge(WriteOptions(), key, value));
1308
+ }
1309
+ if (i == 0) {
1310
+ snapshots[0] = db_->GetSnapshot();
1311
+ }
1312
+ if (i == kNumFiles - 1) {
1313
+ snapshots[1] = db_->GetSnapshot();
1314
+ // The DeleteRange is the last write so all merge operands are covered.
1315
+ ASSERT_OK(db_->DeleteRange(WriteOptions(), db_->DefaultColumnFamily(),
1316
+ Key(0), Key(kMaxKey + 1)));
1317
+ }
1318
+ ASSERT_OK(db_->Flush(FlushOptions()));
1319
+ }
1320
+ ASSERT_EQ(kNumFiles, NumTableFilesAtLevel(0));
1321
+
1322
+ auto get_key_count = [this]() -> int {
1323
+ auto* iter = db_->NewIterator(ReadOptions());
1324
+ assert(iter->status().ok());
1325
+ iter->SeekToFirst();
1326
+ int keys_found = 0;
1327
+ for (; iter->Valid(); iter->Next()) {
1328
+ ++keys_found;
1329
+ }
1330
+ delete iter;
1331
+ return keys_found;
1332
+ };
1333
+
1334
+ // All keys should be covered
1335
+ ASSERT_EQ(0, get_key_count());
1336
+
1337
+ ASSERT_OK(db_->CompactRange(CompactRangeOptions(), nullptr /* begin_key */,
1338
+ nullptr /* end_key */));
1339
+ ASSERT_EQ(0, NumTableFilesAtLevel(0));
1340
+ // Roughly the left half of L1 files should have overlapping boundary keys,
1341
+ // while the right half should not.
1342
+ ASSERT_GE(NumTableFilesAtLevel(1), kNumFiles);
1343
+
1344
+ // Now overwrite a few keys that are in L1 files that definitely don't have
1345
+ // overlapping boundary keys.
1346
+ for (int i = kMaxKey; i > kMaxKey - kKeysOverwritten; --i) {
1347
+ auto value = rnd.RandomString(kValueBytes);
1348
+ ASSERT_OK(db_->Merge(WriteOptions(), Key(i), value));
1349
+ }
1350
+ ASSERT_OK(db_->Flush(FlushOptions()));
1351
+
1352
+ // The overwritten keys are in L0 now, so clearly aren't covered by the range
1353
+ // tombstone in L1.
1354
+ ASSERT_EQ(kKeysOverwritten, get_key_count());
1355
+
1356
+ // Release snapshots so seqnums can be zeroed when L0->L1 happens.
1357
+ db_->ReleaseSnapshot(snapshots[0]);
1358
+ db_->ReleaseSnapshot(snapshots[1]);
1359
+
1360
+ auto begin_key_storage = Key(kMaxKey - kKeysOverwritten + 1);
1361
+ auto end_key_storage = Key(kMaxKey);
1362
+ Slice begin_key(begin_key_storage);
1363
+ Slice end_key(end_key_storage);
1364
+ ASSERT_OK(db_->CompactRange(CompactRangeOptions(), &begin_key, &end_key));
1365
+ ASSERT_EQ(0, NumTableFilesAtLevel(0));
1366
+ ASSERT_GE(NumTableFilesAtLevel(1), kNumFiles);
1367
+
1368
+ ASSERT_EQ(kKeysOverwritten, get_key_count());
1369
+ }
1370
+
1371
+ TEST_F(DBRangeDelTest, DeletedMergeOperandReappearsIterPrev) {
1372
+ // Exposes a bug where we were using
1373
+ // `RangeDelPositioningMode::kBackwardTraversal` while scanning merge operands
1374
+ // in the forward direction. Confusingly, this case happened during
1375
+ // `DBIter::Prev`. It could cause assertion failure, or reappearing keys.
1376
+ const int kFileBytes = 1 << 20;
1377
+ const int kValueBytes = 1 << 10;
1378
+ // Need multiple keys so we can get results when calling `Prev()` after
1379
+ // `SeekToLast()`.
1380
+ const int kNumKeys = 3;
1381
+ const int kNumFiles = 4;
1382
+
1383
+ Options options = CurrentOptions();
1384
+ options.compression = kNoCompression;
1385
+ options.disable_auto_compactions = true;
1386
+ options.merge_operator.reset(new MockMergeOperator());
1387
+ options.target_file_size_base = kFileBytes;
1388
+ Reopen(options);
1389
+
1390
+ Random rnd(301);
1391
+ const Snapshot* snapshot = nullptr;
1392
+ for (int i = 0; i < kNumFiles; ++i) {
1393
+ for (int j = 0; j < kFileBytes / kValueBytes; ++j) {
1394
+ auto value = rnd.RandomString(kValueBytes);
1395
+ ASSERT_OK(db_->Merge(WriteOptions(), Key(j % kNumKeys), value));
1396
+ if (i == 0 && j == kNumKeys) {
1397
+ // Take snapshot to prevent covered merge operands from being dropped or
1398
+ // merged by compaction.
1399
+ snapshot = db_->GetSnapshot();
1400
+ // Do a DeleteRange near the beginning so only the oldest merge operand
1401
+ // for each key is covered. This ensures the sequence of events:
1402
+ //
1403
+ // - `DBIter::Prev()` is called
1404
+ // - After several same versions of the same user key are encountered,
1405
+ // it decides to seek using `DBIter::FindValueForCurrentKeyUsingSeek`.
1406
+ // - Binary searches to the newest version of the key, which is in the
1407
+ // leftmost file containing the user key.
1408
+ // - Scans forwards to collect all merge operands. Eventually reaches
1409
+ // the rightmost file containing the oldest merge operand, which
1410
+ // should be covered by the `DeleteRange`. If `RangeDelAggregator`
1411
+ // were not properly using `kForwardTraversal` here, that operand
1412
+ // would reappear.
1413
+ ASSERT_OK(db_->DeleteRange(WriteOptions(), db_->DefaultColumnFamily(),
1414
+ Key(0), Key(kNumKeys + 1)));
1415
+ }
1416
+ }
1417
+ ASSERT_OK(db_->Flush(FlushOptions()));
1418
+ }
1419
+ ASSERT_EQ(kNumFiles, NumTableFilesAtLevel(0));
1420
+
1421
+ ASSERT_OK(db_->CompactRange(CompactRangeOptions(), nullptr /* begin_key */,
1422
+ nullptr /* end_key */));
1423
+ ASSERT_EQ(0, NumTableFilesAtLevel(0));
1424
+ ASSERT_GT(NumTableFilesAtLevel(1), 1);
1425
+
1426
+ auto* iter = db_->NewIterator(ReadOptions());
1427
+ ASSERT_OK(iter->status());
1428
+ iter->SeekToLast();
1429
+ int keys_found = 0;
1430
+ for (; iter->Valid(); iter->Prev()) {
1431
+ ++keys_found;
1432
+ }
1433
+ delete iter;
1434
+ ASSERT_EQ(kNumKeys, keys_found);
1435
+
1436
+ db_->ReleaseSnapshot(snapshot);
1437
+ }
1438
+
1439
+ TEST_F(DBRangeDelTest, SnapshotPreventsDroppedKeys) {
1440
+ const int kFileBytes = 1 << 20;
1441
+
1442
+ Options options = CurrentOptions();
1443
+ options.compression = kNoCompression;
1444
+ options.disable_auto_compactions = true;
1445
+ options.target_file_size_base = kFileBytes;
1446
+ Reopen(options);
1447
+
1448
+ ASSERT_OK(Put(Key(0), "a"));
1449
+ const Snapshot* snapshot = db_->GetSnapshot();
1450
+
1451
+ ASSERT_OK(db_->DeleteRange(WriteOptions(), db_->DefaultColumnFamily(), Key(0),
1452
+ Key(10)));
1453
+
1454
+ ASSERT_OK(db_->Flush(FlushOptions()));
1455
+
1456
+ ReadOptions read_opts;
1457
+ read_opts.snapshot = snapshot;
1458
+ auto* iter = db_->NewIterator(read_opts);
1459
+ ASSERT_OK(iter->status());
1460
+
1461
+ iter->SeekToFirst();
1462
+ ASSERT_TRUE(iter->Valid());
1463
+ ASSERT_EQ(Key(0), iter->key());
1464
+
1465
+ iter->Next();
1466
+ ASSERT_FALSE(iter->Valid());
1467
+
1468
+ delete iter;
1469
+ db_->ReleaseSnapshot(snapshot);
1470
+ }
1471
+
1472
+ TEST_F(DBRangeDelTest, SnapshotPreventsDroppedKeysInImmMemTables) {
1473
+ const int kFileBytes = 1 << 20;
1474
+
1475
+ Options options = CurrentOptions();
1476
+ options.compression = kNoCompression;
1477
+ options.disable_auto_compactions = true;
1478
+ options.target_file_size_base = kFileBytes;
1479
+ Reopen(options);
1480
+
1481
+ // block flush thread -> pin immtables in memory
1482
+ SyncPoint::GetInstance()->DisableProcessing();
1483
+ SyncPoint::GetInstance()->LoadDependency({
1484
+ {"SnapshotPreventsDroppedKeysInImmMemTables:AfterNewIterator",
1485
+ "DBImpl::BGWorkFlush"},
1486
+ });
1487
+ SyncPoint::GetInstance()->EnableProcessing();
1488
+
1489
+ ASSERT_OK(Put(Key(0), "a"));
1490
+ std::unique_ptr<const Snapshot, std::function<void(const Snapshot*)>>
1491
+ snapshot(db_->GetSnapshot(),
1492
+ [this](const Snapshot* s) { db_->ReleaseSnapshot(s); });
1493
+
1494
+ ASSERT_OK(db_->DeleteRange(WriteOptions(), db_->DefaultColumnFamily(), Key(0),
1495
+ Key(10)));
1496
+
1497
+ ASSERT_OK(dbfull()->TEST_SwitchMemtable());
1498
+
1499
+ ReadOptions read_opts;
1500
+ read_opts.snapshot = snapshot.get();
1501
+ std::unique_ptr<Iterator> iter(db_->NewIterator(read_opts));
1502
+ ASSERT_OK(iter->status());
1503
+
1504
+ TEST_SYNC_POINT("SnapshotPreventsDroppedKeysInImmMemTables:AfterNewIterator");
1505
+
1506
+ iter->SeekToFirst();
1507
+ ASSERT_TRUE(iter->Valid());
1508
+ ASSERT_EQ(Key(0), iter->key());
1509
+
1510
+ iter->Next();
1511
+ ASSERT_FALSE(iter->Valid());
1512
+ }
1513
+
1514
+ TEST_F(DBRangeDelTest, RangeTombstoneWrittenToMinimalSsts) {
1515
+ // Adapted from
1516
+ // https://github.com/cockroachdb/cockroach/blob/de8b3ea603dd1592d9dc26443c2cc92c356fbc2f/pkg/storage/engine/rocksdb_test.go#L1267-L1398.
1517
+ // Regression test for issue where range tombstone was written to more files
1518
+ // than necessary when it began exactly at the begin key in the next
1519
+ // compaction output file.
1520
+ const int kFileBytes = 1 << 20;
1521
+ const int kValueBytes = 4 << 10;
1522
+ Options options = CurrentOptions();
1523
+ options.compression = kNoCompression;
1524
+ options.disable_auto_compactions = true;
1525
+ // Have a bit of slack in the size limits but we enforce them more strictly
1526
+ // when manually flushing/compacting.
1527
+ options.max_compaction_bytes = 2 * kFileBytes;
1528
+ options.target_file_size_base = 2 * kFileBytes;
1529
+ options.write_buffer_size = 2 * kFileBytes;
1530
+ Reopen(options);
1531
+
1532
+ Random rnd(301);
1533
+ for (char first_char : {'a', 'b', 'c'}) {
1534
+ for (int i = 0; i < kFileBytes / kValueBytes; ++i) {
1535
+ std::string key(1, first_char);
1536
+ key.append(Key(i));
1537
+ std::string value = rnd.RandomString(kValueBytes);
1538
+ ASSERT_OK(Put(key, value));
1539
+ }
1540
+ ASSERT_OK(db_->Flush(FlushOptions()));
1541
+ MoveFilesToLevel(2);
1542
+ }
1543
+ ASSERT_EQ(0, NumTableFilesAtLevel(0));
1544
+ ASSERT_EQ(3, NumTableFilesAtLevel(2));
1545
+
1546
+ // Populate the memtable lightly while spanning the whole key-space. The
1547
+ // setting of `max_compaction_bytes` will cause the L0->L1 to output multiple
1548
+ // files to prevent a large L1->L2 compaction later.
1549
+ ASSERT_OK(Put("a", "val"));
1550
+ ASSERT_OK(db_->DeleteRange(WriteOptions(), db_->DefaultColumnFamily(),
1551
+ "c" + Key(1), "d"));
1552
+ // Our compaction output file cutting logic currently only considers point
1553
+ // keys. So, in order for the range tombstone to have a chance at landing at
1554
+ // the start of a new file, we need a point key at the range tombstone's
1555
+ // start.
1556
+ // TODO(ajkr): remove this `Put` after file cutting accounts for range
1557
+ // tombstones (#3977).
1558
+ ASSERT_OK(Put("c" + Key(1), "value"));
1559
+ ASSERT_OK(db_->Flush(FlushOptions()));
1560
+
1561
+ // Ensure manual L0->L1 compaction cuts the outputs before the range tombstone
1562
+ // and the range tombstone is only placed in the second SST.
1563
+ std::string begin_key_storage("c" + Key(1));
1564
+ Slice begin_key(begin_key_storage);
1565
+ std::string end_key_storage("d");
1566
+ Slice end_key(end_key_storage);
1567
+ ASSERT_OK(dbfull()->TEST_CompactRange(
1568
+ 0 /* level */, &begin_key /* begin */, &end_key /* end */,
1569
+ nullptr /* column_family */, true /* disallow_trivial_move */));
1570
+ ASSERT_EQ(2, NumTableFilesAtLevel(1));
1571
+
1572
+ std::vector<LiveFileMetaData> all_metadata;
1573
+ std::vector<LiveFileMetaData> l1_metadata;
1574
+ db_->GetLiveFilesMetaData(&all_metadata);
1575
+ for (const auto& metadata : all_metadata) {
1576
+ if (metadata.level == 1) {
1577
+ l1_metadata.push_back(metadata);
1578
+ }
1579
+ }
1580
+ std::sort(l1_metadata.begin(), l1_metadata.end(),
1581
+ [&](const LiveFileMetaData& a, const LiveFileMetaData& b) {
1582
+ return options.comparator->Compare(a.smallestkey, b.smallestkey) <
1583
+ 0;
1584
+ });
1585
+ ASSERT_EQ("a", l1_metadata[0].smallestkey);
1586
+ ASSERT_EQ("a", l1_metadata[0].largestkey);
1587
+ ASSERT_EQ("c" + Key(1), l1_metadata[1].smallestkey);
1588
+ ASSERT_EQ("d", l1_metadata[1].largestkey);
1589
+
1590
+ TablePropertiesCollection all_table_props;
1591
+ ASSERT_OK(db_->GetPropertiesOfAllTables(&all_table_props));
1592
+ int64_t num_range_deletions = 0;
1593
+ for (const auto& name_and_table_props : all_table_props) {
1594
+ const auto& name = name_and_table_props.first;
1595
+ const auto& table_props = name_and_table_props.second;
1596
+ // The range tombstone should only be output to the second L1 SST.
1597
+ if (name.size() >= l1_metadata[1].name.size() &&
1598
+ name.substr(name.size() - l1_metadata[1].name.size()).compare(l1_metadata[1].name) == 0) {
1599
+ ASSERT_EQ(1, table_props->num_range_deletions);
1600
+ ++num_range_deletions;
1601
+ } else {
1602
+ ASSERT_EQ(0, table_props->num_range_deletions);
1603
+ }
1604
+ }
1605
+ ASSERT_EQ(1, num_range_deletions);
1606
+ }
1607
+
1608
+ TEST_F(DBRangeDelTest, OverlappedTombstones) {
1609
+ const int kNumPerFile = 4, kNumFiles = 2;
1610
+ Options options = CurrentOptions();
1611
+ options.disable_auto_compactions = true;
1612
+ options.max_compaction_bytes = 9 * 1024;
1613
+ DestroyAndReopen(options);
1614
+ Random rnd(301);
1615
+ for (int i = 0; i < kNumFiles; ++i) {
1616
+ std::vector<std::string> values;
1617
+ // Write 12K (4 values, each 3K)
1618
+ for (int j = 0; j < kNumPerFile; j++) {
1619
+ values.push_back(rnd.RandomString(3 << 10));
1620
+ ASSERT_OK(Put(Key(i * kNumPerFile + j), values[j]));
1621
+ }
1622
+ }
1623
+ ASSERT_OK(db_->Flush(FlushOptions()));
1624
+ ASSERT_EQ(1, NumTableFilesAtLevel(0));
1625
+ MoveFilesToLevel(2);
1626
+ ASSERT_EQ(2, NumTableFilesAtLevel(2));
1627
+
1628
+ ASSERT_OK(db_->DeleteRange(WriteOptions(), db_->DefaultColumnFamily(), Key(1),
1629
+ Key((kNumFiles)*kNumPerFile + 1)));
1630
+ ASSERT_OK(db_->Flush(FlushOptions()));
1631
+
1632
+ ASSERT_EQ(1, NumTableFilesAtLevel(0));
1633
+
1634
+ ASSERT_OK(dbfull()->TEST_CompactRange(0, nullptr, nullptr, nullptr,
1635
+ true /* disallow_trivial_move */));
1636
+
1637
+ // The tombstone range is not broken up into multiple SSTs which may incur a
1638
+ // large compaction with L2.
1639
+ ASSERT_EQ(1, NumTableFilesAtLevel(1));
1640
+ std::vector<std::vector<FileMetaData>> files;
1641
+ ASSERT_OK(dbfull()->TEST_CompactRange(1, nullptr, nullptr, nullptr,
1642
+ true /* disallow_trivial_move */));
1643
+ ASSERT_EQ(1, NumTableFilesAtLevel(2));
1644
+ ASSERT_EQ(0, NumTableFilesAtLevel(1));
1645
+ }
1646
+
1647
+ TEST_F(DBRangeDelTest, OverlappedKeys) {
1648
+ const int kNumPerFile = 4, kNumFiles = 2;
1649
+ Options options = CurrentOptions();
1650
+ options.disable_auto_compactions = true;
1651
+ options.max_compaction_bytes = 9 * 1024;
1652
+ DestroyAndReopen(options);
1653
+ Random rnd(301);
1654
+ for (int i = 0; i < kNumFiles; ++i) {
1655
+ std::vector<std::string> values;
1656
+ // Write 12K (4 values, each 3K)
1657
+ for (int j = 0; j < kNumPerFile; j++) {
1658
+ values.push_back(rnd.RandomString(3 << 10));
1659
+ ASSERT_OK(Put(Key(i * kNumPerFile + j), values[j]));
1660
+ }
1661
+ }
1662
+ ASSERT_OK(db_->Flush(FlushOptions()));
1663
+ ASSERT_EQ(1, NumTableFilesAtLevel(0));
1664
+ MoveFilesToLevel(2);
1665
+ ASSERT_EQ(2, NumTableFilesAtLevel(2));
1666
+
1667
+ for (int i = 1; i < kNumFiles * kNumPerFile + 1; i++) {
1668
+ ASSERT_OK(Put(Key(i), "0x123"));
1669
+ }
1670
+ ASSERT_OK(db_->Flush(FlushOptions()));
1671
+ ASSERT_EQ(1, NumTableFilesAtLevel(0));
1672
+
1673
+ // The key range is broken up into three SSTs to avoid a future big compaction
1674
+ // with the grandparent
1675
+ ASSERT_OK(dbfull()->TEST_CompactRange(0, nullptr, nullptr, nullptr,
1676
+ true /* disallow_trivial_move */));
1677
+ ASSERT_EQ(3, NumTableFilesAtLevel(1));
1678
+
1679
+ std::vector<std::vector<FileMetaData>> files;
1680
+ ASSERT_OK(dbfull()->TEST_CompactRange(1, nullptr, nullptr, nullptr,
1681
+ true /* disallow_trivial_move */));
1682
+ ASSERT_EQ(1, NumTableFilesAtLevel(2));
1683
+ ASSERT_EQ(0, NumTableFilesAtLevel(1));
1684
+ }
1685
+
1686
+ #endif // ROCKSDB_LITE
1687
+
1688
+ } // namespace ROCKSDB_NAMESPACE
1689
+
1690
+ int main(int argc, char** argv) {
1691
+ ROCKSDB_NAMESPACE::port::InstallStackTraceHandler();
1692
+ ::testing::InitGoogleTest(&argc, argv);
1693
+ return RUN_ALL_TESTS();
1694
+ }