internal_stats.h 26.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"
17
#include "rocksdb/system_clock.h"
I
Igor Canadi 已提交
18

19 20
class ColumnFamilyData;

21
namespace ROCKSDB_NAMESPACE {
22

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

26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45
// 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);
46 47

  // @param props Map of general properties to populate
48 49 50
  // @param suffix Argument portion of the property. (see handle_string)
  bool (InternalStats::*handle_map)(std::map<std::string, std::string>* props,
                                    Slice suffix);
51 52 53 54

  // 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);
55 56
};

57
extern const DBPropertyInfo* GetPropertyInfo(const Slice& property);
58 59

#ifndef ROCKSDB_LITE
T
Tomas Kolda 已提交
60
#undef SCORE
61 62 63 64
enum class LevelStatType {
  INVALID = 0,
  NUM_FILES,
  COMPACTED_FILES,
65
  SIZE_BYTES,
66 67 68 69 70 71 72 73 74 75 76
  SCORE,
  READ_GB,
  RN_GB,
  RNP1_GB,
  WRITE_GB,
  W_NEW_GB,
  MOVED_GB,
  WRITE_AMP,
  READ_MBPS,
  WRITE_MBPS,
  COMP_SEC,
77
  COMP_CPU_SEC,
78 79 80 81
  COMP_COUNT,
  AVG_SEC,
  KEY_IN,
  KEY_DROP,
82
  W_BLOB_GB,
83 84 85 86 87 88 89 90 91 92
  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 已提交
93 94
class InternalStats {
 public:
95 96
  static const std::map<LevelStatType, LevelStat> compaction_level_stats;

97
  enum InternalCFStatsType {
98 99 100 101 102 103 104 105
    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 已提交
106
    WRITE_STALLS_ENUM_MAX,
107
    BYTES_FLUSHED,
108
    BYTES_INGESTED_ADD_FILE,
109 110 111
    INGESTED_NUM_FILES_TOTAL,
    INGESTED_LEVEL0_NUM_FILES_TOTAL,
    INGESTED_NUM_KEYS_TOTAL,
112
    INTERNAL_CF_STATS_ENUM_MAX,
I
Igor Canadi 已提交
113 114
  };

115
  enum InternalDBStatsType {
116 117 118 119 120 121 122 123 124
    kIntStatsWalFileBytes,
    kIntStatsWalFileSynced,
    kIntStatsBytesWritten,
    kIntStatsNumKeysWritten,
    kIntStatsWriteDoneByOther,
    kIntStatsWriteDoneBySelf,
    kIntStatsWriteWithWal,
    kIntStatsWriteStallMicros,
    kIntStatsNumMax,
125 126
  };

127 128
  InternalStats(int num_levels, const std::shared_ptr<SystemClock>& clock,
                ColumnFamilyData* cfd)
129 130 131
      : db_stats_{},
        cf_stats_value_{},
        cf_stats_count_{},
132
        comp_stats_(num_levels),
133
        comp_stats_by_pri_(Env::Priority::TOTAL),
134
        file_read_latency_(num_levels),
135
        bg_error_count_(0),
I
Igor Canadi 已提交
136
        number_levels_(num_levels),
137
        clock_(clock),
138
        cfd_(cfd),
139
        started_at_(clock->NowMicros()) {}
I
Igor Canadi 已提交
140

141
  // Per level compaction stats.  comp_stats_[level] stores the stats for
I
Igor Canadi 已提交
142 143 144
  // compactions that produced data for the specified "level".
  struct CompactionStats {
    uint64_t micros;
145
    uint64_t cpu_micros;
I
Igor Canadi 已提交
146

147
    // The number of bytes read from all non-output levels (table files)
148
    uint64_t bytes_read_non_output_levels;
I
Igor Canadi 已提交
149

150
    // The number of bytes read from the compaction output level (table files)
151
    uint64_t bytes_read_output_level;
I
Igor Canadi 已提交
152

153
    // Total number of bytes written to table files during compaction
154
    uint64_t bytes_written;
I
Igor Canadi 已提交
155

156 157 158 159
    // Total number of bytes written to blob files during compaction
    uint64_t bytes_written_blob;

    // Total number of bytes moved to the output level (table files)
160 161
    uint64_t bytes_moved;

162 163
    // The number of compaction input files in all non-output levels (table
    // files)
164
    int num_input_files_in_non_output_levels;
I
Igor Canadi 已提交
165

166
    // The number of compaction input files in the output level (table files)
167
    int num_input_files_in_output_level;
I
Igor Canadi 已提交
168

169
    // The number of compaction output files (table files)
170
    int num_output_files;
I
Igor Canadi 已提交
171

172 173 174
    // The number of compaction output files (blob files)
    int num_output_files_blob;

175
    // Total incoming entries during compaction between levels N and N+1
S
sdong 已提交
176
    uint64_t num_input_records;
177 178

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

I
Igor Canadi 已提交
182 183 184
    // Number of compactions done
    int count;

185 186 187 188 189
    // Number of compactions done per CompactionReason
    int counts[static_cast<int>(CompactionReason::kNumOfReasons)];

    explicit CompactionStats()
        : micros(0),
190
          cpu_micros(0),
191 192 193
          bytes_read_non_output_levels(0),
          bytes_read_output_level(0),
          bytes_written(0),
194
          bytes_written_blob(0),
195 196 197 198
          bytes_moved(0),
          num_input_files_in_non_output_levels(0),
          num_input_files_in_output_level(0),
          num_output_files(0),
199
          num_output_files_blob(0),
200 201 202 203 204 205 206 207 208 209
          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 已提交
210
        : micros(0),
211
          cpu_micros(0),
212 213
          bytes_read_non_output_levels(0),
          bytes_read_output_level(0),
I
Igor Canadi 已提交
214
          bytes_written(0),
215
          bytes_written_blob(0),
216
          bytes_moved(0),
217 218 219
          num_input_files_in_non_output_levels(0),
          num_input_files_in_output_level(0),
          num_output_files(0),
220
          num_output_files_blob(0),
221 222
          num_input_records(0),
          num_dropped_records(0),
223 224 225 226 227 228 229 230 231 232 233 234
          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 已提交
235

236 237
    explicit CompactionStats(const CompactionStats& c)
        : micros(c.micros),
238
          cpu_micros(c.cpu_micros),
239 240
          bytes_read_non_output_levels(c.bytes_read_non_output_levels),
          bytes_read_output_level(c.bytes_read_output_level),
241
          bytes_written(c.bytes_written),
242
          bytes_written_blob(c.bytes_written_blob),
243
          bytes_moved(c.bytes_moved),
244 245
          num_input_files_in_non_output_levels(
              c.num_input_files_in_non_output_levels),
246
          num_input_files_in_output_level(c.num_input_files_in_output_level),
247
          num_output_files(c.num_output_files),
248
          num_output_files_blob(c.num_output_files_blob),
249 250
          num_input_records(c.num_input_records),
          num_dropped_records(c.num_dropped_records),
251 252 253 254 255 256
          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];
      }
    }
257

258 259 260 261 262 263
    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;
264
      bytes_written_blob = c.bytes_written_blob;
265 266 267 268 269
      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;
270
      num_output_files_blob = c.num_output_files_blob;
271 272 273 274 275 276 277 278 279 280 281
      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 已提交
282 283
    void Clear() {
      this->micros = 0;
284
      this->cpu_micros = 0;
S
Siying Dong 已提交
285 286 287
      this->bytes_read_non_output_levels = 0;
      this->bytes_read_output_level = 0;
      this->bytes_written = 0;
288
      this->bytes_written_blob = 0;
S
Siying Dong 已提交
289 290 291 292
      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;
293
      this->num_output_files_blob = 0;
S
Siying Dong 已提交
294 295 296
      this->num_input_records = 0;
      this->num_dropped_records = 0;
      this->count = 0;
297 298 299 300
      int num_of_reasons = static_cast<int>(CompactionReason::kNumOfReasons);
      for (int i = 0; i < num_of_reasons; i++) {
        counts[i] = 0;
      }
S
Siying Dong 已提交
301 302
    }

I
Igor Canadi 已提交
303 304
    void Add(const CompactionStats& c) {
      this->micros += c.micros;
305
      this->cpu_micros += c.cpu_micros;
306 307
      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 已提交
308
      this->bytes_written += c.bytes_written;
309
      this->bytes_written_blob += c.bytes_written_blob;
310
      this->bytes_moved += c.bytes_moved;
311 312 313 314 315
      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;
316
      this->num_output_files_blob += c.num_output_files_blob;
317 318
      this->num_input_records += c.num_input_records;
      this->num_dropped_records += c.num_dropped_records;
L
Lei Jin 已提交
319
      this->count += c.count;
320 321 322 323
      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 已提交
324
    }
325 326 327

    void Subtract(const CompactionStats& c) {
      this->micros -= c.micros;
328
      this->cpu_micros -= c.cpu_micros;
329 330
      this->bytes_read_non_output_levels -= c.bytes_read_non_output_levels;
      this->bytes_read_output_level -= c.bytes_read_output_level;
331
      this->bytes_written -= c.bytes_written;
332
      this->bytes_written_blob -= c.bytes_written_blob;
333
      this->bytes_moved -= c.bytes_moved;
334 335 336 337 338
      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;
339
      this->num_output_files_blob -= c.num_output_files_blob;
340 341
      this->num_input_records -= c.num_input_records;
      this->num_dropped_records -= c.num_dropped_records;
342
      this->count -= c.count;
343 344 345 346
      int num_of_reasons = static_cast<int>(CompactionReason::kNumOfReasons);
      for (int i = 0; i < num_of_reasons; i++) {
        counts[i] -= c.counts[i];
      }
347
    }
I
Igor Canadi 已提交
348 349
  };

S
Siying Dong 已提交
350
  void Clear() {
351
    for (int i = 0; i < kIntStatsNumMax; i++) {
S
Siying Dong 已提交
352 353 354 355 356 357 358 359 360 361 362 363
      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();
    }
364
    blob_file_read_latency_.Clear();
S
Siying Dong 已提交
365 366 367
    cf_stats_snapshot_.Clear();
    db_stats_snapshot_.Clear();
    bg_error_count_ = 0;
368
    started_at_ = clock_->NowMicros();
S
Siying Dong 已提交
369 370
  }

371 372
  void AddCompactionStats(int level, Env::Priority thread_pri,
                          const CompactionStats& stats) {
373
    comp_stats_[level].Add(stats);
374
    comp_stats_by_pri_[thread_pri].Add(stats);
I
Igor Canadi 已提交
375 376
  }

377 378 379 380
  void IncBytesMoved(int level, uint64_t amount) {
    comp_stats_[level].bytes_moved += amount;
  }

381 382 383
  void AddCFStats(InternalCFStatsType type, uint64_t value) {
    cf_stats_value_[type] += value;
    ++cf_stats_count_[type];
I
Igor Canadi 已提交
384 385
  }

386 387
  void AddDBStats(InternalDBStatsType type, uint64_t value,
                  bool concurrent = false) {
388
    auto& v = db_stats_[type];
389 390 391 392 393 394
    if (concurrent) {
      v.fetch_add(value, std::memory_order_relaxed);
    } else {
      v.store(v.load(std::memory_order_relaxed) + value,
              std::memory_order_relaxed);
    }
395 396 397 398
  }

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

401 402 403 404
  HistogramImpl* GetFileReadHist(int level) {
    return &file_read_latency_[level];
  }

405 406
  HistogramImpl* GetBlobFileReadHist() { return &blob_file_read_latency_; }

407 408 409 410
  uint64_t GetBackgroundErrorCount() const { return bg_error_count_; }

  uint64_t BumpAndGetBackgroundErrorCount() { return ++bg_error_count_; }

411 412 413
  bool GetStringProperty(const DBPropertyInfo& property_info,
                         const Slice& property, std::string* value);

414 415
  bool GetMapProperty(const DBPropertyInfo& property_info,
                      const Slice& property,
416
                      std::map<std::string, std::string>* value);
417

418 419
  bool GetIntProperty(const DBPropertyInfo& property_info, uint64_t* value,
                      DBImpl* db);
I
Igor Canadi 已提交
420

421 422
  bool GetIntPropertyOutOfMutex(const DBPropertyInfo& property_info,
                                Version* version, uint64_t* value);
423

424 425
  const uint64_t* TEST_GetCFStatsValue() const { return cf_stats_value_; }

426 427 428 429
  const std::vector<CompactionStats>& TEST_GetCompactionStats() const {
    return comp_stats_;
  }

430 431 432
  // 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;
433

I
Igor Canadi 已提交
434
 private:
435
  void DumpDBStats(std::string* value);
436
  void DumpCFMapStats(std::map<std::string, std::string>* cf_stats);
437
  void DumpCFMapStats(
438 439
      std::map<int, std::map<LevelStatType, double>>* level_stats,
      CompactionStats* compaction_stats_sum);
440 441
  void DumpCFMapStatsByPriority(
      std::map<int, std::map<LevelStatType, double>>* priorities_stats);
442
  void DumpCFMapStatsIOStalls(std::map<std::string, std::string>* cf_stats);
443
  void DumpCFStats(std::string* value);
444 445
  void DumpCFStatsNoFileHistogram(std::string* value);
  void DumpCFFileHistogram(std::string* value);
446

Y
Yi Wu 已提交
447 448
  bool HandleBlockCacheStat(Cache** block_cache);

449
  // Per-DB stats
450
  std::atomic<uint64_t> db_stats_[kIntStatsNumMax];
451
  // Per-ColumnFamily stats
452 453
  uint64_t cf_stats_value_[INTERNAL_CF_STATS_ENUM_MAX];
  uint64_t cf_stats_count_[INTERNAL_CF_STATS_ENUM_MAX];
454 455
  // Per-ColumnFamily/level compaction stats
  std::vector<CompactionStats> comp_stats_;
456
  std::vector<CompactionStats> comp_stats_by_pri_;
457
  std::vector<HistogramImpl> file_read_latency_;
458
  HistogramImpl blob_file_read_latency_;
I
Igor Canadi 已提交
459 460

  // Used to compute per-interval statistics
461 462 463
  struct CFStatsSnapshot {
    // ColumnFamily-level stats
    CompactionStats comp_stats;
464
    uint64_t ingest_bytes_flush;      // Bytes written to L0 (Flush)
465
    uint64_t stall_count;             // Stall count
466 467 468 469 470
    // 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;
471

472 473 474 475 476 477
    // 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

478
    CFStatsSnapshot()
479
        : ingest_bytes_flush(0),
480 481 482 483
          stall_count(0),
          compact_bytes_write(0),
          compact_bytes_read(0),
          compact_micros(0),
484 485 486 487 488
          seconds_up(0),
          ingest_bytes_addfile(0),
          ingest_files_addfile(0),
          ingest_l0_files_addfile(0),
          ingest_keys_addfile(0) {}
S
Siying Dong 已提交
489 490 491 492 493 494 495 496 497 498 499 500 501 502

    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;
    }
503 504 505 506 507 508 509 510
  } 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 已提交
511 512
    // These count the number of writes processed by the calling thread or
    // another thread.
513 514
    uint64_t write_other;
    uint64_t write_self;
S
sdong 已提交
515 516 517 518 519
    // 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 已提交
520 521
    // Total time writes delayed by stalls.
    uint64_t write_stall_micros;
522 523 524 525 526 527 528 529 530
    double seconds_up;

    DBStatsSnapshot()
        : ingest_bytes(0),
          wal_bytes(0),
          wal_synced(0),
          write_with_wal(0),
          write_other(0),
          write_self(0),
531
          num_keys_written(0),
S
sdong 已提交
532
          write_stall_micros(0),
533
          seconds_up(0) {}
S
Siying Dong 已提交
534 535 536 537 538 539 540 541 542 543 544 545

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

548 549 550
  // 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);
551
  bool HandleCompressionRatioAtLevelPrefix(std::string* value, Slice suffix);
552 553
  bool HandleLevelStats(std::string* value, Slice suffix);
  bool HandleStats(std::string* value, Slice suffix);
554 555
  bool HandleCFMapStats(std::map<std::string, std::string>* compaction_stats,
                        Slice suffix);
556
  bool HandleCFStats(std::string* value, Slice suffix);
557 558
  bool HandleCFStatsNoFileHistogram(std::string* value, Slice suffix);
  bool HandleCFFileHistogram(std::string* value, Slice suffix);
559 560 561 562
  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);
563 564 565 566
  bool HandleAggregatedTablePropertiesMap(
      std::map<std::string, std::string>* values, Slice suffix);
  bool HandleAggregatedTablePropertiesAtLevelMap(
      std::map<std::string, std::string>* values, Slice suffix);
567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592
  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);
593 594
  bool HandleOldestSnapshotSequence(uint64_t* value, DBImpl* db,
                                    Version* version);
595
  bool HandleNumLiveVersions(uint64_t* value, DBImpl* db, Version* version);
596 597
  bool HandleCurrentSuperVersionNumber(uint64_t* value, DBImpl* db,
                                       Version* version);
598 599 600 601
  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);
602
  bool HandleLiveSstFilesSize(uint64_t* value, DBImpl* db, Version* version);
603 604 605 606 607 608
  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);
609
  bool HandleMinLogNumberToKeep(uint64_t* value, DBImpl* db, Version* version);
610 611
  bool HandleMinObsoleteSstNumberToKeep(uint64_t* value, DBImpl* db,
                                        Version* version);
612 613 614
  bool HandleActualDelayedWriteRate(uint64_t* value, DBImpl* db,
                                    Version* version);
  bool HandleIsWriteStopped(uint64_t* value, DBImpl* db, Version* version);
Y
Yi Wu 已提交
615 616
  bool HandleEstimateOldestKeyTime(uint64_t* value, DBImpl* db,
                                   Version* version);
Y
Yi Wu 已提交
617 618 619 620
  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);
621 622 623 624 625 626 627
  // 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_;

628
  const int number_levels_;
629
  const std::shared_ptr<SystemClock> clock_;
630
  ColumnFamilyData* cfd_;
S
Siying Dong 已提交
631
  uint64_t started_at_;
I
Igor Canadi 已提交
632 633
};

634 635 636 637 638
#else

class InternalStats {
 public:
  enum InternalCFStatsType {
639 640 641 642 643 644 645 646
    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,
647 648
    WRITE_STALLS_ENUM_MAX,
    BYTES_FLUSHED,
649
    BYTES_INGESTED_ADD_FILE,
650 651 652
    INGESTED_NUM_FILES_TOTAL,
    INGESTED_LEVEL0_NUM_FILES_TOTAL,
    INGESTED_NUM_KEYS_TOTAL,
653 654 655 656
    INTERNAL_CF_STATS_ENUM_MAX,
  };

  enum InternalDBStatsType {
657 658 659 660 661 662 663 664 665
    kIntStatsWalFileBytes,
    kIntStatsWalFileSynced,
    kIntStatsBytesWritten,
    kIntStatsNumKeysWritten,
    kIntStatsWriteDoneByOther,
    kIntStatsWriteDoneBySelf,
    kIntStatsWriteWithWal,
    kIntStatsWriteStallMicros,
    kIntStatsNumMax,
666 667
  };

668 669 670
  InternalStats(int /*num_levels*/,
                const std::shared_ptr<SystemClock>& /*clock*/,
                ColumnFamilyData* /*cfd*/) {}
671 672 673

  struct CompactionStats {
    uint64_t micros;
674
    uint64_t cpu_micros;
675 676
    uint64_t bytes_read_non_output_levels;
    uint64_t bytes_read_output_level;
677
    uint64_t bytes_written;
678
    uint64_t bytes_written_blob;
679
    uint64_t bytes_moved;
680 681 682
    int num_input_files_in_non_output_levels;
    int num_input_files_in_output_level;
    int num_output_files;
683
    int num_output_files_blob;
684 685 686 687
    uint64_t num_input_records;
    uint64_t num_dropped_records;
    int count;

688 689
    explicit CompactionStats() {}

690
    explicit CompactionStats(CompactionReason /*reason*/, int /*c*/) {}
691

692
    explicit CompactionStats(const CompactionStats& /*c*/) {}
693

694
    void Add(const CompactionStats& /*c*/) {}
695

696
    void Subtract(const CompactionStats& /*c*/) {}
697 698
  };

699 700
  void AddCompactionStats(int /*level*/, Env::Priority /*thread_pri*/,
                          const CompactionStats& /*stats*/) {}
701

702
  void IncBytesMoved(int /*level*/, uint64_t /*amount*/) {}
703

704
  void AddCFStats(InternalCFStatsType /*type*/, uint64_t /*value*/) {}
705

706 707
  void AddDBStats(InternalDBStatsType /*type*/, uint64_t /*value*/,
                  bool /*concurrent */ = false) {}
708

709
  HistogramImpl* GetFileReadHist(int /*level*/) { return nullptr; }
710

711 712
  HistogramImpl* GetBlobFileReadHist() { return nullptr; }

713 714 715 716
  uint64_t GetBackgroundErrorCount() const { return 0; }

  uint64_t BumpAndGetBackgroundErrorCount() { return 0; }

717 718
  bool GetStringProperty(const DBPropertyInfo& /*property_info*/,
                         const Slice& /*property*/, std::string* /*value*/) {
719 720
    return false;
  }
721

722 723 724
  bool GetMapProperty(const DBPropertyInfo& /*property_info*/,
                      const Slice& /*property*/,
                      std::map<std::string, std::string>* /*value*/) {
725 726 727
    return false;
  }

728 729
  bool GetIntProperty(const DBPropertyInfo& /*property_info*/, uint64_t* /*value*/,
                      DBImpl* /*db*/) const {
730 731
    return false;
  }
732

733 734
  bool GetIntPropertyOutOfMutex(const DBPropertyInfo& /*property_info*/,
                                Version* /*version*/, uint64_t* /*value*/) const {
735 736
    return false;
  }
737 738 739
};
#endif  // !ROCKSDB_LITE

740
}  // namespace ROCKSDB_NAMESPACE