return idx_on_fltr_blk_->size();
}
+// Release the cached entry and decrement its ref count.
+void ReleaseFilterCachedEntry(void* arg, void* h) {
+ Cache* cache = reinterpret_cast<Cache*>(arg);
+ Cache::Handle* handle = reinterpret_cast<Cache::Handle*>(h);
+ cache->Release(handle);
+}
+
// TODO(myabandeh): merge this with the same function in IndexReader
void PartitionedFilterBlockReader::CacheDependencies(bool pin) {
// Before read partitions, prefetch them to avoid lots of IOs
if (LIKELY(filter.IsSet())) {
if (pin) {
filter_map_[handle.offset()] = std::move(filter);
+ RegisterCleanup(&ReleaseFilterCachedEntry, block_cache,
+ filter.cache_handle);
} else {
block_cache->Release(filter.cache_handle);
}
class TableConstructor: public Constructor {
public:
explicit TableConstructor(const Comparator* cmp,
- bool convert_to_internal_key = false)
+ bool convert_to_internal_key = false,
+ int level = -1)
: Constructor(cmp),
- convert_to_internal_key_(convert_to_internal_key) {}
+ convert_to_internal_key_(convert_to_internal_key),
+ level_(level) {}
~TableConstructor() { Reset(); }
virtual Status FinishImpl(const Options& options,
std::vector<std::unique_ptr<IntTblPropCollectorFactory>>
int_tbl_prop_collector_factories;
std::string column_family_name;
- int unknown_level = -1;
builder.reset(ioptions.table_factory->NewTableBuilder(
- TableBuilderOptions(ioptions, internal_comparator,
- &int_tbl_prop_collector_factories,
- options.compression, CompressionOptions(),
- nullptr /* compression_dict */,
- false /* skip_filters */, column_family_name,
- unknown_level),
+ TableBuilderOptions(
+ ioptions, internal_comparator, &int_tbl_prop_collector_factories,
+ options.compression, CompressionOptions(),
+ nullptr /* compression_dict */, false /* skip_filters */,
+ column_family_name, level_),
TablePropertiesCollectorFactory::Context::kUnknownColumnFamily,
file_writer_.get()));
uniq_id_ = cur_uniq_id_++;
file_reader_.reset(test::GetRandomAccessFileReader(new test::StringSource(
GetSink()->contents(), uniq_id_, ioptions.allow_mmap_reads)));
+ const bool skip_filters = false;
return ioptions.table_factory->NewTableReader(
- TableReaderOptions(ioptions, soptions, internal_comparator),
+ TableReaderOptions(ioptions, soptions, internal_comparator,
+ skip_filters, level_),
std::move(file_reader_), GetSink()->contents().size(), &table_reader_);
}
unique_ptr<RandomAccessFileReader> file_reader_;
unique_ptr<TableReader> table_reader_;
bool convert_to_internal_key_;
+ int level_;
TableConstructor();
// table is closed. This test makes sure that the only items remains in the
// cache after the table is closed are raw data blocks.
TEST_F(BlockBasedTableTest, NoObjectInCacheAfterTableClose) {
+ for (int level: {-1, 0, 1, 10}) {
for (auto index_type :
{BlockBasedTableOptions::IndexType::kBinarySearch,
BlockBasedTableOptions::IndexType::kTwoLevelIndexSearch}) {
rocksdb::NewBloomFilterPolicy(10, block_based_filter));
opt.table_factory.reset(NewBlockBasedTableFactory(table_options));
- TableConstructor c(BytewiseComparator());
+ bool convert_to_internal_key = false;
+ TableConstructor c(BytewiseComparator(), convert_to_internal_key,
+ level);
std::string user_key = "k01";
std::string key =
InternalKey(user_key, 0, kTypeValue).Encode().ToString();
}
}
}
+ } // level
}
TEST_F(BlockBasedTableTest, BlockCacheLeak) {