Index: content/browser/indexed_db/indexed_db_backing_store.cc |
diff --git a/content/browser/indexed_db/indexed_db_backing_store.cc b/content/browser/indexed_db/indexed_db_backing_store.cc |
index ee3ba135b16e050c5b7a4f393857413bdcd6c4d6..c797236d57132b7121121ed5740a4de9acf941be 100644 |
--- a/content/browser/indexed_db/indexed_db_backing_store.cc |
+++ b/content/browser/indexed_db/indexed_db_backing_store.cc |
@@ -384,22 +384,22 @@ IndexedDBBackingStore::RecordIdentifier::~RecordIdentifier() {} |
IndexedDBBackingStore::Cursor::CursorOptions::CursorOptions() {} |
IndexedDBBackingStore::Cursor::CursorOptions::~CursorOptions() {} |
-enum IndexedDBLevelDBBackingStoreOpenResult { |
- INDEXED_DB_LEVEL_DB_BACKING_STORE_OPEN_MEMORY_SUCCESS, |
- INDEXED_DB_LEVEL_DB_BACKING_STORE_OPEN_SUCCESS, |
- INDEXED_DB_LEVEL_DB_BACKING_STORE_OPEN_FAILED_DIRECTORY, |
- INDEXED_DB_LEVEL_DB_BACKING_STORE_OPEN_FAILED_UNKNOWN_SCHEMA, |
- INDEXED_DB_LEVEL_DB_BACKING_STORE_OPEN_CLEANUP_DESTROY_FAILED, |
- INDEXED_DB_LEVEL_DB_BACKING_STORE_OPEN_CLEANUP_REOPEN_FAILED, |
- INDEXED_DB_LEVEL_DB_BACKING_STORE_OPEN_CLEANUP_REOPEN_SUCCESS, |
- INDEXED_DB_LEVEL_DB_BACKING_STORE_OPEN_FAILED_IO_ERROR_CHECKING_SCHEMA, |
- INDEXED_DB_LEVEL_DB_BACKING_STORE_OPEN_FAILED_UNKNOWN_ERR, |
- INDEXED_DB_LEVEL_DB_BACKING_STORE_OPEN_MEMORY_FAILED, |
- INDEXED_DB_LEVEL_DB_BACKING_STORE_OPEN_ATTEMPT_NON_ASCII, |
- INDEXED_DB_LEVEL_DB_BACKING_STORE_OPEN_DISK_FULL, |
- INDEXED_DB_LEVEL_DB_BACKING_STORE_OPEN_ORIGIN_TOO_LONG, |
- INDEXED_DB_LEVEL_DB_BACKING_STORE_OPEN_NO_RECOVERY, |
- INDEXED_DB_LEVEL_DB_BACKING_STORE_OPEN_MAX, |
+enum IndexedDBBackingStoreOpenResult { |
+ INDEXED_DB_BACKING_STORE_OPEN_MEMORY_SUCCESS, |
+ INDEXED_DB_BACKING_STORE_OPEN_SUCCESS, |
+ INDEXED_DB_BACKING_STORE_OPEN_FAILED_DIRECTORY, |
+ INDEXED_DB_BACKING_STORE_OPEN_FAILED_UNKNOWN_SCHEMA, |
+ INDEXED_DB_BACKING_STORE_OPEN_CLEANUP_DESTROY_FAILED, |
+ INDEXED_DB_BACKING_STORE_OPEN_CLEANUP_REOPEN_FAILED, |
+ INDEXED_DB_BACKING_STORE_OPEN_CLEANUP_REOPEN_SUCCESS, |
+ INDEXED_DB_BACKING_STORE_OPEN_FAILED_IO_ERROR_CHECKING_SCHEMA, |
+ INDEXED_DB_BACKING_STORE_OPEN_FAILED_UNKNOWN_ERR, |
+ INDEXED_DB_BACKING_STORE_OPEN_MEMORY_FAILED, |
+ INDEXED_DB_BACKING_STORE_OPEN_ATTEMPT_NON_ASCII, |
+ INDEXED_DB_BACKING_STORE_OPEN_DISK_FULL, |
+ INDEXED_DB_BACKING_STORE_OPEN_ORIGIN_TOO_LONG, |
+ INDEXED_DB_BACKING_STORE_OPEN_NO_RECOVERY, |
+ INDEXED_DB_BACKING_STORE_OPEN_MAX, |
}; |
// TODO(dgrogan): Move to leveldb_env. |
@@ -454,6 +454,44 @@ scoped_refptr<IndexedDBBackingStore> IndexedDBBackingStore::Open( |
&leveldb_factory); |
} |
+static void HistogramOpenStatus(IndexedDBBackingStoreOpenResult result) { |
+ UMA_HISTOGRAM_ENUMERATION("WebCore.IndexedDB.BackingStore.OpenStatus", |
+ result, |
+ INDEXED_DB_BACKING_STORE_OPEN_MAX); |
+} |
+ |
+// TODO(dgrogan): This only checks the lengths of the path components. It should |
+// also check the total path length against MAX_PATH. |
jsbell
2013/10/01 23:56:46
I believe this is done implicitly by the call to G
dgrogan
2013/10/02 00:54:24
True. Comment removed.
|
+static bool IsPathTooLong(const base::FilePath& leveldb_dir) { |
+ int limit = file_util::GetMaximumPathComponentLength(leveldb_dir); |
jsbell
2013/10/01 23:56:46
Based on the windows impl of GetMaximumPathCompone
dgrogan
2013/10/02 00:54:24
Good catch. Changed back to only using the base di
|
+ if (limit == -1) { |
+ DLOG(WARNING) << "GetMaximumPathComponentLength returned -1"; |
+ // In limited testing, ChromeOS returns 143, other OSes 255. |
jsbell
2013/10/01 23:56:46
Bonus points if you can make clang-format not want
|
+#if defined(OS_CHROMEOS) |
+ limit = 143; |
+#else |
+ limit = 255; |
+#endif |
+ } |
+ size_t component_length = leveldb_dir.BaseName().value().length(); |
+ if (component_length > static_cast<uint32_t>(limit)) { |
+ DLOG(WARNING) << "Path component length (" << component_length |
+ << ") exceeds maximum (" << limit |
+ << ") allowed by this filesystem."; |
+ const int min = 140; |
+ const int max = 300; |
+ const int num_buckets = 12; |
+ UMA_HISTOGRAM_CUSTOM_COUNTS( |
+ "WebCore.IndexedDB.BackingStore.OverlyLargeOriginLength", |
+ component_length, |
+ min, |
+ max, |
+ num_buckets); |
+ return true; |
+ } |
+ return false; |
+} |
+ |
scoped_refptr<IndexedDBBackingStore> IndexedDBBackingStore::Open( |
const std::string& origin_identifier, |
const base::FilePath& path_base, |
@@ -469,67 +507,24 @@ scoped_refptr<IndexedDBBackingStore> IndexedDBBackingStore::Open( |
scoped_ptr<LevelDBComparator> comparator(new Comparator()); |
if (!IsStringASCII(path_base.AsUTF8Unsafe())) { |
- base::Histogram::FactoryGet("WebCore.IndexedDB.BackingStore.OpenStatus", |
- 1, |
- INDEXED_DB_LEVEL_DB_BACKING_STORE_OPEN_MAX, |
- INDEXED_DB_LEVEL_DB_BACKING_STORE_OPEN_MAX + 1, |
- base::HistogramBase::kUmaTargetedHistogramFlag) |
- ->Add(INDEXED_DB_LEVEL_DB_BACKING_STORE_OPEN_ATTEMPT_NON_ASCII); |
+ HistogramOpenStatus(INDEXED_DB_BACKING_STORE_OPEN_ATTEMPT_NON_ASCII); |
} |
if (!file_util::CreateDirectory(path_base)) { |
LOG(ERROR) << "Unable to create IndexedDB database path " |
<< path_base.AsUTF8Unsafe(); |
- base::Histogram::FactoryGet("WebCore.IndexedDB.BackingStore.OpenStatus", |
- 1, |
- INDEXED_DB_LEVEL_DB_BACKING_STORE_OPEN_MAX, |
- INDEXED_DB_LEVEL_DB_BACKING_STORE_OPEN_MAX + 1, |
- base::HistogramBase::kUmaTargetedHistogramFlag) |
- ->Add(INDEXED_DB_LEVEL_DB_BACKING_STORE_OPEN_FAILED_DIRECTORY); |
+ HistogramOpenStatus(INDEXED_DB_BACKING_STORE_OPEN_FAILED_DIRECTORY); |
return scoped_refptr<IndexedDBBackingStore>(); |
} |
- base::FilePath identifier_path = |
- base::FilePath().AppendASCII(origin_identifier) |
+ base::FilePath file_path = |
+ path_base.AppendASCII(origin_identifier) |
.AddExtension(FILE_PATH_LITERAL(".indexeddb.leveldb")); |
- int limit = file_util::GetMaximumPathComponentLength(path_base); |
- if (limit == -1) { |
- DLOG(WARNING) << "GetMaximumPathComponentLength returned -1"; |
- // In limited testing, ChromeOS returns 143, other OSes 255. |
-#if defined(OS_CHROMEOS) |
- limit = 143; |
-#else |
- limit = 255; |
-#endif |
- } |
- if (identifier_path.value().length() > static_cast<uint32_t>(limit)) { |
- DLOG(WARNING) << "Path component length (" |
- << identifier_path.value().length() << ") exceeds maximum (" |
- << limit << ") allowed by this filesystem."; |
- const int min = 140; |
- const int max = 300; |
- const int num_buckets = 12; |
- // TODO(dgrogan): Remove WebCore from these histogram names. |
- UMA_HISTOGRAM_CUSTOM_COUNTS( |
- "WebCore.IndexedDB.BackingStore.OverlyLargeOriginLength", |
- identifier_path.value().length(), |
- min, |
- max, |
- num_buckets); |
- // TODO(dgrogan): Translate the FactoryGet calls to |
- // UMA_HISTOGRAM_ENUMERATION. FactoryGet was the most direct translation |
- // from the WebCore code. |
- base::Histogram::FactoryGet("WebCore.IndexedDB.BackingStore.OpenStatus", |
- 1, |
- INDEXED_DB_LEVEL_DB_BACKING_STORE_OPEN_MAX, |
- INDEXED_DB_LEVEL_DB_BACKING_STORE_OPEN_MAX + 1, |
- base::HistogramBase::kUmaTargetedHistogramFlag) |
- ->Add(INDEXED_DB_LEVEL_DB_BACKING_STORE_OPEN_ORIGIN_TOO_LONG); |
+ if (IsPathTooLong(file_path)) { |
+ HistogramOpenStatus(INDEXED_DB_BACKING_STORE_OPEN_ORIGIN_TOO_LONG); |
return scoped_refptr<IndexedDBBackingStore>(); |
} |
- base::FilePath file_path = path_base.Append(identifier_path); |
- |
scoped_ptr<LevelDBDatabase> db; |
leveldb::Status status = leveldb_factory->OpenLevelDB( |
file_path, comparator.get(), &db, is_disk_full); |
@@ -545,53 +540,27 @@ scoped_refptr<IndexedDBBackingStore> IndexedDBBackingStore::Open( |
if (!ok) { |
LOG(ERROR) << "IndexedDB had IO error checking schema, treating it as " |
"failure to open"; |
- base::Histogram::FactoryGet( |
- "WebCore.IndexedDB.BackingStore.OpenStatus", |
- 1, |
- INDEXED_DB_LEVEL_DB_BACKING_STORE_OPEN_MAX, |
- INDEXED_DB_LEVEL_DB_BACKING_STORE_OPEN_MAX + 1, |
- base::HistogramBase::kUmaTargetedHistogramFlag) |
- ->Add(INDEXED_DB_LEVEL_DB_BACKING_STORE_OPEN_FAILED_IO_ERROR_CHECKING_SCHEMA); |
+ HistogramOpenStatus( |
+ INDEXED_DB_BACKING_STORE_OPEN_FAILED_IO_ERROR_CHECKING_SCHEMA); |
db.reset(); |
} else if (!known) { |
LOG(ERROR) << "IndexedDB backing store had unknown schema, treating it " |
"as failure to open"; |
- base::Histogram::FactoryGet( |
- "WebCore.IndexedDB.BackingStore.OpenStatus", |
- 1, |
- INDEXED_DB_LEVEL_DB_BACKING_STORE_OPEN_MAX, |
- INDEXED_DB_LEVEL_DB_BACKING_STORE_OPEN_MAX + 1, |
- base::HistogramBase::kUmaTargetedHistogramFlag) |
- ->Add(INDEXED_DB_LEVEL_DB_BACKING_STORE_OPEN_FAILED_UNKNOWN_SCHEMA); |
+ HistogramOpenStatus(INDEXED_DB_BACKING_STORE_OPEN_FAILED_UNKNOWN_SCHEMA); |
db.reset(); |
} |
} |
if (db) { |
- base::Histogram::FactoryGet("WebCore.IndexedDB.BackingStore.OpenStatus", |
- 1, |
- INDEXED_DB_LEVEL_DB_BACKING_STORE_OPEN_MAX, |
- INDEXED_DB_LEVEL_DB_BACKING_STORE_OPEN_MAX + 1, |
- base::HistogramBase::kUmaTargetedHistogramFlag) |
- ->Add(INDEXED_DB_LEVEL_DB_BACKING_STORE_OPEN_SUCCESS); |
+ HistogramOpenStatus(INDEXED_DB_BACKING_STORE_OPEN_SUCCESS); |
} else if (!RecoveryCouldBeFruitful(status)) { |
LOG(ERROR) << "Unable to open backing store, not trying to recover - " |
<< status.ToString(); |
- base::Histogram::FactoryGet("WebCore.IndexedDB.BackingStore.OpenStatus", |
- 1, |
- INDEXED_DB_LEVEL_DB_BACKING_STORE_OPEN_MAX, |
- INDEXED_DB_LEVEL_DB_BACKING_STORE_OPEN_MAX + 1, |
- base::HistogramBase::kUmaTargetedHistogramFlag) |
- ->Add(INDEXED_DB_LEVEL_DB_BACKING_STORE_OPEN_NO_RECOVERY); |
+ HistogramOpenStatus(INDEXED_DB_BACKING_STORE_OPEN_NO_RECOVERY); |
return scoped_refptr<IndexedDBBackingStore>(); |
} else if (*is_disk_full) { |
LOG(ERROR) << "Unable to open backing store - disk is full."; |
- base::Histogram::FactoryGet("WebCore.IndexedDB.BackingStore.OpenStatus", |
- 1, |
- INDEXED_DB_LEVEL_DB_BACKING_STORE_OPEN_MAX, |
- INDEXED_DB_LEVEL_DB_BACKING_STORE_OPEN_MAX + 1, |
- base::HistogramBase::kUmaTargetedHistogramFlag) |
- ->Add(INDEXED_DB_LEVEL_DB_BACKING_STORE_OPEN_DISK_FULL); |
+ HistogramOpenStatus(INDEXED_DB_BACKING_STORE_OPEN_DISK_FULL); |
return scoped_refptr<IndexedDBBackingStore>(); |
} else { |
LOG(ERROR) << "IndexedDB backing store open failed, attempting cleanup"; |
@@ -599,13 +568,7 @@ scoped_refptr<IndexedDBBackingStore> IndexedDBBackingStore::Open( |
bool success = leveldb_factory->DestroyLevelDB(file_path); |
if (!success) { |
LOG(ERROR) << "IndexedDB backing store cleanup failed"; |
- base::Histogram::FactoryGet( |
- "WebCore.IndexedDB.BackingStore.OpenStatus", |
- 1, |
- INDEXED_DB_LEVEL_DB_BACKING_STORE_OPEN_MAX, |
- INDEXED_DB_LEVEL_DB_BACKING_STORE_OPEN_MAX + 1, |
- base::HistogramBase::kUmaTargetedHistogramFlag) |
- ->Add(INDEXED_DB_LEVEL_DB_BACKING_STORE_OPEN_CLEANUP_DESTROY_FAILED); |
+ HistogramOpenStatus(INDEXED_DB_BACKING_STORE_OPEN_CLEANUP_DESTROY_FAILED); |
return scoped_refptr<IndexedDBBackingStore>(); |
} |
@@ -613,31 +576,15 @@ scoped_refptr<IndexedDBBackingStore> IndexedDBBackingStore::Open( |
leveldb_factory->OpenLevelDB(file_path, comparator.get(), &db, NULL); |
if (!db) { |
LOG(ERROR) << "IndexedDB backing store reopen after recovery failed"; |
- base::Histogram::FactoryGet( |
- "WebCore.IndexedDB.BackingStore.OpenStatus", |
- 1, |
- INDEXED_DB_LEVEL_DB_BACKING_STORE_OPEN_MAX, |
- INDEXED_DB_LEVEL_DB_BACKING_STORE_OPEN_MAX + 1, |
- base::HistogramBase::kUmaTargetedHistogramFlag) |
- ->Add(INDEXED_DB_LEVEL_DB_BACKING_STORE_OPEN_CLEANUP_REOPEN_FAILED); |
+ HistogramOpenStatus(INDEXED_DB_BACKING_STORE_OPEN_CLEANUP_REOPEN_FAILED); |
return scoped_refptr<IndexedDBBackingStore>(); |
} |
- base::Histogram::FactoryGet("WebCore.IndexedDB.BackingStore.OpenStatus", |
- 1, |
- INDEXED_DB_LEVEL_DB_BACKING_STORE_OPEN_MAX, |
- INDEXED_DB_LEVEL_DB_BACKING_STORE_OPEN_MAX + 1, |
- base::HistogramBase::kUmaTargetedHistogramFlag) |
- ->Add(INDEXED_DB_LEVEL_DB_BACKING_STORE_OPEN_CLEANUP_REOPEN_SUCCESS); |
+ HistogramOpenStatus(INDEXED_DB_BACKING_STORE_OPEN_CLEANUP_REOPEN_SUCCESS); |
} |
if (!db) { |
NOTREACHED(); |
- base::Histogram::FactoryGet("WebCore.IndexedDB.BackingStore.OpenStatus", |
- 1, |
- INDEXED_DB_LEVEL_DB_BACKING_STORE_OPEN_MAX, |
- INDEXED_DB_LEVEL_DB_BACKING_STORE_OPEN_MAX + 1, |
- base::HistogramBase::kUmaTargetedHistogramFlag) |
- ->Add(INDEXED_DB_LEVEL_DB_BACKING_STORE_OPEN_FAILED_UNKNOWN_ERR); |
+ HistogramOpenStatus(INDEXED_DB_BACKING_STORE_OPEN_FAILED_UNKNOWN_ERR); |
return scoped_refptr<IndexedDBBackingStore>(); |
} |
@@ -660,20 +607,10 @@ scoped_refptr<IndexedDBBackingStore> IndexedDBBackingStore::OpenInMemory( |
LevelDBDatabase::OpenInMemory(comparator.get()); |
if (!db) { |
LOG(ERROR) << "LevelDBDatabase::OpenInMemory failed."; |
- base::Histogram::FactoryGet("WebCore.IndexedDB.BackingStore.OpenStatus", |
- 1, |
- INDEXED_DB_LEVEL_DB_BACKING_STORE_OPEN_MAX, |
- INDEXED_DB_LEVEL_DB_BACKING_STORE_OPEN_MAX + 1, |
- base::HistogramBase::kUmaTargetedHistogramFlag) |
- ->Add(INDEXED_DB_LEVEL_DB_BACKING_STORE_OPEN_MEMORY_FAILED); |
+ HistogramOpenStatus(INDEXED_DB_BACKING_STORE_OPEN_MEMORY_FAILED); |
return scoped_refptr<IndexedDBBackingStore>(); |
} |
- base::Histogram::FactoryGet("WebCore.IndexedDB.BackingStore.OpenStatus", |
- 1, |
- INDEXED_DB_LEVEL_DB_BACKING_STORE_OPEN_MAX, |
- INDEXED_DB_LEVEL_DB_BACKING_STORE_OPEN_MAX + 1, |
- base::HistogramBase::kUmaTargetedHistogramFlag) |
- ->Add(INDEXED_DB_LEVEL_DB_BACKING_STORE_OPEN_MEMORY_SUCCESS); |
+ HistogramOpenStatus(INDEXED_DB_BACKING_STORE_OPEN_MEMORY_SUCCESS); |
return Create(file_identifier, db.Pass(), comparator.Pass()); |
} |