OLD | NEW |
1 // Copyright (c) 2013 The LevelDB Authors. All rights reserved. | 1 // Copyright (c) 2013 The LevelDB Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. See the AUTHORS file for names of contributors. | 3 // found in the LICENSE file. See the AUTHORS file for names of contributors. |
4 | 4 |
5 #ifndef THIRD_PARTY_LEVELDATABASE_ENV_CHROMIUM_H_ | 5 #ifndef THIRD_PARTY_LEVELDATABASE_ENV_CHROMIUM_H_ |
6 #define THIRD_PARTY_LEVELDATABASE_ENV_CHROMIUM_H_ | 6 #define THIRD_PARTY_LEVELDATABASE_ENV_CHROMIUM_H_ |
7 | 7 |
8 #include <deque> | 8 #include <deque> |
9 #include <map> | 9 #include <map> |
10 #include <set> | 10 #include <set> |
11 | 11 |
12 #include "base/metrics/histogram.h" | 12 #include "base/metrics/histogram.h" |
13 #include "base/platform_file.h" | 13 #include "base/platform_file.h" |
14 #include "base/synchronization/condition_variable.h" | |
15 #include "leveldb/env.h" | 14 #include "leveldb/env.h" |
16 #include "leveldb/slice.h" | |
17 #include "leveldb/status.h" | |
18 #include "port/port_chromium.h" | 15 #include "port/port_chromium.h" |
19 #include "util/mutexlock.h" | 16 #include "util/mutexlock.h" |
20 | 17 |
21 namespace leveldb_env { | 18 namespace leveldb_env { |
22 | 19 |
23 enum MethodID { | 20 enum MethodID { |
24 kSequentialFileRead, | 21 kSequentialFileRead, |
25 kSequentialFileSkip, | 22 kSequentialFileSkip, |
26 kRandomAccessFileRead, | 23 kRandomAccessFileRead, |
27 kWritableFileAppend, | 24 kWritableFileAppend, |
(...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
94 MethodID method) const = 0; | 91 MethodID method) const = 0; |
95 }; | 92 }; |
96 | 93 |
97 class WriteTracker { | 94 class WriteTracker { |
98 public: | 95 public: |
99 virtual void DidCreateNewFile(const std::string& fname) = 0; | 96 virtual void DidCreateNewFile(const std::string& fname) = 0; |
100 virtual bool DoesDirNeedSync(const std::string& fname) = 0; | 97 virtual bool DoesDirNeedSync(const std::string& fname) = 0; |
101 virtual void DidSyncDir(const std::string& fname) = 0; | 98 virtual void DidSyncDir(const std::string& fname) = 0; |
102 }; | 99 }; |
103 | 100 |
104 class ChromiumWritableFile : public leveldb::WritableFile { | |
105 public: | |
106 ChromiumWritableFile(const std::string& fname, | |
107 FILE* f, | |
108 const UMALogger* uma_logger, | |
109 WriteTracker* tracker, | |
110 bool make_backup); | |
111 virtual ~ChromiumWritableFile(); | |
112 virtual leveldb::Status Append(const leveldb::Slice& data); | |
113 virtual leveldb::Status Close(); | |
114 virtual leveldb::Status Flush(); | |
115 virtual leveldb::Status Sync(); | |
116 | |
117 private: | |
118 enum Type { | |
119 kManifest, | |
120 kTable, | |
121 kOther | |
122 }; | |
123 leveldb::Status SyncParent(); | |
124 | |
125 std::string filename_; | |
126 FILE* file_; | |
127 const UMALogger* uma_logger_; | |
128 WriteTracker* tracker_; | |
129 Type file_type_; | |
130 std::string parent_dir_; | |
131 bool make_backup_; | |
132 }; | |
133 | |
134 class ChromiumEnv : public leveldb::Env, | 101 class ChromiumEnv : public leveldb::Env, |
135 public UMALogger, | 102 public UMALogger, |
136 public RetrierProvider, | 103 public RetrierProvider, |
137 public WriteTracker { | 104 public WriteTracker { |
138 public: | 105 public: |
139 ChromiumEnv(); | 106 static bool MakeBackup(const std::string& fname); |
| 107 static base::FilePath CreateFilePath(const std::string& file_path); |
| 108 static const char* PlatformFileErrorString( |
| 109 const ::base::PlatformFileError& error); |
| 110 static bool HasTableExtension(const base::FilePath& path); |
140 virtual ~ChromiumEnv(); | 111 virtual ~ChromiumEnv(); |
141 | 112 |
142 virtual leveldb::Status NewSequentialFile(const std::string& fname, | |
143 leveldb::SequentialFile** result); | |
144 virtual leveldb::Status NewRandomAccessFile( | |
145 const std::string& fname, | |
146 leveldb::RandomAccessFile** result); | |
147 virtual leveldb::Status NewWritableFile(const std::string& fname, | |
148 leveldb::WritableFile** result); | |
149 virtual bool FileExists(const std::string& fname); | 113 virtual bool FileExists(const std::string& fname); |
150 virtual leveldb::Status GetChildren(const std::string& dir, | 114 virtual leveldb::Status GetChildren(const std::string& dir, |
151 std::vector<std::string>* result); | 115 std::vector<std::string>* result); |
152 virtual leveldb::Status DeleteFile(const std::string& fname); | 116 virtual leveldb::Status DeleteFile(const std::string& fname); |
153 virtual leveldb::Status CreateDir(const std::string& name); | 117 virtual leveldb::Status CreateDir(const std::string& name); |
154 virtual leveldb::Status DeleteDir(const std::string& name); | 118 virtual leveldb::Status DeleteDir(const std::string& name); |
155 virtual leveldb::Status GetFileSize(const std::string& fname, uint64_t* size); | 119 virtual leveldb::Status GetFileSize(const std::string& fname, uint64_t* size); |
156 virtual leveldb::Status RenameFile(const std::string& src, | 120 virtual leveldb::Status RenameFile(const std::string& src, |
157 const std::string& dst); | 121 const std::string& dst); |
158 virtual leveldb::Status LockFile(const std::string& fname, | 122 virtual leveldb::Status LockFile(const std::string& fname, |
159 leveldb::FileLock** lock); | 123 leveldb::FileLock** lock); |
160 virtual leveldb::Status UnlockFile(leveldb::FileLock* lock); | 124 virtual leveldb::Status UnlockFile(leveldb::FileLock* lock); |
161 virtual void Schedule(void (*function)(void*), void* arg); | 125 virtual void Schedule(void (*function)(void*), void* arg); |
162 virtual void StartThread(void (*function)(void* arg), void* arg); | 126 virtual void StartThread(void (*function)(void* arg), void* arg); |
163 virtual leveldb::Status GetTestDirectory(std::string* path); | 127 virtual leveldb::Status GetTestDirectory(std::string* path); |
164 virtual leveldb::Status NewLogger(const std::string& fname, | |
165 leveldb::Logger** result); | |
166 virtual uint64_t NowMicros(); | 128 virtual uint64_t NowMicros(); |
167 virtual void SleepForMicroseconds(int micros); | 129 virtual void SleepForMicroseconds(int micros); |
168 | 130 |
169 protected: | 131 protected: |
| 132 ChromiumEnv(); |
| 133 |
170 virtual void DidCreateNewFile(const std::string& fname); | 134 virtual void DidCreateNewFile(const std::string& fname); |
171 virtual bool DoesDirNeedSync(const std::string& fname); | 135 virtual bool DoesDirNeedSync(const std::string& fname); |
172 virtual void DidSyncDir(const std::string& fname); | 136 virtual void DidSyncDir(const std::string& fname); |
| 137 virtual base::PlatformFileError GetDirectoryEntries( |
| 138 const base::FilePath& dir_param, |
| 139 std::vector<base::FilePath>* result) const = 0; |
| 140 virtual void RecordErrorAt(MethodID method) const; |
| 141 virtual void RecordOSError(MethodID method, int saved_errno) const; |
| 142 virtual void RecordOSError(MethodID method, |
| 143 base::PlatformFileError error) const; |
| 144 base::HistogramBase* GetMaxFDHistogram(const std::string& type) const; |
| 145 base::HistogramBase* GetOSErrorHistogram(MethodID method, int limit) const; |
173 | 146 |
174 std::string name_; | 147 std::string name_; |
175 bool make_backup_; | 148 bool make_backup_; |
176 | 149 |
177 private: | 150 private: |
178 // File locks may not be exclusive within a process (e.g. on POSIX). Track | 151 // File locks may not be exclusive within a process (e.g. on POSIX). Track |
179 // locks held by the ChromiumEnv to prevent access within the process. | 152 // locks held by the ChromiumEnv to prevent access within the process. |
180 class LockTable { | 153 class LockTable { |
181 public: | 154 public: |
182 bool Insert(const std::string& fname) { | 155 bool Insert(const std::string& fname) { |
(...skipping 12 matching lines...) Expand all Loading... |
195 std::map<std::string, bool> needs_sync_map_; | 168 std::map<std::string, bool> needs_sync_map_; |
196 base::Lock map_lock_; | 169 base::Lock map_lock_; |
197 | 170 |
198 const int kMaxRetryTimeMillis; | 171 const int kMaxRetryTimeMillis; |
199 // BGThread() is the body of the background thread | 172 // BGThread() is the body of the background thread |
200 void BGThread(); | 173 void BGThread(); |
201 static void BGThreadWrapper(void* arg) { | 174 static void BGThreadWrapper(void* arg) { |
202 reinterpret_cast<ChromiumEnv*>(arg)->BGThread(); | 175 reinterpret_cast<ChromiumEnv*>(arg)->BGThread(); |
203 } | 176 } |
204 | 177 |
205 virtual void RecordErrorAt(MethodID method) const; | |
206 virtual void RecordOSError(MethodID method, int saved_errno) const; | |
207 virtual void RecordOSError(MethodID method, | |
208 base::PlatformFileError error) const; | |
209 virtual void RecordBackupResult(bool result) const; | 178 virtual void RecordBackupResult(bool result) const; |
210 void RestoreIfNecessary(const std::string& dir, | 179 void RestoreIfNecessary(const std::string& dir, |
211 std::vector<std::string>* children); | 180 std::vector<std::string>* children); |
212 base::FilePath RestoreFromBackup(const base::FilePath& base_name); | 181 base::FilePath RestoreFromBackup(const base::FilePath& base_name); |
213 void RecordOpenFilesLimit(const std::string& type); | |
214 void RecordLockFileAncestors(int num_missing_ancestors) const; | 182 void RecordLockFileAncestors(int num_missing_ancestors) const; |
215 base::HistogramBase* GetOSErrorHistogram(MethodID method, int limit) const; | |
216 base::HistogramBase* GetMethodIOErrorHistogram() const; | 183 base::HistogramBase* GetMethodIOErrorHistogram() const; |
217 base::HistogramBase* GetMaxFDHistogram(const std::string& type) const; | |
218 base::HistogramBase* GetLockFileAncestorHistogram() const; | 184 base::HistogramBase* GetLockFileAncestorHistogram() const; |
219 | 185 |
220 // RetrierProvider implementation. | 186 // RetrierProvider implementation. |
221 virtual int MaxRetryTimeMillis() const { return kMaxRetryTimeMillis; } | 187 virtual int MaxRetryTimeMillis() const { return kMaxRetryTimeMillis; } |
222 virtual base::HistogramBase* GetRetryTimeHistogram(MethodID method) const; | 188 virtual base::HistogramBase* GetRetryTimeHistogram(MethodID method) const; |
223 virtual base::HistogramBase* GetRecoveredFromErrorHistogram( | 189 virtual base::HistogramBase* GetRecoveredFromErrorHistogram( |
224 MethodID method) const; | 190 MethodID method) const; |
225 | 191 |
226 base::FilePath test_directory_; | 192 base::FilePath test_directory_; |
227 | 193 |
228 ::base::Lock mu_; | 194 ::base::Lock mu_; |
229 ::base::ConditionVariable bgsignal_; | 195 ::base::ConditionVariable bgsignal_; |
230 bool started_bgthread_; | 196 bool started_bgthread_; |
231 | 197 |
232 // Entry per Schedule() call | 198 // Entry per Schedule() call |
233 struct BGItem { | 199 struct BGItem { |
234 void* arg; | 200 void* arg; |
235 void (*function)(void*); | 201 void (*function)(void*); |
236 }; | 202 }; |
237 typedef std::deque<BGItem> BGQueue; | 203 typedef std::deque<BGItem> BGQueue; |
238 BGQueue queue_; | 204 BGQueue queue_; |
239 LockTable locks_; | 205 LockTable locks_; |
240 }; | 206 }; |
241 | 207 |
242 } // namespace leveldb_env | 208 } // namespace leveldb_env |
243 | 209 |
244 #endif | 210 #endif |
OLD | NEW |