Clean up CompactionProxy (#7662)

Summary:
`CompactionProxy` is currently both a concrete class used for actual `Compaction`s
and a base class that `FakeCompaction` (which is used in `compaction_iterator_test`)
is derived from. This is bad from an OO design standpoint, and also results in
`FakeCompaction` containing an (uninitialized and unused) `Compaction*` member.
The patch fixes this by making `CompactionProxy` a pure interface and introducing
a separate concrete class `RealCompaction` for non-test/non-fake compactions. It
also removes an unused parameter from the virtual method `level`.

Pull Request resolved: https://github.com/facebook/rocksdb/pull/7662

Test Plan: `make check`

Reviewed By: riversand963

Differential Revision: D24907680

Pulled By: ltamasi

fbshipit-source-id: c100ecb1beef4b0ada35e799116c5bda71719ee7
main
Levi Tamasi 4 years ago committed by Facebook GitHub Bot
parent 2400cd69e3
commit 0dc437d65c
  1. 2
      db/compaction/compaction_iterator.cc
  2. 53
      db/compaction/compaction_iterator.h
  3. 7
      db/compaction/compaction_iterator_test.cc

@ -52,7 +52,7 @@ CompactionIterator::CompactionIterator(
report_detailed_time, expect_valid_internal_key, range_del_agg, report_detailed_time, expect_valid_internal_key, range_del_agg,
blob_file_builder, allow_data_in_errors, blob_file_builder, allow_data_in_errors,
std::unique_ptr<CompactionProxy>( std::unique_ptr<CompactionProxy>(
compaction ? new CompactionProxy(compaction) : nullptr), compaction ? new RealCompaction(compaction) : nullptr),
compaction_filter, shutting_down, preserve_deletes_seqnum, compaction_filter, shutting_down, preserve_deletes_seqnum,
manual_compaction_paused, info_log, full_history_ts_low) {} manual_compaction_paused, info_log, full_history_ts_low) {}

@ -29,34 +29,57 @@ class CompactionIterator {
// CompactionIterator uses. Tests can override it. // CompactionIterator uses. Tests can override it.
class CompactionProxy { class CompactionProxy {
public: public:
explicit CompactionProxy(const Compaction* compaction)
: compaction_(compaction) {}
virtual ~CompactionProxy() = default; virtual ~CompactionProxy() = default;
virtual int level(size_t /*compaction_input_level*/ = 0) const {
return compaction_->level(); virtual int level() const = 0;
}
virtual bool KeyNotExistsBeyondOutputLevel( virtual bool KeyNotExistsBeyondOutputLevel(
const Slice& user_key, std::vector<size_t>* level_ptrs) const { const Slice& user_key, std::vector<size_t>* level_ptrs) const = 0;
virtual bool bottommost_level() const = 0;
virtual int number_levels() const = 0;
virtual Slice GetLargestUserKey() const = 0;
virtual bool allow_ingest_behind() const = 0;
virtual bool preserve_deletes() const = 0;
};
class RealCompaction : public CompactionProxy {
public:
explicit RealCompaction(const Compaction* compaction)
: compaction_(compaction) {
assert(compaction_);
assert(compaction_->immutable_cf_options());
}
int level() const override { return compaction_->level(); }
bool KeyNotExistsBeyondOutputLevel(
const Slice& user_key, std::vector<size_t>* level_ptrs) const override {
return compaction_->KeyNotExistsBeyondOutputLevel(user_key, level_ptrs); return compaction_->KeyNotExistsBeyondOutputLevel(user_key, level_ptrs);
} }
virtual bool bottommost_level() const {
bool bottommost_level() const override {
return compaction_->bottommost_level(); return compaction_->bottommost_level();
} }
virtual int number_levels() const { return compaction_->number_levels(); }
virtual Slice GetLargestUserKey() const { int number_levels() const override { return compaction_->number_levels(); }
Slice GetLargestUserKey() const override {
return compaction_->GetLargestUserKey(); return compaction_->GetLargestUserKey();
} }
virtual bool allow_ingest_behind() const {
bool allow_ingest_behind() const override {
return compaction_->immutable_cf_options()->allow_ingest_behind; return compaction_->immutable_cf_options()->allow_ingest_behind;
} }
virtual bool preserve_deletes() const {
bool preserve_deletes() const override {
return compaction_->immutable_cf_options()->preserve_deletes; return compaction_->immutable_cf_options()->preserve_deletes;
} }
protected:
CompactionProxy() = default;
private: private:
const Compaction* compaction_; const Compaction* compaction_;
}; };

@ -156,19 +156,22 @@ class LoggingForwardVectorIterator : public InternalIterator {
class FakeCompaction : public CompactionIterator::CompactionProxy { class FakeCompaction : public CompactionIterator::CompactionProxy {
public: public:
FakeCompaction() = default; int level() const override { return 0; }
int level(size_t /*compaction_input_level*/) const override { return 0; }
bool KeyNotExistsBeyondOutputLevel( bool KeyNotExistsBeyondOutputLevel(
const Slice& /*user_key*/, const Slice& /*user_key*/,
std::vector<size_t>* /*level_ptrs*/) const override { std::vector<size_t>* /*level_ptrs*/) const override {
return is_bottommost_level || key_not_exists_beyond_output_level; return is_bottommost_level || key_not_exists_beyond_output_level;
} }
bool bottommost_level() const override { return is_bottommost_level; } bool bottommost_level() const override { return is_bottommost_level; }
int number_levels() const override { return 1; } int number_levels() const override { return 1; }
Slice GetLargestUserKey() const override { Slice GetLargestUserKey() const override {
return "\xff\xff\xff\xff\xff\xff\xff\xff\xff"; return "\xff\xff\xff\xff\xff\xff\xff\xff\xff";
} }
bool allow_ingest_behind() const override { return is_allow_ingest_behind; } bool allow_ingest_behind() const override { return is_allow_ingest_behind; }
bool preserve_deletes() const override { return false; } bool preserve_deletes() const override { return false; }

Loading…
Cancel
Save