@nxtedition/rocksdb 8.0.4 → 8.0.5
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/BUILDING.md +2 -2
- package/binding.cc +7 -2
- package/deps/rocksdb/rocksdb/CMakeLists.txt +7 -0
- package/deps/rocksdb/rocksdb/Makefile +13 -1
- package/deps/rocksdb/rocksdb/db/builder.cc +13 -4
- package/deps/rocksdb/rocksdb/db/builder.h +2 -1
- package/deps/rocksdb/rocksdb/db/c.cc +6 -0
- package/deps/rocksdb/rocksdb/db/column_family.cc +1 -0
- package/deps/rocksdb/rocksdb/db/compaction/compaction.cc +18 -4
- package/deps/rocksdb/rocksdb/db/compaction/compaction_job.cc +2 -0
- package/deps/rocksdb/rocksdb/db/compaction/compaction_job_test.cc +2 -1
- package/deps/rocksdb/rocksdb/db/compaction/compaction_outputs.cc +22 -2
- package/deps/rocksdb/rocksdb/db/compaction/compaction_picker.cc +5 -1
- package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_level.cc +14 -14
- package/deps/rocksdb/rocksdb/db/compaction/compaction_picker_test.cc +1 -2
- package/deps/rocksdb/rocksdb/db/db_bloom_filter_test.cc +2 -3
- package/deps/rocksdb/rocksdb/db/db_compaction_test.cc +225 -0
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl.cc +8 -9
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl.h +0 -8
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl_compaction_flush.cc +63 -23
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl_experimental.cc +2 -1
- package/deps/rocksdb/rocksdb/db/db_impl/db_impl_open.cc +12 -8
- package/deps/rocksdb/rocksdb/db/db_range_del_test.cc +115 -2
- package/deps/rocksdb/rocksdb/db/experimental.cc +2 -1
- package/deps/rocksdb/rocksdb/db/external_sst_file_basic_test.cc +1 -0
- package/deps/rocksdb/rocksdb/db/external_sst_file_ingestion_job.cc +88 -12
- package/deps/rocksdb/rocksdb/db/external_sst_file_ingestion_job.h +38 -1
- package/deps/rocksdb/rocksdb/db/external_sst_file_test.cc +14 -110
- package/deps/rocksdb/rocksdb/db/flush_job.cc +2 -3
- package/deps/rocksdb/rocksdb/db/import_column_family_job.cc +1 -1
- package/deps/rocksdb/rocksdb/db/repair.cc +2 -1
- package/deps/rocksdb/rocksdb/db/version_builder_test.cc +41 -39
- package/deps/rocksdb/rocksdb/db/version_edit.cc +12 -0
- package/deps/rocksdb/rocksdb/db/version_edit.h +18 -6
- package/deps/rocksdb/rocksdb/db/version_edit_test.cc +9 -9
- package/deps/rocksdb/rocksdb/db/version_set.cc +12 -6
- package/deps/rocksdb/rocksdb/db/version_set_test.cc +23 -9
- package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_common.h +1 -0
- package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_gflags.cc +4 -0
- package/deps/rocksdb/rocksdb/db_stress_tool/db_stress_test_base.cc +5 -0
- package/deps/rocksdb/rocksdb/include/rocksdb/c.h +4 -0
- package/deps/rocksdb/rocksdb/include/rocksdb/listener.h +7 -1
- package/deps/rocksdb/rocksdb/include/rocksdb/options.h +2 -1
- package/deps/rocksdb/rocksdb/include/rocksdb/utilities/backup_engine.h +69 -9
- package/deps/rocksdb/rocksdb/utilities/backup/backup_engine.cc +245 -74
- package/deps/rocksdb/rocksdb/utilities/backup/backup_engine_test.cc +195 -4
- package/max_rev_operator.h +100 -0
- package/package.json +1 -1
- package/prebuilds/darwin-arm64/node.napi.node +0 -0
- package/prebuilds/darwin-x64/node.napi.node +0 -0
- package/prebuilds/linux-x64/node.napi.node +0 -0
|
@@ -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,
|
|
1253
|
-
|
|
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,
|
|
1507
|
-
|
|
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
|
-
//
|
|
1646
|
-
// to L2
|
|
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();
|
|
@@ -941,7 +941,7 @@ Status FlushJob::WriteLevel0Table() {
|
|
|
941
941
|
cfd_->internal_stats(), &io_s, io_tracer_,
|
|
942
942
|
BlobFileCreationReason::kFlush, seqno_to_time_mapping_, event_logger_,
|
|
943
943
|
job_context_->job_id, io_priority, &table_properties_, write_hint,
|
|
944
|
-
full_history_ts_low, blob_callback_, &num_input_entries,
|
|
944
|
+
full_history_ts_low, blob_callback_, base_, &num_input_entries,
|
|
945
945
|
&memtable_payload_bytes, &memtable_garbage_bytes);
|
|
946
946
|
// TODO: Cleanup io_status in BuildTable and table builders
|
|
947
947
|
assert(!s.ok() || io_s.ok());
|
|
@@ -1003,8 +1003,7 @@ Status FlushJob::WriteLevel0Table() {
|
|
|
1003
1003
|
meta_.oldest_blob_file_number, meta_.oldest_ancester_time,
|
|
1004
1004
|
meta_.file_creation_time, meta_.epoch_number,
|
|
1005
1005
|
meta_.file_checksum, meta_.file_checksum_func_name,
|
|
1006
|
-
meta_.unique_id);
|
|
1007
|
-
|
|
1006
|
+
meta_.unique_id, meta_.compensated_range_deletion_size);
|
|
1008
1007
|
edit_->SetBlobFileAdditions(std::move(blob_file_additions));
|
|
1009
1008
|
}
|
|
1010
1009
|
#ifndef ROCKSDB_LITE
|
|
@@ -143,7 +143,7 @@ Status ImportColumnFamilyJob::Run() {
|
|
|
143
143
|
file_metadata.smallest_seqno, file_metadata.largest_seqno, false,
|
|
144
144
|
file_metadata.temperature, kInvalidBlobFileNumber, oldest_ancester_time,
|
|
145
145
|
current_time, file_metadata.epoch_number, kUnknownFileChecksum,
|
|
146
|
-
kUnknownFileChecksumFuncName, f.unique_id);
|
|
146
|
+
kUnknownFileChecksumFuncName, f.unique_id, 0);
|
|
147
147
|
s = dummy_version_builder.Apply(&dummy_version_edit);
|
|
148
148
|
}
|
|
149
149
|
if (s.ok()) {
|
|
@@ -665,7 +665,8 @@ class Repairer {
|
|
|
665
665
|
table->meta.temperature, table->meta.oldest_blob_file_number,
|
|
666
666
|
table->meta.oldest_ancester_time, table->meta.file_creation_time,
|
|
667
667
|
table->meta.epoch_number, table->meta.file_checksum,
|
|
668
|
-
table->meta.file_checksum_func_name, table->meta.unique_id
|
|
668
|
+
table->meta.file_checksum_func_name, table->meta.unique_id,
|
|
669
|
+
table->meta.compensated_range_deletion_size);
|
|
669
670
|
}
|
|
670
671
|
s = dummy_version_builder.Apply(&dummy_edit);
|
|
671
672
|
if (s.ok()) {
|
|
@@ -73,7 +73,7 @@ class VersionBuilderTest : public testing::Test {
|
|
|
73
73
|
/* marked_for_compact */ false, Temperature::kUnknown,
|
|
74
74
|
oldest_blob_file_number, kUnknownOldestAncesterTime,
|
|
75
75
|
kUnknownFileCreationTime, epoch_number, kUnknownFileChecksum,
|
|
76
|
-
kUnknownFileChecksumFuncName, kNullUniqueId64x2);
|
|
76
|
+
kUnknownFileChecksumFuncName, kNullUniqueId64x2, 0);
|
|
77
77
|
f->compensated_file_size = file_size;
|
|
78
78
|
f->num_entries = num_entries;
|
|
79
79
|
f->num_deletions = num_deletions;
|
|
@@ -130,12 +130,13 @@ class VersionBuilderTest : public testing::Test {
|
|
|
130
130
|
constexpr SequenceNumber largest_seqno = 300;
|
|
131
131
|
constexpr bool marked_for_compaction = false;
|
|
132
132
|
|
|
133
|
-
edit->AddFile(
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
133
|
+
edit->AddFile(level, table_file_number, path_id, file_size,
|
|
134
|
+
GetInternalKey(smallest), GetInternalKey(largest),
|
|
135
|
+
smallest_seqno, largest_seqno, marked_for_compaction,
|
|
136
|
+
Temperature::kUnknown, blob_file_number,
|
|
137
|
+
kUnknownOldestAncesterTime, kUnknownFileCreationTime,
|
|
138
|
+
epoch_number, kUnknownFileChecksum,
|
|
139
|
+
kUnknownFileChecksumFuncName, kNullUniqueId64x2, 0);
|
|
139
140
|
}
|
|
140
141
|
|
|
141
142
|
void UpdateVersionStorageInfo(VersionStorageInfo* vstorage) {
|
|
@@ -186,7 +187,7 @@ TEST_F(VersionBuilderTest, ApplyAndSaveTo) {
|
|
|
186
187
|
2, 666, 0, 100U, GetInternalKey("301"), GetInternalKey("350"), 200, 200,
|
|
187
188
|
false, Temperature::kUnknown, kInvalidBlobFileNumber,
|
|
188
189
|
kUnknownOldestAncesterTime, kUnknownFileCreationTime, kUnknownEpochNumber,
|
|
189
|
-
kUnknownFileChecksum, kUnknownFileChecksumFuncName, kNullUniqueId64x2);
|
|
190
|
+
kUnknownFileChecksum, kUnknownFileChecksumFuncName, kNullUniqueId64x2, 0);
|
|
190
191
|
version_edit.DeleteFile(3, 27U);
|
|
191
192
|
|
|
192
193
|
EnvOptions env_options;
|
|
@@ -233,7 +234,8 @@ TEST_F(VersionBuilderTest, ApplyAndSaveToDynamic) {
|
|
|
233
234
|
3, 666, 0, 100U, GetInternalKey("301"), GetInternalKey("350"), 200, 200,
|
|
234
235
|
false, Temperature::kUnknown, kInvalidBlobFileNumber,
|
|
235
236
|
kUnknownOldestAncesterTime, kUnknownFileCreationTime, kUnknownEpochNumber,
|
|
236
|
-
kUnknownFileChecksum, kUnknownFileChecksumFuncName, kNullUniqueId64x2);
|
|
237
|
+
kUnknownFileChecksum, kUnknownFileChecksumFuncName, kNullUniqueId64x2, 0);
|
|
238
|
+
|
|
237
239
|
version_edit.DeleteFile(0, 1U);
|
|
238
240
|
version_edit.DeleteFile(0, 88U);
|
|
239
241
|
|
|
@@ -283,7 +285,7 @@ TEST_F(VersionBuilderTest, ApplyAndSaveToDynamic2) {
|
|
|
283
285
|
4, 666, 0, 100U, GetInternalKey("301"), GetInternalKey("350"), 200, 200,
|
|
284
286
|
false, Temperature::kUnknown, kInvalidBlobFileNumber,
|
|
285
287
|
kUnknownOldestAncesterTime, kUnknownFileCreationTime, kUnknownEpochNumber,
|
|
286
|
-
kUnknownFileChecksum, kUnknownFileChecksumFuncName, kNullUniqueId64x2);
|
|
288
|
+
kUnknownFileChecksum, kUnknownFileChecksumFuncName, kNullUniqueId64x2, 0);
|
|
287
289
|
version_edit.DeleteFile(0, 1U);
|
|
288
290
|
version_edit.DeleteFile(0, 88U);
|
|
289
291
|
version_edit.DeleteFile(4, 6U);
|
|
@@ -319,27 +321,27 @@ TEST_F(VersionBuilderTest, ApplyMultipleAndSaveTo) {
|
|
|
319
321
|
2, 666, 0, 100U, GetInternalKey("301"), GetInternalKey("350"), 200, 200,
|
|
320
322
|
false, Temperature::kUnknown, kInvalidBlobFileNumber,
|
|
321
323
|
kUnknownOldestAncesterTime, kUnknownFileCreationTime, kUnknownEpochNumber,
|
|
322
|
-
kUnknownFileChecksum, kUnknownFileChecksumFuncName, kNullUniqueId64x2);
|
|
324
|
+
kUnknownFileChecksum, kUnknownFileChecksumFuncName, kNullUniqueId64x2, 0);
|
|
323
325
|
version_edit.AddFile(
|
|
324
326
|
2, 676, 0, 100U, GetInternalKey("401"), GetInternalKey("450"), 200, 200,
|
|
325
327
|
false, Temperature::kUnknown, kInvalidBlobFileNumber,
|
|
326
328
|
kUnknownOldestAncesterTime, kUnknownFileCreationTime, kUnknownEpochNumber,
|
|
327
|
-
kUnknownFileChecksum, kUnknownFileChecksumFuncName, kNullUniqueId64x2);
|
|
329
|
+
kUnknownFileChecksum, kUnknownFileChecksumFuncName, kNullUniqueId64x2, 0);
|
|
328
330
|
version_edit.AddFile(
|
|
329
331
|
2, 636, 0, 100U, GetInternalKey("601"), GetInternalKey("650"), 200, 200,
|
|
330
332
|
false, Temperature::kUnknown, kInvalidBlobFileNumber,
|
|
331
333
|
kUnknownOldestAncesterTime, kUnknownFileCreationTime, kUnknownEpochNumber,
|
|
332
|
-
kUnknownFileChecksum, kUnknownFileChecksumFuncName, kNullUniqueId64x2);
|
|
334
|
+
kUnknownFileChecksum, kUnknownFileChecksumFuncName, kNullUniqueId64x2, 0);
|
|
333
335
|
version_edit.AddFile(
|
|
334
336
|
2, 616, 0, 100U, GetInternalKey("501"), GetInternalKey("550"), 200, 200,
|
|
335
337
|
false, Temperature::kUnknown, kInvalidBlobFileNumber,
|
|
336
338
|
kUnknownOldestAncesterTime, kUnknownFileCreationTime, kUnknownEpochNumber,
|
|
337
|
-
kUnknownFileChecksum, kUnknownFileChecksumFuncName, kNullUniqueId64x2);
|
|
339
|
+
kUnknownFileChecksum, kUnknownFileChecksumFuncName, kNullUniqueId64x2, 0);
|
|
338
340
|
version_edit.AddFile(
|
|
339
341
|
2, 606, 0, 100U, GetInternalKey("701"), GetInternalKey("750"), 200, 200,
|
|
340
342
|
false, Temperature::kUnknown, kInvalidBlobFileNumber,
|
|
341
343
|
kUnknownOldestAncesterTime, kUnknownFileCreationTime, kUnknownEpochNumber,
|
|
342
|
-
kUnknownFileChecksum, kUnknownFileChecksumFuncName, kNullUniqueId64x2);
|
|
344
|
+
kUnknownFileChecksum, kUnknownFileChecksumFuncName, kNullUniqueId64x2, 0);
|
|
343
345
|
|
|
344
346
|
EnvOptions env_options;
|
|
345
347
|
constexpr TableCache* table_cache = nullptr;
|
|
@@ -378,27 +380,27 @@ TEST_F(VersionBuilderTest, ApplyDeleteAndSaveTo) {
|
|
|
378
380
|
2, 666, 0, 100U, GetInternalKey("301"), GetInternalKey("350"), 200, 200,
|
|
379
381
|
false, Temperature::kUnknown, kInvalidBlobFileNumber,
|
|
380
382
|
kUnknownOldestAncesterTime, kUnknownFileCreationTime, kUnknownEpochNumber,
|
|
381
|
-
kUnknownFileChecksum, kUnknownFileChecksumFuncName, kNullUniqueId64x2);
|
|
383
|
+
kUnknownFileChecksum, kUnknownFileChecksumFuncName, kNullUniqueId64x2, 0);
|
|
382
384
|
version_edit.AddFile(
|
|
383
385
|
2, 676, 0, 100U, GetInternalKey("401"), GetInternalKey("450"), 200, 200,
|
|
384
386
|
false, Temperature::kUnknown, kInvalidBlobFileNumber,
|
|
385
387
|
kUnknownOldestAncesterTime, kUnknownFileCreationTime, kUnknownEpochNumber,
|
|
386
|
-
kUnknownFileChecksum, kUnknownFileChecksumFuncName, kNullUniqueId64x2);
|
|
388
|
+
kUnknownFileChecksum, kUnknownFileChecksumFuncName, kNullUniqueId64x2, 0);
|
|
387
389
|
version_edit.AddFile(
|
|
388
390
|
2, 636, 0, 100U, GetInternalKey("601"), GetInternalKey("650"), 200, 200,
|
|
389
391
|
false, Temperature::kUnknown, kInvalidBlobFileNumber,
|
|
390
392
|
kUnknownOldestAncesterTime, kUnknownFileCreationTime, kUnknownEpochNumber,
|
|
391
|
-
kUnknownFileChecksum, kUnknownFileChecksumFuncName, kNullUniqueId64x2);
|
|
393
|
+
kUnknownFileChecksum, kUnknownFileChecksumFuncName, kNullUniqueId64x2, 0);
|
|
392
394
|
version_edit.AddFile(
|
|
393
395
|
2, 616, 0, 100U, GetInternalKey("501"), GetInternalKey("550"), 200, 200,
|
|
394
396
|
false, Temperature::kUnknown, kInvalidBlobFileNumber,
|
|
395
397
|
kUnknownOldestAncesterTime, kUnknownFileCreationTime, kUnknownEpochNumber,
|
|
396
|
-
kUnknownFileChecksum, kUnknownFileChecksumFuncName, kNullUniqueId64x2);
|
|
398
|
+
kUnknownFileChecksum, kUnknownFileChecksumFuncName, kNullUniqueId64x2, 0);
|
|
397
399
|
version_edit.AddFile(
|
|
398
400
|
2, 606, 0, 100U, GetInternalKey("701"), GetInternalKey("750"), 200, 200,
|
|
399
401
|
false, Temperature::kUnknown, kInvalidBlobFileNumber,
|
|
400
402
|
kUnknownOldestAncesterTime, kUnknownFileCreationTime, kUnknownEpochNumber,
|
|
401
|
-
kUnknownFileChecksum, kUnknownFileChecksumFuncName, kNullUniqueId64x2);
|
|
403
|
+
kUnknownFileChecksum, kUnknownFileChecksumFuncName, kNullUniqueId64x2, 0);
|
|
402
404
|
ASSERT_OK(version_builder.Apply(&version_edit));
|
|
403
405
|
|
|
404
406
|
VersionEdit version_edit2;
|
|
@@ -406,14 +408,14 @@ TEST_F(VersionBuilderTest, ApplyDeleteAndSaveTo) {
|
|
|
406
408
|
2, 808, 0, 100U, GetInternalKey("901"), GetInternalKey("950"), 200, 200,
|
|
407
409
|
false, Temperature::kUnknown, kInvalidBlobFileNumber,
|
|
408
410
|
kUnknownOldestAncesterTime, kUnknownFileCreationTime, kUnknownEpochNumber,
|
|
409
|
-
kUnknownFileChecksum, kUnknownFileChecksumFuncName, kNullUniqueId64x2);
|
|
411
|
+
kUnknownFileChecksum, kUnknownFileChecksumFuncName, kNullUniqueId64x2, 0);
|
|
410
412
|
version_edit2.DeleteFile(2, 616);
|
|
411
413
|
version_edit2.DeleteFile(2, 636);
|
|
412
414
|
version_edit.AddFile(
|
|
413
415
|
2, 806, 0, 100U, GetInternalKey("801"), GetInternalKey("850"), 200, 200,
|
|
414
416
|
false, Temperature::kUnknown, kInvalidBlobFileNumber,
|
|
415
417
|
kUnknownOldestAncesterTime, kUnknownFileCreationTime, kUnknownEpochNumber,
|
|
416
|
-
kUnknownFileChecksum, kUnknownFileChecksumFuncName, kNullUniqueId64x2);
|
|
418
|
+
kUnknownFileChecksum, kUnknownFileChecksumFuncName, kNullUniqueId64x2, 0);
|
|
417
419
|
|
|
418
420
|
ASSERT_OK(version_builder.Apply(&version_edit2));
|
|
419
421
|
ASSERT_OK(version_builder.SaveTo(&new_vstorage));
|
|
@@ -524,7 +526,7 @@ TEST_F(VersionBuilderTest, ApplyFileDeletionAndAddition) {
|
|
|
524
526
|
GetInternalKey(largest, largest_seq), smallest_seqno, largest_seqno,
|
|
525
527
|
marked_for_compaction, Temperature::kUnknown, kInvalidBlobFileNumber,
|
|
526
528
|
kUnknownOldestAncesterTime, kUnknownFileCreationTime, kUnknownEpochNumber,
|
|
527
|
-
kUnknownFileChecksum, kUnknownFileChecksumFuncName, kNullUniqueId64x2);
|
|
529
|
+
kUnknownFileChecksum, kUnknownFileChecksumFuncName, kNullUniqueId64x2, 0);
|
|
528
530
|
|
|
529
531
|
ASSERT_OK(builder.Apply(&addition));
|
|
530
532
|
|
|
@@ -573,7 +575,7 @@ TEST_F(VersionBuilderTest, ApplyFileAdditionAlreadyInBase) {
|
|
|
573
575
|
GetInternalKey(largest), smallest_seqno, largest_seqno,
|
|
574
576
|
marked_for_compaction, Temperature::kUnknown, kInvalidBlobFileNumber,
|
|
575
577
|
kUnknownOldestAncesterTime, kUnknownFileCreationTime, kUnknownEpochNumber,
|
|
576
|
-
kUnknownFileChecksum, kUnknownFileChecksumFuncName, kNullUniqueId64x2);
|
|
578
|
+
kUnknownFileChecksum, kUnknownFileChecksumFuncName, kNullUniqueId64x2, 0);
|
|
577
579
|
|
|
578
580
|
const Status s = builder.Apply(&edit);
|
|
579
581
|
ASSERT_TRUE(s.IsCorruption());
|
|
@@ -609,7 +611,7 @@ TEST_F(VersionBuilderTest, ApplyFileAdditionAlreadyApplied) {
|
|
|
609
611
|
GetInternalKey(largest), smallest_seqno, largest_seqno,
|
|
610
612
|
marked_for_compaction, Temperature::kUnknown, kInvalidBlobFileNumber,
|
|
611
613
|
kUnknownOldestAncesterTime, kUnknownFileCreationTime, kUnknownEpochNumber,
|
|
612
|
-
kUnknownFileChecksum, kUnknownFileChecksumFuncName, kNullUniqueId64x2);
|
|
614
|
+
kUnknownFileChecksum, kUnknownFileChecksumFuncName, kNullUniqueId64x2, 0);
|
|
613
615
|
|
|
614
616
|
ASSERT_OK(builder.Apply(&edit));
|
|
615
617
|
|
|
@@ -622,7 +624,7 @@ TEST_F(VersionBuilderTest, ApplyFileAdditionAlreadyApplied) {
|
|
|
622
624
|
GetInternalKey(largest), smallest_seqno, largest_seqno,
|
|
623
625
|
marked_for_compaction, Temperature::kUnknown, kInvalidBlobFileNumber,
|
|
624
626
|
kUnknownOldestAncesterTime, kUnknownFileCreationTime, kUnknownEpochNumber,
|
|
625
|
-
kUnknownFileChecksum, kUnknownFileChecksumFuncName, kNullUniqueId64x2);
|
|
627
|
+
kUnknownFileChecksum, kUnknownFileChecksumFuncName, kNullUniqueId64x2, 0);
|
|
626
628
|
|
|
627
629
|
const Status s = builder.Apply(&other_edit);
|
|
628
630
|
ASSERT_TRUE(s.IsCorruption());
|
|
@@ -658,7 +660,7 @@ TEST_F(VersionBuilderTest, ApplyFileAdditionAndDeletion) {
|
|
|
658
660
|
GetInternalKey(largest), smallest_seqno, largest_seqno,
|
|
659
661
|
marked_for_compaction, Temperature::kUnknown, kInvalidBlobFileNumber,
|
|
660
662
|
kUnknownOldestAncesterTime, kUnknownFileCreationTime, kUnknownEpochNumber,
|
|
661
|
-
kUnknownFileChecksum, kUnknownFileChecksumFuncName, kNullUniqueId64x2);
|
|
663
|
+
kUnknownFileChecksum, kUnknownFileChecksumFuncName, kNullUniqueId64x2, 0);
|
|
662
664
|
|
|
663
665
|
ASSERT_OK(builder.Apply(&addition));
|
|
664
666
|
|
|
@@ -1231,7 +1233,7 @@ TEST_F(VersionBuilderTest, SaveBlobFilesToConcurrentJobs) {
|
|
|
1231
1233
|
GetInternalKey(largest), smallest_seqno, largest_seqno,
|
|
1232
1234
|
marked_for_compaction, Temperature::kUnknown, blob_file_number,
|
|
1233
1235
|
kUnknownOldestAncesterTime, kUnknownFileCreationTime, 2 /*epoch_number*/,
|
|
1234
|
-
checksum_value, checksum_method, kNullUniqueId64x2);
|
|
1236
|
+
checksum_value, checksum_method, kNullUniqueId64x2, 0);
|
|
1235
1237
|
edit.AddBlobFile(blob_file_number, total_blob_count, total_blob_bytes,
|
|
1236
1238
|
checksum_method, checksum_value);
|
|
1237
1239
|
|
|
@@ -1319,7 +1321,7 @@ TEST_F(VersionBuilderTest, CheckConsistencyForBlobFiles) {
|
|
|
1319
1321
|
/* oldest_blob_file_number */ 16, kUnknownOldestAncesterTime,
|
|
1320
1322
|
kUnknownFileCreationTime, kUnknownEpochNumber,
|
|
1321
1323
|
kUnknownFileChecksum, kUnknownFileChecksumFuncName,
|
|
1322
|
-
kNullUniqueId64x2);
|
|
1324
|
+
kNullUniqueId64x2, 0);
|
|
1323
1325
|
|
|
1324
1326
|
edit.AddFile(/* level */ 1, /* file_number */ 700, /* path_id */ 0,
|
|
1325
1327
|
/* file_size */ 100, /* smallest */ GetInternalKey("801"),
|
|
@@ -1329,7 +1331,7 @@ TEST_F(VersionBuilderTest, CheckConsistencyForBlobFiles) {
|
|
|
1329
1331
|
/* oldest_blob_file_number */ 1000, kUnknownOldestAncesterTime,
|
|
1330
1332
|
kUnknownFileCreationTime, kUnknownEpochNumber,
|
|
1331
1333
|
kUnknownFileChecksum, kUnknownFileChecksumFuncName,
|
|
1332
|
-
kNullUniqueId64x2);
|
|
1334
|
+
kNullUniqueId64x2, 0);
|
|
1333
1335
|
edit.AddBlobFile(/* blob_file_number */ 1000, /* total_blob_count */ 2000,
|
|
1334
1336
|
/* total_blob_bytes */ 200000,
|
|
1335
1337
|
/* checksum_method */ std::string(),
|
|
@@ -1550,7 +1552,7 @@ TEST_F(VersionBuilderTest, MaintainLinkedSstsForBlobFiles) {
|
|
|
1550
1552
|
Temperature::kUnknown,
|
|
1551
1553
|
/* oldest_blob_file_number */ 1, kUnknownOldestAncesterTime,
|
|
1552
1554
|
kUnknownFileCreationTime, kUnknownEpochNumber, kUnknownFileChecksum,
|
|
1553
|
-
kUnknownFileChecksumFuncName, kNullUniqueId64x2);
|
|
1555
|
+
kUnknownFileChecksumFuncName, kNullUniqueId64x2, 0);
|
|
1554
1556
|
|
|
1555
1557
|
// Add an SST that does not reference any blob files.
|
|
1556
1558
|
edit.AddFile(
|
|
@@ -1560,7 +1562,7 @@ TEST_F(VersionBuilderTest, MaintainLinkedSstsForBlobFiles) {
|
|
|
1560
1562
|
/* largest_seqno */ 2200, /* marked_for_compaction */ false,
|
|
1561
1563
|
Temperature::kUnknown, kInvalidBlobFileNumber, kUnknownOldestAncesterTime,
|
|
1562
1564
|
kUnknownFileCreationTime, kUnknownEpochNumber, kUnknownFileChecksum,
|
|
1563
|
-
kUnknownFileChecksumFuncName, kNullUniqueId64x2);
|
|
1565
|
+
kUnknownFileChecksumFuncName, kNullUniqueId64x2, 0);
|
|
1564
1566
|
|
|
1565
1567
|
// Delete a file that references a blob file.
|
|
1566
1568
|
edit.DeleteFile(/* level */ 1, /* file_number */ 6);
|
|
@@ -1583,7 +1585,7 @@ TEST_F(VersionBuilderTest, MaintainLinkedSstsForBlobFiles) {
|
|
|
1583
1585
|
/* oldest_blob_file_number */ 3, kUnknownOldestAncesterTime,
|
|
1584
1586
|
kUnknownFileCreationTime, kUnknownEpochNumber,
|
|
1585
1587
|
kUnknownFileChecksum, kUnknownFileChecksumFuncName,
|
|
1586
|
-
kNullUniqueId64x2);
|
|
1588
|
+
kNullUniqueId64x2, 0);
|
|
1587
1589
|
|
|
1588
1590
|
// Trivially move a file that does not reference any blob files.
|
|
1589
1591
|
edit.DeleteFile(/* level */ 1, /* file_number */ 13);
|
|
@@ -1595,7 +1597,7 @@ TEST_F(VersionBuilderTest, MaintainLinkedSstsForBlobFiles) {
|
|
|
1595
1597
|
Temperature::kUnknown, kInvalidBlobFileNumber,
|
|
1596
1598
|
kUnknownOldestAncesterTime, kUnknownFileCreationTime,
|
|
1597
1599
|
kUnknownEpochNumber, kUnknownFileChecksum,
|
|
1598
|
-
kUnknownFileChecksumFuncName, kNullUniqueId64x2);
|
|
1600
|
+
kUnknownFileChecksumFuncName, kNullUniqueId64x2, 0);
|
|
1599
1601
|
|
|
1600
1602
|
// Add one more SST file that references a blob file, then promptly
|
|
1601
1603
|
// delete it in a second version edit before the new version gets saved.
|
|
@@ -1609,7 +1611,7 @@ TEST_F(VersionBuilderTest, MaintainLinkedSstsForBlobFiles) {
|
|
|
1609
1611
|
/* oldest_blob_file_number */ 5, kUnknownOldestAncesterTime,
|
|
1610
1612
|
kUnknownFileCreationTime, kUnknownEpochNumber,
|
|
1611
1613
|
kUnknownFileChecksum, kUnknownFileChecksumFuncName,
|
|
1612
|
-
kNullUniqueId64x2);
|
|
1614
|
+
kNullUniqueId64x2, 0);
|
|
1613
1615
|
|
|
1614
1616
|
VersionEdit edit2;
|
|
1615
1617
|
|
|
@@ -1710,7 +1712,7 @@ TEST_F(VersionBuilderTest, CheckConsistencyForL0FilesSortedByEpochNumber) {
|
|
|
1710
1712
|
/* oldest_blob_file_number */ kInvalidBlobFileNumber,
|
|
1711
1713
|
kUnknownOldestAncesterTime, kUnknownFileCreationTime,
|
|
1712
1714
|
1 /* epoch_number */, kUnknownFileChecksum, kUnknownFileChecksumFuncName,
|
|
1713
|
-
kNullUniqueId64x2);
|
|
1715
|
+
kNullUniqueId64x2, 0);
|
|
1714
1716
|
version_edit_1.AddFile(
|
|
1715
1717
|
/* level */ 0, /* file_number */ 2U, /* path_id */ 0,
|
|
1716
1718
|
/* file_size */ 100, /* smallest */ GetInternalKey("b", 2),
|
|
@@ -1720,7 +1722,7 @@ TEST_F(VersionBuilderTest, CheckConsistencyForL0FilesSortedByEpochNumber) {
|
|
|
1720
1722
|
/* oldest_blob_file_number */ kInvalidBlobFileNumber,
|
|
1721
1723
|
kUnknownOldestAncesterTime, kUnknownFileCreationTime,
|
|
1722
1724
|
1 /* epoch_number */, kUnknownFileChecksum, kUnknownFileChecksumFuncName,
|
|
1723
|
-
kNullUniqueId64x2);
|
|
1725
|
+
kNullUniqueId64x2, 0);
|
|
1724
1726
|
|
|
1725
1727
|
VersionBuilder version_builder_1(EnvOptions(), &ioptions_,
|
|
1726
1728
|
nullptr /* table_cache */, &vstorage_,
|
|
@@ -1747,7 +1749,7 @@ TEST_F(VersionBuilderTest, CheckConsistencyForL0FilesSortedByEpochNumber) {
|
|
|
1747
1749
|
/* oldest_blob_file_number */ kInvalidBlobFileNumber,
|
|
1748
1750
|
kUnknownOldestAncesterTime, kUnknownFileCreationTime,
|
|
1749
1751
|
1 /* epoch_number */, kUnknownFileChecksum, kUnknownFileChecksumFuncName,
|
|
1750
|
-
kNullUniqueId64x2);
|
|
1752
|
+
kNullUniqueId64x2, 0);
|
|
1751
1753
|
version_edit_2.AddFile(
|
|
1752
1754
|
/* level */ 0, /* file_number */ 2U, /* path_id */ 0,
|
|
1753
1755
|
/* file_size */ 100, /* smallest */ GetInternalKey("b", 2),
|
|
@@ -1757,7 +1759,7 @@ TEST_F(VersionBuilderTest, CheckConsistencyForL0FilesSortedByEpochNumber) {
|
|
|
1757
1759
|
/* oldest_blob_file_number */ kInvalidBlobFileNumber,
|
|
1758
1760
|
kUnknownOldestAncesterTime, kUnknownFileCreationTime,
|
|
1759
1761
|
2 /* epoch_number */, kUnknownFileChecksum, kUnknownFileChecksumFuncName,
|
|
1760
|
-
kNullUniqueId64x2);
|
|
1762
|
+
kNullUniqueId64x2, 0);
|
|
1761
1763
|
|
|
1762
1764
|
VersionBuilder version_builder_2(EnvOptions(), &ioptions_,
|
|
1763
1765
|
nullptr /* table_cache */, &vstorage_,
|
|
@@ -231,6 +231,13 @@ bool VersionEdit::EncodeTo(std::string* dst) const {
|
|
|
231
231
|
std::string unique_id_str = EncodeUniqueIdBytes(&unique_id);
|
|
232
232
|
PutLengthPrefixedSlice(dst, Slice(unique_id_str));
|
|
233
233
|
}
|
|
234
|
+
if (f.compensated_range_deletion_size) {
|
|
235
|
+
PutVarint32(dst, kCompensatedRangeDeletionSize);
|
|
236
|
+
std::string compensated_range_deletion_size;
|
|
237
|
+
PutVarint64(&compensated_range_deletion_size,
|
|
238
|
+
f.compensated_range_deletion_size);
|
|
239
|
+
PutLengthPrefixedSlice(dst, Slice(compensated_range_deletion_size));
|
|
240
|
+
}
|
|
234
241
|
|
|
235
242
|
TEST_SYNC_POINT_CALLBACK("VersionEdit::EncodeTo:NewFile4:CustomizeFields",
|
|
236
243
|
dst);
|
|
@@ -404,6 +411,11 @@ const char* VersionEdit::DecodeNewFile4From(Slice* input) {
|
|
|
404
411
|
return "invalid unique id";
|
|
405
412
|
}
|
|
406
413
|
break;
|
|
414
|
+
case kCompensatedRangeDeletionSize:
|
|
415
|
+
if (!GetVarint64(&field, &f.compensated_range_deletion_size)) {
|
|
416
|
+
return "Invalid compensated range deletion size";
|
|
417
|
+
}
|
|
418
|
+
break;
|
|
407
419
|
default:
|
|
408
420
|
if ((custom_tag & kCustomTagNonSafeIgnoreMask) != 0) {
|
|
409
421
|
// Should not proceed if cannot understand it
|
|
@@ -89,6 +89,7 @@ enum NewFileCustomTag : uint32_t {
|
|
|
89
89
|
kMaxTimestamp = 11,
|
|
90
90
|
kUniqueId = 12,
|
|
91
91
|
kEpochNumber = 13,
|
|
92
|
+
kCompensatedRangeDeletionSize = 14,
|
|
92
93
|
|
|
93
94
|
// If this bit for the custom tag is set, opening DB should fail if
|
|
94
95
|
// we don't know this field.
|
|
@@ -182,15 +183,22 @@ struct FileMetaData {
|
|
|
182
183
|
// Stats for compensating deletion entries during compaction
|
|
183
184
|
|
|
184
185
|
// File size compensated by deletion entry.
|
|
185
|
-
// This is
|
|
186
|
-
//
|
|
186
|
+
// This is used to compute a file's compaction priority, and is updated in
|
|
187
|
+
// Version::ComputeCompensatedSizes() first time when the file is created or
|
|
188
|
+
// loaded. After it is updated (!= 0), it is immutable.
|
|
187
189
|
uint64_t compensated_file_size = 0;
|
|
188
190
|
// These values can mutate, but they can only be read or written from
|
|
189
191
|
// single-threaded LogAndApply thread
|
|
190
192
|
uint64_t num_entries = 0; // the number of entries.
|
|
191
|
-
|
|
193
|
+
// The number of deletion entries, including range deletions.
|
|
194
|
+
uint64_t num_deletions = 0;
|
|
192
195
|
uint64_t raw_key_size = 0; // total uncompressed key size.
|
|
193
196
|
uint64_t raw_value_size = 0; // total uncompressed value size.
|
|
197
|
+
uint64_t num_range_deletions = 0;
|
|
198
|
+
// This is computed during Flush/Compaction, and is added to
|
|
199
|
+
// `compensated_file_size`. Currently, this estimates the size of keys in the
|
|
200
|
+
// next level covered by range tombstones in this file.
|
|
201
|
+
uint64_t compensated_range_deletion_size = 0;
|
|
194
202
|
|
|
195
203
|
int refs = 0; // Reference count
|
|
196
204
|
|
|
@@ -240,10 +248,12 @@ struct FileMetaData {
|
|
|
240
248
|
uint64_t _oldest_ancester_time, uint64_t _file_creation_time,
|
|
241
249
|
uint64_t _epoch_number, const std::string& _file_checksum,
|
|
242
250
|
const std::string& _file_checksum_func_name,
|
|
243
|
-
UniqueId64x2 _unique_id
|
|
251
|
+
UniqueId64x2 _unique_id,
|
|
252
|
+
const uint64_t _compensated_range_deletion_size)
|
|
244
253
|
: fd(file, file_path_id, file_size, smallest_seq, largest_seq),
|
|
245
254
|
smallest(smallest_key),
|
|
246
255
|
largest(largest_key),
|
|
256
|
+
compensated_range_deletion_size(_compensated_range_deletion_size),
|
|
247
257
|
marked_for_compaction(marked_for_compact),
|
|
248
258
|
temperature(_temperature),
|
|
249
259
|
oldest_blob_file_number(oldest_blob_file),
|
|
@@ -434,7 +444,8 @@ class VersionEdit {
|
|
|
434
444
|
uint64_t oldest_ancester_time, uint64_t file_creation_time,
|
|
435
445
|
uint64_t epoch_number, const std::string& file_checksum,
|
|
436
446
|
const std::string& file_checksum_func_name,
|
|
437
|
-
const UniqueId64x2& unique_id
|
|
447
|
+
const UniqueId64x2& unique_id,
|
|
448
|
+
const uint64_t compensated_range_deletion_size) {
|
|
438
449
|
assert(smallest_seqno <= largest_seqno);
|
|
439
450
|
new_files_.emplace_back(
|
|
440
451
|
level,
|
|
@@ -442,7 +453,8 @@ class VersionEdit {
|
|
|
442
453
|
smallest_seqno, largest_seqno, marked_for_compaction,
|
|
443
454
|
temperature, oldest_blob_file_number, oldest_ancester_time,
|
|
444
455
|
file_creation_time, epoch_number, file_checksum,
|
|
445
|
-
file_checksum_func_name, unique_id
|
|
456
|
+
file_checksum_func_name, unique_id,
|
|
457
|
+
compensated_range_deletion_size));
|
|
446
458
|
if (!HasLastSequence() || largest_seqno > GetLastSequence()) {
|
|
447
459
|
SetLastSequence(largest_seqno);
|
|
448
460
|
}
|
|
@@ -45,7 +45,7 @@ TEST_F(VersionEditTest, EncodeDecode) {
|
|
|
45
45
|
kBig + 500 + i, kBig + 600 + i, false, Temperature::kUnknown,
|
|
46
46
|
kInvalidBlobFileNumber, 888, 678,
|
|
47
47
|
kBig + 300 + i /* epoch_number */, "234", "crc32c",
|
|
48
|
-
kNullUniqueId64x2);
|
|
48
|
+
kNullUniqueId64x2, 0);
|
|
49
49
|
edit.DeleteFile(4, kBig + 700 + i);
|
|
50
50
|
}
|
|
51
51
|
|
|
@@ -65,24 +65,24 @@ TEST_F(VersionEditTest, EncodeDecodeNewFile4) {
|
|
|
65
65
|
kBig + 600, true, Temperature::kUnknown, kInvalidBlobFileNumber,
|
|
66
66
|
kUnknownOldestAncesterTime, kUnknownFileCreationTime,
|
|
67
67
|
300 /* epoch_number */, kUnknownFileChecksum,
|
|
68
|
-
kUnknownFileChecksumFuncName, kNullUniqueId64x2);
|
|
68
|
+
kUnknownFileChecksumFuncName, kNullUniqueId64x2, 0);
|
|
69
69
|
edit.AddFile(4, 301, 3, 100, InternalKey("foo", kBig + 501, kTypeValue),
|
|
70
70
|
InternalKey("zoo", kBig + 601, kTypeDeletion), kBig + 501,
|
|
71
71
|
kBig + 601, false, Temperature::kUnknown, kInvalidBlobFileNumber,
|
|
72
72
|
kUnknownOldestAncesterTime, kUnknownFileCreationTime,
|
|
73
73
|
301 /* epoch_number */, kUnknownFileChecksum,
|
|
74
|
-
kUnknownFileChecksumFuncName, kNullUniqueId64x2);
|
|
74
|
+
kUnknownFileChecksumFuncName, kNullUniqueId64x2, 0);
|
|
75
75
|
edit.AddFile(5, 302, 0, 100, InternalKey("foo", kBig + 502, kTypeValue),
|
|
76
76
|
InternalKey("zoo", kBig + 602, kTypeDeletion), kBig + 502,
|
|
77
77
|
kBig + 602, true, Temperature::kUnknown, kInvalidBlobFileNumber,
|
|
78
78
|
666, 888, 302 /* epoch_number */, kUnknownFileChecksum,
|
|
79
|
-
kUnknownFileChecksumFuncName, kNullUniqueId64x2);
|
|
79
|
+
kUnknownFileChecksumFuncName, kNullUniqueId64x2, 0);
|
|
80
80
|
edit.AddFile(5, 303, 0, 100, InternalKey("foo", kBig + 503, kTypeBlobIndex),
|
|
81
81
|
InternalKey("zoo", kBig + 603, kTypeBlobIndex), kBig + 503,
|
|
82
82
|
kBig + 603, true, Temperature::kUnknown, 1001,
|
|
83
83
|
kUnknownOldestAncesterTime, kUnknownFileCreationTime,
|
|
84
84
|
303 /* epoch_number */, kUnknownFileChecksum,
|
|
85
|
-
kUnknownFileChecksumFuncName, kNullUniqueId64x2);
|
|
85
|
+
kUnknownFileChecksumFuncName, kNullUniqueId64x2, 0);
|
|
86
86
|
|
|
87
87
|
edit.DeleteFile(4, 700);
|
|
88
88
|
|
|
@@ -123,12 +123,12 @@ TEST_F(VersionEditTest, ForwardCompatibleNewFile4) {
|
|
|
123
123
|
kBig + 600, true, Temperature::kUnknown, kInvalidBlobFileNumber,
|
|
124
124
|
kUnknownOldestAncesterTime, kUnknownFileCreationTime,
|
|
125
125
|
300 /* epoch_number */, kUnknownFileChecksum,
|
|
126
|
-
kUnknownFileChecksumFuncName, kNullUniqueId64x2);
|
|
126
|
+
kUnknownFileChecksumFuncName, kNullUniqueId64x2, 0);
|
|
127
127
|
edit.AddFile(4, 301, 3, 100, InternalKey("foo", kBig + 501, kTypeValue),
|
|
128
128
|
InternalKey("zoo", kBig + 601, kTypeDeletion), kBig + 501,
|
|
129
129
|
kBig + 601, false, Temperature::kUnknown, kInvalidBlobFileNumber,
|
|
130
130
|
686, 868, 301 /* epoch_number */, "234", "crc32c",
|
|
131
|
-
kNullUniqueId64x2);
|
|
131
|
+
kNullUniqueId64x2, 0);
|
|
132
132
|
edit.DeleteFile(4, 700);
|
|
133
133
|
|
|
134
134
|
edit.SetComparatorName("foo");
|
|
@@ -177,7 +177,7 @@ TEST_F(VersionEditTest, NewFile4NotSupportedField) {
|
|
|
177
177
|
kBig + 600, true, Temperature::kUnknown, kInvalidBlobFileNumber,
|
|
178
178
|
kUnknownOldestAncesterTime, kUnknownFileCreationTime,
|
|
179
179
|
300 /* epoch_number */, kUnknownFileChecksum,
|
|
180
|
-
kUnknownFileChecksumFuncName, kNullUniqueId64x2);
|
|
180
|
+
kUnknownFileChecksumFuncName, kNullUniqueId64x2, 0);
|
|
181
181
|
|
|
182
182
|
edit.SetComparatorName("foo");
|
|
183
183
|
edit.SetLogNumber(kBig + 100);
|
|
@@ -208,7 +208,7 @@ TEST_F(VersionEditTest, EncodeEmptyFile) {
|
|
|
208
208
|
Temperature::kUnknown, kInvalidBlobFileNumber,
|
|
209
209
|
kUnknownOldestAncesterTime, kUnknownFileCreationTime,
|
|
210
210
|
1 /*epoch_number*/, kUnknownFileChecksum,
|
|
211
|
-
kUnknownFileChecksumFuncName, kNullUniqueId64x2);
|
|
211
|
+
kUnknownFileChecksumFuncName, kNullUniqueId64x2, 0);
|
|
212
212
|
std::string buffer;
|
|
213
213
|
ASSERT_TRUE(!edit.EncodeTo(&buffer));
|
|
214
214
|
}
|