file_size, bloom_bits_per_key, hash_table_ratio,
index_sparseness, table_properties),
expect_bloom_not_match_(expect_bloom_not_match) {
- Status s = PopulateIndex();
+ Status s = PopulateIndex(const_cast<TableProperties*>(table_properties));
ASSERT_TRUE(s.ok());
}
ASSERT_OK(Put("0000000000000bar", "v2"));
ASSERT_OK(Put("1000000000000foo", "v3"));
dbfull()->TEST_FlushMemTable();
+
+ TablePropertiesCollection ptc;
+ reinterpret_cast<DB*>(dbfull())->GetPropertiesOfAllTables(&ptc);
+ ASSERT_EQ(1, ptc.size());
+ auto row = ptc.begin();
+ auto tp = row->second;
+ ASSERT_EQ(
+ total_order ? "4" : "12",
+ (tp->user_collected_properties).at("plain_table_hash_table_size"));
+ ASSERT_EQ(
+ total_order ? "9" : "0",
+ (tp->user_collected_properties).at("plain_table_sub_index_size"));
+
ASSERT_EQ("v3", Get("1000000000000foo"));
ASSERT_EQ("v2", Get("0000000000000bar"));
}
kHashTableRatio(hash_table_ratio),
kBloomBitsPerKey(bloom_bits_per_key),
kIndexIntervalForSamePrefixKeys(index_sparseness),
- table_properties_(table_properties),
- data_end_offset_(table_properties_->data_size),
+ table_properties_(nullptr),
+ data_end_offset_(table_properties->data_size),
user_key_len_(table_properties->fixed_key_len) {
assert(kHashTableRatio >= 0.0);
}
bloom_bits_per_key, hash_table_ratio, index_sparseness, props));
// -- Populate Index
- s = new_reader->PopulateIndex();
+ s = new_reader->PopulateIndex(props);
if (!s.ok()) {
return s;
}
index_size_, kSubIndexSize);
}
-Status PlainTableReader::PopulateIndex() {
+Status PlainTableReader::PopulateIndex(TableProperties* props) {
+ assert(props != nullptr);
+ table_properties_.reset(props);
+
// options.prefix_extractor is requried for a hash-based look-up.
if (options_.prefix_extractor.get() == nullptr && kHashTableRatio != 0) {
return Status::NotSupported(
// From the temp data structure, populate indexes.
FillIndexes(sub_index_size_needed, hash_to_offsets, entries_per_bucket);
+ // Fill two table properties.
+ // TODO(sdong): after we have the feature of storing index in file, this
+ // properties need to be populated to index_size instead.
+ props->user_collected_properties["plain_table_hash_table_size"] =
+ std::to_string(index_size_ * 4U);
+ props->user_collected_properties["plain_table_sub_index_size"] =
+ std::to_string(sub_index_size_needed);
+
return Status::OK();
}
// PopulateIndex() builds index of keys. It must be called before any query
// to the table.
//
+ // props: the table properties object that need to be stored. Ownership of
+ // the object will be passed.
+ //
// index_ contains buckets size of index_size_, each is a
// 32-bit integer. The lower 31 bits contain an offset value (explained below)
// and the first bit of the integer indicates type of the offset.
// ....
// record N file offset: fixedint32
// <end>
- Status PopulateIndex();
+ Status PopulateIndex(TableProperties* props);
private:
struct IndexRecord;