@nxtedition/rocksdb 8.0.1 → 8.0.3

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 (129) hide show
  1. package/deps/rocksdb/rocksdb/CMakeLists.txt +2 -1
  2. package/deps/rocksdb/rocksdb/Makefile +2 -2
  3. package/deps/rocksdb/rocksdb/TARGETS +4 -2
  4. package/deps/rocksdb/rocksdb/cache/cache_bench_tool.cc +0 -5
  5. package/deps/rocksdb/rocksdb/cache/cache_test.cc +8 -29
  6. package/deps/rocksdb/rocksdb/cache/clock_cache.cc +146 -0
  7. package/deps/rocksdb/rocksdb/cache/clock_cache.h +13 -1
  8. package/deps/rocksdb/rocksdb/cache/lru_cache_test.cc +20 -146
  9. package/deps/rocksdb/rocksdb/cache/secondary_cache.cc +32 -0
  10. package/deps/rocksdb/rocksdb/db/blob/blob_counting_iterator.h +11 -0
  11. package/deps/rocksdb/rocksdb/db/column_family.cc +11 -9
  12. package/deps/rocksdb/rocksdb/db/column_family.h +20 -0
  13. package/deps/rocksdb/rocksdb/db/compaction/clipping_iterator.h +5 -0
  14. package/deps/rocksdb/rocksdb/db/compaction/compaction.cc +13 -33
  15. package/deps/rocksdb/rocksdb/db/compaction/compaction.h +5 -0
  16. package/deps/rocksdb/rocksdb/db/compaction/compaction_iterator.cc +27 -8
  17. package/deps/rocksdb/rocksdb/db/compaction/compaction_iterator.h +17 -1
  18. package/deps/rocksdb/rocksdb/db/compaction/compaction_job.cc +2 -1
  19. package/deps/rocksdb/rocksdb/db/compaction/compaction_job.h +4 -2
  20. package/deps/rocksdb/rocksdb/db/compaction/compaction_job_test.cc +8 -6
  21. package/deps/rocksdb/rocksdb/db/compaction/compaction_outputs.cc +65 -7
  22. package/deps/rocksdb/rocksdb/db/compaction/compaction_outputs.h +5 -0
  23. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker.cc +10 -32
  24. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker.h +28 -47
  25. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_fifo.cc +28 -22
  26. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_fifo.h +8 -14
  27. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_level.cc +8 -8
  28. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_level.h +5 -4
  29. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_test.cc +170 -140
  30. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_universal.cc +5 -1
  31. package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_universal.h +5 -4
  32. package/deps/rocksdb/rocksdb/db/compaction/compaction_service_job.cc +8 -2
  33. package/deps/rocksdb/rocksdb/db/compaction/subcompaction_state.h +8 -0
  34. package/deps/rocksdb/rocksdb/db/compaction/tiered_compaction_test.cc +266 -138
  35. package/deps/rocksdb/rocksdb/db/corruption_test.cc +86 -1
  36. package/deps/rocksdb/rocksdb/db/db_basic_test.cc +72 -5
  37. package/deps/rocksdb/rocksdb/db/db_block_cache_test.cc +119 -10
  38. package/deps/rocksdb/rocksdb/db/db_compaction_test.cc +585 -264
  39. package/deps/rocksdb/rocksdb/db/db_impl/db_impl.cc +46 -18
  40. package/deps/rocksdb/rocksdb/db/db_impl/db_impl.h +5 -1
  41. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_compaction_flush.cc +6 -15
  42. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_debug.cc +1 -1
  43. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_experimental.cc +1 -1
  44. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_files.cc +3 -0
  45. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_open.cc +8 -8
  46. package/deps/rocksdb/rocksdb/db/db_impl/db_impl_write.cc +10 -0
  47. package/deps/rocksdb/rocksdb/db/db_range_del_test.cc +250 -2
  48. package/deps/rocksdb/rocksdb/db/db_test.cc +3 -0
  49. package/deps/rocksdb/rocksdb/db/db_test2.cc +307 -8
  50. package/deps/rocksdb/rocksdb/db/db_wal_test.cc +129 -0
  51. package/deps/rocksdb/rocksdb/db/db_with_timestamp_compaction_test.cc +21 -0
  52. package/deps/rocksdb/rocksdb/db/dbformat.cc +25 -0
  53. package/deps/rocksdb/rocksdb/db/dbformat.h +2 -0
  54. package/deps/rocksdb/rocksdb/db/experimental.cc +1 -1
  55. package/deps/rocksdb/rocksdb/db/external_sst_file_ingestion_job.cc +5 -2
  56. package/deps/rocksdb/rocksdb/db/flush_job.cc +5 -2
  57. package/deps/rocksdb/rocksdb/db/history_trimming_iterator.h +4 -0
  58. package/deps/rocksdb/rocksdb/db/import_column_family_job.cc +56 -53
  59. package/deps/rocksdb/rocksdb/db/import_column_family_test.cc +3 -4
  60. package/deps/rocksdb/rocksdb/db/merge_helper.cc +4 -0
  61. package/deps/rocksdb/rocksdb/db/periodic_task_scheduler_test.cc +10 -10
  62. package/deps/rocksdb/rocksdb/db/repair.cc +64 -22
  63. package/deps/rocksdb/rocksdb/db/repair_test.cc +54 -0
  64. package/deps/rocksdb/rocksdb/db/seqno_time_test.cc +26 -26
  65. package/deps/rocksdb/rocksdb/db/table_cache.cc +2 -0
  66. package/deps/rocksdb/rocksdb/db/table_properties_collector.h +3 -1
  67. package/deps/rocksdb/rocksdb/db/version_builder.cc +90 -43
  68. package/deps/rocksdb/rocksdb/db/version_builder.h +20 -0
  69. package/deps/rocksdb/rocksdb/db/version_builder_test.cc +190 -67
  70. package/deps/rocksdb/rocksdb/db/version_edit.cc +15 -1
  71. package/deps/rocksdb/rocksdb/db/version_edit.h +16 -4
  72. package/deps/rocksdb/rocksdb/db/version_edit_handler.cc +41 -11
  73. package/deps/rocksdb/rocksdb/db/version_edit_handler.h +27 -12
  74. package/deps/rocksdb/rocksdb/db/version_edit_test.cc +18 -16
  75. package/deps/rocksdb/rocksdb/db/version_set.cc +212 -35
  76. package/deps/rocksdb/rocksdb/db/version_set.h +34 -4
  77. package/deps/rocksdb/rocksdb/db/version_set_test.cc +45 -25
  78. package/deps/rocksdb/rocksdb/db/write_thread.cc +5 -2
  79. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_common.h +0 -1
  80. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_gflags.cc +0 -4
  81. package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_test_base.cc +12 -17
  82. package/deps/rocksdb/rocksdb/db_stress_tool/no_batched_ops_stress.cc +6 -4
  83. package/deps/rocksdb/rocksdb/file/file_prefetch_buffer.h +1 -0
  84. package/deps/rocksdb/rocksdb/file/prefetch_test.cc +0 -48
  85. package/deps/rocksdb/rocksdb/file/random_access_file_reader.cc +8 -0
  86. package/deps/rocksdb/rocksdb/include/rocksdb/cache.h +196 -171
  87. package/deps/rocksdb/rocksdb/include/rocksdb/db.h +6 -0
  88. package/deps/rocksdb/rocksdb/include/rocksdb/metadata.h +9 -3
  89. package/deps/rocksdb/rocksdb/include/rocksdb/options.h +25 -18
  90. package/deps/rocksdb/rocksdb/include/rocksdb/secondary_cache.h +27 -5
  91. package/deps/rocksdb/rocksdb/include/rocksdb/statistics.h +5 -0
  92. package/deps/rocksdb/rocksdb/include/rocksdb/status.h +3 -0
  93. package/deps/rocksdb/rocksdb/include/rocksdb/version.h +1 -1
  94. package/deps/rocksdb/rocksdb/logging/logging.h +13 -19
  95. package/deps/rocksdb/rocksdb/memory/arena.cc +4 -3
  96. package/deps/rocksdb/rocksdb/memory/arena_test.cc +30 -0
  97. package/deps/rocksdb/rocksdb/monitoring/statistics.cc +3 -1
  98. package/deps/rocksdb/rocksdb/monitoring/stats_history_test.cc +26 -26
  99. package/deps/rocksdb/rocksdb/src.mk +2 -1
  100. package/deps/rocksdb/rocksdb/table/adaptive/adaptive_table_factory.cc +3 -2
  101. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader.cc +3 -2
  102. package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader_test.cc +1 -1
  103. package/deps/rocksdb/rocksdb/table/block_fetcher_test.cc +3 -3
  104. package/deps/rocksdb/rocksdb/table/compaction_merging_iterator.cc +142 -0
  105. package/deps/rocksdb/rocksdb/table/compaction_merging_iterator.h +241 -0
  106. package/deps/rocksdb/rocksdb/table/format.cc +24 -20
  107. package/deps/rocksdb/rocksdb/table/format.h +5 -2
  108. package/deps/rocksdb/rocksdb/table/merging_iterator.cc +97 -115
  109. package/deps/rocksdb/rocksdb/table/merging_iterator.h +82 -1
  110. package/deps/rocksdb/rocksdb/table/meta_blocks.cc +2 -2
  111. package/deps/rocksdb/rocksdb/table/sst_file_dumper.cc +1 -1
  112. package/deps/rocksdb/rocksdb/table/table_test.cc +7 -6
  113. package/deps/rocksdb/rocksdb/test_util/testutil.h +10 -0
  114. package/deps/rocksdb/rocksdb/tools/db_bench_tool.cc +0 -6
  115. package/deps/rocksdb/rocksdb/trace_replay/block_cache_tracer.h +2 -2
  116. package/deps/rocksdb/rocksdb/util/bloom_test.cc +1 -1
  117. package/deps/rocksdb/rocksdb/util/status.cc +7 -0
  118. package/deps/rocksdb/rocksdb/utilities/backup/backup_engine.cc +5 -0
  119. package/deps/rocksdb/rocksdb/utilities/backup/backup_engine_test.cc +4 -0
  120. package/deps/rocksdb/rocksdb/utilities/cache_dump_load_impl.cc +7 -67
  121. package/deps/rocksdb/rocksdb/utilities/cache_dump_load_impl.h +1 -3
  122. package/deps/rocksdb/rocksdb/utilities/checkpoint/checkpoint_impl.cc +1 -0
  123. package/deps/rocksdb/rocksdb/utilities/transactions/transaction_test.cc +59 -0
  124. package/deps/rocksdb/rocksdb.gyp +2 -1
  125. package/package.json +1 -1
  126. package/prebuilds/darwin-arm64/node.napi.node +0 -0
  127. package/prebuilds/linux-x64/node.napi.node +0 -0
  128. package/deps/rocksdb/rocksdb/cache/fast_lru_cache.cc +0 -580
  129. package/deps/rocksdb/rocksdb/cache/fast_lru_cache.h +0 -476
@@ -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);
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
 
@@ -224,6 +224,10 @@ Status MergeHelper::MergeUntil(InternalIterator* iter,
224
224
  s = Status::ShutdownInProgress();
225
225
  return s;
226
226
  }
227
+ // Skip range tombstones emitted by the compaction iterator.
228
+ if (iter->IsDeleteRangeSentinelKey()) {
229
+ continue;
230
+ }
227
231
 
228
232
  ParsedInternalKey ikey;
229
233
  assert(keys_.size() == merge_context_.GetNumOperands());
@@ -65,7 +65,7 @@ TEST_F(PeriodicTaskSchedulerTest, Basic) {
65
65
  ASSERT_EQ(kPeriodSec, dbfull()->GetDBOptions().stats_persist_period_sec);
66
66
 
67
67
  ASSERT_GT(kPeriodSec, 1u);
68
- dbfull()->TEST_WaitForPeridicTaskRun([&] {
68
+ dbfull()->TEST_WaitForPeriodicTaskRun([&] {
69
69
  mock_clock_->MockSleepForSeconds(static_cast<int>(kPeriodSec) - 1);
70
70
  });
71
71
 
@@ -77,14 +77,14 @@ TEST_F(PeriodicTaskSchedulerTest, Basic) {
77
77
  ASSERT_EQ(1, pst_st_counter);
78
78
  ASSERT_EQ(1, flush_info_log_counter);
79
79
 
80
- dbfull()->TEST_WaitForPeridicTaskRun(
80
+ dbfull()->TEST_WaitForPeriodicTaskRun(
81
81
  [&] { mock_clock_->MockSleepForSeconds(static_cast<int>(kPeriodSec)); });
82
82
 
83
83
  ASSERT_EQ(2, dump_st_counter);
84
84
  ASSERT_EQ(2, pst_st_counter);
85
85
  ASSERT_EQ(2, flush_info_log_counter);
86
86
 
87
- dbfull()->TEST_WaitForPeridicTaskRun(
87
+ dbfull()->TEST_WaitForPeriodicTaskRun(
88
88
  [&] { mock_clock_->MockSleepForSeconds(static_cast<int>(kPeriodSec)); });
89
89
 
90
90
  ASSERT_EQ(3, dump_st_counter);
@@ -98,7 +98,7 @@ TEST_F(PeriodicTaskSchedulerTest, Basic) {
98
98
  ASSERT_EQ(0u, dbfull()->GetDBOptions().stats_persist_period_sec);
99
99
 
100
100
  // Info log flush should still run.
101
- dbfull()->TEST_WaitForPeridicTaskRun(
101
+ dbfull()->TEST_WaitForPeriodicTaskRun(
102
102
  [&] { mock_clock_->MockSleepForSeconds(static_cast<int>(kPeriodSec)); });
103
103
  ASSERT_EQ(3, dump_st_counter);
104
104
  ASSERT_EQ(3, pst_st_counter);
@@ -113,7 +113,7 @@ TEST_F(PeriodicTaskSchedulerTest, Basic) {
113
113
 
114
114
  ASSERT_EQ(2, scheduler.TEST_GetValidTaskNum());
115
115
 
116
- dbfull()->TEST_WaitForPeridicTaskRun(
116
+ dbfull()->TEST_WaitForPeriodicTaskRun(
117
117
  [&] { mock_clock_->MockSleepForSeconds(static_cast<int>(kPeriodSec)); });
118
118
  ASSERT_EQ(4, dump_st_counter);
119
119
  ASSERT_EQ(3, pst_st_counter);
@@ -154,19 +154,19 @@ TEST_F(PeriodicTaskSchedulerTest, MultiInstances) {
154
154
  ASSERT_EQ(kInstanceNum * 3, scheduler.TEST_GetValidTaskNum());
155
155
 
156
156
  int expected_run = kInstanceNum;
157
- dbi->TEST_WaitForPeridicTaskRun(
157
+ dbi->TEST_WaitForPeriodicTaskRun(
158
158
  [&] { mock_clock_->MockSleepForSeconds(kPeriodSec - 1); });
159
159
  ASSERT_EQ(expected_run, dump_st_counter);
160
160
  ASSERT_EQ(expected_run, pst_st_counter);
161
161
 
162
162
  expected_run += kInstanceNum;
163
- dbi->TEST_WaitForPeridicTaskRun(
163
+ dbi->TEST_WaitForPeriodicTaskRun(
164
164
  [&] { mock_clock_->MockSleepForSeconds(kPeriodSec); });
165
165
  ASSERT_EQ(expected_run, dump_st_counter);
166
166
  ASSERT_EQ(expected_run, pst_st_counter);
167
167
 
168
168
  expected_run += kInstanceNum;
169
- dbi->TEST_WaitForPeridicTaskRun(
169
+ dbi->TEST_WaitForPeriodicTaskRun(
170
170
  [&] { mock_clock_->MockSleepForSeconds(kPeriodSec); });
171
171
  ASSERT_EQ(expected_run, dump_st_counter);
172
172
  ASSERT_EQ(expected_run, pst_st_counter);
@@ -178,9 +178,9 @@ TEST_F(PeriodicTaskSchedulerTest, MultiInstances) {
178
178
 
179
179
  expected_run += (kInstanceNum - half) * 2;
180
180
 
181
- dbi->TEST_WaitForPeridicTaskRun(
181
+ dbi->TEST_WaitForPeriodicTaskRun(
182
182
  [&] { mock_clock_->MockSleepForSeconds(kPeriodSec); });
183
- dbi->TEST_WaitForPeridicTaskRun(
183
+ dbi->TEST_WaitForPeriodicTaskRun(
184
184
  [&] { mock_clock_->MockSleepForSeconds(kPeriodSec); });
185
185
  ASSERT_EQ(expected_run, dump_st_counter);
186
186
  ASSERT_EQ(expected_run, pst_st_counter);
@@ -59,6 +59,7 @@
59
59
  // Store per-table metadata (smallest, largest, largest-seq#, ...)
60
60
  // in the table's meta section to speed up ScanTable.
61
61
 
62
+ #include "db/version_builder.h"
62
63
  #ifndef ROCKSDB_LITE
63
64
 
64
65
  #include <cinttypes>
@@ -640,38 +641,79 @@ class Repairer {
640
641
  for (const auto& cf_id_and_tables : cf_id_to_tables) {
641
642
  auto* cfd =
642
643
  vset_.GetColumnFamilySet()->GetColumnFamily(cf_id_and_tables.first);
643
- VersionEdit edit;
644
- edit.SetComparatorName(cfd->user_comparator()->Name());
645
- edit.SetLogNumber(0);
646
- edit.SetNextFile(next_file_number_);
647
- edit.SetColumnFamily(cfd->GetID());
648
644
 
649
- // TODO(opt): separate out into multiple levels
645
+ // Recover files' epoch number using dummy VersionStorageInfo
646
+ VersionBuilder dummy_version_builder(
647
+ cfd->current()->version_set()->file_options(), cfd->ioptions(),
648
+ cfd->table_cache(), cfd->current()->storage_info(),
649
+ cfd->current()->version_set(),
650
+ cfd->GetFileMetadataCacheReservationManager());
651
+ VersionStorageInfo dummy_vstorage(
652
+ &cfd->internal_comparator(), cfd->user_comparator(),
653
+ cfd->NumberLevels(), cfd->ioptions()->compaction_style,
654
+ nullptr /* src_vstorage */, cfd->ioptions()->force_consistency_checks,
655
+ EpochNumberRequirement::kMightMissing);
656
+ Status s;
657
+ VersionEdit dummy_edit;
650
658
  for (const auto* table : cf_id_and_tables.second) {
651
- edit.AddFile(
659
+ // TODO(opt): separate out into multiple levels
660
+ dummy_edit.AddFile(
652
661
  0, table->meta.fd.GetNumber(), table->meta.fd.GetPathId(),
653
662
  table->meta.fd.GetFileSize(), table->meta.smallest,
654
663
  table->meta.largest, table->meta.fd.smallest_seqno,
655
664
  table->meta.fd.largest_seqno, table->meta.marked_for_compaction,
656
665
  table->meta.temperature, table->meta.oldest_blob_file_number,
657
666
  table->meta.oldest_ancester_time, table->meta.file_creation_time,
658
- table->meta.file_checksum, table->meta.file_checksum_func_name,
659
- table->meta.unique_id);
667
+ table->meta.epoch_number, table->meta.file_checksum,
668
+ table->meta.file_checksum_func_name, table->meta.unique_id);
660
669
  }
661
- assert(next_file_number_ > 0);
662
- vset_.MarkFileNumberUsed(next_file_number_ - 1);
663
- mutex_.Lock();
664
- std::unique_ptr<FSDirectory> db_dir;
665
- Status status = env_->GetFileSystem()->NewDirectory(dbname_, IOOptions(),
666
- &db_dir, nullptr);
667
- if (status.ok()) {
668
- status = vset_.LogAndApply(cfd, *cfd->GetLatestMutableCFOptions(),
669
- &edit, &mutex_, db_dir.get(),
670
- false /* new_descriptor_log */);
670
+ s = dummy_version_builder.Apply(&dummy_edit);
671
+ if (s.ok()) {
672
+ s = dummy_version_builder.SaveTo(&dummy_vstorage);
671
673
  }
672
- mutex_.Unlock();
673
- if (!status.ok()) {
674
- return status;
674
+ if (s.ok()) {
675
+ dummy_vstorage.RecoverEpochNumbers(cfd);
676
+ }
677
+ if (s.ok()) {
678
+ // Record changes from this repair in VersionEdit, including files with
679
+ // recovered epoch numbers
680
+ VersionEdit edit;
681
+ edit.SetComparatorName(cfd->user_comparator()->Name());
682
+ edit.SetLogNumber(0);
683
+ edit.SetNextFile(next_file_number_);
684
+ edit.SetColumnFamily(cfd->GetID());
685
+ for (int level = 0; level < dummy_vstorage.num_levels(); ++level) {
686
+ for (FileMetaData* file_meta : dummy_vstorage.LevelFiles(level)) {
687
+ edit.AddFile(level, *file_meta);
688
+ }
689
+ }
690
+
691
+ // Release resources occupied by the dummy VersionStorageInfo
692
+ for (int level = 0; level < dummy_vstorage.num_levels(); ++level) {
693
+ for (FileMetaData* file_meta : dummy_vstorage.LevelFiles(level)) {
694
+ file_meta->refs--;
695
+ if (file_meta->refs <= 0) {
696
+ delete file_meta;
697
+ }
698
+ }
699
+ }
700
+
701
+ // Persist record of changes
702
+ assert(next_file_number_ > 0);
703
+ vset_.MarkFileNumberUsed(next_file_number_ - 1);
704
+ mutex_.Lock();
705
+ std::unique_ptr<FSDirectory> db_dir;
706
+ s = env_->GetFileSystem()->NewDirectory(dbname_, IOOptions(), &db_dir,
707
+ nullptr);
708
+ if (s.ok()) {
709
+ s = vset_.LogAndApply(cfd, *cfd->GetLatestMutableCFOptions(), &edit,
710
+ &mutex_, db_dir.get(),
711
+ false /* new_descriptor_log */);
712
+ }
713
+ mutex_.Unlock();
714
+ }
715
+ if (!s.ok()) {
716
+ return s;
675
717
  }
676
718
  }
677
719
  return Status::OK();
@@ -62,8 +62,62 @@ class RepairTest : public DBTestBase {
62
62
  ASSERT_GT(verify_passed, 0);
63
63
  SyncPoint::GetInstance()->DisableProcessing();
64
64
  }
65
+
66
+ std::vector<FileMetaData*> GetLevelFileMetadatas(int level, int cf = 0) {
67
+ VersionSet* const versions = dbfull()->GetVersionSet();
68
+ assert(versions);
69
+ ColumnFamilyData* const cfd =
70
+ versions->GetColumnFamilySet()->GetColumnFamily(cf);
71
+ assert(cfd);
72
+ Version* const current = cfd->current();
73
+ assert(current);
74
+ VersionStorageInfo* const storage_info = current->storage_info();
75
+ assert(storage_info);
76
+ return storage_info->LevelFiles(level);
77
+ }
65
78
  };
66
79
 
80
+ TEST_F(RepairTest, SortRepairedDBL0ByEpochNumber) {
81
+ Options options = CurrentOptions();
82
+ DestroyAndReopen(options);
83
+
84
+ ASSERT_OK(Put("k1", "oldest"));
85
+ ASSERT_OK(Put("k1", "older"));
86
+ ASSERT_OK(Flush());
87
+ MoveFilesToLevel(1);
88
+
89
+ ASSERT_OK(Put("k1", "old"));
90
+ ASSERT_OK(Flush());
91
+
92
+ ASSERT_OK(Put("k1", "new"));
93
+
94
+ std::vector<FileMetaData*> level0_files = GetLevelFileMetadatas(0 /* level*/);
95
+ ASSERT_EQ(level0_files.size(), 1);
96
+ ASSERT_EQ(level0_files[0]->epoch_number, 2);
97
+ std::vector<FileMetaData*> level1_files = GetLevelFileMetadatas(1 /* level*/);
98
+ ASSERT_EQ(level1_files.size(), 1);
99
+ ASSERT_EQ(level1_files[0]->epoch_number, 1);
100
+
101
+ std::string manifest_path =
102
+ DescriptorFileName(dbname_, dbfull()->TEST_Current_Manifest_FileNo());
103
+ Close();
104
+ ASSERT_OK(env_->FileExists(manifest_path));
105
+ ASSERT_OK(env_->DeleteFile(manifest_path));
106
+
107
+ ASSERT_OK(RepairDB(dbname_, CurrentOptions()));
108
+ ReopenWithSstIdVerify();
109
+
110
+ EXPECT_EQ(Get("k1"), "new");
111
+
112
+ level0_files = GetLevelFileMetadatas(0 /* level*/);
113
+ ASSERT_EQ(level0_files.size(), 3);
114
+ EXPECT_EQ(level0_files[0]->epoch_number, 3);
115
+ EXPECT_EQ(level0_files[1]->epoch_number, 2);
116
+ EXPECT_EQ(level0_files[2]->epoch_number, 1);
117
+ level1_files = GetLevelFileMetadatas(1 /* level*/);
118
+ ASSERT_EQ(level1_files.size(), 0);
119
+ }
120
+
67
121
  TEST_F(RepairTest, LostManifest) {
68
122
  // Add a couple SST files, delete the manifest, and verify RepairDB() saves
69
123
  // the day.
@@ -80,7 +80,7 @@ TEST_F(SeqnoTimeTest, TemperatureBasicUniversal) {
80
80
 
81
81
  // pass some time first, otherwise the first a few keys write time are going
82
82
  // to be zero, and internally zero has special meaning: kUnknownSeqnoTime
83
- dbfull()->TEST_WaitForPeridicTaskRun(
83
+ dbfull()->TEST_WaitForPeriodicTaskRun(
84
84
  [&] { mock_clock_->MockSleepForSeconds(static_cast<int>(kKeyPerSec)); });
85
85
 
86
86
  int sst_num = 0;
@@ -88,7 +88,7 @@ TEST_F(SeqnoTimeTest, TemperatureBasicUniversal) {
88
88
  for (; sst_num < kNumTrigger; sst_num++) {
89
89
  for (int i = 0; i < kNumKeys; i++) {
90
90
  ASSERT_OK(Put(Key(sst_num * (kNumKeys - 1) + i), "value"));
91
- dbfull()->TEST_WaitForPeridicTaskRun([&] {
91
+ dbfull()->TEST_WaitForPeriodicTaskRun([&] {
92
92
  mock_clock_->MockSleepForSeconds(static_cast<int>(kKeyPerSec));
93
93
  });
94
94
  }
@@ -110,7 +110,7 @@ TEST_F(SeqnoTimeTest, TemperatureBasicUniversal) {
110
110
  for (; sst_num < kNumTrigger * 2; sst_num++) {
111
111
  for (int i = 0; i < kNumKeys; i++) {
112
112
  ASSERT_OK(Put(Key(sst_num * (kNumKeys - 1) + i), "value"));
113
- dbfull()->TEST_WaitForPeridicTaskRun([&] {
113
+ dbfull()->TEST_WaitForPeriodicTaskRun([&] {
114
114
  mock_clock_->MockSleepForSeconds(static_cast<int>(kKeyPerSec));
115
115
  });
116
116
  }
@@ -124,7 +124,7 @@ TEST_F(SeqnoTimeTest, TemperatureBasicUniversal) {
124
124
  for (; sst_num < kNumTrigger * 3; sst_num++) {
125
125
  for (int i = 0; i < kNumKeys; i++) {
126
126
  ASSERT_OK(Put(Key(sst_num * (kNumKeys - 1) + i), "value"));
127
- dbfull()->TEST_WaitForPeridicTaskRun([&] {
127
+ dbfull()->TEST_WaitForPeriodicTaskRun([&] {
128
128
  mock_clock_->MockSleepForSeconds(static_cast<int>(kKeyPerSec));
129
129
  });
130
130
  }
@@ -143,7 +143,7 @@ TEST_F(SeqnoTimeTest, TemperatureBasicUniversal) {
143
143
  AssertKeyTemperature(20, Temperature::kCold);
144
144
 
145
145
  for (int i = 0; i < 30; i++) {
146
- dbfull()->TEST_WaitForPeridicTaskRun([&] {
146
+ dbfull()->TEST_WaitForPeriodicTaskRun([&] {
147
147
  mock_clock_->MockSleepForSeconds(static_cast<int>(20 * kKeyPerSec));
148
148
  });
149
149
  ASSERT_OK(db_->CompactRange(cro, nullptr, nullptr));
@@ -161,7 +161,7 @@ TEST_F(SeqnoTimeTest, TemperatureBasicUniversal) {
161
161
  // the compaction will not get the new seqno->time sampling to decide the last
162
162
  // a few data's time.
163
163
  for (int i = 0; i < 5; i++) {
164
- dbfull()->TEST_WaitForPeridicTaskRun(
164
+ dbfull()->TEST_WaitForPeriodicTaskRun(
165
165
  [&] { mock_clock_->MockSleepForSeconds(static_cast<int>(1000)); });
166
166
  ASSERT_OK(db_->CompactRange(cro, nullptr, nullptr));
167
167
  }
@@ -192,7 +192,7 @@ TEST_F(SeqnoTimeTest, TemperatureBasicLevel) {
192
192
 
193
193
  // pass some time first, otherwise the first a few keys write time are going
194
194
  // to be zero, and internally zero has special meaning: kUnknownSeqnoTime
195
- dbfull()->TEST_WaitForPeridicTaskRun(
195
+ dbfull()->TEST_WaitForPeriodicTaskRun(
196
196
  [&] { mock_clock_->MockSleepForSeconds(static_cast<int>(10)); });
197
197
 
198
198
  int sst_num = 0;
@@ -200,7 +200,7 @@ TEST_F(SeqnoTimeTest, TemperatureBasicLevel) {
200
200
  for (; sst_num < 4; sst_num++) {
201
201
  for (int i = 0; i < kNumKeys; i++) {
202
202
  ASSERT_OK(Put(Key(sst_num * (kNumKeys - 1) + i), "value"));
203
- dbfull()->TEST_WaitForPeridicTaskRun(
203
+ dbfull()->TEST_WaitForPeriodicTaskRun(
204
204
  [&] { mock_clock_->MockSleepForSeconds(static_cast<int>(10)); });
205
205
  }
206
206
  ASSERT_OK(Flush());
@@ -222,7 +222,7 @@ TEST_F(SeqnoTimeTest, TemperatureBasicLevel) {
222
222
  for (; sst_num < 14; sst_num++) {
223
223
  for (int i = 0; i < kNumKeys; i++) {
224
224
  ASSERT_OK(Put(Key(sst_num * (kNumKeys - 1) + i), "value"));
225
- dbfull()->TEST_WaitForPeridicTaskRun(
225
+ dbfull()->TEST_WaitForPeriodicTaskRun(
226
226
  [&] { mock_clock_->MockSleepForSeconds(static_cast<int>(10)); });
227
227
  }
228
228
  ASSERT_OK(Flush());
@@ -243,7 +243,7 @@ TEST_F(SeqnoTimeTest, TemperatureBasicLevel) {
243
243
  // Wait some time, with each wait, the cold data is increasing and hot data is
244
244
  // decreasing
245
245
  for (int i = 0; i < 30; i++) {
246
- dbfull()->TEST_WaitForPeridicTaskRun(
246
+ dbfull()->TEST_WaitForPeriodicTaskRun(
247
247
  [&] { mock_clock_->MockSleepForSeconds(static_cast<int>(200)); });
248
248
  ASSERT_OK(db_->CompactRange(cro, nullptr, nullptr));
249
249
  uint64_t pre_hot = hot_data_size;
@@ -262,7 +262,7 @@ TEST_F(SeqnoTimeTest, TemperatureBasicLevel) {
262
262
  // hot data might not be empty, because if we don't write new data, there's
263
263
  // no seqno->time sampling available to the compaction
264
264
  for (int i = 0; i < 5; i++) {
265
- dbfull()->TEST_WaitForPeridicTaskRun(
265
+ dbfull()->TEST_WaitForPeriodicTaskRun(
266
266
  [&] { mock_clock_->MockSleepForSeconds(static_cast<int>(1000)); });
267
267
  ASSERT_OK(db_->CompactRange(cro, nullptr, nullptr));
268
268
  }
@@ -324,7 +324,7 @@ TEST_P(SeqnoTimeTablePropTest, BasicSeqnoToTimeMapping) {
324
324
  // Write a key every 10 seconds
325
325
  for (int i = 0; i < 200; i++) {
326
326
  ASSERT_OK(Put(Key(i), "value"));
327
- dbfull()->TEST_WaitForPeridicTaskRun(
327
+ dbfull()->TEST_WaitForPeriodicTaskRun(
328
328
  [&] { mock_clock_->MockSleepForSeconds(static_cast<int>(10)); });
329
329
  }
330
330
  ASSERT_OK(Flush());
@@ -357,7 +357,7 @@ TEST_P(SeqnoTimeTablePropTest, BasicSeqnoToTimeMapping) {
357
357
  // Write a key every 1 seconds
358
358
  for (int i = 0; i < 200; i++) {
359
359
  ASSERT_OK(Put(Key(i + 190), "value"));
360
- dbfull()->TEST_WaitForPeridicTaskRun(
360
+ dbfull()->TEST_WaitForPeriodicTaskRun(
361
361
  [&] { mock_clock_->MockSleepForSeconds(static_cast<int>(1)); });
362
362
  }
363
363
  seq_end = dbfull()->GetLatestSequenceNumber();
@@ -393,7 +393,7 @@ TEST_P(SeqnoTimeTablePropTest, BasicSeqnoToTimeMapping) {
393
393
  // Write a key every 200 seconds
394
394
  for (int i = 0; i < 200; i++) {
395
395
  ASSERT_OK(Put(Key(i + 380), "value"));
396
- dbfull()->TEST_WaitForPeridicTaskRun(
396
+ dbfull()->TEST_WaitForPeriodicTaskRun(
397
397
  [&] { mock_clock_->MockSleepForSeconds(static_cast<int>(200)); });
398
398
  }
399
399
  seq_end = dbfull()->GetLatestSequenceNumber();
@@ -435,7 +435,7 @@ TEST_P(SeqnoTimeTablePropTest, BasicSeqnoToTimeMapping) {
435
435
  // Write a key every 100 seconds
436
436
  for (int i = 0; i < 200; i++) {
437
437
  ASSERT_OK(Put(Key(i + 570), "value"));
438
- dbfull()->TEST_WaitForPeridicTaskRun(
438
+ dbfull()->TEST_WaitForPeriodicTaskRun(
439
439
  [&] { mock_clock_->MockSleepForSeconds(static_cast<int>(100)); });
440
440
  }
441
441
  seq_end = dbfull()->GetLatestSequenceNumber();
@@ -516,7 +516,7 @@ TEST_P(SeqnoTimeTablePropTest, MultiCFs) {
516
516
  // Write some data and increase the current time
517
517
  for (int i = 0; i < 200; i++) {
518
518
  ASSERT_OK(Put(Key(i), "value"));
519
- dbfull()->TEST_WaitForPeridicTaskRun(
519
+ dbfull()->TEST_WaitForPeriodicTaskRun(
520
520
  [&] { mock_clock_->MockSleepForSeconds(static_cast<int>(100)); });
521
521
  }
522
522
  ASSERT_OK(Flush());
@@ -536,7 +536,7 @@ TEST_P(SeqnoTimeTablePropTest, MultiCFs) {
536
536
  // Write some data to the default CF (without preclude_last_level feature)
537
537
  for (int i = 0; i < 200; i++) {
538
538
  ASSERT_OK(Put(Key(i), "value"));
539
- dbfull()->TEST_WaitForPeridicTaskRun(
539
+ dbfull()->TEST_WaitForPeriodicTaskRun(
540
540
  [&] { mock_clock_->MockSleepForSeconds(static_cast<int>(100)); });
541
541
  }
542
542
  ASSERT_OK(Flush());
@@ -544,7 +544,7 @@ TEST_P(SeqnoTimeTablePropTest, MultiCFs) {
544
544
  // Write some data to the CF one
545
545
  for (int i = 0; i < 20; i++) {
546
546
  ASSERT_OK(Put(1, Key(i), "value"));
547
- dbfull()->TEST_WaitForPeridicTaskRun(
547
+ dbfull()->TEST_WaitForPeriodicTaskRun(
548
548
  [&] { mock_clock_->MockSleepForSeconds(static_cast<int>(10)); });
549
549
  }
550
550
  ASSERT_OK(Flush(1));
@@ -568,7 +568,7 @@ TEST_P(SeqnoTimeTablePropTest, MultiCFs) {
568
568
  // Add more data to CF "two" to fill the in memory mapping
569
569
  for (int i = 0; i < 2000; i++) {
570
570
  ASSERT_OK(Put(2, Key(i), "value"));
571
- dbfull()->TEST_WaitForPeridicTaskRun(
571
+ dbfull()->TEST_WaitForPeriodicTaskRun(
572
572
  [&] { mock_clock_->MockSleepForSeconds(static_cast<int>(100)); });
573
573
  }
574
574
  seqs = dbfull()->TEST_GetSeqnoToTimeMapping().TEST_GetInternalMapping();
@@ -592,7 +592,7 @@ TEST_P(SeqnoTimeTablePropTest, MultiCFs) {
592
592
  // enabled have flushed, the in-memory seqno->time mapping should be cleared
593
593
  for (int i = 0; i < 10; i++) {
594
594
  ASSERT_OK(Put(0, Key(i), "value"));
595
- dbfull()->TEST_WaitForPeridicTaskRun(
595
+ dbfull()->TEST_WaitForPeriodicTaskRun(
596
596
  [&] { mock_clock_->MockSleepForSeconds(static_cast<int>(100)); });
597
597
  }
598
598
  seqs = dbfull()->TEST_GetSeqnoToTimeMapping().TEST_GetInternalMapping();
@@ -603,7 +603,7 @@ TEST_P(SeqnoTimeTablePropTest, MultiCFs) {
603
603
  for (int j = 0; j < 3; j++) {
604
604
  for (int i = 0; i < 200; i++) {
605
605
  ASSERT_OK(Put(2, Key(i), "value"));
606
- dbfull()->TEST_WaitForPeridicTaskRun(
606
+ dbfull()->TEST_WaitForPeriodicTaskRun(
607
607
  [&] { mock_clock_->MockSleepForSeconds(static_cast<int>(100)); });
608
608
  }
609
609
  ASSERT_OK(Flush(2));
@@ -623,7 +623,7 @@ TEST_P(SeqnoTimeTablePropTest, MultiCFs) {
623
623
  for (int j = 0; j < 2; j++) {
624
624
  for (int i = 0; i < 200; i++) {
625
625
  ASSERT_OK(Put(0, Key(i), "value"));
626
- dbfull()->TEST_WaitForPeridicTaskRun(
626
+ dbfull()->TEST_WaitForPeriodicTaskRun(
627
627
  [&] { mock_clock_->MockSleepForSeconds(static_cast<int>(100)); });
628
628
  }
629
629
  ASSERT_OK(Flush(0));
@@ -638,7 +638,7 @@ TEST_P(SeqnoTimeTablePropTest, MultiCFs) {
638
638
  // Write some data to CF "two", but don't flush to accumulate
639
639
  for (int i = 0; i < 1000; i++) {
640
640
  ASSERT_OK(Put(2, Key(i), "value"));
641
- dbfull()->TEST_WaitForPeridicTaskRun(
641
+ dbfull()->TEST_WaitForPeriodicTaskRun(
642
642
  [&] { mock_clock_->MockSleepForSeconds(static_cast<int>(100)); });
643
643
  }
644
644
  ASSERT_GE(
@@ -682,7 +682,7 @@ TEST_P(SeqnoTimeTablePropTest, MultiInstancesBasic) {
682
682
  WriteOptions wo;
683
683
  for (int i = 0; i < 200; i++) {
684
684
  ASSERT_OK(dbi->Put(wo, Key(i), "value"));
685
- dbfull()->TEST_WaitForPeridicTaskRun(
685
+ dbfull()->TEST_WaitForPeriodicTaskRun(
686
686
  [&] { mock_clock_->MockSleepForSeconds(static_cast<int>(100)); });
687
687
  }
688
688
  SeqnoToTimeMapping seqno_to_time_mapping = dbi->TEST_GetSeqnoToTimeMapping();
@@ -720,7 +720,7 @@ TEST_P(SeqnoTimeTablePropTest, SeqnoToTimeMappingUniversal) {
720
720
  for (; sst_num < kNumTrigger - 1; sst_num++) {
721
721
  for (int i = 0; i < kNumKeys; i++) {
722
722
  ASSERT_OK(Put(Key(sst_num * (kNumKeys - 1) + i), "value"));
723
- dbfull()->TEST_WaitForPeridicTaskRun(
723
+ dbfull()->TEST_WaitForPeriodicTaskRun(
724
724
  [&] { mock_clock_->MockSleepForSeconds(static_cast<int>(10)); });
725
725
  }
726
726
  ASSERT_OK(Flush());
@@ -742,7 +742,7 @@ TEST_P(SeqnoTimeTablePropTest, SeqnoToTimeMappingUniversal) {
742
742
  // Trigger a compaction
743
743
  for (int i = 0; i < kNumKeys; i++) {
744
744
  ASSERT_OK(Put(Key(sst_num * (kNumKeys - 1) + i), "value"));
745
- dbfull()->TEST_WaitForPeridicTaskRun(
745
+ dbfull()->TEST_WaitForPeriodicTaskRun(
746
746
  [&] { mock_clock_->MockSleepForSeconds(static_cast<int>(10)); });
747
747
  }
748
748
  sst_num++;
@@ -127,6 +127,8 @@ Status TableCache::GetTableReader(
127
127
  FileOptions fopts = file_options;
128
128
  fopts.temperature = file_temperature;
129
129
  Status s = PrepareIOFromReadOptions(ro, ioptions_.clock, fopts.io_options);
130
+ TEST_SYNC_POINT_CALLBACK("TableCache::GetTableReader:BeforeOpenFile",
131
+ const_cast<Status*>(&s));
130
132
  if (s.ok()) {
131
133
  s = ioptions_.fs->NewRandomAccessFile(fname, fopts, &file, nullptr);
132
134
  }