@nxtedition/rocksdb 8.1.4 → 8.1.6

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/deps/rocksdb/rocksdb/CMakeLists.txt +21 -0
  2. package/deps/rocksdb/rocksdb/Makefile +15 -3
  3. package/deps/rocksdb/rocksdb/TARGETS +6 -0
  4. package/deps/rocksdb/rocksdb/cache/cache_bench_tool.cc +32 -35
  5. package/deps/rocksdb/rocksdb/cache/cache_entry_roles.cc +0 -30
  6. package/deps/rocksdb/rocksdb/cache/cache_entry_roles.h +0 -83
  7. package/deps/rocksdb/rocksdb/cache/cache_entry_stats.h +13 -14
  8. package/deps/rocksdb/rocksdb/cache/cache_helpers.cc +40 -0
  9. package/deps/rocksdb/rocksdb/cache/cache_helpers.h +14 -20
  10. package/deps/rocksdb/rocksdb/cache/cache_reservation_manager.cc +8 -9
  11. package/deps/rocksdb/rocksdb/cache/cache_reservation_manager.h +5 -4
  12. package/deps/rocksdb/rocksdb/cache/cache_test.cc +124 -156
  13. package/deps/rocksdb/rocksdb/cache/charged_cache.cc +10 -26
  14. package/deps/rocksdb/rocksdb/cache/charged_cache.h +11 -16
  15. package/deps/rocksdb/rocksdb/cache/clock_cache.cc +35 -32
  16. package/deps/rocksdb/rocksdb/cache/clock_cache.h +19 -21
  17. package/deps/rocksdb/rocksdb/cache/compressed_secondary_cache.cc +42 -30
  18. package/deps/rocksdb/rocksdb/cache/compressed_secondary_cache.h +9 -8
  19. package/deps/rocksdb/rocksdb/cache/compressed_secondary_cache_test.cc +91 -143
  20. package/deps/rocksdb/rocksdb/cache/lru_cache.cc +54 -60
  21. package/deps/rocksdb/rocksdb/cache/lru_cache.h +37 -63
  22. package/deps/rocksdb/rocksdb/cache/lru_cache_test.cc +120 -106
  23. package/deps/rocksdb/rocksdb/cache/secondary_cache.cc +14 -5
  24. package/deps/rocksdb/rocksdb/cache/sharded_cache.h +16 -31
  25. package/deps/rocksdb/rocksdb/cache/typed_cache.h +339 -0
  26. package/deps/rocksdb/rocksdb/db/blob/blob_contents.cc +0 -48
  27. package/deps/rocksdb/rocksdb/db/blob/blob_contents.h +18 -15
  28. package/deps/rocksdb/rocksdb/db/blob/blob_file_builder.cc +5 -26
  29. package/deps/rocksdb/rocksdb/db/blob/blob_file_cache.cc +7 -8
  30. package/deps/rocksdb/rocksdb/db/blob/blob_file_cache.h +6 -3
  31. package/deps/rocksdb/rocksdb/db/blob/blob_file_reader.cc +2 -7
  32. package/deps/rocksdb/rocksdb/db/blob/blob_source.cc +19 -47
  33. package/deps/rocksdb/rocksdb/db/blob/blob_source.h +13 -5
  34. package/deps/rocksdb/rocksdb/db/blob/blob_source_test.cc +15 -22
  35. package/deps/rocksdb/rocksdb/db/builder.cc +24 -10
  36. package/deps/rocksdb/rocksdb/db/builder.h +2 -1
  37. package/deps/rocksdb/rocksdb/db/c.cc +15 -0
  38. package/deps/rocksdb/rocksdb/db/c_test.c +3 -0
  39. package/deps/rocksdb/rocksdb/db/column_family.cc +11 -6
  40. package/deps/rocksdb/rocksdb/db/column_family.h +20 -6
  41. package/deps/rocksdb/rocksdb/db/compaction/compaction.cc +31 -34
  42. package/deps/rocksdb/rocksdb/db/compaction/compaction.h +3 -0
  43. package/deps/rocksdb/rocksdb/db/compaction/compaction_iterator.cc +21 -3
  44. package/deps/rocksdb/rocksdb/db/compaction/compaction_iterator.h +1 -0
  45. package/deps/rocksdb/rocksdb/db/compaction/compaction_job.cc +4 -0
  46. package/deps/rocksdb/rocksdb/db/compaction/compaction_job.h +4 -2
  47. package/deps/rocksdb/rocksdb/db/compaction/compaction_job_test.cc +9 -6
  48. package/deps/rocksdb/rocksdb/db/compaction/compaction_outputs.cc +275 -82
  49. package/deps/rocksdb/rocksdb/db/compaction/compaction_outputs.h +7 -0
  50. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker.cc +11 -18
  51. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker.h +17 -16
  52. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_fifo.cc +19 -6
  53. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_fifo.h +5 -5
  54. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_level.cc +22 -22
  55. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_level.h +5 -5
  56. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_test.cc +81 -52
  57. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_universal.cc +5 -1
  58. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_universal.h +5 -5
  59. package/deps/rocksdb/rocksdb/db/compaction/compaction_service_job.cc +8 -2
  60. package/deps/rocksdb/rocksdb/db/compaction/subcompaction_state.h +3 -0
  61. package/deps/rocksdb/rocksdb/db/compaction/tiered_compaction_test.cc +266 -138
  62. package/deps/rocksdb/rocksdb/db/corruption_test.cc +86 -1
  63. package/deps/rocksdb/rocksdb/db/db_basic_test.cc +98 -9
  64. package/deps/rocksdb/rocksdb/db/db_block_cache_test.cc +28 -28
  65. package/deps/rocksdb/rocksdb/db/db_bloom_filter_test.cc +2 -3
  66. package/deps/rocksdb/rocksdb/db/db_compaction_test.cc +1022 -123
  67. package/deps/rocksdb/rocksdb/db/db_flush_test.cc +65 -4
  68. package/deps/rocksdb/rocksdb/db/db_impl/db_impl.cc +32 -21
  69. package/deps/rocksdb/rocksdb/db/db_impl/db_impl.h +32 -24
  70. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_compaction_flush.cc +199 -77
  71. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_debug.cc +1 -1
  72. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_experimental.cc +3 -2
  73. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_files.cc +3 -0
  74. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_open.cc +8 -4
  75. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_write.cc +43 -23
  76. package/deps/rocksdb/rocksdb/db/db_iter.cc +8 -2
  77. package/deps/rocksdb/rocksdb/db/db_merge_operand_test.cc +42 -0
  78. package/deps/rocksdb/rocksdb/db/db_merge_operator_test.cc +155 -0
  79. package/deps/rocksdb/rocksdb/db/db_properties_test.cc +12 -12
  80. package/deps/rocksdb/rocksdb/db/db_range_del_test.cc +230 -2
  81. package/deps/rocksdb/rocksdb/db/db_test.cc +3 -0
  82. package/deps/rocksdb/rocksdb/db/db_test2.cc +233 -8
  83. package/deps/rocksdb/rocksdb/db/db_test_util.cc +11 -10
  84. package/deps/rocksdb/rocksdb/db/db_test_util.h +39 -24
  85. package/deps/rocksdb/rocksdb/db/db_wal_test.cc +129 -0
  86. package/deps/rocksdb/rocksdb/db/db_with_timestamp_basic_test.cc +28 -0
  87. package/deps/rocksdb/rocksdb/db/db_with_timestamp_compaction_test.cc +21 -0
  88. package/deps/rocksdb/rocksdb/db/dbformat.cc +25 -0
  89. package/deps/rocksdb/rocksdb/db/dbformat.h +2 -0
  90. package/deps/rocksdb/rocksdb/db/experimental.cc +3 -2
  91. package/deps/rocksdb/rocksdb/db/external_sst_file_basic_test.cc +3 -0
  92. package/deps/rocksdb/rocksdb/db/external_sst_file_ingestion_job.cc +92 -13
  93. package/deps/rocksdb/rocksdb/db/external_sst_file_ingestion_job.h +38 -1
  94. package/deps/rocksdb/rocksdb/db/external_sst_file_test.cc +14 -110
  95. package/deps/rocksdb/rocksdb/db/flush_job.cc +12 -10
  96. package/deps/rocksdb/rocksdb/db/flush_job.h +3 -2
  97. package/deps/rocksdb/rocksdb/db/flush_job_test.cc +29 -29
  98. package/deps/rocksdb/rocksdb/db/import_column_family_job.cc +56 -53
  99. package/deps/rocksdb/rocksdb/db/import_column_family_test.cc +3 -4
  100. package/deps/rocksdb/rocksdb/db/internal_stats.cc +11 -11
  101. package/deps/rocksdb/rocksdb/db/internal_stats.h +2 -2
  102. package/deps/rocksdb/rocksdb/db/log_reader.cc +8 -6
  103. package/deps/rocksdb/rocksdb/db/log_test.cc +35 -2
  104. package/deps/rocksdb/rocksdb/db/memtable.cc +31 -6
  105. package/deps/rocksdb/rocksdb/db/merge_helper.cc +47 -29
  106. package/deps/rocksdb/rocksdb/db/merge_helper.h +14 -6
  107. package/deps/rocksdb/rocksdb/db/periodic_task_scheduler_test.cc +10 -10
  108. package/deps/rocksdb/rocksdb/db/range_tombstone_fragmenter_test.cc +1 -1
  109. package/deps/rocksdb/rocksdb/db/repair.cc +65 -22
  110. package/deps/rocksdb/rocksdb/db/repair_test.cc +54 -0
  111. package/deps/rocksdb/rocksdb/db/seqno_time_test.cc +26 -26
  112. package/deps/rocksdb/rocksdb/db/table_cache.cc +41 -91
  113. package/deps/rocksdb/rocksdb/db/table_cache.h +17 -19
  114. package/deps/rocksdb/rocksdb/db/table_cache_sync_and_async.h +7 -9
  115. package/deps/rocksdb/rocksdb/db/table_properties_collector.h +3 -1
  116. package/deps/rocksdb/rocksdb/db/version_builder.cc +102 -52
  117. package/deps/rocksdb/rocksdb/db/version_builder.h +20 -0
  118. package/deps/rocksdb/rocksdb/db/version_builder_test.cc +218 -93
  119. package/deps/rocksdb/rocksdb/db/version_edit.cc +27 -1
  120. package/deps/rocksdb/rocksdb/db/version_edit.h +34 -9
  121. package/deps/rocksdb/rocksdb/db/version_edit_handler.cc +13 -6
  122. package/deps/rocksdb/rocksdb/db/version_edit_handler.h +17 -6
  123. package/deps/rocksdb/rocksdb/db/version_edit_test.cc +19 -17
  124. package/deps/rocksdb/rocksdb/db/version_set.cc +160 -28
  125. package/deps/rocksdb/rocksdb/db/version_set.h +34 -4
  126. package/deps/rocksdb/rocksdb/db/version_set_sync_and_async.h +1 -1
  127. package/deps/rocksdb/rocksdb/db/version_set_test.cc +65 -31
  128. package/deps/rocksdb/rocksdb/db/write_batch.cc +4 -1
  129. package/deps/rocksdb/rocksdb/db/write_thread.cc +5 -2
  130. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_common.h +1 -0
  131. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_driver.cc +31 -32
  132. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_driver.h +2 -1
  133. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_env_wrapper.h +8 -6
  134. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_gflags.cc +4 -0
  135. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_test_base.cc +11 -4
  136. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_tool.cc +16 -15
  137. package/deps/rocksdb/rocksdb/db_stress_tool/no_batched_ops_stress.cc +13 -1
  138. package/deps/rocksdb/rocksdb/file/file_prefetch_buffer.cc +1 -0
  139. package/deps/rocksdb/rocksdb/file/prefetch_test.cc +286 -217
  140. package/deps/rocksdb/rocksdb/include/rocksdb/c.h +8 -0
  141. package/deps/rocksdb/rocksdb/include/rocksdb/cache.h +137 -135
  142. package/deps/rocksdb/rocksdb/include/rocksdb/db.h +6 -0
  143. package/deps/rocksdb/rocksdb/include/rocksdb/listener.h +7 -1
  144. package/deps/rocksdb/rocksdb/include/rocksdb/merge_operator.h +21 -0
  145. package/deps/rocksdb/rocksdb/include/rocksdb/metadata.h +9 -3
  146. package/deps/rocksdb/rocksdb/include/rocksdb/options.h +2 -1
  147. package/deps/rocksdb/rocksdb/include/rocksdb/secondary_cache.h +8 -6
  148. package/deps/rocksdb/rocksdb/include/rocksdb/status.h +3 -0
  149. package/deps/rocksdb/rocksdb/include/rocksdb/utilities/backup_engine.h +69 -9
  150. package/deps/rocksdb/rocksdb/include/rocksdb/version.h +1 -1
  151. package/deps/rocksdb/rocksdb/memory/arena.cc +23 -87
  152. package/deps/rocksdb/rocksdb/memory/arena.h +25 -31
  153. package/deps/rocksdb/rocksdb/memory/arena_test.cc +90 -0
  154. package/deps/rocksdb/rocksdb/memory/memory_allocator.h +9 -0
  155. package/deps/rocksdb/rocksdb/monitoring/stats_history_test.cc +26 -26
  156. package/deps/rocksdb/rocksdb/options/customizable_test.cc +4 -3
  157. package/deps/rocksdb/rocksdb/port/mmap.cc +98 -0
  158. package/deps/rocksdb/rocksdb/port/mmap.h +70 -0
  159. package/deps/rocksdb/rocksdb/port/port_posix.h +2 -0
  160. package/{prebuilds → deps/rocksdb/rocksdb/prebuilds}/linux-x64/node.napi.node +0 -0
  161. package/deps/rocksdb/rocksdb/src.mk +3 -0
  162. package/deps/rocksdb/rocksdb/table/adaptive/adaptive_table_factory.cc +3 -2
  163. package/deps/rocksdb/rocksdb/table/block_based/block.h +3 -0
  164. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_builder.cc +25 -67
  165. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_builder.h +3 -3
  166. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_factory.cc +18 -13
  167. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader.cc +159 -225
  168. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader.h +31 -50
  169. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader_impl.h +52 -20
  170. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader_sync_and_async.h +3 -3
  171. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader_test.cc +1 -1
  172. package/deps/rocksdb/rocksdb/table/block_based/block_cache.cc +96 -0
  173. package/deps/rocksdb/rocksdb/table/block_based/block_cache.h +132 -0
  174. package/deps/rocksdb/rocksdb/table/block_based/cachable_entry.h +28 -0
  175. package/deps/rocksdb/rocksdb/table/block_based/filter_block_reader_common.cc +6 -5
  176. package/deps/rocksdb/rocksdb/table/block_based/filter_block_reader_common.h +1 -4
  177. package/deps/rocksdb/rocksdb/table/block_based/full_filter_block.cc +6 -7
  178. package/deps/rocksdb/rocksdb/table/block_based/index_reader_common.cc +3 -1
  179. package/deps/rocksdb/rocksdb/table/block_based/parsed_full_filter_block.h +6 -1
  180. package/deps/rocksdb/rocksdb/table/block_based/partitioned_filter_block.cc +19 -18
  181. package/deps/rocksdb/rocksdb/table/block_based/partitioned_filter_block.h +9 -5
  182. package/deps/rocksdb/rocksdb/table/block_based/partitioned_filter_block_test.cc +3 -1
  183. package/deps/rocksdb/rocksdb/table/block_based/partitioned_index_reader.cc +2 -1
  184. package/deps/rocksdb/rocksdb/table/block_based/uncompression_dict_reader.cc +2 -2
  185. package/deps/rocksdb/rocksdb/table/block_fetcher_test.cc +3 -3
  186. package/deps/rocksdb/rocksdb/table/format.cc +24 -20
  187. package/deps/rocksdb/rocksdb/table/format.h +6 -3
  188. package/deps/rocksdb/rocksdb/table/get_context.cc +12 -3
  189. package/deps/rocksdb/rocksdb/table/internal_iterator.h +0 -2
  190. package/deps/rocksdb/rocksdb/table/merging_iterator.cc +69 -35
  191. package/deps/rocksdb/rocksdb/table/meta_blocks.cc +2 -2
  192. package/deps/rocksdb/rocksdb/table/sst_file_dumper.cc +1 -1
  193. package/deps/rocksdb/rocksdb/table/table_test.cc +7 -6
  194. package/deps/rocksdb/rocksdb/test_util/testutil.h +10 -0
  195. package/deps/rocksdb/rocksdb/tools/block_cache_analyzer/block_cache_trace_analyzer_test.cc +66 -1
  196. package/deps/rocksdb/rocksdb/tools/db_bench_tool.cc +9 -2
  197. package/deps/rocksdb/rocksdb/trace_replay/block_cache_tracer.cc +5 -0
  198. package/deps/rocksdb/rocksdb/trace_replay/block_cache_tracer.h +2 -2
  199. package/deps/rocksdb/rocksdb/trace_replay/trace_replay.cc +1 -1
  200. package/deps/rocksdb/rocksdb/util/async_file_reader.cc +20 -12
  201. package/deps/rocksdb/rocksdb/util/bloom_test.cc +1 -1
  202. package/deps/rocksdb/rocksdb/util/compression.cc +2 -2
  203. package/deps/rocksdb/rocksdb/util/compression.h +11 -2
  204. package/deps/rocksdb/rocksdb/util/status.cc +7 -0
  205. package/deps/rocksdb/rocksdb/util/xxhash.h +1901 -887
  206. package/deps/rocksdb/rocksdb/utilities/backup/backup_engine.cc +250 -74
  207. package/deps/rocksdb/rocksdb/utilities/backup/backup_engine_test.cc +199 -4
  208. package/deps/rocksdb/rocksdb/utilities/cache_dump_load_impl.cc +35 -57
  209. package/deps/rocksdb/rocksdb/utilities/cache_dump_load_impl.h +4 -5
  210. package/deps/rocksdb/rocksdb/utilities/checkpoint/checkpoint_impl.cc +1 -0
  211. package/deps/rocksdb/rocksdb/utilities/fault_injection_fs.cc +39 -0
  212. package/deps/rocksdb/rocksdb/utilities/fault_injection_fs.h +9 -0
  213. package/deps/rocksdb/rocksdb/utilities/fault_injection_secondary_cache.cc +11 -6
  214. package/deps/rocksdb/rocksdb/utilities/fault_injection_secondary_cache.h +6 -5
  215. package/deps/rocksdb/rocksdb/utilities/memory_allocators.h +0 -1
  216. package/deps/rocksdb/rocksdb/utilities/simulator_cache/cache_simulator.cc +10 -11
  217. package/deps/rocksdb/rocksdb/utilities/simulator_cache/sim_cache.cc +31 -31
  218. package/deps/rocksdb/rocksdb/utilities/transactions/lock/range/range_tree/lib/portability/toku_time.h +4 -0
  219. package/deps/rocksdb/rocksdb/utilities/transactions/transaction_test.cc +111 -0
  220. package/deps/rocksdb/rocksdb/utilities/ttl/db_ttl_impl.cc +1 -0
  221. package/deps/rocksdb/rocksdb/utilities/write_batch_with_index/write_batch_with_index_internal.cc +12 -3
  222. package/package.json +1 -1
  223. package/deps/rocksdb/rocksdb/table/block_based/block_like_traits.h +0 -182
@@ -973,7 +973,7 @@ TEST_F(ExternalSSTFileTest, MultiThreaded) {
973
973
 
974
974
  do {
975
975
  Options options = CurrentOptions();
976
-
976
+ options.disable_auto_compactions = true;
977
977
  std::atomic<int> thread_num(0);
978
978
  std::function<void()> write_file_func = [&]() {
979
979
  int file_idx = thread_num.fetch_add(1);
@@ -1249,8 +1249,9 @@ TEST_P(ExternalSSTFileTest, PickedLevel) {
1249
1249
 
1250
1250
  // This file overlaps with file 0 (L3), file 1 (L2) and the
1251
1251
  // output of compaction going to L1
1252
- ASSERT_OK(GenerateAndAddExternalFile(options, {4, 7}, -1, false, false, true,
1253
- false, false, &true_data));
1252
+ ASSERT_OK(GenerateAndAddExternalFile(options, {4, 7}, -1,
1253
+ true /* allow_global_seqno */, false,
1254
+ true, false, false, &true_data));
1254
1255
  EXPECT_EQ(FilesPerLevel(), "5,0,1,1");
1255
1256
 
1256
1257
  // This file does not overlap with any file or with the running compaction
@@ -1270,106 +1271,6 @@ TEST_P(ExternalSSTFileTest, PickedLevel) {
1270
1271
  ROCKSDB_NAMESPACE::SyncPoint::GetInstance()->DisableProcessing();
1271
1272
  }
1272
1273
 
1273
- TEST_F(ExternalSSTFileTest, PickedLevelBug) {
1274
- env_->skip_fsync_ = true;
1275
- Options options = CurrentOptions();
1276
- options.disable_auto_compactions = false;
1277
- options.level0_file_num_compaction_trigger = 3;
1278
- options.num_levels = 2;
1279
- DestroyAndReopen(options);
1280
-
1281
- std::vector<int> file_keys;
1282
-
1283
- // file #1 in L0
1284
- file_keys = {0, 5, 7};
1285
- for (int k : file_keys) {
1286
- ASSERT_OK(Put(Key(k), Key(k)));
1287
- }
1288
- ASSERT_OK(Flush());
1289
-
1290
- // file #2 in L0
1291
- file_keys = {4, 6, 8, 9};
1292
- for (int k : file_keys) {
1293
- ASSERT_OK(Put(Key(k), Key(k)));
1294
- }
1295
- ASSERT_OK(Flush());
1296
-
1297
- // We have 2 overlapping files in L0
1298
- EXPECT_EQ(FilesPerLevel(), "2");
1299
-
1300
- ASSERT_OK(dbfull()->TEST_WaitForCompact());
1301
-
1302
- ROCKSDB_NAMESPACE::SyncPoint::GetInstance()->LoadDependency(
1303
- {{"DBImpl::IngestExternalFile:AfterIncIngestFileCounter",
1304
- "ExternalSSTFileTest::PickedLevelBug:0"},
1305
- {"ExternalSSTFileTest::PickedLevelBug:1", "DBImpl::AddFile:MutexUnlock"},
1306
- {"ExternalSSTFileTest::PickedLevelBug:2",
1307
- "DBImpl::RunManualCompaction:0"},
1308
- {"ExternalSSTFileTest::PickedLevelBug:3",
1309
- "DBImpl::RunManualCompaction:1"}});
1310
-
1311
- std::atomic<bool> bg_compact_started(false);
1312
- ROCKSDB_NAMESPACE::SyncPoint::GetInstance()->SetCallBack(
1313
- "DBImpl::BackgroundCompaction:Start",
1314
- [&](void* /*arg*/) { bg_compact_started.store(true); });
1315
-
1316
- ROCKSDB_NAMESPACE::SyncPoint::GetInstance()->EnableProcessing();
1317
-
1318
- Status bg_compact_status;
1319
- Status bg_addfile_status;
1320
-
1321
- {
1322
- // While writing the MANIFEST start a thread that will ask for compaction
1323
- ThreadGuard bg_compact(port::Thread([&]() {
1324
- bg_compact_status =
1325
- db_->CompactRange(CompactRangeOptions(), nullptr, nullptr);
1326
- }));
1327
- TEST_SYNC_POINT("ExternalSSTFileTest::PickedLevelBug:2");
1328
-
1329
- // Start a thread that will ingest a new file
1330
- ThreadGuard bg_addfile(port::Thread([&]() {
1331
- file_keys = {1, 2, 3};
1332
- bg_addfile_status = GenerateAndAddExternalFile(options, file_keys, 1);
1333
- }));
1334
-
1335
- // Wait for AddFile to start picking levels and writing MANIFEST
1336
- TEST_SYNC_POINT("ExternalSSTFileTest::PickedLevelBug:0");
1337
-
1338
- TEST_SYNC_POINT("ExternalSSTFileTest::PickedLevelBug:3");
1339
-
1340
- // We need to verify that no compactions can run while AddFile is
1341
- // ingesting the files into the levels it find suitable. So we will
1342
- // wait for 2 seconds to give a chance for compactions to run during
1343
- // this period, and then make sure that no compactions where able to run
1344
- env_->SleepForMicroseconds(1000000 * 2);
1345
- bool bg_compact_started_tmp = bg_compact_started.load();
1346
-
1347
- // Hold AddFile from finishing writing the MANIFEST
1348
- TEST_SYNC_POINT("ExternalSSTFileTest::PickedLevelBug:1");
1349
-
1350
- // check the status at the end, so even if the ASSERT fails the threads
1351
- // could be joined and return.
1352
- ASSERT_FALSE(bg_compact_started_tmp);
1353
- }
1354
-
1355
- ASSERT_OK(bg_addfile_status);
1356
- ASSERT_OK(bg_compact_status);
1357
-
1358
- ASSERT_OK(dbfull()->TEST_WaitForCompact());
1359
-
1360
- int total_keys = 0;
1361
- Iterator* iter = db_->NewIterator(ReadOptions());
1362
- for (iter->SeekToFirst(); iter->Valid(); iter->Next()) {
1363
- ASSERT_OK(iter->status());
1364
- total_keys++;
1365
- }
1366
- ASSERT_EQ(total_keys, 10);
1367
-
1368
- delete iter;
1369
-
1370
- ROCKSDB_NAMESPACE::SyncPoint::GetInstance()->DisableProcessing();
1371
- }
1372
-
1373
1274
  TEST_F(ExternalSSTFileTest, IngestNonExistingFile) {
1374
1275
  Options options = CurrentOptions();
1375
1276
  DestroyAndReopen(options);
@@ -1420,7 +1321,8 @@ TEST_F(ExternalSSTFileTest, CompactDuringAddFileRandom) {
1420
1321
  int range_id = 0;
1421
1322
  std::vector<int> file_keys;
1422
1323
  std::function<void()> bg_addfile = [&]() {
1423
- ASSERT_OK(GenerateAndAddExternalFile(options, file_keys, range_id));
1324
+ ASSERT_OK(GenerateAndAddExternalFile(options, file_keys, range_id,
1325
+ true /* allow_global_seqno */));
1424
1326
  };
1425
1327
 
1426
1328
  const int num_of_ranges = 1000;
@@ -1503,8 +1405,9 @@ TEST_F(ExternalSSTFileTest, PickedLevelDynamic) {
1503
1405
 
1504
1406
  // This file overlaps with the output of the compaction (going to L3)
1505
1407
  // so the file will be added to L0 since L3 is the base level
1506
- ASSERT_OK(GenerateAndAddExternalFile(options, {31, 32, 33, 34}, -1, false,
1507
- false, true, false, false, &true_data));
1408
+ ASSERT_OK(GenerateAndAddExternalFile(options, {31, 32, 33, 34}, -1,
1409
+ true /* allow_global_seqno */, false,
1410
+ true, false, false, &true_data));
1508
1411
  EXPECT_EQ(FilesPerLevel(), "5");
1509
1412
 
1510
1413
  // This file does not overlap with the current running compactiong
@@ -1642,14 +1545,15 @@ TEST_F(ExternalSSTFileTest, AddFileTrivialMoveBug) {
1642
1545
 
1643
1546
  ROCKSDB_NAMESPACE::SyncPoint::GetInstance()->SetCallBack(
1644
1547
  "CompactionJob::Run():Start", [&](void* /*arg*/) {
1645
- // fit in L3 but will overlap with compaction so will be added
1646
- // to L2 but a compaction will trivially move it to L3
1647
- // and break LSM consistency
1548
+ // Fit in L3 but will overlap with the compaction output so will be
1549
+ // added to L2. Prior to the fix, a compaction will then trivially move
1550
+ // this file to L3 and break LSM consistency
1648
1551
  static std::atomic<bool> called = {false};
1649
1552
  if (!called) {
1650
1553
  called = true;
1651
1554
  ASSERT_OK(dbfull()->SetOptions({{"max_bytes_for_level_base", "1"}}));
1652
- ASSERT_OK(GenerateAndAddExternalFile(options, {15, 16}, 7));
1555
+ ASSERT_OK(GenerateAndAddExternalFile(options, {15, 16}, 7,
1556
+ true /* allow_global_seqno */));
1653
1557
  }
1654
1558
  });
1655
1559
  ROCKSDB_NAMESPACE::SyncPoint::GetInstance()->EnableProcessing();
@@ -23,6 +23,7 @@
23
23
  #include "db/memtable_list.h"
24
24
  #include "db/merge_context.h"
25
25
  #include "db/range_tombstone_fragmenter.h"
26
+ #include "db/version_edit.h"
26
27
  #include "db/version_set.h"
27
28
  #include "file/file_util.h"
28
29
  #include "file/filename.h"
@@ -90,7 +91,7 @@ FlushJob::FlushJob(
90
91
  std::vector<SequenceNumber> existing_snapshots,
91
92
  SequenceNumber earliest_write_conflict_snapshot,
92
93
  SnapshotChecker* snapshot_checker, JobContext* job_context,
93
- LogBuffer* log_buffer, FSDirectory* db_directory,
94
+ FlushReason flush_reason, LogBuffer* log_buffer, FSDirectory* db_directory,
94
95
  FSDirectory* output_file_directory, CompressionType output_compression,
95
96
  Statistics* stats, EventLogger* event_logger, bool measure_io_stats,
96
97
  const bool sync_output_directory, const bool write_manifest,
@@ -113,6 +114,7 @@ FlushJob::FlushJob(
113
114
  earliest_write_conflict_snapshot_(earliest_write_conflict_snapshot),
114
115
  snapshot_checker_(snapshot_checker),
115
116
  job_context_(job_context),
117
+ flush_reason_(flush_reason),
116
118
  log_buffer_(log_buffer),
117
119
  db_directory_(db_directory),
118
120
  output_file_directory_(output_file_directory),
@@ -199,6 +201,7 @@ void FlushJob::PickMemTable() {
199
201
 
200
202
  // path 0 for level 0 file.
201
203
  meta_.fd = FileDescriptor(versions_->NewFileNumber(), 0, 0);
204
+ meta_.epoch_number = cfd_->NewEpochNumber();
202
205
 
203
206
  base_ = cfd_->current();
204
207
  base_->Ref(); // it is likely that we do not need this reference
@@ -243,9 +246,8 @@ Status FlushJob::Run(LogsWithPrepTracker* prep_tracker, FileMetaData* file_meta,
243
246
  }
244
247
  Status mempurge_s = Status::NotFound("No MemPurge.");
245
248
  if ((mempurge_threshold > 0.0) &&
246
- (cfd_->GetFlushReason() == FlushReason::kWriteBufferFull) &&
247
- (!mems_.empty()) && MemPurgeDecider(mempurge_threshold) &&
248
- !(db_options_.atomic_flush)) {
249
+ (flush_reason_ == FlushReason::kWriteBufferFull) && (!mems_.empty()) &&
250
+ MemPurgeDecider(mempurge_threshold) && !(db_options_.atomic_flush)) {
249
251
  cfd_->SetMempurgeUsed();
250
252
  mempurge_s = MemPurge();
251
253
  if (!mempurge_s.ok()) {
@@ -876,7 +878,7 @@ Status FlushJob::WriteLevel0Table() {
876
878
  << total_num_deletes << "total_data_size"
877
879
  << total_data_size << "memory_usage"
878
880
  << total_memory_usage << "flush_reason"
879
- << GetFlushReasonString(cfd_->GetFlushReason());
881
+ << GetFlushReasonString(flush_reason_);
880
882
 
881
883
  {
882
884
  ScopedArenaIterator iter(
@@ -939,7 +941,7 @@ Status FlushJob::WriteLevel0Table() {
939
941
  cfd_->internal_stats(), &io_s, io_tracer_,
940
942
  BlobFileCreationReason::kFlush, seqno_to_time_mapping_, event_logger_,
941
943
  job_context_->job_id, io_priority, &table_properties_, write_hint,
942
- full_history_ts_low, blob_callback_, &num_input_entries,
944
+ full_history_ts_low, blob_callback_, base_, &num_input_entries,
943
945
  &memtable_payload_bytes, &memtable_garbage_bytes);
944
946
  // TODO: Cleanup io_status in BuildTable and table builders
945
947
  assert(!s.ok() || io_s.ok());
@@ -999,9 +1001,9 @@ Status FlushJob::WriteLevel0Table() {
999
1001
  meta_.fd.smallest_seqno, meta_.fd.largest_seqno,
1000
1002
  meta_.marked_for_compaction, meta_.temperature,
1001
1003
  meta_.oldest_blob_file_number, meta_.oldest_ancester_time,
1002
- meta_.file_creation_time, meta_.file_checksum,
1003
- meta_.file_checksum_func_name, meta_.unique_id);
1004
-
1004
+ meta_.file_creation_time, meta_.epoch_number,
1005
+ meta_.file_checksum, meta_.file_checksum_func_name,
1006
+ meta_.unique_id, meta_.compensated_range_deletion_size);
1005
1007
  edit_->SetBlobFileAdditions(std::move(blob_file_additions));
1006
1008
  }
1007
1009
  #ifndef ROCKSDB_LITE
@@ -1074,7 +1076,7 @@ std::unique_ptr<FlushJobInfo> FlushJob::GetFlushJobInfo() const {
1074
1076
  info->smallest_seqno = meta_.fd.smallest_seqno;
1075
1077
  info->largest_seqno = meta_.fd.largest_seqno;
1076
1078
  info->table_properties = table_properties_;
1077
- info->flush_reason = cfd_->GetFlushReason();
1079
+ info->flush_reason = flush_reason_;
1078
1080
  info->blob_compression_type = mutable_cf_options_.blob_compression_type;
1079
1081
 
1080
1082
  // Update BlobFilesInfo.
@@ -67,8 +67,8 @@ class FlushJob {
67
67
  std::vector<SequenceNumber> existing_snapshots,
68
68
  SequenceNumber earliest_write_conflict_snapshot,
69
69
  SnapshotChecker* snapshot_checker, JobContext* job_context,
70
- LogBuffer* log_buffer, FSDirectory* db_directory,
71
- FSDirectory* output_file_directory,
70
+ FlushReason flush_reason, LogBuffer* log_buffer,
71
+ FSDirectory* db_directory, FSDirectory* output_file_directory,
72
72
  CompressionType output_compression, Statistics* stats,
73
73
  EventLogger* event_logger, bool measure_io_stats,
74
74
  const bool sync_output_directory, const bool write_manifest,
@@ -150,6 +150,7 @@ class FlushJob {
150
150
  SequenceNumber earliest_write_conflict_snapshot_;
151
151
  SnapshotChecker* snapshot_checker_;
152
152
  JobContext* job_context_;
153
+ FlushReason flush_reason_;
153
154
  LogBuffer* log_buffer_;
154
155
  FSDirectory* db_directory_;
155
156
  FSDirectory* output_file_directory_;
@@ -164,15 +164,15 @@ TEST_F(FlushJobTest, Empty) {
164
164
  auto cfd = versions_->GetColumnFamilySet()->GetDefault();
165
165
  EventLogger event_logger(db_options_.info_log.get());
166
166
  SnapshotChecker* snapshot_checker = nullptr; // not relavant
167
- FlushJob flush_job(dbname_, versions_->GetColumnFamilySet()->GetDefault(),
168
- db_options_, *cfd->GetLatestMutableCFOptions(),
169
- std::numeric_limits<uint64_t>::max() /* memtable_id */,
170
- env_options_, versions_.get(), &mutex_, &shutting_down_,
171
- {}, kMaxSequenceNumber, snapshot_checker, &job_context,
172
- nullptr, nullptr, nullptr, kNoCompression, nullptr,
173
- &event_logger, false, true /* sync_output_directory */,
174
- true /* write_manifest */, Env::Priority::USER,
175
- nullptr /*IOTracer*/, empty_seqno_to_time_mapping_);
167
+ FlushJob flush_job(
168
+ dbname_, versions_->GetColumnFamilySet()->GetDefault(), db_options_,
169
+ *cfd->GetLatestMutableCFOptions(),
170
+ std::numeric_limits<uint64_t>::max() /* memtable_id */, env_options_,
171
+ versions_.get(), &mutex_, &shutting_down_, {}, kMaxSequenceNumber,
172
+ snapshot_checker, &job_context, FlushReason::kTest, nullptr, nullptr,
173
+ nullptr, kNoCompression, nullptr, &event_logger, false,
174
+ true /* sync_output_directory */, true /* write_manifest */,
175
+ Env::Priority::USER, nullptr /*IOTracer*/, empty_seqno_to_time_mapping_);
176
176
  {
177
177
  InstrumentedMutexLock l(&mutex_);
178
178
  flush_job.PickMemTable();
@@ -255,9 +255,9 @@ TEST_F(FlushJobTest, NonEmpty) {
255
255
  *cfd->GetLatestMutableCFOptions(),
256
256
  std::numeric_limits<uint64_t>::max() /* memtable_id */, env_options_,
257
257
  versions_.get(), &mutex_, &shutting_down_, {}, kMaxSequenceNumber,
258
- snapshot_checker, &job_context, nullptr, nullptr, nullptr, kNoCompression,
259
- db_options_.statistics.get(), &event_logger, true,
260
- true /* sync_output_directory */, true /* write_manifest */,
258
+ snapshot_checker, &job_context, FlushReason::kTest, nullptr, nullptr,
259
+ nullptr, kNoCompression, db_options_.statistics.get(), &event_logger,
260
+ true, true /* sync_output_directory */, true /* write_manifest */,
261
261
  Env::Priority::USER, nullptr /*IOTracer*/, empty_seqno_to_time_mapping_);
262
262
 
263
263
  HistogramData hist;
@@ -318,9 +318,9 @@ TEST_F(FlushJobTest, FlushMemTablesSingleColumnFamily) {
318
318
  dbname_, versions_->GetColumnFamilySet()->GetDefault(), db_options_,
319
319
  *cfd->GetLatestMutableCFOptions(), flush_memtable_id, env_options_,
320
320
  versions_.get(), &mutex_, &shutting_down_, {}, kMaxSequenceNumber,
321
- snapshot_checker, &job_context, nullptr, nullptr, nullptr, kNoCompression,
322
- db_options_.statistics.get(), &event_logger, true,
323
- true /* sync_output_directory */, true /* write_manifest */,
321
+ snapshot_checker, &job_context, FlushReason::kTest, nullptr, nullptr,
322
+ nullptr, kNoCompression, db_options_.statistics.get(), &event_logger,
323
+ true, true /* sync_output_directory */, true /* write_manifest */,
324
324
  Env::Priority::USER, nullptr /*IOTracer*/, empty_seqno_to_time_mapping_);
325
325
  HistogramData hist;
326
326
  FileMetaData file_meta;
@@ -391,8 +391,8 @@ TEST_F(FlushJobTest, FlushMemtablesMultipleColumnFamilies) {
391
391
  dbname_, cfd, db_options_, *cfd->GetLatestMutableCFOptions(),
392
392
  memtable_ids[k], env_options_, versions_.get(), &mutex_,
393
393
  &shutting_down_, snapshot_seqs, kMaxSequenceNumber, snapshot_checker,
394
- &job_context, nullptr, nullptr, nullptr, kNoCompression,
395
- db_options_.statistics.get(), &event_logger, true,
394
+ &job_context, FlushReason::kTest, nullptr, nullptr, nullptr,
395
+ kNoCompression, db_options_.statistics.get(), &event_logger, true,
396
396
  false /* sync_output_directory */, false /* write_manifest */,
397
397
  Env::Priority::USER, nullptr /*IOTracer*/,
398
398
  empty_seqno_to_time_mapping_));
@@ -520,9 +520,9 @@ TEST_F(FlushJobTest, Snapshots) {
520
520
  *cfd->GetLatestMutableCFOptions(),
521
521
  std::numeric_limits<uint64_t>::max() /* memtable_id */, env_options_,
522
522
  versions_.get(), &mutex_, &shutting_down_, snapshots, kMaxSequenceNumber,
523
- snapshot_checker, &job_context, nullptr, nullptr, nullptr, kNoCompression,
524
- db_options_.statistics.get(), &event_logger, true,
525
- true /* sync_output_directory */, true /* write_manifest */,
523
+ snapshot_checker, &job_context, FlushReason::kTest, nullptr, nullptr,
524
+ nullptr, kNoCompression, db_options_.statistics.get(), &event_logger,
525
+ true, true /* sync_output_directory */, true /* write_manifest */,
526
526
  Env::Priority::USER, nullptr /*IOTracer*/, empty_seqno_to_time_mapping_);
527
527
  mutex_.Lock();
528
528
  flush_job.PickMemTable();
@@ -576,9 +576,9 @@ TEST_F(FlushJobTest, GetRateLimiterPriorityForWrite) {
576
576
  dbname_, versions_->GetColumnFamilySet()->GetDefault(), db_options_,
577
577
  *cfd->GetLatestMutableCFOptions(), flush_memtable_id, env_options_,
578
578
  versions_.get(), &mutex_, &shutting_down_, {}, kMaxSequenceNumber,
579
- snapshot_checker, &job_context, nullptr, nullptr, nullptr, kNoCompression,
580
- db_options_.statistics.get(), &event_logger, true,
581
- true /* sync_output_directory */, true /* write_manifest */,
579
+ snapshot_checker, &job_context, FlushReason::kTest, nullptr, nullptr,
580
+ nullptr, kNoCompression, db_options_.statistics.get(), &event_logger,
581
+ true, true /* sync_output_directory */, true /* write_manifest */,
582
582
  Env::Priority::USER, nullptr /*IOTracer*/, empty_seqno_to_time_mapping_);
583
583
 
584
584
  // When the state from WriteController is normal.
@@ -656,9 +656,9 @@ TEST_F(FlushJobTimestampTest, AllKeysExpired) {
656
656
  dbname_, cfd, db_options_, *cfd->GetLatestMutableCFOptions(),
657
657
  std::numeric_limits<uint64_t>::max() /* memtable_id */, env_options_,
658
658
  versions_.get(), &mutex_, &shutting_down_, snapshots, kMaxSequenceNumber,
659
- snapshot_checker, &job_context, nullptr, nullptr, nullptr, kNoCompression,
660
- db_options_.statistics.get(), &event_logger, true,
661
- true /* sync_output_directory */, true /* write_manifest */,
659
+ snapshot_checker, &job_context, FlushReason::kTest, nullptr, nullptr,
660
+ nullptr, kNoCompression, db_options_.statistics.get(), &event_logger,
661
+ true, true /* sync_output_directory */, true /* write_manifest */,
662
662
  Env::Priority::USER, nullptr /*IOTracer*/, empty_seqno_to_time_mapping_,
663
663
  /*db_id=*/"",
664
664
  /*db_session_id=*/"", full_history_ts_low);
@@ -709,9 +709,9 @@ TEST_F(FlushJobTimestampTest, NoKeyExpired) {
709
709
  dbname_, cfd, db_options_, *cfd->GetLatestMutableCFOptions(),
710
710
  std::numeric_limits<uint64_t>::max() /* memtable_id */, env_options_,
711
711
  versions_.get(), &mutex_, &shutting_down_, snapshots, kMaxSequenceNumber,
712
- snapshot_checker, &job_context, nullptr, nullptr, nullptr, kNoCompression,
713
- db_options_.statistics.get(), &event_logger, true,
714
- true /* sync_output_directory */, true /* write_manifest */,
712
+ snapshot_checker, &job_context, FlushReason::kTest, nullptr, nullptr,
713
+ nullptr, kNoCompression, db_options_.statistics.get(), &event_logger,
714
+ true, true /* sync_output_directory */, true /* write_manifest */,
715
715
  Env::Priority::USER, nullptr /*IOTracer*/, empty_seqno_to_time_mapping_,
716
716
  /*db_id=*/"",
717
717
  /*db_session_id=*/"", full_history_ts_low);
@@ -4,6 +4,7 @@
4
4
  // COPYING file in the root directory) and Apache 2.0 License
5
5
  // (found in the LICENSE.Apache file in the root directory).
6
6
 
7
+ #include "db/version_builder.h"
7
8
  #ifndef ROCKSDB_LITE
8
9
 
9
10
  #include "db/import_column_family_job.h"
@@ -45,40 +46,6 @@ Status ImportColumnFamilyJob::Prepare(uint64_t next_file_number,
45
46
  auto num_files = files_to_import_.size();
46
47
  if (num_files == 0) {
47
48
  return Status::InvalidArgument("The list of files is empty");
48
- } else if (num_files > 1) {
49
- // Verify that passed files don't have overlapping ranges in any particular
50
- // level.
51
- int min_level = 1; // Check for overlaps in Level 1 and above.
52
- int max_level = -1;
53
- for (const auto& file_metadata : metadata_) {
54
- if (file_metadata.level > max_level) {
55
- max_level = file_metadata.level;
56
- }
57
- }
58
- for (int level = min_level; level <= max_level; ++level) {
59
- autovector<const IngestedFileInfo*> sorted_files;
60
- for (size_t i = 0; i < num_files; i++) {
61
- if (metadata_[i].level == level) {
62
- sorted_files.push_back(&files_to_import_[i]);
63
- }
64
- }
65
-
66
- std::sort(
67
- sorted_files.begin(), sorted_files.end(),
68
- [this](const IngestedFileInfo* info1, const IngestedFileInfo* info2) {
69
- return cfd_->internal_comparator().Compare(
70
- info1->smallest_internal_key,
71
- info2->smallest_internal_key) < 0;
72
- });
73
-
74
- for (size_t i = 0; i + 1 < sorted_files.size(); i++) {
75
- if (cfd_->internal_comparator().Compare(
76
- sorted_files[i]->largest_internal_key,
77
- sorted_files[i + 1]->smallest_internal_key) >= 0) {
78
- return Status::InvalidArgument("Files have overlapping ranges");
79
- }
80
- }
81
- }
82
49
  }
83
50
 
84
51
  for (const auto& f : files_to_import_) {
@@ -143,9 +110,6 @@ Status ImportColumnFamilyJob::Prepare(uint64_t next_file_number,
143
110
  // REQUIRES: we have become the only writer by entering both write_thread_ and
144
111
  // nonmem_write_thread_
145
112
  Status ImportColumnFamilyJob::Run() {
146
- Status status;
147
- edit_.SetColumnFamily(cfd_->GetID());
148
-
149
113
  // We use the import time as the ancester time. This is the time the data
150
114
  // is written to the database.
151
115
  int64_t temp_current_time = 0;
@@ -156,27 +120,67 @@ Status ImportColumnFamilyJob::Run() {
156
120
  static_cast<uint64_t>(temp_current_time);
157
121
  }
158
122
 
159
- for (size_t i = 0; i < files_to_import_.size(); ++i) {
123
+ // Recover files' epoch number using dummy VersionStorageInfo
124
+ VersionBuilder dummy_version_builder(
125
+ cfd_->current()->version_set()->file_options(), cfd_->ioptions(),
126
+ cfd_->table_cache(), cfd_->current()->storage_info(),
127
+ cfd_->current()->version_set(),
128
+ cfd_->GetFileMetadataCacheReservationManager());
129
+ VersionStorageInfo dummy_vstorage(
130
+ &cfd_->internal_comparator(), cfd_->user_comparator(),
131
+ cfd_->NumberLevels(), cfd_->ioptions()->compaction_style,
132
+ nullptr /* src_vstorage */, cfd_->ioptions()->force_consistency_checks,
133
+ EpochNumberRequirement::kMightMissing);
134
+ Status s;
135
+ for (size_t i = 0; s.ok() && i < files_to_import_.size(); ++i) {
160
136
  const auto& f = files_to_import_[i];
161
137
  const auto& file_metadata = metadata_[i];
162
138
 
163
- edit_.AddFile(file_metadata.level, f.fd.GetNumber(), f.fd.GetPathId(),
164
- f.fd.GetFileSize(), f.smallest_internal_key,
165
- f.largest_internal_key, file_metadata.smallest_seqno,
166
- file_metadata.largest_seqno, false, file_metadata.temperature,
167
- kInvalidBlobFileNumber, oldest_ancester_time, current_time,
168
- kUnknownFileChecksum, kUnknownFileChecksumFuncName,
169
- f.unique_id);
170
-
171
- // If incoming sequence number is higher, update local sequence number.
172
- if (file_metadata.largest_seqno > versions_->LastSequence()) {
173
- versions_->SetLastAllocatedSequence(file_metadata.largest_seqno);
174
- versions_->SetLastPublishedSequence(file_metadata.largest_seqno);
175
- versions_->SetLastSequence(file_metadata.largest_seqno);
139
+ VersionEdit dummy_version_edit;
140
+ dummy_version_edit.AddFile(
141
+ file_metadata.level, f.fd.GetNumber(), f.fd.GetPathId(),
142
+ f.fd.GetFileSize(), f.smallest_internal_key, f.largest_internal_key,
143
+ file_metadata.smallest_seqno, file_metadata.largest_seqno, false,
144
+ file_metadata.temperature, kInvalidBlobFileNumber, oldest_ancester_time,
145
+ current_time, file_metadata.epoch_number, kUnknownFileChecksum,
146
+ kUnknownFileChecksumFuncName, f.unique_id, 0);
147
+ s = dummy_version_builder.Apply(&dummy_version_edit);
148
+ }
149
+ if (s.ok()) {
150
+ s = dummy_version_builder.SaveTo(&dummy_vstorage);
151
+ }
152
+ if (s.ok()) {
153
+ dummy_vstorage.RecoverEpochNumbers(cfd_);
154
+ }
155
+
156
+ // Record changes from this CF import in VersionEdit, including files with
157
+ // recovered epoch numbers
158
+ if (s.ok()) {
159
+ edit_.SetColumnFamily(cfd_->GetID());
160
+
161
+ for (int level = 0; level < dummy_vstorage.num_levels(); level++) {
162
+ for (FileMetaData* file_meta : dummy_vstorage.LevelFiles(level)) {
163
+ edit_.AddFile(level, *file_meta);
164
+ // If incoming sequence number is higher, update local sequence number.
165
+ if (file_meta->fd.largest_seqno > versions_->LastSequence()) {
166
+ versions_->SetLastAllocatedSequence(file_meta->fd.largest_seqno);
167
+ versions_->SetLastPublishedSequence(file_meta->fd.largest_seqno);
168
+ versions_->SetLastSequence(file_meta->fd.largest_seqno);
169
+ }
170
+ }
176
171
  }
177
172
  }
178
173
 
179
- return status;
174
+ // Release resources occupied by the dummy VersionStorageInfo
175
+ for (int level = 0; level < dummy_vstorage.num_levels(); level++) {
176
+ for (FileMetaData* file_meta : dummy_vstorage.LevelFiles(level)) {
177
+ file_meta->refs--;
178
+ if (file_meta->refs <= 0) {
179
+ delete file_meta;
180
+ }
181
+ }
182
+ }
183
+ return s;
180
184
  }
181
185
 
182
186
  void ImportColumnFamilyJob::Cleanup(const Status& status) {
@@ -306,7 +310,6 @@ Status ImportColumnFamilyJob::GetIngestedFileInfo(
306
310
 
307
311
  return status;
308
312
  }
309
-
310
313
  } // namespace ROCKSDB_NAMESPACE
311
314
 
312
315
  #endif // !ROCKSDB_LITE
@@ -556,10 +556,9 @@ TEST_F(ImportColumnFamilyTest, ImportColumnFamilyNegativeTest) {
556
556
  LiveFileMetaDataInit(file2_sst_name, sst_files_dir_, 1, 10, 19));
557
557
  metadata.db_comparator_name = options.comparator->Name();
558
558
 
559
- ASSERT_EQ(db_->CreateColumnFamilyWithImport(ColumnFamilyOptions(), "yoyo",
560
- ImportColumnFamilyOptions(),
561
- metadata, &import_cfh_),
562
- Status::InvalidArgument("Files have overlapping ranges"));
559
+ ASSERT_NOK(db_->CreateColumnFamilyWithImport(ColumnFamilyOptions(), "yoyo",
560
+ ImportColumnFamilyOptions(),
561
+ metadata, &import_cfh_));
563
562
  ASSERT_EQ(import_cfh_, nullptr);
564
563
  }
565
564
 
@@ -659,17 +659,18 @@ void InternalStats::CollectCacheEntryStats(bool foreground) {
659
659
  min_interval_factor);
660
660
  }
661
661
 
662
- std::function<void(const Slice&, void*, size_t, Cache::DeleterFn)>
662
+ std::function<void()> Blah() {
663
+ static int x = 42;
664
+ return [&]() { ++x; };
665
+ }
666
+
667
+ std::function<void(const Slice& key, Cache::ObjectPtr value, size_t charge,
668
+ const Cache::CacheItemHelper* helper)>
663
669
  InternalStats::CacheEntryRoleStats::GetEntryCallback() {
664
- return [&](const Slice& /*key*/, void* /*value*/, size_t charge,
665
- Cache::DeleterFn deleter) {
666
- auto e = role_map_.find(deleter);
667
- size_t role_idx;
668
- if (e == role_map_.end()) {
669
- role_idx = static_cast<size_t>(CacheEntryRole::kMisc);
670
- } else {
671
- role_idx = static_cast<size_t>(e->second);
672
- }
670
+ return [&](const Slice& /*key*/, Cache::ObjectPtr /*value*/, size_t charge,
671
+ const Cache::CacheItemHelper* helper) -> void {
672
+ size_t role_idx =
673
+ static_cast<size_t>(helper ? helper->role : CacheEntryRole::kMisc);
673
674
  entry_counts[role_idx]++;
674
675
  total_charges[role_idx] += charge;
675
676
  };
@@ -680,7 +681,6 @@ void InternalStats::CacheEntryRoleStats::BeginCollection(
680
681
  Clear();
681
682
  last_start_time_micros_ = start_time_micros;
682
683
  ++collection_count;
683
- role_map_ = CopyCacheDeleterRoleMap();
684
684
  std::ostringstream str;
685
685
  str << cache->Name() << "@" << static_cast<void*>(cache) << "#"
686
686
  << port::GetProcessID();
@@ -472,7 +472,8 @@ class InternalStats {
472
472
  }
473
473
 
474
474
  void BeginCollection(Cache*, SystemClock*, uint64_t start_time_micros);
475
- std::function<void(const Slice&, void*, size_t, Cache::DeleterFn)>
475
+ std::function<void(const Slice& key, Cache::ObjectPtr value, size_t charge,
476
+ const Cache::CacheItemHelper* helper)>
476
477
  GetEntryCallback();
477
478
  void EndCollection(Cache*, SystemClock*, uint64_t end_time_micros);
478
479
  void SkippedCollection();
@@ -482,7 +483,6 @@ class InternalStats {
482
483
  SystemClock* clock) const;
483
484
 
484
485
  private:
485
- UnorderedMap<Cache::DeleterFn, CacheEntryRole> role_map_;
486
486
  uint64_t GetLastDurationMicros() const;
487
487
  };
488
488
 
@@ -515,10 +515,11 @@ unsigned int Reader::ReadPhysicalRecord(Slice* result, size_t* drop_size,
515
515
 
516
516
  size_t uncompressed_size = 0;
517
517
  int remaining = 0;
518
+ const char* input = header + header_size;
518
519
  do {
519
- remaining = uncompress_->Uncompress(header + header_size, length,
520
- uncompressed_buffer_.get(),
521
- &uncompressed_size);
520
+ remaining = uncompress_->Uncompress(
521
+ input, length, uncompressed_buffer_.get(), &uncompressed_size);
522
+ input = nullptr;
522
523
  if (remaining < 0) {
523
524
  buffer_.clear();
524
525
  return kBadRecord;
@@ -830,10 +831,11 @@ bool FragmentBufferedReader::TryReadFragment(
830
831
  uncompressed_record_.clear();
831
832
  size_t uncompressed_size = 0;
832
833
  int remaining = 0;
834
+ const char* input = header + header_size;
833
835
  do {
834
- remaining = uncompress_->Uncompress(header + header_size, length,
835
- uncompressed_buffer_.get(),
836
- &uncompressed_size);
836
+ remaining = uncompress_->Uncompress(
837
+ input, length, uncompressed_buffer_.get(), &uncompressed_size);
838
+ input = nullptr;
837
839
  if (remaining < 0) {
838
840
  buffer_.clear();
839
841
  *fragment_type_or_err = kBadRecord;