internal_stats.h 24.6 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
  enum InternalDBStatsType {
112 113 114 115 116 117 118 119 120
    kIntStatsWalFileBytes,
    kIntStatsWalFileSynced,
    kIntStatsBytesWritten,
    kIntStatsNumKeysWritten,
    kIntStatsWriteDoneByOther,
    kIntStatsWriteDoneBySelf,
    kIntStatsWriteWithWal,
    kIntStatsWriteStallMicros,
    kIntStatsNumMax,
121 122
  };

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
  void Clear() {
325
    for (int i = 0; i < kIntStatsNumMax; i++) {
S
Siying Dong 已提交
326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343
      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_[kIntStatsNumMax];
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
  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);
556 557
  bool HandleOldestSnapshotSequence(uint64_t* value, DBImpl* db,
                                    Version* version);
558
  bool HandleNumLiveVersions(uint64_t* value, DBImpl* db, Version* version);
559 560
  bool HandleCurrentSuperVersionNumber(uint64_t* value, DBImpl* db,
                                       Version* version);
561 562 563 564
  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);
565
  bool HandleLiveSstFilesSize(uint64_t* value, DBImpl* db, Version* version);
566 567 568 569 570 571
  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);
572
  bool HandleMinLogNumberToKeep(uint64_t* value, DBImpl* db, Version* version);
573 574
  bool HandleMinObsoleteSstNumberToKeep(uint64_t* value, DBImpl* db,
                                        Version* version);
575 576 577
  bool HandleActualDelayedWriteRate(uint64_t* value, DBImpl* db,
                                    Version* version);
  bool HandleIsWriteStopped(uint64_t* value, DBImpl* db, Version* version);
Y
Yi Wu 已提交
578 579
  bool HandleEstimateOldestKeyTime(uint64_t* value, DBImpl* db,
                                   Version* version);
Y
Yi Wu 已提交
580 581 582 583
  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);
584 585 586 587 588 589 590
  // 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_;

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

597 598 599 600 601
#else

class InternalStats {
 public:
  enum InternalCFStatsType {
602 603 604 605 606 607 608 609
    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,
610 611
    WRITE_STALLS_ENUM_MAX,
    BYTES_FLUSHED,
612
    BYTES_INGESTED_ADD_FILE,
613 614 615
    INGESTED_NUM_FILES_TOTAL,
    INGESTED_LEVEL0_NUM_FILES_TOTAL,
    INGESTED_NUM_KEYS_TOTAL,
616 617 618 619
    INTERNAL_CF_STATS_ENUM_MAX,
  };

  enum InternalDBStatsType {
620 621 622 623 624 625 626 627 628
    kIntStatsWalFileBytes,
    kIntStatsWalFileSynced,
    kIntStatsBytesWritten,
    kIntStatsNumKeysWritten,
    kIntStatsWriteDoneByOther,
    kIntStatsWriteDoneBySelf,
    kIntStatsWriteWithWal,
    kIntStatsWriteStallMicros,
    kIntStatsNumMax,
629 630
  };

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

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

647 648
    explicit CompactionStats() {}

649
    explicit CompactionStats(CompactionReason /*reason*/, int /*c*/) {}
650

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

653
    void Add(const CompactionStats& /*c*/) {}
654

655
    void Subtract(const CompactionStats& /*c*/) {}
656 657
  };

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

661
  void IncBytesMoved(int /*level*/, uint64_t /*amount*/) {}
662

663
  void AddCFStats(InternalCFStatsType /*type*/, uint64_t /*value*/) {}
664

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

668
  HistogramImpl* GetFileReadHist(int /*level*/) { return nullptr; }
669

670 671 672 673
  uint64_t GetBackgroundErrorCount() const { return 0; }

  uint64_t BumpAndGetBackgroundErrorCount() { return 0; }

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

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

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

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

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