internal_stats.h 23.3 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
        file_read_latency_(num_levels),
129
        bg_error_count_(0),
I
Igor Canadi 已提交
130 131
        number_levels_(num_levels),
        env_(env),
132
        cfd_(cfd),
133
        started_at_(env->NowMicros()) {}
I
Igor Canadi 已提交
134

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

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

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

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

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

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

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

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

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

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

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

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

    explicit CompactionStats()
        : micros(0),
177
          cpu_micros(0),
178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194
          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 已提交
195
        : micros(0),
196
          cpu_micros(0),
197 198
          bytes_read_non_output_levels(0),
          bytes_read_output_level(0),
I
Igor Canadi 已提交
199
          bytes_written(0),
200
          bytes_moved(0),
201 202 203
          num_input_files_in_non_output_levels(0),
          num_input_files_in_output_level(0),
          num_output_files(0),
204 205
          num_input_records(0),
          num_dropped_records(0),
206 207 208 209 210 211 212 213 214 215 216 217
          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 已提交
218

219 220
    explicit CompactionStats(const CompactionStats& c)
        : micros(c.micros),
221
          cpu_micros(c.cpu_micros),
222 223
          bytes_read_non_output_levels(c.bytes_read_non_output_levels),
          bytes_read_output_level(c.bytes_read_output_level),
224
          bytes_written(c.bytes_written),
225
          bytes_moved(c.bytes_moved),
226 227
          num_input_files_in_non_output_levels(
              c.num_input_files_in_non_output_levels),
228
          num_input_files_in_output_level(c.num_input_files_in_output_level),
229
          num_output_files(c.num_output_files),
230 231
          num_input_records(c.num_input_records),
          num_dropped_records(c.num_dropped_records),
232 233 234 235 236 237
          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];
      }
    }
238

S
Siying Dong 已提交
239 240
    void Clear() {
      this->micros = 0;
241
      this->cpu_micros = 0;
S
Siying Dong 已提交
242 243 244 245 246 247 248 249 250 251
      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;
252 253 254 255
      int num_of_reasons = static_cast<int>(CompactionReason::kNumOfReasons);
      for (int i = 0; i < num_of_reasons; i++) {
        counts[i] = 0;
      }
S
Siying Dong 已提交
256 257
    }

I
Igor Canadi 已提交
258 259
    void Add(const CompactionStats& c) {
      this->micros += c.micros;
260
      this->cpu_micros += c.cpu_micros;
261 262
      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 已提交
263
      this->bytes_written += c.bytes_written;
264
      this->bytes_moved += c.bytes_moved;
265 266 267 268 269
      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;
270 271
      this->num_input_records += c.num_input_records;
      this->num_dropped_records += c.num_dropped_records;
L
Lei Jin 已提交
272
      this->count += c.count;
273 274 275 276
      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 已提交
277
    }
278 279 280

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

S
Siying Dong 已提交
301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320
  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();
  }

I
Igor Canadi 已提交
321
  void AddCompactionStats(int level, const CompactionStats& stats) {
322
    comp_stats_[level].Add(stats);
I
Igor Canadi 已提交
323 324
  }

325 326 327 328
  void IncBytesMoved(int level, uint64_t amount) {
    comp_stats_[level].bytes_moved += amount;
  }

329 330 331
  void AddCFStats(InternalCFStatsType type, uint64_t value) {
    cf_stats_value_[type] += value;
    ++cf_stats_count_[type];
I
Igor Canadi 已提交
332 333
  }

334 335
  void AddDBStats(InternalDBStatsType type, uint64_t value,
                  bool concurrent = false) {
336
    auto& v = db_stats_[type];
337 338 339 340 341 342
    if (concurrent) {
      v.fetch_add(value, std::memory_order_relaxed);
    } else {
      v.store(v.load(std::memory_order_relaxed) + value,
              std::memory_order_relaxed);
    }
343 344 345 346
  }

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

349 350 351 352
  HistogramImpl* GetFileReadHist(int level) {
    return &file_read_latency_[level];
  }

353 354 355 356
  uint64_t GetBackgroundErrorCount() const { return bg_error_count_; }

  uint64_t BumpAndGetBackgroundErrorCount() { return ++bg_error_count_; }

357 358 359
  bool GetStringProperty(const DBPropertyInfo& property_info,
                         const Slice& property, std::string* value);

360 361
  bool GetMapProperty(const DBPropertyInfo& property_info,
                      const Slice& property,
362
                      std::map<std::string, std::string>* value);
363

364 365
  bool GetIntProperty(const DBPropertyInfo& property_info, uint64_t* value,
                      DBImpl* db);
I
Igor Canadi 已提交
366

367 368
  bool GetIntPropertyOutOfMutex(const DBPropertyInfo& property_info,
                                Version* version, uint64_t* value);
369

370 371 372 373
  const std::vector<CompactionStats>& TEST_GetCompactionStats() const {
    return comp_stats_;
  }

374 375 376
  // 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;
377

I
Igor Canadi 已提交
378
 private:
379
  void DumpDBStats(std::string* value);
380
  void DumpCFMapStats(std::map<std::string, std::string>* cf_stats);
381
  void DumpCFMapStats(
382 383
      std::map<int, std::map<LevelStatType, double>>* level_stats,
      CompactionStats* compaction_stats_sum);
384
  void DumpCFMapStatsIOStalls(std::map<std::string, std::string>* cf_stats);
385
  void DumpCFStats(std::string* value);
386 387
  void DumpCFStatsNoFileHistogram(std::string* value);
  void DumpCFFileHistogram(std::string* value);
388

Y
Yi Wu 已提交
389 390
  bool HandleBlockCacheStat(Cache** block_cache);

391
  // Per-DB stats
392
  std::atomic<uint64_t> db_stats_[INTERNAL_DB_STATS_ENUM_MAX];
393
  // Per-ColumnFamily stats
394 395
  uint64_t cf_stats_value_[INTERNAL_CF_STATS_ENUM_MAX];
  uint64_t cf_stats_count_[INTERNAL_CF_STATS_ENUM_MAX];
396 397
  // Per-ColumnFamily/level compaction stats
  std::vector<CompactionStats> comp_stats_;
398
  std::vector<HistogramImpl> file_read_latency_;
I
Igor Canadi 已提交
399 400

  // Used to compute per-interval statistics
401 402 403
  struct CFStatsSnapshot {
    // ColumnFamily-level stats
    CompactionStats comp_stats;
404
    uint64_t ingest_bytes_flush;      // Bytes written to L0 (Flush)
405
    uint64_t stall_count;             // Stall count
406 407 408 409 410
    // 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;
411

412 413 414 415 416 417
    // 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

418
    CFStatsSnapshot()
419
        : ingest_bytes_flush(0),
420 421 422 423
          stall_count(0),
          compact_bytes_write(0),
          compact_bytes_read(0),
          compact_micros(0),
424 425 426 427 428
          seconds_up(0),
          ingest_bytes_addfile(0),
          ingest_files_addfile(0),
          ingest_l0_files_addfile(0),
          ingest_keys_addfile(0) {}
S
Siying Dong 已提交
429 430 431 432 433 434 435 436 437 438 439 440 441 442

    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;
    }
443 444 445 446 447 448 449 450
  } 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 已提交
451 452
    // These count the number of writes processed by the calling thread or
    // another thread.
453 454
    uint64_t write_other;
    uint64_t write_self;
S
sdong 已提交
455 456 457 458 459
    // 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 已提交
460 461
    // Total time writes delayed by stalls.
    uint64_t write_stall_micros;
462 463 464 465 466 467 468 469 470
    double seconds_up;

    DBStatsSnapshot()
        : ingest_bytes(0),
          wal_bytes(0),
          wal_synced(0),
          write_with_wal(0),
          write_other(0),
          write_self(0),
471
          num_keys_written(0),
S
sdong 已提交
472
          write_stall_micros(0),
473
          seconds_up(0) {}
S
Siying Dong 已提交
474 475 476 477 478 479 480 481 482 483 484 485

    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;
    }
486
  } db_stats_snapshot_;
I
Igor Canadi 已提交
487

488 489 490
  // 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);
491
  bool HandleCompressionRatioAtLevelPrefix(std::string* value, Slice suffix);
492 493
  bool HandleLevelStats(std::string* value, Slice suffix);
  bool HandleStats(std::string* value, Slice suffix);
494
  bool HandleCFMapStats(std::map<std::string, std::string>* compaction_stats);
495
  bool HandleCFStats(std::string* value, Slice suffix);
496 497
  bool HandleCFStatsNoFileHistogram(std::string* value, Slice suffix);
  bool HandleCFFileHistogram(std::string* value, Slice suffix);
498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528
  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);
529 530
  bool HandleCurrentSuperVersionNumber(uint64_t* value, DBImpl* db,
                                       Version* version);
531 532 533 534
  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);
535
  bool HandleLiveSstFilesSize(uint64_t* value, DBImpl* db, Version* version);
536 537 538 539 540 541
  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);
542
  bool HandleMinLogNumberToKeep(uint64_t* value, DBImpl* db, Version* version);
543 544
  bool HandleMinObsoleteSstNumberToKeep(uint64_t* value, DBImpl* db,
                                        Version* version);
545 546 547
  bool HandleActualDelayedWriteRate(uint64_t* value, DBImpl* db,
                                    Version* version);
  bool HandleIsWriteStopped(uint64_t* value, DBImpl* db, Version* version);
Y
Yi Wu 已提交
548 549
  bool HandleEstimateOldestKeyTime(uint64_t* value, DBImpl* db,
                                   Version* version);
Y
Yi Wu 已提交
550 551 552 553
  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);
554 555 556 557 558 559 560
  // 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_;

561
  const int number_levels_;
I
Igor Canadi 已提交
562
  Env* env_;
563
  ColumnFamilyData* cfd_;
S
Siying Dong 已提交
564
  uint64_t started_at_;
I
Igor Canadi 已提交
565 566
};

567 568 569 570 571
#else

class InternalStats {
 public:
  enum InternalCFStatsType {
572 573 574 575 576 577 578 579
    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,
580 581
    WRITE_STALLS_ENUM_MAX,
    BYTES_FLUSHED,
582
    BYTES_INGESTED_ADD_FILE,
583 584 585
    INGESTED_NUM_FILES_TOTAL,
    INGESTED_LEVEL0_NUM_FILES_TOTAL,
    INGESTED_NUM_KEYS_TOTAL,
586 587 588 589 590 591 592 593 594 595 596
    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 已提交
597
    WRITE_STALL_MICROS,
598 599 600
    INTERNAL_DB_STATS_ENUM_MAX,
  };

601
  InternalStats(int /*num_levels*/, Env* /*env*/, ColumnFamilyData* /*cfd*/) {}
602 603 604

  struct CompactionStats {
    uint64_t micros;
605
    uint64_t cpu_micros;
606 607
    uint64_t bytes_read_non_output_levels;
    uint64_t bytes_read_output_level;
608
    uint64_t bytes_written;
609
    uint64_t bytes_moved;
610 611 612
    int num_input_files_in_non_output_levels;
    int num_input_files_in_output_level;
    int num_output_files;
613 614 615 616
    uint64_t num_input_records;
    uint64_t num_dropped_records;
    int count;

617 618
    explicit CompactionStats() {}

619
    explicit CompactionStats(CompactionReason /*reason*/, int /*c*/) {}
620

621
    explicit CompactionStats(const CompactionStats& /*c*/) {}
622

623
    void Add(const CompactionStats& /*c*/) {}
624

625
    void Subtract(const CompactionStats& /*c*/) {}
626 627
  };

628
  void AddCompactionStats(int /*level*/, const CompactionStats& /*stats*/) {}
629

630
  void IncBytesMoved(int /*level*/, uint64_t /*amount*/) {}
631

632
  void AddCFStats(InternalCFStatsType /*type*/, uint64_t /*value*/) {}
633

634 635
  void AddDBStats(InternalDBStatsType /*type*/, uint64_t /*value*/,
                  bool /*concurrent */ = false) {}
636

637
  HistogramImpl* GetFileReadHist(int /*level*/) { return nullptr; }
638

639 640 641 642
  uint64_t GetBackgroundErrorCount() const { return 0; }

  uint64_t BumpAndGetBackgroundErrorCount() { return 0; }

643 644
  bool GetStringProperty(const DBPropertyInfo& /*property_info*/,
                         const Slice& /*property*/, std::string* /*value*/) {
645 646
    return false;
  }
647

648 649 650
  bool GetMapProperty(const DBPropertyInfo& /*property_info*/,
                      const Slice& /*property*/,
                      std::map<std::string, std::string>* /*value*/) {
651 652 653
    return false;
  }

654 655
  bool GetIntProperty(const DBPropertyInfo& /*property_info*/, uint64_t* /*value*/,
                      DBImpl* /*db*/) const {
656 657
    return false;
  }
658

659 660
  bool GetIntPropertyOutOfMutex(const DBPropertyInfo& /*property_info*/,
                                Version* /*version*/, uint64_t* /*value*/) const {
661 662
    return false;
  }
663 664 665
};
#endif  // !ROCKSDB_LITE

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