@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,2520 @@
1
+ // Copyright (c) 2011-present, Facebook, Inc. All rights reserved.
2
+ // This source code is licensed under both the GPLv2 (found in the
3
+ // COPYING file in the root directory) and Apache 2.0 License
4
+ // (found in the LICENSE.Apache file in the root directory).
5
+ //
6
+ // Copyright (c) 2011 The LevelDB Authors. All rights reserved.
7
+ // Use of this source code is governed by a BSD-style license that can be
8
+ // found in the LICENSE file. See the AUTHORS file for names of contributors.
9
+
10
+ #include "db/db_test_util.h"
11
+ #include "port/stack_trace.h"
12
+ #include "rocksdb/perf_context.h"
13
+ #include "rocksdb/utilities/debug.h"
14
+ #include "table/block_based/block_based_table_reader.h"
15
+ #include "table/block_based/block_builder.h"
16
+ #if !defined(ROCKSDB_LITE)
17
+ #include "test_util/sync_point.h"
18
+ #endif
19
+ #include "utilities/fault_injection_env.h"
20
+
21
+ namespace ROCKSDB_NAMESPACE {
22
+ class DBBasicTestWithTimestampBase : public DBTestBase {
23
+ public:
24
+ explicit DBBasicTestWithTimestampBase(const std::string& dbname)
25
+ : DBTestBase(dbname, /*env_do_fsync=*/true) {}
26
+
27
+ protected:
28
+ static std::string Key1(uint64_t k) {
29
+ std::string ret;
30
+ PutFixed64(&ret, k);
31
+ std::reverse(ret.begin(), ret.end());
32
+ return ret;
33
+ }
34
+
35
+ static std::string KeyWithPrefix(std::string prefix, uint64_t k) {
36
+ std::string ret;
37
+ PutFixed64(&ret, k);
38
+ std::reverse(ret.begin(), ret.end());
39
+ return prefix + ret;
40
+ }
41
+
42
+ static std::vector<Slice> ConvertStrToSlice(
43
+ std::vector<std::string>& strings) {
44
+ std::vector<Slice> ret;
45
+ for (const auto& s : strings) {
46
+ ret.emplace_back(s);
47
+ }
48
+ return ret;
49
+ }
50
+
51
+ class TestComparator : public Comparator {
52
+ private:
53
+ const Comparator* cmp_without_ts_;
54
+
55
+ public:
56
+ explicit TestComparator(size_t ts_sz)
57
+ : Comparator(ts_sz), cmp_without_ts_(nullptr) {
58
+ cmp_without_ts_ = BytewiseComparator();
59
+ }
60
+
61
+ const char* Name() const override { return "TestComparator"; }
62
+
63
+ void FindShortSuccessor(std::string*) const override {}
64
+
65
+ void FindShortestSeparator(std::string*, const Slice&) const override {}
66
+
67
+ int Compare(const Slice& a, const Slice& b) const override {
68
+ int r = CompareWithoutTimestamp(a, b);
69
+ if (r != 0 || 0 == timestamp_size()) {
70
+ return r;
71
+ }
72
+ return -CompareTimestamp(
73
+ Slice(a.data() + a.size() - timestamp_size(), timestamp_size()),
74
+ Slice(b.data() + b.size() - timestamp_size(), timestamp_size()));
75
+ }
76
+
77
+ using Comparator::CompareWithoutTimestamp;
78
+ int CompareWithoutTimestamp(const Slice& a, bool a_has_ts, const Slice& b,
79
+ bool b_has_ts) const override {
80
+ if (a_has_ts) {
81
+ assert(a.size() >= timestamp_size());
82
+ }
83
+ if (b_has_ts) {
84
+ assert(b.size() >= timestamp_size());
85
+ }
86
+ Slice lhs = a_has_ts ? StripTimestampFromUserKey(a, timestamp_size()) : a;
87
+ Slice rhs = b_has_ts ? StripTimestampFromUserKey(b, timestamp_size()) : b;
88
+ return cmp_without_ts_->Compare(lhs, rhs);
89
+ }
90
+
91
+ int CompareTimestamp(const Slice& ts1, const Slice& ts2) const override {
92
+ if (!ts1.data() && !ts2.data()) {
93
+ return 0;
94
+ } else if (ts1.data() && !ts2.data()) {
95
+ return 1;
96
+ } else if (!ts1.data() && ts2.data()) {
97
+ return -1;
98
+ }
99
+ assert(ts1.size() == ts2.size());
100
+ uint64_t low1 = 0;
101
+ uint64_t low2 = 0;
102
+ uint64_t high1 = 0;
103
+ uint64_t high2 = 0;
104
+ const size_t kSize = ts1.size();
105
+ std::unique_ptr<char[]> ts1_buf(new char[kSize]);
106
+ memcpy(ts1_buf.get(), ts1.data(), ts1.size());
107
+ std::unique_ptr<char[]> ts2_buf(new char[kSize]);
108
+ memcpy(ts2_buf.get(), ts2.data(), ts2.size());
109
+ Slice ts1_copy = Slice(ts1_buf.get(), kSize);
110
+ Slice ts2_copy = Slice(ts2_buf.get(), kSize);
111
+ auto* ptr1 = const_cast<Slice*>(&ts1_copy);
112
+ auto* ptr2 = const_cast<Slice*>(&ts2_copy);
113
+ if (!GetFixed64(ptr1, &low1) || !GetFixed64(ptr1, &high1) ||
114
+ !GetFixed64(ptr2, &low2) || !GetFixed64(ptr2, &high2)) {
115
+ assert(false);
116
+ }
117
+ if (high1 < high2) {
118
+ return -1;
119
+ } else if (high1 > high2) {
120
+ return 1;
121
+ }
122
+ if (low1 < low2) {
123
+ return -1;
124
+ } else if (low1 > low2) {
125
+ return 1;
126
+ }
127
+ return 0;
128
+ }
129
+ };
130
+
131
+ std::string Timestamp(uint64_t low, uint64_t high) {
132
+ std::string ts;
133
+ PutFixed64(&ts, low);
134
+ PutFixed64(&ts, high);
135
+ return ts;
136
+ }
137
+
138
+ void CheckIterUserEntry(const Iterator* it, const Slice& expected_key,
139
+ ValueType expected_value_type,
140
+ const Slice& expected_value,
141
+ const Slice& expected_ts) const {
142
+ ASSERT_TRUE(it->Valid());
143
+ ASSERT_OK(it->status());
144
+ ASSERT_EQ(expected_key, it->key());
145
+ if (kTypeValue == expected_value_type) {
146
+ ASSERT_EQ(expected_value, it->value());
147
+ }
148
+ ASSERT_EQ(expected_ts, it->timestamp());
149
+ }
150
+
151
+ void CheckIterEntry(const Iterator* it, const Slice& expected_ukey,
152
+ SequenceNumber expected_seq, ValueType expected_val_type,
153
+ const Slice& expected_value, const Slice& expected_ts) {
154
+ ASSERT_TRUE(it->Valid());
155
+ ASSERT_OK(it->status());
156
+ std::string ukey_and_ts;
157
+ ukey_and_ts.assign(expected_ukey.data(), expected_ukey.size());
158
+ ukey_and_ts.append(expected_ts.data(), expected_ts.size());
159
+ ParsedInternalKey parsed_ikey;
160
+ ASSERT_OK(
161
+ ParseInternalKey(it->key(), &parsed_ikey, true /* log_err_key */));
162
+ ASSERT_EQ(ukey_and_ts, parsed_ikey.user_key);
163
+ ASSERT_EQ(expected_val_type, parsed_ikey.type);
164
+ ASSERT_EQ(expected_seq, parsed_ikey.sequence);
165
+ if (expected_val_type == kTypeValue) {
166
+ ASSERT_EQ(expected_value, it->value());
167
+ }
168
+ ASSERT_EQ(expected_ts, it->timestamp());
169
+ }
170
+
171
+ void CheckIterEntry(const Iterator* it, const Slice& expected_ukey,
172
+ ValueType expected_val_type, const Slice& expected_value,
173
+ const Slice& expected_ts) {
174
+ ASSERT_TRUE(it->Valid());
175
+ ASSERT_OK(it->status());
176
+ std::string ukey_and_ts;
177
+ ukey_and_ts.assign(expected_ukey.data(), expected_ukey.size());
178
+ ukey_and_ts.append(expected_ts.data(), expected_ts.size());
179
+
180
+ ParsedInternalKey parsed_ikey;
181
+ ASSERT_OK(
182
+ ParseInternalKey(it->key(), &parsed_ikey, true /* log_err_key */));
183
+ ASSERT_EQ(expected_val_type, parsed_ikey.type);
184
+ ASSERT_EQ(Slice(ukey_and_ts), parsed_ikey.user_key);
185
+ if (expected_val_type == kTypeValue) {
186
+ ASSERT_EQ(expected_value, it->value());
187
+ }
188
+ ASSERT_EQ(expected_ts, it->timestamp());
189
+ }
190
+ };
191
+
192
+ class DBBasicTestWithTimestamp : public DBBasicTestWithTimestampBase {
193
+ public:
194
+ DBBasicTestWithTimestamp()
195
+ : DBBasicTestWithTimestampBase("db_basic_test_with_timestamp") {}
196
+ };
197
+
198
+ TEST_F(DBBasicTestWithTimestamp, CompactRangeWithSpecifiedRange) {
199
+ Options options = CurrentOptions();
200
+ options.env = env_;
201
+ options.create_if_missing = true;
202
+ const size_t kTimestampSize = Timestamp(0, 0).size();
203
+ TestComparator test_cmp(kTimestampSize);
204
+ options.comparator = &test_cmp;
205
+ DestroyAndReopen(options);
206
+
207
+ WriteOptions write_opts;
208
+ std::string ts_str = Timestamp(1, 0);
209
+ Slice ts = ts_str;
210
+ write_opts.timestamp = &ts;
211
+
212
+ ASSERT_OK(db_->Put(write_opts, "foo1", "bar"));
213
+ ASSERT_OK(Flush());
214
+
215
+ ASSERT_OK(db_->Put(write_opts, "foo2", "bar"));
216
+ ASSERT_OK(Flush());
217
+
218
+ std::string start_str = "foo";
219
+ std::string end_str = "foo2";
220
+ Slice start(start_str), end(end_str);
221
+ ASSERT_OK(db_->CompactRange(CompactRangeOptions(), &start, &end));
222
+
223
+ Close();
224
+ }
225
+
226
+ TEST_F(DBBasicTestWithTimestamp, GetApproximateSizes) {
227
+ Options options = CurrentOptions();
228
+ options.write_buffer_size = 100000000; // Large write buffer
229
+ options.compression = kNoCompression;
230
+ options.create_if_missing = true;
231
+ const size_t kTimestampSize = Timestamp(0, 0).size();
232
+ TestComparator test_cmp(kTimestampSize);
233
+ options.comparator = &test_cmp;
234
+ DestroyAndReopen(options);
235
+ auto default_cf = db_->DefaultColumnFamily();
236
+
237
+ WriteOptions write_opts;
238
+ std::string ts_str = Timestamp(1, 0);
239
+ Slice ts = ts_str;
240
+ write_opts.timestamp = &ts;
241
+
242
+ const int N = 128;
243
+ Random rnd(301);
244
+ for (int i = 0; i < N; i++) {
245
+ ASSERT_OK(db_->Put(write_opts, Key(i), rnd.RandomString(1024)));
246
+ }
247
+
248
+ uint64_t size;
249
+ std::string start = Key(50);
250
+ std::string end = Key(60);
251
+ Range r(start, end);
252
+ SizeApproximationOptions size_approx_options;
253
+ size_approx_options.include_memtabtles = true;
254
+ size_approx_options.include_files = true;
255
+ ASSERT_OK(
256
+ db_->GetApproximateSizes(size_approx_options, default_cf, &r, 1, &size));
257
+ ASSERT_GT(size, 6000);
258
+ ASSERT_LT(size, 204800);
259
+
260
+ // test multiple ranges
261
+ std::vector<Range> ranges;
262
+ std::string start_tmp = Key(10);
263
+ std::string end_tmp = Key(20);
264
+ ranges.emplace_back(Range(start_tmp, end_tmp));
265
+ ranges.emplace_back(Range(start, end));
266
+ uint64_t range_sizes[2];
267
+ ASSERT_OK(db_->GetApproximateSizes(size_approx_options, default_cf,
268
+ ranges.data(), 2, range_sizes));
269
+
270
+ ASSERT_EQ(range_sizes[1], size);
271
+
272
+ // Zero if not including mem table
273
+ ASSERT_OK(db_->GetApproximateSizes(&r, 1, &size));
274
+ ASSERT_EQ(size, 0);
275
+
276
+ start = Key(500);
277
+ end = Key(600);
278
+ r = Range(start, end);
279
+ ASSERT_OK(
280
+ db_->GetApproximateSizes(size_approx_options, default_cf, &r, 1, &size));
281
+ ASSERT_EQ(size, 0);
282
+
283
+ // Test range boundaries
284
+ ASSERT_OK(db_->Put(write_opts, Key(1000), rnd.RandomString(1024)));
285
+ // Should include start key
286
+ start = Key(1000);
287
+ end = Key(1100);
288
+ r = Range(start, end);
289
+ ASSERT_OK(
290
+ db_->GetApproximateSizes(size_approx_options, default_cf, &r, 1, &size));
291
+ ASSERT_GT(size, 0);
292
+
293
+ // Should exclude end key
294
+ start = Key(900);
295
+ end = Key(1000);
296
+ r = Range(start, end);
297
+ ASSERT_OK(
298
+ db_->GetApproximateSizes(size_approx_options, default_cf, &r, 1, &size));
299
+ ASSERT_EQ(size, 0);
300
+ std::cout << size << std::endl;
301
+
302
+ Close();
303
+ }
304
+
305
+ TEST_F(DBBasicTestWithTimestamp, SimpleForwardIterate) {
306
+ const int kNumKeysPerFile = 128;
307
+ const uint64_t kMaxKey = 1024;
308
+ Options options = CurrentOptions();
309
+ options.env = env_;
310
+ options.create_if_missing = true;
311
+ const size_t kTimestampSize = Timestamp(0, 0).size();
312
+ TestComparator test_cmp(kTimestampSize);
313
+ options.comparator = &test_cmp;
314
+ options.memtable_factory.reset(new SpecialSkipListFactory(kNumKeysPerFile));
315
+ DestroyAndReopen(options);
316
+ const std::vector<uint64_t> start_keys = {1, 0};
317
+ const std::vector<std::string> write_timestamps = {Timestamp(1, 0),
318
+ Timestamp(3, 0)};
319
+ const std::vector<std::string> read_timestamps = {Timestamp(2, 0),
320
+ Timestamp(4, 0)};
321
+ for (size_t i = 0; i < write_timestamps.size(); ++i) {
322
+ WriteOptions write_opts;
323
+ Slice write_ts = write_timestamps[i];
324
+ write_opts.timestamp = &write_ts;
325
+ for (uint64_t key = start_keys[i]; key <= kMaxKey; ++key) {
326
+ Status s = db_->Put(write_opts, Key1(key), "value" + std::to_string(i));
327
+ ASSERT_OK(s);
328
+ }
329
+ }
330
+ for (size_t i = 0; i < read_timestamps.size(); ++i) {
331
+ ReadOptions read_opts;
332
+ Slice read_ts = read_timestamps[i];
333
+ read_opts.timestamp = &read_ts;
334
+ std::unique_ptr<Iterator> it(db_->NewIterator(read_opts));
335
+ int count = 0;
336
+ uint64_t key = 0;
337
+ for (it->Seek(Key1(0)), key = start_keys[i]; it->Valid();
338
+ it->Next(), ++count, ++key) {
339
+ CheckIterUserEntry(it.get(), Key1(key), kTypeValue,
340
+ "value" + std::to_string(i), write_timestamps[i]);
341
+ }
342
+ size_t expected_count = kMaxKey - start_keys[i] + 1;
343
+ ASSERT_EQ(expected_count, count);
344
+
345
+ // SeekToFirst() with lower bound.
346
+ // Then iter with lower and upper bounds.
347
+ uint64_t l = 0;
348
+ uint64_t r = kMaxKey + 1;
349
+ while (l < r) {
350
+ std::string lb_str = Key1(l);
351
+ Slice lb = lb_str;
352
+ std::string ub_str = Key1(r);
353
+ Slice ub = ub_str;
354
+ read_opts.iterate_lower_bound = &lb;
355
+ read_opts.iterate_upper_bound = &ub;
356
+ it.reset(db_->NewIterator(read_opts));
357
+ for (it->SeekToFirst(), key = std::max(l, start_keys[i]), count = 0;
358
+ it->Valid(); it->Next(), ++key, ++count) {
359
+ CheckIterUserEntry(it.get(), Key1(key), kTypeValue,
360
+ "value" + std::to_string(i), write_timestamps[i]);
361
+ }
362
+ ASSERT_EQ(r - std::max(l, start_keys[i]), count);
363
+ l += (kMaxKey / 100);
364
+ r -= (kMaxKey / 100);
365
+ }
366
+ }
367
+ Close();
368
+ }
369
+
370
+ TEST_F(DBBasicTestWithTimestamp, SeekWithPrefixLessThanKey) {
371
+ Options options = CurrentOptions();
372
+ options.env = env_;
373
+ options.create_if_missing = true;
374
+ options.prefix_extractor.reset(NewFixedPrefixTransform(3));
375
+ options.memtable_whole_key_filtering = true;
376
+ options.memtable_prefix_bloom_size_ratio = 0.1;
377
+ BlockBasedTableOptions bbto;
378
+ bbto.filter_policy.reset(NewBloomFilterPolicy(10, false));
379
+ bbto.cache_index_and_filter_blocks = true;
380
+ bbto.whole_key_filtering = true;
381
+ options.table_factory.reset(NewBlockBasedTableFactory(bbto));
382
+ const size_t kTimestampSize = Timestamp(0, 0).size();
383
+ TestComparator test_cmp(kTimestampSize);
384
+ options.comparator = &test_cmp;
385
+ DestroyAndReopen(options);
386
+
387
+ WriteOptions write_opts;
388
+ std::string ts_str = Timestamp(1, 0);
389
+ Slice ts = ts_str;
390
+ write_opts.timestamp = &ts;
391
+
392
+ ASSERT_OK(db_->Put(write_opts, "foo1", "bar"));
393
+ ASSERT_OK(Flush());
394
+
395
+ ASSERT_OK(db_->Put(write_opts, "foo2", "bar"));
396
+ ASSERT_OK(Flush());
397
+
398
+ // Move sst file to next level
399
+ ASSERT_OK(db_->CompactRange(CompactRangeOptions(), nullptr, nullptr));
400
+
401
+ ASSERT_OK(db_->Put(write_opts, "foo3", "bar"));
402
+ ASSERT_OK(Flush());
403
+
404
+ ReadOptions read_opts;
405
+ std::string read_ts = Timestamp(1, 0);
406
+ ts = read_ts;
407
+ read_opts.timestamp = &ts;
408
+ {
409
+ std::unique_ptr<Iterator> iter(db_->NewIterator(read_opts));
410
+ iter->Seek("foo");
411
+ ASSERT_TRUE(iter->Valid());
412
+ ASSERT_OK(iter->status());
413
+ iter->Next();
414
+ ASSERT_TRUE(iter->Valid());
415
+ ASSERT_OK(iter->status());
416
+
417
+ iter->Seek("bbb");
418
+ ASSERT_FALSE(iter->Valid());
419
+ ASSERT_OK(iter->status());
420
+ }
421
+
422
+ Close();
423
+ }
424
+
425
+ TEST_F(DBBasicTestWithTimestamp, SeekWithPrefixLargerThanKey) {
426
+ Options options = CurrentOptions();
427
+ options.env = env_;
428
+ options.create_if_missing = true;
429
+ options.prefix_extractor.reset(NewFixedPrefixTransform(20));
430
+ options.memtable_whole_key_filtering = true;
431
+ options.memtable_prefix_bloom_size_ratio = 0.1;
432
+ BlockBasedTableOptions bbto;
433
+ bbto.filter_policy.reset(NewBloomFilterPolicy(10, false));
434
+ bbto.cache_index_and_filter_blocks = true;
435
+ bbto.whole_key_filtering = true;
436
+ options.table_factory.reset(NewBlockBasedTableFactory(bbto));
437
+ const size_t kTimestampSize = Timestamp(0, 0).size();
438
+ TestComparator test_cmp(kTimestampSize);
439
+ options.comparator = &test_cmp;
440
+ DestroyAndReopen(options);
441
+
442
+ WriteOptions write_opts;
443
+ std::string ts_str = Timestamp(1, 0);
444
+ Slice ts = ts_str;
445
+ write_opts.timestamp = &ts;
446
+
447
+ ASSERT_OK(db_->Put(write_opts, "foo1", "bar"));
448
+ ASSERT_OK(Flush());
449
+
450
+ ASSERT_OK(db_->Put(write_opts, "foo2", "bar"));
451
+ ASSERT_OK(Flush());
452
+
453
+ // Move sst file to next level
454
+ ASSERT_OK(db_->CompactRange(CompactRangeOptions(), nullptr, nullptr));
455
+
456
+ ASSERT_OK(db_->Put(write_opts, "foo3", "bar"));
457
+ ASSERT_OK(Flush());
458
+
459
+ ReadOptions read_opts;
460
+ std::string read_ts = Timestamp(2, 0);
461
+ ts = read_ts;
462
+ read_opts.timestamp = &ts;
463
+ {
464
+ std::unique_ptr<Iterator> iter(db_->NewIterator(read_opts));
465
+ // Make sure the prefix extractor doesn't include timestamp, otherwise it
466
+ // may return invalid result.
467
+ iter->Seek("foo");
468
+ ASSERT_TRUE(iter->Valid());
469
+ ASSERT_OK(iter->status());
470
+ iter->Next();
471
+ ASSERT_TRUE(iter->Valid());
472
+ ASSERT_OK(iter->status());
473
+ }
474
+
475
+ Close();
476
+ }
477
+
478
+ TEST_F(DBBasicTestWithTimestamp, SeekWithBound) {
479
+ Options options = CurrentOptions();
480
+ options.env = env_;
481
+ options.create_if_missing = true;
482
+ options.prefix_extractor.reset(NewFixedPrefixTransform(2));
483
+ BlockBasedTableOptions bbto;
484
+ bbto.filter_policy.reset(NewBloomFilterPolicy(10, false));
485
+ bbto.cache_index_and_filter_blocks = true;
486
+ bbto.whole_key_filtering = true;
487
+ options.table_factory.reset(NewBlockBasedTableFactory(bbto));
488
+ const size_t kTimestampSize = Timestamp(0, 0).size();
489
+ TestComparator test_cmp(kTimestampSize);
490
+ options.comparator = &test_cmp;
491
+ DestroyAndReopen(options);
492
+
493
+ WriteOptions write_opts;
494
+ std::string ts_str = Timestamp(1, 0);
495
+ Slice ts = ts_str;
496
+ write_opts.timestamp = &ts;
497
+
498
+ ASSERT_OK(db_->Put(write_opts, "foo1", "bar"));
499
+ ASSERT_OK(Flush());
500
+
501
+ ASSERT_OK(db_->Put(write_opts, "foo2", "bar"));
502
+ ASSERT_OK(Flush());
503
+
504
+ // Move sst file to next level
505
+ ASSERT_OK(db_->CompactRange(CompactRangeOptions(), nullptr, nullptr));
506
+
507
+ ASSERT_OK(db_->Put(write_opts, "foo3", "bar"));
508
+ ASSERT_OK(Flush());
509
+
510
+ ReadOptions read_opts;
511
+ std::string read_ts = Timestamp(2, 0);
512
+ ts = read_ts;
513
+ read_opts.timestamp = &ts;
514
+ std::string up_bound = "foo5";
515
+ Slice up_bound_slice = up_bound;
516
+ read_opts.iterate_upper_bound = &up_bound_slice;
517
+ read_opts.auto_prefix_mode = true;
518
+ {
519
+ std::unique_ptr<Iterator> iter(db_->NewIterator(read_opts));
520
+ // Make sure the prefix extractor doesn't include timestamp, otherwise it
521
+ // may return invalid result.
522
+ iter->Seek("foo");
523
+ ASSERT_TRUE(iter->Valid());
524
+ ASSERT_OK(iter->status());
525
+ }
526
+
527
+ Close();
528
+ }
529
+
530
+ TEST_F(DBBasicTestWithTimestamp, SimpleForwardIterateLowerTsBound) {
531
+ constexpr int kNumKeysPerFile = 128;
532
+ constexpr uint64_t kMaxKey = 1024;
533
+ Options options = CurrentOptions();
534
+ options.env = env_;
535
+ options.create_if_missing = true;
536
+ const size_t kTimestampSize = Timestamp(0, 0).size();
537
+ TestComparator test_cmp(kTimestampSize);
538
+ options.comparator = &test_cmp;
539
+ options.memtable_factory.reset(new SpecialSkipListFactory(kNumKeysPerFile));
540
+ DestroyAndReopen(options);
541
+ const std::vector<std::string> write_timestamps = {Timestamp(1, 0),
542
+ Timestamp(3, 0)};
543
+ const std::vector<std::string> read_timestamps = {Timestamp(2, 0),
544
+ Timestamp(4, 0)};
545
+ const std::vector<std::string> read_timestamps_lb = {Timestamp(1, 0),
546
+ Timestamp(1, 0)};
547
+ for (size_t i = 0; i < write_timestamps.size(); ++i) {
548
+ WriteOptions write_opts;
549
+ Slice write_ts = write_timestamps[i];
550
+ write_opts.timestamp = &write_ts;
551
+ for (uint64_t key = 0; key <= kMaxKey; ++key) {
552
+ Status s = db_->Put(write_opts, Key1(key), "value" + std::to_string(i));
553
+ ASSERT_OK(s);
554
+ }
555
+ }
556
+ for (size_t i = 0; i < read_timestamps.size(); ++i) {
557
+ ReadOptions read_opts;
558
+ Slice read_ts = read_timestamps[i];
559
+ Slice read_ts_lb = read_timestamps_lb[i];
560
+ read_opts.timestamp = &read_ts;
561
+ read_opts.iter_start_ts = &read_ts_lb;
562
+ std::unique_ptr<Iterator> it(db_->NewIterator(read_opts));
563
+ int count = 0;
564
+ uint64_t key = 0;
565
+ for (it->Seek(Key1(0)), key = 0; it->Valid(); it->Next(), ++count, ++key) {
566
+ CheckIterEntry(it.get(), Key1(key), kTypeValue,
567
+ "value" + std::to_string(i), write_timestamps[i]);
568
+ if (i > 0) {
569
+ it->Next();
570
+ CheckIterEntry(it.get(), Key1(key), kTypeValue,
571
+ "value" + std::to_string(i - 1),
572
+ write_timestamps[i - 1]);
573
+ }
574
+ }
575
+ size_t expected_count = kMaxKey + 1;
576
+ ASSERT_EQ(expected_count, count);
577
+ }
578
+ // Delete all keys@ts=5 and check iteration result with start ts set
579
+ {
580
+ std::string write_timestamp = Timestamp(5, 0);
581
+ WriteOptions write_opts;
582
+ Slice write_ts = write_timestamp;
583
+ write_opts.timestamp = &write_ts;
584
+ for (uint64_t key = 0; key < kMaxKey + 1; ++key) {
585
+ Status s = db_->Delete(write_opts, Key1(key));
586
+ ASSERT_OK(s);
587
+ }
588
+
589
+ std::string read_timestamp = Timestamp(6, 0);
590
+ ReadOptions read_opts;
591
+ Slice read_ts = read_timestamp;
592
+ read_opts.timestamp = &read_ts;
593
+ std::string read_timestamp_lb = Timestamp(2, 0);
594
+ Slice read_ts_lb = read_timestamp_lb;
595
+ read_opts.iter_start_ts = &read_ts_lb;
596
+ std::unique_ptr<Iterator> it(db_->NewIterator(read_opts));
597
+ int count = 0;
598
+ uint64_t key = 0;
599
+ for (it->Seek(Key1(0)), key = 0; it->Valid(); it->Next(), ++count, ++key) {
600
+ CheckIterEntry(it.get(), Key1(key), kTypeDeletionWithTimestamp, Slice(),
601
+ write_ts);
602
+ // Skip key@ts=3 and land on tombstone key@ts=5
603
+ it->Next();
604
+ }
605
+ ASSERT_EQ(kMaxKey + 1, count);
606
+ }
607
+ Close();
608
+ }
609
+
610
+ TEST_F(DBBasicTestWithTimestamp, ForwardIterateStartSeqnum) {
611
+ const int kNumKeysPerFile = 128;
612
+ const uint64_t kMaxKey = 0xffffffffffffffff;
613
+ const uint64_t kMinKey = kMaxKey - 1023;
614
+ Options options = CurrentOptions();
615
+ options.env = env_;
616
+ options.create_if_missing = true;
617
+ // Need to disable compaction to bottommost level when sequence number will be
618
+ // zeroed out, causing the verification of sequence number to fail in this
619
+ // test.
620
+ options.disable_auto_compactions = true;
621
+ const size_t kTimestampSize = Timestamp(0, 0).size();
622
+ TestComparator test_cmp(kTimestampSize);
623
+ options.comparator = &test_cmp;
624
+ options.memtable_factory.reset(new SpecialSkipListFactory(kNumKeysPerFile));
625
+ DestroyAndReopen(options);
626
+ std::vector<SequenceNumber> start_seqs;
627
+
628
+ const int kNumTimestamps = 4;
629
+ std::vector<std::string> write_ts_list;
630
+ for (int t = 0; t != kNumTimestamps; ++t) {
631
+ write_ts_list.push_back(Timestamp(2 * t, /*do not care*/ 17));
632
+ }
633
+ WriteOptions write_opts;
634
+ for (size_t i = 0; i != write_ts_list.size(); ++i) {
635
+ Slice write_ts = write_ts_list[i];
636
+ write_opts.timestamp = &write_ts;
637
+ for (uint64_t k = kMaxKey; k >= kMinKey; --k) {
638
+ Status s;
639
+ if (k % 2) {
640
+ s = db_->Put(write_opts, Key1(k), "value" + std::to_string(i));
641
+ } else {
642
+ s = db_->Delete(write_opts, Key1(k));
643
+ }
644
+ ASSERT_OK(s);
645
+ }
646
+ start_seqs.push_back(db_->GetLatestSequenceNumber());
647
+ }
648
+ std::vector<std::string> read_ts_list;
649
+ for (int t = 0; t != kNumTimestamps - 1; ++t) {
650
+ read_ts_list.push_back(Timestamp(2 * t + 3, /*do not care*/ 17));
651
+ }
652
+
653
+ ReadOptions read_opts;
654
+ // Scan with only read_opts.iter_start_seqnum set.
655
+ for (size_t i = 0; i != read_ts_list.size(); ++i) {
656
+ Slice read_ts = read_ts_list[i];
657
+ read_opts.timestamp = &read_ts;
658
+ read_opts.iter_start_seqnum = start_seqs[i] + 1;
659
+ std::unique_ptr<Iterator> iter(db_->NewIterator(read_opts));
660
+ SequenceNumber expected_seq = start_seqs[i] + (kMaxKey - kMinKey) + 1;
661
+ uint64_t key = kMinKey;
662
+ for (iter->Seek(Key1(kMinKey)); iter->Valid(); iter->Next()) {
663
+ CheckIterEntry(
664
+ iter.get(), Key1(key), expected_seq,
665
+ (key % 2) ? kTypeValue : kTypeDeletionWithTimestamp,
666
+ (key % 2) ? "value" + std::to_string(i + 1) : std::string(),
667
+ write_ts_list[i + 1]);
668
+ ++key;
669
+ --expected_seq;
670
+ }
671
+ }
672
+ // Scan with both read_opts.iter_start_seqnum and read_opts.iter_start_ts set.
673
+ std::vector<std::string> read_ts_lb_list;
674
+ for (int t = 0; t < kNumTimestamps - 1; ++t) {
675
+ read_ts_lb_list.push_back(Timestamp(2 * t, /*do not care*/ 17));
676
+ }
677
+ for (size_t i = 0; i < read_ts_list.size(); ++i) {
678
+ Slice read_ts = read_ts_list[i];
679
+ Slice read_ts_lb = read_ts_lb_list[i];
680
+ read_opts.timestamp = &read_ts;
681
+ read_opts.iter_start_ts = &read_ts_lb;
682
+ read_opts.iter_start_seqnum = start_seqs[i] + 1;
683
+ std::unique_ptr<Iterator> it(db_->NewIterator(read_opts));
684
+ uint64_t key = kMinKey;
685
+ SequenceNumber expected_seq = start_seqs[i] + (kMaxKey - kMinKey) + 1;
686
+ for (it->Seek(Key1(kMinKey)); it->Valid(); it->Next()) {
687
+ CheckIterEntry(it.get(), Key1(key), expected_seq,
688
+ (key % 2) ? kTypeValue : kTypeDeletionWithTimestamp,
689
+ "value" + std::to_string(i + 1), write_ts_list[i + 1]);
690
+ ++key;
691
+ --expected_seq;
692
+ }
693
+ }
694
+ Close();
695
+ }
696
+
697
+ TEST_F(DBBasicTestWithTimestamp, ReseekToTargetTimestamp) {
698
+ Options options = CurrentOptions();
699
+ options.env = env_;
700
+ options.create_if_missing = true;
701
+ constexpr size_t kNumKeys = 16;
702
+ options.max_sequential_skip_in_iterations = kNumKeys / 2;
703
+ options.statistics = ROCKSDB_NAMESPACE::CreateDBStatistics();
704
+ const size_t kTimestampSize = Timestamp(0, 0).size();
705
+ TestComparator test_cmp(kTimestampSize);
706
+ options.comparator = &test_cmp;
707
+ DestroyAndReopen(options);
708
+ // Insert kNumKeys
709
+ WriteOptions write_opts;
710
+ Status s;
711
+ for (size_t i = 0; i != kNumKeys; ++i) {
712
+ std::string ts_str = Timestamp(static_cast<uint64_t>(i + 1), 0);
713
+ Slice ts = ts_str;
714
+ write_opts.timestamp = &ts;
715
+ s = db_->Put(write_opts, "foo", "value" + std::to_string(i));
716
+ ASSERT_OK(s);
717
+ }
718
+ {
719
+ ReadOptions read_opts;
720
+ std::string ts_str = Timestamp(1, 0);
721
+ Slice ts = ts_str;
722
+ read_opts.timestamp = &ts;
723
+ std::unique_ptr<Iterator> iter(db_->NewIterator(read_opts));
724
+ iter->SeekToFirst();
725
+ CheckIterUserEntry(iter.get(), "foo", kTypeValue, "value0", ts_str);
726
+ ASSERT_EQ(
727
+ 1, options.statistics->getTickerCount(NUMBER_OF_RESEEKS_IN_ITERATION));
728
+ }
729
+ Close();
730
+ }
731
+
732
+ TEST_F(DBBasicTestWithTimestamp, ReseekToNextUserKey) {
733
+ Options options = CurrentOptions();
734
+ options.env = env_;
735
+ options.create_if_missing = true;
736
+ constexpr size_t kNumKeys = 16;
737
+ options.max_sequential_skip_in_iterations = kNumKeys / 2;
738
+ options.statistics = ROCKSDB_NAMESPACE::CreateDBStatistics();
739
+ const size_t kTimestampSize = Timestamp(0, 0).size();
740
+ TestComparator test_cmp(kTimestampSize);
741
+ options.comparator = &test_cmp;
742
+ DestroyAndReopen(options);
743
+ // Write kNumKeys + 1 keys
744
+ WriteOptions write_opts;
745
+ Status s;
746
+ for (size_t i = 0; i != kNumKeys; ++i) {
747
+ std::string ts_str = Timestamp(static_cast<uint64_t>(i + 1), 0);
748
+ Slice ts = ts_str;
749
+ write_opts.timestamp = &ts;
750
+ s = db_->Put(write_opts, "a", "value" + std::to_string(i));
751
+ ASSERT_OK(s);
752
+ }
753
+ {
754
+ std::string ts_str = Timestamp(static_cast<uint64_t>(kNumKeys + 1), 0);
755
+ WriteBatch batch(0, 0, kTimestampSize);
756
+ ASSERT_OK(batch.Put("a", "new_value"));
757
+ ASSERT_OK(batch.Put("b", "new_value"));
758
+ s = batch.AssignTimestamp(ts_str);
759
+ ASSERT_OK(s);
760
+ s = db_->Write(write_opts, &batch);
761
+ ASSERT_OK(s);
762
+ }
763
+ {
764
+ ReadOptions read_opts;
765
+ std::string ts_str = Timestamp(static_cast<uint64_t>(kNumKeys + 1), 0);
766
+ Slice ts = ts_str;
767
+ read_opts.timestamp = &ts;
768
+ std::unique_ptr<Iterator> iter(db_->NewIterator(read_opts));
769
+ iter->Seek("a");
770
+ iter->Next();
771
+ CheckIterUserEntry(iter.get(), "b", kTypeValue, "new_value", ts_str);
772
+ ASSERT_EQ(
773
+ 1, options.statistics->getTickerCount(NUMBER_OF_RESEEKS_IN_ITERATION));
774
+ }
775
+ Close();
776
+ }
777
+
778
+ TEST_F(DBBasicTestWithTimestamp, MultiGetWithFastLocalBloom) {
779
+ Options options = CurrentOptions();
780
+ options.env = env_;
781
+ options.create_if_missing = true;
782
+ BlockBasedTableOptions bbto;
783
+ bbto.filter_policy.reset(NewBloomFilterPolicy(10, false));
784
+ bbto.cache_index_and_filter_blocks = true;
785
+ bbto.whole_key_filtering = true;
786
+ options.table_factory.reset(NewBlockBasedTableFactory(bbto));
787
+ const size_t kTimestampSize = Timestamp(0, 0).size();
788
+ TestComparator test_cmp(kTimestampSize);
789
+ options.comparator = &test_cmp;
790
+ DestroyAndReopen(options);
791
+
792
+ // Write any value
793
+ WriteOptions write_opts;
794
+ std::string ts_str = Timestamp(1, 0);
795
+ Slice ts = ts_str;
796
+ write_opts.timestamp = &ts;
797
+
798
+ ASSERT_OK(db_->Put(write_opts, "foo", "bar"));
799
+
800
+ ASSERT_OK(Flush());
801
+
802
+ // Read with MultiGet
803
+ ReadOptions read_opts;
804
+ read_opts.timestamp = &ts;
805
+ size_t batch_size = 1;
806
+ std::vector<Slice> keys(batch_size);
807
+ std::vector<PinnableSlice> values(batch_size);
808
+ std::vector<Status> statuses(batch_size);
809
+ keys[0] = "foo";
810
+ ColumnFamilyHandle* cfh = db_->DefaultColumnFamily();
811
+ db_->MultiGet(read_opts, cfh, batch_size, keys.data(), values.data(),
812
+ statuses.data());
813
+
814
+ ASSERT_OK(statuses[0]);
815
+ Close();
816
+ }
817
+
818
+ TEST_F(DBBasicTestWithTimestamp, MultiGetWithPrefix) {
819
+ Options options = CurrentOptions();
820
+ options.env = env_;
821
+ options.create_if_missing = true;
822
+ options.prefix_extractor.reset(NewCappedPrefixTransform(5));
823
+ BlockBasedTableOptions bbto;
824
+ bbto.filter_policy.reset(NewBloomFilterPolicy(10, false));
825
+ bbto.cache_index_and_filter_blocks = true;
826
+ bbto.whole_key_filtering = false;
827
+ options.table_factory.reset(NewBlockBasedTableFactory(bbto));
828
+ const size_t kTimestampSize = Timestamp(0, 0).size();
829
+ TestComparator test_cmp(kTimestampSize);
830
+ options.comparator = &test_cmp;
831
+ DestroyAndReopen(options);
832
+
833
+ // Write any value
834
+ WriteOptions write_opts;
835
+ std::string ts_str = Timestamp(1, 0);
836
+ Slice ts = ts_str;
837
+ write_opts.timestamp = &ts;
838
+
839
+ ASSERT_OK(db_->Put(write_opts, "foo", "bar"));
840
+
841
+ ASSERT_OK(Flush());
842
+
843
+ // Read with MultiGet
844
+ ReadOptions read_opts;
845
+ read_opts.timestamp = &ts;
846
+ size_t batch_size = 1;
847
+ std::vector<Slice> keys(batch_size);
848
+ std::vector<PinnableSlice> values(batch_size);
849
+ std::vector<Status> statuses(batch_size);
850
+ keys[0] = "foo";
851
+ ColumnFamilyHandle* cfh = db_->DefaultColumnFamily();
852
+ db_->MultiGet(read_opts, cfh, batch_size, keys.data(), values.data(),
853
+ statuses.data());
854
+
855
+ ASSERT_OK(statuses[0]);
856
+ Close();
857
+ }
858
+
859
+ TEST_F(DBBasicTestWithTimestamp, MultiGetWithMemBloomFilter) {
860
+ Options options = CurrentOptions();
861
+ options.env = env_;
862
+ options.create_if_missing = true;
863
+ options.prefix_extractor.reset(NewCappedPrefixTransform(5));
864
+ BlockBasedTableOptions bbto;
865
+ bbto.filter_policy.reset(NewBloomFilterPolicy(10, false));
866
+ bbto.cache_index_and_filter_blocks = true;
867
+ bbto.whole_key_filtering = false;
868
+ options.memtable_prefix_bloom_size_ratio = 0.1;
869
+ options.table_factory.reset(NewBlockBasedTableFactory(bbto));
870
+ const size_t kTimestampSize = Timestamp(0, 0).size();
871
+ TestComparator test_cmp(kTimestampSize);
872
+ options.comparator = &test_cmp;
873
+ DestroyAndReopen(options);
874
+
875
+ // Write any value
876
+ WriteOptions write_opts;
877
+ std::string ts_str = Timestamp(1, 0);
878
+ Slice ts = ts_str;
879
+ write_opts.timestamp = &ts;
880
+
881
+ ASSERT_OK(db_->Put(write_opts, "foo", "bar"));
882
+
883
+ // Read with MultiGet
884
+ ts_str = Timestamp(2, 0);
885
+ ts = ts_str;
886
+ ReadOptions read_opts;
887
+ read_opts.timestamp = &ts;
888
+ size_t batch_size = 1;
889
+ std::vector<Slice> keys(batch_size);
890
+ std::vector<PinnableSlice> values(batch_size);
891
+ std::vector<Status> statuses(batch_size);
892
+ keys[0] = "foo";
893
+ ColumnFamilyHandle* cfh = db_->DefaultColumnFamily();
894
+ db_->MultiGet(read_opts, cfh, batch_size, keys.data(), values.data(),
895
+ statuses.data());
896
+
897
+ ASSERT_OK(statuses[0]);
898
+ Close();
899
+ }
900
+
901
+ TEST_F(DBBasicTestWithTimestamp, MultiGetRangeFiltering) {
902
+ Options options = CurrentOptions();
903
+ options.env = env_;
904
+ options.create_if_missing = true;
905
+ BlockBasedTableOptions bbto;
906
+ bbto.filter_policy.reset(NewBloomFilterPolicy(10, false));
907
+ bbto.cache_index_and_filter_blocks = true;
908
+ bbto.whole_key_filtering = false;
909
+ options.memtable_prefix_bloom_size_ratio = 0.1;
910
+ options.table_factory.reset(NewBlockBasedTableFactory(bbto));
911
+ const size_t kTimestampSize = Timestamp(0, 0).size();
912
+ TestComparator test_cmp(kTimestampSize);
913
+ options.comparator = &test_cmp;
914
+ DestroyAndReopen(options);
915
+
916
+ // Write any value
917
+ WriteOptions write_opts;
918
+ std::string ts_str = Timestamp(1, 0);
919
+ Slice ts = ts_str;
920
+ write_opts.timestamp = &ts;
921
+
922
+ // random data
923
+ for (int i = 0; i < 3; i++) {
924
+ auto key = ToString(i * 10);
925
+ auto value = ToString(i * 10);
926
+ Slice key_slice = key;
927
+ Slice value_slice = value;
928
+ ASSERT_OK(db_->Put(write_opts, key_slice, value_slice));
929
+ ASSERT_OK(Flush());
930
+ }
931
+
932
+ // Make num_levels to 2 to do key range filtering of sst files
933
+ ASSERT_OK(db_->CompactRange(CompactRangeOptions(), nullptr, nullptr));
934
+
935
+ ASSERT_OK(db_->Put(write_opts, "foo", "bar"));
936
+
937
+ ASSERT_OK(Flush());
938
+
939
+ // Read with MultiGet
940
+ ts_str = Timestamp(2, 0);
941
+ ts = ts_str;
942
+ ReadOptions read_opts;
943
+ read_opts.timestamp = &ts;
944
+ size_t batch_size = 1;
945
+ std::vector<Slice> keys(batch_size);
946
+ std::vector<PinnableSlice> values(batch_size);
947
+ std::vector<Status> statuses(batch_size);
948
+ keys[0] = "foo";
949
+ ColumnFamilyHandle* cfh = db_->DefaultColumnFamily();
950
+ db_->MultiGet(read_opts, cfh, batch_size, keys.data(), values.data(),
951
+ statuses.data());
952
+
953
+ ASSERT_OK(statuses[0]);
954
+ Close();
955
+ }
956
+
957
+ TEST_F(DBBasicTestWithTimestamp, MultiGetPrefixFilter) {
958
+ Options options = CurrentOptions();
959
+ options.env = env_;
960
+ options.create_if_missing = true;
961
+ options.prefix_extractor.reset(NewCappedPrefixTransform(5));
962
+ BlockBasedTableOptions bbto;
963
+ bbto.filter_policy.reset(NewBloomFilterPolicy(10, false));
964
+ bbto.cache_index_and_filter_blocks = true;
965
+ bbto.whole_key_filtering = false;
966
+ options.memtable_prefix_bloom_size_ratio = 0.1;
967
+ options.table_factory.reset(NewBlockBasedTableFactory(bbto));
968
+ const size_t kTimestampSize = Timestamp(0, 0).size();
969
+ TestComparator test_cmp(kTimestampSize);
970
+ options.comparator = &test_cmp;
971
+ DestroyAndReopen(options);
972
+
973
+ WriteOptions write_opts;
974
+ std::string ts_str = Timestamp(1, 0);
975
+ Slice ts = ts_str;
976
+ write_opts.timestamp = &ts;
977
+
978
+ ASSERT_OK(db_->Put(write_opts, "foo", "bar"));
979
+
980
+ ASSERT_OK(Flush());
981
+ // Read with MultiGet
982
+ ts_str = Timestamp(2, 0);
983
+ ts = ts_str;
984
+ ReadOptions read_opts;
985
+ read_opts.timestamp = &ts;
986
+ size_t batch_size = 1;
987
+ std::vector<Slice> keys(batch_size);
988
+ std::vector<std::string> values(batch_size);
989
+ std::vector<std::string> timestamps(batch_size);
990
+ keys[0] = "foo";
991
+ ColumnFamilyHandle* cfh = db_->DefaultColumnFamily();
992
+ std::vector<ColumnFamilyHandle*> cfhs(keys.size(), cfh);
993
+ std::vector<Status> statuses =
994
+ db_->MultiGet(read_opts, cfhs, keys, &values, &timestamps);
995
+
996
+ ASSERT_OK(statuses[0]);
997
+ Close();
998
+ }
999
+
1000
+ TEST_F(DBBasicTestWithTimestamp, MaxKeysSkipped) {
1001
+ Options options = CurrentOptions();
1002
+ options.env = env_;
1003
+ options.create_if_missing = true;
1004
+ const size_t kTimestampSize = Timestamp(0, 0).size();
1005
+ TestComparator test_cmp(kTimestampSize);
1006
+ options.comparator = &test_cmp;
1007
+ DestroyAndReopen(options);
1008
+ constexpr size_t max_skippable_internal_keys = 2;
1009
+ const size_t kNumKeys = max_skippable_internal_keys + 2;
1010
+ WriteOptions write_opts;
1011
+ Status s;
1012
+ {
1013
+ std::string ts_str = Timestamp(1, 0);
1014
+ Slice ts = ts_str;
1015
+ write_opts.timestamp = &ts;
1016
+ ASSERT_OK(db_->Put(write_opts, "a", "value"));
1017
+ }
1018
+ for (size_t i = 0; i < kNumKeys; ++i) {
1019
+ std::string ts_str = Timestamp(static_cast<uint64_t>(i + 1), 0);
1020
+ Slice ts = ts_str;
1021
+ write_opts.timestamp = &ts;
1022
+ s = db_->Put(write_opts, "b", "value" + std::to_string(i));
1023
+ ASSERT_OK(s);
1024
+ }
1025
+ {
1026
+ ReadOptions read_opts;
1027
+ read_opts.max_skippable_internal_keys = max_skippable_internal_keys;
1028
+ std::string ts_str = Timestamp(1, 0);
1029
+ Slice ts = ts_str;
1030
+ read_opts.timestamp = &ts;
1031
+ std::unique_ptr<Iterator> iter(db_->NewIterator(read_opts));
1032
+ iter->SeekToFirst();
1033
+ iter->Next();
1034
+ ASSERT_TRUE(iter->status().IsIncomplete());
1035
+ }
1036
+ Close();
1037
+ }
1038
+
1039
+ // Create two L0, and compact them to a new L1. In this test, L1 is L_bottom.
1040
+ // Two L0s:
1041
+ // f1 f2
1042
+ // <a, 1, kTypeValue> <a, 3, kTypeDeletionWithTimestamp>...<b, 2, kTypeValue>
1043
+ // Since f2.smallest < f1.largest < f2.largest
1044
+ // f1 and f2 will be the inputs of a real compaction instead of trivial move.
1045
+ TEST_F(DBBasicTestWithTimestamp, CompactDeletionWithTimestampMarkerToBottom) {
1046
+ Options options = CurrentOptions();
1047
+ options.env = env_;
1048
+ options.create_if_missing = true;
1049
+ const size_t kTimestampSize = Timestamp(0, 0).size();
1050
+ TestComparator test_cmp(kTimestampSize);
1051
+ options.comparator = &test_cmp;
1052
+ options.num_levels = 2;
1053
+ options.level0_file_num_compaction_trigger = 2;
1054
+ DestroyAndReopen(options);
1055
+ WriteOptions write_opts;
1056
+ std::string ts_str = Timestamp(1, 0);
1057
+ Slice ts = ts_str;
1058
+ write_opts.timestamp = &ts;
1059
+ ASSERT_OK(db_->Put(write_opts, "a", "value0"));
1060
+ ASSERT_OK(Flush());
1061
+
1062
+ ts_str = Timestamp(2, 0);
1063
+ ts = ts_str;
1064
+ write_opts.timestamp = &ts;
1065
+ ASSERT_OK(db_->Put(write_opts, "b", "value0"));
1066
+ ts_str = Timestamp(3, 0);
1067
+ ts = ts_str;
1068
+ write_opts.timestamp = &ts;
1069
+ ASSERT_OK(db_->Delete(write_opts, "a"));
1070
+ ASSERT_OK(Flush());
1071
+ ASSERT_OK(dbfull()->TEST_WaitForCompact());
1072
+
1073
+ ReadOptions read_opts;
1074
+ ts_str = Timestamp(1, 0);
1075
+ ts = ts_str;
1076
+ read_opts.timestamp = &ts;
1077
+ std::string value;
1078
+ Status s = db_->Get(read_opts, "a", &value);
1079
+ ASSERT_OK(s);
1080
+ ASSERT_EQ("value0", value);
1081
+
1082
+ ts_str = Timestamp(3, 0);
1083
+ ts = ts_str;
1084
+ read_opts.timestamp = &ts;
1085
+ s = db_->Get(read_opts, "a", &value);
1086
+ ASSERT_TRUE(s.IsNotFound());
1087
+
1088
+ // Time-travel to the past before deletion
1089
+ ts_str = Timestamp(2, 0);
1090
+ ts = ts_str;
1091
+ read_opts.timestamp = &ts;
1092
+ s = db_->Get(read_opts, "a", &value);
1093
+ ASSERT_OK(s);
1094
+ ASSERT_EQ("value0", value);
1095
+ Close();
1096
+ }
1097
+
1098
+ class DBBasicTestWithTimestampFilterPrefixSettings
1099
+ : public DBBasicTestWithTimestampBase,
1100
+ public testing::WithParamInterface<
1101
+ std::tuple<std::shared_ptr<const FilterPolicy>, bool, bool,
1102
+ std::shared_ptr<const SliceTransform>, bool, double>> {
1103
+ public:
1104
+ DBBasicTestWithTimestampFilterPrefixSettings()
1105
+ : DBBasicTestWithTimestampBase(
1106
+ "db_basic_test_with_timestamp_filter_prefix") {}
1107
+ };
1108
+
1109
+ TEST_P(DBBasicTestWithTimestampFilterPrefixSettings, GetAndMultiGet) {
1110
+ Options options = CurrentOptions();
1111
+ options.env = env_;
1112
+ options.create_if_missing = true;
1113
+ BlockBasedTableOptions bbto;
1114
+ bbto.filter_policy = std::get<0>(GetParam());
1115
+ bbto.whole_key_filtering = std::get<1>(GetParam());
1116
+ bbto.cache_index_and_filter_blocks = std::get<2>(GetParam());
1117
+ options.table_factory.reset(NewBlockBasedTableFactory(bbto));
1118
+ options.prefix_extractor = std::get<3>(GetParam());
1119
+ options.memtable_whole_key_filtering = std::get<4>(GetParam());
1120
+ options.memtable_prefix_bloom_size_ratio = std::get<5>(GetParam());
1121
+
1122
+ const size_t kTimestampSize = Timestamp(0, 0).size();
1123
+ TestComparator test_cmp(kTimestampSize);
1124
+ options.comparator = &test_cmp;
1125
+ DestroyAndReopen(options);
1126
+ const int kMaxKey = 1000;
1127
+
1128
+ // Write any value
1129
+ WriteOptions write_opts;
1130
+ std::string ts_str = Timestamp(1, 0);
1131
+ Slice ts = ts_str;
1132
+ write_opts.timestamp = &ts;
1133
+
1134
+ int idx = 0;
1135
+ for (; idx < kMaxKey / 4; idx++) {
1136
+ ASSERT_OK(db_->Put(write_opts, Key1(idx), "bar"));
1137
+ ASSERT_OK(db_->Put(write_opts, KeyWithPrefix("foo", idx), "bar"));
1138
+ }
1139
+
1140
+ ASSERT_OK(Flush());
1141
+ ASSERT_OK(db_->CompactRange(CompactRangeOptions(), nullptr, nullptr));
1142
+
1143
+ for (; idx < kMaxKey / 2; idx++) {
1144
+ ASSERT_OK(db_->Put(write_opts, Key1(idx), "bar"));
1145
+ ASSERT_OK(db_->Put(write_opts, KeyWithPrefix("foo", idx), "bar"));
1146
+ }
1147
+
1148
+ ASSERT_OK(Flush());
1149
+
1150
+ for (; idx < kMaxKey; idx++) {
1151
+ ASSERT_OK(db_->Put(write_opts, Key1(idx), "bar"));
1152
+ ASSERT_OK(db_->Put(write_opts, KeyWithPrefix("foo", idx), "bar"));
1153
+ }
1154
+
1155
+ // Read with MultiGet
1156
+ ReadOptions read_opts;
1157
+ read_opts.timestamp = &ts;
1158
+
1159
+ ReadOptions read_opts_total_order;
1160
+ read_opts_total_order.timestamp = &ts;
1161
+ read_opts_total_order.total_order_seek = true;
1162
+
1163
+ for (idx = 0; idx < kMaxKey; idx++) {
1164
+ size_t batch_size = 4;
1165
+ std::vector<std::string> keys_str(batch_size);
1166
+ std::vector<PinnableSlice> values(batch_size);
1167
+ std::vector<Status> statuses(batch_size);
1168
+ ColumnFamilyHandle* cfh = db_->DefaultColumnFamily();
1169
+
1170
+ keys_str[0] = Key1(idx);
1171
+ keys_str[1] = KeyWithPrefix("foo", idx);
1172
+ keys_str[2] = Key1(kMaxKey + idx);
1173
+ keys_str[3] = KeyWithPrefix("foo", kMaxKey + idx);
1174
+
1175
+ auto keys = ConvertStrToSlice(keys_str);
1176
+
1177
+ db_->MultiGet(read_opts, cfh, batch_size, keys.data(), values.data(),
1178
+ statuses.data());
1179
+
1180
+ for (int i = 0; i < 2; i++) {
1181
+ ASSERT_OK(statuses[i]);
1182
+ }
1183
+ for (int i = 2; i < 4; i++) {
1184
+ ASSERT_TRUE(statuses[i].IsNotFound());
1185
+ }
1186
+
1187
+ for (int i = 0; i < 2; i++) {
1188
+ std::string value;
1189
+ ASSERT_OK(db_->Get(read_opts, keys[i], &value));
1190
+ std::unique_ptr<Iterator> it1(db_->NewIterator(read_opts));
1191
+ ASSERT_NE(nullptr, it1);
1192
+ ASSERT_OK(it1->status());
1193
+ // TODO(zjay) Fix seek with prefix
1194
+ // it1->Seek(keys[i]);
1195
+ // ASSERT_TRUE(it1->Valid());
1196
+ }
1197
+
1198
+ for (int i = 2; i < 4; i++) {
1199
+ std::string value;
1200
+ Status s = db_->Get(read_opts, keys[i], &value);
1201
+ ASSERT_TRUE(s.IsNotFound());
1202
+ }
1203
+ }
1204
+ Close();
1205
+ }
1206
+
1207
+ INSTANTIATE_TEST_CASE_P(
1208
+ Timestamp, DBBasicTestWithTimestampFilterPrefixSettings,
1209
+ ::testing::Combine(
1210
+ ::testing::Values(
1211
+ std::shared_ptr<const FilterPolicy>(nullptr),
1212
+ std::shared_ptr<const FilterPolicy>(NewBloomFilterPolicy(10, true)),
1213
+ std::shared_ptr<const FilterPolicy>(NewBloomFilterPolicy(10,
1214
+ false))),
1215
+ ::testing::Bool(), ::testing::Bool(),
1216
+ ::testing::Values(
1217
+ std::shared_ptr<const SliceTransform>(NewFixedPrefixTransform(1)),
1218
+ std::shared_ptr<const SliceTransform>(NewFixedPrefixTransform(4)),
1219
+ std::shared_ptr<const SliceTransform>(NewFixedPrefixTransform(7)),
1220
+ std::shared_ptr<const SliceTransform>(NewFixedPrefixTransform(8))),
1221
+ ::testing::Bool(), ::testing::Values(0, 0.1)));
1222
+
1223
+ class DataVisibilityTest : public DBBasicTestWithTimestampBase {
1224
+ public:
1225
+ DataVisibilityTest() : DBBasicTestWithTimestampBase("data_visibility_test") {
1226
+ // Initialize test data
1227
+ for (int i = 0; i < kTestDataSize; i++) {
1228
+ test_data_[i].key = "key" + ToString(i);
1229
+ test_data_[i].value = "value" + ToString(i);
1230
+ test_data_[i].timestamp = Timestamp(i, 0);
1231
+ test_data_[i].ts = i;
1232
+ test_data_[i].seq_num = kMaxSequenceNumber;
1233
+ }
1234
+ }
1235
+
1236
+ protected:
1237
+ struct TestData {
1238
+ std::string key;
1239
+ std::string value;
1240
+ int ts;
1241
+ std::string timestamp;
1242
+ SequenceNumber seq_num;
1243
+ };
1244
+
1245
+ constexpr static int kTestDataSize = 3;
1246
+ TestData test_data_[kTestDataSize];
1247
+
1248
+ void PutTestData(int index, ColumnFamilyHandle* cfh = nullptr) {
1249
+ ASSERT_LE(index, kTestDataSize);
1250
+ WriteOptions write_opts;
1251
+ Slice ts_slice = test_data_[index].timestamp;
1252
+ write_opts.timestamp = &ts_slice;
1253
+
1254
+ if (cfh == nullptr) {
1255
+ ASSERT_OK(
1256
+ db_->Put(write_opts, test_data_[index].key, test_data_[index].value));
1257
+ const Snapshot* snap = db_->GetSnapshot();
1258
+ test_data_[index].seq_num = snap->GetSequenceNumber();
1259
+ if (index > 0) {
1260
+ ASSERT_GT(test_data_[index].seq_num, test_data_[index - 1].seq_num);
1261
+ }
1262
+ db_->ReleaseSnapshot(snap);
1263
+ } else {
1264
+ ASSERT_OK(db_->Put(write_opts, cfh, test_data_[index].key,
1265
+ test_data_[index].value));
1266
+ }
1267
+ }
1268
+
1269
+ void AssertVisibility(int ts, SequenceNumber seq,
1270
+ std::vector<Status> statuses) {
1271
+ ASSERT_EQ(kTestDataSize, statuses.size());
1272
+ for (int i = 0; i < kTestDataSize; i++) {
1273
+ if (test_data_[i].seq_num <= seq && test_data_[i].ts <= ts) {
1274
+ ASSERT_OK(statuses[i]);
1275
+ } else {
1276
+ ASSERT_TRUE(statuses[i].IsNotFound());
1277
+ }
1278
+ }
1279
+ }
1280
+
1281
+ std::vector<Slice> GetKeys() {
1282
+ std::vector<Slice> ret(kTestDataSize);
1283
+ for (int i = 0; i < kTestDataSize; i++) {
1284
+ ret[i] = test_data_[i].key;
1285
+ }
1286
+ return ret;
1287
+ }
1288
+
1289
+ void VerifyDefaultCF(int ts, const Snapshot* snap = nullptr) {
1290
+ ReadOptions read_opts;
1291
+ std::string read_ts = Timestamp(ts, 0);
1292
+ Slice read_ts_slice = read_ts;
1293
+ read_opts.timestamp = &read_ts_slice;
1294
+ read_opts.snapshot = snap;
1295
+
1296
+ ColumnFamilyHandle* cfh = db_->DefaultColumnFamily();
1297
+ std::vector<ColumnFamilyHandle*> cfs(kTestDataSize, cfh);
1298
+ SequenceNumber seq =
1299
+ snap ? snap->GetSequenceNumber() : kMaxSequenceNumber - 1;
1300
+
1301
+ // There're several MultiGet interfaces with not exactly the same
1302
+ // implementations, query data with all of them.
1303
+ auto keys = GetKeys();
1304
+ std::vector<std::string> values;
1305
+ auto s1 = db_->MultiGet(read_opts, cfs, keys, &values);
1306
+ AssertVisibility(ts, seq, s1);
1307
+
1308
+ auto s2 = db_->MultiGet(read_opts, keys, &values);
1309
+ AssertVisibility(ts, seq, s2);
1310
+
1311
+ std::vector<std::string> timestamps;
1312
+ auto s3 = db_->MultiGet(read_opts, cfs, keys, &values, &timestamps);
1313
+ AssertVisibility(ts, seq, s3);
1314
+
1315
+ auto s4 = db_->MultiGet(read_opts, keys, &values, &timestamps);
1316
+ AssertVisibility(ts, seq, s4);
1317
+
1318
+ std::vector<PinnableSlice> values_ps5(kTestDataSize);
1319
+ std::vector<Status> s5(kTestDataSize);
1320
+ db_->MultiGet(read_opts, cfh, kTestDataSize, keys.data(), values_ps5.data(),
1321
+ s5.data());
1322
+ AssertVisibility(ts, seq, s5);
1323
+
1324
+ std::vector<PinnableSlice> values_ps6(kTestDataSize);
1325
+ std::vector<Status> s6(kTestDataSize);
1326
+ std::vector<std::string> timestamps_array(kTestDataSize);
1327
+ db_->MultiGet(read_opts, cfh, kTestDataSize, keys.data(), values_ps6.data(),
1328
+ timestamps_array.data(), s6.data());
1329
+ AssertVisibility(ts, seq, s6);
1330
+
1331
+ std::vector<PinnableSlice> values_ps7(kTestDataSize);
1332
+ std::vector<Status> s7(kTestDataSize);
1333
+ db_->MultiGet(read_opts, kTestDataSize, cfs.data(), keys.data(),
1334
+ values_ps7.data(), s7.data());
1335
+ AssertVisibility(ts, seq, s7);
1336
+
1337
+ std::vector<PinnableSlice> values_ps8(kTestDataSize);
1338
+ std::vector<Status> s8(kTestDataSize);
1339
+ db_->MultiGet(read_opts, kTestDataSize, cfs.data(), keys.data(),
1340
+ values_ps8.data(), timestamps_array.data(), s8.data());
1341
+ AssertVisibility(ts, seq, s8);
1342
+ }
1343
+
1344
+ void VerifyDefaultCF(const Snapshot* snap = nullptr) {
1345
+ for (int i = 0; i <= kTestDataSize; i++) {
1346
+ VerifyDefaultCF(i, snap);
1347
+ }
1348
+ }
1349
+ };
1350
+ constexpr int DataVisibilityTest::kTestDataSize;
1351
+
1352
+ // Application specifies timestamp but not snapshot.
1353
+ // reader writer
1354
+ // ts'=90
1355
+ // ts=100
1356
+ // seq=10
1357
+ // seq'=11
1358
+ // write finishes
1359
+ // GetImpl(ts,seq)
1360
+ // It is OK to return <k, t1, s1> if ts>=t1 AND seq>=s1. If ts>=1t1 but seq<s1,
1361
+ // the key should not be returned.
1362
+ TEST_F(DataVisibilityTest, PointLookupWithoutSnapshot1) {
1363
+ Options options = CurrentOptions();
1364
+ const size_t kTimestampSize = Timestamp(0, 0).size();
1365
+ TestComparator test_cmp(kTimestampSize);
1366
+ options.comparator = &test_cmp;
1367
+ DestroyAndReopen(options);
1368
+ SyncPoint::GetInstance()->DisableProcessing();
1369
+ SyncPoint::GetInstance()->LoadDependency({
1370
+ {"DBImpl::GetImpl:3",
1371
+ "DataVisibilityTest::PointLookupWithoutSnapshot1:BeforePut"},
1372
+ {"DataVisibilityTest::PointLookupWithoutSnapshot1:AfterPut",
1373
+ "DBImpl::GetImpl:4"},
1374
+ });
1375
+ SyncPoint::GetInstance()->EnableProcessing();
1376
+ port::Thread writer_thread([this]() {
1377
+ std::string write_ts_str = Timestamp(1, 0);
1378
+ Slice write_ts = write_ts_str;
1379
+ WriteOptions write_opts;
1380
+ write_opts.timestamp = &write_ts;
1381
+ TEST_SYNC_POINT(
1382
+ "DataVisibilityTest::PointLookupWithoutSnapshot1:BeforePut");
1383
+ Status s = db_->Put(write_opts, "foo", "value");
1384
+ ASSERT_OK(s);
1385
+ TEST_SYNC_POINT("DataVisibilityTest::PointLookupWithoutSnapshot1:AfterPut");
1386
+ });
1387
+ ReadOptions read_opts;
1388
+ std::string read_ts_str = Timestamp(3, 0);
1389
+ Slice read_ts = read_ts_str;
1390
+ read_opts.timestamp = &read_ts;
1391
+ std::string value;
1392
+ Status s = db_->Get(read_opts, "foo", &value);
1393
+
1394
+ writer_thread.join();
1395
+ ASSERT_TRUE(s.IsNotFound());
1396
+ Close();
1397
+ }
1398
+
1399
+ // Application specifies timestamp but not snapshot.
1400
+ // reader writer
1401
+ // ts'=90
1402
+ // ts=100
1403
+ // seq=10
1404
+ // seq'=11
1405
+ // write finishes
1406
+ // Flush
1407
+ // GetImpl(ts,seq)
1408
+ // It is OK to return <k, t1, s1> if ts>=t1 AND seq>=s1. If ts>=t1 but seq<s1,
1409
+ // the key should not be returned.
1410
+ TEST_F(DataVisibilityTest, PointLookupWithoutSnapshot2) {
1411
+ Options options = CurrentOptions();
1412
+ const size_t kTimestampSize = Timestamp(0, 0).size();
1413
+ TestComparator test_cmp(kTimestampSize);
1414
+ options.comparator = &test_cmp;
1415
+ DestroyAndReopen(options);
1416
+ SyncPoint::GetInstance()->DisableProcessing();
1417
+ SyncPoint::GetInstance()->LoadDependency({
1418
+ {"DBImpl::GetImpl:3",
1419
+ "DataVisibilityTest::PointLookupWithoutSnapshot2:BeforePut"},
1420
+ {"DataVisibilityTest::PointLookupWithoutSnapshot2:AfterPut",
1421
+ "DBImpl::GetImpl:4"},
1422
+ });
1423
+ SyncPoint::GetInstance()->EnableProcessing();
1424
+ port::Thread writer_thread([this]() {
1425
+ std::string write_ts_str = Timestamp(1, 0);
1426
+ Slice write_ts = write_ts_str;
1427
+ WriteOptions write_opts;
1428
+ write_opts.timestamp = &write_ts;
1429
+ TEST_SYNC_POINT(
1430
+ "DataVisibilityTest::PointLookupWithoutSnapshot2:BeforePut");
1431
+ Status s = db_->Put(write_opts, "foo", "value");
1432
+ ASSERT_OK(s);
1433
+ ASSERT_OK(Flush());
1434
+
1435
+ write_ts_str = Timestamp(2, 0);
1436
+ write_ts = write_ts_str;
1437
+ write_opts.timestamp = &write_ts;
1438
+ s = db_->Put(write_opts, "bar", "value");
1439
+ ASSERT_OK(s);
1440
+ TEST_SYNC_POINT("DataVisibilityTest::PointLookupWithoutSnapshot2:AfterPut");
1441
+ });
1442
+ ReadOptions read_opts;
1443
+ std::string read_ts_str = Timestamp(3, 0);
1444
+ Slice read_ts = read_ts_str;
1445
+ read_opts.timestamp = &read_ts;
1446
+ std::string value;
1447
+ Status s = db_->Get(read_opts, "foo", &value);
1448
+ writer_thread.join();
1449
+ ASSERT_TRUE(s.IsNotFound());
1450
+ Close();
1451
+ }
1452
+
1453
+ // Application specifies both timestamp and snapshot.
1454
+ // reader writer
1455
+ // seq=10
1456
+ // ts'=90
1457
+ // ts=100
1458
+ // seq'=11
1459
+ // write finishes
1460
+ // GetImpl(ts,seq)
1461
+ // Since application specifies both timestamp and snapshot, application expects
1462
+ // to see data that visible in BOTH timestamp and sequence number. Therefore,
1463
+ // <k, t1, s1> can be returned only if t1<=ts AND s1<=seq.
1464
+ TEST_F(DataVisibilityTest, PointLookupWithSnapshot1) {
1465
+ Options options = CurrentOptions();
1466
+ const size_t kTimestampSize = Timestamp(0, 0).size();
1467
+ TestComparator test_cmp(kTimestampSize);
1468
+ options.comparator = &test_cmp;
1469
+ DestroyAndReopen(options);
1470
+ SyncPoint::GetInstance()->DisableProcessing();
1471
+ SyncPoint::GetInstance()->LoadDependency({
1472
+ {"DataVisibilityTest::PointLookupWithSnapshot1:AfterTakingSnap",
1473
+ "DataVisibilityTest::PointLookupWithSnapshot1:BeforePut"},
1474
+ {"DataVisibilityTest::PointLookupWithSnapshot1:AfterPut",
1475
+ "DBImpl::GetImpl:1"},
1476
+ });
1477
+ SyncPoint::GetInstance()->EnableProcessing();
1478
+ port::Thread writer_thread([this]() {
1479
+ std::string write_ts_str = Timestamp(1, 0);
1480
+ Slice write_ts = write_ts_str;
1481
+ WriteOptions write_opts;
1482
+ write_opts.timestamp = &write_ts;
1483
+ TEST_SYNC_POINT("DataVisibilityTest::PointLookupWithSnapshot1:BeforePut");
1484
+ Status s = db_->Put(write_opts, "foo", "value");
1485
+ TEST_SYNC_POINT("DataVisibilityTest::PointLookupWithSnapshot1:AfterPut");
1486
+ ASSERT_OK(s);
1487
+ });
1488
+ ReadOptions read_opts;
1489
+ const Snapshot* snap = db_->GetSnapshot();
1490
+ TEST_SYNC_POINT(
1491
+ "DataVisibilityTest::PointLookupWithSnapshot1:AfterTakingSnap");
1492
+ read_opts.snapshot = snap;
1493
+ std::string read_ts_str = Timestamp(3, 0);
1494
+ Slice read_ts = read_ts_str;
1495
+ read_opts.timestamp = &read_ts;
1496
+ std::string value;
1497
+ Status s = db_->Get(read_opts, "foo", &value);
1498
+ writer_thread.join();
1499
+
1500
+ ASSERT_TRUE(s.IsNotFound());
1501
+
1502
+ db_->ReleaseSnapshot(snap);
1503
+ Close();
1504
+ }
1505
+
1506
+ // Application specifies both timestamp and snapshot.
1507
+ // reader writer
1508
+ // seq=10
1509
+ // ts'=90
1510
+ // ts=100
1511
+ // seq'=11
1512
+ // write finishes
1513
+ // Flush
1514
+ // GetImpl(ts,seq)
1515
+ // Since application specifies both timestamp and snapshot, application expects
1516
+ // to see data that visible in BOTH timestamp and sequence number. Therefore,
1517
+ // <k, t1, s1> can be returned only if t1<=ts AND s1<=seq.
1518
+ TEST_F(DataVisibilityTest, PointLookupWithSnapshot2) {
1519
+ Options options = CurrentOptions();
1520
+ const size_t kTimestampSize = Timestamp(0, 0).size();
1521
+ TestComparator test_cmp(kTimestampSize);
1522
+ options.comparator = &test_cmp;
1523
+ DestroyAndReopen(options);
1524
+ SyncPoint::GetInstance()->DisableProcessing();
1525
+ SyncPoint::GetInstance()->LoadDependency({
1526
+ {"DataVisibilityTest::PointLookupWithSnapshot2:AfterTakingSnap",
1527
+ "DataVisibilityTest::PointLookupWithSnapshot2:BeforePut"},
1528
+ });
1529
+ SyncPoint::GetInstance()->EnableProcessing();
1530
+ port::Thread writer_thread([this]() {
1531
+ std::string write_ts_str = Timestamp(1, 0);
1532
+ Slice write_ts = write_ts_str;
1533
+ WriteOptions write_opts;
1534
+ write_opts.timestamp = &write_ts;
1535
+ TEST_SYNC_POINT("DataVisibilityTest::PointLookupWithSnapshot2:BeforePut");
1536
+ Status s = db_->Put(write_opts, "foo", "value1");
1537
+ ASSERT_OK(s);
1538
+ ASSERT_OK(Flush());
1539
+
1540
+ write_ts_str = Timestamp(2, 0);
1541
+ write_ts = write_ts_str;
1542
+ write_opts.timestamp = &write_ts;
1543
+ s = db_->Put(write_opts, "bar", "value2");
1544
+ ASSERT_OK(s);
1545
+ });
1546
+ const Snapshot* snap = db_->GetSnapshot();
1547
+ TEST_SYNC_POINT(
1548
+ "DataVisibilityTest::PointLookupWithSnapshot2:AfterTakingSnap");
1549
+ writer_thread.join();
1550
+ std::string read_ts_str = Timestamp(3, 0);
1551
+ Slice read_ts = read_ts_str;
1552
+ ReadOptions read_opts;
1553
+ read_opts.snapshot = snap;
1554
+ read_opts.timestamp = &read_ts;
1555
+ std::string value;
1556
+ Status s = db_->Get(read_opts, "foo", &value);
1557
+ ASSERT_TRUE(s.IsNotFound());
1558
+ db_->ReleaseSnapshot(snap);
1559
+ Close();
1560
+ }
1561
+
1562
+ // Application specifies timestamp but not snapshot.
1563
+ // reader writer
1564
+ // ts'=90
1565
+ // ts=100
1566
+ // seq=10
1567
+ // seq'=11
1568
+ // write finishes
1569
+ // scan(ts,seq)
1570
+ // <k, t1, s1> can be seen in scan as long as ts>=t1 AND seq>=s1. If ts>=t1 but
1571
+ // seq<s1, then the key should not be returned.
1572
+ TEST_F(DataVisibilityTest, RangeScanWithoutSnapshot) {
1573
+ Options options = CurrentOptions();
1574
+ const size_t kTimestampSize = Timestamp(0, 0).size();
1575
+ TestComparator test_cmp(kTimestampSize);
1576
+ options.comparator = &test_cmp;
1577
+ DestroyAndReopen(options);
1578
+ SyncPoint::GetInstance()->DisableProcessing();
1579
+ SyncPoint::GetInstance()->LoadDependency({
1580
+ {"DBImpl::NewIterator:3",
1581
+ "DataVisibilityTest::RangeScanWithoutSnapshot:BeforePut"},
1582
+ });
1583
+ SyncPoint::GetInstance()->EnableProcessing();
1584
+ port::Thread writer_thread([this]() {
1585
+ WriteOptions write_opts;
1586
+ TEST_SYNC_POINT("DataVisibilityTest::RangeScanWithoutSnapshot:BeforePut");
1587
+ for (int i = 0; i < 3; ++i) {
1588
+ std::string write_ts_str = Timestamp(i + 1, 0);
1589
+ Slice write_ts = write_ts_str;
1590
+ write_opts.timestamp = &write_ts;
1591
+ Status s = db_->Put(write_opts, "key" + std::to_string(i),
1592
+ "value" + std::to_string(i));
1593
+ ASSERT_OK(s);
1594
+ }
1595
+ });
1596
+ std::string read_ts_str = Timestamp(10, 0);
1597
+ Slice read_ts = read_ts_str;
1598
+ ReadOptions read_opts;
1599
+ read_opts.total_order_seek = true;
1600
+ read_opts.timestamp = &read_ts;
1601
+ Iterator* it = db_->NewIterator(read_opts);
1602
+ ASSERT_NE(nullptr, it);
1603
+ writer_thread.join();
1604
+ it->SeekToFirst();
1605
+ ASSERT_FALSE(it->Valid());
1606
+ delete it;
1607
+ Close();
1608
+ }
1609
+
1610
+ // Application specifies both timestamp and snapshot.
1611
+ // reader writer
1612
+ // seq=10
1613
+ // ts'=90
1614
+ // ts=100 seq'=11
1615
+ // write finishes
1616
+ // scan(ts,seq)
1617
+ // <k, t1, s1> can be seen by the scan only if t1<=ts AND s1<=seq. If t1<=ts
1618
+ // but s1>seq, then the key should not be returned.
1619
+ TEST_F(DataVisibilityTest, RangeScanWithSnapshot) {
1620
+ Options options = CurrentOptions();
1621
+ const size_t kTimestampSize = Timestamp(0, 0).size();
1622
+ TestComparator test_cmp(kTimestampSize);
1623
+ options.comparator = &test_cmp;
1624
+ DestroyAndReopen(options);
1625
+ SyncPoint::GetInstance()->DisableProcessing();
1626
+ SyncPoint::GetInstance()->LoadDependency({
1627
+ {"DataVisibilityTest::RangeScanWithSnapshot:AfterTakingSnapshot",
1628
+ "DataVisibilityTest::RangeScanWithSnapshot:BeforePut"},
1629
+ });
1630
+ SyncPoint::GetInstance()->EnableProcessing();
1631
+ port::Thread writer_thread([this]() {
1632
+ WriteOptions write_opts;
1633
+ TEST_SYNC_POINT("DataVisibilityTest::RangeScanWithSnapshot:BeforePut");
1634
+ for (int i = 0; i < 3; ++i) {
1635
+ std::string write_ts_str = Timestamp(i + 1, 0);
1636
+ Slice write_ts = write_ts_str;
1637
+ write_opts.timestamp = &write_ts;
1638
+ Status s = db_->Put(write_opts, "key" + std::to_string(i),
1639
+ "value" + std::to_string(i));
1640
+ ASSERT_OK(s);
1641
+ }
1642
+ });
1643
+ const Snapshot* snap = db_->GetSnapshot();
1644
+ TEST_SYNC_POINT(
1645
+ "DataVisibilityTest::RangeScanWithSnapshot:AfterTakingSnapshot");
1646
+
1647
+ writer_thread.join();
1648
+
1649
+ std::string read_ts_str = Timestamp(10, 0);
1650
+ Slice read_ts = read_ts_str;
1651
+ ReadOptions read_opts;
1652
+ read_opts.snapshot = snap;
1653
+ read_opts.total_order_seek = true;
1654
+ read_opts.timestamp = &read_ts;
1655
+ Iterator* it = db_->NewIterator(read_opts);
1656
+ ASSERT_NE(nullptr, it);
1657
+ it->Seek("key0");
1658
+ ASSERT_FALSE(it->Valid());
1659
+
1660
+ delete it;
1661
+ db_->ReleaseSnapshot(snap);
1662
+ Close();
1663
+ }
1664
+
1665
+ // Application specifies both timestamp and snapshot.
1666
+ // Query each combination and make sure for MultiGet key <k, t1, s1>, only
1667
+ // return keys that ts>=t1 AND seq>=s1.
1668
+ TEST_F(DataVisibilityTest, MultiGetWithTimestamp) {
1669
+ Options options = CurrentOptions();
1670
+ const size_t kTimestampSize = Timestamp(0, 0).size();
1671
+ TestComparator test_cmp(kTimestampSize);
1672
+ options.comparator = &test_cmp;
1673
+ DestroyAndReopen(options);
1674
+
1675
+ const Snapshot* snap0 = db_->GetSnapshot();
1676
+ PutTestData(0);
1677
+ VerifyDefaultCF();
1678
+ VerifyDefaultCF(snap0);
1679
+
1680
+ const Snapshot* snap1 = db_->GetSnapshot();
1681
+ PutTestData(1);
1682
+ VerifyDefaultCF();
1683
+ VerifyDefaultCF(snap0);
1684
+ VerifyDefaultCF(snap1);
1685
+
1686
+ ASSERT_OK(Flush());
1687
+
1688
+ const Snapshot* snap2 = db_->GetSnapshot();
1689
+ PutTestData(2);
1690
+ VerifyDefaultCF();
1691
+ VerifyDefaultCF(snap0);
1692
+ VerifyDefaultCF(snap1);
1693
+ VerifyDefaultCF(snap2);
1694
+
1695
+ db_->ReleaseSnapshot(snap0);
1696
+ db_->ReleaseSnapshot(snap1);
1697
+ db_->ReleaseSnapshot(snap2);
1698
+
1699
+ Close();
1700
+ }
1701
+
1702
+ // Application specifies timestamp but not snapshot.
1703
+ // reader writer
1704
+ // ts'=0, 1
1705
+ // ts=3
1706
+ // seq=10
1707
+ // seq'=11, 12
1708
+ // write finishes
1709
+ // MultiGet(ts,seq)
1710
+ // For MultiGet <k, t1, s1>, only return keys that ts>=t1 AND seq>=s1.
1711
+ TEST_F(DataVisibilityTest, MultiGetWithoutSnapshot) {
1712
+ Options options = CurrentOptions();
1713
+ const size_t kTimestampSize = Timestamp(0, 0).size();
1714
+ TestComparator test_cmp(kTimestampSize);
1715
+ options.comparator = &test_cmp;
1716
+ DestroyAndReopen(options);
1717
+
1718
+ SyncPoint::GetInstance()->DisableProcessing();
1719
+ SyncPoint::GetInstance()->LoadDependency({
1720
+ {"DBImpl::MultiGet:AfterGetSeqNum1",
1721
+ "DataVisibilityTest::MultiGetWithoutSnapshot:BeforePut"},
1722
+ {"DataVisibilityTest::MultiGetWithoutSnapshot:AfterPut",
1723
+ "DBImpl::MultiGet:AfterGetSeqNum2"},
1724
+ });
1725
+ SyncPoint::GetInstance()->EnableProcessing();
1726
+ port::Thread writer_thread([this]() {
1727
+ TEST_SYNC_POINT("DataVisibilityTest::MultiGetWithoutSnapshot:BeforePut");
1728
+ PutTestData(0);
1729
+ PutTestData(1);
1730
+ TEST_SYNC_POINT("DataVisibilityTest::MultiGetWithoutSnapshot:AfterPut");
1731
+ });
1732
+
1733
+ ReadOptions read_opts;
1734
+ std::string read_ts = Timestamp(kTestDataSize, 0);
1735
+ Slice read_ts_slice = read_ts;
1736
+ read_opts.timestamp = &read_ts_slice;
1737
+ auto keys = GetKeys();
1738
+ std::vector<std::string> values;
1739
+ auto ss = db_->MultiGet(read_opts, keys, &values);
1740
+
1741
+ writer_thread.join();
1742
+ for (auto s : ss) {
1743
+ ASSERT_TRUE(s.IsNotFound());
1744
+ }
1745
+ VerifyDefaultCF();
1746
+ Close();
1747
+ }
1748
+
1749
+ TEST_F(DataVisibilityTest, MultiGetCrossCF) {
1750
+ Options options = CurrentOptions();
1751
+ const size_t kTimestampSize = Timestamp(0, 0).size();
1752
+ TestComparator test_cmp(kTimestampSize);
1753
+ options.comparator = &test_cmp;
1754
+ DestroyAndReopen(options);
1755
+
1756
+ CreateAndReopenWithCF({"second"}, options);
1757
+ ColumnFamilyHandle* second_cf = handles_[1];
1758
+
1759
+ const Snapshot* snap0 = db_->GetSnapshot();
1760
+ PutTestData(0);
1761
+ PutTestData(0, second_cf);
1762
+ VerifyDefaultCF();
1763
+ VerifyDefaultCF(snap0);
1764
+
1765
+ const Snapshot* snap1 = db_->GetSnapshot();
1766
+ PutTestData(1);
1767
+ PutTestData(1, second_cf);
1768
+ VerifyDefaultCF();
1769
+ VerifyDefaultCF(snap0);
1770
+ VerifyDefaultCF(snap1);
1771
+
1772
+ ASSERT_OK(Flush());
1773
+
1774
+ const Snapshot* snap2 = db_->GetSnapshot();
1775
+ PutTestData(2);
1776
+ PutTestData(2, second_cf);
1777
+ VerifyDefaultCF();
1778
+ VerifyDefaultCF(snap0);
1779
+ VerifyDefaultCF(snap1);
1780
+ VerifyDefaultCF(snap2);
1781
+
1782
+ ReadOptions read_opts;
1783
+ std::string read_ts = Timestamp(kTestDataSize, 0);
1784
+ Slice read_ts_slice = read_ts;
1785
+ read_opts.timestamp = &read_ts_slice;
1786
+ read_opts.snapshot = snap1;
1787
+ auto keys = GetKeys();
1788
+ auto keys2 = GetKeys();
1789
+ keys.insert(keys.end(), keys2.begin(), keys2.end());
1790
+ std::vector<ColumnFamilyHandle*> cfs(kTestDataSize,
1791
+ db_->DefaultColumnFamily());
1792
+ std::vector<ColumnFamilyHandle*> cfs2(kTestDataSize, second_cf);
1793
+ cfs.insert(cfs.end(), cfs2.begin(), cfs2.end());
1794
+
1795
+ std::vector<std::string> values;
1796
+ auto ss = db_->MultiGet(read_opts, cfs, keys, &values);
1797
+ for (int i = 0; i < 2 * kTestDataSize; i++) {
1798
+ if (i % 3 == 0) {
1799
+ // only the first key for each column family should be returned
1800
+ ASSERT_OK(ss[i]);
1801
+ } else {
1802
+ ASSERT_TRUE(ss[i].IsNotFound());
1803
+ }
1804
+ }
1805
+
1806
+ db_->ReleaseSnapshot(snap0);
1807
+ db_->ReleaseSnapshot(snap1);
1808
+ db_->ReleaseSnapshot(snap2);
1809
+ Close();
1810
+ }
1811
+
1812
+ class DBBasicTestWithTimestampCompressionSettings
1813
+ : public DBBasicTestWithTimestampBase,
1814
+ public testing::WithParamInterface<
1815
+ std::tuple<std::shared_ptr<const FilterPolicy>, CompressionType,
1816
+ uint32_t, uint32_t>> {
1817
+ public:
1818
+ DBBasicTestWithTimestampCompressionSettings()
1819
+ : DBBasicTestWithTimestampBase(
1820
+ "db_basic_test_with_timestamp_compression") {}
1821
+ };
1822
+
1823
+ TEST_P(DBBasicTestWithTimestampCompressionSettings, PutAndGet) {
1824
+ const int kNumKeysPerFile = 1024;
1825
+ const size_t kNumTimestamps = 4;
1826
+ Options options = CurrentOptions();
1827
+ options.create_if_missing = true;
1828
+ options.env = env_;
1829
+ options.memtable_factory.reset(new SpecialSkipListFactory(kNumKeysPerFile));
1830
+ size_t ts_sz = Timestamp(0, 0).size();
1831
+ TestComparator test_cmp(ts_sz);
1832
+ options.comparator = &test_cmp;
1833
+ BlockBasedTableOptions bbto;
1834
+ bbto.filter_policy = std::get<0>(GetParam());
1835
+ bbto.whole_key_filtering = true;
1836
+ options.table_factory.reset(NewBlockBasedTableFactory(bbto));
1837
+
1838
+ const CompressionType comp_type = std::get<1>(GetParam());
1839
+ #if LZ4_VERSION_NUMBER < 10400 // r124+
1840
+ if (comp_type == kLZ4Compression || comp_type == kLZ4HCCompression) {
1841
+ return;
1842
+ }
1843
+ #endif // LZ4_VERSION_NUMBER >= 10400
1844
+ if (!ZSTD_Supported() && comp_type == kZSTD) {
1845
+ return;
1846
+ }
1847
+ if (!Zlib_Supported() && comp_type == kZlibCompression) {
1848
+ return;
1849
+ }
1850
+
1851
+ options.compression = comp_type;
1852
+ options.compression_opts.max_dict_bytes = std::get<2>(GetParam());
1853
+ if (comp_type == kZSTD) {
1854
+ options.compression_opts.zstd_max_train_bytes = std::get<2>(GetParam());
1855
+ }
1856
+ options.compression_opts.parallel_threads = std::get<3>(GetParam());
1857
+ options.target_file_size_base = 1 << 26; // 64MB
1858
+ DestroyAndReopen(options);
1859
+ CreateAndReopenWithCF({"pikachu"}, options);
1860
+ size_t num_cfs = handles_.size();
1861
+ ASSERT_EQ(2, num_cfs);
1862
+ std::vector<std::string> write_ts_list;
1863
+ std::vector<std::string> read_ts_list;
1864
+
1865
+ for (size_t i = 0; i != kNumTimestamps; ++i) {
1866
+ write_ts_list.push_back(Timestamp(i * 2, 0));
1867
+ read_ts_list.push_back(Timestamp(1 + i * 2, 0));
1868
+ const Slice write_ts = write_ts_list.back();
1869
+ WriteOptions wopts;
1870
+ wopts.timestamp = &write_ts;
1871
+ for (int cf = 0; cf != static_cast<int>(num_cfs); ++cf) {
1872
+ for (size_t j = 0; j != (kNumKeysPerFile - 1) / kNumTimestamps; ++j) {
1873
+ ASSERT_OK(Put(cf, Key1(j),
1874
+ "value_" + std::to_string(j) + "_" + std::to_string(i),
1875
+ wopts));
1876
+ }
1877
+ }
1878
+ }
1879
+ const auto& verify_db_func = [&]() {
1880
+ for (size_t i = 0; i != kNumTimestamps; ++i) {
1881
+ ReadOptions ropts;
1882
+ const Slice read_ts = read_ts_list[i];
1883
+ ropts.timestamp = &read_ts;
1884
+ for (int cf = 0; cf != static_cast<int>(num_cfs); ++cf) {
1885
+ ColumnFamilyHandle* cfh = handles_[cf];
1886
+ for (size_t j = 0; j != (kNumKeysPerFile - 1) / kNumTimestamps; ++j) {
1887
+ std::string value;
1888
+ ASSERT_OK(db_->Get(ropts, cfh, Key1(j), &value));
1889
+ ASSERT_EQ("value_" + std::to_string(j) + "_" + std::to_string(i),
1890
+ value);
1891
+ }
1892
+ }
1893
+ }
1894
+ };
1895
+ verify_db_func();
1896
+ Close();
1897
+ }
1898
+
1899
+ TEST_P(DBBasicTestWithTimestampCompressionSettings, PutDeleteGet) {
1900
+ Options options = CurrentOptions();
1901
+ options.env = env_;
1902
+ options.create_if_missing = true;
1903
+ const size_t kTimestampSize = Timestamp(0, 0).size();
1904
+ TestComparator test_cmp(kTimestampSize);
1905
+ options.comparator = &test_cmp;
1906
+ const int kNumKeysPerFile = 1024;
1907
+ options.memtable_factory.reset(new SpecialSkipListFactory(kNumKeysPerFile));
1908
+ BlockBasedTableOptions bbto;
1909
+ bbto.filter_policy = std::get<0>(GetParam());
1910
+ bbto.whole_key_filtering = true;
1911
+ options.table_factory.reset(NewBlockBasedTableFactory(bbto));
1912
+
1913
+ const CompressionType comp_type = std::get<1>(GetParam());
1914
+ #if LZ4_VERSION_NUMBER < 10400 // r124+
1915
+ if (comp_type == kLZ4Compression || comp_type == kLZ4HCCompression) {
1916
+ return;
1917
+ }
1918
+ #endif // LZ4_VERSION_NUMBER >= 10400
1919
+ if (!ZSTD_Supported() && comp_type == kZSTD) {
1920
+ return;
1921
+ }
1922
+ if (!Zlib_Supported() && comp_type == kZlibCompression) {
1923
+ return;
1924
+ }
1925
+
1926
+ options.compression = comp_type;
1927
+ options.compression_opts.max_dict_bytes = std::get<2>(GetParam());
1928
+ if (comp_type == kZSTD) {
1929
+ options.compression_opts.zstd_max_train_bytes = std::get<2>(GetParam());
1930
+ }
1931
+ options.compression_opts.parallel_threads = std::get<3>(GetParam());
1932
+ options.target_file_size_base = 1 << 26; // 64MB
1933
+
1934
+ DestroyAndReopen(options);
1935
+
1936
+ const size_t kNumL0Files =
1937
+ static_cast<size_t>(Options().level0_file_num_compaction_trigger);
1938
+ {
1939
+ // Generate enough L0 files with ts=1 to trigger compaction to L1
1940
+ std::string ts_str = Timestamp(1, 0);
1941
+ Slice ts = ts_str;
1942
+ WriteOptions wopts;
1943
+ wopts.timestamp = &ts;
1944
+ for (size_t i = 0; i != kNumL0Files; ++i) {
1945
+ for (int j = 0; j != kNumKeysPerFile; ++j) {
1946
+ ASSERT_OK(db_->Put(wopts, Key1(j), "value" + std::to_string(i)));
1947
+ }
1948
+ ASSERT_OK(db_->Flush(FlushOptions()));
1949
+ }
1950
+ ASSERT_OK(dbfull()->TEST_WaitForCompact());
1951
+ // Generate another L0 at ts=3
1952
+ ts_str = Timestamp(3, 0);
1953
+ ts = ts_str;
1954
+ wopts.timestamp = &ts;
1955
+ for (int i = 0; i != kNumKeysPerFile; ++i) {
1956
+ std::string key_str = Key1(i);
1957
+ Slice key(key_str);
1958
+ if ((i % 3) == 0) {
1959
+ ASSERT_OK(db_->Delete(wopts, key));
1960
+ } else {
1961
+ ASSERT_OK(db_->Put(wopts, key, "new_value"));
1962
+ }
1963
+ }
1964
+ ASSERT_OK(db_->Flush(FlushOptions()));
1965
+ // Populate memtable at ts=5
1966
+ ts_str = Timestamp(5, 0);
1967
+ ts = ts_str;
1968
+ wopts.timestamp = &ts;
1969
+ for (int i = 0; i != kNumKeysPerFile; ++i) {
1970
+ std::string key_str = Key1(i);
1971
+ Slice key(key_str);
1972
+ if ((i % 3) == 1) {
1973
+ ASSERT_OK(db_->Delete(wopts, key));
1974
+ } else if ((i % 3) == 2) {
1975
+ ASSERT_OK(db_->Put(wopts, key, "new_value_2"));
1976
+ }
1977
+ }
1978
+ }
1979
+ {
1980
+ std::string ts_str = Timestamp(6, 0);
1981
+ Slice ts = ts_str;
1982
+ ReadOptions ropts;
1983
+ ropts.timestamp = &ts;
1984
+ for (uint64_t i = 0; i != static_cast<uint64_t>(kNumKeysPerFile); ++i) {
1985
+ std::string value;
1986
+ Status s = db_->Get(ropts, Key1(i), &value);
1987
+ if ((i % 3) == 2) {
1988
+ ASSERT_OK(s);
1989
+ ASSERT_EQ("new_value_2", value);
1990
+ } else {
1991
+ ASSERT_TRUE(s.IsNotFound());
1992
+ }
1993
+ }
1994
+ }
1995
+ }
1996
+
1997
+ #ifndef ROCKSDB_LITE
1998
+ // A class which remembers the name of each flushed file.
1999
+ class FlushedFileCollector : public EventListener {
2000
+ public:
2001
+ FlushedFileCollector() {}
2002
+ ~FlushedFileCollector() override {}
2003
+
2004
+ void OnFlushCompleted(DB* /*db*/, const FlushJobInfo& info) override {
2005
+ InstrumentedMutexLock lock(&mutex_);
2006
+ flushed_files_.push_back(info.file_path);
2007
+ }
2008
+
2009
+ std::vector<std::string> GetFlushedFiles() {
2010
+ std::vector<std::string> result;
2011
+ {
2012
+ InstrumentedMutexLock lock(&mutex_);
2013
+ result = flushed_files_;
2014
+ }
2015
+ return result;
2016
+ }
2017
+
2018
+ void ClearFlushedFiles() {
2019
+ InstrumentedMutexLock lock(&mutex_);
2020
+ flushed_files_.clear();
2021
+ }
2022
+
2023
+ private:
2024
+ std::vector<std::string> flushed_files_;
2025
+ InstrumentedMutex mutex_;
2026
+ };
2027
+
2028
+ TEST_P(DBBasicTestWithTimestampCompressionSettings, PutAndGetWithCompaction) {
2029
+ const int kNumKeysPerFile = 1024;
2030
+ const size_t kNumTimestamps = 2;
2031
+ const size_t kNumKeysPerTimestamp = (kNumKeysPerFile - 1) / kNumTimestamps;
2032
+ const size_t kSplitPosBase = kNumKeysPerTimestamp / 2;
2033
+ Options options = CurrentOptions();
2034
+ options.create_if_missing = true;
2035
+ options.env = env_;
2036
+ options.memtable_factory.reset(new SpecialSkipListFactory(kNumKeysPerFile));
2037
+
2038
+ FlushedFileCollector* collector = new FlushedFileCollector();
2039
+ options.listeners.emplace_back(collector);
2040
+
2041
+ size_t ts_sz = Timestamp(0, 0).size();
2042
+ TestComparator test_cmp(ts_sz);
2043
+ options.comparator = &test_cmp;
2044
+ BlockBasedTableOptions bbto;
2045
+ bbto.filter_policy = std::get<0>(GetParam());
2046
+ bbto.whole_key_filtering = true;
2047
+ options.table_factory.reset(NewBlockBasedTableFactory(bbto));
2048
+
2049
+ const CompressionType comp_type = std::get<1>(GetParam());
2050
+ #if LZ4_VERSION_NUMBER < 10400 // r124+
2051
+ if (comp_type == kLZ4Compression || comp_type == kLZ4HCCompression) {
2052
+ return;
2053
+ }
2054
+ #endif // LZ4_VERSION_NUMBER >= 10400
2055
+ if (!ZSTD_Supported() && comp_type == kZSTD) {
2056
+ return;
2057
+ }
2058
+ if (!Zlib_Supported() && comp_type == kZlibCompression) {
2059
+ return;
2060
+ }
2061
+
2062
+ options.compression = comp_type;
2063
+ options.compression_opts.max_dict_bytes = std::get<2>(GetParam());
2064
+ if (comp_type == kZSTD) {
2065
+ options.compression_opts.zstd_max_train_bytes = std::get<2>(GetParam());
2066
+ }
2067
+ options.compression_opts.parallel_threads = std::get<3>(GetParam());
2068
+ DestroyAndReopen(options);
2069
+ CreateAndReopenWithCF({"pikachu"}, options);
2070
+
2071
+ size_t num_cfs = handles_.size();
2072
+ ASSERT_EQ(2, num_cfs);
2073
+ std::vector<std::string> write_ts_list;
2074
+ std::vector<std::string> read_ts_list;
2075
+
2076
+ const auto& verify_records_func = [&](size_t i, size_t begin, size_t end,
2077
+ ColumnFamilyHandle* cfh) {
2078
+ std::string value;
2079
+ std::string timestamp;
2080
+
2081
+ ReadOptions ropts;
2082
+ const Slice read_ts = read_ts_list[i];
2083
+ ropts.timestamp = &read_ts;
2084
+ std::string expected_timestamp =
2085
+ std::string(write_ts_list[i].data(), write_ts_list[i].size());
2086
+
2087
+ for (size_t j = begin; j <= end; ++j) {
2088
+ ASSERT_OK(db_->Get(ropts, cfh, Key1(j), &value, &timestamp));
2089
+ ASSERT_EQ("value_" + std::to_string(j) + "_" + std::to_string(i), value);
2090
+ ASSERT_EQ(expected_timestamp, timestamp);
2091
+ }
2092
+ };
2093
+
2094
+ for (size_t i = 0; i != kNumTimestamps; ++i) {
2095
+ write_ts_list.push_back(Timestamp(i * 2, 0));
2096
+ read_ts_list.push_back(Timestamp(1 + i * 2, 0));
2097
+ const Slice write_ts = write_ts_list.back();
2098
+ WriteOptions wopts;
2099
+ wopts.timestamp = &write_ts;
2100
+ for (int cf = 0; cf != static_cast<int>(num_cfs); ++cf) {
2101
+ size_t memtable_get_start = 0;
2102
+ for (size_t j = 0; j != kNumKeysPerTimestamp; ++j) {
2103
+ ASSERT_OK(Put(cf, Key1(j),
2104
+ "value_" + std::to_string(j) + "_" + std::to_string(i),
2105
+ wopts));
2106
+ if (j == kSplitPosBase + i || j == kNumKeysPerTimestamp - 1) {
2107
+ verify_records_func(i, memtable_get_start, j, handles_[cf]);
2108
+ memtable_get_start = j + 1;
2109
+
2110
+ // flush all keys with the same timestamp to two sst files, split at
2111
+ // incremental positions such that lowerlevel[1].smallest.userkey ==
2112
+ // higherlevel[0].largest.userkey
2113
+ ASSERT_OK(Flush(cf));
2114
+
2115
+ // compact files (2 at each level) to a lower level such that all
2116
+ // keys with the same timestamp is at one level, with newer versions
2117
+ // at higher levels.
2118
+ CompactionOptions compact_opt;
2119
+ compact_opt.compression = kNoCompression;
2120
+ ASSERT_OK(db_->CompactFiles(compact_opt, handles_[cf],
2121
+ collector->GetFlushedFiles(),
2122
+ static_cast<int>(kNumTimestamps - i)));
2123
+ collector->ClearFlushedFiles();
2124
+ }
2125
+ }
2126
+ }
2127
+ }
2128
+ const auto& verify_db_func = [&]() {
2129
+ for (size_t i = 0; i != kNumTimestamps; ++i) {
2130
+ ReadOptions ropts;
2131
+ const Slice read_ts = read_ts_list[i];
2132
+ ropts.timestamp = &read_ts;
2133
+ std::string expected_timestamp(write_ts_list[i].data(),
2134
+ write_ts_list[i].size());
2135
+ for (int cf = 0; cf != static_cast<int>(num_cfs); ++cf) {
2136
+ ColumnFamilyHandle* cfh = handles_[cf];
2137
+ verify_records_func(i, 0, kNumKeysPerTimestamp - 1, cfh);
2138
+ }
2139
+ }
2140
+ };
2141
+ verify_db_func();
2142
+ Close();
2143
+ }
2144
+
2145
+ TEST_F(DBBasicTestWithTimestamp, BatchWriteAndMultiGet) {
2146
+ const int kNumKeysPerFile = 8192;
2147
+ const size_t kNumTimestamps = 2;
2148
+ const size_t kNumKeysPerTimestamp = (kNumKeysPerFile - 1) / kNumTimestamps;
2149
+ Options options = CurrentOptions();
2150
+ options.create_if_missing = true;
2151
+ options.env = env_;
2152
+ options.memtable_factory.reset(new SpecialSkipListFactory(kNumKeysPerFile));
2153
+ options.memtable_prefix_bloom_size_ratio = 0.1;
2154
+ options.memtable_whole_key_filtering = true;
2155
+
2156
+ size_t ts_sz = Timestamp(0, 0).size();
2157
+ TestComparator test_cmp(ts_sz);
2158
+ options.comparator = &test_cmp;
2159
+ BlockBasedTableOptions bbto;
2160
+ bbto.filter_policy.reset(NewBloomFilterPolicy(
2161
+ 10 /*bits_per_key*/, false /*use_block_based_builder*/));
2162
+ bbto.whole_key_filtering = true;
2163
+ options.table_factory.reset(NewBlockBasedTableFactory(bbto));
2164
+ DestroyAndReopen(options);
2165
+ CreateAndReopenWithCF({"pikachu"}, options);
2166
+ size_t num_cfs = handles_.size();
2167
+ ASSERT_EQ(2, num_cfs);
2168
+ std::vector<std::string> write_ts_list;
2169
+ std::vector<std::string> read_ts_list;
2170
+
2171
+ const auto& verify_records_func = [&](size_t i, ColumnFamilyHandle* cfh) {
2172
+ std::vector<Slice> keys;
2173
+ std::vector<std::string> key_vals;
2174
+ std::vector<std::string> values;
2175
+ std::vector<std::string> timestamps;
2176
+
2177
+ for (size_t j = 0; j != kNumKeysPerTimestamp; ++j) {
2178
+ key_vals.push_back(Key1(j));
2179
+ }
2180
+ for (size_t j = 0; j != kNumKeysPerTimestamp; ++j) {
2181
+ keys.push_back(key_vals[j]);
2182
+ }
2183
+
2184
+ ReadOptions ropts;
2185
+ const Slice read_ts = read_ts_list[i];
2186
+ ropts.timestamp = &read_ts;
2187
+ std::string expected_timestamp(write_ts_list[i].data(),
2188
+ write_ts_list[i].size());
2189
+
2190
+ std::vector<ColumnFamilyHandle*> cfhs(keys.size(), cfh);
2191
+ std::vector<Status> statuses =
2192
+ db_->MultiGet(ropts, cfhs, keys, &values, &timestamps);
2193
+ for (size_t j = 0; j != kNumKeysPerTimestamp; ++j) {
2194
+ ASSERT_OK(statuses[j]);
2195
+ ASSERT_EQ("value_" + std::to_string(j) + "_" + std::to_string(i),
2196
+ values[j]);
2197
+ ASSERT_EQ(expected_timestamp, timestamps[j]);
2198
+ }
2199
+ };
2200
+
2201
+ for (size_t i = 0; i != kNumTimestamps; ++i) {
2202
+ write_ts_list.push_back(Timestamp(i * 2, 0));
2203
+ read_ts_list.push_back(Timestamp(1 + i * 2, 0));
2204
+ const Slice& write_ts = write_ts_list.back();
2205
+ for (int cf = 0; cf != static_cast<int>(num_cfs); ++cf) {
2206
+ WriteOptions wopts;
2207
+ WriteBatch batch(0, 0, ts_sz);
2208
+ for (size_t j = 0; j != kNumKeysPerTimestamp; ++j) {
2209
+ ASSERT_OK(
2210
+ batch.Put(handles_[cf], Key1(j),
2211
+ "value_" + std::to_string(j) + "_" + std::to_string(i)));
2212
+ }
2213
+ ASSERT_OK(batch.AssignTimestamp(write_ts));
2214
+ ASSERT_OK(db_->Write(wopts, &batch));
2215
+
2216
+ verify_records_func(i, handles_[cf]);
2217
+
2218
+ ASSERT_OK(Flush(cf));
2219
+ }
2220
+ }
2221
+
2222
+ const auto& verify_db_func = [&]() {
2223
+ for (size_t i = 0; i != kNumTimestamps; ++i) {
2224
+ ReadOptions ropts;
2225
+ const Slice read_ts = read_ts_list[i];
2226
+ ropts.timestamp = &read_ts;
2227
+ for (int cf = 0; cf != static_cast<int>(num_cfs); ++cf) {
2228
+ ColumnFamilyHandle* cfh = handles_[cf];
2229
+ verify_records_func(i, cfh);
2230
+ }
2231
+ }
2232
+ };
2233
+ verify_db_func();
2234
+ Close();
2235
+ }
2236
+
2237
+ TEST_F(DBBasicTestWithTimestamp, MultiGetNoReturnTs) {
2238
+ Options options = CurrentOptions();
2239
+ options.env = env_;
2240
+ const size_t kTimestampSize = Timestamp(0, 0).size();
2241
+ TestComparator test_cmp(kTimestampSize);
2242
+ options.comparator = &test_cmp;
2243
+ DestroyAndReopen(options);
2244
+ WriteOptions write_opts;
2245
+ std::string ts_str = Timestamp(1, 0);
2246
+ Slice ts = ts_str;
2247
+ write_opts.timestamp = &ts;
2248
+ ASSERT_OK(db_->Put(write_opts, "foo", "value"));
2249
+ ASSERT_OK(db_->Put(write_opts, "bar", "value"));
2250
+ ASSERT_OK(db_->Put(write_opts, "fooxxxxxxxxxxxxxxxx", "value"));
2251
+ ASSERT_OK(db_->Put(write_opts, "barxxxxxxxxxxxxxxxx", "value"));
2252
+ ColumnFamilyHandle* cfh = dbfull()->DefaultColumnFamily();
2253
+ ts_str = Timestamp(2, 0);
2254
+ ts = ts_str;
2255
+ ReadOptions read_opts;
2256
+ read_opts.timestamp = &ts;
2257
+ {
2258
+ ColumnFamilyHandle* column_families[] = {cfh, cfh};
2259
+ Slice keys[] = {"foo", "bar"};
2260
+ PinnableSlice values[] = {PinnableSlice(), PinnableSlice()};
2261
+ Status statuses[] = {Status::OK(), Status::OK()};
2262
+ dbfull()->MultiGet(read_opts, /*num_keys=*/2, &column_families[0], &keys[0],
2263
+ &values[0], &statuses[0], /*sorted_input=*/false);
2264
+ for (const auto& s : statuses) {
2265
+ ASSERT_OK(s);
2266
+ }
2267
+ }
2268
+ {
2269
+ ColumnFamilyHandle* column_families[] = {cfh, cfh, cfh, cfh};
2270
+ // Make user keys longer than configured timestamp size (16 bytes) to
2271
+ // verify RocksDB does not use the trailing bytes 'x' as timestamp.
2272
+ Slice keys[] = {"fooxxxxxxxxxxxxxxxx", "barxxxxxxxxxxxxxxxx", "foo", "bar"};
2273
+ PinnableSlice values[] = {PinnableSlice(), PinnableSlice(), PinnableSlice(),
2274
+ PinnableSlice()};
2275
+ Status statuses[] = {Status::OK(), Status::OK(), Status::OK(),
2276
+ Status::OK()};
2277
+ dbfull()->MultiGet(read_opts, /*num_keys=*/4, &column_families[0], &keys[0],
2278
+ &values[0], &statuses[0], /*sorted_input=*/false);
2279
+ for (const auto& s : statuses) {
2280
+ ASSERT_OK(s);
2281
+ }
2282
+ }
2283
+ Close();
2284
+ }
2285
+
2286
+ #endif // !ROCKSDB_LITE
2287
+
2288
+ INSTANTIATE_TEST_CASE_P(
2289
+ Timestamp, DBBasicTestWithTimestampCompressionSettings,
2290
+ ::testing::Combine(
2291
+ ::testing::Values(std::shared_ptr<const FilterPolicy>(nullptr),
2292
+ std::shared_ptr<const FilterPolicy>(
2293
+ NewBloomFilterPolicy(10, false))),
2294
+ ::testing::Values(kNoCompression, kZlibCompression, kLZ4Compression,
2295
+ kLZ4HCCompression, kZSTD),
2296
+ ::testing::Values(0, 1 << 14), ::testing::Values(1, 4)));
2297
+
2298
+ class DBBasicTestWithTimestampPrefixSeek
2299
+ : public DBBasicTestWithTimestampBase,
2300
+ public testing::WithParamInterface<
2301
+ std::tuple<std::shared_ptr<const SliceTransform>,
2302
+ std::shared_ptr<const FilterPolicy>, bool>> {
2303
+ public:
2304
+ DBBasicTestWithTimestampPrefixSeek()
2305
+ : DBBasicTestWithTimestampBase(
2306
+ "/db_basic_test_with_timestamp_prefix_seek") {}
2307
+ };
2308
+
2309
+ TEST_P(DBBasicTestWithTimestampPrefixSeek, ForwardIterateWithPrefix) {
2310
+ const size_t kNumKeysPerFile = 128;
2311
+ Options options = CurrentOptions();
2312
+ options.env = env_;
2313
+ options.create_if_missing = true;
2314
+ const size_t kTimestampSize = Timestamp(0, 0).size();
2315
+ TestComparator test_cmp(kTimestampSize);
2316
+ options.comparator = &test_cmp;
2317
+ options.prefix_extractor = std::get<0>(GetParam());
2318
+ options.memtable_factory.reset(new SpecialSkipListFactory(kNumKeysPerFile));
2319
+ BlockBasedTableOptions bbto;
2320
+ bbto.filter_policy = std::get<1>(GetParam());
2321
+ options.table_factory.reset(NewBlockBasedTableFactory(bbto));
2322
+ DestroyAndReopen(options);
2323
+
2324
+ const uint64_t kMaxKey = 0xffffffffffffffff;
2325
+ const uint64_t kMinKey = 0xfffffffffffff000;
2326
+ const std::vector<std::string> write_ts_list = {Timestamp(3, 0xffffffff),
2327
+ Timestamp(6, 0xffffffff)};
2328
+ WriteOptions write_opts;
2329
+ {
2330
+ for (size_t i = 0; i != write_ts_list.size(); ++i) {
2331
+ Slice write_ts = write_ts_list[i];
2332
+ write_opts.timestamp = &write_ts;
2333
+ for (uint64_t key = kMaxKey; key >= kMinKey; --key) {
2334
+ Status s = db_->Put(write_opts, Key1(key), "value" + std::to_string(i));
2335
+ ASSERT_OK(s);
2336
+ }
2337
+ }
2338
+ }
2339
+ const std::vector<std::string> read_ts_list = {Timestamp(5, 0xffffffff),
2340
+ Timestamp(9, 0xffffffff)};
2341
+ {
2342
+ ReadOptions read_opts;
2343
+ read_opts.total_order_seek = false;
2344
+ read_opts.prefix_same_as_start = std::get<2>(GetParam());
2345
+ fprintf(stdout, "%s %s %d\n", options.prefix_extractor->Name(),
2346
+ bbto.filter_policy ? bbto.filter_policy->Name() : "null",
2347
+ static_cast<int>(read_opts.prefix_same_as_start));
2348
+ for (size_t i = 0; i != read_ts_list.size(); ++i) {
2349
+ Slice read_ts = read_ts_list[i];
2350
+ read_opts.timestamp = &read_ts;
2351
+ std::unique_ptr<Iterator> iter(db_->NewIterator(read_opts));
2352
+
2353
+ // Seek to kMaxKey
2354
+ iter->Seek(Key1(kMaxKey));
2355
+ CheckIterUserEntry(iter.get(), Key1(kMaxKey), kTypeValue,
2356
+ "value" + std::to_string(i), write_ts_list[i]);
2357
+ iter->Next();
2358
+ ASSERT_FALSE(iter->Valid());
2359
+ }
2360
+ const std::vector<uint64_t> targets = {kMinKey, kMinKey + 0x10,
2361
+ kMinKey + 0x100, kMaxKey};
2362
+ const SliceTransform* const pe = options.prefix_extractor.get();
2363
+ ASSERT_NE(nullptr, pe);
2364
+ const size_t kPrefixShift =
2365
+ 8 * (Key1(0).size() - pe->Transform(Key1(0)).size());
2366
+ const uint64_t kPrefixMask =
2367
+ ~((static_cast<uint64_t>(1) << kPrefixShift) - 1);
2368
+ const uint64_t kNumKeysWithinPrefix =
2369
+ (static_cast<uint64_t>(1) << kPrefixShift);
2370
+ for (size_t i = 0; i != read_ts_list.size(); ++i) {
2371
+ Slice read_ts = read_ts_list[i];
2372
+ read_opts.timestamp = &read_ts;
2373
+ std::unique_ptr<Iterator> it(db_->NewIterator(read_opts));
2374
+ for (size_t j = 0; j != targets.size(); ++j) {
2375
+ std::string start_key = Key1(targets[j]);
2376
+ uint64_t expected_ub =
2377
+ (targets[j] & kPrefixMask) - 1 + kNumKeysWithinPrefix;
2378
+ uint64_t expected_key = targets[j];
2379
+ size_t count = 0;
2380
+ it->Seek(Key1(targets[j]));
2381
+ while (it->Valid()) {
2382
+ std::string saved_prev_key;
2383
+ saved_prev_key.assign(it->key().data(), it->key().size());
2384
+
2385
+ // Out of prefix
2386
+ if (!read_opts.prefix_same_as_start &&
2387
+ pe->Transform(saved_prev_key) != pe->Transform(start_key)) {
2388
+ break;
2389
+ }
2390
+ CheckIterUserEntry(it.get(), Key1(expected_key), kTypeValue,
2391
+ "value" + std::to_string(i), write_ts_list[i]);
2392
+ ++count;
2393
+ ++expected_key;
2394
+ it->Next();
2395
+ }
2396
+ ASSERT_EQ(expected_ub - targets[j] + 1, count);
2397
+ }
2398
+ }
2399
+ }
2400
+ Close();
2401
+ }
2402
+
2403
+ // TODO(yanqin): consider handling non-fixed-length prefix extractors, e.g.
2404
+ // NoopTransform.
2405
+ INSTANTIATE_TEST_CASE_P(
2406
+ Timestamp, DBBasicTestWithTimestampPrefixSeek,
2407
+ ::testing::Combine(
2408
+ ::testing::Values(
2409
+ std::shared_ptr<const SliceTransform>(NewFixedPrefixTransform(1)),
2410
+ std::shared_ptr<const SliceTransform>(NewFixedPrefixTransform(4)),
2411
+ std::shared_ptr<const SliceTransform>(NewFixedPrefixTransform(7)),
2412
+ std::shared_ptr<const SliceTransform>(NewFixedPrefixTransform(8))),
2413
+ ::testing::Values(std::shared_ptr<const FilterPolicy>(nullptr),
2414
+ std::shared_ptr<const FilterPolicy>(
2415
+ NewBloomFilterPolicy(10 /*bits_per_key*/, false)),
2416
+ std::shared_ptr<const FilterPolicy>(
2417
+ NewBloomFilterPolicy(20 /*bits_per_key*/,
2418
+ false))),
2419
+ ::testing::Bool()));
2420
+
2421
+ class DBBasicTestWithTsIterTombstones
2422
+ : public DBBasicTestWithTimestampBase,
2423
+ public testing::WithParamInterface<
2424
+ std::tuple<std::shared_ptr<const SliceTransform>,
2425
+ std::shared_ptr<const FilterPolicy>, int>> {
2426
+ public:
2427
+ DBBasicTestWithTsIterTombstones()
2428
+ : DBBasicTestWithTimestampBase("/db_basic_ts_iter_tombstones") {}
2429
+ };
2430
+
2431
+ TEST_P(DBBasicTestWithTsIterTombstones, ForwardIterDelete) {
2432
+ constexpr size_t kNumKeysPerFile = 128;
2433
+ Options options = CurrentOptions();
2434
+ options.env = env_;
2435
+ const size_t kTimestampSize = Timestamp(0, 0).size();
2436
+ TestComparator test_cmp(kTimestampSize);
2437
+ options.comparator = &test_cmp;
2438
+ options.prefix_extractor = std::get<0>(GetParam());
2439
+ options.memtable_factory.reset(new SpecialSkipListFactory(kNumKeysPerFile));
2440
+ BlockBasedTableOptions bbto;
2441
+ bbto.filter_policy = std::get<1>(GetParam());
2442
+ options.table_factory.reset(NewBlockBasedTableFactory(bbto));
2443
+ options.num_levels = std::get<2>(GetParam());
2444
+ DestroyAndReopen(options);
2445
+ std::vector<std::string> write_ts_strs = {Timestamp(2, 0), Timestamp(4, 0)};
2446
+ constexpr uint64_t kMaxKey = 0xffffffffffffffff;
2447
+ constexpr uint64_t kMinKey = 0xfffffffffffff000;
2448
+ // Insert kMinKey...kMaxKey
2449
+ uint64_t key = kMinKey;
2450
+ WriteOptions write_opts;
2451
+ Slice ts = write_ts_strs[0];
2452
+ write_opts.timestamp = &ts;
2453
+ do {
2454
+ Status s = db_->Put(write_opts, Key1(key), "value" + std::to_string(key));
2455
+ ASSERT_OK(s);
2456
+ if (kMaxKey == key) {
2457
+ break;
2458
+ }
2459
+ ++key;
2460
+ } while (true);
2461
+ // Delete them all
2462
+ ts = write_ts_strs[1];
2463
+ write_opts.timestamp = &ts;
2464
+ for (key = kMaxKey; key >= kMinKey; --key) {
2465
+ Status s;
2466
+ if (0 != (key % 2)) {
2467
+ s = db_->Put(write_opts, Key1(key), "value1" + std::to_string(key));
2468
+ } else {
2469
+ s = db_->Delete(write_opts, Key1(key));
2470
+ }
2471
+ ASSERT_OK(s);
2472
+ }
2473
+ ASSERT_OK(dbfull()->TEST_WaitForCompact());
2474
+ {
2475
+ std::string read_ts = Timestamp(4, 0);
2476
+ ts = read_ts;
2477
+ ReadOptions read_opts;
2478
+ read_opts.total_order_seek = true;
2479
+ read_opts.timestamp = &ts;
2480
+ std::unique_ptr<Iterator> iter(db_->NewIterator(read_opts));
2481
+ size_t count = 0;
2482
+ key = kMinKey + 1;
2483
+ for (iter->SeekToFirst(); iter->Valid(); iter->Next(), ++count, key += 2) {
2484
+ ASSERT_EQ(Key1(key), iter->key());
2485
+ ASSERT_EQ("value1" + std::to_string(key), iter->value());
2486
+ }
2487
+ ASSERT_EQ((kMaxKey - kMinKey + 1) / 2, count);
2488
+ }
2489
+ Close();
2490
+ }
2491
+
2492
+ INSTANTIATE_TEST_CASE_P(
2493
+ Timestamp, DBBasicTestWithTsIterTombstones,
2494
+ ::testing::Combine(
2495
+ ::testing::Values(
2496
+ std::shared_ptr<const SliceTransform>(NewFixedPrefixTransform(7)),
2497
+ std::shared_ptr<const SliceTransform>(NewFixedPrefixTransform(8))),
2498
+ ::testing::Values(std::shared_ptr<const FilterPolicy>(nullptr),
2499
+ std::shared_ptr<const FilterPolicy>(
2500
+ NewBloomFilterPolicy(10, false)),
2501
+ std::shared_ptr<const FilterPolicy>(
2502
+ NewBloomFilterPolicy(20, false))),
2503
+ ::testing::Values(2, 6)));
2504
+
2505
+ } // namespace ROCKSDB_NAMESPACE
2506
+
2507
+ #ifdef ROCKSDB_UNITTESTS_WITH_CUSTOM_OBJECTS_FROM_STATIC_LIBS
2508
+ extern "C" {
2509
+ void RegisterCustomObjects(int argc, char** argv);
2510
+ }
2511
+ #else
2512
+ void RegisterCustomObjects(int /*argc*/, char** /*argv*/) {}
2513
+ #endif // !ROCKSDB_UNITTESTS_WITH_CUSTOM_OBJECTS_FROM_STATIC_LIBS
2514
+
2515
+ int main(int argc, char** argv) {
2516
+ ROCKSDB_NAMESPACE::port::InstallStackTraceHandler();
2517
+ ::testing::InitGoogleTest(&argc, argv);
2518
+ RegisterCustomObjects(argc, argv);
2519
+ return RUN_ALL_TESTS();
2520
+ }