]> git.proxmox.com Git - ceph.git/blob - ceph/src/rocksdb/env/mock_env.h
update ceph source to reef 18.1.2
[ceph.git] / ceph / src / rocksdb / env / mock_env.h
1 // Copyright (c) 2011-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 //
6 // Copyright (c) 2011 The LevelDB Authors. All rights reserved.
7 // Use of this source code is governed by a BSD-style license that can be
8 // found in the LICENSE file. See the AUTHORS file for names of contributors.
9 #pragma once
10
11 #include <atomic>
12 #include <map>
13 #include <string>
14 #include <vector>
15
16 #include "env/composite_env_wrapper.h"
17 #include "port/port.h"
18 #include "rocksdb/env.h"
19 #include "rocksdb/status.h"
20 #include "rocksdb/system_clock.h"
21
22 namespace ROCKSDB_NAMESPACE {
23 class MemFile;
24 class MockFileSystem : public FileSystem {
25 public:
26 explicit MockFileSystem(const std::shared_ptr<SystemClock>& clock,
27 bool supports_direct_io = true);
28 ~MockFileSystem() override;
29
30 static const char* kClassName() { return "MemoryFileSystem"; }
31 const char* Name() const override { return kClassName(); }
32 IOStatus NewSequentialFile(const std::string& f, const FileOptions& file_opts,
33 std::unique_ptr<FSSequentialFile>* r,
34 IODebugContext* dbg) override;
35 IOStatus NewRandomAccessFile(const std::string& f,
36 const FileOptions& file_opts,
37 std::unique_ptr<FSRandomAccessFile>* r,
38 IODebugContext* dbg) override;
39
40 IOStatus NewRandomRWFile(const std::string& fname,
41 const FileOptions& file_opts,
42 std::unique_ptr<FSRandomRWFile>* result,
43 IODebugContext* dbg) override;
44 IOStatus ReuseWritableFile(const std::string& fname,
45 const std::string& old_fname,
46 const FileOptions& file_opts,
47 std::unique_ptr<FSWritableFile>* result,
48 IODebugContext* dbg) override;
49 IOStatus NewWritableFile(const std::string& fname,
50 const FileOptions& file_opts,
51 std::unique_ptr<FSWritableFile>* result,
52 IODebugContext* dbg) override;
53 IOStatus ReopenWritableFile(const std::string& fname,
54 const FileOptions& options,
55 std::unique_ptr<FSWritableFile>* result,
56 IODebugContext* dbg) override;
57 IOStatus NewDirectory(const std::string& /*name*/, const IOOptions& io_opts,
58 std::unique_ptr<FSDirectory>* result,
59 IODebugContext* dbg) override;
60 IOStatus FileExists(const std::string& fname, const IOOptions& /*io_opts*/,
61 IODebugContext* /*dbg*/) override;
62 IOStatus GetChildren(const std::string& dir, const IOOptions& options,
63 std::vector<std::string>* result,
64 IODebugContext* dbg) override;
65 IOStatus DeleteFile(const std::string& fname, const IOOptions& options,
66 IODebugContext* dbg) override;
67 IOStatus Truncate(const std::string& fname, size_t size,
68 const IOOptions& options, IODebugContext* dbg) override;
69 IOStatus CreateDir(const std::string& dirname, const IOOptions& options,
70 IODebugContext* dbg) override;
71 IOStatus CreateDirIfMissing(const std::string& dirname,
72 const IOOptions& options,
73 IODebugContext* dbg) override;
74 IOStatus DeleteDir(const std::string& dirname, const IOOptions& options,
75 IODebugContext* dbg) override;
76
77 IOStatus GetFileSize(const std::string& fname, const IOOptions& options,
78 uint64_t* file_size, IODebugContext* dbg) override;
79
80 IOStatus GetFileModificationTime(const std::string& fname,
81 const IOOptions& options,
82 uint64_t* file_mtime,
83 IODebugContext* dbg) override;
84 IOStatus RenameFile(const std::string& src, const std::string& target,
85 const IOOptions& options, IODebugContext* dbg) override;
86 IOStatus LinkFile(const std::string& /*src*/, const std::string& /*target*/,
87 const IOOptions& /*options*/,
88 IODebugContext* /*dbg*/) override;
89 IOStatus LockFile(const std::string& fname, const IOOptions& options,
90 FileLock** lock, IODebugContext* dbg) override;
91 IOStatus UnlockFile(FileLock* lock, const IOOptions& options,
92 IODebugContext* dbg) override;
93 IOStatus GetTestDirectory(const IOOptions& options, std::string* path,
94 IODebugContext* dbg) override;
95 IOStatus NewLogger(const std::string& fname, const IOOptions& io_opts,
96 std::shared_ptr<Logger>* result,
97 IODebugContext* dbg) override;
98 // Get full directory name for this db.
99 IOStatus GetAbsolutePath(const std::string& db_path,
100 const IOOptions& /*options*/,
101 std::string* output_path,
102 IODebugContext* /*dbg*/) override;
103 IOStatus IsDirectory(const std::string& /*path*/,
104 const IOOptions& /*options*/, bool* /*is_dir*/,
105 IODebugContext* /*dgb*/) override {
106 return IOStatus::NotSupported("IsDirectory");
107 }
108
109 Status CorruptBuffer(const std::string& fname);
110 Status PrepareOptions(const ConfigOptions& options) override;
111
112 private:
113 bool RenameFileInternal(const std::string& src, const std::string& dest);
114 void DeleteFileInternal(const std::string& fname);
115 bool GetChildrenInternal(const std::string& fname,
116 std::vector<std::string>* results);
117
118 std::string NormalizeMockPath(const std::string& path);
119
120 private:
121 // Map from filenames to MemFile objects, representing a simple file system.
122 port::Mutex mutex_;
123 std::map<std::string, MemFile*> file_map_; // Protected by mutex_.
124 std::shared_ptr<SystemClock> system_clock_;
125 SystemClock* clock_;
126 bool supports_direct_io_;
127 };
128
129 class MockEnv : public CompositeEnvWrapper {
130 public:
131 static MockEnv* Create(Env* base);
132 static MockEnv* Create(Env* base, const std::shared_ptr<SystemClock>& clock);
133
134 static const char* kClassName() { return "MockEnv"; }
135 const char* Name() const override { return kClassName(); }
136
137 Status CorruptBuffer(const std::string& fname);
138
139 private:
140 MockEnv(Env* env, const std::shared_ptr<FileSystem>& fs,
141 const std::shared_ptr<SystemClock>& clock);
142 };
143
144 } // namespace ROCKSDB_NAMESPACE