Skip to content

Commit cb10d07

Browse files
committed
add uniform block tracking
1 parent 056a0f9 commit cb10d07

File tree

9 files changed

+54
-2
lines changed

9 files changed

+54
-2
lines changed

include/rocksdb/table_properties.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,7 @@ struct TablePropertiesNames {
5050
static const std::string kRawKeySize;
5151
static const std::string kRawValueSize;
5252
static const std::string kNumDataBlocks;
53+
static const std::string kNumUniformBlocks;
5354
static const std::string kNumEntries;
5455
static const std::string kNumFilterEntries;
5556
static const std::string kDeletedKeys;
@@ -245,6 +246,8 @@ struct TableProperties {
245246
uint64_t raw_value_size = 0;
246247
// the number of blocks in this table
247248
uint64_t num_data_blocks = 0;
249+
// the number of uniform blocks in this table
250+
uint64_t num_uniform_blocks = 0;
248251
// the number of entries in this table
249252
uint64_t num_entries = 0;
250253
// the number of unique entries (keys or prefixes) added to filters

table/block_based/block_based_table_builder.cc

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2432,6 +2432,10 @@ void BlockBasedTableBuilder::WriteIndexBlock(
24322432
// The last index_block_handle will be for the partition index block
24332433
}
24342434
}
2435+
if (LIKELY(ok())) {
2436+
rep_->props.num_uniform_blocks =
2437+
rep_->index_builder->NumUniformIndexBlocks();
2438+
}
24352439
// If success and need to record in metaindex rather than footer...
24362440
if (LIKELY(ok()) && !FormatVersionUsesIndexHandleInFooter(
24372441
rep_->table_options.format_version)) {

table/block_based/block_builder.cc

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -105,6 +105,7 @@ BlockBuilder::BlockBuilder(
105105
restarts_(1, 0), // First restart point is at offset 0
106106
counter_(0),
107107
finished_(false),
108+
is_uniform_(false),
108109
uniform_cv_threshold_(uniform_cv_threshold),
109110
statistics_(statistics),
110111
use_separated_kv_storage_(use_separated_kv_storage) {
@@ -131,6 +132,7 @@ void BlockBuilder::Reset() {
131132
(use_separated_kv_storage_ ? sizeof(uint32_t) : 0);
132133
counter_ = 0;
133134
finished_ = false;
135+
is_uniform_ = false;
134136
last_key_.clear();
135137
if (data_block_hash_index_builder_.Valid()) {
136138
data_block_hash_index_builder_.Reset();
@@ -185,7 +187,7 @@ size_t BlockBuilder::EstimateSizeAfterKV(const Slice& key,
185187
}
186188

187189
Slice BlockBuilder::Finish() {
188-
bool is_uniform = ScanForUniformity();
190+
is_uniform_ = ScanForUniformity();
189191

190192
// Append restart array
191193
size_t values_buffer_offset = buffer_.size();
@@ -201,7 +203,7 @@ Slice BlockBuilder::Finish() {
201203
DataBlockFooter footer;
202204
footer.num_restarts = static_cast<uint32_t>(restarts_.size());
203205
footer.index_type = BlockBasedTableOptions::kDataBlockBinarySearch;
204-
footer.is_uniform = is_uniform;
206+
footer.is_uniform = is_uniform_;
205207
if (data_block_hash_index_builder_.Valid() &&
206208
CurrentSizeEstimate() <= kMaxBlockSizeSupportedByHashIndex) {
207209
data_block_hash_index_builder_.Finish(buffer_);

table/block_based/block_builder.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -86,6 +86,10 @@ class BlockBuilder {
8686

8787
std::string& MutableBuffer() { return buffer_; }
8888

89+
// Returns true if the most recently Finish()'d block was marked uniform.
90+
// REQUIRES: Finish() has been called.
91+
bool IsUniform() const { return is_uniform_; }
92+
8993
private:
9094
inline void AddWithLastKeyImpl(const Slice& key, const Slice& value,
9195
const Slice& last_key,
@@ -128,6 +132,7 @@ class BlockBuilder {
128132
size_t estimate_;
129133
int counter_; // Number of entries emitted since restart
130134
bool finished_; // Has Finish() been called?
135+
bool is_uniform_; // Was the last Finish()'d block uniform?
131136
std::string last_key_;
132137
DataBlockHashIndexBuilder data_block_hash_index_builder_;
133138
const double uniform_cv_threshold_;

table/block_based/block_test.cc

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -803,6 +803,7 @@ TEST_P(IndexBlockTest, IndexValueEncodingTest) {
803803
bool expect_uniform = reader.NumRestarts() >= 3 &&
804804
keyDistribution() == KeyDistribution::kUniform;
805805
EXPECT_EQ(reader.IsUniform(), expect_uniform);
806+
EXPECT_EQ(builder.IsUniform(), expect_uniform);
806807
}
807808

808809
// read block contents randomly

table/block_based/index_builder.cc

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -346,9 +346,12 @@ Status PartitionedIndexBuilder::Finish(
346346
if (UNLIKELY(entries_.empty())) {
347347
if (must_use_separator_with_seq_.LoadRelaxed()) {
348348
index_blocks->index_block_contents = index_block_builder_.Finish();
349+
num_uniform_index_blocks_ += index_block_builder_.IsUniform() ? 1 : 0;
349350
} else {
350351
index_blocks->index_block_contents =
351352
index_block_builder_without_seq_.Finish();
353+
num_uniform_index_blocks_ +=
354+
index_block_builder_without_seq_.IsUniform() ? 1 : 0;
352355
}
353356
top_level_index_size_ = index_blocks->index_block_contents.size();
354357
index_size_ += top_level_index_size_;
@@ -361,6 +364,7 @@ Status PartitionedIndexBuilder::Finish(
361364
entry.value->must_use_separator_with_seq_.StoreRelaxed(
362365
must_use_separator_with_seq_.LoadRelaxed());
363366
auto s = entry.value->Finish(index_blocks);
367+
num_uniform_index_blocks_ += entry.value->NumUniformIndexBlocks();
364368
index_size_ += index_blocks->index_block_contents.size();
365369
finishing_indexes_ = true;
366370
return s.ok() ? Status::Incomplete() : s;

table/block_based/index_builder.h

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -160,6 +160,9 @@ class IndexBuilder {
160160
// Get the size for index block. Must be called after ::Finish.
161161
virtual size_t IndexSize() const = 0;
162162

163+
// Get the number of uniform index blocks. Must be called after ::Finish.
164+
virtual uint64_t NumUniformIndexBlocks() const { return 0; }
165+
163166
// Returns an estimate of the current index size based on the builder's state.
164167
// Implementations should cache the estimate and update it via
165168
// UpdateIndexSizeEstimate() to avoid recalculating on every key add,
@@ -434,16 +437,22 @@ class ShortenedIndexBuilder : public IndexBuilder {
434437
const BlockHandle& /*last_partition_block_handle*/) override {
435438
if (must_use_separator_with_seq_.LoadRelaxed()) {
436439
index_blocks->index_block_contents = index_block_builder_.Finish();
440+
is_uniform_ = index_block_builder_.IsUniform();
437441
} else {
438442
index_blocks->index_block_contents =
439443
index_block_builder_without_seq_.Finish();
444+
is_uniform_ = index_block_builder_without_seq_.IsUniform();
440445
}
441446
index_size_ = index_blocks->index_block_contents.size();
442447
return Status::OK();
443448
}
444449

445450
size_t IndexSize() const override { return index_size_; }
446451

452+
uint64_t NumUniformIndexBlocks() const override {
453+
return is_uniform_ ? 1 : 0;
454+
}
455+
447456
uint64_t CurrentIndexSizeEstimate() const override {
448457
return estimated_index_size_.LoadRelaxed();
449458
}
@@ -480,6 +489,7 @@ class ShortenedIndexBuilder : public IndexBuilder {
480489
const bool include_first_key_;
481490
BlockBasedTableOptions::IndexShorteningMode shortening_mode_;
482491
BlockHandle last_encoded_handle_ = BlockHandle::NullBlockHandle();
492+
bool is_uniform_ = false;
483493
std::string current_block_first_internal_key_;
484494
uint64_t num_index_entries_ = 0;
485495
// Cache for index size estimate to avoid recalculating in hot path
@@ -607,6 +617,10 @@ class HashIndexBuilder : public IndexBuilder {
607617
prefix_meta_block_.size();
608618
}
609619

620+
uint64_t NumUniformIndexBlocks() const override {
621+
return primary_index_builder_.NumUniformIndexBlocks();
622+
}
623+
610624
uint64_t CurrentIndexSizeEstimate() const override { return 0; }
611625

612626
bool separator_is_key_plus_seq() override {
@@ -685,6 +699,10 @@ class PartitionedIndexBuilder : public IndexBuilder {
685699
size_t TopLevelIndexSize(uint64_t) const { return top_level_index_size_; }
686700
size_t NumPartitions() const;
687701

702+
uint64_t NumUniformIndexBlocks() const override {
703+
return num_uniform_index_blocks_;
704+
}
705+
688706
// Returns a cached estimate of the current index size. This
689707
// estimate is updated when data blocks are added.
690708
uint64_t CurrentIndexSizeEstimate() const override {
@@ -724,6 +742,8 @@ class PartitionedIndexBuilder : public IndexBuilder {
724742
size_t top_level_index_size_ = 0;
725743
// Set after ::Finish is called
726744
size_t partition_cnt_ = 0;
745+
// Accumulated across all Finish() calls
746+
uint64_t num_uniform_index_blocks_ = 0;
727747

728748
void MakeNewSubIndexBuilder();
729749
void UpdateIndexSizeEstimate() override;

table/meta_blocks.cc

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -97,6 +97,7 @@ void PropertyBlockBuilder::AddTableProperty(const TableProperties& props) {
9797
Add(TablePropertiesNames::kMergeOperands, props.num_merge_operands);
9898
Add(TablePropertiesNames::kNumRangeDeletions, props.num_range_deletions);
9999
Add(TablePropertiesNames::kNumDataBlocks, props.num_data_blocks);
100+
Add(TablePropertiesNames::kNumUniformBlocks, props.num_uniform_blocks);
100101
Add(TablePropertiesNames::kFilterSize, props.filter_size);
101102
Add(TablePropertiesNames::kFormatVersion, props.format_version);
102103
Add(TablePropertiesNames::kFixedKeyLen, props.fixed_key_len);
@@ -291,6 +292,8 @@ Status ParsePropertiesBlock(
291292
&new_table_properties->raw_value_size},
292293
{TablePropertiesNames::kNumDataBlocks,
293294
&new_table_properties->num_data_blocks},
295+
{TablePropertiesNames::kNumUniformBlocks,
296+
&new_table_properties->num_uniform_blocks},
294297
{TablePropertiesNames::kNumEntries, &new_table_properties->num_entries},
295298
{TablePropertiesNames::kNumFilterEntries,
296299
&new_table_properties->num_filter_entries},

table/table_properties.cc

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,8 @@ std::string TableProperties::ToString(const std::string& prop_delim,
4747
// Basic Info
4848
AppendProperty(result, "# data blocks", num_data_blocks, prop_delim,
4949
kv_delim);
50+
AppendProperty(result, "# uniform blocks", num_uniform_blocks, prop_delim,
51+
kv_delim);
5052
AppendProperty(result, "# entries", num_entries, prop_delim, kv_delim);
5153
AppendProperty(result, "# deletions", num_deletions, prop_delim, kv_delim);
5254
AppendProperty(result, "# merge operands", num_merge_operands, prop_delim,
@@ -192,6 +194,7 @@ void TableProperties::Add(const TableProperties& tp) {
192194
raw_key_size += tp.raw_key_size;
193195
raw_value_size += tp.raw_value_size;
194196
num_data_blocks += tp.num_data_blocks;
197+
num_uniform_blocks += tp.num_uniform_blocks;
195198
num_entries += tp.num_entries;
196199
num_filter_entries += tp.num_filter_entries;
197200
num_deletions += tp.num_deletions;
@@ -215,6 +218,7 @@ TableProperties::GetAggregatablePropertiesAsMap() const {
215218
rv["raw_key_size"] = raw_key_size;
216219
rv["raw_value_size"] = raw_value_size;
217220
rv["num_data_blocks"] = num_data_blocks;
221+
rv["num_uniform_blocks"] = num_uniform_blocks;
218222
rv["num_entries"] = num_entries;
219223
rv["num_filter_entries"] = num_filter_entries;
220224
rv["num_deletions"] = num_deletions;
@@ -280,6 +284,8 @@ const std::string TablePropertiesNames::kRawValueSize =
280284
"rocksdb.raw.value.size";
281285
const std::string TablePropertiesNames::kNumDataBlocks =
282286
"rocksdb.num.data.blocks";
287+
const std::string TablePropertiesNames::kNumUniformBlocks =
288+
"rocksdb.num.uniform.blocks";
283289
const std::string TablePropertiesNames::kNumEntries = "rocksdb.num.entries";
284290
const std::string TablePropertiesNames::kNumFilterEntries =
285291
"rocksdb.num.filter_entries";
@@ -381,6 +387,10 @@ static std::unordered_map<std::string, OptionTypeInfo>
381387
{offsetof(struct TableProperties, num_data_blocks),
382388
OptionType::kUInt64T, OptionVerificationType::kNormal,
383389
OptionTypeFlags::kNone}},
390+
{"num_uniform_blocks",
391+
{offsetof(struct TableProperties, num_uniform_blocks),
392+
OptionType::kUInt64T, OptionVerificationType::kNormal,
393+
OptionTypeFlags::kNone}},
384394
{"num_entries",
385395
{offsetof(struct TableProperties, num_entries), OptionType::kUInt64T,
386396
OptionVerificationType::kNormal, OptionTypeFlags::kNone}},

0 commit comments

Comments
 (0)