@nxtedition/rocksdb 13.5.7 → 13.5.9

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 (509) hide show
  1. package/binding.cc +248 -70
  2. package/binding.gyp +2 -2
  3. package/deps/rocksdb/rocksdb/BUCK +12 -0
  4. package/deps/rocksdb/rocksdb/CMakeLists.txt +7 -0
  5. package/deps/rocksdb/rocksdb/Makefile +28 -23
  6. package/deps/rocksdb/rocksdb/cache/cache.cc +0 -1
  7. package/deps/rocksdb/rocksdb/cache/cache_bench_tool.cc +1 -2
  8. package/deps/rocksdb/rocksdb/cache/compressed_secondary_cache.cc +43 -39
  9. package/deps/rocksdb/rocksdb/cache/compressed_secondary_cache.h +2 -0
  10. package/deps/rocksdb/rocksdb/cache/compressed_secondary_cache_test.cc +0 -1
  11. package/deps/rocksdb/rocksdb/cache/lru_cache.cc +2 -3
  12. package/deps/rocksdb/rocksdb/cache/lru_cache_test.cc +2 -2
  13. package/deps/rocksdb/rocksdb/cache/secondary_cache.cc +1 -3
  14. package/deps/rocksdb/rocksdb/cache/secondary_cache_adapter.cc +11 -1
  15. package/deps/rocksdb/rocksdb/cache/tiered_secondary_cache_test.cc +13 -5
  16. package/deps/rocksdb/rocksdb/crash_test.mk +61 -15
  17. package/deps/rocksdb/rocksdb/db/arena_wrapped_db_iter.cc +136 -45
  18. package/deps/rocksdb/rocksdb/db/arena_wrapped_db_iter.h +34 -16
  19. package/deps/rocksdb/rocksdb/db/blob/blob_file_builder.cc +10 -7
  20. package/deps/rocksdb/rocksdb/db/blob/blob_file_builder_test.cc +1 -2
  21. package/deps/rocksdb/rocksdb/db/blob/blob_file_meta.h +1 -0
  22. package/deps/rocksdb/rocksdb/db/blob/blob_file_reader.cc +12 -9
  23. package/deps/rocksdb/rocksdb/db/blob/blob_file_reader_test.cc +3 -4
  24. package/deps/rocksdb/rocksdb/db/blob/blob_source.cc +2 -2
  25. package/deps/rocksdb/rocksdb/db/blob/blob_source_test.cc +3 -4
  26. package/deps/rocksdb/rocksdb/db/builder.cc +22 -8
  27. package/deps/rocksdb/rocksdb/db/builder.h +5 -4
  28. package/deps/rocksdb/rocksdb/db/c.cc +556 -15
  29. package/deps/rocksdb/rocksdb/db/c_test.c +133 -12
  30. package/deps/rocksdb/rocksdb/db/column_family.cc +114 -50
  31. package/deps/rocksdb/rocksdb/db/column_family.h +53 -36
  32. package/deps/rocksdb/rocksdb/db/column_family_test.cc +6 -6
  33. package/deps/rocksdb/rocksdb/db/compact_files_test.cc +0 -1
  34. package/deps/rocksdb/rocksdb/db/compaction/compaction.cc +95 -70
  35. package/deps/rocksdb/rocksdb/db/compaction/compaction.h +71 -51
  36. package/deps/rocksdb/rocksdb/db/compaction/compaction_iterator.cc +7 -86
  37. package/deps/rocksdb/rocksdb/db/compaction/compaction_iterator.h +26 -68
  38. package/deps/rocksdb/rocksdb/db/compaction/compaction_iterator_test.cc +0 -122
  39. package/deps/rocksdb/rocksdb/db/compaction/compaction_job.cc +453 -258
  40. package/deps/rocksdb/rocksdb/db/compaction/compaction_job.h +117 -92
  41. package/deps/rocksdb/rocksdb/db/compaction/compaction_job_stats_test.cc +0 -1
  42. package/deps/rocksdb/rocksdb/db/compaction/compaction_job_test.cc +38 -38
  43. package/deps/rocksdb/rocksdb/db/compaction/compaction_outputs.cc +24 -17
  44. package/deps/rocksdb/rocksdb/db/compaction/compaction_outputs.h +34 -45
  45. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker.cc +32 -31
  46. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker.h +12 -3
  47. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_fifo.cc +1 -1
  48. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_fifo.h +2 -1
  49. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_level.cc +10 -10
  50. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_level.h +2 -1
  51. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_test.cc +82 -34
  52. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_universal.cc +267 -179
  53. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_universal.h +4 -1
  54. package/deps/rocksdb/rocksdb/db/compaction/compaction_service_job.cc +273 -89
  55. package/deps/rocksdb/rocksdb/db/compaction/compaction_service_test.cc +300 -14
  56. package/deps/rocksdb/rocksdb/db/compaction/compaction_state.cc +4 -4
  57. package/deps/rocksdb/rocksdb/db/compaction/compaction_state.h +2 -2
  58. package/deps/rocksdb/rocksdb/db/compaction/subcompaction_state.cc +28 -23
  59. package/deps/rocksdb/rocksdb/db/compaction/subcompaction_state.h +69 -51
  60. package/deps/rocksdb/rocksdb/db/compaction/tiered_compaction_test.cc +522 -245
  61. package/deps/rocksdb/rocksdb/db/convenience.cc +15 -4
  62. package/deps/rocksdb/rocksdb/db/corruption_test.cc +1 -3
  63. package/deps/rocksdb/rocksdb/db/cuckoo_table_db_test.cc +0 -2
  64. package/deps/rocksdb/rocksdb/db/db_basic_test.cc +196 -17
  65. package/deps/rocksdb/rocksdb/db/db_block_cache_test.cc +74 -62
  66. package/deps/rocksdb/rocksdb/db/db_bloom_filter_test.cc +48 -0
  67. package/deps/rocksdb/rocksdb/db/db_compaction_test.cc +682 -250
  68. package/deps/rocksdb/rocksdb/db/db_dynamic_level_test.cc +0 -1
  69. package/deps/rocksdb/rocksdb/db/db_encryption_test.cc +3 -4
  70. package/deps/rocksdb/rocksdb/db/db_filesnapshot.cc +11 -16
  71. package/deps/rocksdb/rocksdb/db/db_flush_test.cc +57 -0
  72. package/deps/rocksdb/rocksdb/db/db_impl/compacted_db_impl.cc +2 -2
  73. package/deps/rocksdb/rocksdb/db/db_impl/compacted_db_impl.h +1 -1
  74. package/deps/rocksdb/rocksdb/db/db_impl/db_impl.cc +540 -490
  75. package/deps/rocksdb/rocksdb/db/db_impl/db_impl.h +347 -188
  76. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_compaction_flush.cc +584 -217
  77. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_debug.cc +13 -9
  78. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_experimental.cc +5 -7
  79. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_files.cc +40 -36
  80. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_follower.cc +1 -3
  81. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_open.cc +751 -372
  82. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_readonly.cc +35 -32
  83. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_readonly.h +24 -2
  84. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_secondary.cc +125 -63
  85. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_secondary.h +2 -2
  86. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_write.cc +311 -196
  87. package/deps/rocksdb/rocksdb/db/db_io_failure_test.cc +15 -5
  88. package/deps/rocksdb/rocksdb/db/db_iter.cc +42 -29
  89. package/deps/rocksdb/rocksdb/db/db_iter.h +96 -31
  90. package/deps/rocksdb/rocksdb/db/db_iter_stress_test.cc +3 -4
  91. package/deps/rocksdb/rocksdb/db/db_iter_test.cc +168 -228
  92. package/deps/rocksdb/rocksdb/db/db_iterator_test.cc +454 -0
  93. package/deps/rocksdb/rocksdb/db/db_kv_checksum_test.cc +8 -8
  94. package/deps/rocksdb/rocksdb/db/db_log_iter_test.cc +0 -1
  95. package/deps/rocksdb/rocksdb/db/db_memtable_test.cc +90 -0
  96. package/deps/rocksdb/rocksdb/db/db_merge_operand_test.cc +60 -2
  97. package/deps/rocksdb/rocksdb/db/db_merge_operator_test.cc +7 -3
  98. package/deps/rocksdb/rocksdb/db/db_options_test.cc +85 -27
  99. package/deps/rocksdb/rocksdb/db/db_properties_test.cc +3 -1
  100. package/deps/rocksdb/rocksdb/db/db_rate_limiter_test.cc +0 -2
  101. package/deps/rocksdb/rocksdb/db/db_secondary_test.cc +114 -2
  102. package/deps/rocksdb/rocksdb/db/db_sst_test.cc +0 -1
  103. package/deps/rocksdb/rocksdb/db/db_statistics_test.cc +0 -1
  104. package/deps/rocksdb/rocksdb/db/db_table_properties_test.cc +51 -3
  105. package/deps/rocksdb/rocksdb/db/db_tailing_iter_test.cc +0 -1
  106. package/deps/rocksdb/rocksdb/db/db_test.cc +325 -18
  107. package/deps/rocksdb/rocksdb/db/db_test2.cc +644 -20
  108. package/deps/rocksdb/rocksdb/db/db_test_util.cc +14 -6
  109. package/deps/rocksdb/rocksdb/db/db_test_util.h +9 -0
  110. package/deps/rocksdb/rocksdb/db/db_universal_compaction_test.cc +64 -45
  111. package/deps/rocksdb/rocksdb/db/db_wal_test.cc +203 -14
  112. package/deps/rocksdb/rocksdb/db/db_with_timestamp_basic_test.cc +259 -30
  113. package/deps/rocksdb/rocksdb/db/db_write_buffer_manager_test.cc +0 -1
  114. package/deps/rocksdb/rocksdb/db/db_write_test.cc +75 -1
  115. package/deps/rocksdb/rocksdb/db/dbformat.h +70 -6
  116. package/deps/rocksdb/rocksdb/db/deletefile_test.cc +0 -190
  117. package/deps/rocksdb/rocksdb/db/error_handler.cc +22 -7
  118. package/deps/rocksdb/rocksdb/db/error_handler.h +16 -1
  119. package/deps/rocksdb/rocksdb/db/event_helpers.cc +41 -26
  120. package/deps/rocksdb/rocksdb/db/experimental.cc +4 -3
  121. package/deps/rocksdb/rocksdb/db/external_sst_file_basic_test.cc +464 -78
  122. package/deps/rocksdb/rocksdb/db/external_sst_file_ingestion_job.cc +166 -69
  123. package/deps/rocksdb/rocksdb/db/external_sst_file_ingestion_job.h +54 -25
  124. package/deps/rocksdb/rocksdb/db/external_sst_file_test.cc +1 -3
  125. package/deps/rocksdb/rocksdb/db/flush_job.cc +98 -81
  126. package/deps/rocksdb/rocksdb/db/flush_job.h +4 -9
  127. package/deps/rocksdb/rocksdb/db/flush_job_test.cc +80 -84
  128. package/deps/rocksdb/rocksdb/db/forward_iterator.cc +1 -1
  129. package/deps/rocksdb/rocksdb/db/forward_iterator.h +2 -2
  130. package/deps/rocksdb/rocksdb/db/import_column_family_job.cc +12 -19
  131. package/deps/rocksdb/rocksdb/db/import_column_family_test.cc +0 -2
  132. package/deps/rocksdb/rocksdb/db/internal_stats.cc +41 -15
  133. package/deps/rocksdb/rocksdb/db/internal_stats.h +63 -52
  134. package/deps/rocksdb/rocksdb/db/job_context.h +59 -24
  135. package/deps/rocksdb/rocksdb/db/listener_test.cc +69 -10
  136. package/deps/rocksdb/rocksdb/db/log_format.h +11 -2
  137. package/deps/rocksdb/rocksdb/db/log_reader.cc +147 -34
  138. package/deps/rocksdb/rocksdb/db/log_reader.h +40 -11
  139. package/deps/rocksdb/rocksdb/db/log_test.cc +16 -3
  140. package/deps/rocksdb/rocksdb/db/log_writer.cc +102 -55
  141. package/deps/rocksdb/rocksdb/db/log_writer.h +21 -2
  142. package/deps/rocksdb/rocksdb/db/malloc_stats.h +0 -2
  143. package/deps/rocksdb/rocksdb/db/memtable.cc +16 -47
  144. package/deps/rocksdb/rocksdb/db/memtable.h +76 -12
  145. package/deps/rocksdb/rocksdb/db/memtable_list.cc +23 -20
  146. package/deps/rocksdb/rocksdb/db/memtable_list.h +9 -11
  147. package/deps/rocksdb/rocksdb/db/memtable_list_test.cc +18 -37
  148. package/deps/rocksdb/rocksdb/db/merge_context.h +2 -1
  149. package/deps/rocksdb/rocksdb/db/merge_test.cc +8 -0
  150. package/deps/rocksdb/rocksdb/db/obsolete_files_test.cc +3 -5
  151. package/deps/rocksdb/rocksdb/db/periodic_task_scheduler.cc +15 -7
  152. package/deps/rocksdb/rocksdb/db/periodic_task_scheduler.h +6 -3
  153. package/deps/rocksdb/rocksdb/db/periodic_task_scheduler_test.cc +22 -4
  154. package/deps/rocksdb/rocksdb/db/plain_table_db_test.cc +41 -1
  155. package/deps/rocksdb/rocksdb/db/prefix_test.cc +0 -1
  156. package/deps/rocksdb/rocksdb/db/repair.cc +29 -34
  157. package/deps/rocksdb/rocksdb/db/repair_test.cc +0 -1
  158. package/deps/rocksdb/rocksdb/db/seqno_time_test.cc +14 -15
  159. package/deps/rocksdb/rocksdb/db/seqno_to_time_mapping.cc +1 -3
  160. package/deps/rocksdb/rocksdb/db/seqno_to_time_mapping.h +47 -1
  161. package/deps/rocksdb/rocksdb/db/table_cache.cc +3 -3
  162. package/deps/rocksdb/rocksdb/db/transaction_log_impl.cc +1 -3
  163. package/deps/rocksdb/rocksdb/db/transaction_log_impl.h +2 -1
  164. package/deps/rocksdb/rocksdb/db/version_builder.cc +2 -2
  165. package/deps/rocksdb/rocksdb/db/version_edit.cc +8 -37
  166. package/deps/rocksdb/rocksdb/db/version_edit.h +32 -1
  167. package/deps/rocksdb/rocksdb/db/version_edit_handler.cc +26 -18
  168. package/deps/rocksdb/rocksdb/db/version_edit_handler.h +7 -5
  169. package/deps/rocksdb/rocksdb/db/version_set.cc +282 -197
  170. package/deps/rocksdb/rocksdb/db/version_set.h +54 -57
  171. package/deps/rocksdb/rocksdb/db/version_set_test.cc +28 -35
  172. package/deps/rocksdb/rocksdb/db/version_util.h +2 -3
  173. package/deps/rocksdb/rocksdb/db/wal_manager.cc +3 -2
  174. package/deps/rocksdb/rocksdb/db/wal_manager.h +0 -1
  175. package/deps/rocksdb/rocksdb/db/wal_manager_test.cc +0 -1
  176. package/deps/rocksdb/rocksdb/db/wide/wide_columns.cc +1 -0
  177. package/deps/rocksdb/rocksdb/db/write_batch.cc +22 -8
  178. package/deps/rocksdb/rocksdb/db/write_batch_internal.h +5 -4
  179. package/deps/rocksdb/rocksdb/db/write_batch_test.cc +7 -6
  180. package/deps/rocksdb/rocksdb/db/write_callback_test.cc +3 -4
  181. package/deps/rocksdb/rocksdb/db/write_thread.h +3 -3
  182. package/deps/rocksdb/rocksdb/db_stress_tool/cf_consistency_stress.cc +13 -5
  183. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_common.h +9 -2
  184. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_compaction_service.h +39 -0
  185. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_compression_manager.h +65 -0
  186. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_gflags.cc +45 -22
  187. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_listener.h +7 -4
  188. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_shared_state.h +22 -5
  189. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_table_properties_collector.h +28 -3
  190. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_test_base.cc +143 -38
  191. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_test_base.h +4 -3
  192. package/deps/rocksdb/rocksdb/db_stress_tool/expected_state.cc +80 -32
  193. package/deps/rocksdb/rocksdb/db_stress_tool/expected_state.h +51 -2
  194. package/deps/rocksdb/rocksdb/db_stress_tool/multi_ops_txns_stress.cc +23 -1
  195. package/deps/rocksdb/rocksdb/db_stress_tool/no_batched_ops_stress.cc +305 -15
  196. package/deps/rocksdb/rocksdb/env/env.cc +32 -2
  197. package/deps/rocksdb/rocksdb/env/env_encryption.cc +0 -2
  198. package/deps/rocksdb/rocksdb/env/env_encryption_ctr.h +2 -4
  199. package/deps/rocksdb/rocksdb/env/env_posix.cc +4 -2
  200. package/deps/rocksdb/rocksdb/env/env_test.cc +0 -1
  201. package/deps/rocksdb/rocksdb/env/fs_posix.cc +20 -11
  202. package/deps/rocksdb/rocksdb/env/fs_readonly.h +0 -2
  203. package/deps/rocksdb/rocksdb/env/fs_remap.cc +0 -2
  204. package/deps/rocksdb/rocksdb/env/fs_remap.h +0 -2
  205. package/deps/rocksdb/rocksdb/env/io_posix.cc +6 -4
  206. package/deps/rocksdb/rocksdb/env/io_posix.h +3 -2
  207. package/deps/rocksdb/rocksdb/env/mock_env.cc +0 -1
  208. package/deps/rocksdb/rocksdb/file/delete_scheduler.cc +2 -2
  209. package/deps/rocksdb/rocksdb/file/delete_scheduler.h +0 -2
  210. package/deps/rocksdb/rocksdb/file/delete_scheduler_test.cc +0 -2
  211. package/deps/rocksdb/rocksdb/file/file_prefetch_buffer.cc +30 -21
  212. package/deps/rocksdb/rocksdb/file/file_prefetch_buffer.h +16 -0
  213. package/deps/rocksdb/rocksdb/file/file_util.cc +32 -14
  214. package/deps/rocksdb/rocksdb/file/file_util.h +22 -5
  215. package/deps/rocksdb/rocksdb/file/prefetch_test.cc +229 -76
  216. package/deps/rocksdb/rocksdb/file/random_access_file_reader.cc +21 -12
  217. package/deps/rocksdb/rocksdb/file/random_access_file_reader.h +10 -7
  218. package/deps/rocksdb/rocksdb/file/random_access_file_reader_test.cc +12 -8
  219. package/deps/rocksdb/rocksdb/file/sst_file_manager_impl.cc +1 -2
  220. package/deps/rocksdb/rocksdb/file/sst_file_manager_impl.h +0 -2
  221. package/deps/rocksdb/rocksdb/file/writable_file_writer.cc +3 -3
  222. package/deps/rocksdb/rocksdb/include/rocksdb/advanced_compression.h +598 -0
  223. package/deps/rocksdb/rocksdb/include/rocksdb/advanced_iterator.h +36 -0
  224. package/deps/rocksdb/rocksdb/include/rocksdb/advanced_options.h +70 -11
  225. package/deps/rocksdb/rocksdb/include/rocksdb/c.h +232 -11
  226. package/deps/rocksdb/rocksdb/include/rocksdb/cache.h +1 -1
  227. package/deps/rocksdb/rocksdb/include/rocksdb/compaction_job_stats.h +3 -1
  228. package/deps/rocksdb/rocksdb/include/rocksdb/compression_type.h +149 -15
  229. package/deps/rocksdb/rocksdb/include/rocksdb/convenience.h +17 -2
  230. package/deps/rocksdb/rocksdb/include/rocksdb/data_structure.h +132 -34
  231. package/deps/rocksdb/rocksdb/include/rocksdb/db.h +158 -79
  232. package/deps/rocksdb/rocksdb/include/rocksdb/db_bench_tool.h +2 -1
  233. package/deps/rocksdb/rocksdb/include/rocksdb/env.h +4 -5
  234. package/deps/rocksdb/rocksdb/include/rocksdb/env_encryption.h +1 -3
  235. package/deps/rocksdb/rocksdb/include/rocksdb/experimental.h +5 -0
  236. package/deps/rocksdb/rocksdb/include/rocksdb/external_table.h +275 -0
  237. package/deps/rocksdb/rocksdb/include/rocksdb/file_checksum.h +2 -1
  238. package/deps/rocksdb/rocksdb/include/rocksdb/file_system.h +50 -5
  239. package/deps/rocksdb/rocksdb/include/rocksdb/iostats_context.h +10 -0
  240. package/deps/rocksdb/rocksdb/include/rocksdb/iterator.h +13 -0
  241. package/deps/rocksdb/rocksdb/include/rocksdb/ldb_tool.h +0 -1
  242. package/deps/rocksdb/rocksdb/include/rocksdb/listener.h +5 -2
  243. package/deps/rocksdb/rocksdb/include/rocksdb/memtablerep.h +13 -0
  244. package/deps/rocksdb/rocksdb/include/rocksdb/multi_scan.h +237 -0
  245. package/deps/rocksdb/rocksdb/include/rocksdb/options.h +230 -39
  246. package/deps/rocksdb/rocksdb/include/rocksdb/perf_context.h +15 -0
  247. package/deps/rocksdb/rocksdb/include/rocksdb/perf_level.h +31 -11
  248. package/deps/rocksdb/rocksdb/include/rocksdb/slice.h +41 -0
  249. package/deps/rocksdb/rocksdb/include/rocksdb/slice_transform.h +1 -1
  250. package/deps/rocksdb/rocksdb/include/rocksdb/sst_dump_tool.h +0 -1
  251. package/deps/rocksdb/rocksdb/include/rocksdb/sst_file_reader.h +5 -1
  252. package/deps/rocksdb/rocksdb/include/rocksdb/sst_file_writer.h +0 -1
  253. package/deps/rocksdb/rocksdb/include/rocksdb/statistics.h +18 -3
  254. package/deps/rocksdb/rocksdb/include/rocksdb/status.h +2 -0
  255. package/deps/rocksdb/rocksdb/include/rocksdb/table.h +20 -8
  256. package/deps/rocksdb/rocksdb/include/rocksdb/table_properties.h +19 -2
  257. package/deps/rocksdb/rocksdb/include/rocksdb/thread_status.h +1 -1
  258. package/deps/rocksdb/rocksdb/include/rocksdb/tool_hooks.h +124 -0
  259. package/deps/rocksdb/rocksdb/include/rocksdb/trace_record.h +1 -0
  260. package/deps/rocksdb/rocksdb/include/rocksdb/universal_compaction.h +26 -1
  261. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/backup_engine.h +55 -6
  262. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/debug.h +3 -5
  263. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/env_mirror.h +0 -2
  264. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/ldb_cmd.h +1 -2
  265. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/memory_util.h +0 -1
  266. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/object_registry.h +1 -2
  267. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/options_util.h +0 -1
  268. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/secondary_index.h +96 -8
  269. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/secondary_index_faiss.h +117 -0
  270. package/deps/rocksdb/rocksdb/{utilities/secondary_index/faiss_ivf_index.h → include/rocksdb/utilities/secondary_index_simple.h} +11 -14
  271. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/stackable_db.h +26 -11
  272. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/table_properties_collectors.h +16 -3
  273. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/transaction.h +0 -2
  274. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/transaction_db.h +63 -7
  275. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/transaction_db_mutex.h +0 -1
  276. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/write_batch_with_index.h +28 -12
  277. package/deps/rocksdb/rocksdb/include/rocksdb/version.h +3 -3
  278. package/deps/rocksdb/rocksdb/logging/auto_roll_logger_test.cc +0 -2
  279. package/deps/rocksdb/rocksdb/logging/event_logger_test.cc +1 -2
  280. package/deps/rocksdb/rocksdb/memory/memory_allocator_impl.h +1 -1
  281. package/deps/rocksdb/rocksdb/memory/memory_allocator_test.cc +0 -1
  282. package/deps/rocksdb/rocksdb/memtable/hash_linklist_rep.cc +0 -1
  283. package/deps/rocksdb/rocksdb/memtable/memtablerep_bench.cc +3 -1
  284. package/deps/rocksdb/rocksdb/memtable/skiplist.h +2 -2
  285. package/deps/rocksdb/rocksdb/memtable/skiplistrep.cc +2 -4
  286. package/deps/rocksdb/rocksdb/memtable/vectorrep.cc +69 -8
  287. package/deps/rocksdb/rocksdb/memtable/wbwi_memtable.cc +32 -9
  288. package/deps/rocksdb/rocksdb/memtable/wbwi_memtable.h +58 -45
  289. package/deps/rocksdb/rocksdb/monitoring/histogram.h +1 -1
  290. package/deps/rocksdb/rocksdb/monitoring/perf_context.cc +5 -3
  291. package/deps/rocksdb/rocksdb/monitoring/statistics.cc +5 -0
  292. package/deps/rocksdb/rocksdb/monitoring/stats_history_test.cc +1 -1
  293. package/deps/rocksdb/rocksdb/monitoring/thread_status_util_debug.cc +3 -2
  294. package/deps/rocksdb/rocksdb/options/cf_options.cc +44 -13
  295. package/deps/rocksdb/rocksdb/options/cf_options.h +21 -7
  296. package/deps/rocksdb/rocksdb/options/configurable.cc +5 -5
  297. package/deps/rocksdb/rocksdb/options/configurable_test.h +1 -2
  298. package/deps/rocksdb/rocksdb/options/customizable.cc +0 -1
  299. package/deps/rocksdb/rocksdb/options/customizable_test.cc +4 -11
  300. package/deps/rocksdb/rocksdb/options/db_options.cc +18 -15
  301. package/deps/rocksdb/rocksdb/options/db_options.h +2 -2
  302. package/deps/rocksdb/rocksdb/options/options.cc +296 -305
  303. package/deps/rocksdb/rocksdb/options/options_helper.cc +188 -62
  304. package/deps/rocksdb/rocksdb/options/options_helper.h +3 -3
  305. package/deps/rocksdb/rocksdb/options/options_parser.cc +2 -4
  306. package/deps/rocksdb/rocksdb/options/options_parser.h +0 -1
  307. package/deps/rocksdb/rocksdb/options/options_settable_test.cc +17 -4
  308. package/deps/rocksdb/rocksdb/options/options_test.cc +101 -76
  309. package/deps/rocksdb/rocksdb/port/lang.h +2 -1
  310. package/deps/rocksdb/rocksdb/port/port_posix.cc +2 -1
  311. package/deps/rocksdb/rocksdb/port/stack_trace.cc +5 -4
  312. package/deps/rocksdb/rocksdb/port/win/env_win.cc +3 -2
  313. package/deps/rocksdb/rocksdb/port/win/xpress_win.cc +99 -1
  314. package/deps/rocksdb/rocksdb/port/win/xpress_win.h +6 -0
  315. package/deps/rocksdb/rocksdb/src.mk +17 -11
  316. package/deps/rocksdb/rocksdb/table/adaptive/adaptive_table_factory.h +0 -1
  317. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_builder.cc +1094 -929
  318. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_builder.h +6 -19
  319. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_factory.cc +76 -22
  320. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_factory.h +2 -0
  321. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader.cc +221 -131
  322. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader.h +12 -9
  323. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader_impl.h +23 -24
  324. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader_sync_and_async.h +38 -38
  325. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader_test.cc +7 -4
  326. package/deps/rocksdb/rocksdb/table/block_based/block_cache.cc +5 -5
  327. package/deps/rocksdb/rocksdb/table/block_based/block_cache.h +10 -12
  328. package/deps/rocksdb/rocksdb/table/block_based/block_prefetcher.cc +6 -4
  329. package/deps/rocksdb/rocksdb/table/block_based/block_test.cc +35 -43
  330. package/deps/rocksdb/rocksdb/table/block_based/data_block_hash_index_test.cc +2 -1
  331. package/deps/rocksdb/rocksdb/table/block_based/filter_block.h +1 -1
  332. package/deps/rocksdb/rocksdb/table/block_based/filter_block_reader_common.cc +1 -2
  333. package/deps/rocksdb/rocksdb/table/block_based/filter_policy.cc +0 -4
  334. package/deps/rocksdb/rocksdb/table/block_based/filter_policy_internal.h +0 -1
  335. package/deps/rocksdb/rocksdb/table/block_based/hash_index_reader.cc +3 -3
  336. package/deps/rocksdb/rocksdb/table/block_based/index_reader_common.cc +3 -3
  337. package/deps/rocksdb/rocksdb/table/block_based/partitioned_filter_block.cc +4 -4
  338. package/deps/rocksdb/rocksdb/table/block_based/partitioned_index_reader.cc +1 -1
  339. package/deps/rocksdb/rocksdb/table/block_based/uncompression_dict_reader.cc +4 -5
  340. package/deps/rocksdb/rocksdb/table/block_based/uncompression_dict_reader.h +4 -4
  341. package/deps/rocksdb/rocksdb/table/block_fetcher.cc +37 -35
  342. package/deps/rocksdb/rocksdb/table/block_fetcher.h +11 -7
  343. package/deps/rocksdb/rocksdb/table/block_fetcher_test.cc +4 -3
  344. package/deps/rocksdb/rocksdb/table/compaction_merging_iterator.cc +31 -5
  345. package/deps/rocksdb/rocksdb/table/compaction_merging_iterator.h +2 -1
  346. package/deps/rocksdb/rocksdb/table/cuckoo/cuckoo_table_builder.h +0 -1
  347. package/deps/rocksdb/rocksdb/table/cuckoo/cuckoo_table_builder_test.cc +0 -1
  348. package/deps/rocksdb/rocksdb/table/cuckoo/cuckoo_table_reader_test.cc +0 -1
  349. package/deps/rocksdb/rocksdb/table/external_table.cc +483 -0
  350. package/deps/rocksdb/rocksdb/table/format.cc +62 -44
  351. package/deps/rocksdb/rocksdb/table/format.h +35 -12
  352. package/deps/rocksdb/rocksdb/table/internal_iterator.h +3 -13
  353. package/deps/rocksdb/rocksdb/table/iterator_wrapper.h +8 -0
  354. package/deps/rocksdb/rocksdb/table/merging_iterator.cc +6 -0
  355. package/deps/rocksdb/rocksdb/table/meta_blocks.cc +150 -141
  356. package/deps/rocksdb/rocksdb/table/meta_blocks.h +5 -0
  357. package/deps/rocksdb/rocksdb/table/multiget_context.h +3 -2
  358. package/deps/rocksdb/rocksdb/table/plain/plain_table_builder.cc +8 -0
  359. package/deps/rocksdb/rocksdb/table/plain/plain_table_index.cc +0 -1
  360. package/deps/rocksdb/rocksdb/table/plain/plain_table_index.h +0 -2
  361. package/deps/rocksdb/rocksdb/table/plain/plain_table_key_coding.h +0 -2
  362. package/deps/rocksdb/rocksdb/table/plain/plain_table_reader.cc +0 -1
  363. package/deps/rocksdb/rocksdb/table/sst_file_dumper.cc +6 -6
  364. package/deps/rocksdb/rocksdb/table/sst_file_dumper.h +0 -1
  365. package/deps/rocksdb/rocksdb/table/sst_file_reader.cc +86 -7
  366. package/deps/rocksdb/rocksdb/table/sst_file_reader_test.cc +88 -2
  367. package/deps/rocksdb/rocksdb/table/sst_file_writer.cc +0 -1
  368. package/deps/rocksdb/rocksdb/table/table_builder.h +10 -1
  369. package/deps/rocksdb/rocksdb/table/table_reader_bench.cc +3 -2
  370. package/deps/rocksdb/rocksdb/table/table_test.cc +899 -22
  371. package/deps/rocksdb/rocksdb/test_util/testutil.cc +3 -4
  372. package/deps/rocksdb/rocksdb/test_util/testutil.h +132 -1
  373. package/deps/rocksdb/rocksdb/test_util/transaction_test_util.cc +0 -1
  374. package/deps/rocksdb/rocksdb/test_util/transaction_test_util.h +0 -2
  375. package/deps/rocksdb/rocksdb/tools/db_bench_tool.cc +163 -77
  376. package/deps/rocksdb/rocksdb/tools/db_bench_tool_test.cc +0 -2
  377. package/deps/rocksdb/rocksdb/tools/db_repl_stress.cc +0 -1
  378. package/deps/rocksdb/rocksdb/tools/dump/db_dump_tool.cc +0 -1
  379. package/deps/rocksdb/rocksdb/tools/ldb_cmd.cc +120 -52
  380. package/deps/rocksdb/rocksdb/tools/ldb_cmd_test.cc +1 -0
  381. package/deps/rocksdb/rocksdb/tools/ldb_tool.cc +1 -1
  382. package/deps/rocksdb/rocksdb/tools/reduce_levels_test.cc +0 -2
  383. package/deps/rocksdb/rocksdb/tools/simulated_hybrid_file_system.cc +2 -2
  384. package/deps/rocksdb/rocksdb/tools/simulated_hybrid_file_system.h +0 -2
  385. package/deps/rocksdb/rocksdb/tools/sst_dump_tool.cc +2 -1
  386. package/deps/rocksdb/rocksdb/tools/tool_hooks.cc +94 -0
  387. package/deps/rocksdb/rocksdb/tools/trace_analyzer_tool.cc +0 -1
  388. package/deps/rocksdb/rocksdb/tools/trace_analyzer_tool.h +0 -1
  389. package/deps/rocksdb/rocksdb/trace_replay/io_tracer.cc +1 -1
  390. package/deps/rocksdb/rocksdb/trace_replay/io_tracer_test.cc +2 -1
  391. package/deps/rocksdb/rocksdb/trace_replay/trace_replay.cc +3 -5
  392. package/deps/rocksdb/rocksdb/util/async_file_reader.cc +1 -1
  393. package/deps/rocksdb/rocksdb/util/async_file_reader.h +15 -8
  394. package/deps/rocksdb/rocksdb/util/auto_skip_compressor.cc +131 -0
  395. package/deps/rocksdb/rocksdb/util/auto_skip_compressor.h +90 -0
  396. package/deps/rocksdb/rocksdb/util/autovector.h +1 -1
  397. package/deps/rocksdb/rocksdb/util/autovector_test.cc +2 -2
  398. package/deps/rocksdb/rocksdb/util/compaction_job_stats_impl.cc +0 -2
  399. package/deps/rocksdb/rocksdb/util/compression.cc +936 -4
  400. package/deps/rocksdb/rocksdb/util/compression.h +348 -232
  401. package/deps/rocksdb/rocksdb/util/compression_test.cc +229 -0
  402. package/deps/rocksdb/rocksdb/util/crc32c_arm64.cc +10 -10
  403. package/deps/rocksdb/rocksdb/util/crc32c_ppc.c +1 -0
  404. package/deps/rocksdb/rocksdb/util/data_structure.cc +2 -0
  405. package/deps/rocksdb/rocksdb/util/file_reader_writer_test.cc +1 -3
  406. package/deps/rocksdb/rocksdb/util/ppc-opcode.h +5 -5
  407. package/deps/rocksdb/rocksdb/util/simple_mixed_compressor.cc +108 -0
  408. package/deps/rocksdb/rocksdb/util/simple_mixed_compressor.h +67 -0
  409. package/deps/rocksdb/rocksdb/util/slice_test.cc +83 -0
  410. package/deps/rocksdb/rocksdb/util/string_util.cc +0 -2
  411. package/deps/rocksdb/rocksdb/util/string_util.h +10 -0
  412. package/deps/rocksdb/rocksdb/util/thread_operation.h +2 -1
  413. package/deps/rocksdb/rocksdb/util/udt_util.cc +18 -5
  414. package/deps/rocksdb/rocksdb/util/udt_util.h +10 -7
  415. package/deps/rocksdb/rocksdb/utilities/backup/backup_engine.cc +650 -154
  416. package/deps/rocksdb/rocksdb/utilities/backup/backup_engine_test.cc +438 -144
  417. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_compaction_filter.cc +0 -1
  418. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db.h +0 -1
  419. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db_gc_stats.h +0 -1
  420. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db_impl.cc +16 -17
  421. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db_impl.h +2 -1
  422. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db_impl_filesnapshot.cc +0 -1
  423. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db_listener.h +0 -1
  424. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db_test.cc +7 -8
  425. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_dump_tool.cc +4 -3
  426. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_dump_tool.h +0 -1
  427. package/deps/rocksdb/rocksdb/utilities/cache_dump_load.cc +0 -1
  428. package/deps/rocksdb/rocksdb/utilities/cache_dump_load_impl.cc +2 -2
  429. package/deps/rocksdb/rocksdb/utilities/checkpoint/checkpoint_impl.cc +1 -1
  430. package/deps/rocksdb/rocksdb/utilities/checkpoint/checkpoint_test.cc +0 -48
  431. package/deps/rocksdb/rocksdb/utilities/compaction_filters/remove_emptyvalue_compactionfilter.cc +0 -1
  432. package/deps/rocksdb/rocksdb/utilities/compaction_filters/remove_emptyvalue_compactionfilter.h +0 -1
  433. package/deps/rocksdb/rocksdb/utilities/debug.cc +7 -14
  434. package/deps/rocksdb/rocksdb/utilities/env_mirror.cc +0 -1
  435. package/deps/rocksdb/rocksdb/utilities/env_mirror_test.cc +0 -2
  436. package/deps/rocksdb/rocksdb/utilities/env_timed.cc +0 -1
  437. package/deps/rocksdb/rocksdb/utilities/env_timed_test.cc +0 -2
  438. package/deps/rocksdb/rocksdb/utilities/fault_injection_fs.cc +5 -3
  439. package/deps/rocksdb/rocksdb/utilities/fault_injection_fs.h +10 -9
  440. package/deps/rocksdb/rocksdb/utilities/memory/memory_test.cc +0 -1
  441. package/deps/rocksdb/rocksdb/utilities/memory/memory_util.cc +0 -1
  442. package/deps/rocksdb/rocksdb/utilities/memory_allocators.h +1 -0
  443. package/deps/rocksdb/rocksdb/utilities/object_registry_test.cc +0 -2
  444. package/deps/rocksdb/rocksdb/utilities/options/options_util.cc +0 -1
  445. package/deps/rocksdb/rocksdb/utilities/options/options_util_test.cc +0 -1
  446. package/deps/rocksdb/rocksdb/utilities/persistent_cache/block_cache_tier.cc +0 -1
  447. package/deps/rocksdb/rocksdb/utilities/persistent_cache/block_cache_tier.h +0 -2
  448. package/deps/rocksdb/rocksdb/utilities/persistent_cache/block_cache_tier_file.h +0 -2
  449. package/deps/rocksdb/rocksdb/utilities/persistent_cache/block_cache_tier_metadata.cc +0 -1
  450. package/deps/rocksdb/rocksdb/utilities/persistent_cache/block_cache_tier_metadata.h +0 -2
  451. package/deps/rocksdb/rocksdb/utilities/persistent_cache/hash_table.h +0 -2
  452. package/deps/rocksdb/rocksdb/utilities/persistent_cache/hash_table_evictable.h +0 -2
  453. package/deps/rocksdb/rocksdb/utilities/persistent_cache/lrulist.h +0 -2
  454. package/deps/rocksdb/rocksdb/utilities/persistent_cache/persistent_cache_test.h +0 -2
  455. package/deps/rocksdb/rocksdb/utilities/persistent_cache/persistent_cache_tier.cc +0 -1
  456. package/deps/rocksdb/rocksdb/utilities/persistent_cache/persistent_cache_tier.h +0 -2
  457. package/deps/rocksdb/rocksdb/utilities/persistent_cache/volatile_tier_impl.cc +0 -1
  458. package/deps/rocksdb/rocksdb/utilities/persistent_cache/volatile_tier_impl.h +0 -2
  459. package/deps/rocksdb/rocksdb/utilities/secondary_index/faiss_ivf_index.cc +183 -32
  460. package/deps/rocksdb/rocksdb/utilities/secondary_index/faiss_ivf_index_test.cc +258 -12
  461. package/deps/rocksdb/rocksdb/utilities/secondary_index/secondary_index_helper.h +33 -0
  462. package/deps/rocksdb/rocksdb/utilities/secondary_index/secondary_index_iterator.cc +99 -0
  463. package/deps/rocksdb/rocksdb/utilities/secondary_index/secondary_index_mixin.h +280 -120
  464. package/deps/rocksdb/rocksdb/utilities/secondary_index/simple_secondary_index.cc +79 -0
  465. package/deps/rocksdb/rocksdb/utilities/table_properties_collectors/compact_on_deletion_collector.cc +52 -16
  466. package/deps/rocksdb/rocksdb/utilities/table_properties_collectors/compact_on_deletion_collector.h +10 -6
  467. package/deps/rocksdb/rocksdb/utilities/table_properties_collectors/compact_on_deletion_collector_test.cc +55 -0
  468. package/deps/rocksdb/rocksdb/utilities/trace/replayer_impl.cc +0 -1
  469. package/deps/rocksdb/rocksdb/utilities/transactions/lock/lock_manager.cc +0 -2
  470. package/deps/rocksdb/rocksdb/utilities/transactions/lock/lock_manager.h +0 -1
  471. package/deps/rocksdb/rocksdb/utilities/transactions/lock/point/point_lock_manager.cc +37 -12
  472. package/deps/rocksdb/rocksdb/utilities/transactions/lock/point/point_lock_manager.h +2 -0
  473. package/deps/rocksdb/rocksdb/utilities/transactions/lock/point/point_lock_manager_test.cc +0 -2
  474. package/deps/rocksdb/rocksdb/utilities/transactions/lock/point/point_lock_tracker.cc +0 -2
  475. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_locking_test.cc +1 -1
  476. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/db.h +1 -1
  477. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/portability/toku_time.h +1 -1
  478. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/util/dbt.cc +2 -1
  479. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/range_tree_lock_manager.cc +2 -2
  480. package/deps/rocksdb/rocksdb/utilities/transactions/optimistic_transaction.cc +0 -1
  481. package/deps/rocksdb/rocksdb/utilities/transactions/optimistic_transaction.h +0 -2
  482. package/deps/rocksdb/rocksdb/utilities/transactions/optimistic_transaction_db_impl.cc +1 -3
  483. package/deps/rocksdb/rocksdb/utilities/transactions/pessimistic_transaction.cc +36 -10
  484. package/deps/rocksdb/rocksdb/utilities/transactions/pessimistic_transaction.h +5 -7
  485. package/deps/rocksdb/rocksdb/utilities/transactions/pessimistic_transaction_db.cc +4 -5
  486. package/deps/rocksdb/rocksdb/utilities/transactions/snapshot_checker.cc +1 -4
  487. package/deps/rocksdb/rocksdb/utilities/transactions/transaction_base.h +1 -2
  488. package/deps/rocksdb/rocksdb/utilities/transactions/transaction_db_mutex_impl.cc +0 -2
  489. package/deps/rocksdb/rocksdb/utilities/transactions/transaction_db_mutex_impl.h +0 -1
  490. package/deps/rocksdb/rocksdb/utilities/transactions/transaction_test.cc +1118 -37
  491. package/deps/rocksdb/rocksdb/utilities/transactions/transaction_test.h +4 -7
  492. package/deps/rocksdb/rocksdb/utilities/transactions/transaction_util.cc +0 -2
  493. package/deps/rocksdb/rocksdb/utilities/transactions/transaction_util.h +0 -2
  494. package/deps/rocksdb/rocksdb/utilities/transactions/write_prepared_transaction_test.cc +3 -3
  495. package/deps/rocksdb/rocksdb/utilities/transactions/write_prepared_txn_db.cc +0 -1
  496. package/deps/rocksdb/rocksdb/utilities/transactions/write_unprepared_transaction_test.cc +0 -2
  497. package/deps/rocksdb/rocksdb/utilities/transactions/write_unprepared_txn.cc +1 -2
  498. package/deps/rocksdb/rocksdb/utilities/transactions/write_unprepared_txn.h +1 -2
  499. package/deps/rocksdb/rocksdb/utilities/transactions/write_unprepared_txn_db.cc +0 -1
  500. package/deps/rocksdb/rocksdb/utilities/ttl/ttl_test.cc +0 -3
  501. package/deps/rocksdb/rocksdb/utilities/write_batch_with_index/write_batch_with_index.cc +125 -127
  502. package/deps/rocksdb/rocksdb/utilities/write_batch_with_index/write_batch_with_index_internal.cc +45 -23
  503. package/deps/rocksdb/rocksdb/utilities/write_batch_with_index/write_batch_with_index_internal.h +54 -22
  504. package/deps/rocksdb/rocksdb/utilities/write_batch_with_index/write_batch_with_index_test.cc +477 -58
  505. package/deps/rocksdb/rocksdb.gyp +9 -4
  506. package/index.js +50 -9
  507. package/package.json +8 -1
  508. package/prebuilds/darwin-arm64/@nxtedition+rocksdb.node +0 -0
  509. package/prebuilds/linux-x64/@nxtedition+rocksdb.node +0 -0
@@ -14,6 +14,7 @@
14
14
  #include <algorithm>
15
15
  #include <cstddef>
16
16
  #include <cstdio>
17
+ #include <iomanip>
17
18
  #include <iostream>
18
19
  #include <map>
19
20
  #include <memory>
@@ -36,6 +37,7 @@
36
37
  #include "rocksdb/convenience.h"
37
38
  #include "rocksdb/db.h"
38
39
  #include "rocksdb/env.h"
40
+ #include "rocksdb/external_table.h"
39
41
  #include "rocksdb/file_checksum.h"
40
42
  #include "rocksdb/file_system.h"
41
43
  #include "rocksdb/filter_policy.h"
@@ -44,6 +46,7 @@
44
46
  #include "rocksdb/options.h"
45
47
  #include "rocksdb/perf_context.h"
46
48
  #include "rocksdb/slice_transform.h"
49
+ #include "rocksdb/sst_file_reader.h"
47
50
  #include "rocksdb/statistics.h"
48
51
  #include "rocksdb/table_properties.h"
49
52
  #include "rocksdb/trace_record.h"
@@ -441,7 +444,8 @@ class TableConstructor : public Constructor {
441
444
 
442
445
  file_reader_.reset(new RandomAccessFileReader(std::move(source), "test"));
443
446
  return moptions.table_factory->NewTableReader(
444
- TableReaderOptions(ioptions, moptions.prefix_extractor, soptions,
447
+ TableReaderOptions(ioptions, moptions.prefix_extractor,
448
+ moptions.compression_manager.get(), soptions,
445
449
  *last_internal_comparator_,
446
450
  0 /* block_protection_bytes_per_key */,
447
451
  /*skip_filters*/ false,
@@ -1791,18 +1795,23 @@ TEST_P(BlockBasedTableTest, IndexUncompressed) {
1791
1795
  #endif // SNAPPY
1792
1796
 
1793
1797
  TEST_P(BlockBasedTableTest, BlockBasedTableProperties2) {
1794
- TableConstructor c(&reverse_key_comparator);
1798
+ TableConstructor c(&reverse_key_comparator,
1799
+ true /* convert_to_internal_key_ */);
1795
1800
  std::vector<std::string> keys;
1796
1801
  stl_wrappers::KVMap kvmap;
1797
1802
 
1798
- {
1803
+ for (CompressionType ct : {kNoCompression, kSnappyCompression}) {
1804
+ if (!Snappy_Supported() && ct == kSnappyCompression) {
1805
+ continue;
1806
+ }
1799
1807
  Options options;
1800
- options.compression = CompressionType::kNoCompression;
1808
+ options.compression = ct;
1801
1809
  BlockBasedTableOptions table_options = GetBlockBasedTableOptions();
1802
1810
  options.table_factory.reset(NewBlockBasedTableFactory(table_options));
1803
1811
 
1804
1812
  const ImmutableOptions ioptions(options);
1805
1813
  const MutableCFOptions moptions(options);
1814
+ c.Add("blah", std::string(200, 'x')); // something to compress
1806
1815
  c.Finish(options, ioptions, moptions, table_options,
1807
1816
  GetPlainInternalComparator(options.comparator), &keys, &kvmap);
1808
1817
 
@@ -1819,7 +1828,13 @@ TEST_P(BlockBasedTableTest, BlockBasedTableProperties2) {
1819
1828
  // No filter policy is used
1820
1829
  ASSERT_EQ("", props.filter_policy_name);
1821
1830
  // Compression type == that set:
1822
- ASSERT_EQ("NoCompression", props.compression_name);
1831
+ if (FormatVersionUsesCompressionManagerName(table_options.format_version)) {
1832
+ ASSERT_EQ(ct == kNoCompression ? ";;" : "BuiltinV2;01;",
1833
+ props.compression_name);
1834
+ } else {
1835
+ ASSERT_EQ(ct == kNoCompression ? "NoCompression" : "Snappy",
1836
+ props.compression_name);
1837
+ }
1823
1838
  c.ResetTableReader();
1824
1839
  }
1825
1840
 
@@ -4726,13 +4741,18 @@ static void DoCompressionTest(CompressionType comp) {
4726
4741
  const ImmutableOptions ioptions(options);
4727
4742
  const MutableCFOptions moptions(options);
4728
4743
  c.Finish(options, ioptions, moptions, table_options, ikc, &keys, &kvmap);
4744
+ size_t file_size = c.TEST_GetSink()->contents().size();
4745
+ EXPECT_EQ(c.ApproximateOffsetOf("abc"), 0);
4746
+ EXPECT_EQ(c.ApproximateOffsetOf("k01"), 0);
4747
+ EXPECT_EQ(c.ApproximateOffsetOf("k02"), 0);
4748
+ EXPECT_NEAR2(c.ApproximateOffsetOf("k03"), file_size / 2, file_size / 10);
4749
+ EXPECT_NEAR2(c.ApproximateOffsetOf("k04"), file_size / 2, file_size / 10);
4750
+ EXPECT_NEAR2(c.ApproximateOffsetOf("xyz"), file_size, file_size / 10);
4751
+
4752
+ size_t data_blocks_size = c.GetTableReader()->GetTableProperties()->data_size;
4753
+ // Near expected compressed size ~= (0.25 + 0.25) * 10000
4754
+ EXPECT_NEAR2(data_blocks_size, 5000, 1500);
4729
4755
 
4730
- ASSERT_TRUE(Between(c.ApproximateOffsetOf("abc"), 0, 0));
4731
- ASSERT_TRUE(Between(c.ApproximateOffsetOf("k01"), 0, 0));
4732
- ASSERT_TRUE(Between(c.ApproximateOffsetOf("k02"), 0, 0));
4733
- ASSERT_TRUE(Between(c.ApproximateOffsetOf("k03"), 2000, 3555));
4734
- ASSERT_TRUE(Between(c.ApproximateOffsetOf("k04"), 2000, 3555));
4735
- ASSERT_TRUE(Between(c.ApproximateOffsetOf("xyz"), 4000, 7110));
4736
4756
  c.ResetTableReader();
4737
4757
  }
4738
4758
 
@@ -5324,7 +5344,8 @@ TEST_P(BlockBasedTableTest, DISABLED_TableWithGlobalSeqno) {
5324
5344
  new RandomAccessFileReader(std::move(source), ""));
5325
5345
 
5326
5346
  options.table_factory->NewTableReader(
5327
- TableReaderOptions(ioptions, moptions.prefix_extractor, EnvOptions(),
5347
+ TableReaderOptions(ioptions, moptions.prefix_extractor,
5348
+ moptions.compression_manager.get(), EnvOptions(),
5328
5349
  ikc, 0 /* block_protection_bytes_per_key */),
5329
5350
  std::move(file_reader), ss_rw.contents().size(), &table_reader);
5330
5351
 
@@ -5499,7 +5520,8 @@ TEST_P(BlockBasedTableTest, BlockAlignTest) {
5499
5520
  const MutableCFOptions moptions2(options2);
5500
5521
 
5501
5522
  ASSERT_OK(moptions.table_factory->NewTableReader(
5502
- TableReaderOptions(ioptions2, moptions2.prefix_extractor, EnvOptions(),
5523
+ TableReaderOptions(ioptions2, moptions2.prefix_extractor,
5524
+ moptions2.compression_manager.get(), EnvOptions(),
5503
5525
  GetPlainInternalComparator(options2.comparator),
5504
5526
  0 /* block_protection_bytes_per_key */),
5505
5527
  std::move(file_reader), sink->contents().size(), &table_reader));
@@ -5673,11 +5695,13 @@ TEST_P(BlockBasedTableTest, PropertiesBlockRestartPointTest) {
5673
5695
  read_options_for_helper.verify_checksums = false;
5674
5696
  PersistentCacheOptions cache_options;
5675
5697
 
5676
- BlockFetcher block_fetcher(
5677
- file, nullptr /* prefetch_buffer */, footer, read_options_for_helper,
5678
- handle, contents, ioptions, false /* decompress */,
5679
- false /*maybe_compressed*/, block_type,
5680
- UncompressionDict::GetEmptyDict(), cache_options);
5698
+ auto mgr = GetBuiltinCompressionManager(
5699
+ GetCompressFormatForVersion(footer.format_version()));
5700
+ BlockFetcher block_fetcher(file, nullptr /* prefetch_buffer */, footer,
5701
+ read_options_for_helper, handle, contents,
5702
+ ioptions, false /* decompress */,
5703
+ false /*maybe_compressed*/, block_type,
5704
+ mgr->GetDecompressor().get(), cache_options);
5681
5705
 
5682
5706
  ASSERT_OK(block_fetcher.ReadBlockContents());
5683
5707
  };
@@ -5810,12 +5834,13 @@ TEST_P(BlockBasedTableTest, PropertiesMetaBlockLast) {
5810
5834
  auto metaindex_handle = footer.metaindex_handle();
5811
5835
  BlockContents metaindex_contents;
5812
5836
  PersistentCacheOptions pcache_opts;
5837
+ auto mgr = GetBuiltinCompressionManager(
5838
+ GetCompressFormatForVersion(footer.format_version()));
5813
5839
  BlockFetcher block_fetcher(
5814
5840
  table_reader.get(), nullptr /* prefetch_buffer */, footer, ReadOptions(),
5815
5841
  metaindex_handle, &metaindex_contents, ioptions, false /* decompress */,
5816
5842
  false /*maybe_compressed*/, BlockType::kMetaIndex,
5817
- UncompressionDict::GetEmptyDict(), pcache_opts,
5818
- nullptr /*memory_allocator*/);
5843
+ mgr->GetDecompressor().get(), pcache_opts, nullptr /*memory_allocator*/);
5819
5844
  ASSERT_OK(block_fetcher.ReadBlockContents());
5820
5845
  Block metaindex_block(std::move(metaindex_contents));
5821
5846
 
@@ -5892,12 +5917,13 @@ TEST_P(BlockBasedTableTest, SeekMetaBlocks) {
5892
5917
  auto metaindex_handle = footer.metaindex_handle();
5893
5918
  BlockContents metaindex_contents;
5894
5919
  PersistentCacheOptions pcache_opts;
5920
+ auto mgr = GetBuiltinCompressionManager(
5921
+ GetCompressFormatForVersion(footer.format_version()));
5895
5922
  BlockFetcher block_fetcher(
5896
5923
  table_reader.get(), nullptr /* prefetch_buffer */, footer, ReadOptions(),
5897
5924
  metaindex_handle, &metaindex_contents, ioptions, false /* decompress */,
5898
5925
  false /*maybe_compressed*/, BlockType::kMetaIndex,
5899
- UncompressionDict::GetEmptyDict(), pcache_opts,
5900
- nullptr /*memory_allocator*/);
5926
+ mgr->GetDecompressor().get(), pcache_opts, nullptr /*memory_allocator*/);
5901
5927
  ASSERT_OK(block_fetcher.ReadBlockContents());
5902
5928
  Block metaindex_block(std::move(metaindex_contents));
5903
5929
 
@@ -6522,9 +6548,860 @@ TEST_F(CacheUsageOptionsOverridesTest, SanitizeAndValidateOptions) {
6522
6548
  std::string::npos);
6523
6549
  Destroy(options);
6524
6550
  }
6551
+
6552
+ class ExternalTableTest : public DBTestBase {
6553
+ public:
6554
+ ExternalTableTest()
6555
+ : DBTestBase("external_table_test", /*env_do_fsync=*/false) {}
6556
+
6557
+ protected:
6558
+ class DummyExternalTableFile {
6559
+ public:
6560
+ explicit DummyExternalTableFile(const std::string& file_path,
6561
+ FSWritableFile* file)
6562
+ : file_path_(file_path), file_(file), file_size_(0) {
6563
+ props_.comparator_name = BytewiseComparator()->Name();
6564
+ }
6565
+
6566
+ Status Serialize(
6567
+ const std::vector<std::pair<std::string, std::string>>& kv_vec) {
6568
+ // First append the property block if one exists
6569
+ uint32_t prop_block_size = static_cast<uint32_t>(prop_block_.length());
6570
+ buf_.append(static_cast<char*>(static_cast<void*>(&prop_block_size)),
6571
+ sizeof(prop_block_size));
6572
+ if (!prop_block_.empty()) {
6573
+ buf_.append(prop_block_);
6574
+ }
6575
+ for (auto& kv : kv_vec) {
6576
+ SerializeOne(kv.first, kv.second);
6577
+ props_.raw_key_size += kv.first.length();
6578
+ props_.raw_value_size += kv.second.length();
6579
+ }
6580
+ props_.num_entries = kv_vec.size();
6581
+ file_size_ = buf_.length();
6582
+ if (file_) {
6583
+ return file_->Append(buf_, IOOptions(), /*dbg=*/nullptr);
6584
+ } else {
6585
+ return WriteStringToFile(Env::Default(), buf_, file_path_);
6586
+ }
6587
+ }
6588
+
6589
+ Status Deserialize(std::map<std::string, std::string>& kv_map) {
6590
+ Status s = ReadFileToString(Env::Default(), file_path_, &buf_);
6591
+ if (!s.ok()) {
6592
+ return s;
6593
+ }
6594
+
6595
+ uint32_t prop_block_size = 0;
6596
+ buf_.copy(static_cast<char*>(static_cast<void*>(&prop_block_size)),
6597
+ sizeof(prop_block_size));
6598
+ buf_.erase(0, sizeof(prop_block_size));
6599
+ prop_block_.assign(buf_.substr(0, prop_block_size));
6600
+ buf_.erase(0, prop_block_size);
6601
+ while (buf_.length() > 0) {
6602
+ std::pair<std::string, std::string> kv;
6603
+ s = DeserializeOne(kv);
6604
+ if (!s.ok()) {
6605
+ break;
6606
+ }
6607
+ size_t key_size = kv.first.length();
6608
+ size_t value_size = kv.second.length();
6609
+ kv_map.emplace(std::move(kv));
6610
+ props_.raw_key_size += key_size;
6611
+ props_.raw_value_size += value_size;
6612
+ }
6613
+ props_.num_entries = kv_map.size();
6614
+ return s;
6615
+ }
6616
+
6617
+ Status PutPropertiesBlock(const Slice& prop_block) {
6618
+ prop_block_.assign(prop_block.data(), prop_block.size());
6619
+ return Status::OK();
6620
+ }
6621
+
6622
+ Status GetPropertiesBlock(std::unique_ptr<char[]>* block, uint64_t* size,
6623
+ uint64_t* file_offset) {
6624
+ if (!prop_block_.empty()) {
6625
+ *block = std::make_unique<char[]>(prop_block_.length());
6626
+ memcpy(block->get(), prop_block_.data(), prop_block_.length());
6627
+ *size = prop_block_.length();
6628
+ *file_offset = sizeof(uint32_t);
6629
+ } else {
6630
+ *size = 0;
6631
+ }
6632
+ return Status::OK();
6633
+ }
6634
+
6635
+ TableProperties GetTableProperties() const { return props_; }
6636
+
6637
+ uint64_t FileSize() const { return file_size_; }
6638
+
6639
+ private:
6640
+ struct ItemHeader {
6641
+ uint32_t key_size;
6642
+ uint32_t value_size;
6643
+ };
6644
+
6645
+ void SerializeOne(const Slice& key, const Slice& value) {
6646
+ ItemHeader hdr;
6647
+ hdr.key_size = static_cast<uint32_t>(key.size());
6648
+ hdr.value_size = static_cast<uint32_t>(value.size());
6649
+ buf_.append(static_cast<char*>(static_cast<void*>(&hdr)), sizeof(hdr));
6650
+ buf_.append(key.data(), key.size());
6651
+ buf_.append(value.data(), value.size());
6652
+ }
6653
+
6654
+ Status DeserializeOne(std::pair<std::string, std::string>& kv) {
6655
+ ItemHeader hdr;
6656
+ size_t copied =
6657
+ buf_.copy(static_cast<char*>(static_cast<void*>(&hdr)), sizeof(hdr));
6658
+ if (copied < sizeof(hdr)) {
6659
+ return Status::Corruption();
6660
+ }
6661
+ buf_.erase(0, sizeof(hdr));
6662
+ if (buf_.length() < hdr.key_size + hdr.value_size) {
6663
+ return Status::Corruption();
6664
+ }
6665
+ kv.first.assign(std::string_view(buf_.data(), hdr.key_size));
6666
+ buf_.erase(0, hdr.key_size);
6667
+ kv.second.assign(std::string_view(buf_.data(), hdr.value_size));
6668
+ buf_.erase(0, hdr.value_size);
6669
+ return Status::OK();
6670
+ }
6671
+
6672
+ std::string file_path_;
6673
+ FSWritableFile* file_;
6674
+ std::string buf_;
6675
+ TableProperties props_;
6676
+ uint64_t file_size_;
6677
+ std::string prop_block_;
6678
+ };
6679
+
6680
+ class DummyExternalTableIterator : public ExternalTableIterator {
6681
+ public:
6682
+ explicit DummyExternalTableIterator(
6683
+ const ReadOptions& /*ro*/,
6684
+ const std::map<std::string, std::string>& kv_map)
6685
+ : scan_options_(nullptr),
6686
+ num_opts_(0),
6687
+ scan_idx_(0),
6688
+ kv_map_(kv_map),
6689
+ valid_(false) {
6690
+ TEST_SYNC_POINT_CALLBACK("DummyExternalTableIterator::Constructor",
6691
+ &status_);
6692
+ }
6693
+
6694
+ bool Valid() const override { return valid_; }
6695
+
6696
+ void SeekToFirst() override {
6697
+ if (scan_options_) {
6698
+ status_ = Status::InvalidArgument();
6699
+ } else {
6700
+ iter_ = kv_map_.begin();
6701
+ valid_ = iter_ != kv_map_.end();
6702
+ status_ = Status::OK();
6703
+ }
6704
+ }
6705
+
6706
+ void SeekToLast() override {
6707
+ if (scan_options_) {
6708
+ status_ = Status::InvalidArgument();
6709
+ } else {
6710
+ if (!kv_map_.empty()) {
6711
+ iter_ = kv_map_.begin();
6712
+ for (uint64_t i = 0; i < kv_map_.size() - 1; ++i) {
6713
+ iter_++;
6714
+ }
6715
+ valid_ = true;
6716
+ } else {
6717
+ valid_ = false;
6718
+ }
6719
+ status_ = Status::OK();
6720
+ }
6721
+ }
6722
+
6723
+ void Seek(const Slice& target) override {
6724
+ if (status_.ok()) {
6725
+ iter_ = kv_map_.find(target.ToString());
6726
+ valid_ = iter_ != kv_map_.end();
6727
+ eof_ = iter_ == kv_map_.end();
6728
+ }
6729
+ if (scan_options_) {
6730
+ if (scan_idx_ >= num_opts_ ||
6731
+ target != scan_options_[scan_idx_].range.start.value().ToString()) {
6732
+ status_ = Status::InvalidArgument();
6733
+ } else {
6734
+ if (valid_ && scan_options_[scan_idx_].range.limit.has_value() &&
6735
+ iter_->first.compare(
6736
+ scan_options_[scan_idx_].range.limit.value().ToString()) >=
6737
+ 0) {
6738
+ valid_ = false;
6739
+ }
6740
+ scan_idx_++;
6741
+ }
6742
+ }
6743
+ }
6744
+
6745
+ void SeekForPrev(const Slice& /*target*/) override {
6746
+ valid_ = false;
6747
+ status_ = Status::NotSupported();
6748
+ }
6749
+
6750
+ void Next() override {
6751
+ iter_++;
6752
+ valid_ = iter_ != kv_map_.end();
6753
+ eof_ = iter_ == kv_map_.end();
6754
+ if (valid_ && scan_options_ &&
6755
+ scan_options_[scan_idx_ - 1].range.limit.has_value() &&
6756
+ iter_->first.compare(
6757
+ scan_options_[scan_idx_ - 1].range.limit.value().ToString()) >=
6758
+ 0) {
6759
+ valid_ = false;
6760
+ }
6761
+ // status_ is still ok. !valid_ indicates end of scan
6762
+ }
6763
+
6764
+ bool NextAndGetResult(IterateResult* result) override {
6765
+ Next();
6766
+ if (valid_) {
6767
+ result->key = key();
6768
+ result->bound_check_result = IterBoundCheck::kInbound;
6769
+ result->value_prepared = true;
6770
+ } else {
6771
+ result->key = Slice();
6772
+ result->bound_check_result =
6773
+ eof_ ? IterBoundCheck::kUnknown : IterBoundCheck::kOutOfBound;
6774
+ result->value_prepared = false;
6775
+ }
6776
+ return valid_;
6777
+ }
6778
+
6779
+ bool PrepareValue() override { return valid_ ? true : false; }
6780
+
6781
+ IterBoundCheck UpperBoundCheckResult() override {
6782
+ return eof_ ? IterBoundCheck::kUnknown : IterBoundCheck::kOutOfBound;
6783
+ }
6784
+
6785
+ void Prev() override {
6786
+ valid_ = false;
6787
+ status_ = Status::NotSupported();
6788
+ }
6789
+
6790
+ Slice key() const override {
6791
+ // If valid_ is false or status_ is non-ok, behavior is indeterminate
6792
+ return Slice(iter_->first);
6793
+ }
6794
+
6795
+ Status status() const override {
6796
+ // status_ gets overwritten by next Seek
6797
+ return status_;
6798
+ }
6799
+
6800
+ Slice value() const override {
6801
+ // If valid_ is false or status_ is non-ok, behavior is indeterminate
6802
+ return Slice(iter_->second);
6803
+ }
6804
+
6805
+ void Prepare(const ScanOptions scan_opts[], size_t num_opts) override {
6806
+ scan_options_ = scan_opts;
6807
+ num_opts_ = num_opts;
6808
+ }
6809
+
6810
+ private:
6811
+ const ScanOptions* scan_options_;
6812
+ size_t num_opts_;
6813
+ size_t scan_idx_;
6814
+ std::map<std::string, std::string> kv_map_;
6815
+ bool valid_ = false;
6816
+ bool eof_ = false;
6817
+ Status status_ = Status::OK();
6818
+ std::map<std::string, std::string>::iterator iter_;
6819
+ };
6820
+
6821
+ class DummyExternalTableReader : public ExternalTableReader {
6822
+ public:
6823
+ explicit DummyExternalTableReader(const std::string& file_path,
6824
+ bool support_property_block)
6825
+ : file_(file_path, /*file=*/nullptr),
6826
+ support_property_block_(support_property_block) {
6827
+ Status s = file_.Deserialize(kv_map_);
6828
+ EXPECT_OK(s);
6829
+ }
6830
+
6831
+ ExternalTableIterator* NewIterator(
6832
+ const ReadOptions& read_options,
6833
+ const SliceTransform* /*prefix_extractor*/) override {
6834
+ return new DummyExternalTableIterator(read_options, kv_map_);
6835
+ }
6836
+
6837
+ Status Get(const ReadOptions& /*read_options*/, const Slice& key,
6838
+ const SliceTransform* /*prefix_extractor*/,
6839
+ std::string* value) override {
6840
+ auto iter = kv_map_.find(key.ToString());
6841
+ if (iter != kv_map_.end()) {
6842
+ value->assign(iter->second);
6843
+ return Status::OK();
6844
+ }
6845
+ return Status::NotFound();
6846
+ }
6847
+
6848
+ void MultiGet(const ReadOptions& read_options,
6849
+ const std::vector<Slice>& keys,
6850
+ const SliceTransform* prefix_extractor,
6851
+ std::vector<std::string>* values,
6852
+ std::vector<Status>* statuses) override {
6853
+ values->resize(keys.size());
6854
+ statuses->resize(keys.size());
6855
+ for (size_t i = 0; i < keys.size(); ++i) {
6856
+ statuses->at(i) =
6857
+ Get(read_options, keys[i], prefix_extractor, &values->at(i));
6858
+ }
6859
+ }
6860
+
6861
+ Status GetPropertiesBlock(std::unique_ptr<char[]>* block, uint64_t* size,
6862
+ uint64_t* file_offset) override {
6863
+ if (!support_property_block_) {
6864
+ return Status::NotSupported();
6865
+ }
6866
+ return file_.GetPropertiesBlock(block, size, file_offset);
6867
+ }
6868
+
6869
+ std::shared_ptr<const TableProperties> GetTableProperties() const override {
6870
+ std::shared_ptr<TableProperties> props =
6871
+ std::make_shared<TableProperties>();
6872
+ props->comparator_name.assign(BytewiseComparator()->Name());
6873
+ props->num_entries = 1;
6874
+ props->raw_key_size = 3;
6875
+ props->raw_value_size = 3;
6876
+ return props;
6877
+ }
6878
+
6879
+ private:
6880
+ std::map<std::string, std::string> kv_map_;
6881
+ DummyExternalTableFile file_;
6882
+ bool support_property_block_;
6883
+ };
6884
+
6885
+ class DummyExternalTableBuilder : public ExternalTableBuilder {
6886
+ public:
6887
+ explicit DummyExternalTableBuilder(const std::string& file_path,
6888
+ FSWritableFile* file,
6889
+ bool support_property_block)
6890
+ : file_(file_path, file),
6891
+ support_property_block_(support_property_block) {}
6892
+
6893
+ void Add(const Slice& key, const Slice& value) override {
6894
+ if (!kv_vec_.empty()) {
6895
+ ASSERT_LT(BytewiseComparator()->Compare(kv_vec_.back().first, key), 0);
6896
+ }
6897
+ kv_vec_.emplace_back(key.ToString(), value.ToString());
6898
+ }
6899
+
6900
+ Status Finish() override {
6901
+ status_ = file_.Serialize(kv_vec_);
6902
+ return status_;
6903
+ }
6904
+
6905
+ void Abandon() override { kv_vec_.clear(); }
6906
+
6907
+ uint64_t FileSize() const override { return file_.FileSize(); }
6908
+
6909
+ Status PutPropertiesBlock(const Slice& block) override {
6910
+ if (!support_property_block_) {
6911
+ return Status::NotSupported();
6912
+ }
6913
+ return file_.PutPropertiesBlock(block);
6914
+ }
6915
+
6916
+ TableProperties GetTableProperties() const override {
6917
+ return file_.GetTableProperties();
6918
+ }
6919
+
6920
+ Status status() const override { return status_; }
6921
+
6922
+ private:
6923
+ std::vector<std::pair<std::string, std::string>> kv_vec_;
6924
+ DummyExternalTableFile file_;
6925
+ Status status_;
6926
+ bool support_property_block_;
6927
+ };
6928
+
6929
+ class DummyExternalTableFactory : public ExternalTableFactory {
6930
+ public:
6931
+ explicit DummyExternalTableFactory(bool support_property_block)
6932
+ : support_property_block_(support_property_block) {}
6933
+ const char* Name() const override { return "DummyExternalTableFactory"; }
6934
+
6935
+ Status NewTableReader(
6936
+ const ReadOptions& /*read_options*/, const std::string& file_path,
6937
+ const ExternalTableOptions& topts,
6938
+ std::unique_ptr<ExternalTableReader>* table_reader) const override {
6939
+ // Sanity check some options
6940
+ EXPECT_EQ(topts.file_options.handoff_checksum_type,
6941
+ ChecksumType::kCRC32c);
6942
+ table_reader->reset(
6943
+ new DummyExternalTableReader(file_path, support_property_block_));
6944
+ return Status::OK();
6945
+ }
6946
+
6947
+ ExternalTableBuilder* NewTableBuilder(
6948
+ const ExternalTableBuilderOptions& /*opts*/,
6949
+ const std::string& file_path, FSWritableFile* file) const override {
6950
+ return new DummyExternalTableBuilder(file_path, file,
6951
+ support_property_block_);
6952
+ }
6953
+
6954
+ private:
6955
+ bool support_property_block_;
6956
+ };
6957
+ };
6958
+
6959
+ TEST_F(ExternalTableTest, BasicTest) {
6960
+ std::shared_ptr<ExternalTableFactory> factory =
6961
+ std::make_shared<DummyExternalTableFactory>(
6962
+ /*support_property_block=*/false);
6963
+
6964
+ std::string file_path = test::PerThreadDBPath("external_table");
6965
+ {
6966
+ std::unique_ptr<ExternalTableBuilder> builder;
6967
+ builder.reset(factory->NewTableBuilder(
6968
+ ExternalTableBuilderOptions(ReadOptions(), WriteOptions(),
6969
+ std::shared_ptr<const SliceTransform>(),
6970
+ BytewiseComparator(), "default",
6971
+ TableFileCreationReason::kMisc),
6972
+ file_path, /*file=*/nullptr));
6973
+ builder->Add("foo", "bar");
6974
+ ASSERT_OK(builder->Finish());
6975
+ }
6976
+
6977
+ std::unique_ptr<ExternalTableReader> reader;
6978
+ std::shared_ptr<SliceTransform> prefix_extractor;
6979
+ ASSERT_OK(factory->NewTableReader(
6980
+ {}, file_path,
6981
+ ExternalTableOptions(prefix_extractor, /*comparator=*/nullptr,
6982
+ /*fs=*/nullptr, FileOptions()),
6983
+ &reader));
6984
+
6985
+ ReadOptions ro;
6986
+ std::unique_ptr<ExternalTableIterator> iter(reader->NewIterator(ro, nullptr));
6987
+ ASSERT_NE(iter, nullptr);
6988
+ iter->Seek("foo");
6989
+ ASSERT_TRUE(iter->Valid() && iter->status().ok());
6990
+ ASSERT_EQ(iter->value(), "bar");
6991
+ iter->Next();
6992
+ ASSERT_FALSE(iter->Valid());
6993
+
6994
+ std::string val;
6995
+ ASSERT_OK(reader->Get({}, "foo", nullptr, &val));
6996
+ ASSERT_EQ(val, "bar");
6997
+
6998
+ std::vector<std::string> vals;
6999
+ std::vector<Status> statuses;
7000
+ reader->MultiGet({}, {"foo", "bar"}, nullptr, &vals, &statuses);
7001
+ ASSERT_EQ(vals.size(), 2);
7002
+ ASSERT_EQ(statuses.size(), 2);
7003
+ ASSERT_EQ(vals[0], "bar");
7004
+ ASSERT_EQ(statuses[0], Status::OK());
7005
+ ASSERT_EQ(statuses[1], Status::NotFound());
7006
+ }
7007
+
7008
+ TEST_F(ExternalTableTest, SstReaderTest) {
7009
+ if (encrypted_env_) {
7010
+ ROCKSDB_GTEST_SKIP("Test requires non-encrypted environment");
7011
+ return;
7012
+ }
7013
+ Options options = GetDefaultOptions();
7014
+ std::string dbname = test::PerThreadDBPath("external_table_test");
7015
+ std::string ingest_file = dbname + "test.immutabledb";
7016
+ dbname += "_db";
7017
+
7018
+ std::shared_ptr<ExternalTableFactory> factory =
7019
+ std::make_shared<DummyExternalTableFactory>(
7020
+ /*support_property_block=*/false);
7021
+ options.table_factory = NewExternalTableFactory(factory);
7022
+
7023
+ std::unique_ptr<SstFileWriter> writer;
7024
+ writer.reset(new SstFileWriter(EnvOptions(), options));
7025
+ ASSERT_OK(writer->Open(ingest_file));
7026
+ ASSERT_OK(writer->Put("foo", "bar"));
7027
+ ASSERT_OK(writer->Finish());
7028
+ writer.reset();
7029
+
7030
+ std::unique_ptr<SstFileReader> reader(new SstFileReader(options));
7031
+ ASSERT_OK(reader->Open(ingest_file));
7032
+
7033
+ ReadOptions ro;
7034
+ std::unique_ptr<Iterator> iter(reader->NewIterator(ro));
7035
+ ASSERT_NE(iter, nullptr);
7036
+ iter->Seek("foo");
7037
+ ASSERT_TRUE(iter->Valid() && iter->status().ok());
7038
+ ASSERT_EQ(iter->value(), "bar");
7039
+ iter->Next();
7040
+ ASSERT_FALSE(iter->Valid());
7041
+ ASSERT_TRUE(iter->status().ok());
7042
+ }
7043
+
7044
+ TEST_F(ExternalTableTest, ExternalFileChecksumTest) {
7045
+ if (encrypted_env_) {
7046
+ ROCKSDB_GTEST_SKIP("Test requires non-encrypted environment");
7047
+ return;
7048
+ }
7049
+ Options options = GetDefaultOptions();
7050
+ std::string dbname = test::PerThreadDBPath("external_table_test");
7051
+ std::string ingest_file = dbname + "test.immutable";
7052
+ dbname += "_db";
7053
+ ASSERT_OK(DestroyDB(dbname, options));
7054
+
7055
+ std::shared_ptr<ExternalTableFactory> factory =
7056
+ std::make_shared<DummyExternalTableFactory>(
7057
+ /*support_property_block=*/true);
7058
+ options.table_factory = NewExternalTableFactory(factory);
7059
+
7060
+ // Create a file
7061
+ options.file_checksum_gen_factory = GetFileChecksumGenCrc32cFactory();
7062
+ std::unique_ptr<SstFileWriter> writer;
7063
+ writer.reset(new SstFileWriter(EnvOptions(), options));
7064
+ ASSERT_OK(writer->Open(ingest_file));
7065
+ ASSERT_OK(writer->Put("foo", "bar"));
7066
+ ASSERT_OK(writer->Put("foo2", "bar2"));
7067
+ ExternalSstFileInfo info;
7068
+ ASSERT_OK(writer->Finish(&info));
7069
+ writer.reset();
7070
+
7071
+ FileChecksumGenContext cksum_ctx;
7072
+ FileChecksumGenCrc32c cksum_gen(cksum_ctx);
7073
+ std::string file_data;
7074
+ ASSERT_OK(ReadFileToString(options.env, ingest_file, &file_data));
7075
+ cksum_gen.Update(file_data.data(), file_data.size());
7076
+ cksum_gen.Finalize();
7077
+ ASSERT_EQ(info.file_checksum, cksum_gen.GetChecksum());
7078
+ }
7079
+
7080
+ TEST_F(ExternalTableTest, DBIterTest) {
7081
+ if (encrypted_env_) {
7082
+ ROCKSDB_GTEST_SKIP("Test requires non-encrypted environment");
7083
+ return;
7084
+ }
7085
+ Options options = GetDefaultOptions();
7086
+ std::string dbname = test::PerThreadDBPath("external_table_test");
7087
+ std::string ingest_file = dbname + "test.immutable";
7088
+ dbname += "_db";
7089
+ ASSERT_OK(DestroyDB(dbname, options));
7090
+
7091
+ std::shared_ptr<ExternalTableFactory> factory =
7092
+ std::make_shared<DummyExternalTableFactory>(
7093
+ /*support_property_block=*/true);
7094
+ options.table_factory = NewExternalTableFactory(factory);
7095
+
7096
+ // Create a file
7097
+ std::unique_ptr<SstFileWriter> writer;
7098
+ writer.reset(new SstFileWriter(EnvOptions(), options));
7099
+ ASSERT_OK(writer->Open(ingest_file));
7100
+ ASSERT_OK(writer->Put("foo", "bar"));
7101
+ ASSERT_OK(writer->Put("foo2", "bar2"));
7102
+ ASSERT_OK(writer->Finish());
7103
+ writer.reset();
7104
+
7105
+ std::unique_ptr<DB> db;
7106
+ options.create_if_missing = true;
7107
+ Status s = DB::Open(options, dbname, &db);
7108
+ ASSERT_OK(s);
7109
+ ASSERT_TRUE(db != nullptr);
7110
+ ColumnFamilyHandle* cfh = nullptr;
7111
+ ASSERT_OK(db->CreateColumnFamily(options, "new_cf", &cfh));
7112
+
7113
+ IngestExternalFileOptions ifo;
7114
+ ifo.allow_db_generated_files = true;
7115
+ ifo.fill_cache = false;
7116
+ s = db->IngestExternalFile(cfh, {ingest_file}, ifo);
7117
+ ASSERT_OK(s);
7118
+
7119
+ std::unique_ptr<Iterator> iter(db->NewIterator({}, cfh));
7120
+ ASSERT_NE(iter, nullptr);
7121
+ iter->Seek("foo");
7122
+ ASSERT_TRUE(iter->Valid() && iter->status().ok());
7123
+ ASSERT_EQ(iter->value(), "bar");
7124
+ iter->Next();
7125
+ ASSERT_TRUE(iter->Valid() && iter->status().ok());
7126
+ ASSERT_EQ(iter->key(), "foo2");
7127
+ ASSERT_EQ(iter->value(), "bar2");
7128
+ iter->Next();
7129
+ ASSERT_FALSE(iter->Valid());
7130
+ ASSERT_OK(iter->status());
7131
+ iter.reset();
7132
+
7133
+ ASSERT_OK(db->DestroyColumnFamilyHandle(cfh));
7134
+ ASSERT_OK(db->Close());
7135
+ }
7136
+
7137
+ TEST_F(ExternalTableTest, DBMultiScanTest) {
7138
+ if (encrypted_env_) {
7139
+ ROCKSDB_GTEST_SKIP("Test requires non-encrypted environment");
7140
+ return;
7141
+ }
7142
+ Options options = GetDefaultOptions();
7143
+ std::string dbname = test::PerThreadDBPath("external_table_test");
7144
+ std::string ingest_file = dbname + "test.immutable";
7145
+ dbname += "_db";
7146
+ ASSERT_OK(DestroyDB(dbname, options));
7147
+
7148
+ std::shared_ptr<ExternalTableFactory> factory =
7149
+ std::make_shared<DummyExternalTableFactory>(
7150
+ /*support_property_block=*/true);
7151
+ options.table_factory = NewExternalTableFactory(factory);
7152
+
7153
+ // Create a file
7154
+ std::unique_ptr<SstFileWriter> writer;
7155
+ writer.reset(new SstFileWriter(EnvOptions(), options));
7156
+ ASSERT_OK(writer->Open(ingest_file));
7157
+ for (int i = 0; i < 100; ++i) {
7158
+ std::stringstream ss;
7159
+ ss << std::setw(2) << std::setfill('0') << i;
7160
+ ASSERT_OK(writer->Put("k" + ss.str(), "val" + ss.str()));
7161
+ }
7162
+ ASSERT_OK(writer->Finish());
7163
+ writer.reset();
7164
+
7165
+ std::unique_ptr<DB> db;
7166
+ options.create_if_missing = true;
7167
+ Status s = DB::Open(options, dbname, &db);
7168
+ ASSERT_OK(s);
7169
+ ASSERT_TRUE(db != nullptr);
7170
+ ColumnFamilyHandle* cfh = nullptr;
7171
+ ASSERT_OK(db->CreateColumnFamily(options, "new_cf", &cfh));
7172
+
7173
+ IngestExternalFileOptions ifo;
7174
+ ifo.allow_db_generated_files = true;
7175
+ ifo.fill_cache = false;
7176
+ s = db->IngestExternalFile(cfh, {ingest_file}, ifo);
7177
+ ASSERT_OK(s);
7178
+
7179
+ std::vector<std::string> key_ranges({"k03", "k10", "k25", "k50"});
7180
+ ReadOptions ro;
7181
+ std::vector<ScanOptions> scan_options(
7182
+ {ScanOptions(key_ranges[0], key_ranges[1]),
7183
+ ScanOptions(key_ranges[2], key_ranges[3])});
7184
+ std::unique_ptr<MultiScan> iter = db->NewMultiScan(ro, cfh, scan_options);
7185
+ try {
7186
+ int idx = 0;
7187
+ int count = 0;
7188
+ for (auto range : *iter) {
7189
+ for (auto it : range) {
7190
+ ASSERT_GE(it.first.ToString().compare(key_ranges[idx]), 0);
7191
+ ASSERT_LT(it.first.ToString().compare(key_ranges[idx + 1]), 0);
7192
+ count++;
7193
+ }
7194
+ idx += 2;
7195
+ }
7196
+ ASSERT_EQ(count, 32);
7197
+ } catch (MultiScanException& ex) {
7198
+ // Make sure exception contains the status
7199
+ ASSERT_NOK(ex.status());
7200
+ std::cerr << "Iterator returned status " << ex.what();
7201
+ abort();
7202
+ } catch (std::logic_error& ex) {
7203
+ std::cerr << "Iterator returned logic error " << ex.what();
7204
+ abort();
7205
+ }
7206
+ iter.reset();
7207
+
7208
+ // Test the overlapping scan case
7209
+ key_ranges[1] = "k30";
7210
+ scan_options[0] = ScanOptions(key_ranges[0], key_ranges[1]);
7211
+ iter = db->NewMultiScan(ro, cfh, scan_options);
7212
+ try {
7213
+ int idx = 0;
7214
+ int count = 0;
7215
+ for (auto range : *iter) {
7216
+ for (auto it : range) {
7217
+ ASSERT_GE(it.first.ToString().compare(key_ranges[idx]), 0);
7218
+ ASSERT_LT(it.first.ToString().compare(key_ranges[idx + 1]), 0);
7219
+ count++;
7220
+ }
7221
+ idx += 2;
7222
+ }
7223
+ ASSERT_EQ(count, 52);
7224
+ } catch (MultiScanException& ex) {
7225
+ // Make sure exception contains the status
7226
+ ASSERT_NOK(ex.status());
7227
+ std::cerr << "Iterator returned status " << ex.what();
7228
+ abort();
7229
+ } catch (std::logic_error& ex) {
7230
+ std::cerr << "Iterator returned logic error " << ex.what();
7231
+ abort();
7232
+ }
7233
+ iter.reset();
7234
+
7235
+ // Test the no limit scan case
7236
+ scan_options[0] = ScanOptions(key_ranges[0]);
7237
+ scan_options[1] = ScanOptions(key_ranges[2]);
7238
+ iter = db->NewMultiScan(ro, cfh, scan_options);
7239
+ try {
7240
+ int idx = 0;
7241
+ int count = 0;
7242
+ for (auto range : *iter) {
7243
+ for (auto it : range) {
7244
+ ASSERT_GE(it.first.ToString().compare(key_ranges[idx]), 0);
7245
+ if (it.first.ToString().compare(key_ranges[idx + 1]) == 0) {
7246
+ break;
7247
+ }
7248
+ count++;
7249
+ }
7250
+ idx += 2;
7251
+ }
7252
+ ASSERT_EQ(count, 52);
7253
+ } catch (MultiScanException& ex) {
7254
+ // Make sure exception contains the status
7255
+ ASSERT_NOK(ex.status());
7256
+ std::cerr << "Iterator returned status " << ex.what();
7257
+ abort();
7258
+ } catch (std::logic_error& ex) {
7259
+ std::cerr << "Iterator returned logic error " << ex.what();
7260
+ abort();
7261
+ }
7262
+ iter.reset();
7263
+
7264
+ SyncPoint::GetInstance()->SetCallBack(
7265
+ "DummyExternalTableIterator::Constructor", [](void* arg) {
7266
+ Status* status = static_cast<Status*>(arg);
7267
+ *status = Status::IOError();
7268
+ });
7269
+ SyncPoint::GetInstance()->EnableProcessing();
7270
+ iter = db->NewMultiScan(ro, cfh, scan_options);
7271
+ try {
7272
+ for (auto range : *iter) {
7273
+ // Should not get here. Iterator should throw an exception
7274
+ assert(false);
7275
+ for (auto it : range) {
7276
+ (void)it;
7277
+ assert(false);
7278
+ }
7279
+ }
7280
+ } catch (MultiScanException& ex) {
7281
+ // Make sure exception contains the status
7282
+ ASSERT_EQ(ex.status(), Status::IOError());
7283
+ } catch (std::logic_error& ex) {
7284
+ std::cerr << "Iterator returned logic error " << ex.what();
7285
+ abort();
7286
+ }
7287
+ iter.reset();
7288
+ SyncPoint::GetInstance()->DisableProcessing();
7289
+ SyncPoint::GetInstance()->ClearAllCallBacks();
7290
+
7291
+ ASSERT_OK(db->DestroyColumnFamilyHandle(cfh));
7292
+ ASSERT_OK(db->Close());
7293
+ }
7294
+
7295
+ TEST_F(ExternalTableTest, IngestionTest) {
7296
+ if (encrypted_env_) {
7297
+ ROCKSDB_GTEST_SKIP("Test requires non-encrypted environment");
7298
+ return;
7299
+ }
7300
+ Options options = GetDefaultOptions();
7301
+ std::string dbname = test::PerThreadDBPath("external_table_test");
7302
+ std::string ingest_file = dbname + "test.immutable";
7303
+ dbname += "_db";
7304
+ ASSERT_OK(DestroyDB(dbname, options));
7305
+
7306
+ std::shared_ptr<ExternalTableFactory> factory =
7307
+ std::make_shared<DummyExternalTableFactory>(
7308
+ /*support_property_block=*/true);
7309
+ options.table_factory = NewExternalTableFactory(factory);
7310
+
7311
+ // Create a file
7312
+ std::unique_ptr<SstFileWriter> writer;
7313
+ writer.reset(new SstFileWriter(EnvOptions(), options));
7314
+ ASSERT_OK(writer->Open(ingest_file));
7315
+ ASSERT_OK(writer->Put("foo", "bar"));
7316
+ ASSERT_OK(writer->Put("foo2", "bar2"));
7317
+ ASSERT_OK(writer->Finish());
7318
+ writer.reset();
7319
+
7320
+ std::unique_ptr<DB> db;
7321
+ options.create_if_missing = true;
7322
+ Status s = DB::Open(options, dbname, &db);
7323
+ ASSERT_OK(s);
7324
+ ASSERT_TRUE(db != nullptr);
7325
+ ColumnFamilyHandle* cfh = nullptr;
7326
+ ASSERT_OK(db->CreateColumnFamily(options, "new_cf", &cfh));
7327
+
7328
+ IngestExternalFileOptions ifo;
7329
+ ifo.allow_db_generated_files = false;
7330
+ ifo.fill_cache = false;
7331
+ s = db->IngestExternalFile(cfh, {ingest_file}, ifo);
7332
+ ASSERT_OK(s);
7333
+
7334
+ std::unique_ptr<Iterator> iter(db->NewIterator({}, cfh));
7335
+ ASSERT_NE(iter, nullptr);
7336
+ iter->Seek("foo");
7337
+ ASSERT_TRUE(iter->Valid() && iter->status().ok());
7338
+ ASSERT_EQ(iter->value(), "bar");
7339
+ iter->Next();
7340
+ ASSERT_TRUE(iter->Valid() && iter->status().ok());
7341
+ ASSERT_EQ(iter->key(), "foo2");
7342
+ ASSERT_EQ(iter->value(), "bar2");
7343
+ iter->Next();
7344
+ ASSERT_FALSE(iter->Valid());
7345
+ ASSERT_OK(iter->status());
7346
+ iter.reset();
7347
+
7348
+ // Create an overlapping file to ingest with atomic_replace_range option
7349
+ ingest_file += "2";
7350
+ writer.reset(new SstFileWriter(EnvOptions(), options));
7351
+ ASSERT_OK(writer->Open(ingest_file));
7352
+ ASSERT_OK(writer->Put("foo", "val"));
7353
+ ASSERT_OK(writer->Put("foo2", "val2"));
7354
+ ASSERT_OK(writer->Finish());
7355
+ writer.reset();
7356
+
7357
+ ifo.snapshot_consistency = false;
7358
+ s = db->IngestExternalFiles({{cfh,
7359
+ {ingest_file},
7360
+ ifo,
7361
+ {},
7362
+ {},
7363
+ Temperature::kUnknown,
7364
+ {{nullptr, nullptr}}}});
7365
+ ASSERT_OK(s);
7366
+
7367
+ iter.reset(db->NewIterator({}, cfh));
7368
+ ASSERT_NE(iter, nullptr);
7369
+ iter->Seek("foo");
7370
+ ASSERT_TRUE(iter->Valid() && iter->status().ok());
7371
+ ASSERT_EQ(iter->value(), "val");
7372
+ iter->Next();
7373
+ ASSERT_TRUE(iter->Valid() && iter->status().ok());
7374
+ ASSERT_EQ(iter->key(), "foo2");
7375
+ ASSERT_EQ(iter->value(), "val2");
7376
+ iter->Next();
7377
+ ASSERT_FALSE(iter->Valid());
7378
+ ASSERT_OK(iter->status());
7379
+ iter.reset();
7380
+
7381
+ // Create an overlapping file to ingest without atomic_replace_range option.
7382
+ // This should fail as we don't support ingesting an external file with
7383
+ // non-zero assigned sequence number.
7384
+ ingest_file += "3";
7385
+ writer.reset(new SstFileWriter(EnvOptions(), options));
7386
+ ASSERT_OK(writer->Open(ingest_file));
7387
+ ASSERT_OK(writer->Put("foo", "newval"));
7388
+ ASSERT_OK(writer->Put("foo2", "newval2"));
7389
+ ASSERT_OK(writer->Finish());
7390
+ writer.reset();
7391
+
7392
+ s = db->IngestExternalFiles(
7393
+ {{cfh, {ingest_file}, ifo, {}, {}, Temperature::kUnknown, {}}});
7394
+ ASSERT_EQ(s, Status::NotSupported());
7395
+
7396
+ ASSERT_OK(db->DestroyColumnFamilyHandle(cfh));
7397
+ ASSERT_OK(db->Close());
7398
+ }
6525
7399
  } // namespace ROCKSDB_NAMESPACE
6526
7400
 
6527
7401
  int main(int argc, char** argv) {
7402
+ // Opt-in this whole test file
7403
+ ROCKSDB_NAMESPACE::TEST_AllowUnsupportedFormatVersion() = true;
7404
+
6528
7405
  ROCKSDB_NAMESPACE::port::InstallStackTraceHandler();
6529
7406
  ::testing::InitGoogleTest(&argc, argv);
6530
7407
  return RUN_ALL_TESTS();