@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.
- package/deps/rocksdb/rocksdb/CMakeLists.txt +2 -1
- package/deps/rocksdb/rocksdb/Makefile +2 -2
- package/deps/rocksdb/rocksdb/TARGETS +4 -2
- package/deps/rocksdb/rocksdb/cache/cache_bench_tool.cc +0 -5
- package/deps/rocksdb/rocksdb/cache/cache_test.cc +8 -29
- package/deps/rocksdb/rocksdb/cache/clock_cache.cc +146 -0
- package/deps/rocksdb/rocksdb/cache/clock_cache.h +13 -1
- package/deps/rocksdb/rocksdb/cache/lru_cache_test.cc +20 -146
- package/deps/rocksdb/rocksdb/cache/secondary_cache.cc +32 -0
- package/deps/rocksdb/rocksdb/db/blob/blob_counting_iterator.h +11 -0
- package/deps/rocksdb/rocksdb/db/column_family.cc +11 -9
- package/deps/rocksdb/rocksdb/db/column_family.h +20 -0
- package/deps/rocksdb/rocksdb/db/compaction/clipping_iterator.h +5 -0
- package/deps/rocksdb/rocksdb/db/compaction/compaction.cc +13 -33
- package/deps/rocksdb/rocksdb/db/compaction/compaction.h +5 -0
- package/deps/rocksdb/rocksdb/db/compaction/compaction_iterator.cc +27 -8
- package/deps/rocksdb/rocksdb/db/compaction/compaction_iterator.h +17 -1
- package/deps/rocksdb/rocksdb/db/compaction/compaction_job.cc +2 -1
- package/deps/rocksdb/rocksdb/db/compaction/compaction_job.h +4 -2
- package/deps/rocksdb/rocksdb/db/compaction/compaction_job_test.cc +8 -6
- package/deps/rocksdb/rocksdb/db/compaction/compaction_outputs.cc +65 -7
- package/deps/rocksdb/rocksdb/db/compaction/compaction_outputs.h +5 -0
- package/deps/rocksdb/rocksdb/db/compaction/compaction_picker.cc +10 -32
- package/deps/rocksdb/rocksdb/db/compaction/compaction_picker.h +28 -47
- package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_fifo.cc +28 -22
- package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_fifo.h +8 -14
- package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_level.cc +8 -8
- package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_level.h +5 -4
- package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_test.cc +170 -140
- package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_universal.cc +5 -1
- package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_universal.h +5 -4
- package/deps/rocksdb/rocksdb/db/compaction/compaction_service_job.cc +8 -2
- package/deps/rocksdb/rocksdb/db/compaction/subcompaction_state.h +8 -0
- package/deps/rocksdb/rocksdb/db/compaction/tiered_compaction_test.cc +266 -138
- package/deps/rocksdb/rocksdb/db/corruption_test.cc +86 -1
- package/deps/rocksdb/rocksdb/db/db_basic_test.cc +72 -5
- package/deps/rocksdb/rocksdb/db/db_block_cache_test.cc +119 -10
- package/deps/rocksdb/rocksdb/db/db_compaction_test.cc +585 -264
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl.cc +46 -18
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl.h +5 -1
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl_compaction_flush.cc +6 -15
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl_debug.cc +1 -1
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl_experimental.cc +1 -1
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl_files.cc +3 -0
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl_open.cc +8 -8
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl_write.cc +10 -0
- package/deps/rocksdb/rocksdb/db/db_range_del_test.cc +250 -2
- package/deps/rocksdb/rocksdb/db/db_test.cc +3 -0
- package/deps/rocksdb/rocksdb/db/db_test2.cc +307 -8
- package/deps/rocksdb/rocksdb/db/db_wal_test.cc +129 -0
- package/deps/rocksdb/rocksdb/db/db_with_timestamp_compaction_test.cc +21 -0
- package/deps/rocksdb/rocksdb/db/dbformat.cc +25 -0
- package/deps/rocksdb/rocksdb/db/dbformat.h +2 -0
- package/deps/rocksdb/rocksdb/db/experimental.cc +1 -1
- package/deps/rocksdb/rocksdb/db/external_sst_file_ingestion_job.cc +5 -2
- package/deps/rocksdb/rocksdb/db/flush_job.cc +5 -2
- package/deps/rocksdb/rocksdb/db/history_trimming_iterator.h +4 -0
- package/deps/rocksdb/rocksdb/db/import_column_family_job.cc +56 -53
- package/deps/rocksdb/rocksdb/db/import_column_family_test.cc +3 -4
- package/deps/rocksdb/rocksdb/db/merge_helper.cc +4 -0
- package/deps/rocksdb/rocksdb/db/periodic_task_scheduler_test.cc +10 -10
- package/deps/rocksdb/rocksdb/db/repair.cc +64 -22
- package/deps/rocksdb/rocksdb/db/repair_test.cc +54 -0
- package/deps/rocksdb/rocksdb/db/seqno_time_test.cc +26 -26
- package/deps/rocksdb/rocksdb/db/table_cache.cc +2 -0
- package/deps/rocksdb/rocksdb/db/table_properties_collector.h +3 -1
- package/deps/rocksdb/rocksdb/db/version_builder.cc +90 -43
- package/deps/rocksdb/rocksdb/db/version_builder.h +20 -0
- package/deps/rocksdb/rocksdb/db/version_builder_test.cc +190 -67
- package/deps/rocksdb/rocksdb/db/version_edit.cc +15 -1
- package/deps/rocksdb/rocksdb/db/version_edit.h +16 -4
- package/deps/rocksdb/rocksdb/db/version_edit_handler.cc +41 -11
- package/deps/rocksdb/rocksdb/db/version_edit_handler.h +27 -12
- package/deps/rocksdb/rocksdb/db/version_edit_test.cc +18 -16
- package/deps/rocksdb/rocksdb/db/version_set.cc +212 -35
- package/deps/rocksdb/rocksdb/db/version_set.h +34 -4
- package/deps/rocksdb/rocksdb/db/version_set_test.cc +45 -25
- package/deps/rocksdb/rocksdb/db/write_thread.cc +5 -2
- package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_common.h +0 -1
- package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_gflags.cc +0 -4
- package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_test_base.cc +12 -17
- package/deps/rocksdb/rocksdb/db_stress_tool/no_batched_ops_stress.cc +6 -4
- package/deps/rocksdb/rocksdb/file/file_prefetch_buffer.h +1 -0
- package/deps/rocksdb/rocksdb/file/prefetch_test.cc +0 -48
- package/deps/rocksdb/rocksdb/file/random_access_file_reader.cc +8 -0
- package/deps/rocksdb/rocksdb/include/rocksdb/cache.h +196 -171
- package/deps/rocksdb/rocksdb/include/rocksdb/db.h +6 -0
- package/deps/rocksdb/rocksdb/include/rocksdb/metadata.h +9 -3
- package/deps/rocksdb/rocksdb/include/rocksdb/options.h +25 -18
- package/deps/rocksdb/rocksdb/include/rocksdb/secondary_cache.h +27 -5
- package/deps/rocksdb/rocksdb/include/rocksdb/statistics.h +5 -0
- package/deps/rocksdb/rocksdb/include/rocksdb/status.h +3 -0
- package/deps/rocksdb/rocksdb/include/rocksdb/version.h +1 -1
- package/deps/rocksdb/rocksdb/logging/logging.h +13 -19
- package/deps/rocksdb/rocksdb/memory/arena.cc +4 -3
- package/deps/rocksdb/rocksdb/memory/arena_test.cc +30 -0
- package/deps/rocksdb/rocksdb/monitoring/statistics.cc +3 -1
- package/deps/rocksdb/rocksdb/monitoring/stats_history_test.cc +26 -26
- package/deps/rocksdb/rocksdb/src.mk +2 -1
- package/deps/rocksdb/rocksdb/table/adaptive/adaptive_table_factory.cc +3 -2
- package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader.cc +3 -2
- package/deps/rocksdb/rocksdb/table/block_based/block_based_table_reader_test.cc +1 -1
- package/deps/rocksdb/rocksdb/table/block_fetcher_test.cc +3 -3
- package/deps/rocksdb/rocksdb/table/compaction_merging_iterator.cc +142 -0
- package/deps/rocksdb/rocksdb/table/compaction_merging_iterator.h +241 -0
- package/deps/rocksdb/rocksdb/table/format.cc +24 -20
- package/deps/rocksdb/rocksdb/table/format.h +5 -2
- package/deps/rocksdb/rocksdb/table/merging_iterator.cc +97 -115
- package/deps/rocksdb/rocksdb/table/merging_iterator.h +82 -1
- package/deps/rocksdb/rocksdb/table/meta_blocks.cc +2 -2
- package/deps/rocksdb/rocksdb/table/sst_file_dumper.cc +1 -1
- package/deps/rocksdb/rocksdb/table/table_test.cc +7 -6
- package/deps/rocksdb/rocksdb/test_util/testutil.h +10 -0
- package/deps/rocksdb/rocksdb/tools/db_bench_tool.cc +0 -6
- package/deps/rocksdb/rocksdb/trace_replay/block_cache_tracer.h +2 -2
- package/deps/rocksdb/rocksdb/util/bloom_test.cc +1 -1
- package/deps/rocksdb/rocksdb/util/status.cc +7 -0
- package/deps/rocksdb/rocksdb/utilities/backup/backup_engine.cc +5 -0
- package/deps/rocksdb/rocksdb/utilities/backup/backup_engine_test.cc +4 -0
- package/deps/rocksdb/rocksdb/utilities/cache_dump_load_impl.cc +7 -67
- package/deps/rocksdb/rocksdb/utilities/cache_dump_load_impl.h +1 -3
- package/deps/rocksdb/rocksdb/utilities/checkpoint/checkpoint_impl.cc +1 -0
- package/deps/rocksdb/rocksdb/utilities/transactions/transaction_test.cc +59 -0
- package/deps/rocksdb/rocksdb.gyp +2 -1
- package/package.json +1 -1
- package/prebuilds/darwin-arm64/node.napi.node +0 -0
- package/prebuilds/linux-x64/node.napi.node +0 -0
- package/deps/rocksdb/rocksdb/cache/fast_lru_cache.cc +0 -580
- 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
|
-
|
|
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
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
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
|
-
|
|
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
|
-
|
|
560
|
-
|
|
561
|
-
|
|
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()->
|
|
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()->
|
|
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()->
|
|
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()->
|
|
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()->
|
|
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->
|
|
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->
|
|
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->
|
|
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->
|
|
181
|
+
dbi->TEST_WaitForPeriodicTaskRun(
|
|
182
182
|
[&] { mock_clock_->MockSleepForSeconds(kPeriodSec); });
|
|
183
|
-
dbi->
|
|
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
|
-
//
|
|
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
|
-
|
|
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.
|
|
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
|
-
|
|
662
|
-
|
|
663
|
-
|
|
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
|
-
|
|
673
|
-
|
|
674
|
-
|
|
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()->
|
|
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()->
|
|
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()->
|
|
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()->
|
|
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()->
|
|
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()->
|
|
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()->
|
|
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()->
|
|
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()->
|
|
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()->
|
|
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()->
|
|
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()->
|
|
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()->
|
|
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()->
|
|
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()->
|
|
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()->
|
|
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()->
|
|
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()->
|
|
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()->
|
|
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()->
|
|
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()->
|
|
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()->
|
|
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()->
|
|
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()->
|
|
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()->
|
|
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()->
|
|
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
|
}
|