counted_fs.h 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158
  1. // Copyright (c) 2016-present, Facebook, Inc. All rights reserved.
  2. // This source code is licensed under both the GPLv2 (found in the
  3. // COPYING file in the root directory) and Apache 2.0 License
  4. // (found in the LICENSE.Apache file in the root directory).
  5. #pragma once
  6. #include <atomic>
  7. #include <memory>
  8. #include "rocksdb/file_system.h"
  9. #include "rocksdb/io_status.h"
  10. #include "rocksdb/rocksdb_namespace.h"
  11. namespace ROCKSDB_NAMESPACE {
  12. class Logger;
  13. struct OpCounter {
  14. std::atomic<int> ops;
  15. std::atomic<uint64_t> bytes;
  16. OpCounter() : ops(0), bytes(0) {}
  17. void Reset() {
  18. ops = 0;
  19. bytes = 0;
  20. }
  21. void RecordOp(const IOStatus& io_s, size_t added_bytes) {
  22. if (!io_s.IsNotSupported()) {
  23. ops.fetch_add(1, std::memory_order_relaxed);
  24. }
  25. if (io_s.ok()) {
  26. bytes.fetch_add(added_bytes, std::memory_order_relaxed);
  27. }
  28. }
  29. };
  30. struct FileOpCounters {
  31. static const char* kName() { return "FileOpCounters"; }
  32. std::atomic<int> opens;
  33. std::atomic<int> closes;
  34. std::atomic<int> deletes;
  35. std::atomic<int> renames;
  36. std::atomic<int> flushes;
  37. std::atomic<int> syncs;
  38. std::atomic<int> dsyncs;
  39. std::atomic<int> fsyncs;
  40. std::atomic<int> dir_opens;
  41. std::atomic<int> dir_closes;
  42. OpCounter reads;
  43. OpCounter writes;
  44. FileOpCounters()
  45. : opens(0),
  46. closes(0),
  47. deletes(0),
  48. renames(0),
  49. flushes(0),
  50. syncs(0),
  51. dsyncs(0),
  52. fsyncs(0),
  53. dir_opens(0),
  54. dir_closes(0) {}
  55. void Reset() {
  56. opens = 0;
  57. closes = 0;
  58. deletes = 0;
  59. renames = 0;
  60. flushes = 0;
  61. syncs = 0;
  62. dsyncs = 0;
  63. fsyncs = 0;
  64. dir_opens = 0;
  65. dir_closes = 0;
  66. reads.Reset();
  67. writes.Reset();
  68. }
  69. std::string PrintCounters() const;
  70. };
  71. // A FileSystem class that counts operations (reads, writes, opens, closes, etc)
  72. class CountedFileSystem : public FileSystemWrapper {
  73. public:
  74. private:
  75. FileOpCounters counters_;
  76. public:
  77. explicit CountedFileSystem(const std::shared_ptr<FileSystem>& base);
  78. static const char* kClassName() { return "CountedFileSystem"; }
  79. const char* Name() const override { return kClassName(); }
  80. IOStatus NewSequentialFile(const std::string& f, const FileOptions& options,
  81. std::unique_ptr<FSSequentialFile>* r,
  82. IODebugContext* dbg) override;
  83. IOStatus NewRandomAccessFile(const std::string& f,
  84. const FileOptions& file_opts,
  85. std::unique_ptr<FSRandomAccessFile>* r,
  86. IODebugContext* dbg) override;
  87. IOStatus NewWritableFile(const std::string& f, const FileOptions& options,
  88. std::unique_ptr<FSWritableFile>* r,
  89. IODebugContext* dbg) override;
  90. IOStatus ReopenWritableFile(const std::string& fname,
  91. const FileOptions& options,
  92. std::unique_ptr<FSWritableFile>* result,
  93. IODebugContext* dbg) override;
  94. IOStatus ReuseWritableFile(const std::string& fname,
  95. const std::string& old_fname,
  96. const FileOptions& file_opts,
  97. std::unique_ptr<FSWritableFile>* result,
  98. IODebugContext* dbg) override;
  99. IOStatus NewRandomRWFile(const std::string& name, const FileOptions& options,
  100. std::unique_ptr<FSRandomRWFile>* result,
  101. IODebugContext* dbg) override;
  102. IOStatus NewDirectory(const std::string& name, const IOOptions& io_opts,
  103. std::unique_ptr<FSDirectory>* result,
  104. IODebugContext* dbg) override;
  105. IOStatus DeleteFile(const std::string& fname, const IOOptions& options,
  106. IODebugContext* dbg) override {
  107. IOStatus s = target()->DeleteFile(fname, options, dbg);
  108. if (s.ok()) {
  109. counters_.deletes++;
  110. }
  111. return s;
  112. }
  113. IOStatus RenameFile(const std::string& s, const std::string& t,
  114. const IOOptions& options, IODebugContext* dbg) override {
  115. IOStatus st = target()->RenameFile(s, t, options, dbg);
  116. if (st.ok()) {
  117. counters_.renames++;
  118. }
  119. return st;
  120. }
  121. const FileOpCounters* counters() const { return &counters_; }
  122. FileOpCounters* counters() { return &counters_; }
  123. const void* GetOptionsPtr(const std::string& name) const override {
  124. if (name == FileOpCounters::kName()) {
  125. return counters();
  126. } else {
  127. return FileSystemWrapper::GetOptionsPtr(name);
  128. }
  129. }
  130. // Prints the counters to a string
  131. std::string PrintCounters() const { return counters_.PrintCounters(); }
  132. void ResetCounters() { counters_.Reset(); }
  133. };
  134. } // namespace ROCKSDB_NAMESPACE