Commit a5e63495 authored by dgrogan@chromium.org's avatar dgrogan@chromium.org

Extract two methods by refactoring IndexedDBBackingStore::Open.

Review URL: https://codereview.chromium.org/25541006

git-svn-id: svn://svn.chromium.org/chrome/trunk/src@226528 0039d316-1c4b-4281-b951-d872f2087c98
parent 37795879
...@@ -384,22 +384,22 @@ IndexedDBBackingStore::RecordIdentifier::~RecordIdentifier() {} ...@@ -384,22 +384,22 @@ IndexedDBBackingStore::RecordIdentifier::~RecordIdentifier() {}
IndexedDBBackingStore::Cursor::CursorOptions::CursorOptions() {} IndexedDBBackingStore::Cursor::CursorOptions::CursorOptions() {}
IndexedDBBackingStore::Cursor::CursorOptions::~CursorOptions() {} IndexedDBBackingStore::Cursor::CursorOptions::~CursorOptions() {}
enum IndexedDBLevelDBBackingStoreOpenResult { enum IndexedDBBackingStoreOpenResult {
INDEXED_DB_LEVEL_DB_BACKING_STORE_OPEN_MEMORY_SUCCESS, INDEXED_DB_BACKING_STORE_OPEN_MEMORY_SUCCESS,
INDEXED_DB_LEVEL_DB_BACKING_STORE_OPEN_SUCCESS, INDEXED_DB_BACKING_STORE_OPEN_SUCCESS,
INDEXED_DB_LEVEL_DB_BACKING_STORE_OPEN_FAILED_DIRECTORY, INDEXED_DB_BACKING_STORE_OPEN_FAILED_DIRECTORY,
INDEXED_DB_LEVEL_DB_BACKING_STORE_OPEN_FAILED_UNKNOWN_SCHEMA, INDEXED_DB_BACKING_STORE_OPEN_FAILED_UNKNOWN_SCHEMA,
INDEXED_DB_LEVEL_DB_BACKING_STORE_OPEN_CLEANUP_DESTROY_FAILED, INDEXED_DB_BACKING_STORE_OPEN_CLEANUP_DESTROY_FAILED,
INDEXED_DB_LEVEL_DB_BACKING_STORE_OPEN_CLEANUP_REOPEN_FAILED, INDEXED_DB_BACKING_STORE_OPEN_CLEANUP_REOPEN_FAILED,
INDEXED_DB_LEVEL_DB_BACKING_STORE_OPEN_CLEANUP_REOPEN_SUCCESS, INDEXED_DB_BACKING_STORE_OPEN_CLEANUP_REOPEN_SUCCESS,
INDEXED_DB_LEVEL_DB_BACKING_STORE_OPEN_FAILED_IO_ERROR_CHECKING_SCHEMA, INDEXED_DB_BACKING_STORE_OPEN_FAILED_IO_ERROR_CHECKING_SCHEMA,
INDEXED_DB_LEVEL_DB_BACKING_STORE_OPEN_FAILED_UNKNOWN_ERR, INDEXED_DB_BACKING_STORE_OPEN_FAILED_UNKNOWN_ERR,
INDEXED_DB_LEVEL_DB_BACKING_STORE_OPEN_MEMORY_FAILED, INDEXED_DB_BACKING_STORE_OPEN_MEMORY_FAILED,
INDEXED_DB_LEVEL_DB_BACKING_STORE_OPEN_ATTEMPT_NON_ASCII, INDEXED_DB_BACKING_STORE_OPEN_ATTEMPT_NON_ASCII,
INDEXED_DB_LEVEL_DB_BACKING_STORE_OPEN_DISK_FULL, INDEXED_DB_BACKING_STORE_OPEN_DISK_FULL,
INDEXED_DB_LEVEL_DB_BACKING_STORE_OPEN_ORIGIN_TOO_LONG, INDEXED_DB_BACKING_STORE_OPEN_ORIGIN_TOO_LONG,
INDEXED_DB_LEVEL_DB_BACKING_STORE_OPEN_NO_RECOVERY, INDEXED_DB_BACKING_STORE_OPEN_NO_RECOVERY,
INDEXED_DB_LEVEL_DB_BACKING_STORE_OPEN_MAX, INDEXED_DB_BACKING_STORE_OPEN_MAX,
}; };
// TODO(dgrogan): Move to leveldb_env. // TODO(dgrogan): Move to leveldb_env.
...@@ -454,6 +454,42 @@ scoped_refptr<IndexedDBBackingStore> IndexedDBBackingStore::Open( ...@@ -454,6 +454,42 @@ scoped_refptr<IndexedDBBackingStore> IndexedDBBackingStore::Open(
&leveldb_factory); &leveldb_factory);
} }
static void HistogramOpenStatus(IndexedDBBackingStoreOpenResult result) {
UMA_HISTOGRAM_ENUMERATION("WebCore.IndexedDB.BackingStore.OpenStatus",
result,
INDEXED_DB_BACKING_STORE_OPEN_MAX);
}
static bool IsPathTooLong(const base::FilePath& leveldb_dir) {
int limit = file_util::GetMaximumPathComponentLength(leveldb_dir.DirName());
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
}
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( scoped_refptr<IndexedDBBackingStore> IndexedDBBackingStore::Open(
const std::string& origin_identifier, const std::string& origin_identifier,
const base::FilePath& path_base, const base::FilePath& path_base,
...@@ -469,67 +505,24 @@ scoped_refptr<IndexedDBBackingStore> IndexedDBBackingStore::Open( ...@@ -469,67 +505,24 @@ scoped_refptr<IndexedDBBackingStore> IndexedDBBackingStore::Open(
scoped_ptr<LevelDBComparator> comparator(new Comparator()); scoped_ptr<LevelDBComparator> comparator(new Comparator());
if (!IsStringASCII(path_base.AsUTF8Unsafe())) { if (!IsStringASCII(path_base.AsUTF8Unsafe())) {
base::Histogram::FactoryGet("WebCore.IndexedDB.BackingStore.OpenStatus", HistogramOpenStatus(INDEXED_DB_BACKING_STORE_OPEN_ATTEMPT_NON_ASCII);
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);
} }
if (!file_util::CreateDirectory(path_base)) { if (!file_util::CreateDirectory(path_base)) {
LOG(ERROR) << "Unable to create IndexedDB database path " LOG(ERROR) << "Unable to create IndexedDB database path "
<< path_base.AsUTF8Unsafe(); << path_base.AsUTF8Unsafe();
base::Histogram::FactoryGet("WebCore.IndexedDB.BackingStore.OpenStatus", HistogramOpenStatus(INDEXED_DB_BACKING_STORE_OPEN_FAILED_DIRECTORY);
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);
return scoped_refptr<IndexedDBBackingStore>(); return scoped_refptr<IndexedDBBackingStore>();
} }
base::FilePath identifier_path = base::FilePath file_path =
base::FilePath().AppendASCII(origin_identifier) path_base.AppendASCII(origin_identifier)
.AddExtension(FILE_PATH_LITERAL(".indexeddb.leveldb")); .AddExtension(FILE_PATH_LITERAL(".indexeddb.leveldb"));
int limit = file_util::GetMaximumPathComponentLength(path_base); if (IsPathTooLong(file_path)) {
if (limit == -1) { HistogramOpenStatus(INDEXED_DB_BACKING_STORE_OPEN_ORIGIN_TOO_LONG);
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);
return scoped_refptr<IndexedDBBackingStore>(); return scoped_refptr<IndexedDBBackingStore>();
} }
base::FilePath file_path = path_base.Append(identifier_path);
scoped_ptr<LevelDBDatabase> db; scoped_ptr<LevelDBDatabase> db;
leveldb::Status status = leveldb_factory->OpenLevelDB( leveldb::Status status = leveldb_factory->OpenLevelDB(
file_path, comparator.get(), &db, is_disk_full); file_path, comparator.get(), &db, is_disk_full);
...@@ -545,53 +538,27 @@ scoped_refptr<IndexedDBBackingStore> IndexedDBBackingStore::Open( ...@@ -545,53 +538,27 @@ scoped_refptr<IndexedDBBackingStore> IndexedDBBackingStore::Open(
if (!ok) { if (!ok) {
LOG(ERROR) << "IndexedDB had IO error checking schema, treating it as " LOG(ERROR) << "IndexedDB had IO error checking schema, treating it as "
"failure to open"; "failure to open";
base::Histogram::FactoryGet( HistogramOpenStatus(
"WebCore.IndexedDB.BackingStore.OpenStatus", INDEXED_DB_BACKING_STORE_OPEN_FAILED_IO_ERROR_CHECKING_SCHEMA);
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);
db.reset(); db.reset();
} else if (!known) { } else if (!known) {
LOG(ERROR) << "IndexedDB backing store had unknown schema, treating it " LOG(ERROR) << "IndexedDB backing store had unknown schema, treating it "
"as failure to open"; "as failure to open";
base::Histogram::FactoryGet( HistogramOpenStatus(INDEXED_DB_BACKING_STORE_OPEN_FAILED_UNKNOWN_SCHEMA);
"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);
db.reset(); db.reset();
} }
} }
if (db) { if (db) {
base::Histogram::FactoryGet("WebCore.IndexedDB.BackingStore.OpenStatus", HistogramOpenStatus(INDEXED_DB_BACKING_STORE_OPEN_SUCCESS);
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);
} else if (!RecoveryCouldBeFruitful(status)) { } else if (!RecoveryCouldBeFruitful(status)) {
LOG(ERROR) << "Unable to open backing store, not trying to recover - " LOG(ERROR) << "Unable to open backing store, not trying to recover - "
<< status.ToString(); << status.ToString();
base::Histogram::FactoryGet("WebCore.IndexedDB.BackingStore.OpenStatus", HistogramOpenStatus(INDEXED_DB_BACKING_STORE_OPEN_NO_RECOVERY);
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);
return scoped_refptr<IndexedDBBackingStore>(); return scoped_refptr<IndexedDBBackingStore>();
} else if (*is_disk_full) { } else if (*is_disk_full) {
LOG(ERROR) << "Unable to open backing store - disk is full."; LOG(ERROR) << "Unable to open backing store - disk is full.";
base::Histogram::FactoryGet("WebCore.IndexedDB.BackingStore.OpenStatus", HistogramOpenStatus(INDEXED_DB_BACKING_STORE_OPEN_DISK_FULL);
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);
return scoped_refptr<IndexedDBBackingStore>(); return scoped_refptr<IndexedDBBackingStore>();
} else { } else {
LOG(ERROR) << "IndexedDB backing store open failed, attempting cleanup"; LOG(ERROR) << "IndexedDB backing store open failed, attempting cleanup";
...@@ -599,13 +566,7 @@ scoped_refptr<IndexedDBBackingStore> IndexedDBBackingStore::Open( ...@@ -599,13 +566,7 @@ scoped_refptr<IndexedDBBackingStore> IndexedDBBackingStore::Open(
bool success = leveldb_factory->DestroyLevelDB(file_path); bool success = leveldb_factory->DestroyLevelDB(file_path);
if (!success) { if (!success) {
LOG(ERROR) << "IndexedDB backing store cleanup failed"; LOG(ERROR) << "IndexedDB backing store cleanup failed";
base::Histogram::FactoryGet( HistogramOpenStatus(INDEXED_DB_BACKING_STORE_OPEN_CLEANUP_DESTROY_FAILED);
"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);
return scoped_refptr<IndexedDBBackingStore>(); return scoped_refptr<IndexedDBBackingStore>();
} }
...@@ -613,31 +574,15 @@ scoped_refptr<IndexedDBBackingStore> IndexedDBBackingStore::Open( ...@@ -613,31 +574,15 @@ scoped_refptr<IndexedDBBackingStore> IndexedDBBackingStore::Open(
leveldb_factory->OpenLevelDB(file_path, comparator.get(), &db, NULL); leveldb_factory->OpenLevelDB(file_path, comparator.get(), &db, NULL);
if (!db) { if (!db) {
LOG(ERROR) << "IndexedDB backing store reopen after recovery failed"; LOG(ERROR) << "IndexedDB backing store reopen after recovery failed";
base::Histogram::FactoryGet( HistogramOpenStatus(INDEXED_DB_BACKING_STORE_OPEN_CLEANUP_REOPEN_FAILED);
"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);
return scoped_refptr<IndexedDBBackingStore>(); return scoped_refptr<IndexedDBBackingStore>();
} }
base::Histogram::FactoryGet("WebCore.IndexedDB.BackingStore.OpenStatus", HistogramOpenStatus(INDEXED_DB_BACKING_STORE_OPEN_CLEANUP_REOPEN_SUCCESS);
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);
} }
if (!db) { if (!db) {
NOTREACHED(); NOTREACHED();
base::Histogram::FactoryGet("WebCore.IndexedDB.BackingStore.OpenStatus", HistogramOpenStatus(INDEXED_DB_BACKING_STORE_OPEN_FAILED_UNKNOWN_ERR);
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);
return scoped_refptr<IndexedDBBackingStore>(); return scoped_refptr<IndexedDBBackingStore>();
} }
...@@ -660,20 +605,10 @@ scoped_refptr<IndexedDBBackingStore> IndexedDBBackingStore::OpenInMemory( ...@@ -660,20 +605,10 @@ scoped_refptr<IndexedDBBackingStore> IndexedDBBackingStore::OpenInMemory(
LevelDBDatabase::OpenInMemory(comparator.get()); LevelDBDatabase::OpenInMemory(comparator.get());
if (!db) { if (!db) {
LOG(ERROR) << "LevelDBDatabase::OpenInMemory failed."; LOG(ERROR) << "LevelDBDatabase::OpenInMemory failed.";
base::Histogram::FactoryGet("WebCore.IndexedDB.BackingStore.OpenStatus", HistogramOpenStatus(INDEXED_DB_BACKING_STORE_OPEN_MEMORY_FAILED);
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);
return scoped_refptr<IndexedDBBackingStore>(); return scoped_refptr<IndexedDBBackingStore>();
} }
base::Histogram::FactoryGet("WebCore.IndexedDB.BackingStore.OpenStatus", HistogramOpenStatus(INDEXED_DB_BACKING_STORE_OPEN_MEMORY_SUCCESS);
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);
return Create(file_identifier, db.Pass(), comparator.Pass()); return Create(file_identifier, db.Pass(), comparator.Pass());
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment