Enable READ_BLOCK_COMPACTION_MICROS to track stats (#9722)
Summary: After commit [d642c60
](d642c60bdc
), the stats `READ_BLOCK_COMPACTION_MICROS` cannot record any compaction read duration, and it always report zero. This PR targets to distinguish `READ_BLOCK_COMPACTION_MICROS` with `READ_BLOCK_GET_MICROS` so that `READ_BLOCK_COMPACTION_MICROS` could record the correct stats. Pull Request resolved: https://github.com/facebook/rocksdb/pull/9722 Reviewed By: ajkr Differential Revision: D35021870 Pulled By: jay-zhuang fbshipit-source-id: f1a804994265e51465de64c2a08f2e0eeb6fc5a3
This commit is contained in:
parent
8b2cfef9e0
commit
e7de808d35
@ -6,6 +6,7 @@
|
|||||||
* Fixed a race condition when mmaping a WritableFile on POSIX.
|
* Fixed a race condition when mmaping a WritableFile on POSIX.
|
||||||
* Fixed a race condition when 2PC is disabled and WAL tracking in the MANIFEST is enabled. The race condition is between two background flush threads trying to install flush results, causing a WAL deletion not tracked in the MANIFEST. A future DB open may fail.
|
* Fixed a race condition when 2PC is disabled and WAL tracking in the MANIFEST is enabled. The race condition is between two background flush threads trying to install flush results, causing a WAL deletion not tracked in the MANIFEST. A future DB open may fail.
|
||||||
* Fixed a heap use-after-free race with DropColumnFamily.
|
* Fixed a heap use-after-free race with DropColumnFamily.
|
||||||
|
* Fixed a bug that `rocksdb.read.block.compaction.micros` cannot track compaction stats (#9722).
|
||||||
|
|
||||||
## 7.0.3 (03/23/2022)
|
## 7.0.3 (03/23/2022)
|
||||||
### Bug Fixes
|
### Bug Fixes
|
||||||
|
@ -1467,9 +1467,10 @@ template <typename TBlocklike>
|
|||||||
Status BlockBasedTable::MaybeReadBlockAndLoadToCache(
|
Status BlockBasedTable::MaybeReadBlockAndLoadToCache(
|
||||||
FilePrefetchBuffer* prefetch_buffer, const ReadOptions& ro,
|
FilePrefetchBuffer* prefetch_buffer, const ReadOptions& ro,
|
||||||
const BlockHandle& handle, const UncompressionDict& uncompression_dict,
|
const BlockHandle& handle, const UncompressionDict& uncompression_dict,
|
||||||
const bool wait, CachableEntry<TBlocklike>* block_entry,
|
const bool wait, const bool for_compaction,
|
||||||
BlockType block_type, GetContext* get_context,
|
CachableEntry<TBlocklike>* block_entry, BlockType block_type,
|
||||||
BlockCacheLookupContext* lookup_context, BlockContents* contents) const {
|
GetContext* get_context, BlockCacheLookupContext* lookup_context,
|
||||||
|
BlockContents* contents) const {
|
||||||
assert(block_entry != nullptr);
|
assert(block_entry != nullptr);
|
||||||
const bool no_io = (ro.read_tier == kBlockCacheTier);
|
const bool no_io = (ro.read_tier == kBlockCacheTier);
|
||||||
Cache* block_cache = rep_->table_options.block_cache.get();
|
Cache* block_cache = rep_->table_options.block_cache.get();
|
||||||
@ -1522,7 +1523,9 @@ Status BlockBasedTable::MaybeReadBlockAndLoadToCache(
|
|||||||
CompressionType raw_block_comp_type;
|
CompressionType raw_block_comp_type;
|
||||||
BlockContents raw_block_contents;
|
BlockContents raw_block_contents;
|
||||||
if (!contents) {
|
if (!contents) {
|
||||||
StopWatch sw(rep_->ioptions.clock, statistics, READ_BLOCK_GET_MICROS);
|
Histograms histogram = for_compaction ? READ_BLOCK_COMPACTION_MICROS
|
||||||
|
: READ_BLOCK_GET_MICROS;
|
||||||
|
StopWatch sw(rep_->ioptions.clock, statistics, histogram);
|
||||||
BlockFetcher block_fetcher(
|
BlockFetcher block_fetcher(
|
||||||
rep_->file.get(), prefetch_buffer, rep_->footer, ro, handle,
|
rep_->file.get(), prefetch_buffer, rep_->footer, ro, handle,
|
||||||
&raw_block_contents, rep_->ioptions, do_uncompress,
|
&raw_block_contents, rep_->ioptions, do_uncompress,
|
||||||
@ -1880,8 +1883,9 @@ void BlockBasedTable::RetrieveMultipleBlocks(
|
|||||||
// avoid looking up the block cache
|
// avoid looking up the block cache
|
||||||
s = MaybeReadBlockAndLoadToCache(
|
s = MaybeReadBlockAndLoadToCache(
|
||||||
nullptr, options, handle, uncompression_dict, /*wait=*/true,
|
nullptr, options, handle, uncompression_dict, /*wait=*/true,
|
||||||
block_entry, BlockType::kData, mget_iter->get_context,
|
/*for_compaction=*/false, block_entry, BlockType::kData,
|
||||||
&lookup_data_block_context, &raw_block_contents);
|
mget_iter->get_context, &lookup_data_block_context,
|
||||||
|
&raw_block_contents);
|
||||||
|
|
||||||
// block_entry value could be null if no block cache is present, i.e
|
// block_entry value could be null if no block cache is present, i.e
|
||||||
// BlockBasedTableOptions::no_block_cache is true and no compressed
|
// BlockBasedTableOptions::no_block_cache is true and no compressed
|
||||||
@ -1935,7 +1939,7 @@ Status BlockBasedTable::RetrieveBlock(
|
|||||||
if (use_cache) {
|
if (use_cache) {
|
||||||
s = MaybeReadBlockAndLoadToCache(
|
s = MaybeReadBlockAndLoadToCache(
|
||||||
prefetch_buffer, ro, handle, uncompression_dict, wait_for_cache,
|
prefetch_buffer, ro, handle, uncompression_dict, wait_for_cache,
|
||||||
block_entry, block_type, get_context, lookup_context,
|
for_compaction, block_entry, block_type, get_context, lookup_context,
|
||||||
/*contents=*/nullptr);
|
/*contents=*/nullptr);
|
||||||
|
|
||||||
if (!s.ok()) {
|
if (!s.ok()) {
|
||||||
@ -1964,8 +1968,9 @@ Status BlockBasedTable::RetrieveBlock(
|
|||||||
std::unique_ptr<TBlocklike> block;
|
std::unique_ptr<TBlocklike> block;
|
||||||
|
|
||||||
{
|
{
|
||||||
StopWatch sw(rep_->ioptions.clock, rep_->ioptions.stats,
|
Histograms histogram =
|
||||||
READ_BLOCK_GET_MICROS);
|
for_compaction ? READ_BLOCK_COMPACTION_MICROS : READ_BLOCK_GET_MICROS;
|
||||||
|
StopWatch sw(rep_->ioptions.clock, rep_->ioptions.stats, histogram);
|
||||||
s = ReadBlockFromFile(
|
s = ReadBlockFromFile(
|
||||||
rep_->file.get(), prefetch_buffer, rep_->footer, ro, handle, &block,
|
rep_->file.get(), prefetch_buffer, rep_->footer, ro, handle, &block,
|
||||||
rep_->ioptions, do_uncompress, maybe_compressed, block_type,
|
rep_->ioptions, do_uncompress, maybe_compressed, block_type,
|
||||||
|
@ -343,9 +343,10 @@ class BlockBasedTable : public TableReader {
|
|||||||
Status MaybeReadBlockAndLoadToCache(
|
Status MaybeReadBlockAndLoadToCache(
|
||||||
FilePrefetchBuffer* prefetch_buffer, const ReadOptions& ro,
|
FilePrefetchBuffer* prefetch_buffer, const ReadOptions& ro,
|
||||||
const BlockHandle& handle, const UncompressionDict& uncompression_dict,
|
const BlockHandle& handle, const UncompressionDict& uncompression_dict,
|
||||||
const bool wait, CachableEntry<TBlocklike>* block_entry,
|
const bool wait, const bool for_compaction,
|
||||||
BlockType block_type, GetContext* get_context,
|
CachableEntry<TBlocklike>* block_entry, BlockType block_type,
|
||||||
BlockCacheLookupContext* lookup_context, BlockContents* contents) const;
|
GetContext* get_context, BlockCacheLookupContext* lookup_context,
|
||||||
|
BlockContents* contents) const;
|
||||||
|
|
||||||
// Similar to the above, with one crucial difference: it will retrieve the
|
// Similar to the above, with one crucial difference: it will retrieve the
|
||||||
// block from the file even if there are no caches configured (assuming the
|
// block from the file even if there are no caches configured (assuming the
|
||||||
|
@ -519,8 +519,8 @@ Status PartitionedFilterBlockReader::CacheDependencies(const ReadOptions& ro,
|
|||||||
// filter blocks
|
// filter blocks
|
||||||
s = table()->MaybeReadBlockAndLoadToCache(
|
s = table()->MaybeReadBlockAndLoadToCache(
|
||||||
prefetch_buffer.get(), ro, handle, UncompressionDict::GetEmptyDict(),
|
prefetch_buffer.get(), ro, handle, UncompressionDict::GetEmptyDict(),
|
||||||
/* wait */ true, &block, BlockType::kFilter, nullptr /* get_context */,
|
/* wait */ true, /* for_compaction */ false, &block, BlockType::kFilter,
|
||||||
&lookup_context, nullptr /* contents */);
|
nullptr /* get_context */, &lookup_context, nullptr /* contents */);
|
||||||
if (!s.ok()) {
|
if (!s.ok()) {
|
||||||
return s;
|
return s;
|
||||||
}
|
}
|
||||||
|
@ -180,8 +180,8 @@ Status PartitionIndexReader::CacheDependencies(const ReadOptions& ro,
|
|||||||
// filter blocks
|
// filter blocks
|
||||||
Status s = table()->MaybeReadBlockAndLoadToCache(
|
Status s = table()->MaybeReadBlockAndLoadToCache(
|
||||||
prefetch_buffer.get(), ro, handle, UncompressionDict::GetEmptyDict(),
|
prefetch_buffer.get(), ro, handle, UncompressionDict::GetEmptyDict(),
|
||||||
/*wait=*/true, &block, BlockType::kIndex, /*get_context=*/nullptr,
|
/*wait=*/true, /*for_compaction=*/false, &block, BlockType::kIndex,
|
||||||
&lookup_context, /*contents=*/nullptr);
|
/*get_context=*/nullptr, &lookup_context, /*contents=*/nullptr);
|
||||||
|
|
||||||
if (!s.ok()) {
|
if (!s.ok()) {
|
||||||
return s;
|
return s;
|
||||||
|
Loading…
Reference in New Issue
Block a user