@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,2167 @@
1
+
2
+ // Copyright (c) 2011-present, Facebook, Inc. All rights reserved.
3
+ // This source code is licensed under both the GPLv2 (found in the
4
+ // COPYING file in the root directory) and Apache 2.0 License
5
+ // (found in the LICENSE.Apache file in the root directory).
6
+ #ifndef ROCKSDB_LITE
7
+
8
+ #include "utilities/blob_db/blob_db_impl.h"
9
+ #include <algorithm>
10
+ #include <cinttypes>
11
+ #include <iomanip>
12
+ #include <memory>
13
+ #include <sstream>
14
+
15
+ #include "db/blob/blob_index.h"
16
+ #include "db/db_impl/db_impl.h"
17
+ #include "db/write_batch_internal.h"
18
+ #include "env/composite_env_wrapper.h"
19
+ #include "file/file_util.h"
20
+ #include "file/filename.h"
21
+ #include "file/random_access_file_reader.h"
22
+ #include "file/sst_file_manager_impl.h"
23
+ #include "file/writable_file_writer.h"
24
+ #include "logging/logging.h"
25
+ #include "monitoring/instrumented_mutex.h"
26
+ #include "monitoring/statistics.h"
27
+ #include "rocksdb/convenience.h"
28
+ #include "rocksdb/env.h"
29
+ #include "rocksdb/iterator.h"
30
+ #include "rocksdb/utilities/stackable_db.h"
31
+ #include "rocksdb/utilities/transaction.h"
32
+ #include "table/block_based/block.h"
33
+ #include "table/block_based/block_based_table_builder.h"
34
+ #include "table/block_based/block_builder.h"
35
+ #include "table/meta_blocks.h"
36
+ #include "test_util/sync_point.h"
37
+ #include "util/cast_util.h"
38
+ #include "util/crc32c.h"
39
+ #include "util/mutexlock.h"
40
+ #include "util/random.h"
41
+ #include "util/stop_watch.h"
42
+ #include "util/timer_queue.h"
43
+ #include "utilities/blob_db/blob_compaction_filter.h"
44
+ #include "utilities/blob_db/blob_db_iterator.h"
45
+ #include "utilities/blob_db/blob_db_listener.h"
46
+
47
+ namespace {
48
+ int kBlockBasedTableVersionFormat = 2;
49
+ } // end namespace
50
+
51
+ namespace ROCKSDB_NAMESPACE {
52
+ namespace blob_db {
53
+
54
+ bool BlobFileComparator::operator()(
55
+ const std::shared_ptr<BlobFile>& lhs,
56
+ const std::shared_ptr<BlobFile>& rhs) const {
57
+ return lhs->BlobFileNumber() > rhs->BlobFileNumber();
58
+ }
59
+
60
+ bool BlobFileComparatorTTL::operator()(
61
+ const std::shared_ptr<BlobFile>& lhs,
62
+ const std::shared_ptr<BlobFile>& rhs) const {
63
+ assert(lhs->HasTTL() && rhs->HasTTL());
64
+ if (lhs->expiration_range_.first < rhs->expiration_range_.first) {
65
+ return true;
66
+ }
67
+ if (lhs->expiration_range_.first > rhs->expiration_range_.first) {
68
+ return false;
69
+ }
70
+ return lhs->BlobFileNumber() < rhs->BlobFileNumber();
71
+ }
72
+
73
+ BlobDBImpl::BlobDBImpl(const std::string& dbname,
74
+ const BlobDBOptions& blob_db_options,
75
+ const DBOptions& db_options,
76
+ const ColumnFamilyOptions& cf_options)
77
+ : BlobDB(),
78
+ dbname_(dbname),
79
+ db_impl_(nullptr),
80
+ env_(db_options.env),
81
+ bdb_options_(blob_db_options),
82
+ db_options_(db_options),
83
+ cf_options_(cf_options),
84
+ env_options_(db_options),
85
+ statistics_(db_options_.statistics.get()),
86
+ next_file_number_(1),
87
+ flush_sequence_(0),
88
+ closed_(true),
89
+ open_file_count_(0),
90
+ total_blob_size_(0),
91
+ live_sst_size_(0),
92
+ fifo_eviction_seq_(0),
93
+ evict_expiration_up_to_(0),
94
+ debug_level_(0) {
95
+ blob_dir_ = (bdb_options_.path_relative)
96
+ ? dbname + "/" + bdb_options_.blob_dir
97
+ : bdb_options_.blob_dir;
98
+ env_options_.bytes_per_sync = blob_db_options.bytes_per_sync;
99
+ }
100
+
101
+ BlobDBImpl::~BlobDBImpl() {
102
+ tqueue_.shutdown();
103
+ // CancelAllBackgroundWork(db_, true);
104
+ Status s __attribute__((__unused__)) = Close();
105
+ assert(s.ok());
106
+ }
107
+
108
+ Status BlobDBImpl::Close() {
109
+ if (closed_) {
110
+ return Status::OK();
111
+ }
112
+ closed_ = true;
113
+
114
+ // Close base DB before BlobDBImpl destructs to stop event listener and
115
+ // compaction filter call.
116
+ Status s = db_->Close();
117
+ // delete db_ anyway even if close failed.
118
+ delete db_;
119
+ // Reset pointers to avoid StackableDB delete the pointer again.
120
+ db_ = nullptr;
121
+ db_impl_ = nullptr;
122
+ if (!s.ok()) {
123
+ return s;
124
+ }
125
+
126
+ s = SyncBlobFiles();
127
+ return s;
128
+ }
129
+
130
+ BlobDBOptions BlobDBImpl::GetBlobDBOptions() const { return bdb_options_; }
131
+
132
+ Status BlobDBImpl::Open(std::vector<ColumnFamilyHandle*>* handles) {
133
+ assert(handles != nullptr);
134
+ assert(db_ == nullptr);
135
+
136
+ if (blob_dir_.empty()) {
137
+ return Status::NotSupported("No blob directory in options");
138
+ }
139
+
140
+ if (bdb_options_.garbage_collection_cutoff < 0.0 ||
141
+ bdb_options_.garbage_collection_cutoff > 1.0) {
142
+ return Status::InvalidArgument(
143
+ "Garbage collection cutoff must be in the interval [0.0, 1.0]");
144
+ }
145
+
146
+ // Temporarily disable compactions in the base DB during open; save the user
147
+ // defined value beforehand so we can restore it once BlobDB is initialized.
148
+ // Note: this is only needed if garbage collection is enabled.
149
+ const bool disable_auto_compactions = cf_options_.disable_auto_compactions;
150
+
151
+ if (bdb_options_.enable_garbage_collection) {
152
+ cf_options_.disable_auto_compactions = true;
153
+ }
154
+
155
+ Status s;
156
+
157
+ // Create info log.
158
+ if (db_options_.info_log == nullptr) {
159
+ s = CreateLoggerFromOptions(dbname_, db_options_, &db_options_.info_log);
160
+ if (!s.ok()) {
161
+ return s;
162
+ }
163
+ }
164
+
165
+ ROCKS_LOG_INFO(db_options_.info_log, "Opening BlobDB...");
166
+
167
+ if ((cf_options_.compaction_filter != nullptr ||
168
+ cf_options_.compaction_filter_factory != nullptr)) {
169
+ ROCKS_LOG_INFO(db_options_.info_log,
170
+ "BlobDB only support compaction filter on non-TTL values.");
171
+ }
172
+
173
+ // Open blob directory.
174
+ s = env_->CreateDirIfMissing(blob_dir_);
175
+ if (!s.ok()) {
176
+ ROCKS_LOG_ERROR(db_options_.info_log,
177
+ "Failed to create blob_dir %s, status: %s",
178
+ blob_dir_.c_str(), s.ToString().c_str());
179
+ }
180
+ s = env_->NewDirectory(blob_dir_, &dir_ent_);
181
+ if (!s.ok()) {
182
+ ROCKS_LOG_ERROR(db_options_.info_log,
183
+ "Failed to open blob_dir %s, status: %s", blob_dir_.c_str(),
184
+ s.ToString().c_str());
185
+ return s;
186
+ }
187
+
188
+ // Open blob files.
189
+ s = OpenAllBlobFiles();
190
+ if (!s.ok()) {
191
+ return s;
192
+ }
193
+
194
+ // Update options
195
+ if (bdb_options_.enable_garbage_collection) {
196
+ db_options_.listeners.push_back(std::make_shared<BlobDBListenerGC>(this));
197
+ cf_options_.compaction_filter_factory =
198
+ std::make_shared<BlobIndexCompactionFilterFactoryGC>(
199
+ this, env_, cf_options_, statistics_);
200
+ } else {
201
+ db_options_.listeners.push_back(std::make_shared<BlobDBListener>(this));
202
+ cf_options_.compaction_filter_factory =
203
+ std::make_shared<BlobIndexCompactionFilterFactory>(
204
+ this, env_, cf_options_, statistics_);
205
+ }
206
+
207
+ // Reset user compaction filter after building into compaction factory.
208
+ cf_options_.compaction_filter = nullptr;
209
+
210
+ // Open base db.
211
+ ColumnFamilyDescriptor cf_descriptor(kDefaultColumnFamilyName, cf_options_);
212
+ s = DB::Open(db_options_, dbname_, {cf_descriptor}, handles, &db_);
213
+ if (!s.ok()) {
214
+ return s;
215
+ }
216
+ db_impl_ = static_cast_with_check<DBImpl>(db_->GetRootDB());
217
+
218
+ // Sanitize the blob_dir provided. Using a directory where the
219
+ // base DB stores its files for the default CF is not supported.
220
+ const ColumnFamilyData* const cfd =
221
+ static_cast<ColumnFamilyHandleImpl*>(DefaultColumnFamily())->cfd();
222
+ assert(cfd);
223
+
224
+ const ImmutableCFOptions* const ioptions = cfd->ioptions();
225
+ assert(ioptions);
226
+
227
+ assert(env_);
228
+
229
+ for (const auto& cf_path : ioptions->cf_paths) {
230
+ bool blob_dir_same_as_cf_dir = false;
231
+ s = env_->AreFilesSame(blob_dir_, cf_path.path, &blob_dir_same_as_cf_dir);
232
+ if (!s.ok()) {
233
+ ROCKS_LOG_ERROR(db_options_.info_log,
234
+ "Error while sanitizing blob_dir %s, status: %s",
235
+ blob_dir_.c_str(), s.ToString().c_str());
236
+ return s;
237
+ }
238
+
239
+ if (blob_dir_same_as_cf_dir) {
240
+ return Status::NotSupported(
241
+ "Using the base DB's storage directories for BlobDB files is not "
242
+ "supported.");
243
+ }
244
+ }
245
+
246
+ // Initialize SST file <-> oldest blob file mapping if garbage collection
247
+ // is enabled.
248
+ if (bdb_options_.enable_garbage_collection) {
249
+ std::vector<LiveFileMetaData> live_files;
250
+ db_->GetLiveFilesMetaData(&live_files);
251
+
252
+ InitializeBlobFileToSstMapping(live_files);
253
+
254
+ MarkUnreferencedBlobFilesObsoleteDuringOpen();
255
+
256
+ if (!disable_auto_compactions) {
257
+ s = db_->EnableAutoCompaction(*handles);
258
+ if (!s.ok()) {
259
+ ROCKS_LOG_ERROR(
260
+ db_options_.info_log,
261
+ "Failed to enable automatic compactions during open, status: %s",
262
+ s.ToString().c_str());
263
+ return s;
264
+ }
265
+ }
266
+ }
267
+
268
+ // Add trash files in blob dir to file delete scheduler.
269
+ SstFileManagerImpl* sfm = static_cast<SstFileManagerImpl*>(
270
+ db_impl_->immutable_db_options().sst_file_manager.get());
271
+ DeleteScheduler::CleanupDirectory(env_, sfm, blob_dir_);
272
+
273
+ UpdateLiveSSTSize();
274
+
275
+ // Start background jobs.
276
+ if (!bdb_options_.disable_background_tasks) {
277
+ StartBackgroundTasks();
278
+ }
279
+
280
+ ROCKS_LOG_INFO(db_options_.info_log, "BlobDB pointer %p", this);
281
+ bdb_options_.Dump(db_options_.info_log.get());
282
+ closed_ = false;
283
+ return s;
284
+ }
285
+
286
+ void BlobDBImpl::StartBackgroundTasks() {
287
+ // store a call to a member function and object
288
+ tqueue_.add(
289
+ kReclaimOpenFilesPeriodMillisecs,
290
+ std::bind(&BlobDBImpl::ReclaimOpenFiles, this, std::placeholders::_1));
291
+ tqueue_.add(
292
+ kDeleteObsoleteFilesPeriodMillisecs,
293
+ std::bind(&BlobDBImpl::DeleteObsoleteFiles, this, std::placeholders::_1));
294
+ tqueue_.add(kSanityCheckPeriodMillisecs,
295
+ std::bind(&BlobDBImpl::SanityCheck, this, std::placeholders::_1));
296
+ tqueue_.add(
297
+ kEvictExpiredFilesPeriodMillisecs,
298
+ std::bind(&BlobDBImpl::EvictExpiredFiles, this, std::placeholders::_1));
299
+ }
300
+
301
+ Status BlobDBImpl::GetAllBlobFiles(std::set<uint64_t>* file_numbers) {
302
+ assert(file_numbers != nullptr);
303
+ std::vector<std::string> all_files;
304
+ Status s = env_->GetChildren(blob_dir_, &all_files);
305
+ if (!s.ok()) {
306
+ ROCKS_LOG_ERROR(db_options_.info_log,
307
+ "Failed to get list of blob files, status: %s",
308
+ s.ToString().c_str());
309
+ return s;
310
+ }
311
+
312
+ for (const auto& file_name : all_files) {
313
+ uint64_t file_number;
314
+ FileType type;
315
+ bool success = ParseFileName(file_name, &file_number, &type);
316
+ if (success && type == kBlobFile) {
317
+ file_numbers->insert(file_number);
318
+ } else {
319
+ ROCKS_LOG_WARN(db_options_.info_log,
320
+ "Skipping file in blob directory: %s", file_name.c_str());
321
+ }
322
+ }
323
+
324
+ return s;
325
+ }
326
+
327
+ Status BlobDBImpl::OpenAllBlobFiles() {
328
+ std::set<uint64_t> file_numbers;
329
+ Status s = GetAllBlobFiles(&file_numbers);
330
+ if (!s.ok()) {
331
+ return s;
332
+ }
333
+
334
+ if (!file_numbers.empty()) {
335
+ next_file_number_.store(*file_numbers.rbegin() + 1);
336
+ }
337
+
338
+ std::ostringstream blob_file_oss;
339
+ std::ostringstream live_imm_oss;
340
+ std::ostringstream obsolete_file_oss;
341
+
342
+ for (auto& file_number : file_numbers) {
343
+ std::shared_ptr<BlobFile> blob_file = std::make_shared<BlobFile>(
344
+ this, blob_dir_, file_number, db_options_.info_log.get());
345
+ blob_file->MarkImmutable(/* sequence */ 0);
346
+
347
+ // Read file header and footer
348
+ Status read_metadata_status = blob_file->ReadMetadata(env_, env_options_);
349
+ if (read_metadata_status.IsCorruption()) {
350
+ // Remove incomplete file.
351
+ if (!obsolete_files_.empty()) {
352
+ obsolete_file_oss << ", ";
353
+ }
354
+ obsolete_file_oss << file_number;
355
+
356
+ ObsoleteBlobFile(blob_file, 0 /*obsolete_seq*/, false /*update_size*/);
357
+ continue;
358
+ } else if (!read_metadata_status.ok()) {
359
+ ROCKS_LOG_ERROR(db_options_.info_log,
360
+ "Unable to read metadata of blob file %" PRIu64
361
+ ", status: '%s'",
362
+ file_number, read_metadata_status.ToString().c_str());
363
+ return read_metadata_status;
364
+ }
365
+
366
+ total_blob_size_ += blob_file->GetFileSize();
367
+
368
+ if (!blob_files_.empty()) {
369
+ blob_file_oss << ", ";
370
+ }
371
+ blob_file_oss << file_number;
372
+
373
+ blob_files_[file_number] = blob_file;
374
+
375
+ if (!blob_file->HasTTL()) {
376
+ if (!live_imm_non_ttl_blob_files_.empty()) {
377
+ live_imm_oss << ", ";
378
+ }
379
+ live_imm_oss << file_number;
380
+
381
+ live_imm_non_ttl_blob_files_[file_number] = blob_file;
382
+ }
383
+ }
384
+
385
+ ROCKS_LOG_INFO(db_options_.info_log,
386
+ "Found %" ROCKSDB_PRIszt " blob files: %s", blob_files_.size(),
387
+ blob_file_oss.str().c_str());
388
+ ROCKS_LOG_INFO(
389
+ db_options_.info_log, "Found %" ROCKSDB_PRIszt " non-TTL blob files: %s",
390
+ live_imm_non_ttl_blob_files_.size(), live_imm_oss.str().c_str());
391
+ ROCKS_LOG_INFO(db_options_.info_log,
392
+ "Found %" ROCKSDB_PRIszt
393
+ " incomplete or corrupted blob files: %s",
394
+ obsolete_files_.size(), obsolete_file_oss.str().c_str());
395
+ return s;
396
+ }
397
+
398
+ template <typename Linker>
399
+ void BlobDBImpl::LinkSstToBlobFileImpl(uint64_t sst_file_number,
400
+ uint64_t blob_file_number,
401
+ Linker linker) {
402
+ assert(bdb_options_.enable_garbage_collection);
403
+ assert(blob_file_number != kInvalidBlobFileNumber);
404
+
405
+ auto it = blob_files_.find(blob_file_number);
406
+ if (it == blob_files_.end()) {
407
+ ROCKS_LOG_WARN(db_options_.info_log,
408
+ "Blob file %" PRIu64
409
+ " not found while trying to link "
410
+ "SST file %" PRIu64,
411
+ blob_file_number, sst_file_number);
412
+ return;
413
+ }
414
+
415
+ BlobFile* const blob_file = it->second.get();
416
+ assert(blob_file);
417
+
418
+ linker(blob_file, sst_file_number);
419
+
420
+ ROCKS_LOG_INFO(db_options_.info_log,
421
+ "Blob file %" PRIu64 " linked to SST file %" PRIu64,
422
+ blob_file_number, sst_file_number);
423
+ }
424
+
425
+ void BlobDBImpl::LinkSstToBlobFile(uint64_t sst_file_number,
426
+ uint64_t blob_file_number) {
427
+ auto linker = [](BlobFile* blob_file, uint64_t sst_file) {
428
+ WriteLock file_lock(&blob_file->mutex_);
429
+ blob_file->LinkSstFile(sst_file);
430
+ };
431
+
432
+ LinkSstToBlobFileImpl(sst_file_number, blob_file_number, linker);
433
+ }
434
+
435
+ void BlobDBImpl::LinkSstToBlobFileNoLock(uint64_t sst_file_number,
436
+ uint64_t blob_file_number) {
437
+ auto linker = [](BlobFile* blob_file, uint64_t sst_file) {
438
+ blob_file->LinkSstFile(sst_file);
439
+ };
440
+
441
+ LinkSstToBlobFileImpl(sst_file_number, blob_file_number, linker);
442
+ }
443
+
444
+ void BlobDBImpl::UnlinkSstFromBlobFile(uint64_t sst_file_number,
445
+ uint64_t blob_file_number) {
446
+ assert(bdb_options_.enable_garbage_collection);
447
+ assert(blob_file_number != kInvalidBlobFileNumber);
448
+
449
+ auto it = blob_files_.find(blob_file_number);
450
+ if (it == blob_files_.end()) {
451
+ ROCKS_LOG_WARN(db_options_.info_log,
452
+ "Blob file %" PRIu64
453
+ " not found while trying to unlink "
454
+ "SST file %" PRIu64,
455
+ blob_file_number, sst_file_number);
456
+ return;
457
+ }
458
+
459
+ BlobFile* const blob_file = it->second.get();
460
+ assert(blob_file);
461
+
462
+ {
463
+ WriteLock file_lock(&blob_file->mutex_);
464
+ blob_file->UnlinkSstFile(sst_file_number);
465
+ }
466
+
467
+ ROCKS_LOG_INFO(db_options_.info_log,
468
+ "Blob file %" PRIu64 " unlinked from SST file %" PRIu64,
469
+ blob_file_number, sst_file_number);
470
+ }
471
+
472
+ void BlobDBImpl::InitializeBlobFileToSstMapping(
473
+ const std::vector<LiveFileMetaData>& live_files) {
474
+ assert(bdb_options_.enable_garbage_collection);
475
+
476
+ for (const auto& live_file : live_files) {
477
+ const uint64_t sst_file_number = live_file.file_number;
478
+ const uint64_t blob_file_number = live_file.oldest_blob_file_number;
479
+
480
+ if (blob_file_number == kInvalidBlobFileNumber) {
481
+ continue;
482
+ }
483
+
484
+ LinkSstToBlobFileNoLock(sst_file_number, blob_file_number);
485
+ }
486
+ }
487
+
488
+ void BlobDBImpl::ProcessFlushJobInfo(const FlushJobInfo& info) {
489
+ assert(bdb_options_.enable_garbage_collection);
490
+
491
+ WriteLock lock(&mutex_);
492
+
493
+ if (info.oldest_blob_file_number != kInvalidBlobFileNumber) {
494
+ LinkSstToBlobFile(info.file_number, info.oldest_blob_file_number);
495
+ }
496
+
497
+ assert(flush_sequence_ < info.largest_seqno);
498
+ flush_sequence_ = info.largest_seqno;
499
+
500
+ MarkUnreferencedBlobFilesObsolete();
501
+ }
502
+
503
+ void BlobDBImpl::ProcessCompactionJobInfo(const CompactionJobInfo& info) {
504
+ assert(bdb_options_.enable_garbage_collection);
505
+
506
+ if (!info.status.ok()) {
507
+ return;
508
+ }
509
+
510
+ // Note: the same SST file may appear in both the input and the output
511
+ // file list in case of a trivial move. We walk through the two lists
512
+ // below in a fashion that's similar to merge sort to detect this.
513
+
514
+ auto cmp = [](const CompactionFileInfo& lhs, const CompactionFileInfo& rhs) {
515
+ return lhs.file_number < rhs.file_number;
516
+ };
517
+
518
+ auto inputs = info.input_file_infos;
519
+ auto iit = inputs.begin();
520
+ const auto iit_end = inputs.end();
521
+
522
+ std::sort(iit, iit_end, cmp);
523
+
524
+ auto outputs = info.output_file_infos;
525
+ auto oit = outputs.begin();
526
+ const auto oit_end = outputs.end();
527
+
528
+ std::sort(oit, oit_end, cmp);
529
+
530
+ WriteLock lock(&mutex_);
531
+
532
+ while (iit != iit_end && oit != oit_end) {
533
+ const auto& input = *iit;
534
+ const auto& output = *oit;
535
+
536
+ if (input.file_number == output.file_number) {
537
+ ++iit;
538
+ ++oit;
539
+ } else if (input.file_number < output.file_number) {
540
+ if (input.oldest_blob_file_number != kInvalidBlobFileNumber) {
541
+ UnlinkSstFromBlobFile(input.file_number, input.oldest_blob_file_number);
542
+ }
543
+
544
+ ++iit;
545
+ } else {
546
+ assert(output.file_number < input.file_number);
547
+
548
+ if (output.oldest_blob_file_number != kInvalidBlobFileNumber) {
549
+ LinkSstToBlobFile(output.file_number, output.oldest_blob_file_number);
550
+ }
551
+
552
+ ++oit;
553
+ }
554
+ }
555
+
556
+ while (iit != iit_end) {
557
+ const auto& input = *iit;
558
+
559
+ if (input.oldest_blob_file_number != kInvalidBlobFileNumber) {
560
+ UnlinkSstFromBlobFile(input.file_number, input.oldest_blob_file_number);
561
+ }
562
+
563
+ ++iit;
564
+ }
565
+
566
+ while (oit != oit_end) {
567
+ const auto& output = *oit;
568
+
569
+ if (output.oldest_blob_file_number != kInvalidBlobFileNumber) {
570
+ LinkSstToBlobFile(output.file_number, output.oldest_blob_file_number);
571
+ }
572
+
573
+ ++oit;
574
+ }
575
+
576
+ MarkUnreferencedBlobFilesObsolete();
577
+ }
578
+
579
+ bool BlobDBImpl::MarkBlobFileObsoleteIfNeeded(
580
+ const std::shared_ptr<BlobFile>& blob_file, SequenceNumber obsolete_seq) {
581
+ assert(blob_file);
582
+ assert(!blob_file->HasTTL());
583
+ assert(blob_file->Immutable());
584
+ assert(bdb_options_.enable_garbage_collection);
585
+
586
+ // Note: FIFO eviction could have marked this file obsolete already.
587
+ if (blob_file->Obsolete()) {
588
+ return true;
589
+ }
590
+
591
+ // We cannot mark this file (or any higher-numbered files for that matter)
592
+ // obsolete if it is referenced by any memtables or SSTs. We keep track of
593
+ // the SSTs explicitly. To account for memtables, we keep track of the highest
594
+ // sequence number received in flush notifications, and we do not mark the
595
+ // blob file obsolete if there are still unflushed memtables from before
596
+ // the time the blob file was closed.
597
+ if (blob_file->GetImmutableSequence() > flush_sequence_ ||
598
+ !blob_file->GetLinkedSstFiles().empty()) {
599
+ return false;
600
+ }
601
+
602
+ ROCKS_LOG_INFO(db_options_.info_log,
603
+ "Blob file %" PRIu64 " is no longer needed, marking obsolete",
604
+ blob_file->BlobFileNumber());
605
+
606
+ ObsoleteBlobFile(blob_file, obsolete_seq, /* update_size */ true);
607
+ return true;
608
+ }
609
+
610
+ template <class Functor>
611
+ void BlobDBImpl::MarkUnreferencedBlobFilesObsoleteImpl(Functor mark_if_needed) {
612
+ assert(bdb_options_.enable_garbage_collection);
613
+
614
+ // Iterate through all live immutable non-TTL blob files, and mark them
615
+ // obsolete assuming no SST files or memtables rely on the blobs in them.
616
+ // Note: we need to stop as soon as we find a blob file that has any
617
+ // linked SSTs (or one potentially referenced by memtables).
618
+
619
+ uint64_t obsoleted_files = 0;
620
+
621
+ auto it = live_imm_non_ttl_blob_files_.begin();
622
+ while (it != live_imm_non_ttl_blob_files_.end()) {
623
+ const auto& blob_file = it->second;
624
+ assert(blob_file);
625
+ assert(blob_file->BlobFileNumber() == it->first);
626
+ assert(!blob_file->HasTTL());
627
+ assert(blob_file->Immutable());
628
+
629
+ // Small optimization: Obsolete() does an atomic read, so we can do
630
+ // this check without taking a lock on the blob file's mutex.
631
+ if (blob_file->Obsolete()) {
632
+ it = live_imm_non_ttl_blob_files_.erase(it);
633
+ continue;
634
+ }
635
+
636
+ if (!mark_if_needed(blob_file)) {
637
+ break;
638
+ }
639
+
640
+ it = live_imm_non_ttl_blob_files_.erase(it);
641
+
642
+ ++obsoleted_files;
643
+ }
644
+
645
+ if (obsoleted_files > 0) {
646
+ ROCKS_LOG_INFO(db_options_.info_log,
647
+ "%" PRIu64 " blob file(s) marked obsolete by GC",
648
+ obsoleted_files);
649
+ RecordTick(statistics_, BLOB_DB_GC_NUM_FILES, obsoleted_files);
650
+ }
651
+ }
652
+
653
+ void BlobDBImpl::MarkUnreferencedBlobFilesObsolete() {
654
+ const SequenceNumber obsolete_seq = GetLatestSequenceNumber();
655
+
656
+ MarkUnreferencedBlobFilesObsoleteImpl(
657
+ [this, obsolete_seq](const std::shared_ptr<BlobFile>& blob_file) {
658
+ WriteLock file_lock(&blob_file->mutex_);
659
+ return MarkBlobFileObsoleteIfNeeded(blob_file, obsolete_seq);
660
+ });
661
+ }
662
+
663
+ void BlobDBImpl::MarkUnreferencedBlobFilesObsoleteDuringOpen() {
664
+ MarkUnreferencedBlobFilesObsoleteImpl(
665
+ [this](const std::shared_ptr<BlobFile>& blob_file) {
666
+ return MarkBlobFileObsoleteIfNeeded(blob_file, /* obsolete_seq */ 0);
667
+ });
668
+ }
669
+
670
+ void BlobDBImpl::CloseRandomAccessLocked(
671
+ const std::shared_ptr<BlobFile>& bfile) {
672
+ bfile->CloseRandomAccessLocked();
673
+ open_file_count_--;
674
+ }
675
+
676
+ Status BlobDBImpl::GetBlobFileReader(
677
+ const std::shared_ptr<BlobFile>& blob_file,
678
+ std::shared_ptr<RandomAccessFileReader>* reader) {
679
+ assert(reader != nullptr);
680
+ bool fresh_open = false;
681
+ Status s = blob_file->GetReader(env_, env_options_, reader, &fresh_open);
682
+ if (s.ok() && fresh_open) {
683
+ assert(*reader != nullptr);
684
+ open_file_count_++;
685
+ }
686
+ return s;
687
+ }
688
+
689
+ std::shared_ptr<BlobFile> BlobDBImpl::NewBlobFile(
690
+ bool has_ttl, const ExpirationRange& expiration_range,
691
+ const std::string& reason) {
692
+ assert(has_ttl == (expiration_range.first || expiration_range.second));
693
+
694
+ uint64_t file_num = next_file_number_++;
695
+
696
+ const uint32_t column_family_id =
697
+ static_cast<ColumnFamilyHandleImpl*>(DefaultColumnFamily())->GetID();
698
+ auto blob_file = std::make_shared<BlobFile>(
699
+ this, blob_dir_, file_num, db_options_.info_log.get(), column_family_id,
700
+ bdb_options_.compression, has_ttl, expiration_range);
701
+
702
+ ROCKS_LOG_DEBUG(db_options_.info_log, "New blob file created: %s reason='%s'",
703
+ blob_file->PathName().c_str(), reason.c_str());
704
+ LogFlush(db_options_.info_log);
705
+
706
+ return blob_file;
707
+ }
708
+
709
+ void BlobDBImpl::RegisterBlobFile(std::shared_ptr<BlobFile> blob_file) {
710
+ const uint64_t blob_file_number = blob_file->BlobFileNumber();
711
+
712
+ auto it = blob_files_.lower_bound(blob_file_number);
713
+ assert(it == blob_files_.end() || it->first != blob_file_number);
714
+
715
+ blob_files_.insert(it,
716
+ std::map<uint64_t, std::shared_ptr<BlobFile>>::value_type(
717
+ blob_file_number, std::move(blob_file)));
718
+ }
719
+
720
+ Status BlobDBImpl::CreateWriterLocked(const std::shared_ptr<BlobFile>& bfile) {
721
+ std::string fpath(bfile->PathName());
722
+ std::unique_ptr<WritableFile> wfile;
723
+
724
+ Status s = env_->ReopenWritableFile(fpath, &wfile, env_options_);
725
+ if (!s.ok()) {
726
+ ROCKS_LOG_ERROR(db_options_.info_log,
727
+ "Failed to open blob file for write: %s status: '%s'"
728
+ " exists: '%s'",
729
+ fpath.c_str(), s.ToString().c_str(),
730
+ env_->FileExists(fpath).ToString().c_str());
731
+ return s;
732
+ }
733
+
734
+ std::unique_ptr<WritableFileWriter> fwriter;
735
+ fwriter.reset(new WritableFileWriter(
736
+ NewLegacyWritableFileWrapper(std::move(wfile)), fpath, env_options_));
737
+
738
+ uint64_t boffset = bfile->GetFileSize();
739
+ if (debug_level_ >= 2 && boffset) {
740
+ ROCKS_LOG_DEBUG(db_options_.info_log,
741
+ "Open blob file: %s with offset: %" PRIu64, fpath.c_str(),
742
+ boffset);
743
+ }
744
+
745
+ BlobLogWriter::ElemType et = BlobLogWriter::kEtNone;
746
+ if (bfile->file_size_ == BlobLogHeader::kSize) {
747
+ et = BlobLogWriter::kEtFileHdr;
748
+ } else if (bfile->file_size_ > BlobLogHeader::kSize) {
749
+ et = BlobLogWriter::kEtRecord;
750
+ } else if (bfile->file_size_) {
751
+ ROCKS_LOG_WARN(db_options_.info_log,
752
+ "Open blob file: %s with wrong size: %" PRIu64,
753
+ fpath.c_str(), boffset);
754
+ return Status::Corruption("Invalid blob file size");
755
+ }
756
+
757
+ bfile->log_writer_ = std::make_shared<BlobLogWriter>(
758
+ std::move(fwriter), env_, statistics_, bfile->file_number_,
759
+ db_options_.use_fsync, boffset);
760
+ bfile->log_writer_->last_elem_type_ = et;
761
+
762
+ return s;
763
+ }
764
+
765
+ std::shared_ptr<BlobFile> BlobDBImpl::FindBlobFileLocked(
766
+ uint64_t expiration) const {
767
+ if (open_ttl_files_.empty()) {
768
+ return nullptr;
769
+ }
770
+
771
+ std::shared_ptr<BlobFile> tmp = std::make_shared<BlobFile>();
772
+ tmp->SetHasTTL(true);
773
+ tmp->expiration_range_ = std::make_pair(expiration, 0);
774
+ tmp->file_number_ = std::numeric_limits<uint64_t>::max();
775
+
776
+ auto citr = open_ttl_files_.equal_range(tmp);
777
+ if (citr.first == open_ttl_files_.end()) {
778
+ assert(citr.second == open_ttl_files_.end());
779
+
780
+ std::shared_ptr<BlobFile> check = *(open_ttl_files_.rbegin());
781
+ return (check->expiration_range_.second <= expiration) ? nullptr : check;
782
+ }
783
+
784
+ if (citr.first != citr.second) {
785
+ return *(citr.first);
786
+ }
787
+
788
+ auto finditr = citr.second;
789
+ if (finditr != open_ttl_files_.begin()) {
790
+ --finditr;
791
+ }
792
+
793
+ bool b2 = (*finditr)->expiration_range_.second <= expiration;
794
+ bool b1 = (*finditr)->expiration_range_.first > expiration;
795
+
796
+ return (b1 || b2) ? nullptr : (*finditr);
797
+ }
798
+
799
+ Status BlobDBImpl::CheckOrCreateWriterLocked(
800
+ const std::shared_ptr<BlobFile>& blob_file,
801
+ std::shared_ptr<BlobLogWriter>* writer) {
802
+ assert(writer != nullptr);
803
+ *writer = blob_file->GetWriter();
804
+ if (*writer != nullptr) {
805
+ return Status::OK();
806
+ }
807
+ Status s = CreateWriterLocked(blob_file);
808
+ if (s.ok()) {
809
+ *writer = blob_file->GetWriter();
810
+ }
811
+ return s;
812
+ }
813
+
814
+ Status BlobDBImpl::CreateBlobFileAndWriter(
815
+ bool has_ttl, const ExpirationRange& expiration_range,
816
+ const std::string& reason, std::shared_ptr<BlobFile>* blob_file,
817
+ std::shared_ptr<BlobLogWriter>* writer) {
818
+ TEST_SYNC_POINT("BlobDBImpl::CreateBlobFileAndWriter");
819
+ assert(has_ttl == (expiration_range.first || expiration_range.second));
820
+ assert(blob_file);
821
+ assert(writer);
822
+
823
+ *blob_file = NewBlobFile(has_ttl, expiration_range, reason);
824
+ assert(*blob_file);
825
+
826
+ // file not visible, hence no lock
827
+ Status s = CheckOrCreateWriterLocked(*blob_file, writer);
828
+ if (!s.ok()) {
829
+ ROCKS_LOG_ERROR(db_options_.info_log,
830
+ "Failed to get writer for blob file: %s, error: %s",
831
+ (*blob_file)->PathName().c_str(), s.ToString().c_str());
832
+ return s;
833
+ }
834
+
835
+ assert(*writer);
836
+
837
+ s = (*writer)->WriteHeader((*blob_file)->header_);
838
+ if (!s.ok()) {
839
+ ROCKS_LOG_ERROR(db_options_.info_log,
840
+ "Failed to write header to new blob file: %s"
841
+ " status: '%s'",
842
+ (*blob_file)->PathName().c_str(), s.ToString().c_str());
843
+ return s;
844
+ }
845
+
846
+ (*blob_file)->SetFileSize(BlobLogHeader::kSize);
847
+ total_blob_size_ += BlobLogHeader::kSize;
848
+
849
+ return s;
850
+ }
851
+
852
+ Status BlobDBImpl::SelectBlobFile(std::shared_ptr<BlobFile>* blob_file) {
853
+ assert(blob_file);
854
+
855
+ {
856
+ ReadLock rl(&mutex_);
857
+
858
+ if (open_non_ttl_file_) {
859
+ assert(!open_non_ttl_file_->Immutable());
860
+ *blob_file = open_non_ttl_file_;
861
+ return Status::OK();
862
+ }
863
+ }
864
+
865
+ // Check again
866
+ WriteLock wl(&mutex_);
867
+
868
+ if (open_non_ttl_file_) {
869
+ assert(!open_non_ttl_file_->Immutable());
870
+ *blob_file = open_non_ttl_file_;
871
+ return Status::OK();
872
+ }
873
+
874
+ std::shared_ptr<BlobLogWriter> writer;
875
+ const Status s = CreateBlobFileAndWriter(
876
+ /* has_ttl */ false, ExpirationRange(),
877
+ /* reason */ "SelectBlobFile", blob_file, &writer);
878
+ if (!s.ok()) {
879
+ return s;
880
+ }
881
+
882
+ RegisterBlobFile(*blob_file);
883
+ open_non_ttl_file_ = *blob_file;
884
+
885
+ return s;
886
+ }
887
+
888
+ Status BlobDBImpl::SelectBlobFileTTL(uint64_t expiration,
889
+ std::shared_ptr<BlobFile>* blob_file) {
890
+ assert(blob_file);
891
+ assert(expiration != kNoExpiration);
892
+
893
+ {
894
+ ReadLock rl(&mutex_);
895
+
896
+ *blob_file = FindBlobFileLocked(expiration);
897
+ if (*blob_file != nullptr) {
898
+ assert(!(*blob_file)->Immutable());
899
+ return Status::OK();
900
+ }
901
+ }
902
+
903
+ // Check again
904
+ WriteLock wl(&mutex_);
905
+
906
+ *blob_file = FindBlobFileLocked(expiration);
907
+ if (*blob_file != nullptr) {
908
+ assert(!(*blob_file)->Immutable());
909
+ return Status::OK();
910
+ }
911
+
912
+ const uint64_t exp_low =
913
+ (expiration / bdb_options_.ttl_range_secs) * bdb_options_.ttl_range_secs;
914
+ const uint64_t exp_high = exp_low + bdb_options_.ttl_range_secs;
915
+ const ExpirationRange expiration_range(exp_low, exp_high);
916
+
917
+ std::ostringstream oss;
918
+ oss << "SelectBlobFileTTL range: [" << exp_low << ',' << exp_high << ')';
919
+
920
+ std::shared_ptr<BlobLogWriter> writer;
921
+ const Status s =
922
+ CreateBlobFileAndWriter(/* has_ttl */ true, expiration_range,
923
+ /* reason */ oss.str(), blob_file, &writer);
924
+ if (!s.ok()) {
925
+ return s;
926
+ }
927
+
928
+ RegisterBlobFile(*blob_file);
929
+ open_ttl_files_.insert(*blob_file);
930
+
931
+ return s;
932
+ }
933
+
934
+ class BlobDBImpl::BlobInserter : public WriteBatch::Handler {
935
+ private:
936
+ const WriteOptions& options_;
937
+ BlobDBImpl* blob_db_impl_;
938
+ uint32_t default_cf_id_;
939
+ WriteBatch batch_;
940
+
941
+ public:
942
+ BlobInserter(const WriteOptions& options, BlobDBImpl* blob_db_impl,
943
+ uint32_t default_cf_id)
944
+ : options_(options),
945
+ blob_db_impl_(blob_db_impl),
946
+ default_cf_id_(default_cf_id) {}
947
+
948
+ WriteBatch* batch() { return &batch_; }
949
+
950
+ Status PutCF(uint32_t column_family_id, const Slice& key,
951
+ const Slice& value) override {
952
+ if (column_family_id != default_cf_id_) {
953
+ return Status::NotSupported(
954
+ "Blob DB doesn't support non-default column family.");
955
+ }
956
+ Status s = blob_db_impl_->PutBlobValue(options_, key, value, kNoExpiration,
957
+ &batch_);
958
+ return s;
959
+ }
960
+
961
+ Status DeleteCF(uint32_t column_family_id, const Slice& key) override {
962
+ if (column_family_id != default_cf_id_) {
963
+ return Status::NotSupported(
964
+ "Blob DB doesn't support non-default column family.");
965
+ }
966
+ Status s = WriteBatchInternal::Delete(&batch_, column_family_id, key);
967
+ return s;
968
+ }
969
+
970
+ virtual Status DeleteRange(uint32_t column_family_id, const Slice& begin_key,
971
+ const Slice& end_key) {
972
+ if (column_family_id != default_cf_id_) {
973
+ return Status::NotSupported(
974
+ "Blob DB doesn't support non-default column family.");
975
+ }
976
+ Status s = WriteBatchInternal::DeleteRange(&batch_, column_family_id,
977
+ begin_key, end_key);
978
+ return s;
979
+ }
980
+
981
+ Status SingleDeleteCF(uint32_t /*column_family_id*/,
982
+ const Slice& /*key*/) override {
983
+ return Status::NotSupported("Not supported operation in blob db.");
984
+ }
985
+
986
+ Status MergeCF(uint32_t /*column_family_id*/, const Slice& /*key*/,
987
+ const Slice& /*value*/) override {
988
+ return Status::NotSupported("Not supported operation in blob db.");
989
+ }
990
+
991
+ void LogData(const Slice& blob) override { batch_.PutLogData(blob); }
992
+ };
993
+
994
+ Status BlobDBImpl::Write(const WriteOptions& options, WriteBatch* updates) {
995
+ StopWatch write_sw(env_, statistics_, BLOB_DB_WRITE_MICROS);
996
+ RecordTick(statistics_, BLOB_DB_NUM_WRITE);
997
+ uint32_t default_cf_id =
998
+ static_cast_with_check<ColumnFamilyHandleImpl>(DefaultColumnFamily())
999
+ ->GetID();
1000
+ Status s;
1001
+ BlobInserter blob_inserter(options, this, default_cf_id);
1002
+ {
1003
+ // Release write_mutex_ before DB write to avoid race condition with
1004
+ // flush begin listener, which also require write_mutex_ to sync
1005
+ // blob files.
1006
+ MutexLock l(&write_mutex_);
1007
+ s = updates->Iterate(&blob_inserter);
1008
+ }
1009
+ if (!s.ok()) {
1010
+ return s;
1011
+ }
1012
+ return db_->Write(options, blob_inserter.batch());
1013
+ }
1014
+
1015
+ Status BlobDBImpl::Put(const WriteOptions& options, const Slice& key,
1016
+ const Slice& value) {
1017
+ return PutUntil(options, key, value, kNoExpiration);
1018
+ }
1019
+
1020
+ Status BlobDBImpl::PutWithTTL(const WriteOptions& options,
1021
+ const Slice& key, const Slice& value,
1022
+ uint64_t ttl) {
1023
+ uint64_t now = EpochNow();
1024
+ uint64_t expiration = kNoExpiration - now > ttl ? now + ttl : kNoExpiration;
1025
+ return PutUntil(options, key, value, expiration);
1026
+ }
1027
+
1028
+ Status BlobDBImpl::PutUntil(const WriteOptions& options, const Slice& key,
1029
+ const Slice& value, uint64_t expiration) {
1030
+ StopWatch write_sw(env_, statistics_, BLOB_DB_WRITE_MICROS);
1031
+ RecordTick(statistics_, BLOB_DB_NUM_PUT);
1032
+ Status s;
1033
+ WriteBatch batch;
1034
+ {
1035
+ // Release write_mutex_ before DB write to avoid race condition with
1036
+ // flush begin listener, which also require write_mutex_ to sync
1037
+ // blob files.
1038
+ MutexLock l(&write_mutex_);
1039
+ s = PutBlobValue(options, key, value, expiration, &batch);
1040
+ }
1041
+ if (s.ok()) {
1042
+ s = db_->Write(options, &batch);
1043
+ }
1044
+ return s;
1045
+ }
1046
+
1047
+ Status BlobDBImpl::PutBlobValue(const WriteOptions& /*options*/,
1048
+ const Slice& key, const Slice& value,
1049
+ uint64_t expiration, WriteBatch* batch) {
1050
+ write_mutex_.AssertHeld();
1051
+ Status s;
1052
+ std::string index_entry;
1053
+ uint32_t column_family_id =
1054
+ static_cast_with_check<ColumnFamilyHandleImpl>(DefaultColumnFamily())
1055
+ ->GetID();
1056
+ if (value.size() < bdb_options_.min_blob_size) {
1057
+ if (expiration == kNoExpiration) {
1058
+ // Put as normal value
1059
+ s = batch->Put(key, value);
1060
+ RecordTick(statistics_, BLOB_DB_WRITE_INLINED);
1061
+ } else {
1062
+ // Inlined with TTL
1063
+ BlobIndex::EncodeInlinedTTL(&index_entry, expiration, value);
1064
+ s = WriteBatchInternal::PutBlobIndex(batch, column_family_id, key,
1065
+ index_entry);
1066
+ RecordTick(statistics_, BLOB_DB_WRITE_INLINED_TTL);
1067
+ }
1068
+ } else {
1069
+ std::string compression_output;
1070
+ Slice value_compressed = GetCompressedSlice(value, &compression_output);
1071
+
1072
+ std::string headerbuf;
1073
+ BlobLogWriter::ConstructBlobHeader(&headerbuf, key, value_compressed,
1074
+ expiration);
1075
+
1076
+ // Check DB size limit before selecting blob file to
1077
+ // Since CheckSizeAndEvictBlobFiles() can close blob files, it needs to be
1078
+ // done before calling SelectBlobFile().
1079
+ s = CheckSizeAndEvictBlobFiles(headerbuf.size() + key.size() +
1080
+ value_compressed.size());
1081
+ if (!s.ok()) {
1082
+ return s;
1083
+ }
1084
+
1085
+ std::shared_ptr<BlobFile> blob_file;
1086
+ if (expiration != kNoExpiration) {
1087
+ s = SelectBlobFileTTL(expiration, &blob_file);
1088
+ } else {
1089
+ s = SelectBlobFile(&blob_file);
1090
+ }
1091
+ if (s.ok()) {
1092
+ assert(blob_file != nullptr);
1093
+ assert(blob_file->GetCompressionType() == bdb_options_.compression);
1094
+ s = AppendBlob(blob_file, headerbuf, key, value_compressed, expiration,
1095
+ &index_entry);
1096
+ }
1097
+ if (s.ok()) {
1098
+ if (expiration != kNoExpiration) {
1099
+ WriteLock file_lock(&blob_file->mutex_);
1100
+ blob_file->ExtendExpirationRange(expiration);
1101
+ }
1102
+ s = CloseBlobFileIfNeeded(blob_file);
1103
+ }
1104
+ if (s.ok()) {
1105
+ s = WriteBatchInternal::PutBlobIndex(batch, column_family_id, key,
1106
+ index_entry);
1107
+ }
1108
+ if (s.ok()) {
1109
+ if (expiration == kNoExpiration) {
1110
+ RecordTick(statistics_, BLOB_DB_WRITE_BLOB);
1111
+ } else {
1112
+ RecordTick(statistics_, BLOB_DB_WRITE_BLOB_TTL);
1113
+ }
1114
+ } else {
1115
+ ROCKS_LOG_ERROR(
1116
+ db_options_.info_log,
1117
+ "Failed to append blob to FILE: %s: KEY: %s VALSZ: %" ROCKSDB_PRIszt
1118
+ " status: '%s' blob_file: '%s'",
1119
+ blob_file->PathName().c_str(), key.ToString().c_str(), value.size(),
1120
+ s.ToString().c_str(), blob_file->DumpState().c_str());
1121
+ }
1122
+ }
1123
+
1124
+ RecordTick(statistics_, BLOB_DB_NUM_KEYS_WRITTEN);
1125
+ RecordTick(statistics_, BLOB_DB_BYTES_WRITTEN, key.size() + value.size());
1126
+ RecordInHistogram(statistics_, BLOB_DB_KEY_SIZE, key.size());
1127
+ RecordInHistogram(statistics_, BLOB_DB_VALUE_SIZE, value.size());
1128
+
1129
+ return s;
1130
+ }
1131
+
1132
+ Slice BlobDBImpl::GetCompressedSlice(const Slice& raw,
1133
+ std::string* compression_output) const {
1134
+ if (bdb_options_.compression == kNoCompression) {
1135
+ return raw;
1136
+ }
1137
+ StopWatch compression_sw(env_, statistics_, BLOB_DB_COMPRESSION_MICROS);
1138
+ CompressionType type = bdb_options_.compression;
1139
+ CompressionOptions opts;
1140
+ CompressionContext context(type);
1141
+ CompressionInfo info(opts, context, CompressionDict::GetEmptyDict(), type,
1142
+ 0 /* sample_for_compression */);
1143
+ CompressBlock(raw, info, &type, kBlockBasedTableVersionFormat, false,
1144
+ compression_output, nullptr, nullptr);
1145
+ return *compression_output;
1146
+ }
1147
+
1148
+ Status BlobDBImpl::DecompressSlice(const Slice& compressed_value,
1149
+ CompressionType compression_type,
1150
+ PinnableSlice* value_output) const {
1151
+ assert(compression_type != kNoCompression);
1152
+
1153
+ BlockContents contents;
1154
+ auto cfh = static_cast<ColumnFamilyHandleImpl*>(DefaultColumnFamily());
1155
+
1156
+ {
1157
+ StopWatch decompression_sw(env_, statistics_, BLOB_DB_DECOMPRESSION_MICROS);
1158
+ UncompressionContext context(compression_type);
1159
+ UncompressionInfo info(context, UncompressionDict::GetEmptyDict(),
1160
+ compression_type);
1161
+ Status s = UncompressBlockContentsForCompressionType(
1162
+ info, compressed_value.data(), compressed_value.size(), &contents,
1163
+ kBlockBasedTableVersionFormat, *(cfh->cfd()->ioptions()));
1164
+ if (!s.ok()) {
1165
+ return Status::Corruption("Unable to decompress blob.");
1166
+ }
1167
+ }
1168
+
1169
+ value_output->PinSelf(contents.data);
1170
+
1171
+ return Status::OK();
1172
+ }
1173
+
1174
+ Status BlobDBImpl::CompactFiles(
1175
+ const CompactionOptions& compact_options,
1176
+ const std::vector<std::string>& input_file_names, const int output_level,
1177
+ const int output_path_id, std::vector<std::string>* const output_file_names,
1178
+ CompactionJobInfo* compaction_job_info) {
1179
+ // Note: we need CompactionJobInfo to be able to track updates to the
1180
+ // blob file <-> SST mappings, so we provide one if the user hasn't,
1181
+ // assuming that GC is enabled.
1182
+ CompactionJobInfo info{};
1183
+ if (bdb_options_.enable_garbage_collection && !compaction_job_info) {
1184
+ compaction_job_info = &info;
1185
+ }
1186
+
1187
+ const Status s =
1188
+ db_->CompactFiles(compact_options, input_file_names, output_level,
1189
+ output_path_id, output_file_names, compaction_job_info);
1190
+ if (!s.ok()) {
1191
+ return s;
1192
+ }
1193
+
1194
+ if (bdb_options_.enable_garbage_collection) {
1195
+ assert(compaction_job_info);
1196
+ ProcessCompactionJobInfo(*compaction_job_info);
1197
+ }
1198
+
1199
+ return s;
1200
+ }
1201
+
1202
+ void BlobDBImpl::GetCompactionContextCommon(BlobCompactionContext* context) {
1203
+ assert(context);
1204
+
1205
+ context->blob_db_impl = this;
1206
+ context->next_file_number = next_file_number_.load();
1207
+ context->current_blob_files.clear();
1208
+ for (auto& p : blob_files_) {
1209
+ context->current_blob_files.insert(p.first);
1210
+ }
1211
+ context->fifo_eviction_seq = fifo_eviction_seq_;
1212
+ context->evict_expiration_up_to = evict_expiration_up_to_;
1213
+ }
1214
+
1215
+ void BlobDBImpl::GetCompactionContext(BlobCompactionContext* context) {
1216
+ assert(context);
1217
+
1218
+ ReadLock l(&mutex_);
1219
+ GetCompactionContextCommon(context);
1220
+ }
1221
+
1222
+ void BlobDBImpl::GetCompactionContext(BlobCompactionContext* context,
1223
+ BlobCompactionContextGC* context_gc) {
1224
+ assert(context);
1225
+ assert(context_gc);
1226
+
1227
+ ReadLock l(&mutex_);
1228
+ GetCompactionContextCommon(context);
1229
+
1230
+ if (!live_imm_non_ttl_blob_files_.empty()) {
1231
+ auto it = live_imm_non_ttl_blob_files_.begin();
1232
+ std::advance(it, bdb_options_.garbage_collection_cutoff *
1233
+ live_imm_non_ttl_blob_files_.size());
1234
+ context_gc->cutoff_file_number = it != live_imm_non_ttl_blob_files_.end()
1235
+ ? it->first
1236
+ : std::numeric_limits<uint64_t>::max();
1237
+ }
1238
+ }
1239
+
1240
+ void BlobDBImpl::UpdateLiveSSTSize() {
1241
+ uint64_t live_sst_size = 0;
1242
+ bool ok = GetIntProperty(DB::Properties::kLiveSstFilesSize, &live_sst_size);
1243
+ if (ok) {
1244
+ live_sst_size_.store(live_sst_size);
1245
+ ROCKS_LOG_INFO(db_options_.info_log,
1246
+ "Updated total SST file size: %" PRIu64 " bytes.",
1247
+ live_sst_size);
1248
+ } else {
1249
+ ROCKS_LOG_ERROR(
1250
+ db_options_.info_log,
1251
+ "Failed to update total SST file size after flush or compaction.");
1252
+ }
1253
+ {
1254
+ // Trigger FIFO eviction if needed.
1255
+ MutexLock l(&write_mutex_);
1256
+ Status s = CheckSizeAndEvictBlobFiles(0, true /*force*/);
1257
+ if (s.IsNoSpace()) {
1258
+ ROCKS_LOG_WARN(db_options_.info_log,
1259
+ "DB grow out-of-space after SST size updated. Current live"
1260
+ " SST size: %" PRIu64
1261
+ " , current blob files size: %" PRIu64 ".",
1262
+ live_sst_size_.load(), total_blob_size_.load());
1263
+ }
1264
+ }
1265
+ }
1266
+
1267
+ Status BlobDBImpl::CheckSizeAndEvictBlobFiles(uint64_t blob_size,
1268
+ bool force_evict) {
1269
+ write_mutex_.AssertHeld();
1270
+
1271
+ uint64_t live_sst_size = live_sst_size_.load();
1272
+ if (bdb_options_.max_db_size == 0 ||
1273
+ live_sst_size + total_blob_size_.load() + blob_size <=
1274
+ bdb_options_.max_db_size) {
1275
+ return Status::OK();
1276
+ }
1277
+
1278
+ if (bdb_options_.is_fifo == false ||
1279
+ (!force_evict && live_sst_size + blob_size > bdb_options_.max_db_size)) {
1280
+ // FIFO eviction is disabled, or no space to insert new blob even we evict
1281
+ // all blob files.
1282
+ return Status::NoSpace(
1283
+ "Write failed, as writing it would exceed max_db_size limit.");
1284
+ }
1285
+
1286
+ std::vector<std::shared_ptr<BlobFile>> candidate_files;
1287
+ CopyBlobFiles(&candidate_files);
1288
+ std::sort(candidate_files.begin(), candidate_files.end(),
1289
+ BlobFileComparator());
1290
+ fifo_eviction_seq_ = GetLatestSequenceNumber();
1291
+
1292
+ WriteLock l(&mutex_);
1293
+
1294
+ while (!candidate_files.empty() &&
1295
+ live_sst_size + total_blob_size_.load() + blob_size >
1296
+ bdb_options_.max_db_size) {
1297
+ std::shared_ptr<BlobFile> blob_file = candidate_files.back();
1298
+ candidate_files.pop_back();
1299
+ WriteLock file_lock(&blob_file->mutex_);
1300
+ if (blob_file->Obsolete()) {
1301
+ // File already obsoleted by someone else.
1302
+ assert(blob_file->Immutable());
1303
+ continue;
1304
+ }
1305
+ // FIFO eviction can evict open blob files.
1306
+ if (!blob_file->Immutable()) {
1307
+ Status s = CloseBlobFile(blob_file);
1308
+ if (!s.ok()) {
1309
+ return s;
1310
+ }
1311
+ }
1312
+ assert(blob_file->Immutable());
1313
+ auto expiration_range = blob_file->GetExpirationRange();
1314
+ ROCKS_LOG_INFO(db_options_.info_log,
1315
+ "Evict oldest blob file since DB out of space. Current "
1316
+ "live SST file size: %" PRIu64 ", total blob size: %" PRIu64
1317
+ ", max db size: %" PRIu64 ", evicted blob file #%" PRIu64
1318
+ ".",
1319
+ live_sst_size, total_blob_size_.load(),
1320
+ bdb_options_.max_db_size, blob_file->BlobFileNumber());
1321
+ ObsoleteBlobFile(blob_file, fifo_eviction_seq_, true /*update_size*/);
1322
+ evict_expiration_up_to_ = expiration_range.first;
1323
+ RecordTick(statistics_, BLOB_DB_FIFO_NUM_FILES_EVICTED);
1324
+ RecordTick(statistics_, BLOB_DB_FIFO_NUM_KEYS_EVICTED,
1325
+ blob_file->BlobCount());
1326
+ RecordTick(statistics_, BLOB_DB_FIFO_BYTES_EVICTED,
1327
+ blob_file->GetFileSize());
1328
+ TEST_SYNC_POINT("BlobDBImpl::EvictOldestBlobFile:Evicted");
1329
+ }
1330
+ if (live_sst_size + total_blob_size_.load() + blob_size >
1331
+ bdb_options_.max_db_size) {
1332
+ return Status::NoSpace(
1333
+ "Write failed, as writing it would exceed max_db_size limit.");
1334
+ }
1335
+ return Status::OK();
1336
+ }
1337
+
1338
+ Status BlobDBImpl::AppendBlob(const std::shared_ptr<BlobFile>& bfile,
1339
+ const std::string& headerbuf, const Slice& key,
1340
+ const Slice& value, uint64_t expiration,
1341
+ std::string* index_entry) {
1342
+ Status s;
1343
+ uint64_t blob_offset = 0;
1344
+ uint64_t key_offset = 0;
1345
+ {
1346
+ WriteLock lockbfile_w(&bfile->mutex_);
1347
+ std::shared_ptr<BlobLogWriter> writer;
1348
+ s = CheckOrCreateWriterLocked(bfile, &writer);
1349
+ if (!s.ok()) {
1350
+ return s;
1351
+ }
1352
+
1353
+ // write the blob to the blob log.
1354
+ s = writer->EmitPhysicalRecord(headerbuf, key, value, &key_offset,
1355
+ &blob_offset);
1356
+ }
1357
+
1358
+ if (!s.ok()) {
1359
+ ROCKS_LOG_ERROR(db_options_.info_log,
1360
+ "Invalid status in AppendBlob: %s status: '%s'",
1361
+ bfile->PathName().c_str(), s.ToString().c_str());
1362
+ return s;
1363
+ }
1364
+
1365
+ uint64_t size_put = headerbuf.size() + key.size() + value.size();
1366
+ bfile->BlobRecordAdded(size_put);
1367
+ total_blob_size_ += size_put;
1368
+
1369
+ if (expiration == kNoExpiration) {
1370
+ BlobIndex::EncodeBlob(index_entry, bfile->BlobFileNumber(), blob_offset,
1371
+ value.size(), bdb_options_.compression);
1372
+ } else {
1373
+ BlobIndex::EncodeBlobTTL(index_entry, expiration, bfile->BlobFileNumber(),
1374
+ blob_offset, value.size(),
1375
+ bdb_options_.compression);
1376
+ }
1377
+
1378
+ return s;
1379
+ }
1380
+
1381
+ std::vector<Status> BlobDBImpl::MultiGet(
1382
+ const ReadOptions& read_options,
1383
+ const std::vector<Slice>& keys, std::vector<std::string>* values) {
1384
+ StopWatch multiget_sw(env_, statistics_, BLOB_DB_MULTIGET_MICROS);
1385
+ RecordTick(statistics_, BLOB_DB_NUM_MULTIGET);
1386
+ // Get a snapshot to avoid blob file get deleted between we
1387
+ // fetch and index entry and reading from the file.
1388
+ ReadOptions ro(read_options);
1389
+ bool snapshot_created = SetSnapshotIfNeeded(&ro);
1390
+
1391
+ std::vector<Status> statuses;
1392
+ statuses.reserve(keys.size());
1393
+ values->clear();
1394
+ values->reserve(keys.size());
1395
+ PinnableSlice value;
1396
+ for (size_t i = 0; i < keys.size(); i++) {
1397
+ statuses.push_back(Get(ro, DefaultColumnFamily(), keys[i], &value));
1398
+ values->push_back(value.ToString());
1399
+ value.Reset();
1400
+ }
1401
+ if (snapshot_created) {
1402
+ db_->ReleaseSnapshot(ro.snapshot);
1403
+ }
1404
+ return statuses;
1405
+ }
1406
+
1407
+ bool BlobDBImpl::SetSnapshotIfNeeded(ReadOptions* read_options) {
1408
+ assert(read_options != nullptr);
1409
+ if (read_options->snapshot != nullptr) {
1410
+ return false;
1411
+ }
1412
+ read_options->snapshot = db_->GetSnapshot();
1413
+ return true;
1414
+ }
1415
+
1416
+ Status BlobDBImpl::GetBlobValue(const Slice& key, const Slice& index_entry,
1417
+ PinnableSlice* value, uint64_t* expiration) {
1418
+ assert(value);
1419
+
1420
+ BlobIndex blob_index;
1421
+ Status s = blob_index.DecodeFrom(index_entry);
1422
+ if (!s.ok()) {
1423
+ return s;
1424
+ }
1425
+
1426
+ if (blob_index.HasTTL() && blob_index.expiration() <= EpochNow()) {
1427
+ return Status::NotFound("Key expired");
1428
+ }
1429
+
1430
+ if (expiration != nullptr) {
1431
+ if (blob_index.HasTTL()) {
1432
+ *expiration = blob_index.expiration();
1433
+ } else {
1434
+ *expiration = kNoExpiration;
1435
+ }
1436
+ }
1437
+
1438
+ if (blob_index.IsInlined()) {
1439
+ // TODO(yiwu): If index_entry is a PinnableSlice, we can also pin the same
1440
+ // memory buffer to avoid extra copy.
1441
+ value->PinSelf(blob_index.value());
1442
+ return Status::OK();
1443
+ }
1444
+
1445
+ CompressionType compression_type = kNoCompression;
1446
+ s = GetRawBlobFromFile(key, blob_index.file_number(), blob_index.offset(),
1447
+ blob_index.size(), value, &compression_type);
1448
+ if (!s.ok()) {
1449
+ return s;
1450
+ }
1451
+
1452
+ if (compression_type != kNoCompression) {
1453
+ s = DecompressSlice(*value, compression_type, value);
1454
+ if (!s.ok()) {
1455
+ if (debug_level_ >= 2) {
1456
+ ROCKS_LOG_ERROR(
1457
+ db_options_.info_log,
1458
+ "Uncompression error during blob read from file: %" PRIu64
1459
+ " blob_offset: %" PRIu64 " blob_size: %" PRIu64
1460
+ " key: %s status: '%s'",
1461
+ blob_index.file_number(), blob_index.offset(), blob_index.size(),
1462
+ key.ToString(/* output_hex */ true).c_str(), s.ToString().c_str());
1463
+ }
1464
+ return s;
1465
+ }
1466
+ }
1467
+
1468
+ return Status::OK();
1469
+ }
1470
+
1471
+ Status BlobDBImpl::GetRawBlobFromFile(const Slice& key, uint64_t file_number,
1472
+ uint64_t offset, uint64_t size,
1473
+ PinnableSlice* value,
1474
+ CompressionType* compression_type) {
1475
+ assert(value);
1476
+ assert(compression_type);
1477
+ assert(*compression_type == kNoCompression);
1478
+
1479
+ if (!size) {
1480
+ value->PinSelf("");
1481
+ return Status::OK();
1482
+ }
1483
+
1484
+ // offset has to have certain min, as we will read CRC
1485
+ // later from the Blob Header, which needs to be also a
1486
+ // valid offset.
1487
+ if (offset <
1488
+ (BlobLogHeader::kSize + BlobLogRecord::kHeaderSize + key.size())) {
1489
+ if (debug_level_ >= 2) {
1490
+ ROCKS_LOG_ERROR(db_options_.info_log,
1491
+ "Invalid blob index file_number: %" PRIu64
1492
+ " blob_offset: %" PRIu64 " blob_size: %" PRIu64
1493
+ " key: %s",
1494
+ file_number, offset, size,
1495
+ key.ToString(/* output_hex */ true).c_str());
1496
+ }
1497
+
1498
+ return Status::NotFound("Invalid blob offset");
1499
+ }
1500
+
1501
+ std::shared_ptr<BlobFile> blob_file;
1502
+
1503
+ {
1504
+ ReadLock rl(&mutex_);
1505
+ auto it = blob_files_.find(file_number);
1506
+
1507
+ // file was deleted
1508
+ if (it == blob_files_.end()) {
1509
+ return Status::NotFound("Blob Not Found as blob file missing");
1510
+ }
1511
+
1512
+ blob_file = it->second;
1513
+ }
1514
+
1515
+ *compression_type = blob_file->GetCompressionType();
1516
+
1517
+ // takes locks when called
1518
+ std::shared_ptr<RandomAccessFileReader> reader;
1519
+ Status s = GetBlobFileReader(blob_file, &reader);
1520
+ if (!s.ok()) {
1521
+ return s;
1522
+ }
1523
+
1524
+ assert(offset >= key.size() + sizeof(uint32_t));
1525
+ const uint64_t record_offset = offset - key.size() - sizeof(uint32_t);
1526
+ const uint64_t record_size = sizeof(uint32_t) + key.size() + size;
1527
+
1528
+ // Allocate the buffer. This is safe in C++11
1529
+ std::string buf;
1530
+ AlignedBuf aligned_buf;
1531
+
1532
+ // A partial blob record contain checksum, key and value.
1533
+ Slice blob_record;
1534
+
1535
+ {
1536
+ StopWatch read_sw(env_, statistics_, BLOB_DB_BLOB_FILE_READ_MICROS);
1537
+ if (reader->use_direct_io()) {
1538
+ s = reader->Read(IOOptions(), record_offset,
1539
+ static_cast<size_t>(record_size), &blob_record, nullptr,
1540
+ &aligned_buf);
1541
+ } else {
1542
+ buf.reserve(static_cast<size_t>(record_size));
1543
+ s = reader->Read(IOOptions(), record_offset,
1544
+ static_cast<size_t>(record_size), &blob_record, &buf[0],
1545
+ nullptr);
1546
+ }
1547
+ RecordTick(statistics_, BLOB_DB_BLOB_FILE_BYTES_READ, blob_record.size());
1548
+ }
1549
+
1550
+ if (!s.ok()) {
1551
+ ROCKS_LOG_DEBUG(
1552
+ db_options_.info_log,
1553
+ "Failed to read blob from blob file %" PRIu64 ", blob_offset: %" PRIu64
1554
+ ", blob_size: %" PRIu64 ", key_size: %" ROCKSDB_PRIszt ", status: '%s'",
1555
+ file_number, offset, size, key.size(), s.ToString().c_str());
1556
+ return s;
1557
+ }
1558
+
1559
+ if (blob_record.size() != record_size) {
1560
+ ROCKS_LOG_DEBUG(
1561
+ db_options_.info_log,
1562
+ "Failed to read blob from blob file %" PRIu64 ", blob_offset: %" PRIu64
1563
+ ", blob_size: %" PRIu64 ", key_size: %" ROCKSDB_PRIszt
1564
+ ", read %" ROCKSDB_PRIszt " bytes, expected %" PRIu64 " bytes",
1565
+ file_number, offset, size, key.size(), blob_record.size(), record_size);
1566
+
1567
+ return Status::Corruption("Failed to retrieve blob from blob index.");
1568
+ }
1569
+
1570
+ Slice crc_slice(blob_record.data(), sizeof(uint32_t));
1571
+ Slice blob_value(blob_record.data() + sizeof(uint32_t) + key.size(),
1572
+ static_cast<size_t>(size));
1573
+
1574
+ uint32_t crc_exp = 0;
1575
+ if (!GetFixed32(&crc_slice, &crc_exp)) {
1576
+ ROCKS_LOG_DEBUG(
1577
+ db_options_.info_log,
1578
+ "Unable to decode CRC from blob file %" PRIu64 ", blob_offset: %" PRIu64
1579
+ ", blob_size: %" PRIu64 ", key size: %" ROCKSDB_PRIszt ", status: '%s'",
1580
+ file_number, offset, size, key.size(), s.ToString().c_str());
1581
+ return Status::Corruption("Unable to decode checksum.");
1582
+ }
1583
+
1584
+ uint32_t crc = crc32c::Value(blob_record.data() + sizeof(uint32_t),
1585
+ blob_record.size() - sizeof(uint32_t));
1586
+ crc = crc32c::Mask(crc); // Adjust for storage
1587
+ if (crc != crc_exp) {
1588
+ if (debug_level_ >= 2) {
1589
+ ROCKS_LOG_ERROR(
1590
+ db_options_.info_log,
1591
+ "Blob crc mismatch file: %" PRIu64 " blob_offset: %" PRIu64
1592
+ " blob_size: %" PRIu64 " key: %s status: '%s'",
1593
+ file_number, offset, size,
1594
+ key.ToString(/* output_hex */ true).c_str(), s.ToString().c_str());
1595
+ }
1596
+
1597
+ return Status::Corruption("Corruption. Blob CRC mismatch");
1598
+ }
1599
+
1600
+ value->PinSelf(blob_value);
1601
+
1602
+ return Status::OK();
1603
+ }
1604
+
1605
+ Status BlobDBImpl::Get(const ReadOptions& read_options,
1606
+ ColumnFamilyHandle* column_family, const Slice& key,
1607
+ PinnableSlice* value) {
1608
+ return Get(read_options, column_family, key, value,
1609
+ static_cast<uint64_t*>(nullptr) /*expiration*/);
1610
+ }
1611
+
1612
+ Status BlobDBImpl::Get(const ReadOptions& read_options,
1613
+ ColumnFamilyHandle* column_family, const Slice& key,
1614
+ PinnableSlice* value, uint64_t* expiration) {
1615
+ StopWatch get_sw(env_, statistics_, BLOB_DB_GET_MICROS);
1616
+ RecordTick(statistics_, BLOB_DB_NUM_GET);
1617
+ return GetImpl(read_options, column_family, key, value, expiration);
1618
+ }
1619
+
1620
+ Status BlobDBImpl::GetImpl(const ReadOptions& read_options,
1621
+ ColumnFamilyHandle* column_family, const Slice& key,
1622
+ PinnableSlice* value, uint64_t* expiration) {
1623
+ if (column_family->GetID() != DefaultColumnFamily()->GetID()) {
1624
+ return Status::NotSupported(
1625
+ "Blob DB doesn't support non-default column family.");
1626
+ }
1627
+ // Get a snapshot to avoid blob file get deleted between we
1628
+ // fetch and index entry and reading from the file.
1629
+ // TODO(yiwu): For Get() retry if file not found would be a simpler strategy.
1630
+ ReadOptions ro(read_options);
1631
+ bool snapshot_created = SetSnapshotIfNeeded(&ro);
1632
+
1633
+ PinnableSlice index_entry;
1634
+ Status s;
1635
+ bool is_blob_index = false;
1636
+ DBImpl::GetImplOptions get_impl_options;
1637
+ get_impl_options.column_family = column_family;
1638
+ get_impl_options.value = &index_entry;
1639
+ get_impl_options.is_blob_index = &is_blob_index;
1640
+ s = db_impl_->GetImpl(ro, key, get_impl_options);
1641
+ if (expiration != nullptr) {
1642
+ *expiration = kNoExpiration;
1643
+ }
1644
+ RecordTick(statistics_, BLOB_DB_NUM_KEYS_READ);
1645
+ if (s.ok()) {
1646
+ if (is_blob_index) {
1647
+ s = GetBlobValue(key, index_entry, value, expiration);
1648
+ } else {
1649
+ // The index entry is the value itself in this case.
1650
+ value->PinSelf(index_entry);
1651
+ }
1652
+ RecordTick(statistics_, BLOB_DB_BYTES_READ, value->size());
1653
+ }
1654
+ if (snapshot_created) {
1655
+ db_->ReleaseSnapshot(ro.snapshot);
1656
+ }
1657
+ return s;
1658
+ }
1659
+
1660
+ std::pair<bool, int64_t> BlobDBImpl::SanityCheck(bool aborted) {
1661
+ if (aborted) {
1662
+ return std::make_pair(false, -1);
1663
+ }
1664
+
1665
+ ReadLock rl(&mutex_);
1666
+
1667
+ ROCKS_LOG_INFO(db_options_.info_log, "Starting Sanity Check");
1668
+ ROCKS_LOG_INFO(db_options_.info_log, "Number of files %" ROCKSDB_PRIszt,
1669
+ blob_files_.size());
1670
+ ROCKS_LOG_INFO(db_options_.info_log, "Number of open files %" ROCKSDB_PRIszt,
1671
+ open_ttl_files_.size());
1672
+
1673
+ for (const auto& blob_file : open_ttl_files_) {
1674
+ (void)blob_file;
1675
+ assert(!blob_file->Immutable());
1676
+ }
1677
+
1678
+ for (const auto& pair : live_imm_non_ttl_blob_files_) {
1679
+ const auto& blob_file = pair.second;
1680
+ (void)blob_file;
1681
+ assert(!blob_file->HasTTL());
1682
+ assert(blob_file->Immutable());
1683
+ }
1684
+
1685
+ uint64_t now = EpochNow();
1686
+
1687
+ for (auto blob_file_pair : blob_files_) {
1688
+ auto blob_file = blob_file_pair.second;
1689
+ std::ostringstream buf;
1690
+
1691
+ buf << "Blob file " << blob_file->BlobFileNumber() << ", size "
1692
+ << blob_file->GetFileSize() << ", blob count " << blob_file->BlobCount()
1693
+ << ", immutable " << blob_file->Immutable();
1694
+
1695
+ if (blob_file->HasTTL()) {
1696
+ ExpirationRange expiration_range;
1697
+ {
1698
+ ReadLock file_lock(&blob_file->mutex_);
1699
+ expiration_range = blob_file->GetExpirationRange();
1700
+ }
1701
+ buf << ", expiration range (" << expiration_range.first << ", "
1702
+ << expiration_range.second << ")";
1703
+
1704
+ if (!blob_file->Obsolete()) {
1705
+ buf << ", expire in " << (expiration_range.second - now) << "seconds";
1706
+ }
1707
+ }
1708
+ if (blob_file->Obsolete()) {
1709
+ buf << ", obsolete at " << blob_file->GetObsoleteSequence();
1710
+ }
1711
+ buf << ".";
1712
+ ROCKS_LOG_INFO(db_options_.info_log, "%s", buf.str().c_str());
1713
+ }
1714
+
1715
+ // reschedule
1716
+ return std::make_pair(true, -1);
1717
+ }
1718
+
1719
+ Status BlobDBImpl::CloseBlobFile(std::shared_ptr<BlobFile> bfile) {
1720
+ TEST_SYNC_POINT("BlobDBImpl::CloseBlobFile");
1721
+ assert(bfile);
1722
+ assert(!bfile->Immutable());
1723
+ assert(!bfile->Obsolete());
1724
+
1725
+ if (bfile->HasTTL() || bfile == open_non_ttl_file_) {
1726
+ write_mutex_.AssertHeld();
1727
+ }
1728
+
1729
+ ROCKS_LOG_INFO(db_options_.info_log,
1730
+ "Closing blob file %" PRIu64 ". Path: %s",
1731
+ bfile->BlobFileNumber(), bfile->PathName().c_str());
1732
+
1733
+ const SequenceNumber sequence = GetLatestSequenceNumber();
1734
+
1735
+ const Status s = bfile->WriteFooterAndCloseLocked(sequence);
1736
+
1737
+ if (s.ok()) {
1738
+ total_blob_size_ += BlobLogFooter::kSize;
1739
+ } else {
1740
+ bfile->MarkImmutable(sequence);
1741
+
1742
+ ROCKS_LOG_ERROR(db_options_.info_log,
1743
+ "Failed to close blob file %" PRIu64 "with error: %s",
1744
+ bfile->BlobFileNumber(), s.ToString().c_str());
1745
+ }
1746
+
1747
+ if (bfile->HasTTL()) {
1748
+ size_t erased __attribute__((__unused__));
1749
+ erased = open_ttl_files_.erase(bfile);
1750
+ } else {
1751
+ if (bfile == open_non_ttl_file_) {
1752
+ open_non_ttl_file_ = nullptr;
1753
+ }
1754
+
1755
+ const uint64_t blob_file_number = bfile->BlobFileNumber();
1756
+ auto it = live_imm_non_ttl_blob_files_.lower_bound(blob_file_number);
1757
+ assert(it == live_imm_non_ttl_blob_files_.end() ||
1758
+ it->first != blob_file_number);
1759
+ live_imm_non_ttl_blob_files_.insert(
1760
+ it, std::map<uint64_t, std::shared_ptr<BlobFile>>::value_type(
1761
+ blob_file_number, bfile));
1762
+ }
1763
+
1764
+ return s;
1765
+ }
1766
+
1767
+ Status BlobDBImpl::CloseBlobFileIfNeeded(std::shared_ptr<BlobFile>& bfile) {
1768
+ write_mutex_.AssertHeld();
1769
+
1770
+ // atomic read
1771
+ if (bfile->GetFileSize() < bdb_options_.blob_file_size) {
1772
+ return Status::OK();
1773
+ }
1774
+
1775
+ WriteLock lock(&mutex_);
1776
+ WriteLock file_lock(&bfile->mutex_);
1777
+
1778
+ assert(!bfile->Obsolete() || bfile->Immutable());
1779
+ if (bfile->Immutable()) {
1780
+ return Status::OK();
1781
+ }
1782
+
1783
+ return CloseBlobFile(bfile);
1784
+ }
1785
+
1786
+ void BlobDBImpl::ObsoleteBlobFile(std::shared_ptr<BlobFile> blob_file,
1787
+ SequenceNumber obsolete_seq,
1788
+ bool update_size) {
1789
+ assert(blob_file->Immutable());
1790
+ assert(!blob_file->Obsolete());
1791
+
1792
+ // Should hold write lock of mutex_ or during DB open.
1793
+ blob_file->MarkObsolete(obsolete_seq);
1794
+ obsolete_files_.push_back(blob_file);
1795
+ assert(total_blob_size_.load() >= blob_file->GetFileSize());
1796
+ if (update_size) {
1797
+ total_blob_size_ -= blob_file->GetFileSize();
1798
+ }
1799
+ }
1800
+
1801
+ bool BlobDBImpl::VisibleToActiveSnapshot(
1802
+ const std::shared_ptr<BlobFile>& bfile) {
1803
+ assert(bfile->Obsolete());
1804
+
1805
+ // We check whether the oldest snapshot is no less than the last sequence
1806
+ // by the time the blob file become obsolete. If so, the blob file is not
1807
+ // visible to all existing snapshots.
1808
+ //
1809
+ // If we keep track of the earliest sequence of the keys in the blob file,
1810
+ // we could instead check if there's a snapshot falls in range
1811
+ // [earliest_sequence, obsolete_sequence). But doing so will make the
1812
+ // implementation more complicated.
1813
+ SequenceNumber obsolete_sequence = bfile->GetObsoleteSequence();
1814
+ SequenceNumber oldest_snapshot = kMaxSequenceNumber;
1815
+ {
1816
+ // Need to lock DBImpl mutex before access snapshot list.
1817
+ InstrumentedMutexLock l(db_impl_->mutex());
1818
+ auto& snapshots = db_impl_->snapshots();
1819
+ if (!snapshots.empty()) {
1820
+ oldest_snapshot = snapshots.oldest()->GetSequenceNumber();
1821
+ }
1822
+ }
1823
+ bool visible = oldest_snapshot < obsolete_sequence;
1824
+ if (visible) {
1825
+ ROCKS_LOG_INFO(db_options_.info_log,
1826
+ "Obsolete blob file %" PRIu64 " (obsolete at %" PRIu64
1827
+ ") visible to oldest snapshot %" PRIu64 ".",
1828
+ bfile->BlobFileNumber(), obsolete_sequence, oldest_snapshot);
1829
+ }
1830
+ return visible;
1831
+ }
1832
+
1833
+ std::pair<bool, int64_t> BlobDBImpl::EvictExpiredFiles(bool aborted) {
1834
+ if (aborted) {
1835
+ return std::make_pair(false, -1);
1836
+ }
1837
+
1838
+ TEST_SYNC_POINT("BlobDBImpl::EvictExpiredFiles:0");
1839
+ TEST_SYNC_POINT("BlobDBImpl::EvictExpiredFiles:1");
1840
+
1841
+ std::vector<std::shared_ptr<BlobFile>> process_files;
1842
+ uint64_t now = EpochNow();
1843
+ {
1844
+ ReadLock rl(&mutex_);
1845
+ for (auto p : blob_files_) {
1846
+ auto& blob_file = p.second;
1847
+ ReadLock file_lock(&blob_file->mutex_);
1848
+ if (blob_file->HasTTL() && !blob_file->Obsolete() &&
1849
+ blob_file->GetExpirationRange().second <= now) {
1850
+ process_files.push_back(blob_file);
1851
+ }
1852
+ }
1853
+ }
1854
+
1855
+ TEST_SYNC_POINT("BlobDBImpl::EvictExpiredFiles:2");
1856
+ TEST_SYNC_POINT("BlobDBImpl::EvictExpiredFiles:3");
1857
+ TEST_SYNC_POINT_CALLBACK("BlobDBImpl::EvictExpiredFiles:cb", nullptr);
1858
+
1859
+ SequenceNumber seq = GetLatestSequenceNumber();
1860
+ {
1861
+ MutexLock l(&write_mutex_);
1862
+ WriteLock lock(&mutex_);
1863
+ for (auto& blob_file : process_files) {
1864
+ WriteLock file_lock(&blob_file->mutex_);
1865
+
1866
+ // Need to double check if the file is obsolete.
1867
+ if (blob_file->Obsolete()) {
1868
+ assert(blob_file->Immutable());
1869
+ continue;
1870
+ }
1871
+
1872
+ if (!blob_file->Immutable()) {
1873
+ CloseBlobFile(blob_file);
1874
+ }
1875
+
1876
+ assert(blob_file->Immutable());
1877
+
1878
+ ObsoleteBlobFile(blob_file, seq, true /*update_size*/);
1879
+ }
1880
+ }
1881
+
1882
+ return std::make_pair(true, -1);
1883
+ }
1884
+
1885
+ Status BlobDBImpl::SyncBlobFiles() {
1886
+ MutexLock l(&write_mutex_);
1887
+
1888
+ std::vector<std::shared_ptr<BlobFile>> process_files;
1889
+ {
1890
+ ReadLock rl(&mutex_);
1891
+ for (auto fitr : open_ttl_files_) {
1892
+ process_files.push_back(fitr);
1893
+ }
1894
+ if (open_non_ttl_file_ != nullptr) {
1895
+ process_files.push_back(open_non_ttl_file_);
1896
+ }
1897
+ }
1898
+
1899
+ Status s;
1900
+ for (auto& blob_file : process_files) {
1901
+ s = blob_file->Fsync();
1902
+ if (!s.ok()) {
1903
+ ROCKS_LOG_ERROR(db_options_.info_log,
1904
+ "Failed to sync blob file %" PRIu64 ", status: %s",
1905
+ blob_file->BlobFileNumber(), s.ToString().c_str());
1906
+ return s;
1907
+ }
1908
+ }
1909
+
1910
+ s = dir_ent_->Fsync();
1911
+ if (!s.ok()) {
1912
+ ROCKS_LOG_ERROR(db_options_.info_log,
1913
+ "Failed to sync blob directory, status: %s",
1914
+ s.ToString().c_str());
1915
+ }
1916
+ return s;
1917
+ }
1918
+
1919
+ std::pair<bool, int64_t> BlobDBImpl::ReclaimOpenFiles(bool aborted) {
1920
+ if (aborted) return std::make_pair(false, -1);
1921
+
1922
+ if (open_file_count_.load() < kOpenFilesTrigger) {
1923
+ return std::make_pair(true, -1);
1924
+ }
1925
+
1926
+ // in the future, we should sort by last_access_
1927
+ // instead of closing every file
1928
+ ReadLock rl(&mutex_);
1929
+ for (auto const& ent : blob_files_) {
1930
+ auto bfile = ent.second;
1931
+ if (bfile->last_access_.load() == -1) continue;
1932
+
1933
+ WriteLock lockbfile_w(&bfile->mutex_);
1934
+ CloseRandomAccessLocked(bfile);
1935
+ }
1936
+
1937
+ return std::make_pair(true, -1);
1938
+ }
1939
+
1940
+ std::pair<bool, int64_t> BlobDBImpl::DeleteObsoleteFiles(bool aborted) {
1941
+ if (aborted) {
1942
+ return std::make_pair(false, -1);
1943
+ }
1944
+
1945
+ MutexLock delete_file_lock(&delete_file_mutex_);
1946
+ if (disable_file_deletions_ > 0) {
1947
+ return std::make_pair(true, -1);
1948
+ }
1949
+
1950
+ std::list<std::shared_ptr<BlobFile>> tobsolete;
1951
+ {
1952
+ WriteLock wl(&mutex_);
1953
+ if (obsolete_files_.empty()) {
1954
+ return std::make_pair(true, -1);
1955
+ }
1956
+ tobsolete.swap(obsolete_files_);
1957
+ }
1958
+
1959
+ bool file_deleted = false;
1960
+ for (auto iter = tobsolete.begin(); iter != tobsolete.end();) {
1961
+ auto bfile = *iter;
1962
+ {
1963
+ ReadLock lockbfile_r(&bfile->mutex_);
1964
+ if (VisibleToActiveSnapshot(bfile)) {
1965
+ ROCKS_LOG_INFO(db_options_.info_log,
1966
+ "Could not delete file due to snapshot failure %s",
1967
+ bfile->PathName().c_str());
1968
+ ++iter;
1969
+ continue;
1970
+ }
1971
+ }
1972
+ ROCKS_LOG_INFO(db_options_.info_log,
1973
+ "Will delete file due to snapshot success %s",
1974
+ bfile->PathName().c_str());
1975
+
1976
+ {
1977
+ WriteLock wl(&mutex_);
1978
+ blob_files_.erase(bfile->BlobFileNumber());
1979
+ }
1980
+
1981
+ Status s = DeleteDBFile(&(db_impl_->immutable_db_options()),
1982
+ bfile->PathName(), blob_dir_, true,
1983
+ /*force_fg=*/false);
1984
+ if (!s.ok()) {
1985
+ ROCKS_LOG_ERROR(db_options_.info_log,
1986
+ "File failed to be deleted as obsolete %s",
1987
+ bfile->PathName().c_str());
1988
+ ++iter;
1989
+ continue;
1990
+ }
1991
+
1992
+ file_deleted = true;
1993
+ ROCKS_LOG_INFO(db_options_.info_log,
1994
+ "File deleted as obsolete from blob dir %s",
1995
+ bfile->PathName().c_str());
1996
+
1997
+ iter = tobsolete.erase(iter);
1998
+ }
1999
+
2000
+ // directory change. Fsync
2001
+ if (file_deleted) {
2002
+ Status s = dir_ent_->Fsync();
2003
+ if (!s.ok()) {
2004
+ ROCKS_LOG_ERROR(db_options_.info_log, "Failed to sync dir %s: %s",
2005
+ blob_dir_.c_str(), s.ToString().c_str());
2006
+ }
2007
+ }
2008
+
2009
+ // put files back into obsolete if for some reason, delete failed
2010
+ if (!tobsolete.empty()) {
2011
+ WriteLock wl(&mutex_);
2012
+ for (auto bfile : tobsolete) {
2013
+ blob_files_.insert(std::make_pair(bfile->BlobFileNumber(), bfile));
2014
+ obsolete_files_.push_front(bfile);
2015
+ }
2016
+ }
2017
+
2018
+ return std::make_pair(!aborted, -1);
2019
+ }
2020
+
2021
+ void BlobDBImpl::CopyBlobFiles(
2022
+ std::vector<std::shared_ptr<BlobFile>>* bfiles_copy) {
2023
+ ReadLock rl(&mutex_);
2024
+ for (auto const& p : blob_files_) {
2025
+ bfiles_copy->push_back(p.second);
2026
+ }
2027
+ }
2028
+
2029
+ Iterator* BlobDBImpl::NewIterator(const ReadOptions& read_options) {
2030
+ auto* cfd =
2031
+ static_cast_with_check<ColumnFamilyHandleImpl>(DefaultColumnFamily())
2032
+ ->cfd();
2033
+ // Get a snapshot to avoid blob file get deleted between we
2034
+ // fetch and index entry and reading from the file.
2035
+ ManagedSnapshot* own_snapshot = nullptr;
2036
+ const Snapshot* snapshot = read_options.snapshot;
2037
+ if (snapshot == nullptr) {
2038
+ own_snapshot = new ManagedSnapshot(db_);
2039
+ snapshot = own_snapshot->snapshot();
2040
+ }
2041
+ auto* iter = db_impl_->NewIteratorImpl(
2042
+ read_options, cfd, snapshot->GetSequenceNumber(),
2043
+ nullptr /*read_callback*/, true /*expose_blob_index*/);
2044
+ return new BlobDBIterator(own_snapshot, iter, this, env_, statistics_);
2045
+ }
2046
+
2047
+ Status DestroyBlobDB(const std::string& dbname, const Options& options,
2048
+ const BlobDBOptions& bdb_options) {
2049
+ const ImmutableDBOptions soptions(SanitizeOptions(dbname, options));
2050
+ Env* env = soptions.env;
2051
+
2052
+ Status status;
2053
+ std::string blobdir;
2054
+ blobdir = (bdb_options.path_relative) ? dbname + "/" + bdb_options.blob_dir
2055
+ : bdb_options.blob_dir;
2056
+
2057
+ std::vector<std::string> filenames;
2058
+ if (env->GetChildren(blobdir, &filenames).ok()) {
2059
+ for (const auto& f : filenames) {
2060
+ uint64_t number;
2061
+ FileType type;
2062
+ if (ParseFileName(f, &number, &type) && type == kBlobFile) {
2063
+ Status del = DeleteDBFile(&soptions, blobdir + "/" + f, blobdir, true,
2064
+ /*force_fg=*/false);
2065
+ if (status.ok() && !del.ok()) {
2066
+ status = del;
2067
+ }
2068
+ }
2069
+ }
2070
+ // TODO: What to do if we cannot delete the directory?
2071
+ env->DeleteDir(blobdir).PermitUncheckedError();
2072
+ }
2073
+ Status destroy = DestroyDB(dbname, options);
2074
+ if (status.ok() && !destroy.ok()) {
2075
+ status = destroy;
2076
+ }
2077
+
2078
+ return status;
2079
+ }
2080
+
2081
+ #ifndef NDEBUG
2082
+ Status BlobDBImpl::TEST_GetBlobValue(const Slice& key, const Slice& index_entry,
2083
+ PinnableSlice* value) {
2084
+ return GetBlobValue(key, index_entry, value);
2085
+ }
2086
+
2087
+ void BlobDBImpl::TEST_AddDummyBlobFile(uint64_t blob_file_number,
2088
+ SequenceNumber immutable_sequence) {
2089
+ auto blob_file = std::make_shared<BlobFile>(this, blob_dir_, blob_file_number,
2090
+ db_options_.info_log.get());
2091
+ blob_file->MarkImmutable(immutable_sequence);
2092
+
2093
+ blob_files_[blob_file_number] = blob_file;
2094
+ live_imm_non_ttl_blob_files_[blob_file_number] = blob_file;
2095
+ }
2096
+
2097
+ std::vector<std::shared_ptr<BlobFile>> BlobDBImpl::TEST_GetBlobFiles() const {
2098
+ ReadLock l(&mutex_);
2099
+ std::vector<std::shared_ptr<BlobFile>> blob_files;
2100
+ for (auto& p : blob_files_) {
2101
+ blob_files.emplace_back(p.second);
2102
+ }
2103
+ return blob_files;
2104
+ }
2105
+
2106
+ std::vector<std::shared_ptr<BlobFile>> BlobDBImpl::TEST_GetLiveImmNonTTLFiles()
2107
+ const {
2108
+ ReadLock l(&mutex_);
2109
+ std::vector<std::shared_ptr<BlobFile>> live_imm_non_ttl_files;
2110
+ for (const auto& pair : live_imm_non_ttl_blob_files_) {
2111
+ live_imm_non_ttl_files.emplace_back(pair.second);
2112
+ }
2113
+ return live_imm_non_ttl_files;
2114
+ }
2115
+
2116
+ std::vector<std::shared_ptr<BlobFile>> BlobDBImpl::TEST_GetObsoleteFiles()
2117
+ const {
2118
+ ReadLock l(&mutex_);
2119
+ std::vector<std::shared_ptr<BlobFile>> obsolete_files;
2120
+ for (auto& bfile : obsolete_files_) {
2121
+ obsolete_files.emplace_back(bfile);
2122
+ }
2123
+ return obsolete_files;
2124
+ }
2125
+
2126
+ void BlobDBImpl::TEST_DeleteObsoleteFiles() {
2127
+ DeleteObsoleteFiles(false /*abort*/);
2128
+ }
2129
+
2130
+ Status BlobDBImpl::TEST_CloseBlobFile(std::shared_ptr<BlobFile>& bfile) {
2131
+ MutexLock l(&write_mutex_);
2132
+ WriteLock lock(&mutex_);
2133
+ WriteLock file_lock(&bfile->mutex_);
2134
+
2135
+ return CloseBlobFile(bfile);
2136
+ }
2137
+
2138
+ void BlobDBImpl::TEST_ObsoleteBlobFile(std::shared_ptr<BlobFile>& blob_file,
2139
+ SequenceNumber obsolete_seq,
2140
+ bool update_size) {
2141
+ return ObsoleteBlobFile(blob_file, obsolete_seq, update_size);
2142
+ }
2143
+
2144
+ void BlobDBImpl::TEST_EvictExpiredFiles() {
2145
+ EvictExpiredFiles(false /*abort*/);
2146
+ }
2147
+
2148
+ uint64_t BlobDBImpl::TEST_live_sst_size() { return live_sst_size_.load(); }
2149
+
2150
+ void BlobDBImpl::TEST_InitializeBlobFileToSstMapping(
2151
+ const std::vector<LiveFileMetaData>& live_files) {
2152
+ InitializeBlobFileToSstMapping(live_files);
2153
+ }
2154
+
2155
+ void BlobDBImpl::TEST_ProcessFlushJobInfo(const FlushJobInfo& info) {
2156
+ ProcessFlushJobInfo(info);
2157
+ }
2158
+
2159
+ void BlobDBImpl::TEST_ProcessCompactionJobInfo(const CompactionJobInfo& info) {
2160
+ ProcessCompactionJobInfo(info);
2161
+ }
2162
+
2163
+ #endif // !NDEBUG
2164
+
2165
+ } // namespace blob_db
2166
+ } // namespace ROCKSDB_NAMESPACE
2167
+ #endif // ROCKSDB_LITE