Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(181)

Unified Diff: third_party/leveldatabase/env_chromium.cc

Issue 11776009: Log IDB leveldb uma stats into LevelDBEnv.IDB. Other LevelDB consumers will (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: fix >80, make method definitions not inline Created 7 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « third_party/leveldatabase/README.chromium ('k') | third_party/leveldatabase/env_idb.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: third_party/leveldatabase/env_chromium.cc
diff --git a/third_party/leveldatabase/env_chromium.cc b/third_party/leveldatabase/env_chromium.cc
index bc5319307110a8a479e16a88b000138104d4e34a..94895e346894359252b762d9e45ded75147264bd 100644
--- a/third_party/leveldatabase/env_chromium.cc
+++ b/third_party/leveldatabase/env_chromium.cc
@@ -124,13 +124,30 @@ enum UmaEntry {
kNumEntries
};
-void LogToUMA(UmaEntry entry) {
- UMA_HISTOGRAM_ENUMERATION("LevelDBEnv.IOError", entry, kNumEntries);
+class UMALogger {
+ public:
+ UMALogger(std::string uma_title);
+ void RecordErrorAt(UmaEntry entry) const;
+ void LogRandomAccessFileError(base::PlatformFileError error_code) const;
+
+ private:
+ std::string uma_title_;
+};
+
+UMALogger::UMALogger(std::string uma_title) : uma_title_(uma_title) {}
+
+void UMALogger::RecordErrorAt(UmaEntry entry) const {
+ std::string uma_name(uma_title_);
+ uma_name.append(".IOError");
+ UMA_HISTOGRAM_ENUMERATION(uma_name, entry, kNumEntries);
}
-void LogRandomAccessFileError(base::PlatformFileError error_code) {
+void UMALogger::LogRandomAccessFileError(base::PlatformFileError error_code)
+ const {
DCHECK(error_code < 0);
- UMA_HISTOGRAM_ENUMERATION("LevelDBEnv.IOError.RandomAccessFile",
+ std::string uma_name(uma_title_);
+ uma_name.append(".IOError.RandomAccessFile");
+ UMA_HISTOGRAM_ENUMERATION(uma_name,
-error_code,
-base::PLATFORM_FILE_ERROR_MAX);
}
@@ -191,10 +208,12 @@ class ChromiumSequentialFile: public SequentialFile {
private:
std::string filename_;
FILE* file_;
+ const UMALogger* uma_logger_;
public:
- ChromiumSequentialFile(const std::string& fname, FILE* f)
- : filename_(fname), file_(f) { }
+ ChromiumSequentialFile(const std::string& fname, FILE* f,
+ const UMALogger* uma_logger)
+ : filename_(fname), file_(f), uma_logger_(uma_logger) { }
virtual ~ChromiumSequentialFile() { fclose(file_); }
virtual Status Read(size_t n, Slice* result, char* scratch) {
@@ -207,7 +226,7 @@ class ChromiumSequentialFile: public SequentialFile {
} else {
// A partial read with an error: return a non-ok status
s = Status::IOError(filename_, strerror(errno));
- LogToUMA(kSequentialFileRead);
+ uma_logger_->RecordErrorAt(kSequentialFileRead);
}
}
return s;
@@ -215,7 +234,7 @@ class ChromiumSequentialFile: public SequentialFile {
virtual Status Skip(uint64_t n) {
if (fseek(file_, n, SEEK_CUR)) {
- LogToUMA(kSequentialFileSkip);
+ uma_logger_->RecordErrorAt(kSequentialFileSkip);
return Status::IOError(filename_, strerror(errno));
}
return Status::OK();
@@ -226,10 +245,12 @@ class ChromiumRandomAccessFile: public RandomAccessFile {
private:
std::string filename_;
::base::PlatformFile file_;
+ const UMALogger* uma_logger_;
public:
- ChromiumRandomAccessFile(const std::string& fname, ::base::PlatformFile file)
- : filename_(fname), file_(file) { }
+ ChromiumRandomAccessFile(const std::string& fname, ::base::PlatformFile file,
+ const UMALogger* uma_logger)
+ : filename_(fname), file_(file), uma_logger_(uma_logger) { }
virtual ~ChromiumRandomAccessFile() { ::base::ClosePlatformFile(file_); }
virtual Status Read(uint64_t offset, size_t n, Slice* result,
@@ -240,7 +261,7 @@ class ChromiumRandomAccessFile: public RandomAccessFile {
if (r < 0) {
// An error: return a non-ok status
s = Status::IOError(filename_, "Could not perform read");
- LogToUMA(kRandomAccessFileRead);
+ uma_logger_->RecordErrorAt(kRandomAccessFileRead);
}
return s;
}
@@ -250,10 +271,12 @@ class ChromiumWritableFile : public WritableFile {
private:
std::string filename_;
FILE* file_;
+ const UMALogger* uma_logger_;
public:
- ChromiumWritableFile(const std::string& fname, FILE* f)
- : filename_(fname), file_(f) { }
+ ChromiumWritableFile(const std::string& fname, FILE* f,
+ const UMALogger* uma_logger)
+ : filename_(fname), file_(f), uma_logger_(uma_logger) { }
~ChromiumWritableFile() {
if (file_ != NULL) {
@@ -267,7 +290,7 @@ class ChromiumWritableFile : public WritableFile {
Status result;
if (r != data.size()) {
result = Status::IOError(filename_, strerror(errno));
- LogToUMA(kWritableFileAppend);
+ uma_logger_->RecordErrorAt(kWritableFileAppend);
}
return result;
}
@@ -276,7 +299,7 @@ class ChromiumWritableFile : public WritableFile {
Status result;
if (fclose(file_) != 0) {
result = Status::IOError(filename_, strerror(errno));
- LogToUMA(kWritableFileClose);
+ uma_logger_->RecordErrorAt(kWritableFileClose);
}
file_ = NULL;
return result;
@@ -286,7 +309,7 @@ class ChromiumWritableFile : public WritableFile {
Status result;
if (fflush_unlocked(file_) != 0) {
result = Status::IOError(filename_, strerror(errno));
- LogToUMA(kWritableFileFlush);
+ uma_logger_->RecordErrorAt(kWritableFileFlush);
}
return result;
}
@@ -304,7 +327,7 @@ class ChromiumWritableFile : public WritableFile {
// Report the first error we found.
if (error) {
result = Status::IOError(filename_, strerror(error));
- LogToUMA(kWritableFileSync);
+ uma_logger_->RecordErrorAt(kWritableFileSync);
}
return result;
}
@@ -327,10 +350,10 @@ class ChromiumEnv : public Env {
FILE* f = fopen_internal(fname.c_str(), "rb");
if (f == NULL) {
*result = NULL;
- LogToUMA(kNewSequentialFile);
+ uma_logger_->RecordErrorAt(kNewSequentialFile);
return Status::IOError(fname, strerror(errno));
} else {
- *result = new ChromiumSequentialFile(fname, f);
+ *result = new ChromiumSequentialFile(fname, f, uma_logger_.get());
return Status::OK();
}
}
@@ -344,11 +367,11 @@ class ChromiumEnv : public Env {
CreateFilePath(fname), flags, &created, &error_code);
if (error_code != ::base::PLATFORM_FILE_OK) {
*result = NULL;
- LogToUMA(kNewRandomAccessFile);
- LogRandomAccessFileError(error_code);
+ uma_logger_->RecordErrorAt(kNewRandomAccessFile);
+ uma_logger_->LogRandomAccessFileError(error_code);
return Status::IOError(fname, PlatformFileErrorString(error_code));
}
- *result = new ChromiumRandomAccessFile(fname, file);
+ *result = new ChromiumRandomAccessFile(fname, file, uma_logger_.get());
return Status::OK();
}
@@ -357,14 +380,14 @@ class ChromiumEnv : public Env {
*result = NULL;
FILE* f = fopen_internal(fname.c_str(), "wb");
if (f == NULL) {
- LogToUMA(kNewWritableFile);
+ uma_logger_->RecordErrorAt(kNewWritableFile);
return Status::IOError(fname, strerror(errno));
} else {
if (!sync_parent(fname)) {
fclose(f);
return Status::IOError(fname, strerror(errno));
}
- *result = new ChromiumWritableFile(fname, f);
+ *result = new ChromiumWritableFile(fname, f, uma_logger_.get());
return Status::OK();
}
}
@@ -394,7 +417,7 @@ class ChromiumEnv : public Env {
// TODO(jorlow): Should we assert this is a file?
if (!::file_util::Delete(CreateFilePath(fname), false)) {
result = Status::IOError(fname, "Could not delete file.");
- LogToUMA(kDeleteFile);
+ uma_logger_->RecordErrorAt(kDeleteFile);
}
return result;
};
@@ -403,7 +426,7 @@ class ChromiumEnv : public Env {
Status result;
if (!::file_util::CreateDirectory(CreateFilePath(name))) {
result = Status::IOError(name, "Could not create directory.");
- LogToUMA(kCreateDir);
+ uma_logger_->RecordErrorAt(kCreateDir);
}
return result;
};
@@ -413,7 +436,7 @@ class ChromiumEnv : public Env {
// TODO(jorlow): Should we assert this is a directory?
if (!::file_util::Delete(CreateFilePath(name), false)) {
result = Status::IOError(name, "Could not delete directory.");
- LogToUMA(kDeleteDir);
+ uma_logger_->RecordErrorAt(kDeleteDir);
}
return result;
};
@@ -424,7 +447,7 @@ class ChromiumEnv : public Env {
if (!::file_util::GetFileSize(CreateFilePath(fname), &signed_size)) {
*size = 0;
s = Status::IOError(fname, "Could not determine file size.");
- LogToUMA(kGetFileSize);
+ uma_logger_->RecordErrorAt(kGetFileSize);
} else {
*size = static_cast<uint64_t>(signed_size);
}
@@ -435,7 +458,7 @@ class ChromiumEnv : public Env {
Status result;
if (!::file_util::ReplaceFile(CreateFilePath(src), CreateFilePath(dst))) {
result = Status::IOError(src, "Could not rename file.");
- LogToUMA(kRenamefile);
+ uma_logger_->RecordErrorAt(kRenamefile);
} else {
sync_parent(dst);
if (src != dst)
@@ -458,7 +481,7 @@ class ChromiumEnv : public Env {
CreateFilePath(fname), flags, &created, &error_code);
if (error_code != ::base::PLATFORM_FILE_OK) {
result = Status::IOError(fname, PlatformFileErrorString(error_code));
- LogToUMA(kLockFile);
+ uma_logger_->RecordErrorAt(kLockFile);
} else {
ChromiumFileLock* my_lock = new ChromiumFileLock;
my_lock->file_ = file;
@@ -472,7 +495,7 @@ class ChromiumEnv : public Env {
Status result;
if (!::base::ClosePlatformFile(my_lock->file_)) {
result = Status::IOError("Could not close lock file.");
- LogToUMA(kUnlockFile);
+ uma_logger_->RecordErrorAt(kUnlockFile);
}
delete my_lock;
return result;
@@ -501,7 +524,7 @@ class ChromiumEnv : public Env {
if (!::file_util::CreateNewTempDirectory(kLevelDBTestDirectoryPrefix,
&test_directory_)) {
mu_.Release();
- LogToUMA(kGetTestDirectory);
+ uma_logger_->RecordErrorAt(kGetTestDirectory);
return Status::IOError("Could not create temp directory.");
}
}
@@ -514,7 +537,7 @@ class ChromiumEnv : public Env {
FILE* f = fopen_internal(fname.c_str(), "w");
if (f == NULL) {
*result = NULL;
- LogToUMA(kNewLogger);
+ uma_logger_->RecordErrorAt(kNewLogger);
return Status::IOError(fname, strerror(errno));
} else {
if (!sync_parent(fname)) {
@@ -535,6 +558,9 @@ class ChromiumEnv : public Env {
::base::PlatformThread::Sleep(::base::TimeDelta::FromMicroseconds(micros));
}
+ protected:
+ scoped_ptr<UMALogger> uma_logger_;
+
private:
// BGThread() is the body of the background thread
void BGThread();
@@ -558,7 +584,8 @@ class ChromiumEnv : public Env {
ChromiumEnv::ChromiumEnv()
: page_size_(::base::SysInfo::VMAllocationGranularity()),
bgsignal_(&mu_),
- started_bgthread_(false) {
+ started_bgthread_(false),
+ uma_logger_(new UMALogger("LevelDBEnv")) {
}
class Thread : public ::base::PlatformThread::Delegate {
@@ -624,11 +651,25 @@ void ChromiumEnv::StartThread(void (*function)(void* arg), void* arg) {
new Thread(function, arg); // Will self-delete.
}
+class IDBEnv : public ChromiumEnv {
+ public:
+ IDBEnv() : ChromiumEnv() {
+ uma_logger_.reset(new UMALogger("LevelDBEnv.IDB"));
+ }
+};
+
+::base::LazyInstance<IDBEnv>::Leaky
+ idb_env = LAZY_INSTANCE_INITIALIZER;
+
::base::LazyInstance<ChromiumEnv>::Leaky
default_env = LAZY_INSTANCE_INITIALIZER;
}
+Env* IDBEnv() {
+ return idb_env.Pointer();
+}
+
Env* Env::Default() {
return default_env.Pointer();
}
« no previous file with comments | « third_party/leveldatabase/README.chromium ('k') | third_party/leveldatabase/env_idb.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698