1 // Copyright (c) 2017-present, Facebook, Inc. All rights reserved.
2 // This source code is licensed under the BSD-style license found in the
3 // LICENSE file in the root directory of this source tree. An additional grant
4 // of patent rights can be found in the PATENTS file in the same directory.
6 #include "monitoring/perf_context_imp.h"
7 #include "rocksdb/env.h"
8 #include "rocksdb/status.h"
14 // An environment that measures function call times for filesystem
15 // operations, reporting results to variables in PerfContext.
16 class TimedEnv
: public EnvWrapper
{
18 explicit TimedEnv(Env
* base_env
) : EnvWrapper(base_env
) {}
20 virtual Status
NewSequentialFile(const std::string
& fname
,
21 unique_ptr
<SequentialFile
>* result
,
22 const EnvOptions
& options
) override
{
23 PERF_TIMER_GUARD(env_new_sequential_file_nanos
);
24 return EnvWrapper::NewSequentialFile(fname
, result
, options
);
27 virtual Status
NewRandomAccessFile(const std::string
& fname
,
28 unique_ptr
<RandomAccessFile
>* result
,
29 const EnvOptions
& options
) override
{
30 PERF_TIMER_GUARD(env_new_random_access_file_nanos
);
31 return EnvWrapper::NewRandomAccessFile(fname
, result
, options
);
34 virtual Status
NewWritableFile(const std::string
& fname
,
35 unique_ptr
<WritableFile
>* result
,
36 const EnvOptions
& options
) override
{
37 PERF_TIMER_GUARD(env_new_writable_file_nanos
);
38 return EnvWrapper::NewWritableFile(fname
, result
, options
);
41 virtual Status
ReuseWritableFile(const std::string
& fname
,
42 const std::string
& old_fname
,
43 unique_ptr
<WritableFile
>* result
,
44 const EnvOptions
& options
) override
{
45 PERF_TIMER_GUARD(env_reuse_writable_file_nanos
);
46 return EnvWrapper::ReuseWritableFile(fname
, old_fname
, result
, options
);
49 virtual Status
NewRandomRWFile(const std::string
& fname
,
50 unique_ptr
<RandomRWFile
>* result
,
51 const EnvOptions
& options
) override
{
52 PERF_TIMER_GUARD(env_new_random_rw_file_nanos
);
53 return EnvWrapper::NewRandomRWFile(fname
, result
, options
);
56 virtual Status
NewDirectory(const std::string
& name
,
57 unique_ptr
<Directory
>* result
) override
{
58 PERF_TIMER_GUARD(env_new_directory_nanos
);
59 return EnvWrapper::NewDirectory(name
, result
);
62 virtual Status
FileExists(const std::string
& fname
) override
{
63 PERF_TIMER_GUARD(env_file_exists_nanos
);
64 return EnvWrapper::FileExists(fname
);
67 virtual Status
GetChildren(const std::string
& dir
,
68 std::vector
<std::string
>* result
) override
{
69 PERF_TIMER_GUARD(env_get_children_nanos
);
70 return EnvWrapper::GetChildren(dir
, result
);
73 virtual Status
GetChildrenFileAttributes(
74 const std::string
& dir
, std::vector
<FileAttributes
>* result
) override
{
75 PERF_TIMER_GUARD(env_get_children_file_attributes_nanos
);
76 return EnvWrapper::GetChildrenFileAttributes(dir
, result
);
79 virtual Status
DeleteFile(const std::string
& fname
) override
{
80 PERF_TIMER_GUARD(env_delete_file_nanos
);
81 return EnvWrapper::DeleteFile(fname
);
84 virtual Status
CreateDir(const std::string
& dirname
) override
{
85 PERF_TIMER_GUARD(env_create_dir_nanos
);
86 return EnvWrapper::CreateDir(dirname
);
89 virtual Status
CreateDirIfMissing(const std::string
& dirname
) override
{
90 PERF_TIMER_GUARD(env_create_dir_if_missing_nanos
);
91 return EnvWrapper::CreateDirIfMissing(dirname
);
94 virtual Status
DeleteDir(const std::string
& dirname
) override
{
95 PERF_TIMER_GUARD(env_delete_dir_nanos
);
96 return EnvWrapper::DeleteDir(dirname
);
99 virtual Status
GetFileSize(const std::string
& fname
,
100 uint64_t* file_size
) override
{
101 PERF_TIMER_GUARD(env_get_file_size_nanos
);
102 return EnvWrapper::GetFileSize(fname
, file_size
);
105 virtual Status
GetFileModificationTime(const std::string
& fname
,
106 uint64_t* file_mtime
) override
{
107 PERF_TIMER_GUARD(env_get_file_modification_time_nanos
);
108 return EnvWrapper::GetFileModificationTime(fname
, file_mtime
);
111 virtual Status
RenameFile(const std::string
& src
,
112 const std::string
& dst
) override
{
113 PERF_TIMER_GUARD(env_rename_file_nanos
);
114 return EnvWrapper::RenameFile(src
, dst
);
117 virtual Status
LinkFile(const std::string
& src
,
118 const std::string
& dst
) override
{
119 PERF_TIMER_GUARD(env_link_file_nanos
);
120 return EnvWrapper::LinkFile(src
, dst
);
123 virtual Status
LockFile(const std::string
& fname
, FileLock
** lock
) override
{
124 PERF_TIMER_GUARD(env_lock_file_nanos
);
125 return EnvWrapper::LockFile(fname
, lock
);
128 virtual Status
UnlockFile(FileLock
* lock
) override
{
129 PERF_TIMER_GUARD(env_unlock_file_nanos
);
130 return EnvWrapper::UnlockFile(lock
);
133 virtual Status
NewLogger(const std::string
& fname
,
134 shared_ptr
<Logger
>* result
) override
{
135 PERF_TIMER_GUARD(env_new_logger_nanos
);
136 return EnvWrapper::NewLogger(fname
, result
);
140 Env
* NewTimedEnv(Env
* base_env
) { return new TimedEnv(base_env
); }
142 #else // ROCKSDB_LITE
144 Env
* NewTimedEnv(Env
* base_env
) { return nullptr; }
146 #endif // !ROCKSDB_LITE
148 } // namespace rocksdb