mirror of https://github.com/facebook/rocksdb.git
Add compaction stats for filtered files (#13136)
Summary: As titled. This PR adds some compaction job stats, internal stats and some logging for filtered files. Example logging: [default] compacted to: files[0 0 0 0 2 0 0] max score 0.25, estimated pending compaction bytes 0, MB/sec: 0.3 rd, 0.2 wr, level 6, files in(1, 0) filtered(0, 2) out(1 +0 blob) MB in(0.0, 0.0 +0.0 blob) filtered(0.0, 0.0) out(0.0 +0.0 blob), read-write-amplify(2.0) write-amplify(1.0) OK, records in: 1, records dropped: 1 output_compression: Snappy Pull Request resolved: https://github.com/facebook/rocksdb/pull/13136 Test Plan: Added unit tests Reviewed By: cbi42 Differential Revision: D65855380 Pulled By: jowlyzhang fbshipit-source-id: a4d8eef66f8d999ca5c3d9472aeeae98d7bb03ab
This commit is contained in:
parent
9a136e18b3
commit
ef119c9811
|
@ -368,9 +368,10 @@ Compaction::Compaction(
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// setup input_levels_
|
// setup input_levels_ and filtered_input_levels_
|
||||||
{
|
{
|
||||||
input_levels_.resize(num_input_levels());
|
input_levels_.resize(num_input_levels());
|
||||||
|
filtered_input_levels_.resize(num_input_levels());
|
||||||
if (earliest_snapshot_.has_value()) {
|
if (earliest_snapshot_.has_value()) {
|
||||||
FilterInputsForCompactionIterator();
|
FilterInputsForCompactionIterator();
|
||||||
} else {
|
} else {
|
||||||
|
@ -1085,6 +1086,7 @@ void Compaction::FilterInputsForCompactionIterator() {
|
||||||
ucmp->CompareWithoutTimestamp(rangedel_end_ukey,
|
ucmp->CompareWithoutTimestamp(rangedel_end_ukey,
|
||||||
file->largest.user_key()) > 0) {
|
file->largest.user_key()) > 0) {
|
||||||
non_start_level_input_files_filtered_.back().back() = true;
|
non_start_level_input_files_filtered_.back().back() = true;
|
||||||
|
filtered_input_levels_[level].push_back(file);
|
||||||
} else {
|
} else {
|
||||||
non_start_level_input_files.back().push_back(file);
|
non_start_level_input_files.back().push_back(file);
|
||||||
}
|
}
|
||||||
|
|
|
@ -184,6 +184,16 @@ class Compaction {
|
||||||
return &input_levels_[compaction_input_level];
|
return &input_levels_[compaction_input_level];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Returns the filtered input files of the specified compaction input level.
|
||||||
|
// For now, only non start level is filtered.
|
||||||
|
const std::vector<FileMetaData*>& filtered_input_levels(
|
||||||
|
size_t compaction_input_level) const {
|
||||||
|
const std::vector<FileMetaData*>& filtered_input_level =
|
||||||
|
filtered_input_levels_[compaction_input_level];
|
||||||
|
assert(compaction_input_level != 0 || filtered_input_level.size() == 0);
|
||||||
|
return filtered_input_level;
|
||||||
|
}
|
||||||
|
|
||||||
// Maximum size of files to build during this compaction.
|
// Maximum size of files to build during this compaction.
|
||||||
uint64_t max_output_file_size() const { return max_output_file_size_; }
|
uint64_t max_output_file_size() const { return max_output_file_size_; }
|
||||||
|
|
||||||
|
@ -545,10 +555,13 @@ class Compaction {
|
||||||
|
|
||||||
// Markers for which non start level input files are filtered out if
|
// Markers for which non start level input files are filtered out if
|
||||||
// applicable. Only applicable if earliest_snapshot_ is provided and input
|
// applicable. Only applicable if earliest_snapshot_ is provided and input
|
||||||
// start level has a standalone range deletion file.
|
// start level has a standalone range deletion file. Filtered files are
|
||||||
|
// tracked in `filtered_input_levels_`.
|
||||||
std::vector<std::vector<bool>> non_start_level_input_files_filtered_;
|
std::vector<std::vector<bool>> non_start_level_input_files_filtered_;
|
||||||
|
|
||||||
// bool standalone_range_tombstones_used_for_filtering_inputs_;
|
// All files from inputs_ that are filtered.
|
||||||
|
std::vector<std::vector<FileMetaData*>> filtered_input_levels_;
|
||||||
|
|
||||||
const double score_; // score that was used to pick this compaction.
|
const double score_; // score that was used to pick this compaction.
|
||||||
|
|
||||||
// Is this compaction creating a file in the bottom most level?
|
// Is this compaction creating a file in the bottom most level?
|
||||||
|
|
|
@ -911,19 +911,23 @@ Status CompactionJob::Install(const MutableCFOptions& mutable_cf_options,
|
||||||
ROCKS_LOG_BUFFER(
|
ROCKS_LOG_BUFFER(
|
||||||
log_buffer_,
|
log_buffer_,
|
||||||
"[%s] compacted to: %s, MB/sec: %.1f rd, %.1f wr, level %d, "
|
"[%s] compacted to: %s, MB/sec: %.1f rd, %.1f wr, level %d, "
|
||||||
"files in(%d, %d) out(%d +%d blob) "
|
"files in(%d, %d) filtered(%d, %d) out(%d +%d blob) "
|
||||||
"MB in(%.1f, %.1f +%.1f blob) out(%.1f +%.1f blob), "
|
"MB in(%.1f, %.1f +%.1f blob) filtered(%.1f, %.1f) out(%.1f +%.1f blob), "
|
||||||
"read-write-amplify(%.1f) write-amplify(%.1f) %s, records in: %" PRIu64
|
"read-write-amplify(%.1f) write-amplify(%.1f) %s, records in: %" PRIu64
|
||||||
", records dropped: %" PRIu64 " output_compression: %s\n",
|
", records dropped: %" PRIu64 " output_compression: %s\n",
|
||||||
column_family_name.c_str(), vstorage->LevelSummary(&tmp),
|
column_family_name.c_str(), vstorage->LevelSummary(&tmp),
|
||||||
bytes_read_per_sec, bytes_written_per_sec,
|
bytes_read_per_sec, bytes_written_per_sec,
|
||||||
compact_->compaction->output_level(),
|
compact_->compaction->output_level(),
|
||||||
stats.num_input_files_in_non_output_levels,
|
stats.num_input_files_in_non_output_levels,
|
||||||
stats.num_input_files_in_output_level, stats.num_output_files,
|
stats.num_input_files_in_output_level,
|
||||||
|
stats.num_filtered_input_files_in_non_output_levels,
|
||||||
|
stats.num_filtered_input_files_in_output_level, stats.num_output_files,
|
||||||
stats.num_output_files_blob, stats.bytes_read_non_output_levels / kMB,
|
stats.num_output_files_blob, stats.bytes_read_non_output_levels / kMB,
|
||||||
stats.bytes_read_output_level / kMB, stats.bytes_read_blob / kMB,
|
stats.bytes_read_output_level / kMB, stats.bytes_read_blob / kMB,
|
||||||
stats.bytes_written / kMB, stats.bytes_written_blob / kMB, read_write_amp,
|
stats.bytes_skipped_non_output_levels / kMB,
|
||||||
write_amp, status.ToString().c_str(), stats.num_input_records,
|
stats.bytes_skipped_output_level / kMB, stats.bytes_written / kMB,
|
||||||
|
stats.bytes_written_blob / kMB, read_write_amp, write_amp,
|
||||||
|
status.ToString().c_str(), stats.num_input_records,
|
||||||
stats.num_dropped_records,
|
stats.num_dropped_records,
|
||||||
CompressionTypeToString(compact_->compaction->output_compression())
|
CompressionTypeToString(compact_->compaction->output_compression())
|
||||||
.c_str());
|
.c_str());
|
||||||
|
@ -2007,7 +2011,6 @@ bool CompactionJob::UpdateCompactionStats(uint64_t* num_input_range_del) {
|
||||||
bool has_error = false;
|
bool has_error = false;
|
||||||
const ReadOptions read_options(Env::IOActivity::kCompaction);
|
const ReadOptions read_options(Env::IOActivity::kCompaction);
|
||||||
const auto& input_table_properties = compaction->GetInputTableProperties();
|
const auto& input_table_properties = compaction->GetInputTableProperties();
|
||||||
// TODO(yuzhangyu): add dedicated stats for filtered files.
|
|
||||||
for (int input_level = 0;
|
for (int input_level = 0;
|
||||||
input_level < static_cast<int>(compaction->num_input_levels());
|
input_level < static_cast<int>(compaction->num_input_levels());
|
||||||
++input_level) {
|
++input_level) {
|
||||||
|
@ -2047,6 +2050,23 @@ bool CompactionJob::UpdateCompactionStats(uint64_t* num_input_range_del) {
|
||||||
*num_input_range_del += file_num_range_del;
|
*num_input_range_del += file_num_range_del;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const std::vector<FileMetaData*>& filtered_flevel =
|
||||||
|
compaction->filtered_input_levels(input_level);
|
||||||
|
size_t num_filtered_input_files = filtered_flevel.size();
|
||||||
|
uint64_t* bytes_skipped;
|
||||||
|
if (compaction->level(input_level) != compaction->output_level()) {
|
||||||
|
compaction_stats_.stats.num_filtered_input_files_in_non_output_levels +=
|
||||||
|
static_cast<int>(num_filtered_input_files);
|
||||||
|
bytes_skipped = &compaction_stats_.stats.bytes_skipped_non_output_levels;
|
||||||
|
} else {
|
||||||
|
compaction_stats_.stats.num_filtered_input_files_in_output_level +=
|
||||||
|
static_cast<int>(num_filtered_input_files);
|
||||||
|
bytes_skipped = &compaction_stats_.stats.bytes_skipped_output_level;
|
||||||
|
}
|
||||||
|
for (const FileMetaData* filtered_file_meta : filtered_flevel) {
|
||||||
|
*bytes_skipped += filtered_file_meta->fd.GetFileSize();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
assert(compaction_job_stats_);
|
assert(compaction_job_stats_);
|
||||||
|
@ -2071,6 +2091,13 @@ void CompactionJob::UpdateCompactionJobStats(
|
||||||
stats.num_input_files_in_output_level;
|
stats.num_input_files_in_output_level;
|
||||||
compaction_job_stats_->num_input_files_at_output_level =
|
compaction_job_stats_->num_input_files_at_output_level =
|
||||||
stats.num_input_files_in_output_level;
|
stats.num_input_files_in_output_level;
|
||||||
|
compaction_job_stats_->num_filtered_input_files =
|
||||||
|
stats.num_filtered_input_files_in_non_output_levels +
|
||||||
|
stats.num_filtered_input_files_in_output_level;
|
||||||
|
compaction_job_stats_->num_filtered_input_files_at_output_level =
|
||||||
|
stats.num_filtered_input_files_in_output_level;
|
||||||
|
compaction_job_stats_->total_skipped_input_bytes =
|
||||||
|
stats.bytes_skipped_non_output_levels + stats.bytes_skipped_output_level;
|
||||||
|
|
||||||
// output information
|
// output information
|
||||||
compaction_job_stats_->total_output_bytes = stats.bytes_written;
|
compaction_job_stats_->total_output_bytes = stats.bytes_written;
|
||||||
|
|
|
@ -215,8 +215,7 @@ class CompactionJob {
|
||||||
virtual void RecordCompactionIOStats();
|
virtual void RecordCompactionIOStats();
|
||||||
void CleanupCompaction();
|
void CleanupCompaction();
|
||||||
|
|
||||||
// Call compaction filter. Then iterate through input and compact the
|
// Iterate through input and compact the kv-pairs.
|
||||||
// kv-pairs
|
|
||||||
void ProcessKeyValueCompaction(SubcompactionState* sub_compact);
|
void ProcessKeyValueCompaction(SubcompactionState* sub_compact);
|
||||||
|
|
||||||
CompactionState* compact_;
|
CompactionState* compact_;
|
||||||
|
|
|
@ -182,6 +182,36 @@ class ExternalSSTFileBasicTest
|
||||||
write_global_seqno, verify_checksums_before_ingest, true_data);
|
write_global_seqno, verify_checksums_before_ingest, true_data);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void VerifyInputFilesInternalStatsForOutputLevel(
|
||||||
|
int output_level, int num_input_files_in_non_output_levels,
|
||||||
|
int num_input_files_in_output_level,
|
||||||
|
int num_filtered_input_files_in_non_output_levels,
|
||||||
|
int num_filtered_input_files_in_output_level,
|
||||||
|
uint64_t bytes_skipped_non_output_levels,
|
||||||
|
uint64_t bytes_skipped_output_level) {
|
||||||
|
ColumnFamilyHandleImpl* cfh =
|
||||||
|
static_cast<ColumnFamilyHandleImpl*>(dbfull()->DefaultColumnFamily());
|
||||||
|
ColumnFamilyData* cfd = cfh->cfd();
|
||||||
|
const InternalStats* internal_stats_ptr = cfd->internal_stats();
|
||||||
|
const std::vector<InternalStats::CompactionStats>& comp_stats =
|
||||||
|
internal_stats_ptr->TEST_GetCompactionStats();
|
||||||
|
|
||||||
|
EXPECT_EQ(num_input_files_in_non_output_levels,
|
||||||
|
comp_stats[output_level].num_input_files_in_non_output_levels);
|
||||||
|
EXPECT_EQ(num_input_files_in_output_level,
|
||||||
|
comp_stats[output_level].num_input_files_in_output_level);
|
||||||
|
EXPECT_EQ(
|
||||||
|
num_filtered_input_files_in_non_output_levels,
|
||||||
|
comp_stats[output_level].num_filtered_input_files_in_non_output_levels);
|
||||||
|
EXPECT_EQ(
|
||||||
|
num_filtered_input_files_in_output_level,
|
||||||
|
comp_stats[output_level].num_filtered_input_files_in_output_level);
|
||||||
|
EXPECT_EQ(bytes_skipped_non_output_levels,
|
||||||
|
comp_stats[output_level].bytes_skipped_non_output_levels);
|
||||||
|
EXPECT_EQ(bytes_skipped_output_level,
|
||||||
|
comp_stats[output_level].bytes_skipped_output_level);
|
||||||
|
}
|
||||||
|
|
||||||
~ExternalSSTFileBasicTest() override {
|
~ExternalSSTFileBasicTest() override {
|
||||||
DestroyDir(env_, sst_files_dir_).PermitUncheckedError();
|
DestroyDir(env_, sst_files_dir_).PermitUncheckedError();
|
||||||
}
|
}
|
||||||
|
@ -1841,11 +1871,60 @@ TEST_F(ExternalSSTFileBasicTest, OverlappingFiles) {
|
||||||
ASSERT_EQ(2, NumTableFilesAtLevel(5));
|
ASSERT_EQ(2, NumTableFilesAtLevel(5));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
class CompactionJobStatsCheckerForFilteredFiles : public EventListener {
|
||||||
|
public:
|
||||||
|
CompactionJobStatsCheckerForFilteredFiles(
|
||||||
|
int num_input_files, int num_input_files_at_output_level,
|
||||||
|
int num_filtered_input_files,
|
||||||
|
int num_filtered_input_files_at_output_level)
|
||||||
|
: num_input_files_(num_input_files),
|
||||||
|
num_input_files_at_output_level_(num_input_files_at_output_level),
|
||||||
|
num_filtered_input_files_(num_filtered_input_files),
|
||||||
|
num_filtered_input_files_at_output_level_(
|
||||||
|
num_filtered_input_files_at_output_level) {}
|
||||||
|
|
||||||
|
void OnCompactionCompleted(DB* /*db*/, const CompactionJobInfo& ci) override {
|
||||||
|
std::lock_guard<std::mutex> lock(mutex_);
|
||||||
|
ASSERT_EQ(num_input_files_, ci.stats.num_input_files);
|
||||||
|
ASSERT_EQ(num_input_files_at_output_level_,
|
||||||
|
ci.stats.num_input_files_at_output_level);
|
||||||
|
ASSERT_EQ(num_filtered_input_files_, ci.stats.num_filtered_input_files);
|
||||||
|
ASSERT_EQ(num_filtered_input_files_at_output_level_,
|
||||||
|
ci.stats.num_filtered_input_files_at_output_level);
|
||||||
|
ASSERT_EQ(ci.stats.total_skipped_input_bytes,
|
||||||
|
expected_compaction_skipped_file_size_);
|
||||||
|
}
|
||||||
|
|
||||||
|
void SetExpectedCompactionSkippedFileSize(uint64_t expected_size) {
|
||||||
|
std::lock_guard<std::mutex> lock(mutex_);
|
||||||
|
expected_compaction_skipped_file_size_ = expected_size;
|
||||||
|
}
|
||||||
|
|
||||||
|
private:
|
||||||
|
int num_input_files_ = 0;
|
||||||
|
int num_input_files_at_output_level_ = 0;
|
||||||
|
int num_filtered_input_files_ = 0;
|
||||||
|
int num_filtered_input_files_at_output_level_ = 0;
|
||||||
|
std::mutex mutex_;
|
||||||
|
uint64_t expected_compaction_skipped_file_size_ = 0;
|
||||||
|
};
|
||||||
|
|
||||||
TEST_F(ExternalSSTFileBasicTest, AtomicReplaceDataWithStandaloneRangeDeletion) {
|
TEST_F(ExternalSSTFileBasicTest, AtomicReplaceDataWithStandaloneRangeDeletion) {
|
||||||
Options options = CurrentOptions();
|
Options options = CurrentOptions();
|
||||||
options.compaction_style = CompactionStyle::kCompactionStyleUniversal;
|
options.compaction_style = CompactionStyle::kCompactionStyleUniversal;
|
||||||
|
int kCompactionNumInputFiles = 1;
|
||||||
|
int kCompactionNumInputFilesAtOutputLevel = 0;
|
||||||
|
int kCompactionNumFilteredInputFiles = 2;
|
||||||
|
int kCompactionNumFilteredInputFilesAtOutputLevel = 2;
|
||||||
|
auto compaction_listener =
|
||||||
|
std::make_shared<CompactionJobStatsCheckerForFilteredFiles>(
|
||||||
|
kCompactionNumInputFiles, kCompactionNumInputFilesAtOutputLevel,
|
||||||
|
kCompactionNumFilteredInputFiles,
|
||||||
|
kCompactionNumFilteredInputFilesAtOutputLevel);
|
||||||
|
options.listeners.push_back(compaction_listener);
|
||||||
DestroyAndReopen(options);
|
DestroyAndReopen(options);
|
||||||
|
|
||||||
|
size_t compaction_skipped_file_size = 0;
|
||||||
std::vector<std::string> files;
|
std::vector<std::string> files;
|
||||||
{
|
{
|
||||||
// Writes first version of data in range partitioned files.
|
// Writes first version of data in range partitioned files.
|
||||||
|
@ -1856,6 +1935,7 @@ TEST_F(ExternalSSTFileBasicTest, AtomicReplaceDataWithStandaloneRangeDeletion) {
|
||||||
ASSERT_OK(sst_file_writer.Put("b", "b1"));
|
ASSERT_OK(sst_file_writer.Put("b", "b1"));
|
||||||
ExternalSstFileInfo file1_info;
|
ExternalSstFileInfo file1_info;
|
||||||
ASSERT_OK(sst_file_writer.Finish(&file1_info));
|
ASSERT_OK(sst_file_writer.Finish(&file1_info));
|
||||||
|
compaction_skipped_file_size += file1_info.file_size;
|
||||||
files.push_back(std::move(file1));
|
files.push_back(std::move(file1));
|
||||||
|
|
||||||
std::string file2 = sst_files_dir_ + "file2.sst";
|
std::string file2 = sst_files_dir_ + "file2.sst";
|
||||||
|
@ -1864,7 +1944,10 @@ TEST_F(ExternalSSTFileBasicTest, AtomicReplaceDataWithStandaloneRangeDeletion) {
|
||||||
ASSERT_OK(sst_file_writer.Put("y", "y1"));
|
ASSERT_OK(sst_file_writer.Put("y", "y1"));
|
||||||
ExternalSstFileInfo file2_info;
|
ExternalSstFileInfo file2_info;
|
||||||
ASSERT_OK(sst_file_writer.Finish(&file2_info));
|
ASSERT_OK(sst_file_writer.Finish(&file2_info));
|
||||||
|
compaction_skipped_file_size += file2_info.file_size;
|
||||||
files.push_back(std::move(file2));
|
files.push_back(std::move(file2));
|
||||||
|
compaction_listener->SetExpectedCompactionSkippedFileSize(
|
||||||
|
compaction_skipped_file_size);
|
||||||
}
|
}
|
||||||
|
|
||||||
IngestExternalFileOptions ifo;
|
IngestExternalFileOptions ifo;
|
||||||
|
@ -1944,6 +2027,16 @@ TEST_F(ExternalSSTFileBasicTest, AtomicReplaceDataWithStandaloneRangeDeletion) {
|
||||||
ASSERT_EQ(Get("x"), "x2");
|
ASSERT_EQ(Get("x"), "x2");
|
||||||
ASSERT_EQ(Get("y"), "y2");
|
ASSERT_EQ(Get("y"), "y2");
|
||||||
|
|
||||||
|
VerifyInputFilesInternalStatsForOutputLevel(
|
||||||
|
/*output_level*/ 6,
|
||||||
|
kCompactionNumInputFiles - kCompactionNumInputFilesAtOutputLevel,
|
||||||
|
kCompactionNumInputFilesAtOutputLevel,
|
||||||
|
kCompactionNumFilteredInputFiles -
|
||||||
|
kCompactionNumFilteredInputFilesAtOutputLevel,
|
||||||
|
kCompactionNumFilteredInputFilesAtOutputLevel,
|
||||||
|
/*bytes_skipped_non_output_levels*/ 0,
|
||||||
|
/*bytes_skipped_output_level*/ compaction_skipped_file_size);
|
||||||
|
|
||||||
ROCKSDB_NAMESPACE::SyncPoint::GetInstance()->DisableProcessing();
|
ROCKSDB_NAMESPACE::SyncPoint::GetInstance()->DisableProcessing();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1951,9 +2044,20 @@ TEST_F(ExternalSSTFileBasicTest,
|
||||||
PartiallyReplaceDataWithOneStandaloneRangeDeletion) {
|
PartiallyReplaceDataWithOneStandaloneRangeDeletion) {
|
||||||
Options options = CurrentOptions();
|
Options options = CurrentOptions();
|
||||||
options.compaction_style = CompactionStyle::kCompactionStyleUniversal;
|
options.compaction_style = CompactionStyle::kCompactionStyleUniversal;
|
||||||
|
int kCompactionNumInputFiles = 2;
|
||||||
|
int kCompactionNumInputFilesAtOutputLevel = 1;
|
||||||
|
int kCompactionNumFilteredInputFiles = 1;
|
||||||
|
int kCompactionNumFilteredInputFilesAtOutputLevel = 1;
|
||||||
|
auto compaction_listener =
|
||||||
|
std::make_shared<CompactionJobStatsCheckerForFilteredFiles>(
|
||||||
|
kCompactionNumInputFiles, kCompactionNumInputFilesAtOutputLevel,
|
||||||
|
kCompactionNumFilteredInputFiles,
|
||||||
|
kCompactionNumFilteredInputFilesAtOutputLevel);
|
||||||
|
options.listeners.push_back(compaction_listener);
|
||||||
DestroyAndReopen(options);
|
DestroyAndReopen(options);
|
||||||
|
|
||||||
std::vector<std::string> files;
|
std::vector<std::string> files;
|
||||||
|
size_t compaction_skipped_file_size = 0;
|
||||||
{
|
{
|
||||||
// Writes first version of data in range partitioned files.
|
// Writes first version of data in range partitioned files.
|
||||||
SstFileWriter sst_file_writer(EnvOptions(), options);
|
SstFileWriter sst_file_writer(EnvOptions(), options);
|
||||||
|
@ -1963,7 +2067,10 @@ TEST_F(ExternalSSTFileBasicTest,
|
||||||
ASSERT_OK(sst_file_writer.Put("b", "b1"));
|
ASSERT_OK(sst_file_writer.Put("b", "b1"));
|
||||||
ExternalSstFileInfo file1_info;
|
ExternalSstFileInfo file1_info;
|
||||||
ASSERT_OK(sst_file_writer.Finish(&file1_info));
|
ASSERT_OK(sst_file_writer.Finish(&file1_info));
|
||||||
|
compaction_skipped_file_size += file1_info.file_size;
|
||||||
files.push_back(std::move(file1));
|
files.push_back(std::move(file1));
|
||||||
|
compaction_listener->SetExpectedCompactionSkippedFileSize(
|
||||||
|
compaction_skipped_file_size);
|
||||||
|
|
||||||
std::string file2 = sst_files_dir_ + "file2.sst";
|
std::string file2 = sst_files_dir_ + "file2.sst";
|
||||||
ASSERT_OK(sst_file_writer.Open(file2));
|
ASSERT_OK(sst_file_writer.Open(file2));
|
||||||
|
@ -2032,6 +2139,17 @@ TEST_F(ExternalSSTFileBasicTest,
|
||||||
ASSERT_EQ(Get("h"), "h1");
|
ASSERT_EQ(Get("h"), "h1");
|
||||||
ASSERT_EQ(Get("x"), "x2");
|
ASSERT_EQ(Get("x"), "x2");
|
||||||
ASSERT_EQ(Get("y"), "y");
|
ASSERT_EQ(Get("y"), "y");
|
||||||
|
|
||||||
|
VerifyInputFilesInternalStatsForOutputLevel(
|
||||||
|
/*output_level*/ 6,
|
||||||
|
kCompactionNumInputFiles - kCompactionNumInputFilesAtOutputLevel,
|
||||||
|
kCompactionNumInputFilesAtOutputLevel,
|
||||||
|
kCompactionNumFilteredInputFiles -
|
||||||
|
kCompactionNumFilteredInputFilesAtOutputLevel,
|
||||||
|
kCompactionNumFilteredInputFilesAtOutputLevel,
|
||||||
|
/*bytes_skipped_non_output_levels*/ 0,
|
||||||
|
/*bytes_skipped_output_level*/ compaction_skipped_file_size);
|
||||||
|
|
||||||
ROCKSDB_NAMESPACE::SyncPoint::GetInstance()->DisableProcessing();
|
ROCKSDB_NAMESPACE::SyncPoint::GetInstance()->DisableProcessing();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2039,15 +2157,29 @@ TEST_F(ExternalSSTFileBasicTest,
|
||||||
PartiallyReplaceDataWithMultipleStandaloneRangeDeletions) {
|
PartiallyReplaceDataWithMultipleStandaloneRangeDeletions) {
|
||||||
Options options = CurrentOptions();
|
Options options = CurrentOptions();
|
||||||
options.compaction_style = CompactionStyle::kCompactionStyleUniversal;
|
options.compaction_style = CompactionStyle::kCompactionStyleUniversal;
|
||||||
|
int kCompactionNumInputFiles = 2;
|
||||||
|
int kCompactionNumInputFilesAtOutputLevel = 0;
|
||||||
|
int kCompactionNumFilteredInputFiles = 2;
|
||||||
|
int kCompactionNumFilteredInputFilesAtOutputLevel = 2;
|
||||||
|
// Two compactions each included on standalone range deletion file that
|
||||||
|
// filters input file on the non start level.
|
||||||
|
auto compaction_listener =
|
||||||
|
std::make_shared<CompactionJobStatsCheckerForFilteredFiles>(
|
||||||
|
kCompactionNumInputFiles / 2,
|
||||||
|
kCompactionNumInputFilesAtOutputLevel / 2,
|
||||||
|
kCompactionNumFilteredInputFiles / 2,
|
||||||
|
kCompactionNumFilteredInputFilesAtOutputLevel / 2);
|
||||||
|
options.listeners.push_back(compaction_listener);
|
||||||
DestroyAndReopen(options);
|
DestroyAndReopen(options);
|
||||||
|
|
||||||
std::vector<std::string> files;
|
std::vector<std::string> files;
|
||||||
|
ExternalSstFileInfo file1_info;
|
||||||
|
ExternalSstFileInfo file3_info;
|
||||||
{
|
{
|
||||||
SstFileWriter sst_file_writer(EnvOptions(), options);
|
SstFileWriter sst_file_writer(EnvOptions(), options);
|
||||||
std::string file1 = sst_files_dir_ + "file1.sst";
|
std::string file1 = sst_files_dir_ + "file1.sst";
|
||||||
ASSERT_OK(sst_file_writer.Open(file1));
|
ASSERT_OK(sst_file_writer.Open(file1));
|
||||||
ASSERT_OK(sst_file_writer.Put("a", "a1"));
|
ASSERT_OK(sst_file_writer.Put("a", "a1"));
|
||||||
ExternalSstFileInfo file1_info;
|
|
||||||
ASSERT_OK(sst_file_writer.Finish(&file1_info));
|
ASSERT_OK(sst_file_writer.Finish(&file1_info));
|
||||||
files.push_back(std::move(file1));
|
files.push_back(std::move(file1));
|
||||||
std::string file2 = sst_files_dir_ + "file2.sst";
|
std::string file2 = sst_files_dir_ + "file2.sst";
|
||||||
|
@ -2059,7 +2191,6 @@ TEST_F(ExternalSSTFileBasicTest,
|
||||||
std::string file3 = sst_files_dir_ + "file3.sst";
|
std::string file3 = sst_files_dir_ + "file3.sst";
|
||||||
ASSERT_OK(sst_file_writer.Open(file3));
|
ASSERT_OK(sst_file_writer.Open(file3));
|
||||||
ASSERT_OK(sst_file_writer.Put("x", "x1"));
|
ASSERT_OK(sst_file_writer.Put("x", "x1"));
|
||||||
ExternalSstFileInfo file3_info;
|
|
||||||
ASSERT_OK(sst_file_writer.Finish(&file3_info));
|
ASSERT_OK(sst_file_writer.Finish(&file3_info));
|
||||||
files.push_back(std::move(file3));
|
files.push_back(std::move(file3));
|
||||||
}
|
}
|
||||||
|
@ -2107,9 +2238,15 @@ TEST_F(ExternalSSTFileBasicTest,
|
||||||
size_t* num_input_files = static_cast<size_t*>(arg);
|
size_t* num_input_files = static_cast<size_t*>(arg);
|
||||||
EXPECT_EQ(1, *num_input_files);
|
EXPECT_EQ(1, *num_input_files);
|
||||||
num_compactions += 1;
|
num_compactions += 1;
|
||||||
|
if (num_compactions == 2) {
|
||||||
|
compaction_listener->SetExpectedCompactionSkippedFileSize(
|
||||||
|
file3_info.file_size);
|
||||||
|
}
|
||||||
});
|
});
|
||||||
ROCKSDB_NAMESPACE::SyncPoint::GetInstance()->EnableProcessing();
|
ROCKSDB_NAMESPACE::SyncPoint::GetInstance()->EnableProcessing();
|
||||||
|
|
||||||
|
compaction_listener->SetExpectedCompactionSkippedFileSize(
|
||||||
|
file1_info.file_size);
|
||||||
ASSERT_OK(db_->IngestExternalFile(files, ifo));
|
ASSERT_OK(db_->IngestExternalFile(files, ifo));
|
||||||
|
|
||||||
ASSERT_OK(dbfull()->TEST_WaitForCompact());
|
ASSERT_OK(dbfull()->TEST_WaitForCompact());
|
||||||
|
@ -2121,12 +2258,35 @@ TEST_F(ExternalSSTFileBasicTest,
|
||||||
ASSERT_EQ(Get("a"), "a2");
|
ASSERT_EQ(Get("a"), "a2");
|
||||||
ASSERT_EQ(Get("h"), "h");
|
ASSERT_EQ(Get("h"), "h");
|
||||||
ASSERT_EQ(Get("x"), "x2");
|
ASSERT_EQ(Get("x"), "x2");
|
||||||
|
VerifyInputFilesInternalStatsForOutputLevel(
|
||||||
|
/*output_level*/ 6,
|
||||||
|
kCompactionNumInputFiles - kCompactionNumInputFilesAtOutputLevel,
|
||||||
|
kCompactionNumInputFilesAtOutputLevel,
|
||||||
|
kCompactionNumFilteredInputFiles -
|
||||||
|
kCompactionNumFilteredInputFilesAtOutputLevel,
|
||||||
|
kCompactionNumFilteredInputFilesAtOutputLevel,
|
||||||
|
/*bytes_skipped_non_output_levels*/ 0,
|
||||||
|
/*bytes_skipped_output_level*/ file1_info.file_size +
|
||||||
|
file3_info.file_size);
|
||||||
ROCKSDB_NAMESPACE::SyncPoint::GetInstance()->DisableProcessing();
|
ROCKSDB_NAMESPACE::SyncPoint::GetInstance()->DisableProcessing();
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_F(ExternalSSTFileBasicTest, StandaloneRangeDeletionEndKeyIsExclusive) {
|
TEST_F(ExternalSSTFileBasicTest, StandaloneRangeDeletionEndKeyIsExclusive) {
|
||||||
Options options = CurrentOptions();
|
Options options = CurrentOptions();
|
||||||
options.compaction_style = CompactionStyle::kCompactionStyleUniversal;
|
options.compaction_style = CompactionStyle::kCompactionStyleUniversal;
|
||||||
|
int kCompactionNumInputFiles = 2;
|
||||||
|
int kCompactionNumInputFilesAtOutputLevel = 1;
|
||||||
|
int kCompactionNumFilteredInputFiles = 0;
|
||||||
|
int kCompactionNumFilteredInputFilesAtOutputLevel = 0;
|
||||||
|
auto compaction_listener =
|
||||||
|
std::make_shared<CompactionJobStatsCheckerForFilteredFiles>(
|
||||||
|
kCompactionNumInputFiles, kCompactionNumInputFilesAtOutputLevel,
|
||||||
|
kCompactionNumFilteredInputFiles,
|
||||||
|
kCompactionNumFilteredInputFilesAtOutputLevel);
|
||||||
|
options.listeners.push_back(compaction_listener);
|
||||||
|
// No compaction input files are filtered because the range deletion file's
|
||||||
|
// end is exclusive, so it cannot cover the whole file.
|
||||||
|
compaction_listener->SetExpectedCompactionSkippedFileSize(0);
|
||||||
DestroyAndReopen(options);
|
DestroyAndReopen(options);
|
||||||
|
|
||||||
std::vector<std::string> files;
|
std::vector<std::string> files;
|
||||||
|
@ -2181,6 +2341,16 @@ TEST_F(ExternalSSTFileBasicTest, StandaloneRangeDeletionEndKeyIsExclusive) {
|
||||||
|
|
||||||
ASSERT_EQ(Get("a"), "NOT_FOUND");
|
ASSERT_EQ(Get("a"), "NOT_FOUND");
|
||||||
ASSERT_EQ(Get("b"), "b");
|
ASSERT_EQ(Get("b"), "b");
|
||||||
|
|
||||||
|
VerifyInputFilesInternalStatsForOutputLevel(
|
||||||
|
/*output_level*/ 6,
|
||||||
|
kCompactionNumInputFiles - kCompactionNumInputFilesAtOutputLevel,
|
||||||
|
kCompactionNumInputFilesAtOutputLevel,
|
||||||
|
kCompactionNumFilteredInputFiles -
|
||||||
|
kCompactionNumFilteredInputFilesAtOutputLevel,
|
||||||
|
kCompactionNumFilteredInputFilesAtOutputLevel,
|
||||||
|
/*bytes_skipped_non_output_levels*/ 0,
|
||||||
|
/*bytes_skipped_output_level*/ 0);
|
||||||
ROCKSDB_NAMESPACE::SyncPoint::GetInstance()->DisableProcessing();
|
ROCKSDB_NAMESPACE::SyncPoint::GetInstance()->DisableProcessing();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -182,6 +182,14 @@ class InternalStats {
|
||||||
// The number of bytes read from the compaction output level (table files)
|
// The number of bytes read from the compaction output level (table files)
|
||||||
uint64_t bytes_read_output_level;
|
uint64_t bytes_read_output_level;
|
||||||
|
|
||||||
|
// The number of bytes skipped from all non-output levels because the input
|
||||||
|
// files are filtered by compaction optimizations.
|
||||||
|
uint64_t bytes_skipped_non_output_levels;
|
||||||
|
|
||||||
|
// The number of bytes skipped from the compaction output level because the
|
||||||
|
// input files are filtered by compaction optimizations.
|
||||||
|
uint64_t bytes_skipped_output_level;
|
||||||
|
|
||||||
// The number of bytes read from blob files
|
// The number of bytes read from blob files
|
||||||
uint64_t bytes_read_blob;
|
uint64_t bytes_read_blob;
|
||||||
|
|
||||||
|
@ -201,6 +209,14 @@ class InternalStats {
|
||||||
// The number of compaction input files in the output level (table files)
|
// The number of compaction input files in the output level (table files)
|
||||||
int num_input_files_in_output_level;
|
int num_input_files_in_output_level;
|
||||||
|
|
||||||
|
// The number of non output level compaction input files that are filtered
|
||||||
|
// by compaction optimizations.
|
||||||
|
int num_filtered_input_files_in_non_output_levels;
|
||||||
|
|
||||||
|
// The number of output level compaction input files that are filtered by
|
||||||
|
// compaction optimizations.
|
||||||
|
int num_filtered_input_files_in_output_level;
|
||||||
|
|
||||||
// The number of compaction output files (table files)
|
// The number of compaction output files (table files)
|
||||||
int num_output_files;
|
int num_output_files;
|
||||||
|
|
||||||
|
@ -228,12 +244,16 @@ class InternalStats {
|
||||||
cpu_micros(0),
|
cpu_micros(0),
|
||||||
bytes_read_non_output_levels(0),
|
bytes_read_non_output_levels(0),
|
||||||
bytes_read_output_level(0),
|
bytes_read_output_level(0),
|
||||||
|
bytes_skipped_non_output_levels(0),
|
||||||
|
bytes_skipped_output_level(0),
|
||||||
bytes_read_blob(0),
|
bytes_read_blob(0),
|
||||||
bytes_written(0),
|
bytes_written(0),
|
||||||
bytes_written_blob(0),
|
bytes_written_blob(0),
|
||||||
bytes_moved(0),
|
bytes_moved(0),
|
||||||
num_input_files_in_non_output_levels(0),
|
num_input_files_in_non_output_levels(0),
|
||||||
num_input_files_in_output_level(0),
|
num_input_files_in_output_level(0),
|
||||||
|
num_filtered_input_files_in_non_output_levels(0),
|
||||||
|
num_filtered_input_files_in_output_level(0),
|
||||||
num_output_files(0),
|
num_output_files(0),
|
||||||
num_output_files_blob(0),
|
num_output_files_blob(0),
|
||||||
num_input_records(0),
|
num_input_records(0),
|
||||||
|
@ -251,12 +271,16 @@ class InternalStats {
|
||||||
cpu_micros(0),
|
cpu_micros(0),
|
||||||
bytes_read_non_output_levels(0),
|
bytes_read_non_output_levels(0),
|
||||||
bytes_read_output_level(0),
|
bytes_read_output_level(0),
|
||||||
|
bytes_skipped_non_output_levels(0),
|
||||||
|
bytes_skipped_output_level(0),
|
||||||
bytes_read_blob(0),
|
bytes_read_blob(0),
|
||||||
bytes_written(0),
|
bytes_written(0),
|
||||||
bytes_written_blob(0),
|
bytes_written_blob(0),
|
||||||
bytes_moved(0),
|
bytes_moved(0),
|
||||||
num_input_files_in_non_output_levels(0),
|
num_input_files_in_non_output_levels(0),
|
||||||
num_input_files_in_output_level(0),
|
num_input_files_in_output_level(0),
|
||||||
|
num_filtered_input_files_in_non_output_levels(0),
|
||||||
|
num_filtered_input_files_in_output_level(0),
|
||||||
num_output_files(0),
|
num_output_files(0),
|
||||||
num_output_files_blob(0),
|
num_output_files_blob(0),
|
||||||
num_input_records(0),
|
num_input_records(0),
|
||||||
|
@ -280,6 +304,8 @@ class InternalStats {
|
||||||
cpu_micros(c.cpu_micros),
|
cpu_micros(c.cpu_micros),
|
||||||
bytes_read_non_output_levels(c.bytes_read_non_output_levels),
|
bytes_read_non_output_levels(c.bytes_read_non_output_levels),
|
||||||
bytes_read_output_level(c.bytes_read_output_level),
|
bytes_read_output_level(c.bytes_read_output_level),
|
||||||
|
bytes_skipped_non_output_levels(c.bytes_skipped_non_output_levels),
|
||||||
|
bytes_skipped_output_level(c.bytes_skipped_output_level),
|
||||||
bytes_read_blob(c.bytes_read_blob),
|
bytes_read_blob(c.bytes_read_blob),
|
||||||
bytes_written(c.bytes_written),
|
bytes_written(c.bytes_written),
|
||||||
bytes_written_blob(c.bytes_written_blob),
|
bytes_written_blob(c.bytes_written_blob),
|
||||||
|
@ -287,6 +313,10 @@ class InternalStats {
|
||||||
num_input_files_in_non_output_levels(
|
num_input_files_in_non_output_levels(
|
||||||
c.num_input_files_in_non_output_levels),
|
c.num_input_files_in_non_output_levels),
|
||||||
num_input_files_in_output_level(c.num_input_files_in_output_level),
|
num_input_files_in_output_level(c.num_input_files_in_output_level),
|
||||||
|
num_filtered_input_files_in_non_output_levels(
|
||||||
|
c.num_filtered_input_files_in_non_output_levels),
|
||||||
|
num_filtered_input_files_in_output_level(
|
||||||
|
c.num_filtered_input_files_in_output_level),
|
||||||
num_output_files(c.num_output_files),
|
num_output_files(c.num_output_files),
|
||||||
num_output_files_blob(c.num_output_files_blob),
|
num_output_files_blob(c.num_output_files_blob),
|
||||||
num_input_records(c.num_input_records),
|
num_input_records(c.num_input_records),
|
||||||
|
@ -304,6 +334,8 @@ class InternalStats {
|
||||||
cpu_micros = c.cpu_micros;
|
cpu_micros = c.cpu_micros;
|
||||||
bytes_read_non_output_levels = c.bytes_read_non_output_levels;
|
bytes_read_non_output_levels = c.bytes_read_non_output_levels;
|
||||||
bytes_read_output_level = c.bytes_read_output_level;
|
bytes_read_output_level = c.bytes_read_output_level;
|
||||||
|
bytes_skipped_non_output_levels = c.bytes_skipped_non_output_levels;
|
||||||
|
bytes_skipped_output_level = c.bytes_skipped_output_level;
|
||||||
bytes_read_blob = c.bytes_read_blob;
|
bytes_read_blob = c.bytes_read_blob;
|
||||||
bytes_written = c.bytes_written;
|
bytes_written = c.bytes_written;
|
||||||
bytes_written_blob = c.bytes_written_blob;
|
bytes_written_blob = c.bytes_written_blob;
|
||||||
|
@ -311,6 +343,10 @@ class InternalStats {
|
||||||
num_input_files_in_non_output_levels =
|
num_input_files_in_non_output_levels =
|
||||||
c.num_input_files_in_non_output_levels;
|
c.num_input_files_in_non_output_levels;
|
||||||
num_input_files_in_output_level = c.num_input_files_in_output_level;
|
num_input_files_in_output_level = c.num_input_files_in_output_level;
|
||||||
|
num_filtered_input_files_in_non_output_levels =
|
||||||
|
c.num_filtered_input_files_in_non_output_levels;
|
||||||
|
num_filtered_input_files_in_output_level =
|
||||||
|
c.num_filtered_input_files_in_output_level;
|
||||||
num_output_files = c.num_output_files;
|
num_output_files = c.num_output_files;
|
||||||
num_output_files_blob = c.num_output_files_blob;
|
num_output_files_blob = c.num_output_files_blob;
|
||||||
num_input_records = c.num_input_records;
|
num_input_records = c.num_input_records;
|
||||||
|
@ -330,12 +366,16 @@ class InternalStats {
|
||||||
this->cpu_micros = 0;
|
this->cpu_micros = 0;
|
||||||
this->bytes_read_non_output_levels = 0;
|
this->bytes_read_non_output_levels = 0;
|
||||||
this->bytes_read_output_level = 0;
|
this->bytes_read_output_level = 0;
|
||||||
|
this->bytes_skipped_non_output_levels = 0;
|
||||||
|
this->bytes_skipped_output_level = 0;
|
||||||
this->bytes_read_blob = 0;
|
this->bytes_read_blob = 0;
|
||||||
this->bytes_written = 0;
|
this->bytes_written = 0;
|
||||||
this->bytes_written_blob = 0;
|
this->bytes_written_blob = 0;
|
||||||
this->bytes_moved = 0;
|
this->bytes_moved = 0;
|
||||||
this->num_input_files_in_non_output_levels = 0;
|
this->num_input_files_in_non_output_levels = 0;
|
||||||
this->num_input_files_in_output_level = 0;
|
this->num_input_files_in_output_level = 0;
|
||||||
|
this->num_filtered_input_files_in_non_output_levels = 0;
|
||||||
|
this->num_filtered_input_files_in_output_level = 0;
|
||||||
this->num_output_files = 0;
|
this->num_output_files = 0;
|
||||||
this->num_output_files_blob = 0;
|
this->num_output_files_blob = 0;
|
||||||
this->num_input_records = 0;
|
this->num_input_records = 0;
|
||||||
|
@ -353,6 +393,9 @@ class InternalStats {
|
||||||
this->cpu_micros += c.cpu_micros;
|
this->cpu_micros += c.cpu_micros;
|
||||||
this->bytes_read_non_output_levels += c.bytes_read_non_output_levels;
|
this->bytes_read_non_output_levels += c.bytes_read_non_output_levels;
|
||||||
this->bytes_read_output_level += c.bytes_read_output_level;
|
this->bytes_read_output_level += c.bytes_read_output_level;
|
||||||
|
this->bytes_skipped_non_output_levels +=
|
||||||
|
c.bytes_skipped_non_output_levels;
|
||||||
|
this->bytes_skipped_output_level += c.bytes_skipped_output_level;
|
||||||
this->bytes_read_blob += c.bytes_read_blob;
|
this->bytes_read_blob += c.bytes_read_blob;
|
||||||
this->bytes_written += c.bytes_written;
|
this->bytes_written += c.bytes_written;
|
||||||
this->bytes_written_blob += c.bytes_written_blob;
|
this->bytes_written_blob += c.bytes_written_blob;
|
||||||
|
@ -361,6 +404,10 @@ class InternalStats {
|
||||||
c.num_input_files_in_non_output_levels;
|
c.num_input_files_in_non_output_levels;
|
||||||
this->num_input_files_in_output_level +=
|
this->num_input_files_in_output_level +=
|
||||||
c.num_input_files_in_output_level;
|
c.num_input_files_in_output_level;
|
||||||
|
this->num_filtered_input_files_in_non_output_levels +=
|
||||||
|
c.num_filtered_input_files_in_non_output_levels;
|
||||||
|
this->num_filtered_input_files_in_output_level +=
|
||||||
|
c.num_filtered_input_files_in_output_level;
|
||||||
this->num_output_files += c.num_output_files;
|
this->num_output_files += c.num_output_files;
|
||||||
this->num_output_files_blob += c.num_output_files_blob;
|
this->num_output_files_blob += c.num_output_files_blob;
|
||||||
this->num_input_records += c.num_input_records;
|
this->num_input_records += c.num_input_records;
|
||||||
|
@ -387,6 +434,9 @@ class InternalStats {
|
||||||
this->cpu_micros -= c.cpu_micros;
|
this->cpu_micros -= c.cpu_micros;
|
||||||
this->bytes_read_non_output_levels -= c.bytes_read_non_output_levels;
|
this->bytes_read_non_output_levels -= c.bytes_read_non_output_levels;
|
||||||
this->bytes_read_output_level -= c.bytes_read_output_level;
|
this->bytes_read_output_level -= c.bytes_read_output_level;
|
||||||
|
this->bytes_skipped_non_output_levels -=
|
||||||
|
c.bytes_skipped_non_output_levels;
|
||||||
|
this->bytes_skipped_output_level -= c.bytes_skipped_output_level;
|
||||||
this->bytes_read_blob -= c.bytes_read_blob;
|
this->bytes_read_blob -= c.bytes_read_blob;
|
||||||
this->bytes_written -= c.bytes_written;
|
this->bytes_written -= c.bytes_written;
|
||||||
this->bytes_written_blob -= c.bytes_written_blob;
|
this->bytes_written_blob -= c.bytes_written_blob;
|
||||||
|
@ -395,6 +445,10 @@ class InternalStats {
|
||||||
c.num_input_files_in_non_output_levels;
|
c.num_input_files_in_non_output_levels;
|
||||||
this->num_input_files_in_output_level -=
|
this->num_input_files_in_output_level -=
|
||||||
c.num_input_files_in_output_level;
|
c.num_input_files_in_output_level;
|
||||||
|
this->num_filtered_input_files_in_non_output_levels -=
|
||||||
|
c.num_filtered_input_files_in_non_output_levels;
|
||||||
|
this->num_filtered_input_files_in_output_level -=
|
||||||
|
c.num_filtered_input_files_in_output_level;
|
||||||
this->num_output_files -= c.num_output_files;
|
this->num_output_files -= c.num_output_files;
|
||||||
this->num_output_files_blob -= c.num_output_files_blob;
|
this->num_output_files_blob -= c.num_output_files_blob;
|
||||||
this->num_input_records -= c.num_input_records;
|
this->num_input_records -= c.num_input_records;
|
||||||
|
|
|
@ -35,6 +35,12 @@ struct CompactionJobStats {
|
||||||
size_t num_input_files = 0;
|
size_t num_input_files = 0;
|
||||||
// the number of compaction input files at the output level (table files)
|
// the number of compaction input files at the output level (table files)
|
||||||
size_t num_input_files_at_output_level = 0;
|
size_t num_input_files_at_output_level = 0;
|
||||||
|
// the number of compaction input files that are filtered out by compaction
|
||||||
|
// optimizations
|
||||||
|
size_t num_filtered_input_files = 0;
|
||||||
|
// the number of compaction input files at the output level that are filtered
|
||||||
|
// out by compaction optimizations
|
||||||
|
size_t num_filtered_input_files_at_output_level = 0;
|
||||||
|
|
||||||
// the number of compaction output records.
|
// the number of compaction output records.
|
||||||
uint64_t num_output_records = 0;
|
uint64_t num_output_records = 0;
|
||||||
|
@ -58,6 +64,9 @@ struct CompactionJobStats {
|
||||||
uint64_t total_output_bytes = 0;
|
uint64_t total_output_bytes = 0;
|
||||||
// the total size of blob files in the compaction output
|
// the total size of blob files in the compaction output
|
||||||
uint64_t total_output_bytes_blob = 0;
|
uint64_t total_output_bytes_blob = 0;
|
||||||
|
// the total size of table files for compaction input files that are skipped
|
||||||
|
// because input files are filtered out by compaction optimizations.
|
||||||
|
uint64_t total_skipped_input_bytes = 0;
|
||||||
|
|
||||||
// number of records being replaced by newer record associated with same key.
|
// number of records being replaced by newer record associated with same key.
|
||||||
// this could be a new value or a deletion entry for that key so this field
|
// this could be a new value or a deletion entry for that key so this field
|
||||||
|
|
|
@ -17,6 +17,8 @@ void CompactionJobStats::Reset() {
|
||||||
num_blobs_read = 0;
|
num_blobs_read = 0;
|
||||||
num_input_files = 0;
|
num_input_files = 0;
|
||||||
num_input_files_at_output_level = 0;
|
num_input_files_at_output_level = 0;
|
||||||
|
num_filtered_input_files = 0;
|
||||||
|
num_filtered_input_files_at_output_level = 0;
|
||||||
|
|
||||||
num_output_records = 0;
|
num_output_records = 0;
|
||||||
num_output_files = 0;
|
num_output_files = 0;
|
||||||
|
@ -30,6 +32,7 @@ void CompactionJobStats::Reset() {
|
||||||
total_blob_bytes_read = 0;
|
total_blob_bytes_read = 0;
|
||||||
total_output_bytes = 0;
|
total_output_bytes = 0;
|
||||||
total_output_bytes_blob = 0;
|
total_output_bytes_blob = 0;
|
||||||
|
total_skipped_input_bytes = 0;
|
||||||
|
|
||||||
num_records_replaced = 0;
|
num_records_replaced = 0;
|
||||||
|
|
||||||
|
@ -62,6 +65,9 @@ void CompactionJobStats::Add(const CompactionJobStats& stats) {
|
||||||
num_blobs_read += stats.num_blobs_read;
|
num_blobs_read += stats.num_blobs_read;
|
||||||
num_input_files += stats.num_input_files;
|
num_input_files += stats.num_input_files;
|
||||||
num_input_files_at_output_level += stats.num_input_files_at_output_level;
|
num_input_files_at_output_level += stats.num_input_files_at_output_level;
|
||||||
|
num_filtered_input_files += stats.num_filtered_input_files;
|
||||||
|
num_filtered_input_files_at_output_level +=
|
||||||
|
stats.num_filtered_input_files_at_output_level;
|
||||||
|
|
||||||
num_output_records += stats.num_output_records;
|
num_output_records += stats.num_output_records;
|
||||||
num_output_files += stats.num_output_files;
|
num_output_files += stats.num_output_files;
|
||||||
|
@ -71,6 +77,7 @@ void CompactionJobStats::Add(const CompactionJobStats& stats) {
|
||||||
total_blob_bytes_read += stats.total_blob_bytes_read;
|
total_blob_bytes_read += stats.total_blob_bytes_read;
|
||||||
total_output_bytes += stats.total_output_bytes;
|
total_output_bytes += stats.total_output_bytes;
|
||||||
total_output_bytes_blob += stats.total_output_bytes_blob;
|
total_output_bytes_blob += stats.total_output_bytes_blob;
|
||||||
|
total_skipped_input_bytes += stats.total_skipped_input_bytes;
|
||||||
|
|
||||||
num_records_replaced += stats.num_records_replaced;
|
num_records_replaced += stats.num_records_replaced;
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue