internal_stats.h 22.7 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
extern const DBPropertyInfo* GetPropertyInfo(const Slice& property);
51 52

#ifndef ROCKSDB_LITE
T
Tomas Kolda 已提交
53
#undef SCORE
54 55 56 57
enum class LevelStatType {
  INVALID = 0,
  NUM_FILES,
  COMPACTED_FILES,
58
  SIZE_BYTES,
59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83
  SCORE,
  READ_GB,
  RN_GB,
  RNP1_GB,
  WRITE_GB,
  W_NEW_GB,
  MOVED_GB,
  WRITE_AMP,
  READ_MBPS,
  WRITE_MBPS,
  COMP_SEC,
  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 已提交
84 85
class InternalStats {
 public:
86 87
  static const std::map<LevelStatType, LevelStat> compaction_level_stats;

88
  enum InternalCFStatsType {
89 90 91 92 93 94 95 96
    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 已提交
97
    WRITE_STALLS_ENUM_MAX,
98
    BYTES_FLUSHED,
99
    BYTES_INGESTED_ADD_FILE,
100 101 102
    INGESTED_NUM_FILES_TOTAL,
    INGESTED_LEVEL0_NUM_FILES_TOTAL,
    INGESTED_NUM_KEYS_TOTAL,
103
    INTERNAL_CF_STATS_ENUM_MAX,
I
Igor Canadi 已提交
104 105
  };

106 107 108 109
  enum InternalDBStatsType {
    WAL_FILE_BYTES,
    WAL_FILE_SYNCED,
    BYTES_WRITTEN,
S
sdong 已提交
110
    NUMBER_KEYS_WRITTEN,
111 112 113
    WRITE_DONE_BY_OTHER,
    WRITE_DONE_BY_SELF,
    WRITE_WITH_WAL,
S
sdong 已提交
114
    WRITE_STALL_MICROS,
115 116 117
    INTERNAL_DB_STATS_ENUM_MAX,
  };

118
  InternalStats(int num_levels, Env* env, ColumnFamilyData* cfd)
119 120 121
      : db_stats_{},
        cf_stats_value_{},
        cf_stats_count_{},
122
        comp_stats_(num_levels),
123
        file_read_latency_(num_levels),
124
        bg_error_count_(0),
I
Igor Canadi 已提交
125 126
        number_levels_(num_levels),
        env_(env),
127
        cfd_(cfd),
128
        started_at_(env->NowMicros()) {}
I
Igor Canadi 已提交
129

130
  // Per level compaction stats.  comp_stats_[level] stores the stats for
I
Igor Canadi 已提交
131 132 133 134
  // compactions that produced data for the specified "level".
  struct CompactionStats {
    uint64_t micros;

135 136
    // The number of bytes read from all non-output levels
    uint64_t bytes_read_non_output_levels;
I
Igor Canadi 已提交
137

138 139
    // The number of bytes read from the compaction output level.
    uint64_t bytes_read_output_level;
I
Igor Canadi 已提交
140

141
    // Total number of bytes written during compaction
142
    uint64_t bytes_written;
I
Igor Canadi 已提交
143

144
    // Total number of bytes moved to the output level
145 146
    uint64_t bytes_moved;

147 148
    // The number of compaction input files in all non-output levels.
    int num_input_files_in_non_output_levels;
I
Igor Canadi 已提交
149

150 151
    // The number of compaction input files in the output level.
    int num_input_files_in_output_level;
I
Igor Canadi 已提交
152

153 154
    // The number of compaction output files.
    int num_output_files;
I
Igor Canadi 已提交
155

156
    // Total incoming entries during compaction between levels N and N+1
S
sdong 已提交
157
    uint64_t num_input_records;
158 159 160

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

I
Igor Canadi 已提交
163 164 165
    // Number of compactions done
    int count;

166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187
    // Number of compactions done per CompactionReason
    int counts[static_cast<int>(CompactionReason::kNumOfReasons)];

    explicit CompactionStats()
        : micros(0),
          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 已提交
188
        : micros(0),
189 190
          bytes_read_non_output_levels(0),
          bytes_read_output_level(0),
I
Igor Canadi 已提交
191
          bytes_written(0),
192
          bytes_moved(0),
193 194 195
          num_input_files_in_non_output_levels(0),
          num_input_files_in_output_level(0),
          num_output_files(0),
196 197
          num_input_records(0),
          num_dropped_records(0),
198 199 200 201 202 203 204 205 206 207 208 209
          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 已提交
210

211 212
    explicit CompactionStats(const CompactionStats& c)
        : micros(c.micros),
213 214
          bytes_read_non_output_levels(c.bytes_read_non_output_levels),
          bytes_read_output_level(c.bytes_read_output_level),
215
          bytes_written(c.bytes_written),
216
          bytes_moved(c.bytes_moved),
217 218 219 220 221
          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),
222 223
          num_input_records(c.num_input_records),
          num_dropped_records(c.num_dropped_records),
224 225 226 227 228 229
          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];
      }
    }
230

S
Siying Dong 已提交
231 232 233 234 235 236 237 238 239 240 241 242
    void Clear() {
      this->micros = 0;
      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;
243 244 245 246
      int num_of_reasons = static_cast<int>(CompactionReason::kNumOfReasons);
      for (int i = 0; i < num_of_reasons; i++) {
        counts[i] = 0;
      }
S
Siying Dong 已提交
247 248
    }

I
Igor Canadi 已提交
249 250
    void Add(const CompactionStats& c) {
      this->micros += c.micros;
251 252
      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 已提交
253
      this->bytes_written += c.bytes_written;
254
      this->bytes_moved += c.bytes_moved;
255 256 257 258 259
      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;
260 261
      this->num_input_records += c.num_input_records;
      this->num_dropped_records += c.num_dropped_records;
L
Lei Jin 已提交
262
      this->count += c.count;
263 264 265 266
      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 已提交
267
    }
268 269 270

    void Subtract(const CompactionStats& c) {
      this->micros -= c.micros;
271 272
      this->bytes_read_non_output_levels -= c.bytes_read_non_output_levels;
      this->bytes_read_output_level -= c.bytes_read_output_level;
273
      this->bytes_written -= c.bytes_written;
274
      this->bytes_moved -= c.bytes_moved;
275 276 277 278 279
      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;
280 281
      this->num_input_records -= c.num_input_records;
      this->num_dropped_records -= c.num_dropped_records;
282
      this->count -= c.count;
283 284 285 286
      int num_of_reasons = static_cast<int>(CompactionReason::kNumOfReasons);
      for (int i = 0; i < num_of_reasons; i++) {
        counts[i] -= c.counts[i];
      }
287
    }
I
Igor Canadi 已提交
288 289
  };

S
Siying Dong 已提交
290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309
  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 已提交
310
  void AddCompactionStats(int level, const CompactionStats& stats) {
311
    comp_stats_[level].Add(stats);
I
Igor Canadi 已提交
312 313
  }

314 315 316 317
  void IncBytesMoved(int level, uint64_t amount) {
    comp_stats_[level].bytes_moved += amount;
  }

318 319 320
  void AddCFStats(InternalCFStatsType type, uint64_t value) {
    cf_stats_value_[type] += value;
    ++cf_stats_count_[type];
I
Igor Canadi 已提交
321 322
  }

323 324
  void AddDBStats(InternalDBStatsType type, uint64_t value,
                  bool concurrent = false) {
325
    auto& v = db_stats_[type];
326 327 328 329 330 331
    if (concurrent) {
      v.fetch_add(value, std::memory_order_relaxed);
    } else {
      v.store(v.load(std::memory_order_relaxed) + value,
              std::memory_order_relaxed);
    }
332 333 334 335
  }

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

338 339 340 341
  HistogramImpl* GetFileReadHist(int level) {
    return &file_read_latency_[level];
  }

342 343 344 345
  uint64_t GetBackgroundErrorCount() const { return bg_error_count_; }

  uint64_t BumpAndGetBackgroundErrorCount() { return ++bg_error_count_; }

346 347 348
  bool GetStringProperty(const DBPropertyInfo& property_info,
                         const Slice& property, std::string* value);

349 350
  bool GetMapProperty(const DBPropertyInfo& property_info,
                      const Slice& property,
351
                      std::map<std::string, std::string>* value);
352

353 354
  bool GetIntProperty(const DBPropertyInfo& property_info, uint64_t* value,
                      DBImpl* db);
I
Igor Canadi 已提交
355

356 357
  bool GetIntPropertyOutOfMutex(const DBPropertyInfo& property_info,
                                Version* version, uint64_t* value);
358

359 360 361 362
  const std::vector<CompactionStats>& TEST_GetCompactionStats() const {
    return comp_stats_;
  }

363 364 365
  // 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;
366

I
Igor Canadi 已提交
367
 private:
368
  void DumpDBStats(std::string* value);
369
  void DumpCFMapStats(std::map<std::string, std::string>* cf_stats);
370
  void DumpCFMapStats(
371 372
      std::map<int, std::map<LevelStatType, double>>* level_stats,
      CompactionStats* compaction_stats_sum);
373
  void DumpCFMapStatsIOStalls(std::map<std::string, std::string>* cf_stats);
374
  void DumpCFStats(std::string* value);
375 376
  void DumpCFStatsNoFileHistogram(std::string* value);
  void DumpCFFileHistogram(std::string* value);
377

Y
Yi Wu 已提交
378 379
  bool HandleBlockCacheStat(Cache** block_cache);

380
  // Per-DB stats
381
  std::atomic<uint64_t> db_stats_[INTERNAL_DB_STATS_ENUM_MAX];
382
  // Per-ColumnFamily stats
383 384
  uint64_t cf_stats_value_[INTERNAL_CF_STATS_ENUM_MAX];
  uint64_t cf_stats_count_[INTERNAL_CF_STATS_ENUM_MAX];
385 386
  // Per-ColumnFamily/level compaction stats
  std::vector<CompactionStats> comp_stats_;
387
  std::vector<HistogramImpl> file_read_latency_;
I
Igor Canadi 已提交
388 389

  // Used to compute per-interval statistics
390 391 392
  struct CFStatsSnapshot {
    // ColumnFamily-level stats
    CompactionStats comp_stats;
393
    uint64_t ingest_bytes_flush;      // Bytes written to L0 (Flush)
394
    uint64_t stall_count;             // Stall count
395 396 397 398 399
    // 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;
400

401 402 403 404 405 406
    // 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

407
    CFStatsSnapshot()
408
        : ingest_bytes_flush(0),
409 410 411 412
          stall_count(0),
          compact_bytes_write(0),
          compact_bytes_read(0),
          compact_micros(0),
413 414 415 416 417
          seconds_up(0),
          ingest_bytes_addfile(0),
          ingest_files_addfile(0),
          ingest_l0_files_addfile(0),
          ingest_keys_addfile(0) {}
S
Siying Dong 已提交
418 419 420 421 422 423 424 425 426 427 428 429 430 431

    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;
    }
432 433 434 435 436 437 438 439
  } 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 已提交
440 441
    // These count the number of writes processed by the calling thread or
    // another thread.
442 443
    uint64_t write_other;
    uint64_t write_self;
S
sdong 已提交
444 445 446 447 448
    // 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 已提交
449 450
    // Total time writes delayed by stalls.
    uint64_t write_stall_micros;
451 452 453 454 455 456 457 458 459
    double seconds_up;

    DBStatsSnapshot()
        : ingest_bytes(0),
          wal_bytes(0),
          wal_synced(0),
          write_with_wal(0),
          write_other(0),
          write_self(0),
460
          num_keys_written(0),
S
sdong 已提交
461
          write_stall_micros(0),
462
          seconds_up(0) {}
S
Siying Dong 已提交
463 464 465 466 467 468 469 470 471 472 473 474

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

477 478 479
  // 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);
480
  bool HandleCompressionRatioAtLevelPrefix(std::string* value, Slice suffix);
481 482
  bool HandleLevelStats(std::string* value, Slice suffix);
  bool HandleStats(std::string* value, Slice suffix);
483
  bool HandleCFMapStats(std::map<std::string, std::string>* compaction_stats);
484
  bool HandleCFStats(std::string* value, Slice suffix);
485 486
  bool HandleCFStatsNoFileHistogram(std::string* value, Slice suffix);
  bool HandleCFFileHistogram(std::string* value, Slice suffix);
487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517
  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);
518 519
  bool HandleCurrentSuperVersionNumber(uint64_t* value, DBImpl* db,
                                       Version* version);
520 521 522 523
  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);
524
  bool HandleLiveSstFilesSize(uint64_t* value, DBImpl* db, Version* version);
525 526 527 528 529 530
  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);
531
  bool HandleMinLogNumberToKeep(uint64_t* value, DBImpl* db, Version* version);
532 533 534
  bool HandleActualDelayedWriteRate(uint64_t* value, DBImpl* db,
                                    Version* version);
  bool HandleIsWriteStopped(uint64_t* value, DBImpl* db, Version* version);
Y
Yi Wu 已提交
535 536
  bool HandleEstimateOldestKeyTime(uint64_t* value, DBImpl* db,
                                   Version* version);
Y
Yi Wu 已提交
537 538 539 540
  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);
541

542 543 544 545 546 547 548
  // 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_;

549
  const int number_levels_;
I
Igor Canadi 已提交
550
  Env* env_;
551
  ColumnFamilyData* cfd_;
S
Siying Dong 已提交
552
  uint64_t started_at_;
I
Igor Canadi 已提交
553 554
};

555 556 557 558 559
#else

class InternalStats {
 public:
  enum InternalCFStatsType {
560 561 562 563 564 565 566 567
    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,
568 569
    WRITE_STALLS_ENUM_MAX,
    BYTES_FLUSHED,
570
    BYTES_INGESTED_ADD_FILE,
571 572 573
    INGESTED_NUM_FILES_TOTAL,
    INGESTED_LEVEL0_NUM_FILES_TOTAL,
    INGESTED_NUM_KEYS_TOTAL,
574 575 576 577 578 579 580 581 582 583 584
    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 已提交
585
    WRITE_STALL_MICROS,
586 587 588
    INTERNAL_DB_STATS_ENUM_MAX,
  };

589
  InternalStats(int /*num_levels*/, Env* /*env*/, ColumnFamilyData* /*cfd*/) {}
590 591 592

  struct CompactionStats {
    uint64_t micros;
593 594
    uint64_t bytes_read_non_output_levels;
    uint64_t bytes_read_output_level;
595
    uint64_t bytes_written;
596
    uint64_t bytes_moved;
597 598 599
    int num_input_files_in_non_output_levels;
    int num_input_files_in_output_level;
    int num_output_files;
600 601 602 603
    uint64_t num_input_records;
    uint64_t num_dropped_records;
    int count;

604 605
    explicit CompactionStats() {}

606
    explicit CompactionStats(CompactionReason /*reason*/, int /*c*/) {}
607

608
    explicit CompactionStats(const CompactionStats& /*c*/) {}
609

610
    void Add(const CompactionStats& /*c*/) {}
611

612
    void Subtract(const CompactionStats& /*c*/) {}
613 614
  };

615
  void AddCompactionStats(int /*level*/, const CompactionStats& /*stats*/) {}
616

617
  void IncBytesMoved(int /*level*/, uint64_t /*amount*/) {}
618

619
  void AddCFStats(InternalCFStatsType /*type*/, uint64_t /*value*/) {}
620

621 622
  void AddDBStats(InternalDBStatsType /*type*/, uint64_t /*value*/,
                  bool /*concurrent */ = false) {}
623

624
  HistogramImpl* GetFileReadHist(int /*level*/) { return nullptr; }
625

626 627 628 629
  uint64_t GetBackgroundErrorCount() const { return 0; }

  uint64_t BumpAndGetBackgroundErrorCount() { return 0; }

630 631
  bool GetStringProperty(const DBPropertyInfo& /*property_info*/,
                         const Slice& /*property*/, std::string* /*value*/) {
632 633
    return false;
  }
634

635 636 637
  bool GetMapProperty(const DBPropertyInfo& /*property_info*/,
                      const Slice& /*property*/,
                      std::map<std::string, std::string>* /*value*/) {
638 639 640
    return false;
  }

641 642
  bool GetIntProperty(const DBPropertyInfo& /*property_info*/, uint64_t* /*value*/,
                      DBImpl* /*db*/) const {
643 644
    return false;
  }
645

646 647
  bool GetIntPropertyOutOfMutex(const DBPropertyInfo& /*property_info*/,
                                Version* /*version*/, uint64_t* /*value*/) const {
648 649
    return false;
  }
650 651 652
};
#endif  // !ROCKSDB_LITE

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