| Index: content/browser/indexed_db/leveldb/leveldb_database.cc
|
| diff --git a/content/browser/indexed_db/leveldb/leveldb_database.cc b/content/browser/indexed_db/leveldb/leveldb_database.cc
|
| index add72c16422c6f1789ee0e23b60bfcd12da308f2..316e961294888c5cf2bd4d4286eb488c7677cdcc 100644
|
| --- a/content/browser/indexed_db/leveldb/leveldb_database.cc
|
| +++ b/content/browser/indexed_db/leveldb/leveldb_database.cc
|
| @@ -109,8 +109,8 @@ bool LevelDBDatabase::Destroy(const base::FilePath& file_name) {
|
| return s.ok();
|
| }
|
|
|
| -static void HistogramFreeSpace(const char* type,
|
| - const base::FilePath& file_name) {
|
| +static int CheckFreeSpace(const char* type, const base::FilePath& file_name) {
|
| + // TODO(dgrogan): Change string16 -> std::string.
|
| string16 name = ASCIIToUTF16("WebCore.IndexedDB.LevelDB.Open") +
|
| ASCIIToUTF16(type) + ASCIIToUTF16("FreeDiskSpace");
|
| int64 free_disk_space_in_k_bytes =
|
| @@ -122,7 +122,7 @@ static void HistogramFreeSpace(const char* type,
|
| 2 /*boundary*/,
|
| 2 /*boundary*/ + 1,
|
| base::HistogramBase::kUmaTargetedHistogramFlag)->Add(1 /*sample*/);
|
| - return;
|
| + return -1;
|
| }
|
| int clamped_disk_space_k_bytes =
|
| free_disk_space_in_k_bytes > INT_MAX ? INT_MAX
|
| @@ -135,6 +135,7 @@ static void HistogramFreeSpace(const char* type,
|
| 11 /*buckets*/,
|
| base::HistogramBase::kUmaTargetedHistogramFlag)
|
| ->Add(clamped_disk_space_k_bytes);
|
| + return clamped_disk_space_k_bytes;
|
| }
|
|
|
| static void HistogramLevelDBError(const char* histogram_name,
|
| @@ -164,7 +165,8 @@ static void HistogramLevelDBError(const char* histogram_name,
|
|
|
| scoped_ptr<LevelDBDatabase> LevelDBDatabase::Open(
|
| const base::FilePath& file_name,
|
| - const LevelDBComparator* comparator) {
|
| + const LevelDBComparator* comparator,
|
| + bool* is_disk_full) {
|
| scoped_ptr<ComparatorAdapter> comparator_adapter(
|
| new ComparatorAdapter(comparator));
|
|
|
| @@ -174,14 +176,18 @@ scoped_ptr<LevelDBDatabase> LevelDBDatabase::Open(
|
|
|
| if (!s.ok()) {
|
| HistogramLevelDBError("WebCore.IndexedDB.LevelDBOpenErrors", s);
|
| - HistogramFreeSpace("Failure", file_name);
|
| + int free_space_k_bytes = CheckFreeSpace("Failure", file_name);
|
| + // Disks with <100k of free space almost never succeed in opening a
|
| + // leveldb database.
|
| + if (is_disk_full)
|
| + *is_disk_full = free_space_k_bytes >= 0 && free_space_k_bytes < 100;
|
|
|
| LOG(ERROR) << "Failed to open LevelDB database from "
|
| << file_name.AsUTF8Unsafe() << "," << s.ToString();
|
| return scoped_ptr<LevelDBDatabase>();
|
| }
|
|
|
| - HistogramFreeSpace("Success", file_name);
|
| + CheckFreeSpace("Success", file_name);
|
|
|
| scoped_ptr<LevelDBDatabase> result(new LevelDBDatabase);
|
| result->db_ = make_scoped_ptr(db);
|
|
|