Pass column family ID to table property collector

Summary: Pass column family ID through TablePropertiesCollectorFactory::CreateTablePropertiesCollector() so that users can identify which column family this file is for and handle it differently.

Test Plan: Add unit test scenarios in tests related to table properties collectors to verify the information passed in is correct.

Reviewers: rven, yhchiang, anthony, kradhakrishnan, igor, IslamAbdelRahman

Reviewed By: IslamAbdelRahman

Subscribers: yoshinorim, leveldb, dhruba

Differential Revision: https://reviews.facebook.net/D48411
main
sdong 9 years ago
parent e61d9c1484
commit 776bd8d5eb
  1. 1
      HISTORY.md
  2. 10
      db/builder.cc
  3. 6
      db/builder.h
  4. 4
      db/compaction_job.cc
  5. 4
      db/db_impl.cc
  6. 90
      db/db_test.cc
  7. 5
      db/flush_job.cc
  8. 9
      db/repair.cc
  9. 13
      db/table_properties_collector.h
  10. 12
      db/table_properties_collector_test.cc
  11. 2
      include/rocksdb/table.h
  12. 8
      include/rocksdb/table_properties.h
  13. 5
      table/adaptive_table_factory.cc
  14. 2
      table/adaptive_table_factory.h
  15. 12
      table/block_based_table_builder.cc
  16. 3
      table/block_based_table_builder.h
  17. 6
      table/block_based_table_factory.cc
  18. 2
      table/block_based_table_factory.h
  19. 2
      table/cuckoo_table_factory.cc
  20. 2
      table/cuckoo_table_factory.h
  21. 2
      table/mock_table.cc
  22. 2
      table/mock_table.h
  23. 10
      table/plain_table_builder.cc
  24. 10
      table/plain_table_builder.h
  25. 9
      table/plain_table_factory.cc
  26. 2
      table/plain_table_factory.h
  27. 7
      table/sst_file_writer.cc
  28. 3
      table/table_properties.cc
  29. 2
      table/table_reader_bench.cc
  30. 2
      table/table_test.cc
  31. 1
      util/sst_dump_test.cc
  32. 4
      util/sst_dump_tool.cc
  33. 9
      utilities/table_properties_collectors/compact_on_deletion_collector.cc
  34. 4
      utilities/table_properties_collectors/compact_on_deletion_collector.h
  35. 13
      utilities/table_properties_collectors/compact_on_deletion_collector_test.cc

@ -4,6 +4,7 @@
### Public API Changes ### Public API Changes
* CompactionFilter::Context includes information of Column Family ID * CompactionFilter::Context includes information of Column Family ID
* The need-compaction hint given by TablePropertiesCollector::NeedCompact() will be persistent and recoverable after DB recovery. This introduces a breaking format change. If you use this experimental feature, including NewCompactOnDeletionCollectorFactory() in the new version, you may not be able to directly downgrade the DB back to version 4.0 or lower. * The need-compaction hint given by TablePropertiesCollector::NeedCompact() will be persistent and recoverable after DB recovery. This introduces a breaking format change. If you use this experimental feature, including NewCompactOnDeletionCollectorFactory() in the new version, you may not be able to directly downgrade the DB back to version 4.0 or lower.
* TablePropertiesCollectorFactory::CreateTablePropertiesCollector() now takes an option Context, containing the information of column family ID for the file being written.
## 4.1.0 (10/8/2015) ## 4.1.0 (10/8/2015)
### New Features ### New Features

@ -40,13 +40,14 @@ TableBuilder* NewTableBuilder(
const InternalKeyComparator& internal_comparator, const InternalKeyComparator& internal_comparator,
const std::vector<std::unique_ptr<IntTblPropCollectorFactory>>* const std::vector<std::unique_ptr<IntTblPropCollectorFactory>>*
int_tbl_prop_collector_factories, int_tbl_prop_collector_factories,
WritableFileWriter* file, const CompressionType compression_type, uint32_t column_family_id, WritableFileWriter* file,
const CompressionType compression_type,
const CompressionOptions& compression_opts, const bool skip_filters) { const CompressionOptions& compression_opts, const bool skip_filters) {
return ioptions.table_factory->NewTableBuilder( return ioptions.table_factory->NewTableBuilder(
TableBuilderOptions(ioptions, internal_comparator, TableBuilderOptions(ioptions, internal_comparator,
int_tbl_prop_collector_factories, compression_type, int_tbl_prop_collector_factories, compression_type,
compression_opts, skip_filters), compression_opts, skip_filters),
file); column_family_id, file);
} }
Status BuildTable( Status BuildTable(
@ -55,7 +56,8 @@ Status BuildTable(
FileMetaData* meta, const InternalKeyComparator& internal_comparator, FileMetaData* meta, const InternalKeyComparator& internal_comparator,
const std::vector<std::unique_ptr<IntTblPropCollectorFactory>>* const std::vector<std::unique_ptr<IntTblPropCollectorFactory>>*
int_tbl_prop_collector_factories, int_tbl_prop_collector_factories,
std::vector<SequenceNumber> snapshots, const CompressionType compression, uint32_t column_family_id, std::vector<SequenceNumber> snapshots,
const CompressionType compression,
const CompressionOptions& compression_opts, bool paranoid_file_checks, const CompressionOptions& compression_opts, bool paranoid_file_checks,
InternalStats* internal_stats, const Env::IOPriority io_priority, InternalStats* internal_stats, const Env::IOPriority io_priority,
TableProperties* table_properties) { TableProperties* table_properties) {
@ -82,7 +84,7 @@ Status BuildTable(
builder = NewTableBuilder( builder = NewTableBuilder(
ioptions, internal_comparator, int_tbl_prop_collector_factories, ioptions, internal_comparator, int_tbl_prop_collector_factories,
file_writer.get(), compression, compression_opts); column_family_id, file_writer.get(), compression, compression_opts);
} }
MergeHelper merge(env, internal_comparator.user_comparator(), MergeHelper merge(env, internal_comparator.user_comparator(),

@ -37,7 +37,8 @@ TableBuilder* NewTableBuilder(
const InternalKeyComparator& internal_comparator, const InternalKeyComparator& internal_comparator,
const std::vector<std::unique_ptr<IntTblPropCollectorFactory>>* const std::vector<std::unique_ptr<IntTblPropCollectorFactory>>*
int_tbl_prop_collector_factories, int_tbl_prop_collector_factories,
WritableFileWriter* file, const CompressionType compression_type, uint32_t column_family_id, WritableFileWriter* file,
const CompressionType compression_type,
const CompressionOptions& compression_opts, const CompressionOptions& compression_opts,
const bool skip_filters = false); const bool skip_filters = false);
@ -52,7 +53,8 @@ extern Status BuildTable(
FileMetaData* meta, const InternalKeyComparator& internal_comparator, FileMetaData* meta, const InternalKeyComparator& internal_comparator,
const std::vector<std::unique_ptr<IntTblPropCollectorFactory>>* const std::vector<std::unique_ptr<IntTblPropCollectorFactory>>*
int_tbl_prop_collector_factories, int_tbl_prop_collector_factories,
std::vector<SequenceNumber> snapshots, const CompressionType compression, uint32_t column_family_id, std::vector<SequenceNumber> snapshots,
const CompressionType compression,
const CompressionOptions& compression_opts, bool paranoid_file_checks, const CompressionOptions& compression_opts, bool paranoid_file_checks,
InternalStats* internal_stats, InternalStats* internal_stats,
const Env::IOPriority io_priority = Env::IO_HIGH, const Env::IOPriority io_priority = Env::IO_HIGH,

@ -927,8 +927,8 @@ Status CompactionJob::OpenCompactionOutputFile(
cfd->ioptions()->optimize_filters_for_hits && bottommost_level_; cfd->ioptions()->optimize_filters_for_hits && bottommost_level_;
sub_compact->builder.reset(NewTableBuilder( sub_compact->builder.reset(NewTableBuilder(
*cfd->ioptions(), cfd->internal_comparator(), *cfd->ioptions(), cfd->internal_comparator(),
cfd->int_tbl_prop_collector_factories(), sub_compact->outfile.get(), cfd->int_tbl_prop_collector_factories(), cfd->GetID(),
sub_compact->compaction->output_compression(), sub_compact->outfile.get(), sub_compact->compaction->output_compression(),
cfd->ioptions()->compression_opts, skip_filters)); cfd->ioptions()->compression_opts, skip_filters));
LogFlush(db_options_.info_log); LogFlush(db_options_.info_log);
return s; return s;

@ -1317,8 +1317,8 @@ Status DBImpl::WriteLevel0TableForRecovery(int job_id, ColumnFamilyData* cfd,
s = BuildTable( s = BuildTable(
dbname_, env_, *cfd->ioptions(), env_options_, cfd->table_cache(), dbname_, env_, *cfd->ioptions(), env_options_, cfd->table_cache(),
iter.get(), &meta, cfd->internal_comparator(), iter.get(), &meta, cfd->internal_comparator(),
cfd->int_tbl_prop_collector_factories(), snapshots_.GetAll(), cfd->int_tbl_prop_collector_factories(), cfd->GetID(),
GetCompressionFlush(*cfd->ioptions()), snapshots_.GetAll(), GetCompressionFlush(*cfd->ioptions()),
cfd->ioptions()->compression_opts, paranoid_file_checks, cfd->ioptions()->compression_opts, paranoid_file_checks,
cfd->internal_stats(), Env::IO_HIGH, &info.table_properties); cfd->internal_stats(), Env::IO_HIGH, &info.table_properties);
LogFlush(db_options_.info_log); LogFlush(db_options_.info_log);

@ -821,21 +821,34 @@ class CoutingUserTblPropCollector : public TablePropertiesCollector {
class CoutingUserTblPropCollectorFactory class CoutingUserTblPropCollectorFactory
: public TablePropertiesCollectorFactory { : public TablePropertiesCollectorFactory {
public: public:
virtual TablePropertiesCollector* CreateTablePropertiesCollector() override { explicit CoutingUserTblPropCollectorFactory(
uint32_t expected_column_family_id)
: expected_column_family_id_(expected_column_family_id),
num_created_(0) {}
virtual TablePropertiesCollector* CreateTablePropertiesCollector(
TablePropertiesCollectorFactory::Context context) override {
EXPECT_EQ(expected_column_family_id_, context.column_family_id);
num_created_++;
return new CoutingUserTblPropCollector(); return new CoutingUserTblPropCollector();
} }
const char* Name() const override { const char* Name() const override {
return "CoutingUserTblPropCollectorFactory"; return "CoutingUserTblPropCollectorFactory";
} }
void set_expected_column_family_id(uint32_t v) {
expected_column_family_id_ = v;
}
uint32_t expected_column_family_id_;
uint32_t num_created_;
}; };
TEST_F(DBTest, GetUserDefinedTablaProperties) { TEST_F(DBTest, GetUserDefinedTableProperties) {
Options options = CurrentOptions(); Options options = CurrentOptions();
options.level0_file_num_compaction_trigger = (1<<30); options.level0_file_num_compaction_trigger = (1<<30);
options.max_background_flushes = 0; options.max_background_flushes = 0;
options.table_properties_collector_factories.resize(1); options.table_properties_collector_factories.resize(1);
options.table_properties_collector_factories[0] = std::shared_ptr<CoutingUserTblPropCollectorFactory> collector_factory =
std::make_shared<CoutingUserTblPropCollectorFactory>(); std::make_shared<CoutingUserTblPropCollectorFactory>(0);
options.table_properties_collector_factories[0] = collector_factory;
Reopen(options); Reopen(options);
// Create 4 tables // Create 4 tables
for (int table = 0; table < 4; ++table) { for (int table = 0; table < 4; ++table) {
@ -861,6 +874,72 @@ TEST_F(DBTest, GetUserDefinedTablaProperties) {
sum += count; sum += count;
} }
ASSERT_EQ(10u + 11u + 12u + 13u, sum); ASSERT_EQ(10u + 11u + 12u + 13u, sum);
ASSERT_GT(collector_factory->num_created_, 0);
collector_factory->num_created_ = 0;
dbfull()->TEST_CompactRange(0, nullptr, nullptr);
ASSERT_GT(collector_factory->num_created_, 0);
}
TEST_F(DBTest, UserDefinedTablePropertiesContext) {
Options options = CurrentOptions();
options.level0_file_num_compaction_trigger = 3;
options.max_background_flushes = 0;
options.table_properties_collector_factories.resize(1);
std::shared_ptr<CoutingUserTblPropCollectorFactory> collector_factory =
std::make_shared<CoutingUserTblPropCollectorFactory>(1);
options.table_properties_collector_factories[0] = collector_factory,
CreateAndReopenWithCF({"pikachu"}, options);
// Create 2 files
for (int table = 0; table < 2; ++table) {
for (int i = 0; i < 10 + table; ++i) {
Put(1, ToString(table * 100 + i), "val");
}
Flush(1);
}
ASSERT_GT(collector_factory->num_created_, 0);
collector_factory->num_created_ = 0;
// Trigger automatic compactions.
for (int table = 0; table < 3; ++table) {
for (int i = 0; i < 10 + table; ++i) {
Put(1, ToString(table * 100 + i), "val");
}
Flush(1);
dbfull()->TEST_WaitForCompact();
}
ASSERT_GT(collector_factory->num_created_, 0);
collector_factory->num_created_ = 0;
dbfull()->TEST_CompactRange(0, nullptr, nullptr, handles_[1]);
ASSERT_GT(collector_factory->num_created_, 0);
// Come back to write to default column family
collector_factory->num_created_ = 0;
collector_factory->set_expected_column_family_id(0); // default CF
// Create 4 tables in default column family
for (int table = 0; table < 2; ++table) {
for (int i = 0; i < 10 + table; ++i) {
Put(ToString(table * 100 + i), "val");
}
Flush();
}
ASSERT_GT(collector_factory->num_created_, 0);
collector_factory->num_created_ = 0;
// Trigger automatic compactions.
for (int table = 0; table < 3; ++table) {
for (int i = 0; i < 10 + table; ++i) {
Put(ToString(table * 100 + i), "val");
}
Flush();
dbfull()->TEST_WaitForCompact();
}
ASSERT_GT(collector_factory->num_created_, 0);
collector_factory->num_created_ = 0;
dbfull()->TEST_CompactRange(0, nullptr, nullptr);
ASSERT_GT(collector_factory->num_created_, 0);
} }
TEST_F(DBTest, LevelLimitReopen) { TEST_F(DBTest, LevelLimitReopen) {
@ -8284,7 +8363,8 @@ class CountingDeleteTabPropCollector : public TablePropertiesCollector {
class CountingDeleteTabPropCollectorFactory class CountingDeleteTabPropCollectorFactory
: public TablePropertiesCollectorFactory { : public TablePropertiesCollectorFactory {
public: public:
virtual TablePropertiesCollector* CreateTablePropertiesCollector() override { virtual TablePropertiesCollector* CreateTablePropertiesCollector(
TablePropertiesCollectorFactory::Context context) override {
return new CountingDeleteTabPropCollector(); return new CountingDeleteTabPropCollector();
} }
const char* Name() const override { const char* Name() const override {

@ -234,8 +234,9 @@ Status FlushJob::WriteLevel0Table(const autovector<MemTable*>& mems,
s = BuildTable( s = BuildTable(
dbname_, db_options_.env, *cfd_->ioptions(), env_options_, dbname_, db_options_.env, *cfd_->ioptions(), env_options_,
cfd_->table_cache(), iter.get(), meta, cfd_->internal_comparator(), cfd_->table_cache(), iter.get(), meta, cfd_->internal_comparator(),
cfd_->int_tbl_prop_collector_factories(), existing_snapshots_, cfd_->int_tbl_prop_collector_factories(), cfd_->GetID(),
output_compression_, cfd_->ioptions()->compression_opts, existing_snapshots_, output_compression_,
cfd_->ioptions()->compression_opts,
mutable_cf_options_.paranoid_file_checks, cfd_->internal_stats(), mutable_cf_options_.paranoid_file_checks, cfd_->internal_stats(),
Env::IO_HIGH, &info.table_properties); Env::IO_HIGH, &info.table_properties);
LogFlush(db_options_.info_log); LogFlush(db_options_.info_log);

@ -290,10 +290,11 @@ class Repairer {
ro.total_order_seek = true; ro.total_order_seek = true;
Arena arena; Arena arena;
ScopedArenaIterator iter(mem->NewIterator(ro, &arena)); ScopedArenaIterator iter(mem->NewIterator(ro, &arena));
status = BuildTable(dbname_, env_, ioptions_, env_options_, table_cache_, status = BuildTable(
iter.get(), &meta, icmp_, dbname_, env_, ioptions_, env_options_, table_cache_, iter.get(),
&int_tbl_prop_collector_factories_, {}, &meta, icmp_, &int_tbl_prop_collector_factories_,
kNoCompression, CompressionOptions(), false, nullptr); TablePropertiesCollectorFactory::Context::kUnknownColumnFamily, {},
kNoCompression, CompressionOptions(), false, nullptr);
} }
delete mem->Unref(); delete mem->Unref();
delete cf_mems_default; delete cf_mems_default;

@ -41,7 +41,8 @@ class IntTblPropCollectorFactory {
public: public:
virtual ~IntTblPropCollectorFactory() {} virtual ~IntTblPropCollectorFactory() {}
// has to be thread-safe // has to be thread-safe
virtual IntTblPropCollector* CreateIntTblPropCollector() = 0; virtual IntTblPropCollector* CreateIntTblPropCollector(
uint32_t column_family_id) = 0;
// The name of the properties collector can be used for debugging purpose. // The name of the properties collector can be used for debugging purpose.
virtual const char* Name() const = 0; virtual const char* Name() const = 0;
@ -69,7 +70,8 @@ class InternalKeyPropertiesCollector : public IntTblPropCollector {
class InternalKeyPropertiesCollectorFactory class InternalKeyPropertiesCollectorFactory
: public IntTblPropCollectorFactory { : public IntTblPropCollectorFactory {
public: public:
virtual IntTblPropCollector* CreateIntTblPropCollector() override { virtual IntTblPropCollector* CreateIntTblPropCollector(
uint32_t column_family_id) override {
return new InternalKeyPropertiesCollector(); return new InternalKeyPropertiesCollector();
} }
@ -114,9 +116,12 @@ class UserKeyTablePropertiesCollectorFactory
explicit UserKeyTablePropertiesCollectorFactory( explicit UserKeyTablePropertiesCollectorFactory(
std::shared_ptr<TablePropertiesCollectorFactory> user_collector_factory) std::shared_ptr<TablePropertiesCollectorFactory> user_collector_factory)
: user_collector_factory_(user_collector_factory) {} : user_collector_factory_(user_collector_factory) {}
virtual IntTblPropCollector* CreateIntTblPropCollector() override { virtual IntTblPropCollector* CreateIntTblPropCollector(
uint32_t column_family_id) override {
TablePropertiesCollectorFactory::Context context;
context.column_family_id = column_family_id;
return new UserKeyTablePropertiesCollector( return new UserKeyTablePropertiesCollector(
user_collector_factory_->CreateTablePropertiesCollector()); user_collector_factory_->CreateTablePropertiesCollector(context));
} }
virtual const char* Name() const override { virtual const char* Name() const override {

@ -35,6 +35,8 @@ class TablePropertiesTest : public testing::Test,
// Utilities test functions // Utilities test functions
namespace { namespace {
static const uint32_t kTestColumnFamilyId = 66;
void MakeBuilder(const Options& options, const ImmutableCFOptions& ioptions, void MakeBuilder(const Options& options, const ImmutableCFOptions& ioptions,
const InternalKeyComparator& internal_comparator, const InternalKeyComparator& internal_comparator,
const std::vector<std::unique_ptr<IntTblPropCollectorFactory>>* const std::vector<std::unique_ptr<IntTblPropCollectorFactory>>*
@ -46,7 +48,8 @@ void MakeBuilder(const Options& options, const ImmutableCFOptions& ioptions,
builder->reset(NewTableBuilder( builder->reset(NewTableBuilder(
ioptions, internal_comparator, int_tbl_prop_collector_factories, ioptions, internal_comparator, int_tbl_prop_collector_factories,
writable->get(), options.compression, options.compression_opts)); kTestColumnFamilyId /* column_family_id */, writable->get(),
options.compression, options.compression_opts));
} }
} // namespace } // namespace
@ -178,14 +181,17 @@ class RegularKeysStartWithAFactory : public IntTblPropCollectorFactory,
public: public:
explicit RegularKeysStartWithAFactory(bool backward_mode) explicit RegularKeysStartWithAFactory(bool backward_mode)
: backward_mode_(backward_mode) {} : backward_mode_(backward_mode) {}
virtual TablePropertiesCollector* CreateTablePropertiesCollector() override { virtual TablePropertiesCollector* CreateTablePropertiesCollector(
TablePropertiesCollectorFactory::Context context) override {
EXPECT_EQ(kTestColumnFamilyId, context.column_family_id);
if (!backward_mode_) { if (!backward_mode_) {
return new RegularKeysStartWithA(); return new RegularKeysStartWithA();
} else { } else {
return new RegularKeysStartWithABackwardCompatible(); return new RegularKeysStartWithABackwardCompatible();
} }
} }
virtual IntTblPropCollector* CreateIntTblPropCollector() override { virtual IntTblPropCollector* CreateIntTblPropCollector(
uint32_t column_family_id) override {
return new RegularKeysStartWithAInternal(); return new RegularKeysStartWithAInternal();
} }
const char* Name() const override { return "RegularKeysStartWithA"; } const char* Name() const override { return "RegularKeysStartWithA"; }

@ -375,7 +375,7 @@ class TableFactory {
// to use in this table. // to use in this table.
virtual TableBuilder* NewTableBuilder( virtual TableBuilder* NewTableBuilder(
const TableBuilderOptions& table_builder_options, const TableBuilderOptions& table_builder_options,
WritableFileWriter* file) const = 0; uint32_t column_family_id, WritableFileWriter* file) const = 0;
// Sanitizes the specified DB Options and ColumnFamilyOptions. // Sanitizes the specified DB Options and ColumnFamilyOptions.
// //

@ -144,9 +144,15 @@ class TablePropertiesCollector {
// TablePropertiesCollector for each new table // TablePropertiesCollector for each new table
class TablePropertiesCollectorFactory { class TablePropertiesCollectorFactory {
public: public:
struct Context {
uint32_t column_family_id;
static const uint32_t kUnknownColumnFamily;
};
virtual ~TablePropertiesCollectorFactory() {} virtual ~TablePropertiesCollectorFactory() {}
// has to be thread-safe // has to be thread-safe
virtual TablePropertiesCollector* CreateTablePropertiesCollector() = 0; virtual TablePropertiesCollector* CreateTablePropertiesCollector(
TablePropertiesCollectorFactory::Context context) = 0;
// The name of the properties collector can be used for debugging purpose. // The name of the properties collector can be used for debugging purpose.
virtual const char* Name() const = 0; virtual const char* Name() const = 0;

@ -66,9 +66,10 @@ Status AdaptiveTableFactory::NewTableReader(
} }
TableBuilder* AdaptiveTableFactory::NewTableBuilder( TableBuilder* AdaptiveTableFactory::NewTableBuilder(
const TableBuilderOptions& table_builder_options, const TableBuilderOptions& table_builder_options, uint32_t column_family_id,
WritableFileWriter* file) const { WritableFileWriter* file) const {
return table_factory_to_write_->NewTableBuilder(table_builder_options, file); return table_factory_to_write_->NewTableBuilder(table_builder_options,
column_family_id, file);
} }
std::string AdaptiveTableFactory::GetPrintableTableOptions() const { std::string AdaptiveTableFactory::GetPrintableTableOptions() const {

@ -40,7 +40,7 @@ class AdaptiveTableFactory : public TableFactory {
TableBuilder* NewTableBuilder( TableBuilder* NewTableBuilder(
const TableBuilderOptions& table_builder_options, const TableBuilderOptions& table_builder_options,
WritableFileWriter* file) const override; uint32_t column_family_id, WritableFileWriter* file) const override;
// Sanitizes the specified DB Options. // Sanitizes the specified DB Options.
Status SanitizeOptions(const DBOptions& db_opts, Status SanitizeOptions(const DBOptions& db_opts,

@ -474,7 +474,8 @@ struct BlockBasedTableBuilder::Rep {
const InternalKeyComparator& icomparator, const InternalKeyComparator& icomparator,
const std::vector<std::unique_ptr<IntTblPropCollectorFactory>>* const std::vector<std::unique_ptr<IntTblPropCollectorFactory>>*
int_tbl_prop_collector_factories, int_tbl_prop_collector_factories,
WritableFileWriter* f, const CompressionType _compression_type, uint32_t column_family_id, WritableFileWriter* f,
const CompressionType _compression_type,
const CompressionOptions& _compression_opts, const bool skip_filters) const CompressionOptions& _compression_opts, const bool skip_filters)
: ioptions(_ioptions), : ioptions(_ioptions),
table_options(table_opt), table_options(table_opt),
@ -494,7 +495,7 @@ struct BlockBasedTableBuilder::Rep {
table_options, data_block)) { table_options, data_block)) {
for (auto& collector_factories : *int_tbl_prop_collector_factories) { for (auto& collector_factories : *int_tbl_prop_collector_factories) {
table_properties_collectors.emplace_back( table_properties_collectors.emplace_back(
collector_factories->CreateIntTblPropCollector()); collector_factories->CreateIntTblPropCollector(column_family_id));
} }
table_properties_collectors.emplace_back( table_properties_collectors.emplace_back(
new BlockBasedTablePropertiesCollector( new BlockBasedTablePropertiesCollector(
@ -509,7 +510,8 @@ BlockBasedTableBuilder::BlockBasedTableBuilder(
const InternalKeyComparator& internal_comparator, const InternalKeyComparator& internal_comparator,
const std::vector<std::unique_ptr<IntTblPropCollectorFactory>>* const std::vector<std::unique_ptr<IntTblPropCollectorFactory>>*
int_tbl_prop_collector_factories, int_tbl_prop_collector_factories,
WritableFileWriter* file, const CompressionType compression_type, uint32_t column_family_id, WritableFileWriter* file,
const CompressionType compression_type,
const CompressionOptions& compression_opts, const bool skip_filters) { const CompressionOptions& compression_opts, const bool skip_filters) {
BlockBasedTableOptions sanitized_table_options(table_options); BlockBasedTableOptions sanitized_table_options(table_options);
if (sanitized_table_options.format_version == 0 && if (sanitized_table_options.format_version == 0 &&
@ -523,8 +525,8 @@ BlockBasedTableBuilder::BlockBasedTableBuilder(
} }
rep_ = new Rep(ioptions, sanitized_table_options, internal_comparator, rep_ = new Rep(ioptions, sanitized_table_options, internal_comparator,
int_tbl_prop_collector_factories, file, compression_type, int_tbl_prop_collector_factories, column_family_id, file,
compression_opts, skip_filters); compression_type, compression_opts, skip_filters);
if (rep_->filter_block != nullptr) { if (rep_->filter_block != nullptr) {
rep_->filter_block->StartBlock(0); rep_->filter_block->StartBlock(0);

@ -40,7 +40,8 @@ class BlockBasedTableBuilder : public TableBuilder {
const InternalKeyComparator& internal_comparator, const InternalKeyComparator& internal_comparator,
const std::vector<std::unique_ptr<IntTblPropCollectorFactory>>* const std::vector<std::unique_ptr<IntTblPropCollectorFactory>>*
int_tbl_prop_collector_factories, int_tbl_prop_collector_factories,
WritableFileWriter* file, const CompressionType compression_type, uint32_t column_family_id, WritableFileWriter* file,
const CompressionType compression_type,
const CompressionOptions& compression_opts, const bool skip_filters); const CompressionOptions& compression_opts, const bool skip_filters);
// REQUIRES: Either Finish() or Abandon() has been called. // REQUIRES: Either Finish() or Abandon() has been called.

@ -61,13 +61,13 @@ Status BlockBasedTableFactory::NewTableReader(
} }
TableBuilder* BlockBasedTableFactory::NewTableBuilder( TableBuilder* BlockBasedTableFactory::NewTableBuilder(
const TableBuilderOptions& table_builder_options, const TableBuilderOptions& table_builder_options, uint32_t column_family_id,
WritableFileWriter* file) const { WritableFileWriter* file) const {
auto table_builder = new BlockBasedTableBuilder( auto table_builder = new BlockBasedTableBuilder(
table_builder_options.ioptions, table_options_, table_builder_options.ioptions, table_options_,
table_builder_options.internal_comparator, table_builder_options.internal_comparator,
table_builder_options.int_tbl_prop_collector_factories, file, table_builder_options.int_tbl_prop_collector_factories, column_family_id,
table_builder_options.compression_type, file, table_builder_options.compression_type,
table_builder_options.compression_opts, table_builder_options.compression_opts,
table_builder_options.skip_filters); table_builder_options.skip_filters);

@ -48,7 +48,7 @@ class BlockBasedTableFactory : public TableFactory {
TableBuilder* NewTableBuilder( TableBuilder* NewTableBuilder(
const TableBuilderOptions& table_builder_options, const TableBuilderOptions& table_builder_options,
WritableFileWriter* file) const override; uint32_t column_family_id, WritableFileWriter* file) const override;
// Sanitizes the specified DB Options. // Sanitizes the specified DB Options.
Status SanitizeOptions(const DBOptions& db_opts, Status SanitizeOptions(const DBOptions& db_opts,

@ -27,7 +27,7 @@ Status CuckooTableFactory::NewTableReader(
} }
TableBuilder* CuckooTableFactory::NewTableBuilder( TableBuilder* CuckooTableFactory::NewTableBuilder(
const TableBuilderOptions& table_builder_options, const TableBuilderOptions& table_builder_options, uint32_t column_family_id,
WritableFileWriter* file) const { WritableFileWriter* file) const {
// Ignore the skipFIlters flag. Does not apply to this file format // Ignore the skipFIlters flag. Does not apply to this file format
// //

@ -62,7 +62,7 @@ class CuckooTableFactory : public TableFactory {
TableBuilder* NewTableBuilder( TableBuilder* NewTableBuilder(
const TableBuilderOptions& table_builder_options, const TableBuilderOptions& table_builder_options,
WritableFileWriter* file) const override; uint32_t column_family_id, WritableFileWriter* file) const override;
// Sanitizes the specified DB Options. // Sanitizes the specified DB Options.
Status SanitizeOptions(const DBOptions& db_opts, Status SanitizeOptions(const DBOptions& db_opts,

@ -74,7 +74,7 @@ Status MockTableFactory::NewTableReader(
} }
TableBuilder* MockTableFactory::NewTableBuilder( TableBuilder* MockTableFactory::NewTableBuilder(
const TableBuilderOptions& table_builder_options, const TableBuilderOptions& table_builder_options, uint32_t column_family_id,
WritableFileWriter* file) const { WritableFileWriter* file) const {
uint32_t id = GetAndWriteNextID(file->writable_file()); uint32_t id = GetAndWriteNextID(file->writable_file());

@ -151,7 +151,7 @@ class MockTableFactory : public TableFactory {
unique_ptr<TableReader>* table_reader) const override; unique_ptr<TableReader>* table_reader) const override;
TableBuilder* NewTableBuilder( TableBuilder* NewTableBuilder(
const TableBuilderOptions& table_builder_options, const TableBuilderOptions& table_builder_options,
WritableFileWriter* file) const override; uint32_t column_familly_id, WritableFileWriter* file) const override;
// This function will directly create mock table instead of going through // This function will directly create mock table instead of going through
// MockTableBuilder. file_contents has to have a format of <internal_key, // MockTableBuilder. file_contents has to have a format of <internal_key,

@ -60,10 +60,10 @@ PlainTableBuilder::PlainTableBuilder(
const ImmutableCFOptions& ioptions, const ImmutableCFOptions& ioptions,
const std::vector<std::unique_ptr<IntTblPropCollectorFactory>>* const std::vector<std::unique_ptr<IntTblPropCollectorFactory>>*
int_tbl_prop_collector_factories, int_tbl_prop_collector_factories,
WritableFileWriter* file, uint32_t user_key_len, EncodingType encoding_type, uint32_t column_family_id, WritableFileWriter* file, uint32_t user_key_len,
size_t index_sparseness, uint32_t bloom_bits_per_key, uint32_t num_probes, EncodingType encoding_type, size_t index_sparseness,
size_t huge_page_tlb_size, double hash_table_ratio, uint32_t bloom_bits_per_key, uint32_t num_probes, size_t huge_page_tlb_size,
bool store_index_in_file) double hash_table_ratio, bool store_index_in_file)
: ioptions_(ioptions), : ioptions_(ioptions),
bloom_block_(num_probes), bloom_block_(num_probes),
file_(file), file_(file),
@ -108,7 +108,7 @@ PlainTableBuilder::PlainTableBuilder(
for (auto& collector_factories : *int_tbl_prop_collector_factories) { for (auto& collector_factories : *int_tbl_prop_collector_factories) {
table_properties_collectors_.emplace_back( table_properties_collectors_.emplace_back(
collector_factories->CreateIntTblPropCollector()); collector_factories->CreateIntTblPropCollector(column_family_id));
} }
} }

@ -34,11 +34,11 @@ class PlainTableBuilder: public TableBuilder {
const ImmutableCFOptions& ioptions, const ImmutableCFOptions& ioptions,
const std::vector<std::unique_ptr<IntTblPropCollectorFactory>>* const std::vector<std::unique_ptr<IntTblPropCollectorFactory>>*
int_tbl_prop_collector_factories, int_tbl_prop_collector_factories,
WritableFileWriter* file, uint32_t user_key_size, uint32_t column_family_id, WritableFileWriter* file,
EncodingType encoding_type, size_t index_sparseness, uint32_t user_key_size, EncodingType encoding_type,
uint32_t bloom_bits_per_key, uint32_t num_probes = 6, size_t index_sparseness, uint32_t bloom_bits_per_key,
size_t huge_page_tlb_size = 0, double hash_table_ratio = 0, uint32_t num_probes = 6, size_t huge_page_tlb_size = 0,
bool store_index_in_file = false); double hash_table_ratio = 0, bool store_index_in_file = false);
// REQUIRES: Either Finish() or Abandon() has been called. // REQUIRES: Either Finish() or Abandon() has been called.
~PlainTableBuilder(); ~PlainTableBuilder();

@ -26,7 +26,7 @@ Status PlainTableFactory::NewTableReader(
} }
TableBuilder* PlainTableFactory::NewTableBuilder( TableBuilder* PlainTableFactory::NewTableBuilder(
const TableBuilderOptions& table_builder_options, const TableBuilderOptions& table_builder_options, uint32_t column_family_id,
WritableFileWriter* file) const { WritableFileWriter* file) const {
// Ignore the skip_filters flag. PlainTable format is optimized for small // Ignore the skip_filters flag. PlainTable format is optimized for small
// in-memory dbs. The skip_filters optimization is not useful for plain // in-memory dbs. The skip_filters optimization is not useful for plain
@ -34,9 +34,10 @@ TableBuilder* PlainTableFactory::NewTableBuilder(
// //
return new PlainTableBuilder( return new PlainTableBuilder(
table_builder_options.ioptions, table_builder_options.ioptions,
table_builder_options.int_tbl_prop_collector_factories, file, table_builder_options.int_tbl_prop_collector_factories, column_family_id,
user_key_len_, encoding_type_, index_sparseness_, bloom_bits_per_key_, 6, file, user_key_len_, encoding_type_, index_sparseness_,
huge_page_tlb_size_, hash_table_ratio_, store_index_in_file_); bloom_bits_per_key_, 6, huge_page_tlb_size_, hash_table_ratio_,
store_index_in_file_);
} }
std::string PlainTableFactory::GetPrintableTableOptions() const { std::string PlainTableFactory::GetPrintableTableOptions() const {

@ -159,7 +159,7 @@ class PlainTableFactory : public TableFactory {
unique_ptr<TableReader>* table) const override; unique_ptr<TableReader>* table) const override;
TableBuilder* NewTableBuilder( TableBuilder* NewTableBuilder(
const TableBuilderOptions& table_builder_options, const TableBuilderOptions& table_builder_options,
WritableFileWriter* file) const override; uint32_t column_family_id, WritableFileWriter* file) const override;
std::string GetPrintableTableOptions() const override; std::string GetPrintableTableOptions() const override;

@ -57,7 +57,8 @@ class SstFileWriter::SstFileWriterPropertiesCollectorFactory
explicit SstFileWriterPropertiesCollectorFactory(int32_t version) explicit SstFileWriterPropertiesCollectorFactory(int32_t version)
: version_(version) {} : version_(version) {}
virtual IntTblPropCollector* CreateIntTblPropCollector() override { virtual IntTblPropCollector* CreateIntTblPropCollector(
uint32_t column_family_id) override {
return new SstFileWriterPropertiesCollector(version_); return new SstFileWriterPropertiesCollector(version_);
} }
@ -117,7 +118,9 @@ Status SstFileWriter::Open(const std::string& file_path) {
r->file_writer.reset( r->file_writer.reset(
new WritableFileWriter(std::move(sst_file), r->env_options)); new WritableFileWriter(std::move(sst_file), r->env_options));
r->builder.reset(r->ioptions.table_factory->NewTableBuilder( r->builder.reset(r->ioptions.table_factory->NewTableBuilder(
table_builder_options, r->file_writer.get())); table_builder_options,
TablePropertiesCollectorFactory::Context::kUnknownColumnFamily,
r->file_writer.get()));
r->file_info.file_path = file_path; r->file_info.file_path = file_path;
r->file_info.file_size = 0; r->file_info.file_size = 0;

@ -12,6 +12,9 @@
namespace rocksdb { namespace rocksdb {
const uint32_t TablePropertiesCollectorFactory::Context::kUnknownColumnFamily =
port::kMaxInt32;
namespace { namespace {
void AppendProperty( void AppendProperty(
std::string& props, std::string& props,

@ -98,7 +98,7 @@ void TableReaderBenchmark(Options& opts, EnvOptions& env_options,
TableBuilderOptions(ioptions, ikc, &int_tbl_prop_collector_factories, TableBuilderOptions(ioptions, ikc, &int_tbl_prop_collector_factories,
CompressionType::kNoCompression, CompressionType::kNoCompression,
CompressionOptions(), false), CompressionOptions(), false),
file_writer.get()); 0, file_writer.get());
} else { } else {
s = DB::Open(opts, dbname, &db); s = DB::Open(opts, dbname, &db);
ASSERT_OK(s); ASSERT_OK(s);

@ -272,6 +272,7 @@ class TableConstructor: public Constructor {
TableBuilderOptions(ioptions, internal_comparator, TableBuilderOptions(ioptions, internal_comparator,
&int_tbl_prop_collector_factories, &int_tbl_prop_collector_factories,
options.compression, CompressionOptions(), false), options.compression, CompressionOptions(), false),
TablePropertiesCollectorFactory::Context::kUnknownColumnFamily,
file_writer_.get())); file_writer_.get()));
for (const auto kv : kv_map) { for (const auto kv : kv_map) {
@ -1824,6 +1825,7 @@ TEST_F(PlainTableTest, BasicPlainTableProperties) {
std::unique_ptr<TableBuilder> builder(factory.NewTableBuilder( std::unique_ptr<TableBuilder> builder(factory.NewTableBuilder(
TableBuilderOptions(ioptions, ikc, &int_tbl_prop_collector_factories, TableBuilderOptions(ioptions, ikc, &int_tbl_prop_collector_factories,
kNoCompression, CompressionOptions(), false), kNoCompression, CompressionOptions(), false),
TablePropertiesCollectorFactory::Context::kUnknownColumnFamily,
file_writer.get())); file_writer.get()));
for (char c = 'a'; c <= 'z'; ++c) { for (char c = 'a'; c <= 'z'; ++c) {

@ -62,6 +62,7 @@ void createSST(const std::string& file_name,
TableBuilderOptions(imoptions, ikc, &int_tbl_prop_collector_factories, TableBuilderOptions(imoptions, ikc, &int_tbl_prop_collector_factories,
CompressionType::kNoCompression, CompressionOptions(), CompressionType::kNoCompression, CompressionOptions(),
false), false),
TablePropertiesCollectorFactory::Context::kUnknownColumnFamily,
file_writer.get())); file_writer.get()));
// Populate slightly more than 1K keys // Populate slightly more than 1K keys

@ -124,7 +124,9 @@ uint64_t SstFileReader::CalculateCompressedTableSize(
BlockBasedTableFactory block_based_tf(table_options); BlockBasedTableFactory block_based_tf(table_options);
unique_ptr<TableBuilder> table_builder; unique_ptr<TableBuilder> table_builder;
table_builder.reset(block_based_tf.NewTableBuilder( table_builder.reset(block_based_tf.NewTableBuilder(
tb_options, dest_writer.get())); tb_options,
TablePropertiesCollectorFactory::Context::kUnknownColumnFamily,
dest_writer.get()));
unique_ptr<Iterator> iter(table_reader_->NewIterator(ReadOptions())); unique_ptr<Iterator> iter(table_reader_->NewIterator(ReadOptions()));
for (iter->SeekToFirst(); iter->Valid(); iter->Next()) { for (iter->SeekToFirst(); iter->Valid(); iter->Next()) {
if (!iter->status().ok()) { if (!iter->status().ok()) {

@ -4,10 +4,10 @@
// of patent rights can be found in the PATENTS file in the same directory. // of patent rights can be found in the PATENTS file in the same directory.
#ifndef ROCKSDB_LITE #ifndef ROCKSDB_LITE
#include <memory> #include "utilities/table_properties_collectors/compact_on_deletion_collector.h"
#include <memory>
#include "rocksdb/utilities/table_properties_collectors.h" #include "rocksdb/utilities/table_properties_collectors.h"
#include "utilities/table_properties_collectors/compact_on_deletion_collector.h"
namespace rocksdb { namespace rocksdb {
@ -75,8 +75,9 @@ Status CompactOnDeletionCollector::AddUserKey(
return Status::OK(); return Status::OK();
} }
TablePropertiesCollector* CompactOnDeletionCollectorFactory:: TablePropertiesCollector*
CreateTablePropertiesCollector() { CompactOnDeletionCollectorFactory::CreateTablePropertiesCollector(
TablePropertiesCollectorFactory::Context context) {
return new CompactOnDeletionCollector( return new CompactOnDeletionCollector(
sliding_window_size_, deletion_trigger_); sliding_window_size_, deletion_trigger_);
} }

@ -6,6 +6,7 @@
#pragma once #pragma once
#ifndef ROCKSDB_LITE #ifndef ROCKSDB_LITE
#include "rocksdb/utilities/table_properties_collectors.h"
namespace rocksdb { namespace rocksdb {
// A factory of a table property collector that marks a SST // A factory of a table property collector that marks a SST
@ -28,7 +29,8 @@ class CompactOnDeletionCollectorFactory
virtual ~CompactOnDeletionCollectorFactory() {} virtual ~CompactOnDeletionCollectorFactory() {}
virtual TablePropertiesCollector* CreateTablePropertiesCollector() override; virtual TablePropertiesCollector* CreateTablePropertiesCollector(
TablePropertiesCollectorFactory::Context context) override;
virtual const char* Name() const override { virtual const char* Name() const override {
return "CompactOnDeletionCollector"; return "CompactOnDeletionCollector";

@ -15,6 +15,7 @@
#include <vector> #include <vector>
#include "rocksdb/table.h" #include "rocksdb/table.h"
#include "rocksdb/table_properties.h"
#include "rocksdb/utilities/table_properties_collectors.h" #include "rocksdb/utilities/table_properties_collectors.h"
#include "util/random.h" #include "util/random.h"
#include "utilities/table_properties_collectors/compact_on_deletion_collector.h" #include "utilities/table_properties_collectors/compact_on_deletion_collector.h"
@ -24,6 +25,9 @@ int main(int argc, char** argv) {
{1000, 10000, 10000, 127, 128, 129, 255, 256, 257, 2, 10000}; {1000, 10000, 10000, 127, 128, 129, 255, 256, 257, 2, 10000};
const int kDeletionTriggers[] = const int kDeletionTriggers[] =
{500, 9500, 4323, 47, 61, 128, 250, 250, 250, 2, 2}; {500, 9500, 4323, 47, 61, 128, 250, 250, 250, 2, 2};
rocksdb::TablePropertiesCollectorFactory::Context context;
context.column_family_id =
rocksdb::TablePropertiesCollectorFactory::Context::kUnknownColumnFamily;
std::vector<int> window_sizes; std::vector<int> window_sizes;
std::vector<int> deletion_triggers; std::vector<int> deletion_triggers;
@ -57,8 +61,7 @@ int main(int argc, char** argv) {
std::unique_ptr<rocksdb::TablePropertiesCollector> collector; std::unique_ptr<rocksdb::TablePropertiesCollector> collector;
auto factory = rocksdb::NewCompactOnDeletionCollectorFactory( auto factory = rocksdb::NewCompactOnDeletionCollectorFactory(
kWindowSize, kNumDeletionTrigger); kWindowSize, kNumDeletionTrigger);
collector.reset( collector.reset(factory->CreateTablePropertiesCollector(context));
factory->CreateTablePropertiesCollector());
const int kSample = 10; const int kSample = 10;
for (int delete_rate = 0; delete_rate <= kSample; ++delete_rate) { for (int delete_rate = 0; delete_rate <= kSample; ++delete_rate) {
int deletions = 0; int deletions = 0;
@ -90,8 +93,7 @@ int main(int argc, char** argv) {
std::unique_ptr<rocksdb::TablePropertiesCollector> collector; std::unique_ptr<rocksdb::TablePropertiesCollector> collector;
auto factory = rocksdb::NewCompactOnDeletionCollectorFactory( auto factory = rocksdb::NewCompactOnDeletionCollectorFactory(
kWindowSize, kNumDeletionTrigger); kWindowSize, kNumDeletionTrigger);
collector.reset( collector.reset(factory->CreateTablePropertiesCollector(context));
factory->CreateTablePropertiesCollector());
const int kSample = 10; const int kSample = 10;
for (int delete_rate = 0; delete_rate <= kSample; ++delete_rate) { for (int delete_rate = 0; delete_rate <= kSample; ++delete_rate) {
int deletions = 0; int deletions = 0;
@ -138,8 +140,7 @@ int main(int argc, char** argv) {
std::unique_ptr<rocksdb::TablePropertiesCollector> collector; std::unique_ptr<rocksdb::TablePropertiesCollector> collector;
auto factory = rocksdb::NewCompactOnDeletionCollectorFactory( auto factory = rocksdb::NewCompactOnDeletionCollectorFactory(
kWindowSize, kNumDeletionTrigger); kWindowSize, kNumDeletionTrigger);
collector.reset( collector.reset(factory->CreateTablePropertiesCollector(context));
factory->CreateTablePropertiesCollector());
assert(collector->NeedCompact() == false); assert(collector->NeedCompact() == false);
// Insert "kNumDeletionTrigger * 0.95" deletions for every // Insert "kNumDeletionTrigger * 0.95" deletions for every
// "kWindowSize" and verify compaction is not needed. // "kWindowSize" and verify compaction is not needed.

Loading…
Cancel
Save