@nxtedition/rocksdb 7.1.14 → 7.1.16

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 (223) hide show
  1. package/binding.cc +1 -0
  2. package/deps/rocksdb/rocksdb/CMakeLists.txt +72 -18
  3. package/deps/rocksdb/rocksdb/Makefile +91 -11
  4. package/deps/rocksdb/rocksdb/TARGETS +8 -4
  5. package/deps/rocksdb/rocksdb/cache/cache.cc +5 -0
  6. package/deps/rocksdb/rocksdb/cache/cache_bench_tool.cc +13 -8
  7. package/deps/rocksdb/rocksdb/cache/cache_entry_roles.cc +2 -0
  8. package/deps/rocksdb/rocksdb/cache/cache_test.cc +116 -57
  9. package/deps/rocksdb/rocksdb/cache/clock_cache.cc +958 -459
  10. package/deps/rocksdb/rocksdb/cache/clock_cache.h +407 -622
  11. package/deps/rocksdb/rocksdb/cache/compressed_secondary_cache.cc +104 -40
  12. package/deps/rocksdb/rocksdb/cache/compressed_secondary_cache.h +23 -8
  13. package/deps/rocksdb/rocksdb/cache/compressed_secondary_cache_test.cc +350 -184
  14. package/deps/rocksdb/rocksdb/cache/fast_lru_cache.cc +12 -2
  15. package/deps/rocksdb/rocksdb/cache/fast_lru_cache.h +2 -0
  16. package/deps/rocksdb/rocksdb/cache/lru_cache.cc +130 -43
  17. package/deps/rocksdb/rocksdb/cache/lru_cache.h +24 -2
  18. package/deps/rocksdb/rocksdb/cache/lru_cache_test.cc +423 -98
  19. package/deps/rocksdb/rocksdb/cache/sharded_cache.cc +19 -2
  20. package/deps/rocksdb/rocksdb/cache/sharded_cache.h +10 -7
  21. package/deps/rocksdb/rocksdb/crash_test.mk +2 -2
  22. package/deps/rocksdb/rocksdb/db/arena_wrapped_db_iter.cc +46 -26
  23. package/deps/rocksdb/rocksdb/db/arena_wrapped_db_iter.h +9 -3
  24. package/deps/rocksdb/rocksdb/db/blob/blob_contents.cc +90 -0
  25. package/deps/rocksdb/rocksdb/db/blob/blob_contents.h +56 -0
  26. package/deps/rocksdb/rocksdb/db/blob/blob_file_builder.cc +23 -10
  27. package/deps/rocksdb/rocksdb/db/blob/blob_file_reader.cc +64 -59
  28. package/deps/rocksdb/rocksdb/db/blob/blob_file_reader.h +11 -8
  29. package/deps/rocksdb/rocksdb/db/blob/blob_file_reader_test.cc +92 -62
  30. package/deps/rocksdb/rocksdb/db/blob/blob_source.cc +159 -136
  31. package/deps/rocksdb/rocksdb/db/blob/blob_source.h +13 -13
  32. package/deps/rocksdb/rocksdb/db/blob/blob_source_test.cc +129 -57
  33. package/deps/rocksdb/rocksdb/db/blob/db_blob_basic_test.cc +81 -3
  34. package/deps/rocksdb/rocksdb/db/c.cc +29 -0
  35. package/deps/rocksdb/rocksdb/db/column_family.cc +10 -1
  36. package/deps/rocksdb/rocksdb/db/column_family_test.cc +21 -0
  37. package/deps/rocksdb/rocksdb/db/compaction/compaction_job.cc +42 -36
  38. package/deps/rocksdb/rocksdb/db/compaction/compaction_job_test.cc +344 -102
  39. package/deps/rocksdb/rocksdb/db/compaction/compaction_outputs.cc +163 -28
  40. package/deps/rocksdb/rocksdb/db/compaction/compaction_outputs.h +52 -17
  41. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker.cc +35 -30
  42. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_level.cc +8 -3
  43. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_test.cc +167 -11
  44. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_universal.cc +8 -8
  45. package/deps/rocksdb/rocksdb/db/compaction/compaction_service_test.cc +10 -13
  46. package/deps/rocksdb/rocksdb/db/compaction/subcompaction_state.cc +0 -117
  47. package/deps/rocksdb/rocksdb/db/compaction/subcompaction_state.h +6 -49
  48. package/deps/rocksdb/rocksdb/db/db_basic_test.cc +29 -4
  49. package/deps/rocksdb/rocksdb/db/db_block_cache_test.cc +18 -11
  50. package/deps/rocksdb/rocksdb/db/db_compaction_filter_test.cc +4 -10
  51. package/deps/rocksdb/rocksdb/db/db_impl/compacted_db_impl.cc +1 -1
  52. package/deps/rocksdb/rocksdb/db/db_impl/compacted_db_impl.h +12 -0
  53. package/deps/rocksdb/rocksdb/db/db_impl/db_impl.cc +144 -93
  54. package/deps/rocksdb/rocksdb/db/db_impl/db_impl.h +28 -32
  55. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_compaction_flush.cc +1 -1
  56. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_debug.cc +5 -9
  57. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_open.cc +2 -33
  58. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_readonly.cc +3 -5
  59. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_readonly.h +11 -0
  60. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_secondary.cc +1 -2
  61. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_secondary.h +8 -0
  62. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_write.cc +2 -1
  63. package/deps/rocksdb/rocksdb/db/db_iter.cc +76 -138
  64. package/deps/rocksdb/rocksdb/db/db_iter.h +26 -23
  65. package/deps/rocksdb/rocksdb/db/db_properties_test.cc +1 -1
  66. package/deps/rocksdb/rocksdb/db/db_range_del_test.cc +931 -0
  67. package/deps/rocksdb/rocksdb/db/db_sst_test.cc +2 -2
  68. package/deps/rocksdb/rocksdb/db/db_table_properties_test.cc +6 -0
  69. package/deps/rocksdb/rocksdb/db/db_test2.cc +44 -22
  70. package/deps/rocksdb/rocksdb/db/db_test_util.cc +6 -14
  71. package/deps/rocksdb/rocksdb/db/db_with_timestamp_compaction_test.cc +155 -0
  72. package/deps/rocksdb/rocksdb/db/db_write_test.cc +45 -0
  73. package/deps/rocksdb/rocksdb/db/dbformat.h +2 -1
  74. package/deps/rocksdb/rocksdb/db/error_handler_fs_test.cc +8 -0
  75. package/deps/rocksdb/rocksdb/db/experimental.cc +5 -1
  76. package/deps/rocksdb/rocksdb/db/external_sst_file_basic_test.cc +24 -12
  77. package/deps/rocksdb/rocksdb/db/internal_stats.cc +7 -1
  78. package/deps/rocksdb/rocksdb/db/internal_stats.h +3 -0
  79. package/deps/rocksdb/rocksdb/db/memtable.cc +79 -18
  80. package/deps/rocksdb/rocksdb/db/memtable.h +5 -0
  81. package/deps/rocksdb/rocksdb/db/memtable_list.cc +26 -4
  82. package/deps/rocksdb/rocksdb/db/memtable_list.h +2 -1
  83. package/deps/rocksdb/rocksdb/db/periodic_task_scheduler.cc +113 -0
  84. package/deps/rocksdb/rocksdb/db/periodic_task_scheduler.h +110 -0
  85. package/deps/rocksdb/rocksdb/db/{periodic_work_scheduler_test.cc → periodic_task_scheduler_test.cc} +33 -39
  86. package/deps/rocksdb/rocksdb/db/range_del_aggregator.cc +12 -20
  87. package/deps/rocksdb/rocksdb/db/range_del_aggregator.h +6 -5
  88. package/deps/rocksdb/rocksdb/db/range_del_aggregator_test.cc +12 -8
  89. package/deps/rocksdb/rocksdb/db/range_tombstone_fragmenter.cc +20 -5
  90. package/deps/rocksdb/rocksdb/db/range_tombstone_fragmenter.h +14 -0
  91. package/deps/rocksdb/rocksdb/db/repair.cc +17 -8
  92. package/deps/rocksdb/rocksdb/db/repair_test.cc +2 -1
  93. package/deps/rocksdb/rocksdb/db/seqno_time_test.cc +49 -66
  94. package/deps/rocksdb/rocksdb/db/table_cache.cc +92 -63
  95. package/deps/rocksdb/rocksdb/db/table_cache.h +16 -9
  96. package/deps/rocksdb/rocksdb/db/table_cache_sync_and_async.h +2 -2
  97. package/deps/rocksdb/rocksdb/db/table_properties_collector.cc +2 -2
  98. package/deps/rocksdb/rocksdb/db/table_properties_collector.h +3 -3
  99. package/deps/rocksdb/rocksdb/db/table_properties_collector_test.cc +1 -1
  100. package/deps/rocksdb/rocksdb/db/version_builder.cc +1 -1
  101. package/deps/rocksdb/rocksdb/db/version_edit.h +1 -2
  102. package/deps/rocksdb/rocksdb/db/version_set.cc +379 -145
  103. package/deps/rocksdb/rocksdb/db/version_set.h +26 -24
  104. package/deps/rocksdb/rocksdb/db/version_set_test.cc +9 -9
  105. package/deps/rocksdb/rocksdb/db/version_util.h +3 -2
  106. package/deps/rocksdb/rocksdb/db/wide/db_wide_basic_test.cc +10 -2
  107. package/deps/rocksdb/rocksdb/db/wide/wide_column_serialization.cc +2 -0
  108. package/deps/rocksdb/rocksdb/db_stress_tool/batched_ops_stress.cc +5 -8
  109. package/deps/rocksdb/rocksdb/db_stress_tool/cf_consistency_stress.cc +5 -8
  110. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress.cc +2 -0
  111. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_common.cc +71 -0
  112. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_common.h +14 -0
  113. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_driver.cc +23 -0
  114. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_gflags.cc +26 -1
  115. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_test_base.cc +105 -34
  116. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_test_base.h +16 -8
  117. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_tool.cc +6 -0
  118. package/deps/rocksdb/rocksdb/db_stress_tool/multi_ops_txns_stress.cc +4 -8
  119. package/deps/rocksdb/rocksdb/db_stress_tool/multi_ops_txns_stress.h +4 -8
  120. package/deps/rocksdb/rocksdb/db_stress_tool/no_batched_ops_stress.cc +282 -25
  121. package/deps/rocksdb/rocksdb/env/fs_posix.cc +6 -4
  122. package/deps/rocksdb/rocksdb/env/io_posix.cc +3 -1
  123. package/deps/rocksdb/rocksdb/file/file_prefetch_buffer.cc +367 -177
  124. package/deps/rocksdb/rocksdb/file/file_prefetch_buffer.h +144 -56
  125. package/deps/rocksdb/rocksdb/file/filename.cc +3 -3
  126. package/deps/rocksdb/rocksdb/file/filename.h +4 -2
  127. package/deps/rocksdb/rocksdb/file/prefetch_test.cc +415 -0
  128. package/deps/rocksdb/rocksdb/file/random_access_file_reader.cc +2 -0
  129. package/deps/rocksdb/rocksdb/file/writable_file_writer.cc +36 -45
  130. package/deps/rocksdb/rocksdb/file/writable_file_writer.h +21 -3
  131. package/deps/rocksdb/rocksdb/include/rocksdb/advanced_options.h +11 -11
  132. package/deps/rocksdb/rocksdb/include/rocksdb/c.h +15 -1
  133. package/deps/rocksdb/rocksdb/include/rocksdb/cache.h +163 -68
  134. package/deps/rocksdb/rocksdb/include/rocksdb/db.h +26 -12
  135. package/deps/rocksdb/rocksdb/include/rocksdb/iterator.h +23 -5
  136. package/deps/rocksdb/rocksdb/include/rocksdb/options.h +21 -17
  137. package/deps/rocksdb/rocksdb/include/rocksdb/perf_context.h +17 -0
  138. package/deps/rocksdb/rocksdb/include/rocksdb/persistent_cache.h +3 -3
  139. package/deps/rocksdb/rocksdb/include/rocksdb/secondary_cache.h +17 -6
  140. package/deps/rocksdb/rocksdb/include/rocksdb/statistics.h +3 -0
  141. package/deps/rocksdb/rocksdb/include/rocksdb/table.h +20 -0
  142. package/deps/rocksdb/rocksdb/include/rocksdb/table_properties.h +3 -3
  143. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/option_change_migration.h +4 -0
  144. package/deps/rocksdb/rocksdb/include/rocksdb/version.h +1 -1
  145. package/deps/rocksdb/rocksdb/include/rocksdb/wide_columns.h +3 -0
  146. package/deps/rocksdb/rocksdb/include/rocksdb/write_batch.h +2 -1
  147. package/deps/rocksdb/rocksdb/include/rocksdb/write_batch_base.h +2 -1
  148. package/deps/rocksdb/rocksdb/logging/env_logger.h +2 -2
  149. package/deps/rocksdb/rocksdb/monitoring/histogram.cc +4 -2
  150. package/deps/rocksdb/rocksdb/monitoring/histogram.h +2 -0
  151. package/deps/rocksdb/rocksdb/monitoring/histogram_test.cc +15 -1
  152. package/deps/rocksdb/rocksdb/monitoring/instrumented_mutex.cc +17 -0
  153. package/deps/rocksdb/rocksdb/monitoring/instrumented_mutex.h +14 -3
  154. package/deps/rocksdb/rocksdb/monitoring/iostats_context_imp.h +3 -0
  155. package/deps/rocksdb/rocksdb/monitoring/perf_context.cc +50 -0
  156. package/deps/rocksdb/rocksdb/monitoring/statistics.cc +1 -0
  157. package/deps/rocksdb/rocksdb/monitoring/stats_history_test.cc +31 -32
  158. package/deps/rocksdb/rocksdb/options/customizable_test.cc +4 -1
  159. package/deps/rocksdb/rocksdb/options/options.cc +2 -2
  160. package/deps/rocksdb/rocksdb/options/options_settable_test.cc +2 -1
  161. package/deps/rocksdb/rocksdb/port/jemalloc_helper.h +1 -0
  162. package/deps/rocksdb/rocksdb/src.mk +4 -2
  163. package/deps/rocksdb/rocksdb/table/block_based/block.h +9 -8
  164. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_builder.cc +110 -99
  165. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_builder.h +12 -10
  166. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_factory.cc +11 -2
  167. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader.cc +138 -83
  168. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader.h +25 -24
  169. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader_sync_and_async.h +31 -30
  170. package/deps/rocksdb/rocksdb/table/block_based/block_prefetcher.cc +16 -13
  171. package/deps/rocksdb/rocksdb/table/block_based/cachable_entry.h +4 -4
  172. package/deps/rocksdb/rocksdb/table/block_based/partitioned_filter_block.cc +3 -3
  173. package/deps/rocksdb/rocksdb/table/block_based/partitioned_index_reader.cc +3 -3
  174. package/deps/rocksdb/rocksdb/table/block_fetcher.cc +17 -19
  175. package/deps/rocksdb/rocksdb/table/block_fetcher.h +1 -1
  176. package/deps/rocksdb/rocksdb/table/format.cc +26 -29
  177. package/deps/rocksdb/rocksdb/table/format.h +44 -26
  178. package/deps/rocksdb/rocksdb/table/get_context.cc +17 -12
  179. package/deps/rocksdb/rocksdb/table/internal_iterator.h +7 -0
  180. package/deps/rocksdb/rocksdb/table/iterator_wrapper.h +4 -0
  181. package/deps/rocksdb/rocksdb/table/merging_iterator.cc +950 -104
  182. package/deps/rocksdb/rocksdb/table/merging_iterator.h +28 -1
  183. package/deps/rocksdb/rocksdb/table/meta_blocks.cc +3 -2
  184. package/deps/rocksdb/rocksdb/table/meta_blocks.h +1 -1
  185. package/deps/rocksdb/rocksdb/table/persistent_cache_helper.cc +10 -9
  186. package/deps/rocksdb/rocksdb/table/persistent_cache_helper.h +22 -20
  187. package/deps/rocksdb/rocksdb/table/plain/plain_table_builder.cc +1 -1
  188. package/deps/rocksdb/rocksdb/table/sst_file_writer_collectors.h +1 -1
  189. package/deps/rocksdb/rocksdb/table/table_builder.h +9 -21
  190. package/deps/rocksdb/rocksdb/table/table_test.cc +12 -12
  191. package/deps/rocksdb/rocksdb/tools/block_cache_analyzer/block_cache_pysim_test.py +4 -4
  192. package/deps/rocksdb/rocksdb/tools/block_cache_analyzer/block_cache_trace_analyzer_plot.py +1 -0
  193. package/deps/rocksdb/rocksdb/tools/db_bench_tool.cc +116 -34
  194. package/deps/rocksdb/rocksdb/tools/ldb_cmd.cc +6 -1
  195. package/deps/rocksdb/rocksdb/tools/trace_analyzer_tool.cc +1 -1
  196. package/deps/rocksdb/rocksdb/util/autovector.h +12 -0
  197. package/deps/rocksdb/rocksdb/util/rate_limiter_test.cc +3 -2
  198. package/deps/rocksdb/rocksdb/util/stderr_logger.cc +30 -0
  199. package/deps/rocksdb/rocksdb/util/stderr_logger.h +5 -18
  200. package/deps/rocksdb/rocksdb/util/timer.h +2 -3
  201. package/deps/rocksdb/rocksdb/utilities/backup/backup_engine_test.cc +9 -2
  202. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_db_impl.cc +1 -1
  203. package/deps/rocksdb/rocksdb/utilities/blob_db/blob_dump_tool.cc +1 -1
  204. package/deps/rocksdb/rocksdb/utilities/cache_dump_load_impl.cc +34 -53
  205. package/deps/rocksdb/rocksdb/utilities/cache_dump_load_impl.h +9 -14
  206. package/deps/rocksdb/rocksdb/utilities/debug.cc +2 -4
  207. package/deps/rocksdb/rocksdb/utilities/fault_injection_fs.cc +4 -0
  208. package/deps/rocksdb/rocksdb/utilities/fault_injection_fs.h +1 -1
  209. package/deps/rocksdb/rocksdb/utilities/fault_injection_secondary_cache.cc +4 -3
  210. package/deps/rocksdb/rocksdb/utilities/fault_injection_secondary_cache.h +3 -1
  211. package/deps/rocksdb/rocksdb/utilities/option_change_migration/option_change_migration.cc +26 -8
  212. package/deps/rocksdb/rocksdb/utilities/option_change_migration/option_change_migration_test.cc +114 -16
  213. package/deps/rocksdb/rocksdb/utilities/persistent_cache/persistent_cache_test.cc +1 -1
  214. package/deps/rocksdb/rocksdb/utilities/transactions/optimistic_transaction_test.cc +59 -0
  215. package/deps/rocksdb/rocksdb/utilities/transactions/pessimistic_transaction.cc +3 -0
  216. package/deps/rocksdb/rocksdb/utilities/transactions/timestamped_snapshot_test.cc +39 -0
  217. package/deps/rocksdb/rocksdb.gyp +0 -1
  218. package/index.js +6 -10
  219. package/package.json +1 -1
  220. package/prebuilds/darwin-arm64/node.napi.node +0 -0
  221. package/prebuilds/linux-x64/node.napi.node +0 -0
  222. package/deps/rocksdb/rocksdb/db/periodic_work_scheduler.cc +0 -168
  223. package/deps/rocksdb/rocksdb/db/periodic_work_scheduler.h +0 -90
@@ -101,7 +101,7 @@ DEFINE_bool(convert_to_human_readable_trace, false,
101
101
  "You can specify 'no_key' to reduce the size, if key is not "
102
102
  "needed in the next step.\n"
103
103
  "File name: <prefix>_human_readable_trace.txt\n"
104
- "Format:[type_id cf_id value_size time_in_micorsec <key>].");
104
+ "Format:[<key> type_id cf_id value_size time_in_micorsec].");
105
105
  DEFINE_bool(output_qps_stats, false,
106
106
  "Output the query per second(qps) statistics \n"
107
107
  "For the overall qps, it will contain all qps of each query type. "
@@ -299,6 +299,16 @@ class autovector {
299
299
  }
300
300
 
301
301
  template <class... Args>
302
+ #if _LIBCPP_STD_VER > 14
303
+ reference emplace_back(Args&&... args) {
304
+ if (num_stack_items_ < kSize) {
305
+ return *(new ((void*)(&values_[num_stack_items_++]))
306
+ value_type(std::forward<Args>(args)...));
307
+ } else {
308
+ return vect_.emplace_back(std::forward<Args>(args)...);
309
+ }
310
+ }
311
+ #else
302
312
  void emplace_back(Args&&... args) {
303
313
  if (num_stack_items_ < kSize) {
304
314
  new ((void*)(&values_[num_stack_items_++]))
@@ -307,6 +317,8 @@ class autovector {
307
317
  vect_.emplace_back(std::forward<Args>(args)...);
308
318
  }
309
319
  }
320
+ #endif
321
+
310
322
 
311
323
  void pop_back() {
312
324
  assert(!empty());
@@ -344,9 +344,10 @@ TEST_F(RateLimiterTest, Rate) {
344
344
  }
345
345
  }
346
346
 
347
- // This can fail in heavily loaded CI environments
347
+ // This can fail due to slow execution speed, like when using valgrind or in
348
+ // heavily loaded CI environments
348
349
  bool skip_minimum_rate_check =
349
- #if defined(CIRCLECI) && defined(OS_MACOSX)
350
+ #if (defined(CIRCLECI) && defined(OS_MACOSX)) || defined(ROCKSDB_VALGRIND_RUN)
350
351
  true;
351
352
  #else
352
353
  getenv("SANDCASTLE");
@@ -0,0 +1,30 @@
1
+ // Copyright (c) Meta Platforms, Inc. and affiliates.
2
+ //
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
+
7
+ #include "util/stderr_logger.h"
8
+
9
+ #include "port/sys_time.h"
10
+
11
+ namespace ROCKSDB_NAMESPACE {
12
+ StderrLogger::~StderrLogger() {}
13
+
14
+ void StderrLogger::Logv(const char* format, va_list ap) {
15
+ const uint64_t thread_id = Env::Default()->GetThreadID();
16
+
17
+ port::TimeVal now_tv;
18
+ port::GetTimeOfDay(&now_tv, nullptr);
19
+ const time_t seconds = now_tv.tv_sec;
20
+ struct tm t;
21
+ port::LocalTimeR(&seconds, &t);
22
+ fprintf(stderr, "%04d/%02d/%02d-%02d:%02d:%02d.%06d %llx ", t.tm_year + 1900,
23
+ t.tm_mon + 1, t.tm_mday, t.tm_hour, t.tm_min, t.tm_sec,
24
+ static_cast<int>(now_tv.tv_usec),
25
+ static_cast<long long unsigned int>(thread_id));
26
+
27
+ vfprintf(stderr, format, ap);
28
+ fprintf(stderr, "\n");
29
+ }
30
+ } // namespace ROCKSDB_NAMESPACE
@@ -1,4 +1,5 @@
1
- // Copyright (c) 2016-present, Facebook, Inc. All rights reserved.
1
+ // Copyright (c) Meta Platforms, Inc. and affiliates.
2
+ //
2
3
  // This source code is licensed under both the GPLv2 (found in the
3
4
  // COPYING file in the root directory) and Apache 2.0 License
4
5
  // (found in the LICENSE.Apache file in the root directory).
@@ -8,7 +9,6 @@
8
9
  #include <stdarg.h>
9
10
  #include <stdio.h>
10
11
 
11
- #include "port/sys_time.h"
12
12
  #include "rocksdb/env.h"
13
13
 
14
14
  namespace ROCKSDB_NAMESPACE {
@@ -19,26 +19,13 @@ class StderrLogger : public Logger {
19
19
  explicit StderrLogger(const InfoLogLevel log_level = InfoLogLevel::INFO_LEVEL)
20
20
  : Logger(log_level) {}
21
21
 
22
+ ~StderrLogger() override;
23
+
22
24
  // Brings overloaded Logv()s into scope so they're not hidden when we override
23
25
  // a subset of them.
24
26
  using Logger::Logv;
25
27
 
26
- virtual void Logv(const char* format, va_list ap) override {
27
- const uint64_t thread_id = Env::Default()->GetThreadID();
28
-
29
- port::TimeVal now_tv;
30
- port::GetTimeOfDay(&now_tv, nullptr);
31
- const time_t seconds = now_tv.tv_sec;
32
- struct tm t;
33
- port::LocalTimeR(&seconds, &t);
34
- fprintf(stderr, "%04d/%02d/%02d-%02d:%02d:%02d.%06d %llx ",
35
- t.tm_year + 1900, t.tm_mon + 1, t.tm_mday, t.tm_hour, t.tm_min,
36
- t.tm_sec, static_cast<int>(now_tv.tv_usec),
37
- static_cast<long long unsigned int>(thread_id));
38
-
39
- vfprintf(stderr, format, ap);
40
- fprintf(stderr, "\n");
41
- }
28
+ virtual void Logv(const char* format, va_list ap) override;
42
29
  };
43
30
 
44
31
  } // namespace ROCKSDB_NAMESPACE
@@ -187,10 +187,9 @@ class Timer {
187
187
  return ret;
188
188
  }
189
189
 
190
- bool TEST_HasVaildTask(const std::string& func_name) const {
190
+ void TEST_OverrideTimer(SystemClock* clock) {
191
191
  InstrumentedMutexLock l(&mutex_);
192
- auto it = map_.find(func_name);
193
- return it != map_.end() && it->second->IsValid();
192
+ clock_ = clock;
194
193
  }
195
194
  #endif // NDEBUG
196
195
 
@@ -2083,6 +2083,10 @@ TEST_F(BackupEngineTest, ShareTableFilesWithChecksumsOldFileNaming) {
2083
2083
  });
2084
2084
  ROCKSDB_NAMESPACE::SyncPoint::GetInstance()->EnableProcessing();
2085
2085
 
2086
+ // Corrupting the table properties corrupts the unique id.
2087
+ // Ignore the unique id recorded in the manifest.
2088
+ options_.verify_sst_unique_id_in_manifest = false;
2089
+
2086
2090
  OpenDBAndBackupEngine(true, false, kShareWithChecksum);
2087
2091
  FillDB(db_.get(), 0, keys_iteration);
2088
2092
  CloseDBAndBackupEngine();
@@ -2984,9 +2988,12 @@ TEST_F(BackupEngineTest, ReadOnlyBackupEngine) {
2984
2988
  DestroyDBWithoutCheck(dbname_, options_);
2985
2989
  OpenDBAndBackupEngine(true);
2986
2990
  FillDB(db_.get(), 0, 100);
2987
- ASSERT_OK(backup_engine_->CreateNewBackup(db_.get(), true));
2991
+ // Also test read-only DB with CreateNewBackup and flush=true (no flush)
2992
+ CloseAndReopenDB(/*read_only*/ true);
2993
+ ASSERT_OK(backup_engine_->CreateNewBackup(db_.get(), /*flush*/ true));
2994
+ CloseAndReopenDB(/*read_only*/ false);
2988
2995
  FillDB(db_.get(), 100, 200);
2989
- ASSERT_OK(backup_engine_->CreateNewBackup(db_.get(), true));
2996
+ ASSERT_OK(backup_engine_->CreateNewBackup(db_.get(), /*flush*/ true));
2990
2997
  CloseDBAndBackupEngine();
2991
2998
  DestroyDBWithoutCheck(dbname_, options_);
2992
2999
 
@@ -1165,7 +1165,7 @@ Status BlobDBImpl::DecompressSlice(const Slice& compressed_value,
1165
1165
  UncompressionContext context(compression_type);
1166
1166
  UncompressionInfo info(context, UncompressionDict::GetEmptyDict(),
1167
1167
  compression_type);
1168
- Status s = UncompressBlockContentsForCompressionType(
1168
+ Status s = UncompressBlockData(
1169
1169
  info, compressed_value.data(), compressed_value.size(), &contents,
1170
1170
  kBlockBasedTableVersionFormat, *(cfh->cfd()->ioptions()));
1171
1171
  if (!s.ok()) {
@@ -213,7 +213,7 @@ Status BlobDumpTool::DumpRecord(DisplayType show_key, DisplayType show_blob,
213
213
  UncompressionContext context(compression);
214
214
  UncompressionInfo info(context, UncompressionDict::GetEmptyDict(),
215
215
  compression);
216
- s = UncompressBlockContentsForCompressionType(
216
+ s = UncompressBlockData(
217
217
  info, slice.data() + key_size, static_cast<size_t>(value_size),
218
218
  &contents, 2 /*compress_format_version*/, ImmutableOptions(Options()));
219
219
  if (!s.ok()) {
@@ -175,33 +175,33 @@ CacheDumperImpl::DumpOneBlockCallBack() {
175
175
  // Step 4: if the block should not be filter out, write the block to the
176
176
  // CacheDumpWriter
177
177
  if (!filter_out && block_start != nullptr) {
178
- char* buffer = new char[block_len];
179
- memcpy(buffer, block_start, block_len);
180
- WriteCacheBlock(type, key, (void*)buffer, block_len)
178
+ WriteBlock(type, key, Slice(block_start, block_len))
181
179
  .PermitUncheckedError();
182
- delete[] buffer;
183
180
  }
184
181
  };
185
182
  }
186
- // Write the raw block to the writer. It takes the timestamp of the block being
187
- // copied from block cache, block type, key, block pointer, raw block size and
188
- // the block checksum as the input. When writing the raw block, we first create
189
- // the dump unit and encoude it to a string. Then, we calculate the checksum of
190
- // the how dump unit string and store it in the dump unit metadata.
183
+
184
+ // Write the block to the writer. It takes the timestamp of the
185
+ // block being copied from block cache, block type, key, block pointer,
186
+ // block size and block checksum as the input. When writing the dumper raw
187
+ // block, we first create the dump unit and encoude it to a string. Then,
188
+ // we calculate the checksum of the whole dump unit string and store it in
189
+ // the dump unit metadata.
191
190
  // First, we write the metadata first, which is a fixed size string. Then, we
192
191
  // Append the dump unit string to the writer.
193
- IOStatus CacheDumperImpl::WriteRawBlock(uint64_t timestamp,
194
- CacheDumpUnitType type,
195
- const Slice& key, void* value,
196
- size_t len, uint32_t checksum) {
197
- // First, serilize the block information in a string
192
+ IOStatus CacheDumperImpl::WriteBlock(CacheDumpUnitType type, const Slice& key,
193
+ const Slice& value) {
194
+ uint64_t timestamp = clock_->NowMicros();
195
+ uint32_t value_checksum = crc32c::Value(value.data(), value.size());
196
+
197
+ // First, serialize the block information in a string
198
198
  DumpUnit dump_unit;
199
199
  dump_unit.timestamp = timestamp;
200
200
  dump_unit.key = key;
201
201
  dump_unit.type = type;
202
- dump_unit.value_len = len;
203
- dump_unit.value = value;
204
- dump_unit.value_checksum = checksum;
202
+ dump_unit.value_len = value.size();
203
+ dump_unit.value = const_cast<char*>(value.data());
204
+ dump_unit.value_checksum = value_checksum;
205
205
  std::string encoded_data;
206
206
  CacheDumperHelper::EncodeDumpUnit(dump_unit, &encoded_data);
207
207
 
@@ -212,19 +212,19 @@ IOStatus CacheDumperImpl::WriteRawBlock(uint64_t timestamp,
212
212
  unit_meta.sequence_num = sequence_num_;
213
213
  sequence_num_++;
214
214
  unit_meta.dump_unit_checksum =
215
- crc32c::Value(encoded_data.c_str(), encoded_data.size());
216
- unit_meta.dump_unit_size = static_cast<uint64_t>(encoded_data.size());
215
+ crc32c::Value(encoded_data.data(), encoded_data.size());
216
+ unit_meta.dump_unit_size = encoded_data.size();
217
217
  std::string encoded_meta;
218
218
  CacheDumperHelper::EncodeDumpUnitMeta(unit_meta, &encoded_meta);
219
219
 
220
220
  // We write the metadata first.
221
221
  assert(writer_ != nullptr);
222
- IOStatus io_s = writer_->WriteMetadata(Slice(encoded_meta));
222
+ IOStatus io_s = writer_->WriteMetadata(encoded_meta);
223
223
  if (!io_s.ok()) {
224
224
  return io_s;
225
225
  }
226
226
  // followed by the dump unit.
227
- return writer_->WritePacket(Slice(encoded_data));
227
+ return writer_->WritePacket(encoded_data);
228
228
  }
229
229
 
230
230
  // Before we write any block, we write the header first to store the cache dump
@@ -238,38 +238,18 @@ IOStatus CacheDumperImpl::WriteHeader() {
238
238
  << "RocksDB Version: " << kMajorVersion << "." << kMinorVersion << "\t"
239
239
  << "Format: dump_unit_metadata <sequence_number, dump_unit_checksum, "
240
240
  "dump_unit_size>, dump_unit <timestamp, key, block_type, "
241
- "block_size, raw_block, raw_block_checksum> cache_value\n";
241
+ "block_size, block_data, block_checksum> cache_value\n";
242
242
  std::string header_value(s.str());
243
243
  CacheDumpUnitType type = CacheDumpUnitType::kHeader;
244
- uint64_t timestamp = clock_->NowMicros();
245
- uint32_t header_checksum =
246
- crc32c::Value(header_value.c_str(), header_value.size());
247
- return WriteRawBlock(timestamp, type, Slice(header_key),
248
- (void*)header_value.c_str(), header_value.size(),
249
- header_checksum);
250
- }
251
-
252
- // Write the block dumped from cache
253
- IOStatus CacheDumperImpl::WriteCacheBlock(const CacheDumpUnitType type,
254
- const Slice& key, void* value,
255
- size_t len) {
256
- uint64_t timestamp = clock_->NowMicros();
257
- uint32_t value_checksum = crc32c::Value((char*)value, len);
258
- return WriteRawBlock(timestamp, type, key, value, len, value_checksum);
244
+ return WriteBlock(type, header_key, header_value);
259
245
  }
260
246
 
261
247
  // Write the footer after all the blocks are stored to indicate the ending.
262
248
  IOStatus CacheDumperImpl::WriteFooter() {
263
249
  std::string footer_key = "footer";
264
- std::ostringstream s;
265
250
  std::string footer_value("cache dump completed");
266
251
  CacheDumpUnitType type = CacheDumpUnitType::kFooter;
267
- uint64_t timestamp = clock_->NowMicros();
268
- uint32_t footer_checksum =
269
- crc32c::Value(footer_value.c_str(), footer_value.size());
270
- return WriteRawBlock(timestamp, type, Slice(footer_key),
271
- (void*)footer_value.c_str(), footer_value.size(),
272
- footer_checksum);
252
+ return WriteBlock(type, footer_key, footer_value);
273
253
  }
274
254
 
275
255
  // This is the main function to restore the cache entries to secondary cache.
@@ -309,9 +289,10 @@ IOStatus CacheDumpedLoaderImpl::RestoreCacheEntriesToSecondaryCache() {
309
289
  if (!io_s.ok()) {
310
290
  break;
311
291
  }
312
- // create the raw_block_content based on the information in the dump_unit
313
- BlockContents raw_block_contents(
314
- Slice((char*)dump_unit.value, dump_unit.value_len));
292
+ // Create the uncompressed_block based on the information in the dump_unit
293
+ // (There is no block trailer here compatible with block-based SST file.)
294
+ BlockContents uncompressed_block(
295
+ Slice(static_cast<char*>(dump_unit.value), dump_unit.value_len));
315
296
  Cache::CacheItemHelper* helper = nullptr;
316
297
  Statistics* statistics = nullptr;
317
298
  Status s = Status::OK();
@@ -323,7 +304,7 @@ IOStatus CacheDumpedLoaderImpl::RestoreCacheEntriesToSecondaryCache() {
323
304
  BlockType::kFilter);
324
305
  std::unique_ptr<ParsedFullFilterBlock> block_holder;
325
306
  block_holder.reset(BlocklikeTraits<ParsedFullFilterBlock>::Create(
326
- std::move(raw_block_contents), toptions_.read_amp_bytes_per_bit,
307
+ std::move(uncompressed_block), toptions_.read_amp_bytes_per_bit,
327
308
  statistics, false, toptions_.filter_policy.get()));
328
309
  if (helper != nullptr) {
329
310
  s = secondary_cache_->Insert(dump_unit.key,
@@ -335,7 +316,7 @@ IOStatus CacheDumpedLoaderImpl::RestoreCacheEntriesToSecondaryCache() {
335
316
  helper = BlocklikeTraits<Block>::GetCacheItemHelper(BlockType::kData);
336
317
  std::unique_ptr<Block> block_holder;
337
318
  block_holder.reset(BlocklikeTraits<Block>::Create(
338
- std::move(raw_block_contents), toptions_.read_amp_bytes_per_bit,
319
+ std::move(uncompressed_block), toptions_.read_amp_bytes_per_bit,
339
320
  statistics, false, toptions_.filter_policy.get()));
340
321
  if (helper != nullptr) {
341
322
  s = secondary_cache_->Insert(dump_unit.key,
@@ -347,7 +328,7 @@ IOStatus CacheDumpedLoaderImpl::RestoreCacheEntriesToSecondaryCache() {
347
328
  helper = BlocklikeTraits<Block>::GetCacheItemHelper(BlockType::kIndex);
348
329
  std::unique_ptr<Block> block_holder;
349
330
  block_holder.reset(BlocklikeTraits<Block>::Create(
350
- std::move(raw_block_contents), 0, statistics, false,
331
+ std::move(uncompressed_block), 0, statistics, false,
351
332
  toptions_.filter_policy.get()));
352
333
  if (helper != nullptr) {
353
334
  s = secondary_cache_->Insert(dump_unit.key,
@@ -360,7 +341,7 @@ IOStatus CacheDumpedLoaderImpl::RestoreCacheEntriesToSecondaryCache() {
360
341
  BlockType::kFilterPartitionIndex);
361
342
  std::unique_ptr<Block> block_holder;
362
343
  block_holder.reset(BlocklikeTraits<Block>::Create(
363
- std::move(raw_block_contents), toptions_.read_amp_bytes_per_bit,
344
+ std::move(uncompressed_block), toptions_.read_amp_bytes_per_bit,
364
345
  statistics, false, toptions_.filter_policy.get()));
365
346
  if (helper != nullptr) {
366
347
  s = secondary_cache_->Insert(dump_unit.key,
@@ -436,7 +417,7 @@ IOStatus CacheDumpedLoaderImpl::ReadHeader(std::string* data,
436
417
  if (!io_s.ok()) {
437
418
  return io_s;
438
419
  }
439
- uint32_t unit_checksum = crc32c::Value(data->c_str(), data->size());
420
+ uint32_t unit_checksum = crc32c::Value(data->data(), data->size());
440
421
  if (unit_checksum != header_meta.dump_unit_checksum) {
441
422
  return IOStatus::Corruption("Read header unit corrupted!");
442
423
  }
@@ -461,7 +442,7 @@ IOStatus CacheDumpedLoaderImpl::ReadCacheBlock(std::string* data,
461
442
  if (!io_s.ok()) {
462
443
  return io_s;
463
444
  }
464
- uint32_t unit_checksum = crc32c::Value(data->c_str(), data->size());
445
+ uint32_t unit_checksum = crc32c::Value(data->data(), data->size());
465
446
  if (unit_checksum != unit_meta.dump_unit_checksum) {
466
447
  return IOStatus::Corruption(
467
448
  "Checksum does not match! Read dumped unit corrupted!");
@@ -75,7 +75,7 @@ struct DumpUnit {
75
75
  // Pointer to the block. Note that, in the dump process, it points to a memory
76
76
  // buffer copied from cache block. The buffer is freed when we process the
77
77
  // next block. In the load process, we use an std::string to store the
78
- // serilized dump_unit read from the reader. So it points to the memory
78
+ // serialized dump_unit read from the reader. So it points to the memory
79
79
  // address of the begin of the block in this string.
80
80
  void* value;
81
81
 
@@ -103,14 +103,9 @@ class CacheDumperImpl : public CacheDumper {
103
103
  IOStatus DumpCacheEntriesToWriter() override;
104
104
 
105
105
  private:
106
- IOStatus WriteRawBlock(uint64_t timestamp, CacheDumpUnitType type,
107
- const Slice& key, void* value, size_t len,
108
- uint32_t checksum);
109
-
106
+ IOStatus WriteBlock(CacheDumpUnitType type, const Slice& key,
107
+ const Slice& value);
110
108
  IOStatus WriteHeader();
111
-
112
- IOStatus WriteCacheBlock(const CacheDumpUnitType type, const Slice& key,
113
- void* value, size_t len);
114
109
  IOStatus WriteFooter();
115
110
  bool ShouldFilterOut(const Slice& key);
116
111
  std::function<void(const Slice&, void*, size_t, Cache::DeleterFn)>
@@ -166,7 +161,7 @@ class ToFileCacheDumpWriter : public CacheDumpWriter {
166
161
 
167
162
  ~ToFileCacheDumpWriter() { Close().PermitUncheckedError(); }
168
163
 
169
- // Write the serilized metadata to the file
164
+ // Write the serialized metadata to the file
170
165
  virtual IOStatus WriteMetadata(const Slice& metadata) override {
171
166
  assert(file_writer_ != nullptr);
172
167
  std::string prefix;
@@ -179,7 +174,7 @@ class ToFileCacheDumpWriter : public CacheDumpWriter {
179
174
  return io_s;
180
175
  }
181
176
 
182
- // Write the serilized data to the file
177
+ // Write the serialized data to the file
183
178
  virtual IOStatus WritePacket(const Slice& data) override {
184
179
  assert(file_writer_ != nullptr);
185
180
  std::string prefix;
@@ -284,7 +279,7 @@ class FromFileCacheDumpReader : public CacheDumpReader {
284
279
  // The cache dump and load helper class
285
280
  class CacheDumperHelper {
286
281
  public:
287
- // serilize the dump_unit_meta to a string, it is fixed 16 bytes size.
282
+ // serialize the dump_unit_meta to a string, it is fixed 16 bytes size.
288
283
  static void EncodeDumpUnitMeta(const DumpUnitMeta& meta, std::string* data) {
289
284
  assert(data);
290
285
  PutFixed32(data, static_cast<uint32_t>(meta.sequence_num));
@@ -292,7 +287,7 @@ class CacheDumperHelper {
292
287
  PutFixed64(data, meta.dump_unit_size);
293
288
  }
294
289
 
295
- // Serilize the dump_unit to a string.
290
+ // Serialize the dump_unit to a string.
296
291
  static void EncodeDumpUnit(const DumpUnit& dump_unit, std::string* data) {
297
292
  assert(data);
298
293
  PutFixed64(data, dump_unit.timestamp);
@@ -304,7 +299,7 @@ class CacheDumperHelper {
304
299
  Slice((char*)dump_unit.value, dump_unit.value_len));
305
300
  }
306
301
 
307
- // Deserilize the dump_unit_meta from a string
302
+ // Deserialize the dump_unit_meta from a string
308
303
  static Status DecodeDumpUnitMeta(const std::string& encoded_data,
309
304
  DumpUnitMeta* unit_meta) {
310
305
  assert(unit_meta != nullptr);
@@ -323,7 +318,7 @@ class CacheDumperHelper {
323
318
  return Status::OK();
324
319
  }
325
320
 
326
- // Deserilize the dump_unit from a string.
321
+ // Deserialize the dump_unit from a string.
327
322
  static Status DecodeDumpUnit(const std::string& encoded_data,
328
323
  DumpUnit* dump_unit) {
329
324
  assert(dump_unit != nullptr);
@@ -78,11 +78,9 @@ Status GetAllKeyVersions(DB* db, ColumnFamilyHandle* cfh, Slice begin_key,
78
78
  DBImpl* idb = static_cast<DBImpl*>(db->GetRootDB());
79
79
  auto icmp = InternalKeyComparator(idb->GetOptions(cfh).comparator);
80
80
  ReadOptions read_options;
81
- ReadRangeDelAggregator range_del_agg(&icmp,
82
- kMaxSequenceNumber /* upper_bound */);
83
81
  Arena arena;
84
- ScopedArenaIterator iter(idb->NewInternalIterator(
85
- read_options, &arena, &range_del_agg, kMaxSequenceNumber, cfh));
82
+ ScopedArenaIterator iter(
83
+ idb->NewInternalIterator(read_options, &arena, kMaxSequenceNumber, cfh));
86
84
 
87
85
  if (!begin_key.empty()) {
88
86
  InternalKey ikey;
@@ -240,6 +240,7 @@ IOStatus TestFSWritableFile::PositionedAppend(
240
240
 
241
241
  IOStatus TestFSWritableFile::Close(const IOOptions& options,
242
242
  IODebugContext* dbg) {
243
+ MutexLock l(&mutex_);
243
244
  if (!fs_->IsFilesystemActive()) {
244
245
  return fs_->GetError();
245
246
  }
@@ -271,6 +272,7 @@ IOStatus TestFSWritableFile::Close(const IOOptions& options,
271
272
  }
272
273
 
273
274
  IOStatus TestFSWritableFile::Flush(const IOOptions&, IODebugContext*) {
275
+ MutexLock l(&mutex_);
274
276
  if (!fs_->IsFilesystemActive()) {
275
277
  return fs_->GetError();
276
278
  }
@@ -282,6 +284,7 @@ IOStatus TestFSWritableFile::Flush(const IOOptions&, IODebugContext*) {
282
284
 
283
285
  IOStatus TestFSWritableFile::Sync(const IOOptions& options,
284
286
  IODebugContext* dbg) {
287
+ MutexLock l(&mutex_);
285
288
  if (!fs_->IsFilesystemActive()) {
286
289
  return fs_->GetError();
287
290
  }
@@ -302,6 +305,7 @@ IOStatus TestFSWritableFile::Sync(const IOOptions& options,
302
305
  IOStatus TestFSWritableFile::RangeSync(uint64_t offset, uint64_t nbytes,
303
306
  const IOOptions& options,
304
307
  IODebugContext* dbg) {
308
+ MutexLock l(&mutex_);
305
309
  if (!fs_->IsFilesystemActive()) {
306
310
  return fs_->GetError();
307
311
  }
@@ -97,7 +97,7 @@ class TestFSWritableFile : public FSWritableFile {
97
97
  };
98
98
 
99
99
  private:
100
- FSFileState state_;
100
+ FSFileState state_; // Need protection by mutex_
101
101
  FileOptions file_opts_;
102
102
  std::unique_ptr<FSWritableFile> target_;
103
103
  bool writable_file_opened_;
@@ -87,17 +87,18 @@ Status FaultInjectionSecondaryCache::Insert(
87
87
  std::unique_ptr<SecondaryCacheResultHandle>
88
88
  FaultInjectionSecondaryCache::Lookup(const Slice& key,
89
89
  const Cache::CreateCallback& create_cb,
90
- bool wait, bool& is_in_sec_cache) {
90
+ bool wait, bool advise_erase,
91
+ bool& is_in_sec_cache) {
91
92
  ErrorContext* ctx = GetErrorContext();
92
93
  if (base_is_compressed_sec_cache_) {
93
94
  if (ctx->rand.OneIn(prob_)) {
94
95
  return nullptr;
95
96
  } else {
96
- return base_->Lookup(key, create_cb, wait, is_in_sec_cache);
97
+ return base_->Lookup(key, create_cb, wait, advise_erase, is_in_sec_cache);
97
98
  }
98
99
  } else {
99
100
  std::unique_ptr<SecondaryCacheResultHandle> hdl =
100
- base_->Lookup(key, create_cb, wait, is_in_sec_cache);
101
+ base_->Lookup(key, create_cb, wait, advise_erase, is_in_sec_cache);
101
102
  if (wait && ctx->rand.OneIn(prob_)) {
102
103
  hdl.reset();
103
104
  }
@@ -36,7 +36,9 @@ class FaultInjectionSecondaryCache : public SecondaryCache {
36
36
 
37
37
  std::unique_ptr<SecondaryCacheResultHandle> Lookup(
38
38
  const Slice& key, const Cache::CreateCallback& create_cb, bool wait,
39
- bool& is_in_sec_cache) override;
39
+ bool advise_erase, bool& is_in_sec_cache) override;
40
+
41
+ bool SupportForceErase() const override { return base_->SupportForceErase(); }
40
42
 
41
43
  void Erase(const Slice& key) override;
42
44
 
@@ -35,18 +35,26 @@ Status OpenDb(const Options& options, const std::string& dbname,
35
35
  return s;
36
36
  }
37
37
 
38
+ // l0_file_size specifies size of file on L0. Files will be range partitioned
39
+ // after a full compaction so they are likely qualified to put on L0. If
40
+ // left as 0, the files are compacted in a single file and put to L0. Otherwise,
41
+ // will try to compact the files as size l0_file_size.
38
42
  Status CompactToLevel(const Options& options, const std::string& dbname,
39
- int dest_level, bool need_reopen) {
43
+ int dest_level, uint64_t l0_file_size, bool need_reopen) {
40
44
  std::unique_ptr<DB> db;
41
45
  Options no_compact_opts = GetNoCompactionOptions(options);
42
46
  if (dest_level == 0) {
47
+ if (l0_file_size == 0) {
48
+ // Single file.
49
+ l0_file_size = 999999999999999;
50
+ }
43
51
  // L0 has strict sequenceID requirements to files to it. It's safer
44
52
  // to only put one compacted file to there.
45
53
  // This is only used for converting to universal compaction with
46
54
  // only one level. In this case, compacting to one file is also
47
55
  // optimal.
48
- no_compact_opts.target_file_size_base = 999999999999999;
49
- no_compact_opts.max_compaction_bytes = 999999999999999;
56
+ no_compact_opts.target_file_size_base = l0_file_size;
57
+ no_compact_opts.max_compaction_bytes = l0_file_size;
50
58
  }
51
59
  Status s = OpenDb(no_compact_opts, dbname, &db);
52
60
  if (!s.ok()) {
@@ -98,7 +106,8 @@ Status MigrateToUniversal(std::string dbname, const Options& old_opts,
98
106
  }
99
107
  }
100
108
  if (need_compact) {
101
- return CompactToLevel(old_opts, dbname, new_opts.num_levels - 1, true);
109
+ return CompactToLevel(old_opts, dbname, new_opts.num_levels - 1,
110
+ /*l0_file_size=*/0, true);
102
111
  }
103
112
  return Status::OK();
104
113
  }
@@ -119,7 +128,7 @@ Status MigrateToLevelBase(std::string dbname, const Options& old_opts,
119
128
  // multiplier from 4 to 8, with the same data, we will have fewer
120
129
  // levels. Unless we issue a full comaction, the LSM tree may stuck
121
130
  // with more levels than needed and it won't recover automatically.
122
- return CompactToLevel(opts, dbname, 1, true);
131
+ return CompactToLevel(opts, dbname, 1, /*l0_file_size=*/0, true);
123
132
  } else {
124
133
  // Compact everything to the last level to guarantee it can be safely
125
134
  // opened.
@@ -127,11 +136,13 @@ Status MigrateToLevelBase(std::string dbname, const Options& old_opts,
127
136
  return Status::OK();
128
137
  } else if (new_opts.num_levels > old_opts.num_levels) {
129
138
  // Dynamic level mode requires data to be put in the last level first.
130
- return CompactToLevel(new_opts, dbname, new_opts.num_levels - 1, false);
139
+ return CompactToLevel(new_opts, dbname, new_opts.num_levels - 1,
140
+ /*l0_file_size=*/0, false);
131
141
  } else {
132
142
  Options opts = old_opts;
133
143
  opts.target_file_size_base = new_opts.target_file_size_base;
134
- return CompactToLevel(opts, dbname, new_opts.num_levels - 1, true);
144
+ return CompactToLevel(opts, dbname, new_opts.num_levels - 1,
145
+ /*l0_file_size=*/0, true);
135
146
  }
136
147
  }
137
148
  }
@@ -150,7 +161,14 @@ Status OptionChangeMigration(std::string dbname, const Options& old_opts,
150
161
  return MigrateToLevelBase(dbname, old_opts, new_opts);
151
162
  } else if (new_opts.compaction_style ==
152
163
  CompactionStyle::kCompactionStyleFIFO) {
153
- return CompactToLevel(old_opts, dbname, 0, true);
164
+ uint64_t l0_file_size = 0;
165
+ if (new_opts.compaction_options_fifo.max_table_files_size > 0) {
166
+ // Create at least 8 files when max_table_files_size hits, so that the DB
167
+ // doesn't just disappear. This in fact violates the FIFO condition, but
168
+ // otherwise, the migrated DB is unlikley to be usable.
169
+ l0_file_size = new_opts.compaction_options_fifo.max_table_files_size / 8;
170
+ }
171
+ return CompactToLevel(old_opts, dbname, 0, l0_file_size, true);
154
172
  } else {
155
173
  return Status::NotSupported(
156
174
  "Do not how to migrate to this compaction style");