// Copyright (c) 2017-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). #include "monitoring/perf_context_imp.h" #include "rocksdb/env.h" #include "rocksdb/status.h" namespace rocksdb { #ifndef ROCKSDB_LITE // An environment that measures function call times for filesystem // operations, reporting results to variables in PerfContext. class TimedEnv : public EnvWrapper { public: explicit TimedEnv(Env* base_env) : EnvWrapper(base_env) {} virtual Status NewSequentialFile(const std::string& fname, unique_ptr* result, const EnvOptions& options) override { PERF_TIMER_GUARD(env_new_sequential_file_nanos); return EnvWrapper::NewSequentialFile(fname, result, options); } virtual Status NewRandomAccessFile(const std::string& fname, unique_ptr* result, const EnvOptions& options) override { PERF_TIMER_GUARD(env_new_random_access_file_nanos); return EnvWrapper::NewRandomAccessFile(fname, result, options); } virtual Status NewWritableFile(const std::string& fname, unique_ptr* result, const EnvOptions& options) override { PERF_TIMER_GUARD(env_new_writable_file_nanos); return EnvWrapper::NewWritableFile(fname, result, options); } virtual Status ReuseWritableFile(const std::string& fname, const std::string& old_fname, unique_ptr* result, const EnvOptions& options) override { PERF_TIMER_GUARD(env_reuse_writable_file_nanos); return EnvWrapper::ReuseWritableFile(fname, old_fname, result, options); } virtual Status NewRandomRWFile(const std::string& fname, unique_ptr* result, const EnvOptions& options) override { PERF_TIMER_GUARD(env_new_random_rw_file_nanos); return EnvWrapper::NewRandomRWFile(fname, result, options); } virtual Status NewDirectory(const std::string& name, unique_ptr* result) override { PERF_TIMER_GUARD(env_new_directory_nanos); return EnvWrapper::NewDirectory(name, result); } virtual Status FileExists(const std::string& fname) override { PERF_TIMER_GUARD(env_file_exists_nanos); return EnvWrapper::FileExists(fname); } virtual Status GetChildren(const std::string& dir, std::vector* result) override { PERF_TIMER_GUARD(env_get_children_nanos); return EnvWrapper::GetChildren(dir, result); } virtual Status GetChildrenFileAttributes( const std::string& dir, std::vector* result) override { PERF_TIMER_GUARD(env_get_children_file_attributes_nanos); return EnvWrapper::GetChildrenFileAttributes(dir, result); } virtual Status DeleteFile(const std::string& fname) override { PERF_TIMER_GUARD(env_delete_file_nanos); return EnvWrapper::DeleteFile(fname); } virtual Status CreateDir(const std::string& dirname) override { PERF_TIMER_GUARD(env_create_dir_nanos); return EnvWrapper::CreateDir(dirname); } virtual Status CreateDirIfMissing(const std::string& dirname) override { PERF_TIMER_GUARD(env_create_dir_if_missing_nanos); return EnvWrapper::CreateDirIfMissing(dirname); } virtual Status DeleteDir(const std::string& dirname) override { PERF_TIMER_GUARD(env_delete_dir_nanos); return EnvWrapper::DeleteDir(dirname); } virtual Status GetFileSize(const std::string& fname, uint64_t* file_size) override { PERF_TIMER_GUARD(env_get_file_size_nanos); return EnvWrapper::GetFileSize(fname, file_size); } virtual Status GetFileModificationTime(const std::string& fname, uint64_t* file_mtime) override { PERF_TIMER_GUARD(env_get_file_modification_time_nanos); return EnvWrapper::GetFileModificationTime(fname, file_mtime); } virtual Status RenameFile(const std::string& src, const std::string& dst) override { PERF_TIMER_GUARD(env_rename_file_nanos); return EnvWrapper::RenameFile(src, dst); } virtual Status LinkFile(const std::string& src, const std::string& dst) override { PERF_TIMER_GUARD(env_link_file_nanos); return EnvWrapper::LinkFile(src, dst); } virtual Status LockFile(const std::string& fname, FileLock** lock) override { PERF_TIMER_GUARD(env_lock_file_nanos); return EnvWrapper::LockFile(fname, lock); } virtual Status UnlockFile(FileLock* lock) override { PERF_TIMER_GUARD(env_unlock_file_nanos); return EnvWrapper::UnlockFile(lock); } virtual Status NewLogger(const std::string& fname, shared_ptr* result) override { PERF_TIMER_GUARD(env_new_logger_nanos); return EnvWrapper::NewLogger(fname, result); } }; Env* NewTimedEnv(Env* base_env) { return new TimedEnv(base_env); } #else // ROCKSDB_LITE Env* NewTimedEnv(Env* base_env) { return nullptr; } #endif // !ROCKSDB_LITE } // namespace rocksdb