internal_stats.h 24.5 KB
Newer Older
1
//  Copyright (c) 2011-present, Facebook, Inc.  All rights reserved.
S
Siying Dong 已提交
2 3 4
//  This source code is licensed under both the GPLv2 (found in the
//  COPYING file in the root directory) and Apache 2.0 License
//  (found in the LICENSE.Apache file in the root directory).
I
Igor Canadi 已提交
5 6 7 8 9 10 11
//
// Copyright (c) 2011 The LevelDB Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file. See the AUTHORS file for names of contributors.
//

#pragma once
12
#include <map>
I
Igor Canadi 已提交
13
#include <string>
14 15 16
#include <vector>

#include "db/version_set.h"
I
Igor Canadi 已提交
17

18 19
class ColumnFamilyData;

I
Igor Canadi 已提交
20
namespace rocksdb {
21

22
class DBImpl;
S
Siying Dong 已提交
23
class MemTableList;
24

25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44
// Config for retrieving a property's value.
struct DBPropertyInfo {
  bool need_out_of_mutex;

  // gcc had an internal error for initializing union of pointer-to-member-
  // functions. Workaround is to populate exactly one of the following function
  // pointers with a non-nullptr value.

  // @param value Value-result argument for storing the property's string value
  // @param suffix Argument portion of the property. For example, suffix would
  //      be "5" for the property "rocksdb.num-files-at-level5". So far, only
  //      certain string properties take an argument.
  bool (InternalStats::*handle_string)(std::string* value, Slice suffix);

  // @param value Value-result argument for storing the property's uint64 value
  // @param db Many of the int properties rely on DBImpl methods.
  // @param version Version is needed in case the property is retrieved without
  //      holding db mutex, which is only supported for int properties.
  bool (InternalStats::*handle_int)(uint64_t* value, DBImpl* db,
                                    Version* version);
45 46 47

  // @param props Map of general properties to populate
  bool (InternalStats::*handle_map)(std::map<std::string, std::string>* props);
48 49 50 51

  // handle the string type properties rely on DBImpl methods
  // @param value Value-result argument for storing the property's string value
  bool (DBImpl::*handle_string_dbimpl)(std::string* value);
52 53
};

54
extern const DBPropertyInfo* GetPropertyInfo(const Slice& property);
55 56

#ifndef ROCKSDB_LITE
T
Tomas Kolda 已提交
57
#undef SCORE
58 59 60 61
enum class LevelStatType {
  INVALID = 0,
  NUM_FILES,
  COMPACTED_FILES,
62
  SIZE_BYTES,
63 64 65 66 67 68 69 70 71 72 73
  SCORE,
  READ_GB,
  RN_GB,
  RNP1_GB,
  WRITE_GB,
  W_NEW_GB,
  MOVED_GB,
  WRITE_AMP,
  READ_MBPS,
  WRITE_MBPS,
  COMP_SEC,
74
  COMP_CPU_SEC,
75 76 77 78 79 80 81 82 83 84 85 86 87 88
  COMP_COUNT,
  AVG_SEC,
  KEY_IN,
  KEY_DROP,
  TOTAL  // total number of types
};

struct LevelStat {
  // This what will be L?.property_name in the flat map returned to the user
  std::string property_name;
  // This will be what we will print in the header in the cli
  std::string header_name;
};

I
Igor Canadi 已提交
89 90
class InternalStats {
 public:
91 92
  static const std::map<LevelStatType, LevelStat> compaction_level_stats;

93
  enum InternalCFStatsType {
94 95 96 97 98 99 100 101
    L0_FILE_COUNT_LIMIT_SLOWDOWNS,
    LOCKED_L0_FILE_COUNT_LIMIT_SLOWDOWNS,
    MEMTABLE_LIMIT_STOPS,
    MEMTABLE_LIMIT_SLOWDOWNS,
    L0_FILE_COUNT_LIMIT_STOPS,
    LOCKED_L0_FILE_COUNT_LIMIT_STOPS,
    PENDING_COMPACTION_BYTES_LIMIT_SLOWDOWNS,
    PENDING_COMPACTION_BYTES_LIMIT_STOPS,
I
Igor Canadi 已提交
102
    WRITE_STALLS_ENUM_MAX,
103
    BYTES_FLUSHED,
104
    BYTES_INGESTED_ADD_FILE,
105 106 107
    INGESTED_NUM_FILES_TOTAL,
    INGESTED_LEVEL0_NUM_FILES_TOTAL,
    INGESTED_NUM_KEYS_TOTAL,
108
    INTERNAL_CF_STATS_ENUM_MAX,
I
Igor Canadi 已提交
109 110
  };

111 112 113 114
  enum InternalDBStatsType {
    WAL_FILE_BYTES,
    WAL_FILE_SYNCED,
    BYTES_WRITTEN,
S
sdong 已提交
115
    NUMBER_KEYS_WRITTEN,
116 117 118
    WRITE_DONE_BY_OTHER,
    WRITE_DONE_BY_SELF,
    WRITE_WITH_WAL,
S
sdong 已提交
119
    WRITE_STALL_MICROS,
120 121 122
    INTERNAL_DB_STATS_ENUM_MAX,
  };

123
  InternalStats(int num_levels, Env* env, ColumnFamilyData* cfd)
124 125 126
      : db_stats_{},
        cf_stats_value_{},
        cf_stats_count_{},
127
        comp_stats_(num_levels),
128
        comp_stats_by_pri_(Env::Priority::TOTAL),
129
        file_read_latency_(num_levels),
130
        bg_error_count_(0),
I
Igor Canadi 已提交
131 132
        number_levels_(num_levels),
        env_(env),
133
        cfd_(cfd),
134
        started_at_(env->NowMicros()) {}
I
Igor Canadi 已提交
135

136
  // Per level compaction stats.  comp_stats_[level] stores the stats for
I
Igor Canadi 已提交
137 138 139
  // compactions that produced data for the specified "level".
  struct CompactionStats {
    uint64_t micros;
140
    uint64_t cpu_micros;
I
Igor Canadi 已提交
141

142 143
    // The number of bytes read from all non-output levels
    uint64_t bytes_read_non_output_levels;
I
Igor Canadi 已提交
144

145 146
    // The number of bytes read from the compaction output level.
    uint64_t bytes_read_output_level;
I
Igor Canadi 已提交
147

148
    // Total number of bytes written during compaction
149
    uint64_t bytes_written;
I
Igor Canadi 已提交
150

151
    // Total number of bytes moved to the output level
152 153
    uint64_t bytes_moved;

154 155
    // The number of compaction input files in all non-output levels.
    int num_input_files_in_non_output_levels;
I
Igor Canadi 已提交
156

157 158
    // The number of compaction input files in the output level.
    int num_input_files_in_output_level;
I
Igor Canadi 已提交
159

160 161
    // The number of compaction output files.
    int num_output_files;
I
Igor Canadi 已提交
162

163
    // Total incoming entries during compaction between levels N and N+1
S
sdong 已提交
164
    uint64_t num_input_records;
165 166 167

    // Accumulated diff number of entries
    // (num input entries - num output entires) for compaction  levels N and N+1
S
sdong 已提交
168
    uint64_t num_dropped_records;
169

I
Igor Canadi 已提交
170 171 172
    // Number of compactions done
    int count;

173 174 175 176 177
    // Number of compactions done per CompactionReason
    int counts[static_cast<int>(CompactionReason::kNumOfReasons)];

    explicit CompactionStats()
        : micros(0),
178
          cpu_micros(0),
179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195
          bytes_read_non_output_levels(0),
          bytes_read_output_level(0),
          bytes_written(0),
          bytes_moved(0),
          num_input_files_in_non_output_levels(0),
          num_input_files_in_output_level(0),
          num_output_files(0),
          num_input_records(0),
          num_dropped_records(0),
          count(0) {
      int num_of_reasons = static_cast<int>(CompactionReason::kNumOfReasons);
      for (int i = 0; i < num_of_reasons; i++) {
        counts[i] = 0;
      }
    }

    explicit CompactionStats(CompactionReason reason, int c)
I
Igor Canadi 已提交
196
        : micros(0),
197
          cpu_micros(0),
198 199
          bytes_read_non_output_levels(0),
          bytes_read_output_level(0),
I
Igor Canadi 已提交
200
          bytes_written(0),
201
          bytes_moved(0),
202 203 204
          num_input_files_in_non_output_levels(0),
          num_input_files_in_output_level(0),
          num_output_files(0),
205 206
          num_input_records(0),
          num_dropped_records(0),
207 208 209 210 211 212 213 214 215 216 217 218
          count(c) {
      int num_of_reasons = static_cast<int>(CompactionReason::kNumOfReasons);
      for (int i = 0; i < num_of_reasons; i++) {
        counts[i] = 0;
      }
      int r = static_cast<int>(reason);
      if (r >= 0 && r < num_of_reasons) {
        counts[r] = c;
      } else {
        count = 0;
      }
    }
I
Igor Canadi 已提交
219

220 221
    explicit CompactionStats(const CompactionStats& c)
        : micros(c.micros),
222
          cpu_micros(c.cpu_micros),
223 224
          bytes_read_non_output_levels(c.bytes_read_non_output_levels),
          bytes_read_output_level(c.bytes_read_output_level),
225
          bytes_written(c.bytes_written),
226
          bytes_moved(c.bytes_moved),
227 228
          num_input_files_in_non_output_levels(
              c.num_input_files_in_non_output_levels),
229
          num_input_files_in_output_level(c.num_input_files_in_output_level),
230
          num_output_files(c.num_output_files),
231 232
          num_input_records(c.num_input_records),
          num_dropped_records(c.num_dropped_records),
233 234 235 236 237 238
          count(c.count) {
      int num_of_reasons = static_cast<int>(CompactionReason::kNumOfReasons);
      for (int i = 0; i < num_of_reasons; i++) {
        counts[i] = c.counts[i];
      }
    }
239

240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261
    CompactionStats& operator=(const CompactionStats& c) {
      micros = c.micros;
      cpu_micros = c.cpu_micros;
      bytes_read_non_output_levels = c.bytes_read_non_output_levels;
      bytes_read_output_level = c.bytes_read_output_level;
      bytes_written = c.bytes_written;
      bytes_moved = c.bytes_moved;
      num_input_files_in_non_output_levels =
          c.num_input_files_in_non_output_levels;
      num_input_files_in_output_level = c.num_input_files_in_output_level;
      num_output_files = c.num_output_files;
      num_input_records = c.num_input_records;
      num_dropped_records = c.num_dropped_records;
      count = c.count;

      int num_of_reasons = static_cast<int>(CompactionReason::kNumOfReasons);
      for (int i = 0; i < num_of_reasons; i++) {
        counts[i] = c.counts[i];
      }
      return *this;
    }

S
Siying Dong 已提交
262 263
    void Clear() {
      this->micros = 0;
264
      this->cpu_micros = 0;
S
Siying Dong 已提交
265 266 267 268 269 270 271 272 273 274
      this->bytes_read_non_output_levels = 0;
      this->bytes_read_output_level = 0;
      this->bytes_written = 0;
      this->bytes_moved = 0;
      this->num_input_files_in_non_output_levels = 0;
      this->num_input_files_in_output_level = 0;
      this->num_output_files = 0;
      this->num_input_records = 0;
      this->num_dropped_records = 0;
      this->count = 0;
275 276 277 278
      int num_of_reasons = static_cast<int>(CompactionReason::kNumOfReasons);
      for (int i = 0; i < num_of_reasons; i++) {
        counts[i] = 0;
      }
S
Siying Dong 已提交
279 280
    }

I
Igor Canadi 已提交
281 282
    void Add(const CompactionStats& c) {
      this->micros += c.micros;
283
      this->cpu_micros += c.cpu_micros;
284 285
      this->bytes_read_non_output_levels += c.bytes_read_non_output_levels;
      this->bytes_read_output_level += c.bytes_read_output_level;
I
Igor Canadi 已提交
286
      this->bytes_written += c.bytes_written;
287
      this->bytes_moved += c.bytes_moved;
288 289 290 291 292
      this->num_input_files_in_non_output_levels +=
          c.num_input_files_in_non_output_levels;
      this->num_input_files_in_output_level +=
          c.num_input_files_in_output_level;
      this->num_output_files += c.num_output_files;
293 294
      this->num_input_records += c.num_input_records;
      this->num_dropped_records += c.num_dropped_records;
L
Lei Jin 已提交
295
      this->count += c.count;
296 297 298 299
      int num_of_reasons = static_cast<int>(CompactionReason::kNumOfReasons);
      for (int i = 0; i< num_of_reasons; i++) {
        counts[i] += c.counts[i];
      }
I
Igor Canadi 已提交
300
    }
301 302 303

    void Subtract(const CompactionStats& c) {
      this->micros -= c.micros;
304
      this->cpu_micros -= c.cpu_micros;
305 306
      this->bytes_read_non_output_levels -= c.bytes_read_non_output_levels;
      this->bytes_read_output_level -= c.bytes_read_output_level;
307
      this->bytes_written -= c.bytes_written;
308
      this->bytes_moved -= c.bytes_moved;
309 310 311 312 313
      this->num_input_files_in_non_output_levels -=
          c.num_input_files_in_non_output_levels;
      this->num_input_files_in_output_level -=
          c.num_input_files_in_output_level;
      this->num_output_files -= c.num_output_files;
314 315
      this->num_input_records -= c.num_input_records;
      this->num_dropped_records -= c.num_dropped_records;
316
      this->count -= c.count;
317 318 319 320
      int num_of_reasons = static_cast<int>(CompactionReason::kNumOfReasons);
      for (int i = 0; i < num_of_reasons; i++) {
        counts[i] -= c.counts[i];
      }
321
    }
I
Igor Canadi 已提交
322 323
  };

S
Siying Dong 已提交
324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343
  void Clear() {
    for (int i = 0; i < INTERNAL_DB_STATS_ENUM_MAX; i++) {
      db_stats_[i].store(0);
    }
    for (int i = 0; i < INTERNAL_CF_STATS_ENUM_MAX; i++) {
      cf_stats_count_[i] = 0;
      cf_stats_value_[i] = 0;
    }
    for (auto& comp_stat : comp_stats_) {
      comp_stat.Clear();
    }
    for (auto& h : file_read_latency_) {
      h.Clear();
    }
    cf_stats_snapshot_.Clear();
    db_stats_snapshot_.Clear();
    bg_error_count_ = 0;
    started_at_ = env_->NowMicros();
  }

344 345
  void AddCompactionStats(int level, Env::Priority thread_pri,
                          const CompactionStats& stats) {
346
    comp_stats_[level].Add(stats);
347
    comp_stats_by_pri_[thread_pri].Add(stats);
I
Igor Canadi 已提交
348 349
  }

350 351 352 353
  void IncBytesMoved(int level, uint64_t amount) {
    comp_stats_[level].bytes_moved += amount;
  }

354 355 356
  void AddCFStats(InternalCFStatsType type, uint64_t value) {
    cf_stats_value_[type] += value;
    ++cf_stats_count_[type];
I
Igor Canadi 已提交
357 358
  }

359 360
  void AddDBStats(InternalDBStatsType type, uint64_t value,
                  bool concurrent = false) {
361
    auto& v = db_stats_[type];
362 363 364 365 366 367
    if (concurrent) {
      v.fetch_add(value, std::memory_order_relaxed);
    } else {
      v.store(v.load(std::memory_order_relaxed) + value,
              std::memory_order_relaxed);
    }
368 369 370 371
  }

  uint64_t GetDBStats(InternalDBStatsType type) {
    return db_stats_[type].load(std::memory_order_relaxed);
I
Igor Canadi 已提交
372 373
  }

374 375 376 377
  HistogramImpl* GetFileReadHist(int level) {
    return &file_read_latency_[level];
  }

378 379 380 381
  uint64_t GetBackgroundErrorCount() const { return bg_error_count_; }

  uint64_t BumpAndGetBackgroundErrorCount() { return ++bg_error_count_; }

382 383 384
  bool GetStringProperty(const DBPropertyInfo& property_info,
                         const Slice& property, std::string* value);

385 386
  bool GetMapProperty(const DBPropertyInfo& property_info,
                      const Slice& property,
387
                      std::map<std::string, std::string>* value);
388

389 390
  bool GetIntProperty(const DBPropertyInfo& property_info, uint64_t* value,
                      DBImpl* db);
I
Igor Canadi 已提交
391

392 393
  bool GetIntPropertyOutOfMutex(const DBPropertyInfo& property_info,
                                Version* version, uint64_t* value);
394

395 396 397 398
  const std::vector<CompactionStats>& TEST_GetCompactionStats() const {
    return comp_stats_;
  }

399 400 401
  // Store a mapping from the user-facing DB::Properties string to our
  // DBPropertyInfo struct used internally for retrieving properties.
  static const std::unordered_map<std::string, DBPropertyInfo> ppt_name_to_info;
402

I
Igor Canadi 已提交
403
 private:
404
  void DumpDBStats(std::string* value);
405
  void DumpCFMapStats(std::map<std::string, std::string>* cf_stats);
406
  void DumpCFMapStats(
407 408
      std::map<int, std::map<LevelStatType, double>>* level_stats,
      CompactionStats* compaction_stats_sum);
409 410
  void DumpCFMapStatsByPriority(
      std::map<int, std::map<LevelStatType, double>>* priorities_stats);
411
  void DumpCFMapStatsIOStalls(std::map<std::string, std::string>* cf_stats);
412
  void DumpCFStats(std::string* value);
413 414
  void DumpCFStatsNoFileHistogram(std::string* value);
  void DumpCFFileHistogram(std::string* value);
415

Y
Yi Wu 已提交
416 417
  bool HandleBlockCacheStat(Cache** block_cache);

418
  // Per-DB stats
419
  std::atomic<uint64_t> db_stats_[INTERNAL_DB_STATS_ENUM_MAX];
420
  // Per-ColumnFamily stats
421 422
  uint64_t cf_stats_value_[INTERNAL_CF_STATS_ENUM_MAX];
  uint64_t cf_stats_count_[INTERNAL_CF_STATS_ENUM_MAX];
423 424
  // Per-ColumnFamily/level compaction stats
  std::vector<CompactionStats> comp_stats_;
425
  std::vector<CompactionStats> comp_stats_by_pri_;
426
  std::vector<HistogramImpl> file_read_latency_;
I
Igor Canadi 已提交
427 428

  // Used to compute per-interval statistics
429 430 431
  struct CFStatsSnapshot {
    // ColumnFamily-level stats
    CompactionStats comp_stats;
432
    uint64_t ingest_bytes_flush;      // Bytes written to L0 (Flush)
433
    uint64_t stall_count;             // Stall count
434 435 436 437 438
    // Stats from compaction jobs - bytes written, bytes read, duration.
    uint64_t compact_bytes_write;
    uint64_t compact_bytes_read;
    uint64_t compact_micros;
    double seconds_up;
439

440 441 442 443 444 445
    // AddFile specific stats
    uint64_t ingest_bytes_addfile;     // Total Bytes ingested
    uint64_t ingest_files_addfile;     // Total number of files ingested
    uint64_t ingest_l0_files_addfile;  // Total number of files ingested to L0
    uint64_t ingest_keys_addfile;      // Total number of keys ingested

446
    CFStatsSnapshot()
447
        : ingest_bytes_flush(0),
448 449 450 451
          stall_count(0),
          compact_bytes_write(0),
          compact_bytes_read(0),
          compact_micros(0),
452 453 454 455 456
          seconds_up(0),
          ingest_bytes_addfile(0),
          ingest_files_addfile(0),
          ingest_l0_files_addfile(0),
          ingest_keys_addfile(0) {}
S
Siying Dong 已提交
457 458 459 460 461 462 463 464 465 466 467 468 469 470

    void Clear() {
      comp_stats.Clear();
      ingest_bytes_flush = 0;
      stall_count = 0;
      compact_bytes_write = 0;
      compact_bytes_read = 0;
      compact_micros = 0;
      seconds_up = 0;
      ingest_bytes_addfile = 0;
      ingest_files_addfile = 0;
      ingest_l0_files_addfile = 0;
      ingest_keys_addfile = 0;
    }
471 472 473 474 475 476 477 478
  } cf_stats_snapshot_;

  struct DBStatsSnapshot {
    // DB-level stats
    uint64_t ingest_bytes;            // Bytes written by user
    uint64_t wal_bytes;               // Bytes written to WAL
    uint64_t wal_synced;              // Number of times WAL is synced
    uint64_t write_with_wal;          // Number of writes that request WAL
I
Igor Canadi 已提交
479 480
    // These count the number of writes processed by the calling thread or
    // another thread.
481 482
    uint64_t write_other;
    uint64_t write_self;
S
sdong 已提交
483 484 485 486 487
    // Total number of keys written. write_self and write_other measure number
    // of write requests written, Each of the write request can contain updates
    // to multiple keys. num_keys_written is total number of keys updated by all
    // those writes.
    uint64_t num_keys_written;
S
sdong 已提交
488 489
    // Total time writes delayed by stalls.
    uint64_t write_stall_micros;
490 491 492 493 494 495 496 497 498
    double seconds_up;

    DBStatsSnapshot()
        : ingest_bytes(0),
          wal_bytes(0),
          wal_synced(0),
          write_with_wal(0),
          write_other(0),
          write_self(0),
499
          num_keys_written(0),
S
sdong 已提交
500
          write_stall_micros(0),
501
          seconds_up(0) {}
S
Siying Dong 已提交
502 503 504 505 506 507 508 509 510 511 512 513

    void Clear() {
      ingest_bytes = 0;
      wal_bytes = 0;
      wal_synced = 0;
      write_with_wal = 0;
      write_other = 0;
      write_self = 0;
      num_keys_written = 0;
      write_stall_micros = 0;
      seconds_up = 0;
    }
514
  } db_stats_snapshot_;
I
Igor Canadi 已提交
515

516 517 518
  // Handler functions for getting property values. They use "value" as a value-
  // result argument, and return true upon successfully setting "value".
  bool HandleNumFilesAtLevel(std::string* value, Slice suffix);
519
  bool HandleCompressionRatioAtLevelPrefix(std::string* value, Slice suffix);
520 521
  bool HandleLevelStats(std::string* value, Slice suffix);
  bool HandleStats(std::string* value, Slice suffix);
522
  bool HandleCFMapStats(std::map<std::string, std::string>* compaction_stats);
523
  bool HandleCFStats(std::string* value, Slice suffix);
524 525
  bool HandleCFStatsNoFileHistogram(std::string* value, Slice suffix);
  bool HandleCFFileHistogram(std::string* value, Slice suffix);
526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556
  bool HandleDBStats(std::string* value, Slice suffix);
  bool HandleSsTables(std::string* value, Slice suffix);
  bool HandleAggregatedTableProperties(std::string* value, Slice suffix);
  bool HandleAggregatedTablePropertiesAtLevel(std::string* value, Slice suffix);
  bool HandleNumImmutableMemTable(uint64_t* value, DBImpl* db,
                                  Version* version);
  bool HandleNumImmutableMemTableFlushed(uint64_t* value, DBImpl* db,
                                         Version* version);
  bool HandleMemTableFlushPending(uint64_t* value, DBImpl* db,
                                  Version* version);
  bool HandleNumRunningFlushes(uint64_t* value, DBImpl* db, Version* version);
  bool HandleCompactionPending(uint64_t* value, DBImpl* db, Version* version);
  bool HandleNumRunningCompactions(uint64_t* value, DBImpl* db,
                                   Version* version);
  bool HandleBackgroundErrors(uint64_t* value, DBImpl* db, Version* version);
  bool HandleCurSizeActiveMemTable(uint64_t* value, DBImpl* db,
                                   Version* version);
  bool HandleCurSizeAllMemTables(uint64_t* value, DBImpl* db, Version* version);
  bool HandleSizeAllMemTables(uint64_t* value, DBImpl* db, Version* version);
  bool HandleNumEntriesActiveMemTable(uint64_t* value, DBImpl* db,
                                      Version* version);
  bool HandleNumEntriesImmMemTables(uint64_t* value, DBImpl* db,
                                    Version* version);
  bool HandleNumDeletesActiveMemTable(uint64_t* value, DBImpl* db,
                                      Version* version);
  bool HandleNumDeletesImmMemTables(uint64_t* value, DBImpl* db,
                                    Version* version);
  bool HandleEstimateNumKeys(uint64_t* value, DBImpl* db, Version* version);
  bool HandleNumSnapshots(uint64_t* value, DBImpl* db, Version* version);
  bool HandleOldestSnapshotTime(uint64_t* value, DBImpl* db, Version* version);
  bool HandleNumLiveVersions(uint64_t* value, DBImpl* db, Version* version);
557 558
  bool HandleCurrentSuperVersionNumber(uint64_t* value, DBImpl* db,
                                       Version* version);
559 560 561 562
  bool HandleIsFileDeletionsEnabled(uint64_t* value, DBImpl* db,
                                    Version* version);
  bool HandleBaseLevel(uint64_t* value, DBImpl* db, Version* version);
  bool HandleTotalSstFilesSize(uint64_t* value, DBImpl* db, Version* version);
563
  bool HandleLiveSstFilesSize(uint64_t* value, DBImpl* db, Version* version);
564 565 566 567 568 569
  bool HandleEstimatePendingCompactionBytes(uint64_t* value, DBImpl* db,
                                            Version* version);
  bool HandleEstimateTableReadersMem(uint64_t* value, DBImpl* db,
                                     Version* version);
  bool HandleEstimateLiveDataSize(uint64_t* value, DBImpl* db,
                                  Version* version);
570
  bool HandleMinLogNumberToKeep(uint64_t* value, DBImpl* db, Version* version);
571 572
  bool HandleMinObsoleteSstNumberToKeep(uint64_t* value, DBImpl* db,
                                        Version* version);
573 574 575
  bool HandleActualDelayedWriteRate(uint64_t* value, DBImpl* db,
                                    Version* version);
  bool HandleIsWriteStopped(uint64_t* value, DBImpl* db, Version* version);
Y
Yi Wu 已提交
576 577
  bool HandleEstimateOldestKeyTime(uint64_t* value, DBImpl* db,
                                   Version* version);
Y
Yi Wu 已提交
578 579 580 581
  bool HandleBlockCacheCapacity(uint64_t* value, DBImpl* db, Version* version);
  bool HandleBlockCacheUsage(uint64_t* value, DBImpl* db, Version* version);
  bool HandleBlockCachePinnedUsage(uint64_t* value, DBImpl* db,
                                   Version* version);
582 583 584 585 586 587 588
  // Total number of background errors encountered. Every time a flush task
  // or compaction task fails, this counter is incremented. The failure can
  // be caused by any possible reason, including file system errors, out of
  // resources, or input file corruption. Failing when retrying the same flush
  // or compaction will cause the counter to increase too.
  uint64_t bg_error_count_;

589
  const int number_levels_;
I
Igor Canadi 已提交
590
  Env* env_;
591
  ColumnFamilyData* cfd_;
S
Siying Dong 已提交
592
  uint64_t started_at_;
I
Igor Canadi 已提交
593 594
};

595 596 597 598 599
#else

class InternalStats {
 public:
  enum InternalCFStatsType {
600 601 602 603 604 605 606 607
    L0_FILE_COUNT_LIMIT_SLOWDOWNS,
    LOCKED_L0_FILE_COUNT_LIMIT_SLOWDOWNS,
    MEMTABLE_LIMIT_STOPS,
    MEMTABLE_LIMIT_SLOWDOWNS,
    L0_FILE_COUNT_LIMIT_STOPS,
    LOCKED_L0_FILE_COUNT_LIMIT_STOPS,
    PENDING_COMPACTION_BYTES_LIMIT_SLOWDOWNS,
    PENDING_COMPACTION_BYTES_LIMIT_STOPS,
608 609
    WRITE_STALLS_ENUM_MAX,
    BYTES_FLUSHED,
610
    BYTES_INGESTED_ADD_FILE,
611 612 613
    INGESTED_NUM_FILES_TOTAL,
    INGESTED_LEVEL0_NUM_FILES_TOTAL,
    INGESTED_NUM_KEYS_TOTAL,
614 615 616 617 618 619 620 621 622 623 624
    INTERNAL_CF_STATS_ENUM_MAX,
  };

  enum InternalDBStatsType {
    WAL_FILE_BYTES,
    WAL_FILE_SYNCED,
    BYTES_WRITTEN,
    NUMBER_KEYS_WRITTEN,
    WRITE_DONE_BY_OTHER,
    WRITE_DONE_BY_SELF,
    WRITE_WITH_WAL,
S
sdong 已提交
625
    WRITE_STALL_MICROS,
626 627 628
    INTERNAL_DB_STATS_ENUM_MAX,
  };

629
  InternalStats(int /*num_levels*/, Env* /*env*/, ColumnFamilyData* /*cfd*/) {}
630 631 632

  struct CompactionStats {
    uint64_t micros;
633
    uint64_t cpu_micros;
634 635
    uint64_t bytes_read_non_output_levels;
    uint64_t bytes_read_output_level;
636
    uint64_t bytes_written;
637
    uint64_t bytes_moved;
638 639 640
    int num_input_files_in_non_output_levels;
    int num_input_files_in_output_level;
    int num_output_files;
641 642 643 644
    uint64_t num_input_records;
    uint64_t num_dropped_records;
    int count;

645 646
    explicit CompactionStats() {}

647
    explicit CompactionStats(CompactionReason /*reason*/, int /*c*/) {}
648

649
    explicit CompactionStats(const CompactionStats& /*c*/) {}
650

651
    void Add(const CompactionStats& /*c*/) {}
652

653
    void Subtract(const CompactionStats& /*c*/) {}
654 655
  };

656 657
  void AddCompactionStats(int /*level*/, Env::Priority /*thread_pri*/,
                          const CompactionStats& /*stats*/) {}
658

659
  void IncBytesMoved(int /*level*/, uint64_t /*amount*/) {}
660

661
  void AddCFStats(InternalCFStatsType /*type*/, uint64_t /*value*/) {}
662

663 664
  void AddDBStats(InternalDBStatsType /*type*/, uint64_t /*value*/,
                  bool /*concurrent */ = false) {}
665

666
  HistogramImpl* GetFileReadHist(int /*level*/) { return nullptr; }
667

668 669 670 671
  uint64_t GetBackgroundErrorCount() const { return 0; }

  uint64_t BumpAndGetBackgroundErrorCount() { return 0; }

672 673
  bool GetStringProperty(const DBPropertyInfo& /*property_info*/,
                         const Slice& /*property*/, std::string* /*value*/) {
674 675
    return false;
  }
676

677 678 679
  bool GetMapProperty(const DBPropertyInfo& /*property_info*/,
                      const Slice& /*property*/,
                      std::map<std::string, std::string>* /*value*/) {
680 681 682
    return false;
  }

683 684
  bool GetIntProperty(const DBPropertyInfo& /*property_info*/, uint64_t* /*value*/,
                      DBImpl* /*db*/) const {
685 686
    return false;
  }
687

688 689
  bool GetIntPropertyOutOfMutex(const DBPropertyInfo& /*property_info*/,
                                Version* /*version*/, uint64_t* /*value*/) const {
690 691
    return false;
  }
692 693 694
};
#endif  // !ROCKSDB_LITE

I
Igor Canadi 已提交
695
}  // namespace rocksdb