diff options
Diffstat (limited to 'src/rocksdb/utilities/counted_fs.h')
-rw-r--r-- | src/rocksdb/utilities/counted_fs.h | 158 |
1 files changed, 158 insertions, 0 deletions
diff --git a/src/rocksdb/utilities/counted_fs.h b/src/rocksdb/utilities/counted_fs.h new file mode 100644 index 000000000..cb8a8968f --- /dev/null +++ b/src/rocksdb/utilities/counted_fs.h @@ -0,0 +1,158 @@ +// Copyright (c) 2016-present, Facebook, Inc. All rights reserved. +// 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). + +#pragma once + +#include <atomic> +#include <memory> + +#include "rocksdb/file_system.h" +#include "rocksdb/io_status.h" +#include "rocksdb/rocksdb_namespace.h" + +namespace ROCKSDB_NAMESPACE { +class Logger; + +struct OpCounter { + std::atomic<int> ops; + std::atomic<uint64_t> bytes; + + OpCounter() : ops(0), bytes(0) {} + + void Reset() { + ops = 0; + bytes = 0; + } + void RecordOp(const IOStatus& io_s, size_t added_bytes) { + if (!io_s.IsNotSupported()) { + ops.fetch_add(1, std::memory_order_relaxed); + } + if (io_s.ok()) { + bytes.fetch_add(added_bytes, std::memory_order_relaxed); + } + } +}; + +struct FileOpCounters { + static const char* kName() { return "FileOpCounters"; } + + std::atomic<int> opens; + std::atomic<int> closes; + std::atomic<int> deletes; + std::atomic<int> renames; + std::atomic<int> flushes; + std::atomic<int> syncs; + std::atomic<int> dsyncs; + std::atomic<int> fsyncs; + std::atomic<int> dir_opens; + std::atomic<int> dir_closes; + OpCounter reads; + OpCounter writes; + + FileOpCounters() + : opens(0), + closes(0), + deletes(0), + renames(0), + flushes(0), + syncs(0), + dsyncs(0), + fsyncs(0), + dir_opens(0), + dir_closes(0) {} + + void Reset() { + opens = 0; + closes = 0; + deletes = 0; + renames = 0; + flushes = 0; + syncs = 0; + dsyncs = 0; + fsyncs = 0; + dir_opens = 0; + dir_closes = 0; + reads.Reset(); + writes.Reset(); + } + std::string PrintCounters() const; +}; + +// A FileSystem class that counts operations (reads, writes, opens, closes, etc) +class CountedFileSystem : public FileSystemWrapper { + public: + private: + FileOpCounters counters_; + + public: + explicit CountedFileSystem(const std::shared_ptr<FileSystem>& base); + static const char* kClassName() { return "CountedFileSystem"; } + const char* Name() const override { return kClassName(); } + + IOStatus NewSequentialFile(const std::string& f, const FileOptions& options, + std::unique_ptr<FSSequentialFile>* r, + IODebugContext* dbg) override; + + IOStatus NewRandomAccessFile(const std::string& f, + const FileOptions& file_opts, + std::unique_ptr<FSRandomAccessFile>* r, + IODebugContext* dbg) override; + + IOStatus NewWritableFile(const std::string& f, const FileOptions& options, + std::unique_ptr<FSWritableFile>* r, + IODebugContext* dbg) override; + IOStatus ReopenWritableFile(const std::string& fname, + const FileOptions& options, + std::unique_ptr<FSWritableFile>* result, + IODebugContext* dbg) override; + + IOStatus ReuseWritableFile(const std::string& fname, + const std::string& old_fname, + const FileOptions& file_opts, + std::unique_ptr<FSWritableFile>* result, + IODebugContext* dbg) override; + IOStatus NewRandomRWFile(const std::string& name, const FileOptions& options, + std::unique_ptr<FSRandomRWFile>* result, + IODebugContext* dbg) override; + + IOStatus NewDirectory(const std::string& name, const IOOptions& io_opts, + std::unique_ptr<FSDirectory>* result, + IODebugContext* dbg) override; + + IOStatus DeleteFile(const std::string& fname, const IOOptions& options, + IODebugContext* dbg) override { + IOStatus s = target()->DeleteFile(fname, options, dbg); + if (s.ok()) { + counters_.deletes++; + } + return s; + } + + IOStatus RenameFile(const std::string& s, const std::string& t, + const IOOptions& options, IODebugContext* dbg) override { + IOStatus st = target()->RenameFile(s, t, options, dbg); + if (st.ok()) { + counters_.renames++; + } + return st; + } + + const FileOpCounters* counters() const { return &counters_; } + + FileOpCounters* counters() { return &counters_; } + + const void* GetOptionsPtr(const std::string& name) const override { + if (name == FileOpCounters::kName()) { + return counters(); + } else { + return FileSystemWrapper::GetOptionsPtr(name); + } + } + + // Prints the counters to a string + std::string PrintCounters() const { return counters_.PrintCounters(); } + void ResetCounters() { counters_.Reset(); } +}; +} // namespace ROCKSDB_NAMESPACE |