diff --git a/tools/db_bench_tool.cc b/tools/db_bench_tool.cc index b254978c5e..a14758418c 100644 --- a/tools/db_bench_tool.cc +++ b/tools/db_bench_tool.cc @@ -774,6 +774,17 @@ DEFINE_string(trace_file, "", "Trace workload to a file. "); DEFINE_int32(trace_replay_fast_forward, 1, "Fast forward trace replay, must >= 1. "); +DEFINE_int32(block_cache_trace_sampling_frequency, 1, + "Block cache trace sampling frequency, termed s. It uses spatial " + "downsampling and samples accesses to one out of s blocks."); +DEFINE_int64( + block_cache_trace_max_trace_file_size_in_bytes, + uint64_t{64} * 1024 * 1024 * 1024, + "The maximum block cache trace file size in bytes. Block cache accesses " + "will not be logged if the trace file size exceeds this threshold. Default " + "is 64 GB."); +DEFINE_string(block_cache_trace_file, "", "Block cache trace file path."); + static enum rocksdb::CompressionType StringToCompressionType(const char* ctype) { assert(ctype); @@ -2081,6 +2092,7 @@ class Benchmark { Options open_options_; // keep options around to properly destroy db later #ifndef ROCKSDB_LITE TraceOptions trace_options_; + TraceOptions block_cache_trace_options_; #endif int64_t reads_; int64_t deletes_; @@ -2917,6 +2929,47 @@ class Benchmark { fprintf(stdout, "Tracing the workload to: [%s]\n", FLAGS_trace_file.c_str()); } + // Start block cache tracing. + if (!FLAGS_block_cache_trace_file.empty()) { + // Sanity checks. + if (FLAGS_block_cache_trace_sampling_frequency <= 0) { + fprintf(stderr, + "Block cache trace sampling frequency must be higher than " + "0.\n"); + exit(1); + } + if (FLAGS_block_cache_trace_max_trace_file_size_in_bytes <= 0) { + fprintf(stderr, + "The maximum file size for block cache tracing must be " + "higher than 0.\n"); + exit(1); + } + block_cache_trace_options_.max_trace_file_size = + FLAGS_block_cache_trace_max_trace_file_size_in_bytes; + block_cache_trace_options_.sampling_frequency = + FLAGS_block_cache_trace_sampling_frequency; + std::unique_ptr block_cache_trace_writer; + Status s = NewFileTraceWriter(FLAGS_env, EnvOptions(), + FLAGS_block_cache_trace_file, + &block_cache_trace_writer); + if (!s.ok()) { + fprintf(stderr, + "Encountered an error when creating trace writer, %s\n", + s.ToString().c_str()); + exit(1); + } + s = db_.db->StartBlockCacheTrace(block_cache_trace_options_, + std::move(block_cache_trace_writer)); + if (!s.ok()) { + fprintf( + stderr, + "Encountered an error when starting block cache tracing, %s\n", + s.ToString().c_str()); + exit(1); + } + fprintf(stdout, "Tracing block cache accesses to: [%s]\n", + FLAGS_block_cache_trace_file.c_str()); + } #endif // ROCKSDB_LITE if (num_warmup > 0) { @@ -2959,6 +3012,14 @@ class Benchmark { s.ToString().c_str()); } } + if (!FLAGS_block_cache_trace_file.empty()) { + Status s = db_.db->EndBlockCacheTrace(); + if (!s.ok()) { + fprintf(stderr, + "Encountered an error ending the block cache tracing, %s\n", + s.ToString().c_str()); + } + } #endif // ROCKSDB_LITE if (FLAGS_statistics) {