Server::InfoEntries Server::GetRocksDBInfo()

in src/server/server.cc [859:964]


Server::InfoEntries Server::GetRocksDBInfo() {
  InfoEntries entries;
  if (is_loading_) return entries;

  rocksdb::DB *db = storage->GetDB();

  uint64_t memtable_sizes = 0, cur_memtable_sizes = 0, num_snapshots = 0, num_running_flushes = 0;
  uint64_t num_immutable_tables = 0, memtable_flush_pending = 0, compaction_pending = 0;
  uint64_t num_running_compaction = 0, num_live_versions = 0, num_super_version = 0, num_background_errors = 0;

  db->GetAggregatedIntProperty("rocksdb.size-all-mem-tables", &memtable_sizes);
  db->GetAggregatedIntProperty("rocksdb.cur-size-all-mem-tables", &cur_memtable_sizes);
  db->GetAggregatedIntProperty("rocksdb.num-immutable-mem-table", &num_immutable_tables);
  db->GetAggregatedIntProperty("rocksdb.mem-table-flush-pending", &memtable_flush_pending);
  db->GetAggregatedIntProperty("rocksdb.current-super-version-number", &num_super_version);
  db->GetAggregatedIntProperty("rocksdb.background-errors", &num_background_errors);
  db->GetAggregatedIntProperty("rocksdb.compaction-pending", &compaction_pending);
  db->GetAggregatedIntProperty("rocksdb.num-live-versions", &num_live_versions);

  {
    // All column families share the same block cache, so it's good to count a single one.
    uint64_t block_cache_usage = 0;
    uint64_t block_cache_pinned_usage = 0;
    auto subkey_cf_handle = storage->GetCFHandle(ColumnFamilyID::PrimarySubkey);
    db->GetIntProperty(subkey_cf_handle, rocksdb::DB::Properties::kBlockCacheUsage, &block_cache_usage);
    entries.emplace_back("block_cache_usage", block_cache_usage);
    db->GetIntProperty(subkey_cf_handle, rocksdb::DB::Properties::kBlockCachePinnedUsage, &block_cache_pinned_usage);
    entries.emplace_back("block_cache_pinned_usage[" + subkey_cf_handle->GetName() + "]", block_cache_pinned_usage);

    // All column faimilies share the same property of the DB, so it's good to count a single one.
    db->GetIntProperty(subkey_cf_handle, rocksdb::DB::Properties::kNumSnapshots, &num_snapshots);
    db->GetIntProperty(subkey_cf_handle, rocksdb::DB::Properties::kNumRunningFlushes, &num_running_flushes);
    db->GetIntProperty(subkey_cf_handle, rocksdb::DB::Properties::kNumRunningCompactions, &num_running_compaction);
  }

  for (const auto &cf_handle : *storage->GetCFHandles()) {
    uint64_t estimate_keys = 0;
    uint64_t index_and_filter_cache_usage = 0;
    std::map<std::string, std::string> cf_stats_map;
    db->GetIntProperty(cf_handle, rocksdb::DB::Properties::kEstimateNumKeys, &estimate_keys);
    entries.emplace_back("estimate_keys[" + cf_handle->GetName() + "]", estimate_keys);
    db->GetIntProperty(cf_handle, rocksdb::DB::Properties::kEstimateTableReadersMem, &index_and_filter_cache_usage);
    entries.emplace_back("index_and_filter_cache_usage[" + cf_handle->GetName() + "]", index_and_filter_cache_usage);
    db->GetMapProperty(cf_handle, rocksdb::DB::Properties::kCFStats, &cf_stats_map);
    entries.emplace_back("level0_file_limit_slowdown[" + cf_handle->GetName() + "]",
                         cf_stats_map["l0-file-count-limit-delays"]);
    entries.emplace_back("level0_file_limit_stop[" + cf_handle->GetName() + "]",
                         cf_stats_map["l0-file-count-limit-stops"]);
    entries.emplace_back("pending_compaction_bytes_slowdown[" + cf_handle->GetName() + "]",
                         cf_stats_map["pending-compaction-bytes-delays"]);
    entries.emplace_back("pending_compaction_bytes_stop[" + cf_handle->GetName() + "]",
                         cf_stats_map["pending-compaction-bytes-stops"]);
    entries.emplace_back("level0_file_limit_stop_with_ongoing_compaction[" + cf_handle->GetName() + "]",
                         cf_stats_map["cf-l0-file-count-limit-stops-with-ongoing-compaction"]);
    entries.emplace_back("level0_file_limit_slowdown_with_ongoing_compaction[" + cf_handle->GetName() + "]",
                         cf_stats_map["cf-l0-file-count-limit-delays-with-ongoing-compaction"]);
    entries.emplace_back("memtable_count_limit_slowdown[" + cf_handle->GetName() + "]",
                         cf_stats_map["memtable-limit-delays"]);
    entries.emplace_back("memtable_count_limit_stop[" + cf_handle->GetName() + "]",
                         cf_stats_map["memtable-limit-stops"]);
  }

  auto rocksdb_stats = storage->GetDB()->GetDBOptions().statistics;
  if (rocksdb_stats) {
    std::map<std::string, uint32_t> block_cache_stats = {
        {"block_cache_hit", rocksdb::Tickers::BLOCK_CACHE_HIT},
        {"block_cache_index_hit", rocksdb::Tickers::BLOCK_CACHE_INDEX_HIT},
        {"block_cache_filter_hit", rocksdb::Tickers::BLOCK_CACHE_FILTER_HIT},
        {"block_cache_data_hit", rocksdb::Tickers::BLOCK_CACHE_DATA_HIT},
        {"block_cache_miss", rocksdb::Tickers::BLOCK_CACHE_MISS},
        {"block_cache_index_miss", rocksdb::Tickers::BLOCK_CACHE_INDEX_MISS},
        {"block_cache_filter_miss", rocksdb::Tickers::BLOCK_CACHE_FILTER_MISS},
        {"block_cache_data_miss", rocksdb::Tickers::BLOCK_CACHE_DATA_MISS},
    };
    for (const auto &iter : block_cache_stats) {
      entries.emplace_back(iter.first, rocksdb_stats->getTickerCount(iter.second));
    }
  }

  entries.emplace_back("all_mem_tables", memtable_sizes);
  entries.emplace_back("cur_mem_tables", cur_memtable_sizes);
  entries.emplace_back("snapshots", num_snapshots);
  entries.emplace_back("num_immutable_tables", num_immutable_tables);
  entries.emplace_back("num_running_flushes", num_running_flushes);
  entries.emplace_back("memtable_flush_pending", memtable_flush_pending);
  entries.emplace_back("compaction_pending", compaction_pending);
  entries.emplace_back("num_running_compactions", num_running_compaction);
  entries.emplace_back("num_live_versions", num_live_versions);
  entries.emplace_back("num_super_version", num_super_version);
  entries.emplace_back("num_background_errors", num_background_errors);
  auto db_stats = storage->GetDBStats();
  entries.emplace_back("flush_count", db_stats->flush_count.load());
  entries.emplace_back("compaction_count", db_stats->compaction_count.load());
  entries.emplace_back("put_per_sec", stats.GetInstantaneousMetric(STATS_METRIC_ROCKSDB_PUT));
  entries.emplace_back("get_per_sec", stats.GetInstantaneousMetric(STATS_METRIC_ROCKSDB_GET) +
                                          stats.GetInstantaneousMetric(STATS_METRIC_ROCKSDB_MULTIGET));
  entries.emplace_back("seek_per_sec", stats.GetInstantaneousMetric(STATS_METRIC_ROCKSDB_SEEK));
  entries.emplace_back("next_per_sec", stats.GetInstantaneousMetric(STATS_METRIC_ROCKSDB_NEXT));
  entries.emplace_back("prev_per_sec", stats.GetInstantaneousMetric(STATS_METRIC_ROCKSDB_PREV));
  db_job_mu_.lock();
  entries.emplace_back("is_bgsaving", (is_bgsave_in_progress_ ? "yes" : "no"));
  entries.emplace_back("is_compacting", (db_compacting_ ? "yes" : "no"));
  db_job_mu_.unlock();

  return entries;
}